From 5547d99609fb07d3ef53df11dcf74a7ed7f2dc0e Mon Sep 17 00:00:00 2001 From: Jon Trulson Date: Mon, 20 Apr 2015 12:16:54 -0600 Subject: [PATCH] ht9170: Initial implementation The driver implements support for the DTMF Shield based on the ht9170. Signed-off-by: Jon Trulson Signed-off-by: Zion Orent Signed-off-by: Mihai Tudor Panu --- examples/c++/CMakeLists.txt | 3 + examples/c++/ht9170.cxx | 72 +++++++++++++++++++++ examples/javascript/ht9170.js | 54 ++++++++++++++++ examples/python/ht9170.py | 54 ++++++++++++++++ src/ht9170/CMakeLists.txt | 5 ++ src/ht9170/ht9170.cxx | 117 ++++++++++++++++++++++++++++++++++ src/ht9170/ht9170.h | 96 ++++++++++++++++++++++++++++ src/ht9170/jsupm_ht9170.i | 8 +++ src/ht9170/pyupm_ht9170.i | 9 +++ 9 files changed, 418 insertions(+) create mode 100644 examples/c++/ht9170.cxx create mode 100644 examples/javascript/ht9170.js create mode 100644 examples/python/ht9170.py create mode 100644 src/ht9170/CMakeLists.txt create mode 100644 src/ht9170/ht9170.cxx create mode 100644 src/ht9170/ht9170.h create mode 100644 src/ht9170/jsupm_ht9170.i create mode 100644 src/ht9170/pyupm_ht9170.i diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 930536ef..408bb38c 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -118,6 +118,7 @@ add_executable (sx6119-example sx6119.cxx) add_executable (si114x-example si114x.cxx) add_executable (maxsonarez-example maxsonarez.cxx) add_executable (hm11-example hm11.cxx) +add_executable (ht9170-example ht9170.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -214,6 +215,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/sx6119) include_directories (${PROJECT_SOURCE_DIR}/src/si114x) include_directories (${PROJECT_SOURCE_DIR}/src/maxsonarez) include_directories (${PROJECT_SOURCE_DIR}/src/hm11) +include_directories (${PROJECT_SOURCE_DIR}/src/ht9170) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -333,3 +335,4 @@ target_link_libraries (sx6119-example sx6119 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (si114x-example si114x ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (maxsonarez-example maxsonarez ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (hm11-example hm11 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (ht9170-example ht9170 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/c++/ht9170.cxx b/examples/c++/ht9170.cxx new file mode 100644 index 00000000..1be72b63 --- /dev/null +++ b/examples/c++/ht9170.cxx @@ -0,0 +1,72 @@ +/* + * 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 "ht9170.h" + +using namespace std; + +int shouldRun = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + shouldRun = false; +} + +int main () +{ + signal(SIGINT, sig_handler); + //! [Interesting] + + // Instantiate a DTMF decoder + upm::HT9170* dtmf = new upm::HT9170(12, 11, 10, 9, 8); + + // Now we just spin in a loop, sleeping every 100ms, checking to see + // if a digit is available. If so, we decode and print the digit, + // and continue looping. + + while(shouldRun) + { + if (dtmf->digitReady()) + { + cout << "Got DTMF code: " << dtmf->decodeDigit() << endl; + // now spin until digitReady() goes false again + while (dtmf->digitReady()) + ; + } + + usleep(100000); + } + + //! [Interesting] + + cout << "Exiting..." << endl; + + delete dtmf; + return 0; +} diff --git a/examples/javascript/ht9170.js b/examples/javascript/ht9170.js new file mode 100644 index 00000000..d7bf1ff1 --- /dev/null +++ b/examples/javascript/ht9170.js @@ -0,0 +1,54 @@ +/*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 ht9170_dtmf_lib = require("jsupm_ht9170"); + +// Instantiate a DTMF decoder +var dtmf_obj = new ht9170_dtmf_lib.HT9170(12, 11, 10, 9, 8); + +// Now we just spin in a loop, sleeping every 100ms, checking to see +// if a digit is available. If so, we decode and print the digit, +// and continue looping. +var myInterval = setInterval(function() +{ + if (dtmf_obj.digitReady()) + { + console.log("Got DTMF code: " + dtmf_obj.decodeDigit()); + // now spin until digitReady() goes false again + while (dtmf.digitReady()) + ; + } +}, 100); + +// When exiting: clear interval, and print message +process.on('SIGINT', function() +{ + clearInterval(myInterval); + dtmf_obj = null; + ht9170_dtmf_lib.cleanUp(); + ht9170_dtmf_lib = null; + console.log("Exiting"); + process.exit(0); +}); diff --git a/examples/python/ht9170.py b/examples/python/ht9170.py new file mode 100644 index 00000000..838b0cc5 --- /dev/null +++ b/examples/python/ht9170.py @@ -0,0 +1,54 @@ +#!/usr/bin/python +# 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. + +import time, sys, signal, atexit +import pyupm_ht9170 as upmHt9170 + +# Instantiate a DTMF decoder +myDTMF = upmHt9170.HT9170(12, 11, 10, 9, 8) + +## Exit handlers ## +# This stops python from printing a stacktrace when you hit control-C +def SIGINTHandler(signum, frame): + raise SystemExit + +# This lets you run code on exit, including functions from myDTMF +def exitHandler(): + print "Exiting" + sys.exit(0) + +# Register exit handlers +atexit.register(exitHandler) +signal.signal(signal.SIGINT, SIGINTHandler) + + +# Now we just spin in a loop, sleeping every 100ms, checking to see +# if a digit is available. If so, we decode and print the digit, +# and continue looping. +while (1): + if (dtmf_obj.digitReady()): + print "Got DTMF code:", dtmf_obj.decodeDigit() + # now spin until digitReady() goes false again + while (dtmf.digitReady()): + pass + time.sleep(.1) diff --git a/src/ht9170/CMakeLists.txt b/src/ht9170/CMakeLists.txt new file mode 100644 index 00000000..b00f1eb9 --- /dev/null +++ b/src/ht9170/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "ht9170") +set (libdescription "upm ht9170 DTMF decoder") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/ht9170/ht9170.cxx b/src/ht9170/ht9170.cxx new file mode 100644 index 00000000..f9399673 --- /dev/null +++ b/src/ht9170/ht9170.cxx @@ -0,0 +1,117 @@ +/* + * 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 "ht9170.h" + +using namespace upm; +using namespace std; + +HT9170::HT9170(int dr, int o1, int o2, int o3, int o4) +{ + // init the gpio's we will need + if ( !(m_dr = mraa_gpio_init(dr)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init(dr) failed" << endl; + return; + } + mraa_gpio_dir(m_dr, MRAA_GPIO_IN); + + if ( !(m_o1 = mraa_gpio_init(o1)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init(o1) failed" << endl; + return; + } + mraa_gpio_dir(m_o1, MRAA_GPIO_IN); + + if ( !(m_o2 = mraa_gpio_init(o2)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init(o2) failed" << endl; + return; + } + mraa_gpio_dir(m_o2, MRAA_GPIO_IN); + + if ( !(m_o3 = mraa_gpio_init(o3)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init(o3) failed" << endl; + return; + } + mraa_gpio_dir(m_o3, MRAA_GPIO_IN); + + if ( !(m_o4 = mraa_gpio_init(o4)) ) + { + cerr << __FUNCTION__ << ": mraa_gpio_init(o4) failed" << endl; + return; + } + mraa_gpio_dir(m_o4, MRAA_GPIO_IN); +} + +HT9170::~HT9170() +{ + mraa_gpio_close(m_dr); + mraa_gpio_close(m_o1); + mraa_gpio_close(m_o2); + mraa_gpio_close(m_o3); + mraa_gpio_close(m_o4); +} + +bool HT9170::digitReady() +{ + return (mraa_gpio_read(m_dr) ? true : false); +} + +char HT9170::decodeDigit() +{ + // This lookup table is derived from the decode table on page 7 of + // the HT9170B/HT9170D datasheet. + + static const char decode[16] = { + 'D', // 0 + '1', // 1 + '2', // 2 + '3', // 3 + '4', // 4 + '5', // 5 + '6', // 6 + '7', // 7 + '8', // 8 + '9', // 9 + '0', // 10 + '*', // 11 + '#', // 12 + 'A', // 13 + 'B', // 14 + 'C' // 15 + }; + + uint8_t bits = 0; + + bits = mraa_gpio_read(m_o1); + bits |= (mraa_gpio_read(m_o2) << 1); + bits |= (mraa_gpio_read(m_o3) << 2); + bits |= (mraa_gpio_read(m_o4) << 3); + + return decode[bits]; +} diff --git a/src/ht9170/ht9170.h b/src/ht9170/ht9170.h new file mode 100644 index 00000000..a25cee72 --- /dev/null +++ b/src/ht9170/ht9170.h @@ -0,0 +1,96 @@ +/* + * 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 UPM library for the HT9170 DTMF Decoder + * @defgroup ht9170 libupm-ht9170 + * @ingroup seeed gpio other + */ + + /** + * @library ht9170 + * @sensor ht9170 + * @comname HT9170 DTMF Decoder + * @altname HT9170B, HT9170D + * @type other + * @man seeed + * @web http://www.seeedstudio.com/depot/DTMFDual-Tone-Multi-Frequency-Shield-p-1839.html + * @con gpio + * + * @brief C++ API for the HT9170 DTMF Decoder + * + * This driver was developed using the Seeed DTMF (Dual Tone + * Multi-Frequency) Shield. It can decode DTMF signals presented at + * it's audio input. It does not generate DTMF signals. + * + * @snippet ht9170.cxx Interesting + */ + class HT9170 { + public: + + /** + * HT9170 constructor + * + * @param dr data ready pin + * @param o1 digital pin for data output 1 + * @param o2 digital pin for data output 2 + * @param o3 digital pin for data output 3 + * @param o4 digital pin for data output 4 + */ + HT9170(int dr, int o1, int o2, int o3, int o4); + + /** + * HT9170 Destructor + */ + ~HT9170(); + + /** + * check to see if a DTMF number is ready to be read + * + * @return true if there is a digit available to decode + */ + bool digitReady(); + + /** + * decode a digit and return it + * + */ + char decodeDigit(); + + private: + mraa_gpio_context m_dr; + mraa_gpio_context m_o1; + mraa_gpio_context m_o2; + mraa_gpio_context m_o3; + mraa_gpio_context m_o4; + }; +} + + diff --git a/src/ht9170/jsupm_ht9170.i b/src/ht9170/jsupm_ht9170.i new file mode 100644 index 00000000..f4d14b35 --- /dev/null +++ b/src/ht9170/jsupm_ht9170.i @@ -0,0 +1,8 @@ +%module jsupm_ht9170 +%include "../upm.i" + +%{ + #include "ht9170.h" +%} + +%include "ht9170.h" diff --git a/src/ht9170/pyupm_ht9170.i b/src/ht9170/pyupm_ht9170.i new file mode 100644 index 00000000..d0db7c89 --- /dev/null +++ b/src/ht9170/pyupm_ht9170.i @@ -0,0 +1,9 @@ +%module pyupm_ht9170 +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "ht9170.h" +%{ + #include "ht9170.h" +%}