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

Dependencies:   mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820

Revision:
15:b0d74907b9c1
Parent:
14:b4f8020f0c4a
Child:
16:319eece233ff
--- a/main.cpp	Sun Jan 10 17:02:07 2021 +0000
+++ b/main.cpp	Sat Jan 16 06:54:49 2021 +0000
@@ -6,23 +6,23 @@
 #include "ATCmdParser.h"
 #include "UARTSerial.h"
 #include "Watchdog.h"
-
+ 
 Watchdog wd;
 DigitalOut  myled(PC_13);
 DigitalOut  simPWR(PA_8);  // (active low level) PWRKEY pin to power on or off  module
-
+ 
 //SIM7000
 UARTSerial *_serial;
 ATCmdParser *_parser;
 int rssiDB,rxQual;
-
+ 
 bool from_sleep = false;
-
-
+ 
+ 
 // ID
-
+ 
 char device_id[] = {'M','I','E','M','H','S','E','-','T','E','S','T','\0'};
-
+ 
 //Termometers
 OneWire oneWire(PIN_ONEWIRE);
 const int SENSORS_COUNT = 10;
@@ -30,34 +30,34 @@
 int sensors_found = 0;
 const char sensorsOrder[]={4,2,5,8,0,3,6,1,9,7};
 float stickTemperatures[SENSORS_COUNT];
-
+ 
 int i=0;
-
+ 
 //IR termometer
 I2C i2c(PIN_SDA, PIN_SCL);   //sda,scl
 MLX90614 thermometer(&i2c);
 float IRtemp;
-
+ 
 // GPS
 int Fix_st;
-
+ 
 float B_l;
 float L_l;
 float Alt;
-
+ 
 bool cold_start  = 0;
 int step_p = 0;
 #if DEBUG_PC
 Serial pc(PIN_TX, PIN_RX); // TX, RX
 #endif
-
+ 
 int index;
 char bufferString[2048];
-
+ 
 int h_time, m_time, s_time;
 int fq, nst, fix, date;                                     // fix quality, Number of satellites being tracked, 3D fix
 //float latitude, longitude, timefix, speed, altitude;
-
+ 
 char state=STATE_INIT;
 int sleepTimer=0;
 int fixTries=0;
@@ -73,12 +73,12 @@
             a = a * 33;
         }
     }
-
-
-
+ 
+ 
+ 
 }
-
-
+ 
+ 
 void parseTime (float timeval)
 {
     //format utc time to beijing time,add 8 time zone
@@ -87,8 +87,8 @@
                 m_time = (int(time) % 10000) / 100;
                 s_time = int(time) % 100;
 }
-
-
+ 
+ 
 bool checkIfOk() {
     if(_parser->recv("OK")) {
         #if DEBUG_PC
@@ -126,9 +126,9 @@
     myled = 1;
     }
 }
-
-
-
+ 
+ 
+ 
 bool enableGPS(bool powerUp) {
     #if DEBUG_PC
     pc.printf("Powering GPS %s:\r\n",powerUp?"up":"down");
@@ -141,7 +141,27 @@
     wait(0.5);
     return checkIfOk();
 }
+bool configure()
+{
+    _parser->send("AT+CNMP=38"); 
+    if (!checkIfOk())
+    {
+       return false;
+    }
 
+    _parser->send("AT+CMNB=2");
+    if (!checkIfOk())
+    {
+       return false;
+    }
+    _parser->send("AT+CAPNMODE=1");
+    if (!checkIfOk())
+    {
+       return false;
+    }
+    return true;
+}
+ 
 bool enableRF(bool powerUp){
     #if DEBUG_PC
     pc.printf("Powering RF %s: \r\n",powerUp?"up":"down");
@@ -151,16 +171,18 @@
     } else {
         _parser->send("AT+CFUN=0"); //GPS power off
     }
-    return checkIfOk();    
+    //wait(0.1);
+    return checkIfOk();  
+    //return true;  
 }
-
+ 
 bool setPowerSavingMode() 
 {
     _parser->send("AT+CPSMS=1");//power save on 
     wait(0.2);
     return checkIfOk(); 
 }
-
+ 
 bool setSatSystems(){
     #if DEBUG_PC
     pc.printf("Setting sats:");
@@ -168,7 +190,7 @@
     _parser->send("AT+CGNSMOD=1,1,1,1");
     return checkIfOk();    
 }
-
+ 
 bool getSignalQuality() 
 {
     _parser->send("AT+CSQ");
@@ -178,17 +200,17 @@
     }
     return false;
 }
-
+ 
 bool setAPN() {
     _parser->send("AT+CNACT=1,\"iot\"");
     return checkIfOk();
 }
