diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index e7f4e8e2..f194adca 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -138,6 +138,7 @@ add_executable (hyld9767-example hyld9767.cxx) add_executable (mg811-example mg811.cxx) add_executable (wheelencoder-example wheelencoder.cxx) add_executable (sm130-example sm130.cxx) +add_executable (grovegprs-example grovegprs.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -248,6 +249,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/hyld9767) include_directories (${PROJECT_SOURCE_DIR}/src/mg811) include_directories (${PROJECT_SOURCE_DIR}/src/wheelencoder) include_directories (${PROJECT_SOURCE_DIR}/src/sm130) +include_directories (${PROJECT_SOURCE_DIR}/src/grovegprs) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -387,3 +389,4 @@ target_link_libraries (hyld9767-example hyld9767 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (mg811-example mg811 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (wheelencoder-example wheelencoder ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (sm130-example sm130 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (grovegprs-example grovegprs ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/c++/grovegprs.cxx b/examples/c++/grovegprs.cxx new file mode 100644 index 00000000..8652131a --- /dev/null +++ b/examples/c++/grovegprs.cxx @@ -0,0 +1,111 @@ +/* + * 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 +#include "grovegprs.h" + +using namespace std; +using namespace upm; + +void printUsage(char *progname) +{ + cout << "Usage: " << progname << " [AT command]" << endl; + cout << endl; + + cout << "If an argument is supplied on the command line, that argument is" + << endl; + cout << "sent to the module and the response is printed out." << endl; + cout << endl; + cout << "If no argument is used, then the manufacturer and the current" + << endl; + cout << "saved profiles are queried and the results printed out." << endl; + cout << endl; + cout << endl; +} + +// simple helper function to send a command and wait for a response +void sendCommand(upm::GroveGPRS* sensor, string cmd) +{ + // commands need to be terminated with a carriage return + cmd += "\r"; + + sensor->writeDataStr(cmd); + + // wait up to 1 second + if (sensor->dataAvailable(1000)) + { + cout << "Returned: " << sensor->readDataStr(1024) << endl; + } + else + { + cerr << "Timed out waiting for response" << endl; + } +} + + +int main(int argc, char **argv) +{ +//! [Interesting] + + // Instantiate a GroveGPRS Module on UART 0 + upm::GroveGPRS* sensor = new upm::GroveGPRS(0); + + // Set the baud rate, 19200 baud is the default. + if (sensor->setBaudRate(19200) != MRAA_SUCCESS) + { + cerr << "Failed to set tty baud rate" << endl; + return 1; + } + + printUsage(argv[0]); + + if (argc > 1) + { + cout << "Sending command line argument (" << argv[1] << ")..." << endl; + sendCommand(sensor, argv[1]); + } + else + { + // query the module manufacturer + cout << "Querying module manufacturer (AT+CGMI)..." << endl; + sendCommand(sensor, "AT+CGMI"); + + sleep(1); + + // query the saved profiles + cout << "Querying the saved profiles (AT&V)..." << endl; + sendCommand(sensor, "AT&V"); + + // A comprehensive list is available from the datasheet at: + // http://www.seeedstudio.com/wiki/images/7/72/AT_Commands_v1.11.pdf + } + +//! [Interesting] + + delete sensor; + return 0; +} diff --git a/examples/javascript/grovegprs.js b/examples/javascript/grovegprs.js new file mode 100644 index 00000000..d63f0880 --- /dev/null +++ b/examples/javascript/grovegprs.js @@ -0,0 +1,114 @@ +/*jslint node:true, vars:true, bitwise:true, unparam:true */ +/*jshint unused:true */ + +/* + * 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. + */ + + +var sensorObj = require('jsupm_grovegprs'); + + +/************** Functions **************/ +function printUsage(progname) +{ + var outputStr = "Usage: " + progname + " [AT command]\n\n" + + "If an argument is supplied on the command line, that argument is\n" + + "sent to the module and the response is printed out.\n\n" + + "If no argument is used, then the manufacturer and the current\n" + + "saved profiles are queried and the results printed out.\n\n" + console.log(outputStr); +} + +// simple helper function to send a command and wait for a response +function sendCommand(sensor, cmd, callback) +{ + // commands need to be terminated with a carriage return + cmd += "\r"; + sensor.writeDataStr(cmd); + + // wait up to 1 second + if (sensor.dataAvailable(1000)) + { + console.log("Returned: " + sensor.readDataStr(1024)); + } + else + console.log("Timed out waiting for response"); + + if (callback) + callback(); +} + +/************** Main code **************/ +// Instantiate a GROVEGPRS Module on UART 0 +var sensor = new sensorObj.GroveGPRS(0); + +// Set the baud rate, 19200 baud is the default. +if (sensor.setBaudRate(19200)) +{ + console.log("Failed to set baud rate"); + process.exit(0); +} + +printUsage(process.argv[1]); + +// Note: in nodeJS, command-line argument 0 is "node". +// Command-line argument 1 is "grovegprs.js" +// If you have a third argument, then it's a command +if (process.argv.length > 2) +{ + console.log("Sending command line argument (" + process.argv[2] + ")..."); + sendCommand(sensor, process.argv[2]); +} +else +{ + // sending this command as a synchronous callback ensures better timing + var callbackFunc = function() + { + setTimeout(function() + { + // query the saved profiles + console.log("Querying the saved profiles (AT&V)..."); + sendCommand(sensor, "AT&V"); + + // A comprehensive list is available from the + // datasheet at: + // http://www.seeedstudio.com/wiki/images/7/72/AT_Commands_v1.11.pdf + }, 1000); + }; + + // query the module manufacturer + console.log("Querying module manufacturer (AT+CGMI)..."); + sendCommand(sensor, "AT+CGMI", callbackFunc); +} + + +/************** Exit code **************/ +process.on('SIGINT', function() +{ + sensor = null; + sensorObj.cleanUp(); + sensorObj = null; + console.log("Exiting..."); + process.exit(0); +}); diff --git a/examples/python/grovegprs.py b/examples/python/grovegprs.py new file mode 100644 index 00000000..d441e38a --- /dev/null +++ b/examples/python/grovegprs.py @@ -0,0 +1,86 @@ +#!/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_grovegprs as sensorObj + +# Instantiate a GroveGPRS Module on UART 0 +sensor = sensorObj.GroveGPRS(0) + +## Exit handlers ## +# This stops python from printing a stacktrace when you hit control-C +def SIGINTHandler(signum, frame): + raise SystemExit + +# This function lets you run code on exit +def exitHandler(): + print "Exiting" + sys.exit(0) + +# Register exit handlers +atexit.register(exitHandler) +signal.signal(signal.SIGINT, SIGINTHandler) + +# Set the baud rate, 19200 baud is the default. +if (sensor.setBaudRate(19200)): + print "Failed to set baud rate" + sys.exit(0) + + +usageStr = ("Usage:\n" +"If an argument is supplied on the command line, that argument is\n" +"sent to the module and the response is printed out.\n\n" +"If no argument is used, then the manufacturer and the current\n" +"saved profiles are queried and the results printed out.\n\n") +print usageStr + +# simple helper function to send a command and wait for a response +def sendCommand(sensor, cmd): + # commands need to be terminated with a carriage return + cmd += "\r"; + sensor.writeDataStr(cmd) + + # wait up to 1 second + if (sensor.dataAvailable(1000)): + print "Returned: ", + print sensor.readDataStr(1024) + else: + print "Timed out waiting for response" + + +if (len(sys.argv) > 1): + print "Sending command line argument (" + sys.argv[1] + ")..." + sendCommand(sensor, sys.argv[1]) +else: + # query the module manufacturer + print "Querying module manufacturer (AT+CGMI)..." + sendCommand(sensor, "AT+CGMI"); + + time.sleep(1); + + # query the saved profiles + print "Querying the saved profiles (AT&V)..." + sendCommand(sensor, "AT&V"); + + # A comprehensive list is available from the datasheet at: + # http://www.seeedstudio.com/wiki/images/7/72/AT_Commands_v1.11.pdf diff --git a/src/grovegprs/CMakeLists.txt b/src/grovegprs/CMakeLists.txt new file mode 100644 index 00000000..524cb362 --- /dev/null +++ b/src/grovegprs/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "grovegprs") +set (libdescription "upm grove GPRS module") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/grovegprs/grovegprs.cxx b/src/grovegprs/grovegprs.cxx new file mode 100644 index 00000000..aefda637 --- /dev/null +++ b/src/grovegprs/grovegprs.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 "grovegprs.h" + +using namespace upm; +using namespace std; + +static const int defaultDelay = 100; // max wait time for read + +GroveGPRS::GroveGPRS(int uart) : + m_uart(uart) +{ +} + +GroveGPRS::~GroveGPRS() +{ +} + +bool GroveGPRS::dataAvailable(unsigned int millis) +{ + return m_uart.dataAvailable(millis); +} + +int GroveGPRS::readData(char *buffer, unsigned int len) +{ + return m_uart.read(buffer, len); +} + +std::string GroveGPRS::readDataStr(int len) +{ + return m_uart.readStr(len); +} + +int GroveGPRS::writeData(char *buffer, unsigned int len) +{ + m_uart.flush(); + return m_uart.write(buffer, len); +} + +int GroveGPRS::writeDataStr(std::string data) +{ + m_uart.flush(); + return m_uart.writeStr(data); +} + +mraa_result_t GroveGPRS::setBaudRate(int baud) +{ + return m_uart.setBaudRate(baud); +} + diff --git a/src/grovegprs/grovegprs.h b/src/grovegprs/grovegprs.h new file mode 100644 index 00000000..5cabea8a --- /dev/null +++ b/src/grovegprs/grovegprs.h @@ -0,0 +1,153 @@ +/* + * Author: Jon Trulson + * Copyright (c) 2015 Intel Corporation. + * + * Thanks to Adafruit for supplying a google translated version of the + * Chinese datasheet and some clues in their code. + * + * 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 +#include +#include + +#include + +#define GROVEGPRS_DEFAULT_UART 0 + +namespace upm { + /** + * @brief Grove GPRS Module library + * @defgroup grovegprs libupm-grovegprs + * @ingroup seeed uart wifi + */ + + /** + * @library grovegprs + * @sensor grovegprs + * @comname Grove GPRS Module + * @type wifi + * @man seeed + * @con uart + * @web http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0 + * + * @brief API for the Grove GPRS Module + * + * The driver was tested with the Grove GPRS Module, V2. It's a + * GSM GPRS module based on the SIM900. This module uses a + * standard 'AT' command set. See the datasheet for a full list + * of available commands and their possible responses: + * + * http://www.seeedstudio.com/wiki/images/7/72/AT_Commands_v1.11.pdf + * + * It is connected via a UART at 19200 baud. + * + * @image html grovegprs.jpg + * @snippet grovegprs.cxx Interesting + */ + + class GroveGPRS { + public: + + /** + * GroveGPRS object constructor + * + * @param uart Default UART to use (0 or 1). Default is 0. + */ + GroveGPRS(int uart=GROVEGPRS_DEFAULT_UART); + + /** + * GroveGPRS object destructor + */ + ~GroveGPRS(); + + /** + * Checks to see if there is data available for reading + * + * @param millis Number of milliseconds to wait; 0 means no waiting + * @return true if there is data available for reading + */ + bool dataAvailable(unsigned int millis); + + /** + * Reads any available data into a user-supplied buffer. Note: the + * call blocks until data is available for reading. Use + * dataAvailable() to determine whether there is data available + * beforehand, to avoid blocking. + * + * @param buffer Buffer to hold the data read + * @param len Length of the buffer + * @return Number of bytes read + */ + int readData(char *buffer, unsigned int len); + + /** + * Reads any available data and returns it in a std::string. Note: + * the call blocks until data is available for reading. Use + * dataAvailable() to determine whether there is data available + * beforehand, to avoid blocking. + * + * @param len Maximum length of the data to be returned + * @return Number of bytes read + */ + std::string readDataStr(int len); + + /** + * Writes the data in the buffer to the device. If you are + * writing a command, be sure to terminate it with a carriage + * return (\r) + * + * @param buffer Buffer to hold the data to write + * @param len Length of the buffer + * @return Number of bytes written + */ + int writeData(char *buffer, unsigned len); + + /** + * Writes the std:string data to the device. If you are writing a + * command, be sure to terminate it with a carriage return (\r) + * + * @param data Buffer to write to the device + * @return Number of bytes written + */ + int writeDataStr(std::string data); + + /** + * Sets the baud rate for the device. The default is 19200. + * + * @param baud Desired baud rate. + * @return true if successful + */ + mraa_result_t setBaudRate(int baud=19200); + + + protected: + mraa::Uart m_uart; + + private: + }; +} + + diff --git a/src/grovegprs/javaupm_grovegprs.i b/src/grovegprs/javaupm_grovegprs.i new file mode 100644 index 00000000..00f57499 --- /dev/null +++ b/src/grovegprs/javaupm_grovegprs.i @@ -0,0 +1,11 @@ +%module javaupm_grovegprs +%include "../upm.i" +%include "carrays.i" +%include "std_string.i" + +%{ + #include "grovegprs.h" +%} + +%include "grovegprs.h" +%array_class(char, charArray); diff --git a/src/grovegprs/jsupm_grovegprs.i b/src/grovegprs/jsupm_grovegprs.i new file mode 100644 index 00000000..a4f05561 --- /dev/null +++ b/src/grovegprs/jsupm_grovegprs.i @@ -0,0 +1,11 @@ +%module jsupm_grovegprs +%include "../upm.i" +%include "carrays.i" +%include "std_string.i" + +%{ + #include "grovegprs.h" +%} + +%include "grovegprs.h" +%array_class(char, charArray); diff --git a/src/grovegprs/pyupm_grovegprs.i b/src/grovegprs/pyupm_grovegprs.i new file mode 100644 index 00000000..a171655a --- /dev/null +++ b/src/grovegprs/pyupm_grovegprs.i @@ -0,0 +1,12 @@ +%module pyupm_grovegprs +%include "../upm.i" +%include "carrays.i" +%include "std_string.i" + +%feature("autodoc", "3"); + +%{ + #include "grovegprs.h" +%} +%include "grovegprs.h" +%array_class(char, charArray);