diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 43cab59e..e1598489 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -78,6 +78,8 @@ add_executable (my9221-example my9221.cxx) add_executable (grove_mcfled-example grove_mcfled.cxx) add_executable (rotaryencoder-example rotaryencoder.cxx) add_executable (adxl345-example adxl345.cxx) +add_executable (rpr220-example rpr220.cxx) +add_executable (rpr220-intr-example rpr220-intr.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -142,6 +144,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/biss0001) include_directories (${PROJECT_SOURCE_DIR}/src/my9221) include_directories (${PROJECT_SOURCE_DIR}/src/rotaryencoder) include_directories (${PROJECT_SOURCE_DIR}/src/adxl345) +include_directories (${PROJECT_SOURCE_DIR}/src/rpr220) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -223,3 +226,5 @@ target_link_libraries (my9221-example my9221 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (grove_mcfled-example grove ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (rotaryencoder-example rotaryencoder ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (adxl345-example adxl345 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (rpr220-example rpr220 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (rpr220-intr-example rpr220 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/javascript/rpr220.js b/examples/javascript/rpr220.js new file mode 100644 index 00000000..5474bddc --- /dev/null +++ b/examples/javascript/rpr220.js @@ -0,0 +1,49 @@ +/*jslint node:true, vars:true, bitwise:true, unparam:true */ +/*jshint unused:true */ +/* +* Author: Zion Orent +* Copyright (c) 2015 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. +*/ + +var reflectiveSensor = require("jsupm_rpr220"); + +// This example uses a simple method to determine current status + +// Instantiate an RPR220 digital pin D2 +// This was tested on the Grove IR Reflective Sensor +var myReflectiveSensor = new reflectiveSensor.RPR220(2); + +var myInterval = setInterval(function() +{ + if (myReflectiveSensor.blackDetected()) + console.log("Black detected"); + else + console.log("Black NOT detected"); +}, 100); + +// When exiting: clear interval and print message +process.on('SIGINT', function() +{ + clearInterval(myInterval); + console.log("Exiting..."); + process.exit(0); +}); diff --git a/examples/rpr220-intr.cxx b/examples/rpr220-intr.cxx new file mode 100644 index 00000000..05a8381d --- /dev/null +++ b/examples/rpr220-intr.cxx @@ -0,0 +1,78 @@ +/* + * Author: Jon Trulson + * Copyright (c) 2015 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 "rpr220.h" + +using namespace std; + +int shouldRun = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + shouldRun = false; +} + +volatile unsigned int counter = 0; + +// Our interrupt handler +void rprISR(void *arg) +{ + counter++; +} + + +int main() +{ + signal(SIGINT, sig_handler); + +//! [Interesting] + // This example uses an interrupt handler to increment a counter + + // Instantiate an RPR220 digital pin D2 + // This was tested on the Grove IR Reflective Sensor + + upm::RPR220* rpr220 = new upm::RPR220(2); + + // Here, we setup our Interupt Service Routine (ISR) to count + // 'black' pulses detected. + + rpr220->installISR(rprISR, NULL); + + while (shouldRun) + { + cout << "Counter: " << counter << endl; + + sleep(1); + } +//! [Interesting] + + cout << "Exiting..." << endl; + + delete rpr220; + return 0; +} diff --git a/examples/rpr220.cxx b/examples/rpr220.cxx new file mode 100644 index 00000000..c9bdf1dc --- /dev/null +++ b/examples/rpr220.cxx @@ -0,0 +1,68 @@ +/* + * Author: Jon Trulson + * Copyright (c) 2015 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 "rpr220.h" + +using namespace std; + +int shouldRun = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + shouldRun = false; +} + + +int main() +{ + signal(SIGINT, sig_handler); + +//! [Interesting] + // This example uses a simple method to determine current status + + // Instantiate an RPR220 digital pin D2 + // This was tested on the Grove IR Reflective Sensor + + upm::RPR220* rpr220 = new upm::RPR220(2); + + while (shouldRun) + { + if (rpr220->blackDetected()) + cout << "Black detected" << endl; + else + cout << "Black NOT detected" << endl; + + usleep(100000); // 100ms + } +//! [Interesting] + + cout << "Exiting..." << endl; + + delete rpr220; + return 0; +} diff --git a/src/rpr220/CMakeLists.txt b/src/rpr220/CMakeLists.txt new file mode 100644 index 00000000..2a88bf04 --- /dev/null +++ b/src/rpr220/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "rpr220") +set (libdescription "upm rpr220 grove IR reflective sensor") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/rpr220/jsupm_rpr220.i b/src/rpr220/jsupm_rpr220.i new file mode 100644 index 00000000..75706ae5 --- /dev/null +++ b/src/rpr220/jsupm_rpr220.i @@ -0,0 +1,8 @@ +%module jsupm_rpr220 +%include "../upm.i" + +%{ + #include "rpr220.h" +%} + +%include "rpr220.h" diff --git a/src/rpr220/pyupm_rpr220.i b/src/rpr220/pyupm_rpr220.i new file mode 100644 index 00000000..19badafe --- /dev/null +++ b/src/rpr220/pyupm_rpr220.i @@ -0,0 +1,9 @@ +%module pyupm_rpr220 +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "rpr220.h" +%{ + #include "rpr220.h" +%} diff --git a/src/rpr220/rpr220.cxx b/src/rpr220/rpr220.cxx new file mode 100644 index 00000000..795c3b3b --- /dev/null +++ b/src/rpr220/rpr220.cxx @@ -0,0 +1,74 @@ +/* + * Author: Jon Trulson + * Copyright (c) 2015 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 "rpr220.h" + +using namespace upm; +using namespace std; + +RPR220::RPR220(int pin) +{ + m_isrInstalled = false; + + if ( !(m_gpio = mraa_gpio_init(pin)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init() failed" << endl; + return; + } + + mraa_gpio_dir(m_gpio, MRAA_GPIO_IN); +} + +RPR220::~RPR220() +{ + if (m_isrInstalled) + uninstallISR(); + + mraa_gpio_close(m_gpio); +} + +bool RPR220::blackDetected() +{ + return (mraa_gpio_read(m_gpio) ? true : false); +} + +void RPR220::installISR(void (*isr)(void *), void *arg) +{ + if (m_isrInstalled) + uninstallISR(); + + // install our interrupt handler + mraa_gpio_isr(m_gpio, MRAA_GPIO_EDGE_RISING, + isr, arg); + m_isrInstalled = true; +} + +void RPR220::uninstallISR() +{ + mraa_gpio_isr_exit(m_gpio); + m_isrInstalled = false; +} + diff --git a/src/rpr220/rpr220.h b/src/rpr220/rpr220.h new file mode 100644 index 00000000..e375f6f0 --- /dev/null +++ b/src/rpr220/rpr220.h @@ -0,0 +1,93 @@ +/* + * Author: Jon Trulson + * Copyright (c) 2015 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 + +namespace upm { + + /** + * @brief C++ API for the RPR220 based Grove IR Reflective Sensor. + * + * UPM module for the Grove IR Reflective Sensor. The sensitivity + * can be adjusted with the potentiometer on the sensor module. It + * has a range of approximately 15mm, and a fast response time. + * + * It detects high contrast dark areas on a light background. + * + * This module allows the user to determine the current status + * (black detected or not). Additionally, if desired, an Interrupt + * Service Routine (ISR) can be installed that will be called when + * black is detected. Either method can be used, depending on your + * use case. + + * @ingroup grove gpio + * @snippet rpr220.cxx Interesting + * @snippet rpr220-intr.cxx Interesting + */ + class RPR220 { + public: + /** + * Grove IR Reflective Sensor constructor + * + * @param pin digital pin to use + */ + RPR220(int pin); + + /** + * RPR220 Destructor + */ + ~RPR220(); + + /** + * Get the status of the pin, true means black detected + * + * @return true if the sensor is detecting black + */ + bool blackDetected(); + + /** + * Install an Interrupt Service Routine (ISR) to be called when + * black is detected + * + * @param fptr function pointer to function to be called on interrupt + * @param arg pointer to an object that will be supplied as an + * arguement to the ISR. + */ + void installISR(void (*isr)(void *), void *arg); + + /** + * Uninstall the previously installed Interrupt Service Routine (ISR) + * + */ + void uninstallISR(); + + private: + bool m_isrInstalled; + mraa_gpio_context m_gpio; + }; +} + +