-
+ 
 bool disconnectNetwork() {
      _parser->send("AT+CNACT=0");
     return checkIfOk();
 }
-
+ 
 int initSIM()
 {
     fixTries=0;
@@ -197,6 +219,18 @@
         
         wait(2);
         wd.Service();
+        
+        fixTries++;
+        if (fixTries >= COMD_EXE_TRIES)
+        {
+            return 0;
+        }
+    }
+  fixTries=0;
+    while(fixTries<COMD_EXE_TRIES && !configure())
+    {
+        wait(1);
+        wd.Service();
         fixTries++;
         if (fixTries >= COMD_EXE_TRIES)
         {
@@ -219,10 +253,10 @@
     wd.Service();    
     
  
-
+ 
     return true;
 }
-
+ 
 bool getGPS() {
     wd.Service();
     char GNSSrunstatus_c[2];
@@ -246,19 +280,19 @@
     char cn0max_c[3];
     char HPA_c[7];
     char VPA_c[7];
-
+ 
     const int numChars = 120; // spec says up to 94 characters
     char receivedChars[ numChars ];
     receivedChars[0] = 0;
-
-
-
+ 
+ 
+ 
     _parser->send("AT+CGNSINF");
-
+ 
     int nmeaStrLen=_parser->read(receivedChars, 120);
     _parser->flush();
     char *curLine = receivedChars;
-
+ 
     char frame[150];
     for (int i = 0; i< 115; i++)
     {
@@ -330,21 +364,21 @@
     strcpy(VPA_c, pch);
     
     
-
+ 
     int GNSS_st = atof(GNSSrunstatus_c); 
     Fix_st      = atof(Fixstatus_c); 
     int sat_count = atof(satellitesinview_c); 
-
+ 
     B_l = atof(latitude_c);
     L_l = atof(logitude_c);
     Alt = atof(altitude_c);
-
+ 
     #if DEBUG_PC
     pc.printf("GNSS st %d, FIX %d,SAT  Count %d, Latitude: %f , Longitude: %f, Altitude: %f \n",GNSS_st, Fix_st, sat_count, B_l, L_l, Alt);
     #endif
-
+ 
     wd.Service();
-
+ 
     if(Fix_st != 0)
     {
         if (step_p > 5 )
@@ -358,9 +392,9 @@
     }
     return false;
 }
-
+ 
 int terminateCOAPSession() {
-
+ 
     for(int try_c = 0; try_c < 5; try_c++)
     {
     _parser->flush(); 
@@ -381,70 +415,50 @@
         }
     }
     }
-
+ 
 }
-
-
-
+ 
+ 
+ 
 bool sendTelemetry() 
 {
     int check = 0;
     wd.Service();
     int tr = 0;
-
+ 
     setAPN();
     
     wd.Service();
     check = tr = 0;
     wait(2);
-
+ 
     _parser->flush();   
-    _parser->send("AT+CIICR");
-    wd.Service();
-    wait(2);
-    _parser->send("AT+CIFSR");
-    wait(2);
-    
-    _parser->send("AT+CIPSTART=\"UDP\",\"193.227.232.26\",\"1882\"");
-    //_parser->send("AT+CCOAPINIT");
+    _parser->send("AT+CCOAPINIT");
   
-
-    wait(2);
+ 
+    wait(1);
      _parser->flush(); 
-     wd.Service();
-     
     //_parser->send("AT+CCOAPURL=\"" MTS_TELEMETRY_URL_STRING);
-    
-    //_parser->send("AT+CCOAPURL=\"coap://193.227.232.26:5683/api/v1/MIEMHSE-TEST\"");
-    //checkIfOk();
+    _parser->send("AT+CCOAPURL=\"coap://193.227.232.26:5683/multisensors\"");
+    checkIfOk();
     //if(!checkIfOk()){ terminateCOAPSession();return false;}
-   
-    //wait(1);
-    
-     //_parser->flush(); 
+    wait(1);
+     _parser->flush(); 
     //_parser->printf("AT+CCOAPPARA=code,2,token,0,\"%s\",payload,1,",xstr(MTS_COAP_TOKEN));
-    
-    //_parser->printf("AT+CCOAPPARA=code,2,payload,1,");
+    _parser->printf("AT+CCOAPPARA=code,2,payload,1,");
+     
+    for (size_t i = 0; i < strlen(bufferString); i++) {
+    _parser->printf("%x",bufferString[i]);
+    }
     
-    _parser->printf("AT+CIPSEND"); 
-   // /*DATA*/ 0x1A
-     wait(2);
-         wd.Service();
-    _parser->printf("%s",bufferString);
-    
-    _parser->printf("%c",0x1A);
-    
-  
-    
-    //_parser->printf("\r\n");
-    //checkIfOk();
+    _parser->printf("\r\n");
+    checkIfOk();
     //if(!checkIfOk()){ terminateCOAPSession();return false;}
     wait(0.5);
      _parser->flush(); 
-    //_parser->send("AT+CCOAPACTION");
-   
+    _parser->send("AT+CCOAPACTION");
     //checkIfOk();
-    //if(!checkIfOk()){ return false;}
+    if(!checkIfOk()){ return false;}
     wait(2);
     wd.Service();
     wait(2);
@@ -452,22 +466,22 @@
     wait(2);
     wd.Service();
     wait(2);
-    _parser->send("AT+CIPCLOSE");
-    //terminateCOAPSession();
+ 
+    terminateCOAPSession();
     
     return true;
 }
 int main() {
     confSysClock();     //Configure system clock (72MHz HSE clock, 48MHz USB clock)  
-
+ 
     #if ENABLE_WATCHDOG
     wd.Configure(WATCHDOG_INTERVAL_S);       // sets the timeout interval
     #endif
-
+ 
     simPWR = 0; 
     wait(2);
     simPWR = 1;
-
+ 
     //blink_slow();
     wd.Service();
     for(i=0;i<7;i++)
@@ -479,7 +493,7 @@
     wd.Service();
     //myled = 1;
     }
