grovegprs: Initial implementation

This driver provides support for the Grove GPRS shield, V2:

http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0

It provides a simple interface whereby a user can send and receive
commands and data from the device.  It is controlled by a standardized
set of "AT" commands.  A full description of these commands is
available here:

http://www.seeedstudio.com/wiki/images/7/72/AT_Commands_v1.11.pdf

Signed-off-by: Jon Trulson <jtrulson@ics.com>
This commit is contained in:
Jon Trulson
2015-08-28 17:05:39 -06:00
committed by Mihai Tudor Panu
parent 8147a89cb7
commit 85c602d524
10 changed files with 580 additions and 0 deletions

View File

@ -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})

111
examples/c++/grovegprs.cxx Normal file
View File

@ -0,0 +1,111 @@
/*
* Author: Jon Trulson <jtrulson@ics.com>
* 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 <unistd.h>
#include <iostream>
#include <signal.h>
#include <stdio.h>
#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;
}