Fix bug around transmitting last known position when GPS fix is lost

pull/46/head
Pawel Jalocha 2022-02-11 10:10:57 +00:00
rodzic 7c4109151f
commit c440a2e936
3 zmienionych plików z 55 dodań i 53 usunięć

Wyświetl plik

@ -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);

Wyświetl plik

@ -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<OGN_Packet> *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;
}

Wyświetl plik

@ -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