-
+ 
     //wait(7);
     //toggle_sim_power();
     /*
@@ -487,7 +501,7 @@
     * module has not logged in the Network. After logging in, the indicator become to flash slowly (1
     * time every three seconds). 
     */
-
+ 
     //wait(WATCHDOG_INTERVAL_S-15);//Let SIM7000 wake up
     wd.Service();
     #if DEBUG_PC
@@ -497,11 +511,11 @@
         pc.printf("Watchdog caused reset.\r\n");
     }
     #endif
-
+ 
     
-
+ 
     
-
+ 
     
     //Initiate SIM7000 SERIAL
     _serial = new UARTSerial(PIN_SIM_TX, PIN_SIM_RX, 115200);
@@ -510,41 +524,57 @@
     _parser->set_delimiter( "\r\n" );
     _parser->set_timeout(PARSER_TIMEOUT_S);
     wait(2);
-
+ 
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
     wd.Service();
     wait(2);
     wd.Service();
     wait(2);
-
+    wd.Service();
+    wait(2);
+ 
     fixTries=0;
-
+ 
     #if DEBUG_PC
     pc.printf("INIT START\r\n");
     #endif
-
+ 
     
-
-
+ 
+ 
     int res = initSIM();
     if(!res)
     {
         #if DEBUG_PC
         pc.printf("Init Failed\r\n");
         #endif
-
-        wait(2);
-        wait(2);
-        wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
         if(!initSIM());
         {
             wait(WATCHDOG_INTERVAL_S+10); // reset by dog 
         }
     }
-
+ 
     #if DEBUG_PC
     pc.printf("INIT finished\r\n");
     #endif
-
+ 
     for(i=0;i<7;i++)
     {
     myled = 1;
@@ -555,7 +585,7 @@
     myled = 1;
     }
     
