Axeda Corp
/
AxedaGo-ubloxC027
Axeda demo software for u-blox C027 (GSM)
Diff: main.cpp
- Revision:
- 0:a725e8eab383
- Child:
- 1:ff6d8adaf6b9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Aug 11 19:02:42 2014 +0000 @@ -0,0 +1,252 @@ +#include "axTransport.h" +#include "mbed.h" +#include "GPS.h" +#include "MDM.h" +#include "axToolkit.h" +#include <stdlib.h> +#include <stdio.h> +#include <ctype.h> + +#define SIMPIN NULL +#define APN "wap.cingular" +#define USERNAME "wap@cingulargprs.com" +#define PASSWORD "cingular1" + +//------------------------------------------------------------------------------------ + +#define MODEL "nlr_ublox_c028" +#define SERIAL_NUM "lymes" +#define HOST "toolbox-stage-connect.axeda.com" +#define PORT (80) +#define PING (700) + +axToolkitConfig cfg; +//Initial AMMP configuration +axToolkitConfig *initConfig(axToolkitConfig *cfg) + +{ + char *model = MODEL; + char *serial = SERIAL_NUM; + const char *host = HOST; + int port = PORT; + + printf("STATUS: Initializing AMMP configuration\r\n"); + ax_createPlatform(&cfg->platform, host,NULL,port); + cfg->platform.secure=AX_FALSE; + cfg->platform.verify=AX_FALSE; + cfg->platform.ping_rate=PING; + + printf("STATUS: Initializing device ID\r\n"); + ax_data_createModelSerialDeviceId(&cfg->thisDevice, model, serial, NULL); + cfg->conf_recv_timeout = 5000; + cfg->conf_queue_size=10; + cfg->first_run=AX_FALSE; + cfg->debug_mode=AX_TRUE; + cfg->print_mem=AX_FALSE; + + return cfg; +} +//Sends event item to platform +int sendEvent(char* name, char* desc) +{ + int res=0; + + printf("STATUS: Beginning event send\r\n"); + ax_event *events[1]; + events[0] = NULL; + events[0]=(ax_event *)calloc(1,sizeof(ax_event)); + res = ax_data_createEvent(events[0],name,desc,0,AX_NO_PRIORITY); + printf("STATUS: Event item creation result: %d\r\n",res); + + ax_platform_sendEvents(&cfg.platform, &cfg.thisDevice,events,1); + free(events[0]); + + return AX_OK; +} +//Sends location item to platform +int sendLoc(double lat, double lon) +{ + int res=0; + + printf("STATUS: Beginning location send\r\n"); + ax_location *location[1]; + location[0] = NULL; + location[0]=(ax_location *)calloc(1,sizeof(ax_location)); + res = ax_data_createLocation(location[0],lat,lon,0,0,AX_NO_PRIORITY); + printf("STATUS: Location item creation result: %d\r\n",res); + + printf("STATUS: Sending data items to platform\r\n"); + ax_platform_sendLocations(&cfg.platform, &cfg.thisDevice,location,1); + free(location[0]); + + return AX_OK; +} + +//Sends data item to platform +int sendData(char *name, double value) +{ + int res=0; + + printf("STATUS: Beginning data send\r\n"); + ax_dataSet *data[1]; + data[0] = NULL; + data[0]=(ax_dataSet *)calloc(1,sizeof(ax_dataSet)); + res = ax_data_createDataItem(data[0],name,AX_ANALOG,NULL,value,0,AX_NO_PRIORITY); + printf("STATUS: Data item creation result: %d\r\n",res); + + printf("STATUS: Sending data items to platform\r\n"); + ax_platform_sendData(&cfg.platform, &cfg.thisDevice,data,1); + free(data[0]); + + return AX_OK; +} + +//global variables for data items (server egress) +int tank1=0; +int tank2=0; + +int main(void) +{ +////////////////////////////////////INIT/////////////////////////////////////////////////// + bool abort=false; + int ret; + char buf[2048] = ""; + + // Create the GPS object +#if 0 // use GPSI2C class + GPSI2C gps; +#else // or GPSSerial class + GPSSerial gps; +#endif + + //Create modem object + MDMSerial mdm; + // mdm.setDebug(4); //Uncomment this line to get modem debug messages + + //initialize the modem + MDMParser::DevStatus devStatus = {}; + MDMParser::NetStatus netStatus = {}; + bool mdmOk = mdm.init(SIMPIN, &devStatus); + mdm.dumpDevStatus(&devStatus); + if (mdmOk) { + //wait until we are connected + mdmOk = mdm.registerNet(&netStatus); + mdm.dumpNetStatus(&netStatus); + } + initConfig(&cfg); + MDMParser::IP ip = mdm.join(APN,USERNAME,PASSWORD); + if (ip == NOIP) { + printf("ERROR - Modem unable to join internet connection\r\n"); + abort=true; + } + if ((ret = ax_platform_register(&cfg.platform, &cfg.thisDevice))!=AX_OK) { + printf("ERROR - Could not register with Axeda Platform\r\n"); + } +////////////////////////////////////////////////////////////////////////////////////////// + printf("SMS and GPS Loop\r\n"); + char link[128] = ""; + char data[128] = ""; + unsigned int i = 0xFFFFFFFF; + const int wait = 2000; + //DigitalOut led(LED1); + while (!abort) { + +/////////////////////////////////POLL///////////////////////////////////////////////////// + /* if ((ret = ax_platform_ping(&cfg.platform, &cfg.thisDevice))!=AX_OK) { + printf("ERROR - Lost connectivity with Axeda Platform\r\n"); + }*/ + sprintf(data, "Current data values: \r\nTank level 1: %d\r\nTank level 2: %d\r\n", tank1, tank2); +//////////////////////////////////GPS///////////////////////////////////////////////////// + while ((ret = gps.getMessage(buf, sizeof(buf))) > 0) { + int len = LENGTH(ret); + //printf("NMEA: %.*s\r\n", len-2, msg); + if ((PROTOCOL(ret) == GPSParser::NMEA) && (len > 6)) { + if (!strncmp("$GPGLL", buf, 6)) { + double la = 0, lo = 0; + char ch; + if (gps.getNmeaAngle(1,buf,len,la) && + gps.getNmeaAngle(3,buf,len,lo) && + gps.getNmeaItem(6,buf,len,ch) && ch == 'A') { + printf("STATUS: GPS Location: %.5f %.5f\r\n", la, lo); + sprintf(link, "I am here!\n" + "https://maps.google.com/?q=%.5f,%.5f", la, lo); + sendLoc(la, lo); + } + } else if (!strncmp("$GPGGA", buf, 6)) { + double alt = 0; + if (gps.getNmeaItem(9,buf,len,alt)) // altitude msl [m] + printf("STATUS: GPS Altitude: %.1f\r\n", alt); + + } else if (!strncmp("$GPVTG", buf, 6)) { + double s = 0; + if (gps.getNmeaItem(7,buf,len,s)) // speed [km/h] + printf("STATUS: GPS Speed: %.1f\r\n", s); + } + } + } + +/////////////////////////////SMS////////////////////////////////////////////////////////////// + int ix[8]; + int n = mdm.smsList("REC UNREAD", ix, 8); + if (8 < n) n = 8; + while (0 < n--) { + char num[32]; + char msg[140]; + printf("STATUS: Unread SMS at index %d\r\n", ix[n]); + if (mdm.smsRead(ix[n], num, msg, sizeof(msg))) { + printf("STATUS: Got SMS from \"%s\" with text \"%s\"\r\n", num, msg); + sendEvent(num, msg); + printf("STATUS: Delete SMS at index %d\r\n", ix[n]); + mdm.smsDelete(ix[n]); + // provide a reply + const char* reply = "Howdy from u-blox and Axeda!"; + if (strstr(msg, /*w*/"here are you")) + reply = *link ? link : "Don't know - no GPS data yet"; // reply wil location link + else if (strstr(msg, /*s*/"hutdown")) + abort = true, reply = "Good night, and good luck"; + else if (strstr(msg, /*f*/"ill1")) { + reply = ("Increased fill - sending data to platform!"); + if (tank1<9) { + tank1+=2; + } + sendData("oil_level", tank1); + } else if (strstr(msg, /*f*/"ill2")) { + reply = ("Increased fill - sending data to platform!"); + if (tank2<9) { + tank2+=2; + } + sendData("oil_level2", tank2); + } else if (strstr(msg, /*d*/"ipense1")) { + reply = ("Dispensed from tank 1 - sending data to platform!"); + if (tank1>=2) { + tank1-=2; + } + sendData("oil_level", tank1); + } else if (strstr(msg, /*d*/"ispense2")) { + reply = ("Dipensed from tank 2 - sending data to platform!"); + if (tank2>=2) { + tank2-=2; + } + sendData("oil_level2", tank2); + } + + printf("Send SMS reply \"%s\" to \"%s\"\r\n", reply, num); + mdm.smsSend(num, reply); + } + } +///////////////////////////////NETCHECK//////////////////////////////////////////////////////// + if (mdmOk && (i++ == 5000/wait)) { + i = 0; + // check the network status + if (mdm.checkNetStatus(&netStatus)) { + mdm.dumpNetStatus(&netStatus, fprintf, stdout); + } + } + wait_ms(wait); + } +//////////////////////////////CLOSE/////////////////////////////////////////////////////////////// + gps.powerOff(); + mdm.powerOff(); + return 0; +} +