From c440a2e936c2c4dddbe631dafb0be989519a4a95 Mon Sep 17 00:00:00 2001 From: Pawel Jalocha Date: Fri, 11 Feb 2022 10:10:57 +0000 Subject: [PATCH] Fix bug around transmitting last known position when GPS fix is lost --- main/parameters.h | 4 +-- main/proc.cpp | 80 ++++++++++++++++++++++++----------------------- sdkconfig | 24 +++++++------- 3 files changed, 55 insertions(+), 53 deletions(-) diff --git a/main/parameters.h b/main/parameters.h index 56cdbfb..6d93a58 100644 --- a/main/parameters.h +++ b/main/parameters.h @@ -469,7 +469,7 @@ uint16_t StratuxPort; Line[Len++]=HexDigit(AddrType); Line[Len++]=':'; Len+=Format_Hex(Line+Len, Address, 6); { uint64_t ID=getUniqueID(); Line[Len++]='/'; - Len+=Format_Hex(Line+Len, (uint16_t)(ID>>32)); Len+=Format_Hex(Line+Len, (uint32_t)ID); } + Len+=Format_Hex(Line+Len, (uint32_t)(ID>>32)); Len+=Format_Hex(Line+Len, (uint32_t)ID); } // uint32_t DefaultAddr=getUniqueAddress(); // if(Address!=DefaultAddr) // { Line[Len++]='/'; Len+=Format_Hex(Line+Len, DefaultAddr, 6); } @@ -498,7 +498,7 @@ uint16_t StratuxPort; { uint8_t Len=0; Len+=Format_String(Line+Len, "$POGNS,CPU=0x"); uint64_t CPU=getUniqueID(); - Len+=Format_Hex(Line+Len, (uint16_t)(CPU>>32)); + Len+=Format_Hex(Line+Len, (uint32_t)(CPU>>32)); Len+=Format_Hex(Line+Len, (uint32_t)CPU); Len+=Format_String(Line+Len, ",Address=0x"); Len+=Format_Hex(Line+Len, Address, 6); diff --git a/main/proc.cpp b/main/proc.cpp index 0f7968d..7c7828a 100644 --- a/main/proc.cpp +++ b/main/proc.cpp @@ -556,8 +556,8 @@ void vTaskPROC(void* pvParameters) else { SatSNR=0; } StatPacket.Packet.Status.SatSNR = SatSNR; } - if(Position && Position->isTimeValid() && Position->isDateValid()) PosTime=Position->getUnixTime(); - else PosTime=0; + // if(Position && Position->isTimeValid() && Position->isDateValid()) PosTime=Position->getUnixTime(); + // else PosTime=0; if( Position && Position->isReady && (!Position->Sent) && Position->isValid() ) { int16_t AverSpeed=GPS_AverageSpeed(); // [0.1m/s] average speed, including the vertical speed @@ -572,7 +572,7 @@ void vTaskPROC(void* pvParameters) Format_String(CONS_UART_Write, " -> Sent\n"); xSemaphoreGive(CONS_Mutex); #endif - // PosTime=Position->getUnixTime(); + PosTime=Position->getUnixTime(); PosPacket.Packet.HeaderWord=0; PosPacket.Packet.Header.Address = Parameters.Address; // set address PosPacket.Packet.Header.AddrType = Parameters.AddrType; // address-type @@ -586,9 +586,9 @@ void vTaskPROC(void* pvParameters) { while(BestResid>=500) BestResid-=1000; // remove full seconds Position->Encode(PosPacket.Packet, BestResid); } PosPacket.Packet.Position.AcftType = Parameters.AcftType; // aircraft-type - PosPacket.Packet.Position.Stealth = 0; // Parameters.Stealth; + PosPacket.Packet.Position.Stealth = Parameters.Stealth; #ifdef DEBUG_PRINT - { uint8_t Len=PosPacket.Packet.WriteAPRS(Line, PosTime); // print on the console as APRS message + { uint8_t Len=PosPacket.Packet.WriteAPRS(Line, PosTime); // print on the console as APRS message xSemaphoreTake(CONS_Mutex, portMAX_DELAY); Format_String(CONS_UART_Write, Line, 0, Len); xSemaphoreGive(CONS_Mutex); } @@ -603,16 +603,17 @@ void vTaskPROC(void* pvParameters) TxPacket->Packet.Whiten(); // just whiten if there is no encryption #endif TxPacket->calcFEC(); // calculate FEC code -#ifdef DEBUG_PRINT +// #ifdef DEBUG_PRINT xSemaphoreTake(CONS_Mutex, portMAX_DELAY); - Format_UnsDec(CONS_UART_Write, TimeSync_Time()%60, 2); - CONS_UART_Write('.'); - Format_UnsDec(CONS_UART_Write, TimeSync_msTime(), 3); - Format_String(CONS_UART_Write, " TxFIFO <- "); + // Format_UnsDec(CONS_UART_Write, TimeSync_Time()%60, 2); + // CONS_UART_Write('.'); + // Format_UnsDec(CONS_UART_Write, TimeSync_msTime(), 3); + Format_UnsDec(CONS_UART_Write, PosTime); + Format_String(CONS_UART_Write, " (*) TxFIFO <- "); Format_Hex(CONS_UART_Write, TxPacket->Packet.HeaderWord); CONS_UART_Write('\r'); CONS_UART_Write('\n'); xSemaphoreGive(CONS_Mutex); -#endif +// #endif XorShift32(RX_Random); static uint8_t TxBackOff=0; if(TxBackOff) TxBackOff--; @@ -623,29 +624,29 @@ void vTaskPROC(void* pvParameters) if(TX_Credit<=0) TxBackOff+=1; } Position->Sent=1; #ifdef WITH_FANET - static uint8_t FNTbackOff=0; - if(FNTbackOff) FNTbackOff--; - // if( (SlotTime&0x07)==(RX_Random&0x07) ) // every 8sec - else - { FANET_Packet *FNTpkt = FNT_TxFIFO.getWrite(); - FNTpkt->setAddress(Parameters.Address); - Position->EncodeAirPos(*FNTpkt, Parameters.AcftType, !Parameters.Stealth); - XorShift32(RX_Random); - FNT_TxFIFO.Write(); - FNTbackOff = 8+(RX_Random&0x1); } // every 9 or 10sec + static uint8_t FNTbackOff=0; + if(FNTbackOff) FNTbackOff--; + // if( (SlotTime&0x07)==(RX_Random&0x07) ) // every 8sec + else + { FANET_Packet *FNTpkt = FNT_TxFIFO.getWrite(); + FNTpkt->setAddress(Parameters.Address); + Position->EncodeAirPos(*FNTpkt, Parameters.AcftType, !Parameters.Stealth); + XorShift32(RX_Random); + FNT_TxFIFO.Write(); + FNTbackOff = 8+(RX_Random&0x1); } // every 9 or 10sec #endif #ifdef WITH_LOOKOUT - const LookOut_Target *Tgt=Look.ProcessOwn(PosPacket.Packet); // process own position, get the most dangerous target + const LookOut_Target *Tgt=Look.ProcessOwn(PosPacket.Packet); // process own position, get the most dangerous target #ifdef WITH_PFLAA - if(Parameters.Verbose) - { xSemaphoreTake(CONS_Mutex, portMAX_DELAY); - Look.WritePFLA(CONS_UART_Write); // produce PFLAU and PFLAA for all tracked targets - xSemaphoreGive(CONS_Mutex); + if(Parameters.Verbose) + { xSemaphoreTake(CONS_Mutex, portMAX_DELAY); + Look.WritePFLA(CONS_UART_Write); // produce PFLAU and PFLAA for all tracked targets + xSemaphoreGive(CONS_Mutex); #ifdef WITH_SDLOG - if(Log_Free()>=512) - { xSemaphoreTake(Log_Mutex, portMAX_DELAY); - Look.WritePFLA(Log_Write); - xSemaphoreGive(Log_Mutex); } + if(Log_Free()>=512) + { xSemaphoreTake(Log_Mutex, portMAX_DELAY); + Look.WritePFLA(Log_Write); + xSemaphoreGive(Log_Mutex); } #endif } #else @@ -655,10 +656,10 @@ void vTaskPROC(void* pvParameters) Format_String(CONS_UART_Write, Line, 0, Len); xSemaphoreGive(CONS_Mutex); #ifdef WITH_SDLOG - if(Log_Free()>=128) - { xSemaphoreTake(Log_Mutex, portMAX_DELAY); - Format_String(Log_Write, Line, 0, Len); // send the NMEA out to the log file - xSemaphoreGive(Log_Mutex); } + if(Log_Free()>=128) + { xSemaphoreTake(Log_Mutex, portMAX_DELAY); + Format_String(Log_Write, Line, 0, Len); // send the NMEA out to the log file + xSemaphoreGive(Log_Mutex); } #endif } #endif // WITH_PFLAA @@ -721,17 +722,18 @@ void vTaskPROC(void* pvParameters) } else // if GPS position is not complete, contains no valid position, etc. { if((SlotTime-PosTime)>=30) { PosPacket.Packet.Position.Time=0x3F; } // if no valid position for more than 30 seconds then set the time as unknown for the transmitted packet OGN_TxPacket *TxPacket = RF_TxFIFO.getWrite(); - TxPacket->Packet = PosPacket.Packet; + TxPacket->Packet = PosPacket.Packet; // copy the position packet TxPacket->Packet.Whiten(); TxPacket->calcFEC(); // whiten and calculate FEC code -#ifdef DEBUG_PRINT +// #ifdef DEBUG_PRINT xSemaphoreTake(CONS_Mutex, portMAX_DELAY); - Format_String(CONS_UART_Write, "TxFIFO: "); + Format_UnsDec(CONS_UART_Write, PosTime); + Format_String(CONS_UART_Write, " (_) TxFIFO <- "); Format_Hex(CONS_UART_Write, TxPacket->Packet.HeaderWord); CONS_UART_Write('\r'); CONS_UART_Write('\n'); xSemaphoreGive(CONS_Mutex); -#endif +// #endif XorShift32(RX_Random); - if(PosTime && ((RX_Random&0x3)==0) ) // send if some position in the packet and at 1/4 normal rate + if(PosTime && ((RX_Random&0x7)==0) ) // send if some position in the packet and at 1/8 normal rate RF_TxFIFO.Write(); // complete the write into the TxFIFO if(Position) Position->Sent=1; } diff --git a/sdkconfig b/sdkconfig index 9828199..5199b91 100644 --- a/sdkconfig +++ b/sdkconfig @@ -130,8 +130,8 @@ CONFIG_PARTITION_TABLE_MD5=y # # Compiler options # -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y -# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set +CONFIG_COMPILER_OPTIMIZATION_SIZE=y # CONFIG_COMPILER_OPTIMIZATION_PERF is not set # CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y @@ -139,10 +139,11 @@ CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set # CONFIG_COMPILER_CXX_EXCEPTIONS is not set # CONFIG_COMPILER_CXX_RTTI is not set -CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y -# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y # CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set # CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +CONFIG_COMPILER_STACK_CHECK=y # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set CONFIG_COMPILER_DISABLE_GCC8_WARNINGS=y # end of Compiler options @@ -604,8 +605,7 @@ CONFIG_ETH_RMII_CLK_IN_GPIO=0 CONFIG_ETH_DMA_BUFFER_SIZE=512 CONFIG_ETH_DMA_RX_BUFFER_NUM=10 CONFIG_ETH_DMA_TX_BUFFER_NUM=10 -CONFIG_ETH_USE_SPI_ETHERNET=y -CONFIG_ETH_SPI_ETHERNET_DM9051=y +# CONFIG_ETH_USE_SPI_ETHERNET is not set # CONFIG_ETH_USE_OPENETH is not set # end of Ethernet @@ -792,7 +792,6 @@ CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y # CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set # CONFIG_FREERTOS_DEBUG_INTERNALS is not set -CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set CONFIG_FREERTOS_DEBUG_OCDAWARE=y @@ -845,7 +844,7 @@ CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y # CONFIG_LWIP_L2_TO_L3_COPY is not set # CONFIG_LWIP_IRAM_OPTIMIZATION is not set CONFIG_LWIP_TIMERS_ONDEMAND=y -CONFIG_LWIP_MAX_SOCKETS=10 +CONFIG_LWIP_MAX_SOCKETS=5 # CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set # CONFIG_LWIP_SO_LINGER is not set # CONFIG_LWIP_SO_REUSE is not set @@ -1222,16 +1221,17 @@ CONFIG_MONITOR_BAUD_115200B=y # CONFIG_MONITOR_BAUD_OTHER is not set CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set +CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set # CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set # CONFIG_CXX_EXCEPTIONS is not set -CONFIG_STACK_CHECK_NONE=y -# CONFIG_STACK_CHECK_NORM is not set +# CONFIG_STACK_CHECK_NONE is not set +CONFIG_STACK_CHECK_NORM=y # CONFIG_STACK_CHECK_STRONG is not set # CONFIG_STACK_CHECK_ALL is not set +CONFIG_STACK_CHECK=y # CONFIG_WARN_WRITE_STRINGS is not set CONFIG_DISABLE_GCC8_WARNINGS=y # CONFIG_ESP32_APPTRACE_DEST_TRAX is not set