пропажа слешей

Dependencies:   mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820

Committer:
spin7ion
Date:
Wed Sep 30 16:40:29 2020 +0000
Revision:
10:51960145754a
Parent:
9:e8a07983289f
Child:
11:57fa27cb533e
Now it can send jsons

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:0279e8c1f111 1 #include "stm32f103c8t6.h"
hudakz 0:0279e8c1f111 2 #include "mbed.h"
spin7ion 6:70d0218c2a28 3 #include "DS1820.h"
spin7ion 6:70d0218c2a28 4 #include "MLX90614.h"
spin7ion 6:70d0218c2a28 5 #include "config.h"
spin7ion 6:70d0218c2a28 6 #include "ATCmdParser.h"
spin7ion 6:70d0218c2a28 7 #include "UARTSerial.h"
spin7ion 6:70d0218c2a28 8 #include "Watchdog.h"
spin7ion 6:70d0218c2a28 9
spin7ion 6:70d0218c2a28 10 Watchdog wd;
spin7ion 6:70d0218c2a28 11
spin7ion 6:70d0218c2a28 12 DigitalOut myled(PC_13);
spin7ion 6:70d0218c2a28 13
spin7ion 6:70d0218c2a28 14 //SIM7000
spin7ion 6:70d0218c2a28 15 UARTSerial *_serial;
spin7ion 6:70d0218c2a28 16 ATCmdParser *_parser;
spin7ion 10:51960145754a 17 int rssiDB,rxQual;
spin7ion 10:51960145754a 18
spin7ion 6:70d0218c2a28 19
spin7ion 6:70d0218c2a28 20 //Termometers
spin7ion 6:70d0218c2a28 21 OneWire oneWire(PIN_ONEWIRE);
spin7ion 6:70d0218c2a28 22 const int SENSORS_COUNT = 10;
spin7ion 6:70d0218c2a28 23 DS1820* ds1820[SENSORS_COUNT];
spin7ion 6:70d0218c2a28 24 int sensors_found = 0;
spin7ion 6:70d0218c2a28 25 const char sensorsOrder[]={4,2,5,8,0,3,6,1,9,7};
spin7ion 6:70d0218c2a28 26 float stickTemperatures[SENSORS_COUNT];
spin7ion 6:70d0218c2a28 27
spin7ion 6:70d0218c2a28 28 int i=0;
spin7ion 6:70d0218c2a28 29
spin7ion 6:70d0218c2a28 30 //IR termometer
spin7ion 6:70d0218c2a28 31 I2C i2c(PIN_SDA, PIN_SCL); //sda,scl
spin7ion 6:70d0218c2a28 32 MLX90614 thermometer(&i2c);
spin7ion 6:70d0218c2a28 33 float IRtemp;
hudakz 0:0279e8c1f111 34
spin7ion 6:70d0218c2a28 35 #if DEBUG_PC
spin7ion 6:70d0218c2a28 36 Serial pc(PIN_TX, PIN_RX); // TX, RX
spin7ion 6:70d0218c2a28 37 #endif
spin7ion 6:70d0218c2a28 38
spin7ion 6:70d0218c2a28 39 int index;
spin7ion 6:70d0218c2a28 40 char bufferString[2048];
spin7ion 6:70d0218c2a28 41
spin7ion 6:70d0218c2a28 42 int h_time, m_time, s_time;
spin7ion 6:70d0218c2a28 43 int fq, nst, fix, date; // fix quality, Number of satellites being tracked, 3D fix
spin7ion 6:70d0218c2a28 44 float latitude, longitude, timefix, speed, altitude;
spin7ion 6:70d0218c2a28 45
spin7ion 6:70d0218c2a28 46 char state=STATE_INIT;
spin7ion 6:70d0218c2a28 47 int sleepTimer=0;
spin7ion 6:70d0218c2a28 48 int fixTries=0;
hudakz 0:0279e8c1f111 49
spin7ion 6:70d0218c2a28 50 void parseTime (float timeval)
spin7ion 6:70d0218c2a28 51 {
spin7ion 6:70d0218c2a28 52 //format utc time to beijing time,add 8 time zone
spin7ion 6:70d0218c2a28 53 float time = timeval + 80000.00f;
spin7ion 6:70d0218c2a28 54 h_time = int(time) / 10000;
spin7ion 6:70d0218c2a28 55 m_time = (int(time) % 10000) / 100;
spin7ion 6:70d0218c2a28 56 s_time = int(time) % 100;
spin7ion 6:70d0218c2a28 57 }
spin7ion 6:70d0218c2a28 58
spin7ion 6:70d0218c2a28 59 /*
spin7ion 6:70d0218c2a28 60 * NMEA sentences: https://www.gpsinformation.org/dale/nmea.htm#nmea
spin7ion 6:70d0218c2a28 61 * http://navspark.mybigcommerce.com/content/NMEA_Format_v0.1.pdf
spin7ion 6:70d0218c2a28 62 */
spin7ion 6:70d0218c2a28 63 void nmea_parse(char *cmd)
spin7ion 6:70d0218c2a28 64 {
spin7ion 6:70d0218c2a28 65 char ns, ew, tf, status;
spin7ion 6:70d0218c2a28 66
hudakz 4:00ccc80cbeb8 67
spin7ion 6:70d0218c2a28 68 // Global Positioning System Fix Data
spin7ion 6:70d0218c2a28 69 if(strncmp(cmd,"$GPGGA", 6) == 0)
spin7ion 6:70d0218c2a28 70 {
spin7ion 6:70d0218c2a28 71 sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
spin7ion 6:70d0218c2a28 72 #if DEBUG_PC
spin7ion 6:70d0218c2a28 73 pc.printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude);
spin7ion 6:70d0218c2a28 74 #endif
spin7ion 6:70d0218c2a28 75 }
spin7ion 6:70d0218c2a28 76
spin7ion 6:70d0218c2a28 77 // Satellite status
spin7ion 6:70d0218c2a28 78 else if(strncmp(cmd,"$GPGSA", 6) == 0)
spin7ion 6:70d0218c2a28 79 {
spin7ion 6:70d0218c2a28 80 sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst);
spin7ion 6:70d0218c2a28 81 #if DEBUG_PC
spin7ion 6:70d0218c2a28 82 pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
spin7ion 6:70d0218c2a28 83 #endif
spin7ion 6:70d0218c2a28 84 }
spin7ion 6:70d0218c2a28 85
spin7ion 6:70d0218c2a28 86 // Geographic position, Latitude and Longitude
spin7ion 6:70d0218c2a28 87 else if(strncmp(cmd,"$GPGLL", 6) == 0)
spin7ion 6:70d0218c2a28 88 {
spin7ion 6:70d0218c2a28 89 sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
spin7ion 6:70d0218c2a28 90 #if DEBUG_PC
spin7ion 6:70d0218c2a28 91 pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
spin7ion 6:70d0218c2a28 92 #endif
spin7ion 6:70d0218c2a28 93 }
spin7ion 6:70d0218c2a28 94
spin7ion 6:70d0218c2a28 95 // Geographic position, Latitude and Longitude
spin7ion 6:70d0218c2a28 96 else if(strncmp(cmd,"$GPRMC", 6) == 0)
spin7ion 6:70d0218c2a28 97 {
spin7ion 6:70d0218c2a28 98 sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date);
spin7ion 6:70d0218c2a28 99 #if DEBUG_PC
spin7ion 6:70d0218c2a28 100 pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date);
spin7ion 6:70d0218c2a28 101 #endif
spin7ion 6:70d0218c2a28 102 }
hudakz 0:0279e8c1f111 103
spin7ion 6:70d0218c2a28 104 //
spin7ion 6:70d0218c2a28 105 else if(strncmp(cmd,"$GNVTG", 6) == 0)
spin7ion 6:70d0218c2a28 106 {
spin7ion 6:70d0218c2a28 107 // pc.printf("its a Vector Track message.\n");
spin7ion 6:70d0218c2a28 108 }
spin7ion 6:70d0218c2a28 109
spin7ion 6:70d0218c2a28 110 else if(strncmp(cmd,"$GNGGA", 6) == 0)
spin7ion 6:70d0218c2a28 111 {
spin7ion 6:70d0218c2a28 112 sscanf(cmd, "$GNGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude);
spin7ion 6:70d0218c2a28 113 parseTime(timefix);
spin7ion 6:70d0218c2a28 114 #if DEBUG_PC
spin7ion 6:70d0218c2a28 115 pc.printf("GNGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude);
spin7ion 6:70d0218c2a28 116 pc.printf("Time: %d:%d:%d\n", h_time, m_time, s_time);
spin7ion 6:70d0218c2a28 117 #endif
spin7ion 6:70d0218c2a28 118 }
spin7ion 6:70d0218c2a28 119
spin7ion 6:70d0218c2a28 120 else if(strncmp(cmd,"$GNGSA", 6) == 0)
spin7ion 6:70d0218c2a28 121 {
spin7ion 6:70d0218c2a28 122 sscanf(cmd, "$GNGSA,%c,%d,%d", &tf, &fix, &nst);
spin7ion 6:70d0218c2a28 123 #if DEBUG_PC
spin7ion 6:70d0218c2a28 124 pc.printf("GNGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst);
spin7ion 6:70d0218c2a28 125 #endif
spin7ion 6:70d0218c2a28 126 }
spin7ion 6:70d0218c2a28 127
spin7ion 6:70d0218c2a28 128 else if(strncmp(cmd,"$GPGSV", 6) == 0)
spin7ion 6:70d0218c2a28 129 {
spin7ion 6:70d0218c2a28 130 // pc.printf("its a Satellite details message.\n");
spin7ion 6:70d0218c2a28 131 }
spin7ion 6:70d0218c2a28 132
spin7ion 6:70d0218c2a28 133 else if(strncmp(cmd,"$GNGLL", 6) == 0)
spin7ion 6:70d0218c2a28 134 {
spin7ion 6:70d0218c2a28 135 sscanf(cmd, "$GNGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix);
spin7ion 6:70d0218c2a28 136 #if DEBUG_PC
spin7ion 6:70d0218c2a28 137 pc.printf("GNGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix);
spin7ion 6:70d0218c2a28 138 #endif
spin7ion 6:70d0218c2a28 139 }
spin7ion 6:70d0218c2a28 140
spin7ion 6:70d0218c2a28 141 else
spin7ion 6:70d0218c2a28 142 {
spin7ion 6:70d0218c2a28 143 // pc.printf("Unknown message type\n");
hudakz 0:0279e8c1f111 144 }
hudakz 0:0279e8c1f111 145 }
hudakz 0:0279e8c1f111 146
spin7ion 6:70d0218c2a28 147 bool checkIfOk() {
spin7ion 6:70d0218c2a28 148 if(_parser->recv("OK")) {
spin7ion 6:70d0218c2a28 149 #if DEBUG_PC
spin7ion 6:70d0218c2a28 150 pc.printf("Done\r\n");
spin7ion 6:70d0218c2a28 151 #endif
spin7ion 6:70d0218c2a28 152
spin7ion 6:70d0218c2a28 153 return true;
spin7ion 6:70d0218c2a28 154 } else {
spin7ion 6:70d0218c2a28 155 #if DEBUG_PC
spin7ion 6:70d0218c2a28 156 pc.printf("Fail\r\n");
spin7ion 6:70d0218c2a28 157 #endif
spin7ion 6:70d0218c2a28 158
spin7ion 6:70d0218c2a28 159 return false;
spin7ion 6:70d0218c2a28 160 }
spin7ion 6:70d0218c2a28 161 }
spin7ion 6:70d0218c2a28 162
spin7ion 6:70d0218c2a28 163 bool enableGPS(bool powerUp) {
spin7ion 10:51960145754a 164 #if DEBUG_PC
spin7ion 9:e8a07983289f 165 pc.printf("Powering GPS %s:",powerUp?"up":"down");
spin7ion 10:51960145754a 166 #endif
spin7ion 6:70d0218c2a28 167 if(powerUp){
spin7ion 6:70d0218c2a28 168 _parser->send("AT+CGNSPWR=1"); //GPS power on
spin7ion 6:70d0218c2a28 169 } else {
spin7ion 6:70d0218c2a28 170 _parser->send("AT+CGNSPWR=0"); //GPS power off
spin7ion 6:70d0218c2a28 171 }
spin7ion 6:70d0218c2a28 172
spin7ion 10:51960145754a 173 return checkIfOk();
spin7ion 10:51960145754a 174 }
spin7ion 10:51960145754a 175
spin7ion 10:51960145754a 176 bool enableRF(bool powerUp){
spin7ion 10:51960145754a 177 #if DEBUG_PC
spin7ion 10:51960145754a 178 pc.printf("Powering RF %s:",powerUp?"up":"down");
spin7ion 10:51960145754a 179 #endif
spin7ion 10:51960145754a 180 if(powerUp){
spin7ion 10:51960145754a 181 _parser->send("AT+CFUN=1,1");
spin7ion 10:51960145754a 182 } else {
spin7ion 10:51960145754a 183 _parser->send("AT+CFUN=0"); //GPS power off
spin7ion 10:51960145754a 184 }
spin7ion 10:51960145754a 185
spin7ion 6:70d0218c2a28 186 return checkIfOk();
spin7ion 6:70d0218c2a28 187 }
spin7ion 6:70d0218c2a28 188
spin7ion 10:51960145754a 189 bool setPowerSavingMode() {
spin7ion 10:51960145754a 190 _parser->send("AT+CPSMS=1");//power save
spin7ion 10:51960145754a 191 return checkIfOk();
spin7ion 10:51960145754a 192 }
spin7ion 10:51960145754a 193
spin7ion 6:70d0218c2a28 194 bool setSatSystems(){
spin7ion 10:51960145754a 195 #if DEBUG_PC
spin7ion 10:51960145754a 196 pc.printf("Setting sats:");
spin7ion 10:51960145754a 197 #endif
spin7ion 6:70d0218c2a28 198 _parser->send("AT+CGNSMOD=1,1,1,1");
spin7ion 6:70d0218c2a28 199 return checkIfOk();
spin7ion 6:70d0218c2a28 200 }
spin7ion 6:70d0218c2a28 201
spin7ion 10:51960145754a 202 bool getSignalQuality() {
spin7ion 10:51960145754a 203 _parser->send("AT+CSQ");
spin7ion 10:51960145754a 204
spin7ion 10:51960145754a 205 if(_parser->recv("+CSQ: %d,%d", &rssiDB,&rxQual) && _parser->recv("OK")) {
spin7ion 10:51960145754a 206 return true;
spin7ion 10:51960145754a 207 }
spin7ion 10:51960145754a 208 return false;
spin7ion 10:51960145754a 209 }
spin7ion 10:51960145754a 210
spin7ion 10:51960145754a 211 bool setAPN() {
spin7ion 10:51960145754a 212 _parser->send("AT+CNACT=1,\"iot\"");
spin7ion 10:51960145754a 213 return checkIfOk();
spin7ion 10:51960145754a 214 }
spin7ion 10:51960145754a 215
spin7ion 10:51960145754a 216 bool disconnectNetwork() {
spin7ion 10:51960145754a 217 _parser->send("AT+CNACT=0");
spin7ion 10:51960145754a 218 return checkIfOk();
spin7ion 10:51960145754a 219 }
spin7ion 10:51960145754a 220
spin7ion 10:51960145754a 221 void initSIM(){
spin7ion 10:51960145754a 222 enableRF(1);
spin7ion 10:51960145754a 223 enableGPS(0);
spin7ion 10:51960145754a 224 setSatSystems();
spin7ion 10:51960145754a 225 wd.Service();
spin7ion 10:51960145754a 226 setPowerSavingMode();
spin7ion 10:51960145754a 227 setAPN();
spin7ion 10:51960145754a 228 wd.Service();
spin7ion 10:51960145754a 229 }
spin7ion 10:51960145754a 230
spin7ion 6:70d0218c2a28 231 bool getGPS() {
spin7ion 10:51960145754a 232 wd.Service();
spin7ion 6:70d0218c2a28 233 _parser->send("AT+CGNSTST=1,1");
spin7ion 10:51960145754a 234 //wait(PARSER_TIMEOUT_S);
spin7ion 10:51960145754a 235
spin7ion 6:70d0218c2a28 236 if(_parser->recv("OK")) {
spin7ion 6:70d0218c2a28 237 int nmeaStrLen=_parser->read(bufferString, 2048);
spin7ion 6:70d0218c2a28 238
spin7ion 6:70d0218c2a28 239 char *curLine = bufferString;
spin7ion 6:70d0218c2a28 240 while(curLine)
spin7ion 6:70d0218c2a28 241 {
spin7ion 6:70d0218c2a28 242 char *nextLine = strchr(curLine, '\n');
spin7ion 6:70d0218c2a28 243 if (nextLine) *nextLine = '\0'; // temporarily terminate the current line
spin7ion 6:70d0218c2a28 244 if(curLine[0]=='$'){
spin7ion 6:70d0218c2a28 245 nmea_parse(curLine);
spin7ion 6:70d0218c2a28 246 #if DEBUG_PC
spin7ion 6:70d0218c2a28 247 pc.printf("curLine=[%s]\n", curLine);
spin7ion 6:70d0218c2a28 248 #endif
spin7ion 6:70d0218c2a28 249 }
spin7ion 6:70d0218c2a28 250 if (nextLine) *nextLine = '\n'; // then restore newline-char, just to be tidy
spin7ion 6:70d0218c2a28 251 curLine = nextLine ? (nextLine+1) : NULL;
spin7ion 6:70d0218c2a28 252 }
spin7ion 6:70d0218c2a28 253 return fix>0;
spin7ion 10:51960145754a 254 } else{
spin7ion 10:51960145754a 255 int nmeaStrLen=_parser->read(bufferString, 2048);
spin7ion 10:51960145754a 256 pc.printf("curLine=[%s]\n", bufferString);
spin7ion 10:51960145754a 257 }
spin7ion 6:70d0218c2a28 258 return false;
spin7ion 6:70d0218c2a28 259 }
spin7ion 6:70d0218c2a28 260
spin7ion 10:51960145754a 261 void terminateCOAPSession() {
spin7ion 10:51960145754a 262 _parser->send("AT+CCOAPTERM");
spin7ion 10:51960145754a 263 checkIfOk();
spin7ion 10:51960145754a 264 wait(0.5);
spin7ion 10:51960145754a 265 _parser->send("AT+CNACT=0");
spin7ion 10:51960145754a 266 checkIfOk();
spin7ion 10:51960145754a 267 }
spin7ion 10:51960145754a 268
spin7ion 10:51960145754a 269 bool sendTelemetry() {
spin7ion 10:51960145754a 270 wd.Service();
spin7ion 10:51960145754a 271 setAPN();
spin7ion 10:51960145754a 272 wait(1);
spin7ion 10:51960145754a 273 _parser->send("AT+CCOAPINIT");
spin7ion 10:51960145754a 274 if(!checkIfOk()){
spin7ion 10:51960145754a 275 terminateCOAPSession();
spin7ion 10:51960145754a 276 return false;
spin7ion 10:51960145754a 277 }
spin7ion 10:51960145754a 278 wait(1);
spin7ion 10:51960145754a 279 _parser->send("AT+CCOAPURL=\"" MTS_TELEMETRY_URL_STRING);
spin7ion 10:51960145754a 280 if(!checkIfOk()){ terminateCOAPSession();return false;}
spin7ion 10:51960145754a 281 wait(1);
spin7ion 10:51960145754a 282 _parser->printf("AT+CCOAPPARA=code,2,token,0,\"%s\",payload,1,",xstr(MTS_COAP_TOKEN));
spin7ion 10:51960145754a 283
spin7ion 10:51960145754a 284 for (size_t i = 0; i < strlen(bufferString); i++) {
spin7ion 10:51960145754a 285 _parser->printf("%x",bufferString[i]);
spin7ion 10:51960145754a 286 }
spin7ion 10:51960145754a 287
spin7ion 10:51960145754a 288 _parser->printf("\r\n");
spin7ion 10:51960145754a 289 if(!checkIfOk()){ terminateCOAPSession();return false;}
spin7ion 10:51960145754a 290 wait(0.5);
spin7ion 10:51960145754a 291 _parser->send("AT+CCOAPACTION");
spin7ion 10:51960145754a 292 if(!checkIfOk()){ terminateCOAPSession();return false;}
spin7ion 10:51960145754a 293 wait(0.5);
spin7ion 10:51960145754a 294 terminateCOAPSession();
spin7ion 10:51960145754a 295
spin7ion 10:51960145754a 296 return true;
spin7ion 10:51960145754a 297 }
spin7ion 10:51960145754a 298
spin7ion 6:70d0218c2a28 299 int main() {
spin7ion 6:70d0218c2a28 300 confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock)
spin7ion 10:51960145754a 301 for(i=0;i<10;i++){
spin7ion 10:51960145754a 302 myled = 0;
spin7ion 10:51960145754a 303 wait(0.5);
spin7ion 6:70d0218c2a28 304 myled = 1;
spin7ion 10:51960145754a 305 wait(0.5);
spin7ion 10:51960145754a 306 myled = 0;}
spin7ion 10:51960145754a 307 //wait(WATCHDOG_INTERVAL_S-15);//Let SIM7000 wake up
spin7ion 6:70d0218c2a28 308
spin7ion 6:70d0218c2a28 309 #if DEBUG_PC
spin7ion 6:70d0218c2a28 310 pc.baud(115200);
spin7ion 6:70d0218c2a28 311 pc.printf("Starting\r\n");
spin7ion 9:e8a07983289f 312 if (wd.WatchdogCausedReset()) {
spin7ion 6:70d0218c2a28 313 pc.printf("Watchdog caused reset.\r\n");
spin7ion 9:e8a07983289f 314 }
spin7ion 6:70d0218c2a28 315 #endif
spin7ion 6:70d0218c2a28 316
spin7ion 10:51960145754a 317 #if ENABLE_WATCHDOG
spin7ion 6:70d0218c2a28 318 wd.Configure(WATCHDOG_INTERVAL_S); // sets the timeout interval
spin7ion 10:51960145754a 319 #endif
spin7ion 6:70d0218c2a28 320
spin7ion 6:70d0218c2a28 321 //Initiate SIM7000 SERIAL
spin7ion 6:70d0218c2a28 322 _serial = new UARTSerial(PIN_SIM_TX, PIN_SIM_RX, 115200);
spin7ion 6:70d0218c2a28 323 _parser = new ATCmdParser(_serial);
spin7ion 6:70d0218c2a28 324 _parser->debug_on( DEBUG_SIM );
spin7ion 6:70d0218c2a28 325 _parser->set_delimiter( "\r\n" );
spin7ion 10:51960145754a 326 _parser->set_timeout (PARSER_TIMEOUT_S);
spin7ion 6:70d0218c2a28 327 wait(0.5);
spin7ion 6:70d0218c2a28 328
spin7ion 10:51960145754a 329 initSIM();
spin7ion 10:51960145754a 330
spin7ion 10:51960145754a 331 #if DEBUG_SIM
spin7ion 10:51960145754a 332 _parser->send("AT+CMEE=2"); //report debug info
spin7ion 10:51960145754a 333 checkIfOk();
spin7ion 10:51960145754a 334 #endif
spin7ion 10:51960145754a 335 _parser->send("AT+CPIN?");
spin7ion 10:51960145754a 336 if(_parser->recv("+CPIN:READY")) {
spin7ion 10:51960145754a 337 #if DEBUG_PC
spin7ion 10:51960145754a 338 pc.printf("SIM ready\r\n");
spin7ion 10:51960145754a 339 #endif
spin7ion 10:51960145754a 340 }
spin7ion 6:70d0218c2a28 341
spin7ion 10:51960145754a 342 /*_parser->send("AT+CPSI?");
spin7ion 10:51960145754a 343 checkIfOk();
spin7ion 10:51960145754a 344 _parser->send("AT+CGNAPN");
spin7ion 10:51960145754a 345 checkIfOk();
spin7ion 10:51960145754a 346 _parser->send("AT+CAPNMODE=1");
spin7ion 10:51960145754a 347 checkIfOk();
spin7ion 10:51960145754a 348 _parser->send("AT+CREG?");
spin7ion 10:51960145754a 349 checkIfOk();
spin7ion 10:51960145754a 350 */
spin7ion 10:51960145754a 351 getSignalQuality();
spin7ion 10:51960145754a 352 #if DEBUG_PC
spin7ion 10:51960145754a 353 pc.printf("Signal quality: %d\r\n",rssiDB);
spin7ion 10:51960145754a 354 #endif
spin7ion 10:51960145754a 355
spin7ion 10:51960145754a 356 wd.Service();
spin7ion 6:70d0218c2a28 357 //Initiate termal stick
spin7ion 6:70d0218c2a28 358 for(i = 0; i < SENSORS_COUNT; i++) {
spin7ion 6:70d0218c2a28 359 ds1820[i] = new DS1820(&oneWire);
spin7ion 6:70d0218c2a28 360 if(!ds1820[i]->begin()) {
spin7ion 6:70d0218c2a28 361 delete ds1820[i];
spin7ion 6:70d0218c2a28 362 break;
spin7ion 6:70d0218c2a28 363 }
spin7ion 6:70d0218c2a28 364 }
spin7ion 6:70d0218c2a28 365
spin7ion 6:70d0218c2a28 366 sensors_found = i;
spin7ion 6:70d0218c2a28 367 #if DEBUG_PC
spin7ion 6:70d0218c2a28 368 pc.printf("Found %d sensors\r\n",sensors_found);
spin7ion 6:70d0218c2a28 369 if (sensors_found==0)
spin7ion 6:70d0218c2a28 370 pc.printf("No devices found");
spin7ion 6:70d0218c2a28 371 #endif
spin7ion 6:70d0218c2a28 372
spin7ion 6:70d0218c2a28 373 //Feed the watchdog
spin7ion 6:70d0218c2a28 374 wd.Service();
spin7ion 6:70d0218c2a28 375 state=STATE_STARTING_GPS;
spin7ion 6:70d0218c2a28 376
spin7ion 6:70d0218c2a28 377 while(1) {
spin7ion 10:51960145754a 378 wd.Service();
spin7ion 6:70d0218c2a28 379 if (state==STATE_STARTING_GPS){
spin7ion 6:70d0218c2a28 380 #if DEBUG_PC
spin7ion 10:51960145754a 381 pc.printf("STATE=STARTING GPS\r\n");
spin7ion 6:70d0218c2a28 382 #endif
spin7ion 10:51960145754a 383 setSatSystems();
spin7ion 6:70d0218c2a28 384 enableGPS(1);
spin7ion 6:70d0218c2a28 385 state=STATE_WAITING_FIX;
spin7ion 6:70d0218c2a28 386 fixTries=0;
spin7ion 6:70d0218c2a28 387 wd.Service();
spin7ion 6:70d0218c2a28 388 wait(FIX_CHECK_TIME_S);
spin7ion 6:70d0218c2a28 389 } else if(state==STATE_WAITING_FIX) {
spin7ion 10:51960145754a 390
spin7ion 10:51960145754a 391 #if DEBUG_PC
spin7ion 10:51960145754a 392 pc.printf("STATE=WAITNG FIX\r\n");
spin7ion 10:51960145754a 393 #endif
spin7ion 10:51960145754a 394 wd.Service();
spin7ion 6:70d0218c2a28 395 if(getGPS()){
spin7ion 10:51960145754a 396 wd.Service();
spin7ion 6:70d0218c2a28 397 enableGPS(0);
spin7ion 10:51960145754a 398 fixTries=0;
spin7ion 6:70d0218c2a28 399 state=STATE_COLLECTING_TELEMETRY;
spin7ion 6:70d0218c2a28 400 } else {
spin7ion 10:51960145754a 401 wd.Service();
spin7ion 9:e8a07983289f 402 #if DEBUG_PC
spin7ion 10:51960145754a 403 pc.printf("No fix(%d) at %d/%d try\r\n", fix, fixTries, FIX_MAX_TRIES);
spin7ion 9:e8a07983289f 404 #endif
spin7ion 6:70d0218c2a28 405 fixTries++;
spin7ion 6:70d0218c2a28 406 if (fixTries>FIX_MAX_TRIES) {
spin7ion 6:70d0218c2a28 407 //fix not achieved in given tries, send as is
spin7ion 10:51960145754a 408 #if DEBUG_PC
spin7ion 10:51960145754a 409 pc.printf("No fix but continue\r\n");
spin7ion 10:51960145754a 410 #endif
spin7ion 6:70d0218c2a28 411 enableGPS(0);
spin7ion 9:e8a07983289f 412 wd.Service();
spin7ion 6:70d0218c2a28 413 state=STATE_COLLECTING_TELEMETRY;
spin7ion 10:51960145754a 414 fixTries=0;
spin7ion 6:70d0218c2a28 415 } else {
spin7ion 10:51960145754a 416 #if DEBUG_PC
spin7ion 10:51960145754a 417 pc.printf("Waiting %d sec\r\n",FIX_CHECK_TIME_S);
spin7ion 10:51960145754a 418 #endif
spin7ion 6:70d0218c2a28 419 wd.Service();
spin7ion 6:70d0218c2a28 420 wait(FIX_CHECK_TIME_S);
spin7ion 6:70d0218c2a28 421 }
spin7ion 6:70d0218c2a28 422 }
spin7ion 6:70d0218c2a28 423 } else if(state==STATE_COLLECTING_TELEMETRY) {
spin7ion 10:51960145754a 424 #if DEBUG_PC
spin7ion 10:51960145754a 425 pc.printf("STATE=COLLECTING TELEMETRY\r\n");
spin7ion 10:51960145754a 426 #endif
spin7ion 6:70d0218c2a28 427 for(i=0;i<SENSORS_COUNT;i++){
spin7ion 6:70d0218c2a28 428 if(sensorsOrder[i]<sensors_found){
spin7ion 6:70d0218c2a28 429 ds1820[sensorsOrder[i]]->startConversion();
spin7ion 6:70d0218c2a28 430 }
spin7ion 6:70d0218c2a28 431 }
spin7ion 6:70d0218c2a28 432 wait(1.0);
spin7ion 6:70d0218c2a28 433 for(i=0;i<SENSORS_COUNT;i++){
spin7ion 6:70d0218c2a28 434 if(sensorsOrder[i]<sensors_found){
spin7ion 6:70d0218c2a28 435 if(ds1820[sensorsOrder[i]]->isPresent()){
spin7ion 6:70d0218c2a28 436 stickTemperatures[i]=ds1820[i]->read();
spin7ion 6:70d0218c2a28 437 } else {
spin7ion 6:70d0218c2a28 438 stickTemperatures[i]=-273.f; // Sensor is offline
spin7ion 6:70d0218c2a28 439 }
spin7ion 6:70d0218c2a28 440 }
spin7ion 6:70d0218c2a28 441 }
spin7ion 6:70d0218c2a28 442
spin7ion 6:70d0218c2a28 443 IRtemp=thermometer.read_temp(1);
spin7ion 6:70d0218c2a28 444
spin7ion 6:70d0218c2a28 445
spin7ion 6:70d0218c2a28 446 //Form JSON as {"tempIR":1,"temps":[1,...,10],"latitude":37,"longitude":51,"altitude":21,"validGeo":true}
spin7ion 10:51960145754a 447 snprintf(bufferString,2048,"{\"tempIR\":%f,\"latitude\":%f,\"longitude\":%f,\"altitude\":%f,\"validGeo\":%s,temps:[", IRtemp, latitude/10.f, longitude/10.f, altitude, fix ? "true" : "false");
spin7ion 6:70d0218c2a28 448
spin7ion 6:70d0218c2a28 449 index = strlen(bufferString);
spin7ion 6:70d0218c2a28 450
spin7ion 6:70d0218c2a28 451 for(i=0;i<SENSORS_COUNT;i++){
spin7ion 9:e8a07983289f 452 index += snprintf(&bufferString[index], 2048-index, i==0?"%f":",%f", stickTemperatures[i]);
spin7ion 6:70d0218c2a28 453 }
spin7ion 9:e8a07983289f 454 strcat (bufferString,"]}");
spin7ion 6:70d0218c2a28 455
spin7ion 10:51960145754a 456 wd.Service();
spin7ion 6:70d0218c2a28 457 state=STATE_SENDING_TELEMETRY;
spin7ion 6:70d0218c2a28 458 } else if(state==STATE_SENDING_TELEMETRY){
spin7ion 6:70d0218c2a28 459 #if DEBUG_PC
spin7ion 10:51960145754a 460 pc.printf("STATE=SENDING TELEMETRY\r\n");
spin7ion 6:70d0218c2a28 461 pc.printf(bufferString);
spin7ion 6:70d0218c2a28 462 #endif
spin7ion 10:51960145754a 463 fixTries=0;
spin7ion 10:51960145754a 464 while(fixTries<FIX_MAX_TRIES && !sendTelemetry()){
spin7ion 10:51960145754a 465 disconnectNetwork();
spin7ion 10:51960145754a 466 initSIM();
spin7ion 10:51960145754a 467 fixTries++;
spin7ion 10:51960145754a 468 wd.Service();
spin7ion 10:51960145754a 469 wait(SLEEP_CHECK_TIME);
spin7ion 10:51960145754a 470 wd.Service();
spin7ion 10:51960145754a 471 }
spin7ion 10:51960145754a 472 fixTries=0;
spin7ion 10:51960145754a 473 wd.Service();
spin7ion 6:70d0218c2a28 474 state=STATE_SLEEPING;
spin7ion 6:70d0218c2a28 475 } else if(state==STATE_SLEEPING){
spin7ion 10:51960145754a 476 #if DEBUG_PC
spin7ion 10:51960145754a 477 pc.printf("STATE=SLEEPING already for %d\r\n",sleepTimer);
spin7ion 10:51960145754a 478 #endif
spin7ion 6:70d0218c2a28 479 wd.Service();
spin7ion 6:70d0218c2a28 480 sleepTimer+=SLEEP_CHECK_TIME;
spin7ion 6:70d0218c2a28 481
spin7ion 6:70d0218c2a28 482 if(sleepTimer>SLEEP_TIME_S){
spin7ion 6:70d0218c2a28 483 state=STATE_STARTING_GPS;
spin7ion 6:70d0218c2a28 484 sleepTimer=0;
spin7ion 6:70d0218c2a28 485 } else {
spin7ion 6:70d0218c2a28 486 wait(SLEEP_CHECK_TIME);
spin7ion 6:70d0218c2a28 487 }
spin7ion 10:51960145754a 488 wd.Service();
spin7ion 10:51960145754a 489 #if DEBUG_PC
spin7ion 10:51960145754a 490 pc.printf("After sleep\r\n");
spin7ion 10:51960145754a 491 #endif
spin7ion 6:70d0218c2a28 492 }
spin7ion 6:70d0218c2a28 493
spin7ion 6:70d0218c2a28 494 //Feed the watchdog
spin7ion 6:70d0218c2a28 495 wd.Service();
spin7ion 6:70d0218c2a28 496 wait(0.5);
spin7ion 6:70d0218c2a28 497 }
spin7ion 6:70d0218c2a28 498 }
spin7ion 6:70d0218c2a28 499