Fix IGC file creation issues

master
Pawel Jalocha 2022-11-30 05:14:46 +00:00
rodzic ff20127a6a
commit 44cce4a19a
3 zmienionych plików z 25 dodań i 9 usunięć

Wyświetl plik

@ -76,6 +76,10 @@ void Format_Hex( void (*Output)(char), uint32_t Word )
{ Format_Hex(Output, (uint8_t)(Word>>24)); Format_Hex(Output, (uint8_t)(Word>>16));
Format_Hex(Output, (uint8_t)(Word>>8)); Format_Hex(Output, (uint8_t)Word); }
void Format_Hex( void (*Output)(char), uint64_t Word )
{ Format_Hex(Output, (uint32_t)(Word>>32));
Format_Hex(Output, (uint32_t)(Word )); }
void Format_MAC( void (*Output)(char), uint8_t *MAC, uint8_t Len)
{ for(uint8_t Idx=0; Idx<Len; Idx++)
{ if(Idx) (*Output)(':');
@ -284,11 +288,16 @@ int16_t Read_Dec3(const char *Inp) // convert three digit decimal nu
int8_t Low=Read_Dec1(Inp[2]); if(Low<0) return -1;
return (int16_t)Low + (int16_t)10*(int16_t)Mid + (int16_t)100*(int16_t)High; }
int16_t Read_Dec4(const char *Inp) // convert three digit decimal number into an integer
int16_t Read_Dec4(const char *Inp) // convert four digit decimal number into an integer
{ int16_t High=Read_Dec2(Inp ); if(High<0) return -1;
int16_t Low =Read_Dec2(Inp+2); if(Low<0) return -1;
return Low + (int16_t)100*(int16_t)High; }
int32_t Read_Dec5(const char *Inp) // convert four digit decimal number into an integer
{ int16_t High=Read_Dec2(Inp ); if(High<0) return -1;
int16_t Low =Read_Dec3(Inp+2); if(Low<0) return -1;
return (int32_t)Low + (int32_t)1000*(int32_t)High; }
// ------------------------------------------------------------------------------------------
int8_t Read_Coord(int32_t &Lat, const char *Inp)

Wyświetl plik

@ -16,6 +16,7 @@ void Format_String( void (*Output)(char), const char *String, uint8_t MinLen,
void Format_Hex( void (*Output)(char), uint8_t Byte );
void Format_Hex( void (*Output)(char), uint16_t Word );
void Format_Hex( void (*Output)(char), uint32_t Word );
void Format_Hex( void (*Output)(char), uint64_t Word );
// void Format_Hex( void (*Output)(char), uint32_t Word, uint8_t Digits);
void Format_MAC( void (*Output)(char), const uint8_t *MAC, uint8_t Len=6);
@ -78,7 +79,8 @@ int8_t Read_Dec1(char Digit); // convert single digit into an
inline int8_t Read_Dec1(const char *Inp) { return Read_Dec1(Inp[0]); }
int8_t Read_Dec2(const char *Inp); // convert two digit decimal number into an integer
int16_t Read_Dec3(const char *Inp); // convert three digit decimal number into an integer
int16_t Read_Dec4(const char *Inp); // convert three digit decimal number into an integer
int16_t Read_Dec4(const char *Inp); // convert four digit decimal number into an integer
int32_t Read_Dec5(const char *Inp); // convert five digit decimal number into an integer
template <class Type>
int8_t Read_Hex(Type &Int, const char *Inp, uint8_t MaxDig=0) // convert variable number of digits hexadecimal number into an integer
@ -120,7 +122,8 @@ template <class Type>
{ Dig=Read_UnsDec(Value, Inp+Len); }
if(Dig<=0) return Dig;
Len+=Dig;
if(Sign=='-') Value=(-Value); return Len; }
if(Sign=='-') Value=(-Value);
return Len; }
template <class Type>
int8_t Read_Float1(Type &Value, const char *Inp) // read floating point, take just one digit after decimal point

Wyświetl plik

@ -125,7 +125,8 @@ static void IGC_Close(void)
Format_String(CONS_UART_Write, IGC_FileName);
Format_String(CONS_UART_Write, "\n");
xSemaphoreGive(CONS_Mutex);
fclose(IGC_File); IGC_File=0; IGC_FlightNum++; }
fclose(IGC_File); IGC_File=0;
IGC_FlightNum++; }
}
/*
IGC_SaveTime = TimeSync_Time();
@ -146,11 +147,14 @@ static int IGC_Open(const GPS_Position &GPS)
IGC_FileName[IGC_PathLen]='/'; // slash after the path
Flight.ShortName(IGC_FileName+IGC_PathLen+1, GPS, IGC_FlightNum, IGC_Serial); // full name
IGC_File=fopen(IGC_FileName, "rt"); // attempt to open for read, just to try if the file is already there
if(IGC_File) { IGC_Close(); return -2; } // -2 => file already exists
// Format_String(CONS_UART_Write, "IGC_Open() (1)\n");
if(IGC_File) { fclose(IGC_File); IGC_File=0; IGC_FlightNum++; return -2; } // -2 => file already exists
IGC_File=fopen(IGC_FileName, "wt"); // open for write
// Format_String(CONS_UART_Write, "IGC_Open() (2)\n");
if(IGC_File==0) // failed: maybe sub-dir does not exist ?
{ if(mkdir(IGC_Path, 0777)<0) return -3; // -3 => can't create sub-dir
IGC_File=fopen(IGC_FileName, "wt"); } // retry to open for write
// Format_String(CONS_UART_Write, "IGC_Open() (3)\n");
if(IGC_File)
{ IGC_SaveTime = TimeSync_Time();
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);
@ -368,13 +372,13 @@ static void IGC_CheckGPS(void) // check if new
{ static uint8_t PrevPosIdx=0;
if(GPS_PosIdx==PrevPosIdx) return;
PrevPosIdx=GPS_PosIdx;
const uint8_t PosPipeIdxMask = GPS_PosPipeSize-1; // get the GPS position just before in the pipe
const uint8_t PosPipeIdxMask = GPS_PosPipeSize-1; // get the GPS position just before in the pipe
uint8_t PosIdx = GPS_PosIdx-1; PosIdx&=PosPipeIdxMask;
static bool PrevInFlight=0;
const GPS_Position &GPS = GPS_Pos[PosIdx];
bool inFlight = GPS.InFlight; // in-flight or on-the-ground ?
bool StopFile = PrevInFlight && !inFlight;
PrevInFlight = inFlight;;
bool inFlight = GPS.InFlight; // in-flight or on-the-ground ?
bool StopFile = PrevInFlight && !inFlight; // decide to stop the file when InFlight switches from 1 to 0
PrevInFlight = inFlight;
#ifdef DEBUG_PRINT
GPS.PrintLine(Line);
xSemaphoreTake(CONS_Mutex, portMAX_DELAY);