diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 67a91d0e..fad4f32a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -36,6 +36,7 @@ add_executable (mq9-example mq9.cxx) add_executable (tcs3414cs-example tcs3414cs.cxx) add_executable (th02-example th02.cxx) add_executable (lsm303-example lsm303.cxx) +add_executable (joystick12-example joystick12-example.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -66,6 +67,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/gas) include_directories (${PROJECT_SOURCE_DIR}/src/tcs3414cs) include_directories (${PROJECT_SOURCE_DIR}/src/th02) include_directories (${PROJECT_SOURCE_DIR}/src/lsm303) +include_directories (${PROJECT_SOURCE_DIR}/src/joystick12) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -105,3 +107,4 @@ target_link_libraries (mq9-example gas ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (tcs3414cs-example tcs3414cs ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (th02-example th02 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (lsm303-example lsm303 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (joystick12-example joystick12 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/joystick12-example.cxx b/examples/joystick12-example.cxx new file mode 100644 index 00000000..ac7d28f7 --- /dev/null +++ b/examples/joystick12-example.cxx @@ -0,0 +1,64 @@ +/* + * Author: Alexander Komarov + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "joystick12.h" +#include +#include + +int is_running = 0; +upm::Joystick12 *sensor = NULL; + +void +sig_handler(int signo) +{ + printf("got signal\n"); + if (signo == SIGINT) { + is_running = 1; + } +} + +//! [Interesting] +int +main(int argc, char **argv) +{ + sensor = new upm::Joystick12(0,1); + signal(SIGINT, sig_handler); + + while (!is_running) { + float x = sensor->getXInput(); + float y = sensor->getYInput(); + std::cout << "Driving X:" << x << ": and Y:" << y << std::endl; + sleep(1); + } + + std::cout << "exiting application" << std::endl; + + delete sensor; + + return 0; +} +//! [Interesting] diff --git a/src/joystick12/CMakeLists.txt b/src/joystick12/CMakeLists.txt new file mode 100644 index 00000000..750e62e9 --- /dev/null +++ b/src/joystick12/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "joystick12") +set (libdescription "ElecFreaks Joystick 1.2") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/joystick12/joystick12.cxx b/src/joystick12/joystick12.cxx new file mode 100644 index 00000000..4e8f2455 --- /dev/null +++ b/src/joystick12/joystick12.cxx @@ -0,0 +1,85 @@ +/* + * Author: Alexander Komarov + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include "joystick12.h" + +using namespace upm; + +// FIXME AK: to make configurable if needed +const int Joystick12::X_left = 100; +const int Joystick12::X_center = 1610; +const int Joystick12::X_right= 4070; + +const int Joystick12::Y_left = 2; +const int Joystick12::Y_center = 1610; +const int Joystick12::Y_right= 4070; + + +Joystick12::Joystick12(int pinX, int pinY) { + mraa_result_t error; + m_joystickCtxX = mraa_aio_init(pinX); + m_joystickCtxY = mraa_aio_init(pinY); +} + +Joystick12::~Joystick12() { + // close inputs + mraa_result_t error; + error = mraa_aio_close(m_joystickCtxX); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } + error = mraa_aio_close(m_joystickCtxY); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } +} + +float Joystick12::getXInput() { + float in = mraa_aio_read (m_joystickCtxX); + if (in < X_left) return -1; + if (in < X_center) return -(X_center - in) / (X_center - X_left); + if (in == X_center) return 0; + if (in < X_right) return (in - X_center) / (X_right - X_center); + if (in >= X_right) return 1; + mraa_result_print(MRAA_ERROR_UNSPECIFIED); + return 0; +} + +float Joystick12::getYInput() { + float in = mraa_aio_read (m_joystickCtxY); + if (in < Y_left) return -1; + if (in < Y_center) return -(Y_center - in) / (Y_center - Y_left); + if (in == Y_center) return 0; + if (in < Y_right) return (in - Y_center) / (Y_right - Y_center); + if (in >= Y_right) return 1; + mraa_result_print(MRAA_ERROR_UNSPECIFIED); + return 0; +} + + diff --git a/src/joystick12/joystick12.h b/src/joystick12/joystick12.h new file mode 100644 index 00000000..21e920dd --- /dev/null +++ b/src/joystick12/joystick12.h @@ -0,0 +1,82 @@ +/* + * Author: Alexander Komarov + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include +#include +#include + +namespace upm { + +/** + * @brief C++ API for Elecfreaks Joystick v 1.2-1.4 breakout + * + * This file defines the Joystick API and implemntation for X, Y + * button could be treated as normal GPIO, this enables easier + * interrupt support + * + * @snippet joystick12-example.cxx Interesting + * + */ +class Joystick12 { + public: + /** + * Instantiates a Joystick object + * + * @param pinX analog pin where X input is connected + * @param pinY analog pin where Y input is connected + */ + Joystick12(int pinX, int pinY); + + /** + * Joystick object destructor + */ + ~Joystick12(); + + /** + * Get X input + * @return float X value, range from -1 to 1. 0 is mid + */ + float getXInput(); + + /** + * Get Y input + * + * @return float Y value, range from -1 to 1. 0 is mid + */ + float getYInput(); + + private: + mraa_aio_context m_joystickCtxX; + mraa_aio_context m_joystickCtxY; + + static const int X_left; + static const int X_center; + static const int X_right; + static const int Y_left; + static const int Y_center; + static const int Y_right; +}; +}; + diff --git a/src/joystick12/jsupm_joystick12.i b/src/joystick12/jsupm_joystick12.i new file mode 100644 index 00000000..640273f1 --- /dev/null +++ b/src/joystick12/jsupm_joystick12.i @@ -0,0 +1,8 @@ +%module jsupm_joystick12 +%include "../upm.i" + +%{ + #include "joystick12.h" +%} + +%include "joystick12.h" diff --git a/src/joystick12/pyupm_joystick12.i b/src/joystick12/pyupm_joystick12.i new file mode 100644 index 00000000..8f1706ce --- /dev/null +++ b/src/joystick12/pyupm_joystick12.i @@ -0,0 +1,11 @@ +%module pyupm_joystick12 +%include "../upm.i" + +%include "stdint.i" + +%feature("autodoc", "3"); + +%include "joystick12.h" +%{ + #include "joystick12.h" +%}