diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 1736ab11..1063fed3 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -123,6 +123,7 @@ add_executable (h3lis331dl-example h3lis331dl.cxx) add_executable (ad8232-example ad8232.cxx) add_executable (grovescam-example grovescam.cxx) add_executable (m24lr64e-example m24lr64e.cxx) +add_executable (grovecircularled-example grovecircularled.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -224,6 +225,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/h3lis331dl) include_directories (${PROJECT_SOURCE_DIR}/src/ad8232) include_directories (${PROJECT_SOURCE_DIR}/src/grovescam) include_directories (${PROJECT_SOURCE_DIR}/src/m24lr64e) +include_directories (${PROJECT_SOURCE_DIR}/src/grovecircularled) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -348,3 +350,5 @@ target_link_libraries (h3lis331dl-example h3lis331dl ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (ad8232-example ad8232 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (grovescam-example grovescam ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (m24lr64e-example m24lr64e ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (grovecircularled-example grovecircularled ${CMAKE_THREAD_LIBS_INIT}) + diff --git a/examples/c++/grovecircularled.cxx b/examples/c++/grovecircularled.cxx new file mode 100644 index 00000000..72031d56 --- /dev/null +++ b/examples/c++/grovecircularled.cxx @@ -0,0 +1,63 @@ +/* + * 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 "grovecircularled.h" + +using namespace std; + +bool shouldRun = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + shouldRun = false; +} + +int main() +{ + signal(SIGINT, sig_handler); + +//! [Interesting] + + // Instantiate a Grove Circular LED on gpio pins 5 and 4 + + upm::GroveCircularLED *circle = new upm::GroveCircularLED(5, 4); + + int level = 0; + while (shouldRun) + { + circle->setSpinner(level); + level = (level + 1) % 24; + usleep(100000); + } +//! [Interesting] + + cout << "Exiting" << endl; + + delete circle; + return 0; +} diff --git a/examples/javascript/grovecircularled.js b/examples/javascript/grovecircularled.js new file mode 100644 index 00000000..79a25f47 --- /dev/null +++ b/examples/javascript/grovecircularled.js @@ -0,0 +1,49 @@ +/*jslint node:true, vars:true, bitwise:true, unparam:true */ +/*jshint unused:true */ +/* + * Author: Jun Kato + * Contributions: 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. + */ + +// Instantiate a Grove Circular LED on gpio pins 5 and 4 +var GCL = require("jsupm_grovecircularled"); +var circle = new GCL.GroveCircularLED(5, 4); +var level = 0; + +// Show a spinner. +var myInterval = setInterval(function() +{ + circle.setSpinner(level); + level = (level + 1) % 24; +}, 100); + +// When exiting, clear interval and print message. +process.on('SIGINT', function() +{ + clearInterval(myInterval); + circle.setLevel(0); + circle = null; + GCL.cleanUp(); + console.log("Exiting..."); + process.exit(0); +}); diff --git a/examples/python/grovecircularled.py b/examples/python/grovecircularled.py new file mode 100644 index 00000000..af480e77 --- /dev/null +++ b/examples/python/grovecircularled.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# +# 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. + +import time, sys, signal, atexit +import pyupm_grovecircularled as upmGroveCircularLED + +# Exit handlers +def SIGINTHandler(signum, frame): + raise SystemExit + +def exitHandler(): + circle.setLevel(0, True) + print "Exiting" + sys.exit(0) + +# This function lets you run code on exit +atexit.register(exitHandler) +# This function stops python from printing a stacktrace when you hit control-C +signal.signal(signal.SIGINT, SIGINTHandler) + +# Instantiate a Grove Circular LED on gpio pins 5 and 4 +circle = upmGroveCircularLED.GroveCircularLED(5, 4) + +level = 0 + +while(1): + circle.setSpinner(level) + level = (level + 1) % 24 + time.sleep(.1) diff --git a/src/grovecircularled/CMakeLists.txt b/src/grovecircularled/CMakeLists.txt new file mode 100644 index 00000000..19dca9a8 --- /dev/null +++ b/src/grovecircularled/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "grovecircularled") +set (libdescription "upm grove circular led") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/grovecircularled/grovecircularled.cxx b/src/grovecircularled/grovecircularled.cxx new file mode 100644 index 00000000..5a6c0398 --- /dev/null +++ b/src/grovecircularled/grovecircularled.cxx @@ -0,0 +1,164 @@ +/* + * Author: Jun Kato and Yevgeniy Kiveisha + * Contributions: Jon Trulson + * Copyright (c) 2015 Intel Corporation. + * + * This module is based on the my9221 driver + * + * 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 "grovecircularled.h" + +using namespace upm; + +GroveCircularLED::GroveCircularLED (uint8_t di, uint8_t dcki) { + mraa_result_t error = MRAA_SUCCESS; + + // init clock context + m_clkPinCtx = mraa_gpio_init(dcki); + if (m_clkPinCtx == NULL) { + fprintf(stderr, "Are you sure that pin%d you requested is valid on your platform?", dcki); + exit(1); + } + mraa_gpio_use_mmaped(m_clkPinCtx, 1); + + // init data context + m_dataPinCtx = mraa_gpio_init(di); + if (m_dataPinCtx == NULL) { + fprintf(stderr, "Are you sure that pin%d you requested is valid on your platform?", di); + exit(1); + } + + mraa_gpio_use_mmaped(m_dataPinCtx, 1); + + // set direction (out) + error = mraa_gpio_dir(m_clkPinCtx, MRAA_GPIO_OUT); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } + + // set direction (out) + error = mraa_gpio_dir(m_dataPinCtx, MRAA_GPIO_OUT); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } +} + +GroveCircularLED::~GroveCircularLED() { + mraa_result_t error = MRAA_SUCCESS; + error = mraa_gpio_close (m_dataPinCtx); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } + error = mraa_gpio_close (m_clkPinCtx); + if (error != MRAA_SUCCESS) { + mraa_result_print(error); + } +} + +mraa_result_t +GroveCircularLED::setSpinner (uint8_t position) { + if (position < 0 || position >= 24) { + return MRAA_ERROR_INVALID_PARAMETER; + } + for(uint8_t block_idx = 0; block_idx < 24; block_idx++) { + if (block_idx % 12 == 0) { + send16bitBlock (CMDMODE); + } + uint32_t state = (block_idx == position) ? BIT_HIGH : BIT_LOW; + send16bitBlock (state); + } + return lockData (); +} + +mraa_result_t +GroveCircularLED::setLevel (uint8_t level, bool direction) { + if (level < 0 || level > 24) { + return MRAA_ERROR_INVALID_PARAMETER; + } + if (direction) { + for(uint8_t block_idx = 24; block_idx > 0; block_idx--) { + if (block_idx % 12 == 0) { + send16bitBlock (CMDMODE); + } + uint32_t state = (block_idx <= level) ? BIT_HIGH : BIT_LOW; + send16bitBlock (state); + } + } else { + for(uint8_t block_idx = 0; block_idx < 24; block_idx++) { + if (block_idx % 12 == 0) { + send16bitBlock (CMDMODE); + } + uint32_t state = (block_idx <= level - 1) ? BIT_HIGH : BIT_LOW; + send16bitBlock (state); + } + } + return lockData (); +} + +mraa_result_t +GroveCircularLED::setStatus (bool status[24]) { + for(uint8_t block_idx = 0; block_idx < 24; block_idx++) { + if (block_idx % 12 == 0) { + send16bitBlock (CMDMODE); + } + send16bitBlock (status[block_idx] ? BIT_HIGH : BIT_LOW); + } + return lockData (); +} + +mraa_result_t +GroveCircularLED::lockData () { + mraa_result_t error = MRAA_SUCCESS; + error = mraa_gpio_write (m_dataPinCtx, LOW); + usleep(10); + + for(int idx = 0; idx < 4; idx++) { + error = mraa_gpio_write (m_dataPinCtx, HIGH); + error = mraa_gpio_write (m_dataPinCtx, LOW); + } + return error; +} + +mraa_result_t +GroveCircularLED::send16bitBlock (short data) { + mraa_result_t error = MRAA_SUCCESS; + for (uint8_t bit_idx = 0; bit_idx < MAX_BIT_PER_BLOCK; bit_idx++) { + uint32_t state = (data & 0x8000) ? HIGH : LOW; + error = mraa_gpio_write (m_dataPinCtx, state); + state = mraa_gpio_read (m_clkPinCtx); + + if (state) { + state = LOW; + } else { + state = HIGH; + } + + error = mraa_gpio_write (m_clkPinCtx, state); + + data <<= 1; + } + return error; +} diff --git a/src/grovecircularled/grovecircularled.h b/src/grovecircularled/grovecircularled.h new file mode 100644 index 00000000..a873636e --- /dev/null +++ b/src/grovecircularled/grovecircularled.h @@ -0,0 +1,115 @@ +/* + * Author: Jun Kato and Yevgeniy Kiveisha + * Contributions: Jon Trulson + * Copyright (c) 2014 Intel Corporation. + * + * This module is based on the my9221 driver + * + * 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 + +#define MAX_BIT_PER_BLOCK 16 +#define CMDMODE 0x0000 +#define BIT_HIGH 0x00ff +#define BIT_LOW 0x0000 + +#define HIGH 1 +#define LOW 0 + +namespace upm { + + /** + * @brief Grove Circular LED library + * @defgroup grovecircularled libupm-grovecircularled + * @ingroup seeed display gpio + */ + + /** + * @library grovecircularled + * @sensor grovecircularled + * @comname Grove Circular LED + * @type display + * @man seeed + * @web http://www.seeedstudio.com/wiki/Grove_-_Circular_LED + * @con gpio + * + * @brief API for Grove Circular LED module + * + * @snippet grovecircularled.cxx Interesting + */ + class GroveCircularLED { + public: + /** + * Instantiates a MY9221 object + * + * @param di data pin + * @param dcki clock pin + */ + GroveCircularLED (uint8_t di, uint8_t dcki); + + /** + * MY9221 object destructor + */ + ~GroveCircularLED (); + + /** + * Set the lighting status + * + * @param level selected level for the circular led (0 - 24) + * @param direction up or down, true is up and is the default + */ + mraa_result_t setLevel (uint8_t level, bool direction=true); + + /** + * Set the spinner (light up one but all the other LEDs) + * + * @param position selected position for the spinner (0 - 23) + */ + mraa_result_t setSpinner (uint8_t position); + + /** + * Set the lighting status + * + * @param status boolean array (24 elements) + */ + mraa_result_t setStatus (bool status[24]); + + /** + * Return name of the component + */ + std::string name() + { + return m_name; + } + private: + mraa_result_t lockData (); + mraa_result_t send16bitBlock (short data); + + std::string m_name; + mraa_gpio_context m_clkPinCtx; + mraa_gpio_context m_dataPinCtx; + }; + +} diff --git a/src/grovecircularled/jsupm_grovecircularled.i b/src/grovecircularled/jsupm_grovecircularled.i new file mode 100644 index 00000000..c943147a --- /dev/null +++ b/src/grovecircularled/jsupm_grovecircularled.i @@ -0,0 +1,8 @@ +%module jsupm_grovecircularled +%include "../upm.i" + +%{ + #include "grovecircularled.h" +%} + +%include "grovecircularled.h" diff --git a/src/grovecircularled/pyupm_grovecircularled.i b/src/grovecircularled/pyupm_grovecircularled.i new file mode 100644 index 00000000..c715c283 --- /dev/null +++ b/src/grovecircularled/pyupm_grovecircularled.i @@ -0,0 +1,9 @@ +%module pyupm_grovecircularled +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "grovecircularled.h" +%{ + #include "grovecircularled.h" +%}