пропажа слешей
Dependencies: mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820
Diff: main.cpp
- Revision:
- 10:51960145754a
- Parent:
- 9:e8a07983289f
- Child:
- 11:57fa27cb533e
--- a/main.cpp Tue Sep 29 19:48:56 2020 +0000 +++ b/main.cpp Wed Sep 30 16:40:29 2020 +0000 @@ -14,6 +14,8 @@ //SIM7000 UARTSerial *_serial; ATCmdParser *_parser; +int rssiDB,rxQual; + //Termometers OneWire oneWire(PIN_ONEWIRE); @@ -159,24 +161,78 @@ } bool enableGPS(bool powerUp) { + #if DEBUG_PC pc.printf("Powering GPS %s:",powerUp?"up":"down"); + #endif if(powerUp){ _parser->send("AT+CGNSPWR=1"); //GPS power on } else { _parser->send("AT+CGNSPWR=0"); //GPS power off } + return checkIfOk(); +} + +bool enableRF(bool powerUp){ + #if DEBUG_PC + pc.printf("Powering RF %s:",powerUp?"up":"down"); + #endif + if(powerUp){ + _parser->send("AT+CFUN=1,1"); + } else { + _parser->send("AT+CFUN=0"); //GPS power off + } + return checkIfOk(); } +bool setPowerSavingMode() { + _parser->send("AT+CPSMS=1");//power save + return checkIfOk(); +} + bool setSatSystems(){ -pc.printf("Setting sats:"); + #if DEBUG_PC + pc.printf("Setting sats:"); + #endif _parser->send("AT+CGNSMOD=1,1,1,1"); return checkIfOk(); } +bool getSignalQuality() { + _parser->send("AT+CSQ"); + + if(_parser->recv("+CSQ: %d,%d", &rssiDB,&rxQual) && _parser->recv("OK")) { + return true; + } + return false; +} + +bool setAPN() { + _parser->send("AT+CNACT=1,\"iot\""); + return checkIfOk(); +} + +bool disconnectNetwork() { + _parser->send("AT+CNACT=0"); + return checkIfOk(); +} + +void initSIM(){ + enableRF(1); + enableGPS(0); + setSatSystems(); + wd.Service(); + setPowerSavingMode(); + setAPN(); + wd.Service(); +} + bool getGPS() { + wd.Service(); _parser->send("AT+CGNSTST=1,1"); + //wait(PARSER_TIMEOUT_S); + if(_parser->recv("OK")) { int nmeaStrLen=_parser->read(bufferString, 2048); @@ -195,14 +251,60 @@ curLine = nextLine ? (nextLine+1) : NULL; } return fix>0; - } + } else{ + int nmeaStrLen=_parser->read(bufferString, 2048); + pc.printf("curLine=[%s]\n", bufferString); + } return false; } +void terminateCOAPSession() { + _parser->send("AT+CCOAPTERM"); + checkIfOk(); + wait(0.5); + _parser->send("AT+CNACT=0"); + checkIfOk(); +} + +bool sendTelemetry() { + wd.Service(); + setAPN(); + wait(1); + _parser->send("AT+CCOAPINIT"); + if(!checkIfOk()){ + terminateCOAPSession(); + return false; + } + wait(1); + _parser->send("AT+CCOAPURL=\"" MTS_TELEMETRY_URL_STRING); + if(!checkIfOk()){ terminateCOAPSession();return false;} + wait(1); + _parser->printf("AT+CCOAPPARA=code,2,token,0,\"%s\",payload,1,",xstr(MTS_COAP_TOKEN)); + + for (size_t i = 0; i < strlen(bufferString); i++) { + _parser->printf("%x",bufferString[i]); + } + + _parser->printf("\r\n"); + if(!checkIfOk()){ terminateCOAPSession();return false;} + wait(0.5); + _parser->send("AT+CCOAPACTION"); + if(!checkIfOk()){ terminateCOAPSession();return false;} + wait(0.5); + terminateCOAPSession(); + + return true; +} + int main() { confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock) - + for(i=0;i<10;i++){ + myled = 0; + wait(0.5); myled = 1; + wait(0.5); + myled = 0;} + //wait(WATCHDOG_INTERVAL_S-15);//Let SIM7000 wake up #if DEBUG_PC pc.baud(115200); @@ -212,19 +314,46 @@ } #endif + #if ENABLE_WATCHDOG wd.Configure(WATCHDOG_INTERVAL_S); // sets the timeout interval + #endif //Initiate SIM7000 SERIAL _serial = new UARTSerial(PIN_SIM_TX, PIN_SIM_RX, 115200); _parser = new ATCmdParser(_serial); _parser->debug_on( DEBUG_SIM ); _parser->set_delimiter( "\r\n" ); - _parser->set_timeout (WATCHDOG_INTERVAL_S/2); + _parser->set_timeout (PARSER_TIMEOUT_S); wait(0.5); - enableGPS(0); - setSatSystems(); + initSIM(); + + #if DEBUG_SIM + _parser->send("AT+CMEE=2"); //report debug info + checkIfOk(); + #endif + _parser->send("AT+CPIN?"); + if(_parser->recv("+CPIN:READY")) { + #if DEBUG_PC + pc.printf("SIM ready\r\n"); + #endif + } + /*_parser->send("AT+CPSI?"); + checkIfOk(); + _parser->send("AT+CGNAPN"); + checkIfOk(); + _parser->send("AT+CAPNMODE=1"); + checkIfOk(); + _parser->send("AT+CREG?"); + checkIfOk(); + */ + getSignalQuality(); + #if DEBUG_PC + pc.printf("Signal quality: %d\r\n",rssiDB); + #endif + + wd.Service(); //Initiate termal stick for(i = 0; i < SENSORS_COUNT; i++) { ds1820[i] = new DS1820(&oneWire); @@ -246,37 +375,55 @@ state=STATE_STARTING_GPS; while(1) { + wd.Service(); if (state==STATE_STARTING_GPS){ #if DEBUG_PC - pc.printf("STATE=STARTING GPS\n"); + pc.printf("STATE=STARTING GPS\r\n"); #endif + setSatSystems(); enableGPS(1); state=STATE_WAITING_FIX; fixTries=0; wd.Service(); wait(FIX_CHECK_TIME_S); } else if(state==STATE_WAITING_FIX) { - pc.printf("STATE=WAITNG FIX\n"); + + #if DEBUG_PC + pc.printf("STATE=WAITNG FIX\r\n"); + #endif + wd.Service(); if(getGPS()){ + wd.Service(); enableGPS(0); + fixTries=0; state=STATE_COLLECTING_TELEMETRY; } else { + wd.Service(); #if DEBUG_PC - pc.printf("No fix at %d try\n", fixTries); + pc.printf("No fix(%d) at %d/%d try\r\n", fix, fixTries, FIX_MAX_TRIES); #endif fixTries++; if (fixTries>FIX_MAX_TRIES) { //fix not achieved in given tries, send as is + #if DEBUG_PC + pc.printf("No fix but continue\r\n"); + #endif enableGPS(0); wd.Service(); state=STATE_COLLECTING_TELEMETRY; + fixTries=0; } else { + #if DEBUG_PC + pc.printf("Waiting %d sec\r\n",FIX_CHECK_TIME_S); + #endif wd.Service(); wait(FIX_CHECK_TIME_S); } } } else if(state==STATE_COLLECTING_TELEMETRY) { - pc.printf("STATE=COLLECTING TELEMETRY\n"); + #if DEBUG_PC + pc.printf("STATE=COLLECTING TELEMETRY\r\n"); + #endif for(i=0;i<SENSORS_COUNT;i++){ if(sensorsOrder[i]<sensors_found){ ds1820[sensorsOrder[i]]->startConversion(); @@ -297,9 +444,7 @@ //Form JSON as {"tempIR":1,"temps":[1,...,10],"latitude":37,"longitude":51,"altitude":21,"validGeo":true} - - - snprintf(bufferString,2048,"{\"tempIR\":%f,\"latitude\":%f,\"longitude\":%f,\"altitude\":%f,\"validGeo\":%s,temps:[", IRtemp, latitude, longitude, altitude, fix ? "true" : "false"); + 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"); index = strlen(bufferString); @@ -308,15 +453,29 @@ } strcat (bufferString,"]}"); - + wd.Service(); state=STATE_SENDING_TELEMETRY; } else if(state==STATE_SENDING_TELEMETRY){ #if DEBUG_PC + pc.printf("STATE=SENDING TELEMETRY\r\n"); pc.printf(bufferString); #endif - + fixTries=0; + while(fixTries<FIX_MAX_TRIES && !sendTelemetry()){ + disconnectNetwork(); + initSIM(); + fixTries++; + wd.Service(); + wait(SLEEP_CHECK_TIME); + wd.Service(); + } + fixTries=0; + wd.Service(); state=STATE_SLEEPING; } else if(state==STATE_SLEEPING){ + #if DEBUG_PC + pc.printf("STATE=SLEEPING already for %d\r\n",sleepTimer); + #endif wd.Service(); sleepTimer+=SLEEP_CHECK_TIME; @@ -326,19 +485,11 @@ } else { wait(SLEEP_CHECK_TIME); } - + wd.Service(); + #if DEBUG_PC + pc.printf("After sleep\r\n"); + #endif } - - - - wd.Service(); - - /*#if DEBUG_PC - for(i=0;i<SENSORS_COUNT;i++){ - pc.printf("temp[%d] = %3.1f C\r\n", i, stickTemperatures[i]); // read temperature - } - pc.printf("Temperature : %4.2f C2\r\n",IRtemp); - #endif*/ //Feed the watchdog wd.Service();