diff --git a/tasmota/xsns_58_GPS.ino b/tasmota/xsns_58_GPS.ino index 1871ff85f..5f0c2d46b 100644 --- a/tasmota/xsns_58_GPS.ino +++ b/tasmota/xsns_58_GPS.ino @@ -20,7 +20,7 @@ Version Date Action Description -------------------------------------------------------------------------------------------- - 0.9.1.0 20191216 integrate - Added pin specifications from Tasmota WEB UI + 0.9.1.0 20191216 integrate - Added pin specifications from Tasmota WEB UI. Minor tweaks. --- 0.9.0.0 20190817 started - further development by Christian Baars - https://github.com/Staars/Sonoff-Tasmota forked - from arendst/tasmota - https://github.com/arendst/Sonoff-Tasmota @@ -299,17 +299,6 @@ void UBXinitCFG(void){ UBXSerial->write( pgm_read_byte(UBLOX_INIT+i) ); } DEBUG_SENSOR_LOG(PSTR("UBX: turn off NMEA")); - -/* - AddLog_P2(LOG_LEVEL_DEBUG, PSTR(D_LOG_KNX D_ADD " GA #%d: %s " D_TO " %d/%d/%d"), - Settings.knx_GA_registered, - device_param_ga[GAop-1], - GA_FNUM, GA_AREA, GA_FDEF ); -*/ - - - - } void UBXTriggerTele(void){ @@ -435,11 +424,10 @@ uint32_t UBXprocessGPS() { } } // DEBUG_SENSOR_LOG(PSTR("UBX: got none or unknown Message")); - if(data_bytes!=0){ + if(data_bytes!=0) { UBX.state.non_empty_loops++; DEBUG_SENSOR_LOG(PSTR("UBX: got %u bytes, non-empty-loop: %u"), data_bytes, UBX.state.non_empty_loops); - } - else{ + } else { UBX.state.non_empty_loops = 0; // now a hidden GPS-device reset is unlikely } return MT_NONE; @@ -449,7 +437,7 @@ uint32_t UBXprocessGPS() { | * callback functions for the download \*********************************************************************************************/ #ifdef USE_FLOG -void UBXsendHeader(void){ +void UBXsendHeader(void) { WebServer->setContentLength(CONTENT_LENGTH_UNKNOWN); WebServer->sendHeader(F("Content-Disposition"), F("attachment; filename=TASMOTA.gpx")); WSSend(200, CT_STREAM, F( @@ -461,17 +449,17 @@ void UBXsendHeader(void){ } void UBXsendRecord(uint8_t *buf){ - char record[100]; - char stime[32]; - UBX_t::entry_t *entry = (UBX_t::entry_t*)buf; - snprintf_P(stime, sizeof(stime), GetDT(entry->time).c_str()); - char lat[12]; - char lon[12]; - dtostrfd((double)entry->lat/10000000.0f,7,lat); - dtostrfd((double)entry->lon/10000000.0f,7,lon); - snprintf_P(record, sizeof(record),PSTR("\n\t\n\n"),lat ,lon, stime); - // DEBUG_SENSOR_LOG(PSTR("FLOG: DL %u %u"), Flog->sector.dword_buffer[k+j],Flog->sector.dword_buffer[k+j+1]); - WebServer->sendContent_P(record); + char record[100]; + char stime[32]; + UBX_t::entry_t *entry = (UBX_t::entry_t*)buf; + snprintf_P(stime, sizeof(stime), GetDT(entry->time).c_str()); + char lat[12]; + char lon[12]; + dtostrfd((double)entry->lat/10000000.0f,7,lat); + dtostrfd((double)entry->lon/10000000.0f,7,lon); + snprintf_P(record, sizeof(record),PSTR("\n\t\n\n"),lat ,lon, stime); + // DEBUG_SENSOR_LOG(PSTR("FLOG: DL %u %u"), Flog->sector.dword_buffer[k+j],Flog->sector.dword_buffer[k+j+1]); + WebServer->sendContent_P(record); } void UBXsendFooter(void){ @@ -482,8 +470,8 @@ void UBXsendFooter(void){ /********************************************************************************************/ void UBXsendFile(void){ - if (!HttpCheckPriviledgedAccess()) { return; } - Flog->startDownload(sizeof(UBX.rec_buffer),UBXsendHeader,UBXsendRecord,UBXsendFooter); + if (!HttpCheckPriviledgedAccess()) { return; } + Flog->startDownload(sizeof(UBX.rec_buffer),UBXsendHeader,UBXsendRecord,UBXsendFooter); } #endif //USE_FLOG /********************************************************************************************/ @@ -512,69 +500,67 @@ void UBXSetRate(uint16_t interval){ void UBXSelectMode(uint16_t mode){ - DEBUG_SENSOR_LOG(PSTR("UBX: set mode to %u"),mode); - switch(mode){ + DEBUG_SENSOR_LOG(PSTR("UBX: set mode to %u"),mode); + switch(mode){ #ifdef USE_FLOG - case 0: - Flog->mode = 0; // write once to all available sectors, then stop - break; + case 0: + Flog->mode = 0; // write once to all available sectors, then stop + break; case 1: - Flog->mode = 1; // write to all available sectors, then restart and overwrite the older ones - break; + Flog->mode = 1; // write to all available sectors, then restart and overwrite the older ones + break; case 2: - UBX.mode.filter_noise = true; // filter out horizontal drift noise, TODO: find useful values - break; + UBX.mode.filter_noise = true; // filter out horizontal drift noise, TODO: find useful values + break; case 3: - UBX.mode.filter_noise = false; - break; + UBX.mode.filter_noise = false; + break; case 4: - Flog->startRecording(true); - AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: start recording - appending")); - break; + Flog->startRecording(true); + AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: start recording - appending")); + break; case 5: - Flog->startRecording(false); - AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: start recording - new log")); - break; + Flog->startRecording(false); + AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: start recording - new log")); + break; case 6: - if(Flog->recording == true){ - Flog->stopRecording(); - } - AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: stop recording")); - break; + if(Flog->recording == true){ + Flog->stopRecording(); + } + AddLog_P(LOG_LEVEL_INFO, PSTR("UBX: stop recording")); + break; +#endif //USE_FLOG case 7: - UBX.mode.send_when_new = 1; // send mqtt on new postion + TELE -> consider to set TELE to a very high value - break; + UBX.mode.send_when_new = 1; // send mqtt on new postion + TELE -> consider to set TELE to a very high value + break; case 8: - UBX.mode.send_when_new = 0; // only TELE - break; + UBX.mode.send_when_new = 0; // only TELE + break; case 9: - if (timeServer.beginListening()){ - UBX.mode.runningNTP = true; - } - break; + if (timeServer.beginListening()){ + UBX.mode.runningNTP = true; + } + break; case 10: - UBX.mode.runningNTP = false; - break; + UBX.mode.runningNTP = false; + break; case 11: - UBX.mode.forceUTCupdate = true; - break; + UBX.mode.forceUTCupdate = true; + break; case 12: - UBX.mode.forceUTCupdate = false; - break; + UBX.mode.forceUTCupdate = false; + break; case 13: - Settings.latitude = UBX.state.last_lat; - Settings.longitude = UBX.state.last_lon; - break; - - -#endif //USE_FLOG + Settings.latitude = UBX.state.last_lat; + Settings.longitude = UBX.state.last_lon; + break; default: if(mode>1000 && mode <1066) { // UBXSetRate(mode-1000); // min. 1001 = 0.001 Hz, but will be converted to 1/65535 anyway ~0.015 Hz, max. 2000 = 1.000 Hz UBXSetRate(mode-1000); // set interval between measurements in seconds from 1 to 65 } - break; - } + break; + } UBX.mode.send_UI_only = true; UBXTriggerTele(); } @@ -601,8 +587,7 @@ bool UBXHandlePOSLLH(){ UBXTriggerTele(); } return true; // new position - } - else { + } else { DEBUG_SENSOR_LOG(PSTR("UBX: no valid position data")); } return false; // no GPS-fix @@ -611,12 +596,13 @@ bool UBXHandlePOSLLH(){ void UBXHandleSTATUS(){ DEBUG_SENSOR_LOG(PSTR("UBX: gpsFix: %u, valid: %u"),UBX.Message.navStatus.gpsFix, (UBX.Message.navStatus.flags)&1); if((UBX.Message.navStatus.flags)&1){ - UBX.state.gpsFix = UBX.Message.navStatus.gpsFix; //only store fixed status if flag is valid + UBX.state.gpsFix = UBX.Message.navStatus.gpsFix; //only store fixed status if flag is valid } else{ - UBX.state.gpsFix = 0; // without valid flag, everything is "no fix" + UBX.state.gpsFix = 0; // without valid flag, everything is "no fix" } } + void UBXHandleTIME(){ DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time: %u-%u-%u %u:%u:%u"),UBX.Message.navTime.year, UBX.Message.navTime.month ,UBX.Message.navTime.day,UBX.Message.navTime.hour,UBX.Message.navTime.min,UBX.Message.navTime.sec); if(UBX.Message.navTime.valid.UTC){ @@ -636,7 +622,8 @@ void UBXHandleTIME(){ } } -void UBXHandleOther(void){ +void UBXHandleOther(void) +{ if(UBX.state.non_empty_loops>6){ // we expect only 4-5 non-empty loops in a row, could change with other sensor speed (Hz) UBXinitCFG(); // this should only happen with lots of NMEA-messages, but it is only a guess!! AddLog_P(LOG_LEVEL_ERROR, PSTR("UBX: possible device-reset, will re-init")); @@ -647,7 +634,8 @@ void UBXHandleOther(void){ /********************************************************************************************/ -void UBXTimeServer(){ +void UBXTimeServer() +{ if(UBX.mode.runningNTP){ timeServer.processOneRequest(Rtc.utc_time, UBX.state.last_iTOW%1000); } @@ -662,17 +650,17 @@ void UBXLoop(void) switch(msgType){ case MT_NAV_POSLLH: - new_position = UBXHandlePOSLLH(); - break; + new_position = UBXHandlePOSLLH(); + break; case MT_NAV_STATUS: - UBXHandleSTATUS(); - break; + UBXHandleSTATUS(); + break; case MT_NAV_TIME: - UBXHandleTIME(); - break; + UBXHandleTIME(); + break; default: - UBXHandleOther(); - break; + UBXHandleOther(); + break; } #ifdef USE_FLOG @@ -752,8 +740,7 @@ void UBXShow(bool json) if(UBX.mode.send_UI_only){ uint32_t i = UBX.state.log_interval / 10; ResponseAppend_P(PSTR("\"fil\":%u,\"int\":%u}"),UBX.mode.filter_noise, i); - } - else{ + } else { ResponseAppend_P(PSTR("\"lat\":%s,\"lon\":%s,\"height\":%s,\"hAcc\":%s,\"vAcc\":%s}"), lat, lon, height, hAcc, vAcc); } #ifdef USE_FLOG @@ -768,7 +755,7 @@ void UBXShow(bool json) #ifdef USE_FLOG WSContentSend_PD(HTTP_SNS_FLOGVER, Flog->num_sectors, Flog->size, Flog->current_sector, Flog->sectors_left, Flog->sector.header.physical_start_sector); if(Flog->recording){ - WSContentSend_PD(HTTP_SNS_FLOGREC, Flog->sector.header.buf_pointer - 8); + WSContentSend_PD(HTTP_SNS_FLOGREC, Flog->sector.header.buf_pointer - 8); } #endif //USE_FLOG #endif // DEBUG_TASMOTA_SENSOR @@ -794,10 +781,10 @@ void UBXShow(bool json) bool UBXCmd(void) { bool serviced = true; - if (XdrvMailbox.data_len > 0) { - UBXSelectMode(XdrvMailbox.payload); - Response_P(S_JSON_UBX_COMMAND_NVALUE, XdrvMailbox.command, XdrvMailbox.payload); - } + if (XdrvMailbox.data_len > 0) { + UBXSelectMode(XdrvMailbox.payload); + Response_P(S_JSON_UBX_COMMAND_NVALUE, XdrvMailbox.command, XdrvMailbox.payload); + } return serviced; } @@ -805,7 +792,7 @@ bool UBXCmd(void) { * Interface \*********************************************************************************************/ -#define XSNS_58 58 +#define XSNS_58 58 bool Xsns58(uint8_t function) { @@ -816,12 +803,12 @@ bool Xsns58(uint8_t function) case FUNC_INIT: UBXDetect(); break; - case FUNC_COMMAND_SENSOR: - if (XSNS_92 == XdrvMailbox.index){ + case FUNC_COMMAND_SENSOR: + if (XSNS_58 == XdrvMailbox.index){ result = UBXCmd(); } break; - case FUNC_EVERY_50_MSECOND: + case FUNC_EVERY_50_MSECOND: UBXTimeServer(); break; case FUNC_EVERY_100_MSECOND: @@ -834,8 +821,8 @@ bool Xsns58(uint8_t function) break; #ifdef USE_FLOG case FUNC_WEB_ADD_HANDLER: - WebServer->on("/UBX", UBXsendFile); - break; + WebServer->on("/UBX", UBXsendFile); + break; #endif //USE_FLOG case FUNC_JSON_APPEND: UBXShow(1);