пропажа слешей
Dependencies: mbed mbed-STM32F103C8T6 MLX90614 Watchdog DS1820
main.cpp
- Committer:
- astartes
- Date:
- 2021-01-18
- Revision:
- 19:1d4d31c23953
- Parent:
- 18:11e82e17446d
File content as of revision 19:1d4d31c23953:
#include "stm32f103c8t6.h" #include "mbed.h" #include "DS1820.h" #include "MLX90614.h" #include "config.h" #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','-','2','0','2','1','\0'}; //Termometers OneWire oneWire(PIN_ONEWIRE); const int SENSORS_COUNT = 10; DS1820* ds1820[SENSORS_COUNT]; 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 = 0; float L_l = 0; float Alt = 0; 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; float a = 66; void parseTime (float timeval) { //format utc time to beijing time,add 8 time zone float time = timeval + 80000.00f; h_time = int(time) / 10000; m_time = (int(time) % 10000) / 100; s_time = int(time) % 100; } bool checkIfOk() { if(_parser->recv("OK")) { #if DEBUG_PC pc.printf("Done\r\n"); #endif return true; } else { #if DEBUG_PC pc.printf("Fail\r\n"); #endif return false; } } void blink_fast() { for(int b = 0;b < 3;b++) { myled = 1; wait(0.2); myled = 0; wait(0.2); myled = 1; } } void blink_slow() { for(int b = 0;b < 3;b++) { myled = 1; wait(1); myled = 0; wait(1); myled = 1; wd.Service(); } } bool enableGPS(bool powerUp) { #if DEBUG_PC pc.printf("Powering GPS %s:\r\n",powerUp?"up":"down"); #endif if(powerUp){ _parser->send("AT+CGNSPWR=1"); //GPS power on } else { _parser->send("AT+CGNSPWR=0"); //GPS power off } 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; } _parser->send("AT+CAPNMODE=1"); if (!checkIfOk()) { return false; } _parser->send("AT+CBANDCFG=\"NB-IOT\",8"); if (!checkIfOk()) { return false; } _parser->send("AT+CNDS=2"); if (!checkIfOk()) { return false; } _parser->send("ATE0"); if (!checkIfOk()) { return false; } return true; } bool enableRF(bool powerUp){ #if DEBUG_PC pc.printf("Powering RF %s: \r\n",powerUp?"up":"down"); #endif if(powerUp){ _parser->send("AT+CFUN=1"); } else { _parser->send("AT+CFUN=0"); //GPS power off } //wait(0.1); return checkIfOk(); //return true; } bool enableRF_RESTART() { #if DEBUG_PC pc.printf("Powering RF with restart\r\n"); #endif _parser->send("AT+CFUN=1,1"); } bool setPowerSavingMode() { _parser->send("AT+CPSMS=1");//power save on wait(0.2); return checkIfOk(); } bool setSatSystems(){ #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(); } int initSIM() { fixTries=0; while(fixTries<COMD_EXE_TRIES && !enableRF(1)) { 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) { return 0; } } fixTries=0; while(fixTries<COMD_EXE_TRIES && !setSatSystems()) { wait(2); wd.Service(); fixTries++; if (fixTries >= COMD_EXE_TRIES) { return 0; } } wd.Service(); return true; } bool getGPS() { wd.Service(); char GNSSrunstatus_c[2]; char Fixstatus_c[2]; char UTCdatetime_c[19]; char latitude_c[11]; char logitude_c[12]; char altitude_c[9]; char speedOTG_c[7]; char course_c[7]; char fixmode_c[2]; char reserved_1[1]; char HDOP_c[5]; char PDOP_c[5]; char VDOP_c[5]; char reserved_2[1]; char satellitesinview_c[3]; char GNSSsatellitesused_c[3]; char GLONASSsatellitesused_c[3]; char reserved_3[1]; 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"); wait(0.2); int nmeaStrLen=_parser->read(receivedChars, 120); _parser->flush(); char *curLine = receivedChars; char frame[150]; for (int i = 0; i< 115; i++) { if(curLine[i]==':') { i++; int j = 0; while(i < 125) { if(curLine[i]=='O' && curLine[i+1]=='K') { break; } else { frame[j] = curLine[i]; #if DEBUG_PC pc.printf("cahr %c\n", frame[j]); #endif i++; j++; } } break; } } // Parses the string char * pch = strtok (frame,","); strcpy(GNSSrunstatus_c, pch); pch = strtok(NULL, ","); strcpy(Fixstatus_c, pch); pch = strtok(NULL, ","); strcpy(UTCdatetime_c, pch); pch = strtok(NULL, ","); strcpy(latitude_c, pch); pch = strtok(NULL, ","); strcpy(logitude_c, pch); pch = strtok(NULL, ","); strcpy(altitude_c, pch); pch = strtok(NULL, ","); strcpy(speedOTG_c, pch); pch = strtok(NULL, ","); strcpy(course_c, pch); pch = strtok(NULL, ","); strcpy(fixmode_c, pch); pch = strtok(NULL, ","); strcpy(reserved_1, pch); pch = strtok(NULL, ","); strcpy(HDOP_c, pch); pch = strtok(NULL, ","); strcpy(PDOP_c, pch); pch = strtok(NULL, ","); strcpy(VDOP_c, pch); pch = strtok(NULL, ","); strcpy(reserved_2, pch); pch = strtok(NULL, ","); strcpy(satellitesinview_c, pch); pch = strtok(NULL, ","); strcpy(GNSSsatellitesused_c, pch); pch = strtok(NULL, ","); strcpy(GLONASSsatellitesused_c, pch); pch = strtok(NULL, ","); strcpy(reserved_3, pch); pch = strtok(NULL, ","); strcpy(cn0max_c, pch); pch = strtok(NULL, ","); strcpy(HPA_c, pch); pch = strtok(NULL, ","); strcpy(VPA_c, pch); int GNSS_st = atof(GNSSrunstatus_c); Fix_st = atof(Fixstatus_c); int sat_count = atof(satellitesinview_c); if(Fix_st) { 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 >= 4 ) { return true; } else { step_p++; } } //return true; return false; } int terminateCOAPSession() { //_parser->send("AT+CCOAPTERM"); //wait(2); //wd.Service(); _parser->send("AT+CNACT=0"); } bool sendTelemetry() { int check = 0; wd.Service(); int tr = 0; setAPN(); wd.Service(); check = tr = 0; wait(2); _parser->flush(); _parser->send("AT+CCOAPINIT"); wait(1); _parser->flush(); //_parser->send("AT+CCOAPURL=\"" MTS_TELEMETRY_URL_STRING); _parser->send("AT+CCOAPURL=\"coap://193.227.232.26:5683/multisensors\""); checkIfOk(); //if(!checkIfOk()){ terminateCOAPSession();return false;} 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,"); pc.printf("\r\nAT+CCOAPPARA=\"CODE\",2,payload,1,"); for (size_t i = 0; i < strlen(bufferString); i++) { pc.printf("%x",bufferString[i]); } pc.printf("\r\n"); _parser->printf("AT+CCOAPPARA=\"CODE\",2,payload,1,"); //_parser->send("AT+CCOAPPARA=\"CODE\",2,payload,1,\"7b224944223a20224d49454d4853452d54455354222c2274656d704952223a202d312e3636393938392c226c61746974756465223a202d36392e3337393135382c226c6f6e676974756465223a2037362e3338393339372c22616c746974756465223a20362e342c2276616c696447656f223a20747275652c2262617474657279223a203130302c226e65746c766c223a2033312c2274656d7073223a5b332e37352c312e3837352c332e352c332e333132352c332e343337352c342e32352c322e3632352c302e313837352c342e3132352c302e3837355d7d\""); //_parser->printf(bufferString); for (size_t i = 0; i < strlen(bufferString); i++) { _parser->printf("%x",bufferString[i]); } _parser->printf("\r\n"); checkIfOk(); //if(!checkIfOk()){ terminateCOAPSession();return false;} wait(0.5); _parser->flush(); _parser->send("AT+CCOAPACTION"); //checkIfOk(); if(!checkIfOk()){ return false;} wait(2); wd.Service(); wait(2); wait(2); wd.Service(); wait(2); 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(); //wait(7); //toggle_sim_power(); /* * Generally, the NET indicator will fast flash firstly (1 time per second), which means that the * 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 pc.baud(115200); pc.printf("Starting\r\n"); if (wd.WatchdogCausedReset()) { pc.printf("Watchdog caused reset.\r\n"); } #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(10); wait(2); wd.Service(); wait(2); _parser->flush(); enableRF_RESTART(); wait(2); wd.Service(); wait(2); wait(2); wd.Service(); wait(2); wait(2); fixTries=0; #if DEBUG_PC pc.printf("INIT CONFIG\r\n"); #endif int res = initSIM(); if(!res) { #if DEBUG_PC pc.printf("Init Failed\r\n"); #endif 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 blink_fast(); wd.Service(); 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); if(!ds1820[i]->begin()) { delete ds1820[i]; break; } } sensors_found = i; #if DEBUG_PC pc.printf("Found %d sensors\r\n",sensors_found); if (sensors_found==0) pc.printf("No devices found"); #endif //Feed the watchdog wd.Service(); state=STATE_STARTING_GPS; //state = STATE_COLLECTING_TELEMETRY; 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)) { #if DEBUG_PC pc.printf("GPS enable Fail\r\n"); #endif wait(3); wd.Service(); fixTries++; if (fixTries >= COMD_EXE_TRIES) { wait(WATCHDOG_INTERVAL_S+5); } } for(int test = 0; test < FIX_MAX_TRIES; test ++) { #if DEBUG_PC pc.printf("WAITNG gps to turn on \r\n"); #endif wd.Service(); wait(2); wait(2); wait(1); wd.Service(); _parser->send("AT+CGNSINF"); if(checkIfOk()) { if(cold_start) { off = 0; while(off<COMD_EXE_TRIES && !enableGPS(0)) { wd.Service(); off++; } break; } else { break; } } else { if (test > 2) { cold_start = true; } wd.Service(); wait(2); wait(2); wait(1); wd.Service(); } } state=STATE_WAITING_FIX; fixTries=0; wd.Service(); step_p = 0; //wait(FIX_CHECK_TIME_S); } else if(state==STATE_WAITING_FIX) { #if DEBUG_PC pc.printf("STATE=WAITNG FIX\r\n"); #endif off = 0; if (cold_start) { while(off<COMD_EXE_TRIES && !enableGPS(1)) { wd.Service(); off++; if (off >= COMD_EXE_TRIES) { wait(WATCHDOG_INTERVAL_S+5); } } cold_start = false; } if(getGPS()) { wd.Service(); off = 0; while(off<FIX_MAX_TRIES && !enableGPS(0)) { #if DEBUG_PC pc.printf("GPS disable Fail\r\n"); #endif wait(3); wd.Service(); off++; } state=STATE_COLLECTING_TELEMETRY; } else { wd.Service(); #if DEBUG_PC 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 off = 0; while(off<FIX_MAX_TRIES && !enableGPS(0)) { #if DEBUG_PC pc.printf("GPS disable Fail\r\n"); #endif wait(3); wd.Service(); off++; } 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(2); wait(2); wait(1); wd.Service(); } } } else if(state==STATE_COLLECTING_TELEMETRY) { #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(); } } wait(1); pc.printf("startConversion\r\n"); for(i=0;i<SENSORS_COUNT;i++){ if(sensorsOrder[i]<sensors_found){ if(ds1820[sensorsOrder[i]]->isPresent()){ stickTemperatures[i]=ds1820[i]->read(); } else { stickTemperatures[i]=-273.f; // Sensor is offline } } } pc.printf("startConversion\r\n"); IRtemp=thermometer.read_temp(1); pc.printf("ik done\r\n"); float bat_v = 3.2; for(int try_c = 0; try_c < COMD_EXE_TRIES; try_c ++) { if(getSignalQuality()) { break; } wd.Service(); } if (rssiDB > 100) { rssiDB = 100; } else if (rssiDB < 0) { rssiDB = 0; } if (IRtemp > 100) { IRtemp = 100; } else if (IRtemp < -300) { IRtemp = -300; } if (B_l > 200) { B_l = 200; } else if (B_l < -200) { B_l = -200; } if (L_l > 200) { L_l = 200; } else if (L_l < -200) { L_l = -200; } if (Alt > 9000) { Alt = 9000; } else if (Alt < -200) { Alt = -200; } //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 ? "1" : "0", bat_v, rssiDB); snprintf(bufferString,2048,"{\"ID\":\"%s\",\"tempIR\":%4.2f,\"latitude\":%3.8f,\"longitude\":%3.8f,\"altitude\":%4.2f,\"validGeo\":%d,\"battery\":%4.2f,\"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); pc.printf("index = %d \r\n", index); for(i=0;i<SENSORS_COUNT;i++){ //index += snprintf(&bufferString[index], 2048-index, i==0?"%f":",%f", stickTemperatures[i]); if (stickTemperatures[i] > 100) { stickTemperatures[i] = 100; } else if (stickTemperatures[i] < -280) { stickTemperatures[i] = -280; } index += snprintf(&bufferString[index], 2048-index, i==0?"%4.4f":",%4.4f", stickTemperatures[i]); } strcat (bufferString,"]}"); index = strlen(bufferString); pc.printf("\r\n index = %d", index); for (size_t i = 0; i < strlen(bufferString); i++) { pc.printf("%c",bufferString[i]); } wd.Service(); state=STATE_SENDING_TELEMETRY; } else if(state==STATE_SENDING_TELEMETRY) { #if DEBUG_PC pc.printf("\r\nSTATE=SENDING TELEMETRY\r\n"); pc.printf(bufferString); #endif fixTries=0; if(!sendTelemetry()) { terminateCOAPSession(); wd.Service(); wait(2); wait(2); wait(2); wd.Service(); wait(2); sendTelemetry(); } wait(1); terminateCOAPSession(); //disconnectNetwork(); //initSIM(); //enableGPS(0); //setPowerSavingMode(); //fixTries++; wd.Service(); enableRF(0); off = 0; while(off<COMD_EXE_TRIES && !setPowerSavingMode()) { wd.Service(); off++; } #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); #endif wd.Service(); sleepTimer+=SLEEP_CHECK_TIME; if(sleepTimer>SLEEP_TIME_S){ simPWR = 0; wait(3); simPWR = 1; _parser->flush(); #if DEBUG_PC pc.printf("from sleep\r\n"); #endif wait(2); wd.Service(); wait(2); wd.Service(); wait(2); wd.Service(); _parser->flush(); for(i=0;i<7;i++) { myled = 1; wait(1); myled = 0; wait(1); wd.Service(); myled = 1; } #if DEBUG_PC pc.printf("boot\r\n"); #endif blink_fast(); 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 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; //state = STATE_COLLECTING_TELEMETRY; sleepTimer=0; } else { wait(2); wait(2); wait(1); // = 5 = SLEEP_CHECK_TIME } wd.Service(); #if DEBUG_PC pc.printf("After sleep\r\n"); #endif //from_sleep = true; } //Feed the watchdog wd.Service(); wait(0.5); } }