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

Dependencies:   mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820

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();