пропажа слешей
Dependencies: mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820
Diff: main.cpp
- 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