-
+ 
     wd.Service();
     
     /*_parser->send("AT+CPSI?");
@@ -591,22 +621,22 @@
     
     //Feed the watchdog
     wd.Service();
-
+ 
     state=STATE_STARTING_GPS;
     
     int off = 0;
-
+ 
     while(1) {
         wd.Service();
         if (state==STATE_STARTING_GPS)
         {
             wd.Service();
             
-
+ 
             #if DEBUG_PC
             pc.printf("STATE=STARTING GPS\r\n");
             #endif
-
+ 
             fixTries=0;
             while(fixTries<COMD_EXE_TRIES && !enableGPS(1))
             {
@@ -621,7 +651,7 @@
                     wait(WATCHDOG_INTERVAL_S+5);
                 }
             }
-
+ 
             
             for(int test = 0; test < FIX_MAX_TRIES; test ++)
             {
@@ -665,10 +695,10 @@
                 }
                 
                 
-
+ 
             }
-
-
+ 
+ 
         
             state=STATE_WAITING_FIX;
             fixTries=0;
@@ -682,7 +712,7 @@
             #if DEBUG_PC
             pc.printf("STATE=WAITNG FIX\r\n");
             #endif
-
+ 
             off = 0;
             if (cold_start)
             {
@@ -728,7 +758,7 @@
                     #if DEBUG_PC
                     pc.printf("No fix but continue\r\n");
                     #endif
-
+ 
                     off = 0;
                     while(off<FIX_MAX_TRIES && !enableGPS(0))
                     {
@@ -763,7 +793,7 @@
                     ds1820[sensorsOrder[i]]->startConversion();
                 }    
             }
-            wait(1.0);
+            wait(1);
             for(i=0;i<SENSORS_COUNT;i++){
                 if(sensorsOrder[i]<sensors_found){
                     if(ds1820[sensorsOrder[i]]->isPresent()){
@@ -778,7 +808,7 @@
             
             float bat_v = 100;
             //Form JSON as {"tempIR":1,"temps":[1,...,10],"latitude":37,"longitude":51,"altitude":21,"validGeo":true}
-             snprintf(bufferString,2048,"{\"ID\":%s,\"tempIR\":%f,\"latitude\":%f,\"longitude\":%f,\"altitude\":%f,\"validGeo\":%s,\"battery\":%f,\"netlvl\":%d,temps:[",device_id, IRtemp, B_l, L_l, Alt, Fix_st ? "true" : "false", bat_v, rssiDB);
+             snprintf(bufferString,2048,"{\"ID\":\"%s\",\"tempIR\":%f,\"latitude\":%f,\"longitude\":%f,\"altitude\":%f,\"validGeo\":%s,\"battery\":%f,\"netlvl\":%d,\"temps\":[",device_id, IRtemp, B_l, L_l, Alt, Fix_st ? "1" : "0", bat_v, rssiDB);
    //  snprintf(bufferString,2048,"{\"ID\":\"%s\",\"tempIR\":%f,\"latitude\":%f,\"longitude\":%f,\"altitude\":%f,\"validGeo\":%s,\"battery\":%f,\"netlvl\":%d,\"temps\":[",device_id, IRtemp, B_l, L_l, Alt, Fix_st ? ( 1: 0) , bat_v
            // device_id
             index = strlen(bufferString);
@@ -812,9 +842,9 @@
             
             while(fixTries<FIX_MAX_TRIES && !sendTelemetry())
             {
-                wait(1);
+                wait(2);
                 terminateCOAPSession();
-                wait(3);
+                wait(2);
                 wd.Service();
                 fixTries++;
             }
@@ -825,6 +855,8 @@
             //setPowerSavingMode();
             //fixTries++;
             wd.Service();
+            enableRF(0);
+
             off = 0;
             while(off<COMD_EXE_TRIES && !setPowerSavingMode())
             {
@@ -833,22 +865,22 @@
             }
              #if DEBUG_PC
             pc.printf("Sim 7000 Off\r\n");
-
+ 
             #endif
-
+ 
             simPWR = 0; 
             wait(2);
             simPWR = 1;
             _parser->flush();
             
-
+ 
             //wait(SLEEP_CHECK_TIME);
             wd.Service();
             
-
+ 
             state=STATE_SLEEPING;
             sleepTimer=0;
-
+ 
         } else if(state==STATE_SLEEPING){
             #if DEBUG_PC
             pc.printf("STATE=SLEEPING already for %d\r\n",sleepTimer);
@@ -864,14 +896,16 @@
                 #if DEBUG_PC
                 pc.printf("from sleep\r\n");
                 #endif
-                wait(3);
+                wait(2);
                 wd.Service();
-                wait(3);
+                wait(2);
+                wd.Service();
+                wait(2);
                 wd.Service();
             
                 _parser->flush();
                    
-
+ 
                 for(i=0;i<7;i++)
                 {
                     myled = 1;
@@ -893,33 +927,46 @@
                     wd.Service();
                     myled = 1;
                 }
-                wait(2);
-                  wd.Service();
-                  wait(2);
-                 wd.Service();
-                 wait(2);
-                    wd.Service();
-
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+                
                 int res = initSIM();
                 if(!res)
                 {
                     #if DEBUG_PC
                     pc.printf("Init Failed\r\n");
                     #endif
-                    wait(2);  
-                    wait(2);
-                    wd.Service();  
-                    wait(2);
-                    wd.Service();  
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2);
+    wd.Service();
+    wait(2); 
                     if(!initSIM());
                     {
                         wait(WATCHDOG_INTERVAL_S+10); // reset by dog 
                     }
                     
-
+ 
                    
                 }
-
+ 
                 state=STATE_STARTING_GPS;
                 sleepTimer=0;
             } else {
@@ -935,10 +982,9 @@
             
             //from_sleep = true;
         }
-
+ 
         //Feed the watchdog
         wd.Service();
         wait(0.5);
     }
-}
-
+}
\ No newline at end of file