whatever

Dependencies:   C027 C027_Support M2XStreamClient PowerControl jsonlite mbed-rtos mbed

Fork of PONY_Ph0-uAXIS by Sean McBeath

Committer:
sgmcb
Date:
Tue Dec 15 18:40:25 2015 +0000
Revision:
40:82b70b92169e
Parent:
39:c14aff678b25
Child:
41:f603d76dc6fe
AZ test build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lawliet 0:4e3cb26f6019 1 #include "mbed.h"
mazgch 9:26f694bc31b4 2
mazgch 19:f022ff746eb8 3 //------------------------------------------------------------------------------------
mazgch 11:b8505cbbd55c 4 /* This example was tested on C027-U20 and C027-G35 with the on board modem.
mazgch 11:b8505cbbd55c 5
mazgch 18:50e6c4ed8a4a 6 Additionally it was tested with a shield where the SARA-G350/U260/U270 RX/TX/PWRON
mazgch 11:b8505cbbd55c 7 is connected to D0/D1/D4 and the GPS SCL/SDA is connected D15/D15. In this
mazgch 11:b8505cbbd55c 8 configuration the following platforms were tested (it is likely that others
mazgch 11:b8505cbbd55c 9 will work as well)
mazgch 19:f022ff746eb8 10 - U-BLOX: C027-G35, C027-U20, C027-C20 (for shield set define C027_FORCE_SHIELD)
mazgch 18:50e6c4ed8a4a 11 - NXP: LPC1549v2, LPC4088qsb
mazgch 18:50e6c4ed8a4a 12 - Freescale: FRDM-KL05Z, FRDM-KL25Z, FRDM-KL46Z, FRDM-K64F
mazgch 12:96c7b62c7aaf 13 - STM: NUCLEO-F401RE, NUCLEO-F030R8
mazgch 18:50e6c4ed8a4a 14 mount resistors SB13/14 1k, SB62/63 0R
mazgch 11:b8505cbbd55c 15 */
sgmcb 36:258f3bb1c6a4 16
sgmcb 38:d86e744166b6 17 // C027 Support Libraries
mazgch 19:f022ff746eb8 18 #include "GPS.h"
mazgch 19:f022ff746eb8 19 #include "MDM.h"
sgmcb 36:258f3bb1c6a4 20
sgmcb 38:d86e744166b6 21 #include <jsonlite.h>
sgmcb 38:d86e744166b6 22 #include "M2XStreamClient.h"
sgmcb 37:71ab32b61dfb 23
lawliet 0:4e3cb26f6019 24
sgmcb 36:258f3bb1c6a4 25
sgmcb 36:258f3bb1c6a4 26
sgmcb 36:258f3bb1c6a4 27
sgmcb 36:258f3bb1c6a4 28
sgmcb 37:71ab32b61dfb 29
sgmcb 37:71ab32b61dfb 30
sgmcb 37:71ab32b61dfb 31
sgmcb 36:258f3bb1c6a4 32
sgmcb 38:d86e744166b6 33 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 34 // Cellular modem/SIM parameters
sgmcb 38:d86e744166b6 35 #define SIMPIN "1111" //!SIMPIN is 1111 by default for AT&T SIMs.
sgmcb 38:d86e744166b6 36 #define APN "m2m.com.attz" // Defined AT&T M2M APN
sgmcb 38:d86e744166b6 37 #define USERNAME NULL //! Set the user name for your APN, or NULL if not needed (which, apparently, it isn't)
sgmcb 38:d86e744166b6 38 #define PASSWORD NULL //! Set the password for your APN, or NULL if not needed (which, apparently, it isn't)
sgmcb 38:d86e744166b6 39
sgmcb 38:d86e744166b6 40
sgmcb 38:d86e744166b6 41
sgmcb 38:d86e744166b6 42 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 43 // AT&T M2X Kekys
sgmcb 38:d86e744166b6 44
sgmcb 39:c14aff678b25 45 #define M2XAPIKEY "54c6bbf11012f34830bd23cc091ca250"
sgmcb 39:c14aff678b25 46 #define DEVID "b9c57667ee0495dc0b3cddd890f8d2df"
sgmcb 38:d86e744166b6 47
sgmcb 38:d86e744166b6 48 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 49
sgmcb 38:d86e744166b6 50 #include "PONY_Loc.h" // PONY Location Code
sgmcb 39:c14aff678b25 51 #include "H3LIS331DL.h" // Accelerometer library
sgmcb 39:c14aff678b25 52
sgmcb 39:c14aff678b25 53
sgmcb 39:c14aff678b25 54
sgmcb 39:c14aff678b25 55
sgmcb 39:c14aff678b25 56 // PIN Config
sgmcb 39:c14aff678b25 57 DigitalIn jostle(P2_13);
sgmcb 39:c14aff678b25 58
sgmcb 39:c14aff678b25 59
sgmcb 38:d86e744166b6 60
sgmcb 38:d86e744166b6 61
sgmcb 38:d86e744166b6 62
sgmcb 38:d86e744166b6 63
sgmcb 38:d86e744166b6 64 // GLOBALS
sgmcb 38:d86e744166b6 65
sgmcb 38:d86e744166b6 66
sgmcb 38:d86e744166b6 67
sgmcb 38:d86e744166b6 68 Client client;
sgmcb 38:d86e744166b6 69 M2XStreamClient m2xClient(&client, M2XAPIKEY);
sgmcb 40:82b70b92169e 70 int M2X_response; // For m2x message responses
sgmcb 39:c14aff678b25 71 I2C axis(P0_0, P0_1);
sgmcb 38:d86e744166b6 72
sgmcb 40:82b70b92169e 73 char statusBuf[145] = "";
sgmcb 40:82b70b92169e 74
sgmcb 40:82b70b92169e 75
sgmcb 40:82b70b92169e 76 unsigned int kReadingDelay = 3 * 60 * 1000; // How many seconds to wait between reads
sgmcb 39:c14aff678b25 77 unsigned int kReadingDelayClimb = 15000; // How many seconds to add to the wait period when sitting idle
sgmcb 39:c14aff678b25 78 unsigned int kReadingDelayMax = 5 * 60000; // What's the maximum time between readings?
sgmcb 38:d86e744166b6 79
sgmcb 38:d86e744166b6 80
sgmcb 38:d86e744166b6 81 double kLaLoDiffMin = 0.01;
sgmcb 38:d86e744166b6 82 double kAltDiffMin = 2.00;
sgmcb 38:d86e744166b6 83
sgmcb 39:c14aff678b25 84 unsigned int kIdleSpins = 0;
sgmcb 39:c14aff678b25 85
sgmcb 39:c14aff678b25 86
sgmcb 39:c14aff678b25 87
sgmcb 39:c14aff678b25 88
sgmcb 39:c14aff678b25 89
sgmcb 39:c14aff678b25 90 void parseM2XLocation2(const char* name, double latitude, double longitude, double elevation, const char* timestamp, int index, void* context) {
sgmcb 39:c14aff678b25 91 printf("\n\n\n\n\n\n\n\n\n\n\n\n\nparseM2XLocation2\r\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
sgmcb 39:c14aff678b25 92 }
sgmcb 38:d86e744166b6 93
sgmcb 38:d86e744166b6 94 //#define CELLOCATE
sgmcb 38:d86e744166b6 95
sgmcb 38:d86e744166b6 96 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 97 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 98 //------------------------------------------------------------------------------------
sgmcb 38:d86e744166b6 99 int main(void)
sgmcb 38:d86e744166b6 100 {
sgmcb 38:d86e744166b6 101
sgmcb 39:c14aff678b25 102 printf("\r\n\n\n\n-----\r\nI'm alive - u9\r\n\n");
sgmcb 36:258f3bb1c6a4 103
sgmcb 38:d86e744166b6 104 int ret = 0;
sgmcb 38:d86e744166b6 105 int len = 0;
sgmcb 38:d86e744166b6 106 char buf[2048] = "";
sgmcb 38:d86e744166b6 107
sgmcb 38:d86e744166b6 108 // Create the GPS object
sgmcb 38:d86e744166b6 109 GPSI2C gpsInst;
sgmcb 38:d86e744166b6 110
sgmcb 38:d86e744166b6 111 // Struct for our GPS sentence info
sgmcb 38:d86e744166b6 112 struct GPSbundle GPSone;
sgmcb 38:d86e744166b6 113 GPSone.bGPS = gpsInst;
sgmcb 38:d86e744166b6 114 GPSone.bRet = ret;
sgmcb 38:d86e744166b6 115 GPSone.bLen = len;
sgmcb 38:d86e744166b6 116 GPSone.bBuf = &buf[0];
sgmcb 38:d86e744166b6 117 GPSone.bBufLen = sizeof(buf);
sgmcb 38:d86e744166b6 118
sgmcb 38:d86e744166b6 119 // Struct for item location
sgmcb 38:d86e744166b6 120 //double timestamp = 0, lat = 0, lon = 0, alt = 0, vel = 0;
sgmcb 39:c14aff678b25 121 struct GPSloc PONYspot, PONYlast;
sgmcb 38:d86e744166b6 122 MDMSerial mdm;
sgmcb 39:c14aff678b25 123 MDMParser::DevStatus devStatus = {};
sgmcb 39:c14aff678b25 124 MDMParser::NetStatus netStatus = {};
sgmcb 39:c14aff678b25 125 bool mdmOk = mdm.init(SIMPIN, &devStatus);
sgmcb 39:c14aff678b25 126 //mdm.setDebug(4);
sgmcb 39:c14aff678b25 127
sgmcb 39:c14aff678b25 128
sgmcb 39:c14aff678b25 129
sgmcb 39:c14aff678b25 130 // Acceleromter object
sgmcb 39:c14aff678b25 131 char ax[2];
sgmcb 39:c14aff678b25 132
sgmcb 39:c14aff678b25 133 //axis.write(0x3A,
sgmcb 39:c14aff678b25 134 //axis.read(0x3A,
sgmcb 39:c14aff678b25 135
sgmcb 39:c14aff678b25 136 //moveData kegMotion;
sgmcb 39:c14aff678b25 137
sgmcb 38:d86e744166b6 138
sgmcb 38:d86e744166b6 139 // Open modem connection
sgmcb 38:d86e744166b6 140 if (!mdm.connect(SIMPIN, APN,USERNAME,PASSWORD))
sgmcb 38:d86e744166b6 141 return -1;
sgmcb 38:d86e744166b6 142
sgmcb 38:d86e744166b6 143
sgmcb 38:d86e744166b6 144
sgmcb 38:d86e744166b6 145 // Ready the GPS
sgmcb 38:d86e744166b6 146 readyGPS(&GPSone, 5);
sgmcb 38:d86e744166b6 147
sgmcb 39:c14aff678b25 148
sgmcb 40:82b70b92169e 149
sgmcb 39:c14aff678b25 150
sgmcb 39:c14aff678b25 151 moveData kegMotion;
sgmcb 39:c14aff678b25 152
sgmcb 39:c14aff678b25 153 status_t axisStatus;
sgmcb 39:c14aff678b25 154 uint8_t axisID;
sgmcb 38:d86e744166b6 155
sgmcb 40:82b70b92169e 156
sgmcb 40:82b70b92169e 157 // Cell location call variables
sgmcb 40:82b70b92169e 158 const int sensorMask = 2; // 1 = GNSS, 2 = CellLocate, 3 = Hybrid: GNSS + CellLocate
sgmcb 40:82b70b92169e 159 const int timeout = 55; // in seconds
sgmcb 40:82b70b92169e 160 const int targetAccuracy = 1; // meters
sgmcb 40:82b70b92169e 161
sgmcb 40:82b70b92169e 162 // Cell location data
sgmcb 40:82b70b92169e 163 MDMParser::CellLocData ponyLoc, thisLoc;
sgmcb 40:82b70b92169e 164
sgmcb 40:82b70b92169e 165
sgmcb 40:82b70b92169e 166 printf("Configure deep scan mode\r\n");
sgmcb 40:82b70b92169e 167 int locConf = mdm.cellLocConfigSensor(1); // Set deep scan mode
sgmcb 40:82b70b92169e 168
sgmcb 40:82b70b92169e 169 // Loop driving variables
sgmcb 40:82b70b92169e 170 bool locLock;
sgmcb 40:82b70b92169e 171 int cellLocDelay = 2 * 1000;
sgmcb 40:82b70b92169e 172 int readLoopMax = 10;
sgmcb 40:82b70b92169e 173 int loopIter = 0;
sgmcb 40:82b70b92169e 174 int locAccLower = 50; // Immediately accept locations with uncertainty lower than this
sgmcb 40:82b70b92169e 175 int locAccUpper = 5000; // Don't accept locations with uncertainty greater than this
sgmcb 40:82b70b92169e 176
sgmcb 39:c14aff678b25 177
sgmcb 39:c14aff678b25 178
sgmcb 40:82b70b92169e 179 // Location reporting loop
sgmcb 40:82b70b92169e 180 while(true) {
sgmcb 40:82b70b92169e 181 printf("\r\n");
sgmcb 40:82b70b92169e 182
sgmcb 40:82b70b92169e 183 locLock = false;
sgmcb 40:82b70b92169e 184 loopIter++;
sgmcb 40:82b70b92169e 185
sgmcb 40:82b70b92169e 186 //printf("Cell location Request; deep scan=%i, mask=%i, accuracy=%i\r\n", locConf, sensorMask, targetAccuracy);
sgmcb 40:82b70b92169e 187 mdm.cellLocRequest(sensorMask, timeout, targetAccuracy);
sgmcb 40:82b70b92169e 188
sgmcb 40:82b70b92169e 189 // Have location data
sgmcb 40:82b70b92169e 190 if ( mdm.cellLocGet(&thisLoc) ){
sgmcb 40:82b70b92169e 191 printf("CellLocate position rec'd with uncertainty= %d\r\n", thisLoc.uncertainty );
sgmcb 40:82b70b92169e 192
sgmcb 40:82b70b92169e 193
sgmcb 40:82b70b92169e 194 if(thisLoc.uncertainty < ponyLoc.uncertainty) {
sgmcb 40:82b70b92169e 195 printf(" NEW-latitude: %0.5f, longitude: %0.5f, altitute: %d, uncertainty: %d\r\n", thisLoc.latitude, thisLoc.longitude, thisLoc.altitude, thisLoc.uncertainty);
sgmcb 40:82b70b92169e 196 ponyLoc.latitude = thisLoc.latitude;
sgmcb 40:82b70b92169e 197 ponyLoc.longitude = thisLoc.longitude;
sgmcb 40:82b70b92169e 198 ponyLoc.altitude = thisLoc.altitude;
sgmcb 40:82b70b92169e 199 ponyLoc.uncertainty = thisLoc.uncertainty;
sgmcb 40:82b70b92169e 200 }
sgmcb 40:82b70b92169e 201
sgmcb 40:82b70b92169e 202
sgmcb 40:82b70b92169e 203 // Check location data
sgmcb 40:82b70b92169e 204 if( ( 0 < ponyLoc.uncertainty && ponyLoc.uncertainty < locAccLower ) || ( 0 < ponyLoc.uncertainty && ponyLoc.uncertainty < locAccUpper && loopIter > readLoopMax ) ) {
sgmcb 40:82b70b92169e 205
sgmcb 40:82b70b92169e 206 printf("\r\nTRANSMIT LOCATION DATA:\r\nla=%0.5f, lo=%0.5f, alt=%d\r\n", ponyLoc.latitude, ponyLoc.longitude, ponyLoc.altitude);
sgmcb 40:82b70b92169e 207 M2X_response = m2xClient.updateLocation(DEVID, "pony-spot", (double) ponyLoc.latitude, (double) ponyLoc.longitude, (double) ponyLoc.altitude);
sgmcb 40:82b70b92169e 208
sgmcb 40:82b70b92169e 209 if(M2X_response == 202)
sgmcb 40:82b70b92169e 210 printf("Location POST successful\r\n");
sgmcb 40:82b70b92169e 211
sgmcb 40:82b70b92169e 212
sgmcb 40:82b70b92169e 213 // Report uncertainty
sgmcb 40:82b70b92169e 214 M2X_response = m2xClient.updateStreamValue(DEVID, "locacc", ponyLoc.uncertainty);
sgmcb 40:82b70b92169e 215
sgmcb 40:82b70b92169e 216 if(M2X_response == 202)
sgmcb 40:82b70b92169e 217 printf("Location Confidence (%d) POST successful\r\n", ponyLoc.uncertainty);
sgmcb 40:82b70b92169e 218
sgmcb 40:82b70b92169e 219 locLock = true;
sgmcb 40:82b70b92169e 220 }
sgmcb 40:82b70b92169e 221 }
sgmcb 40:82b70b92169e 222
sgmcb 40:82b70b92169e 223 // No location data
sgmcb 40:82b70b92169e 224 else {
sgmcb 40:82b70b92169e 225 printf("cellLocGet failed.\r\n");
sgmcb 40:82b70b92169e 226 //
sgmcb 40:82b70b92169e 227 }
sgmcb 40:82b70b92169e 228
sgmcb 40:82b70b92169e 229 // Wait only if we've received a good location reading
sgmcb 40:82b70b92169e 230 if(locLock) {
sgmcb 40:82b70b92169e 231 printf("Begin %i second delay\r\n",kReadingDelay/1000); loopIter = 0; delay(kReadingDelay);
sgmcb 40:82b70b92169e 232 ponyLoc.uncertainty = locAccUpper + 1;
sgmcb 40:82b70b92169e 233 continue;
sgmcb 40:82b70b92169e 234 }
sgmcb 40:82b70b92169e 235 else if (loopIter > readLoopMax) {
sgmcb 40:82b70b92169e 236 sprintf(statusBuf, "CellLoc location not found after %i loops.\r\n", loopIter);
sgmcb 40:82b70b92169e 237 printf(statusBuf);
sgmcb 40:82b70b92169e 238 M2X_response = m2xClient.updateStreamValue(DEVID, "status", statusBuf);
sgmcb 40:82b70b92169e 239 if(M2X_response == 202)
sgmcb 40:82b70b92169e 240 printf("Status POST successful\r\n");
sgmcb 40:82b70b92169e 241
sgmcb 40:82b70b92169e 242 ponyLoc.uncertainty = locAccUpper + 1;
sgmcb 40:82b70b92169e 243 printf("Begin %i second delay\r\n",kReadingDelay/1000); loopIter = 0; delay(kReadingDelay);
sgmcb 40:82b70b92169e 244 continue;
sgmcb 40:82b70b92169e 245 }
sgmcb 40:82b70b92169e 246 else {
sgmcb 40:82b70b92169e 247 delay(cellLocDelay); // Delay between CellLoc requests when not getting good data
sgmcb 40:82b70b92169e 248 }
sgmcb 40:82b70b92169e 249 }
sgmcb 39:c14aff678b25 250
sgmcb 39:c14aff678b25 251
sgmcb 39:c14aff678b25 252
sgmcb 39:c14aff678b25 253
sgmcb 39:c14aff678b25 254 /*
sgmcb 39:c14aff678b25 255
sgmcb 39:c14aff678b25 256 if( true ) { //(abs(PONYspot.lat - PONYlast.lat) > kLaLoDiffMin) || (abs(PONYspot.lon - PONYlast.lon) > kLaLoDiffMin) || (abs(PONYspot.alt - PONYlast.alt) > kAltDiffMin) ) {
sgmcb 39:c14aff678b25 257
sgmcb 39:c14aff678b25 258 //printf("New location found!\r\n");
sgmcb 39:c14aff678b25 259 M2X_response = m2xClient.updateLocation(DEVID, "Igor-spot", PONYspot.lat, PONYspot.lon, PONYspot.alt);
sgmcb 39:c14aff678b25 260
sgmcb 40:82b70b92169e 261
sgmcb 39:c14aff678b25 262
sgmcb 39:c14aff678b25 263 PONYlast = PONYspot;
sgmcb 39:c14aff678b25 264
sgmcb 39:c14aff678b25 265 kIdleSpins = 0;
sgmcb 39:c14aff678b25 266 }
sgmcb 39:c14aff678b25 267 }
sgmcb 39:c14aff678b25 268 else {
sgmcb 40:82b70b92169e 269
sgmcb 40:82b70b92169e 270
sgmcb 39:c14aff678b25 271
sgmcb 39:c14aff678b25 272 }
sgmcb 40:82b70b92169e 273 */
sgmcb 38:d86e744166b6 274
sgmcb 39:c14aff678b25 275
sgmcb 40:82b70b92169e 276 //mdm.disconnect();
sgmcb 40:82b70b92169e 277 //mdm.powerOff();
msinig 35:16f1037626e3 278
lawliet 0:4e3cb26f6019 279 }