void StartupStore(const TCHAR *Str, ...) { TCHAR buf[(MAX_PATH*2)+1]; // 260 chars normally FIX 100205 va_list ap; va_start(ap, Str); _vstprintf(buf, Str, ap); va_end(ap); CheckAndLockFlightData(); FILE *startupStoreFile = NULL; static TCHAR szFileName[MAX_PATH]; static bool initialised = false; if (!initialised) { LocalPath(szFileName, TEXT(LKF_RUNLOG)); initialised = true; } startupStoreFile = _tfopen(szFileName, TEXT("ab+")); if (startupStoreFile != NULL) { char sbuf[(MAX_PATH*2)+1]; // FIX 100205 int i = unicode2utf(buf, sbuf, sizeof(sbuf)); if (i > 0) { if (sbuf[i - 1] == 0x0a && (i == 1 || (i > 1 && sbuf[i-2] != 0x0d))) sprintf(sbuf + i - 1, SNEWLINE); fprintf(startupStoreFile, "[%09u] %s", (unsigned int)GetTickCount(), sbuf); } fclose(startupStoreFile); } CheckAndUnlockFlightData(); }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Write zero terminated line into the file. /// Newline character will be added automatically. /// /// @param unicode zero terminated string /// void Utf8File::WriteLn(const TCHAR* unicode) { if (fp == NULL) return; if (unicode != NULL) { size_t len = _tcslen(unicode); // in worst case each char can be encoded in 4 bytes char cstr[4 * len + 1]; // (conversion and file error is ignored now, maybe in future it should // throw exception) if (unicode2utf(unicode, cstr, sizeof(cstr)) < 0 && !convErReported) { StartupStore(_T("Invalid WC-UTF8 conversion for '%s'%s"), path, NEWLINE); convErReported = true; } if (fputs(cstr, fp) == EOF && !writeErReported) { StartupStore(_T("Cannot wite to file '%s'%s"), path, NEWLINE); writeErReported = true; } } fputc('\n', fp); } // WriteLn()
void LKWriteToProfile(const char *varname, TCHAR *varvalue) { #ifdef UNICODE char stmp[MAX_PATH]; unicode2utf((TCHAR*) varvalue, stmp, sizeof(stmp)); fprintf(pfp,"%s=\"%s\"%s", varname, stmp ,PNEWLINE); #else fprintf(pfp,"%s=\"%s\"%s", varname, varvalue ,PNEWLINE); #endif }
void LKWriteToProfile(const TCHAR *varname, TCHAR *varvalue) { char stmp[MAX_PATH]; unicode2utf((TCHAR*) varvalue, stmp, sizeof(stmp)); fprintf(pfp,"%S=\"%s\"%s", varname, stmp ,PNEWLINE); }
// // Called once at startup by WinMain from lk8000.cpp // This means that we can also give a message about FDR operative even in the splash screens // In case of re-run, it is self-checking for previous successful run // void InitFlightDataRecorder(void) { // Did we already found a config? If so, dont do anything else. if (FlightDataRecorderActive) { #if TESTBENCH StartupStore(_T("... InitFDR error: already initialised!\n")); #endif return; } TCHAR path[MAX_PATH+1]; TCHAR szBatLogFileName[MAX_PATH+1]; char szTmp[255]; FILE* fpDataRecConfigFile = NULL; int i; LocalPath(path,TEXT(LKD_CONF)); wsprintf(szBatLogFileName, TEXT("%s\\FlightRecorder.CFG"), path); fpDataRecConfigFile = _tfopen(szBatLogFileName, TEXT("r")); if(fpDataRecConfigFile == NULL) { // We shall no more check for dataconfig, unless we reset DoInit // So now the FlightDataRecorder is disabled at all, and we shall only // check for FlightDataRecorderActive to be true #if TESTBENCH StartupStore(_T("... InitFDR: no configuration, FDR disabled\n")); #endif return; } StartupStore(_T(". Flight Data Recorder is in use%s"),NEWLINE); FlightDataRecorderActive=true; // Reset configuration for(i=0 ; i < NO_ENTRYS; i++) { FDR[i].abLog = 0 ;FDR[i].fMin =0.0 ; FDR[i].fMax = 0.0;FDR[i].aiCheckInterval = 0; FDR[i].aiMaxWarnings= 0; FDR[i].iWarningDelay=0; } // Load new configuration i=0; iLogDelay=0; do { i++; fscanf(fpDataRecConfigFile, "%120[^\n]",szTmp); iLogDelay = atoi(szTmp); } while ((iLogDelay == 0) && (i< 50)); for(i= 0 ; i < NO_ENTRYS; i++) { fscanf(fpDataRecConfigFile, "%d %f %f %i %i %120[^\n]", &FDR[i].abLog ,&FDR[i].fMin , &FDR[i].fMax , &FDR[i].aiCheckInterval, &FDR[i].aiMaxWarnings, szTmp ); } fclose(fpDataRecConfigFile); i=0; _tcscpy( FDR[i++].szName , _T("External Batt. 1")); _tcscpy( FDR[i++].szName , _T("External Batt. 2")); _tcscpy( FDR[i++].szName , _T("supply voltage")); _tcscpy( FDR[i++].szName , _T("PDA Batt. %")); _tcscpy( FDR[i++].szName , _T("Outside Air Temperature")); _tcscpy( FDR[i++].szName , _T("Longitude")); _tcscpy( FDR[i++].szName , _T("Latitude")); _tcscpy( FDR[i++].szName , _T("Altitude")); _tcscpy( FDR[i++].szName , _T("Baro Altitude")); _tcscpy( FDR[i++].szName , _T("Alt AGL")); _tcscpy( FDR[i++].szName , _T("Indcated Airspeed")); _tcscpy( FDR[i++].szName , _T("True Airspeed")); _tcscpy( FDR[i++].szName , _T("Ground Speed")); _tcscpy( FDR[i++].szName , _T("TrackBearing")); _tcscpy( FDR[i++].szName , _T("Vario")); _tcscpy( FDR[i++].szName , _T("NettoVario")); _tcscpy( FDR[i++].szName , _T("Acceleration X")); _tcscpy( FDR[i++].szName , _T("Acceleration Y")); _tcscpy( FDR[i++].szName , _T("Acceleration Z")); _tcscpy( FDR[i++].szName , _T("Ballast")); _tcscpy( FDR[i++].szName , _T("Bugs")); _tcscpy( FDR[i++].szName , _T("MacReady")); _tcscpy( FDR[i++].szName , _T("Wind speed")); _tcscpy( FDR[i++].szName , _T("Wind direction")); if(iLogDelay == 0) return; // Nothing to do char sbuf[30]; // WE TRY TO OPEN THE LOGFILE, AND IF WE CANT WE PERMANENTLY DISABLE LOGGING LocalPath(path,TEXT(LKD_LOGS)); wsprintf(szBatLogFileName, TEXT("%s\\FlightRecorder.TXT"), path); FlightDataRecorderFile = _tfopen(szBatLogFileName, TEXT("w")); if (FlightDataRecorderFile==NULL) { StartupStore(_T("... InitFDR failure: cannot open <%s>%s"),szBatLogFileName,NEWLINE); iLogDelay=0; // logging disabled permanently return; } SYSTEMTIME pda_time; GetSystemTime(&pda_time); // FROM NOW ON, we can write on the file and on LK exit we must close the file. fprintf(FlightDataRecorderFile,"******************************************************************\r"); fprintf(FlightDataRecorderFile,"* LK8000 Tactical Flight Computer - WWW.LK8000.IT\r"); fprintf(FlightDataRecorderFile,"*\r"); fprintf(FlightDataRecorderFile,"* Flight Data Recorder Output\r"); fprintf(FlightDataRecorderFile,"* GNU 2012 by Ulrich Heynen / Paolo Ventafridda\r"); fprintf(FlightDataRecorderFile,"*\r"); fprintf(FlightDataRecorderFile,"* flight recorded on: %02d:%02d:%04d starting at %02d:%02d:%02d UTC\r", pda_time.wDay,pda_time.wMonth,pda_time.wYear , pda_time.wHour, pda_time.wMinute, pda_time.wSecond ); fprintf(FlightDataRecorderFile,"*\r"); fprintf(FlightDataRecorderFile,"******************************************************************\r\r"); fprintf(FlightDataRecorderFile,"Recording interval:%us \r\r",iLogDelay); for( i = 0; i < NO_ENTRYS; i++) { unicode2utf(FDR[i].szName, sbuf, sizeof(sbuf)); if(FDR[i].abLog > 0) fprintf(FlightDataRecorderFile,"%30s recording enabled\r",sbuf); } fprintf(FlightDataRecorderFile,"\r"); for( i = 0; i < NO_ENTRYS; i++) { unicode2utf(FDR[i].szName, sbuf, sizeof(sbuf)); if(FDR[i].aiCheckInterval > 0) { if( FDR[i].aiMaxWarnings > 0) { fprintf(FlightDataRecorderFile,"%30s range (%4.2f .. %4.2f) warning every %is, max. %i warnings\r", sbuf,FDR[i].fMin, FDR[i].fMax,FDR[i].aiCheckInterval, FDR[i].aiMaxWarnings ); } else { fprintf(FlightDataRecorderFile,"%30s range (%4.2f .. %4.2f) check every %is, unlimited warnings!\r", sbuf,FDR[i].fMin, FDR[i].fMax,FDR[i].aiMaxWarnings); } } } fprintf(FlightDataRecorderFile,"\r"); fprintf(FlightDataRecorderFile,"hh:mm:ss "); int idx=0; if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BAT1 " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BAT2 " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," IntV " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BAT%% " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," OAT " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," lat " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," lon " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," Alt " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," AltB " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," AGL " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," IAS " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," TAS " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," GS " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BRG " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," VAR " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," NET " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," AcX " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," AcY " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," AcZ " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BAL " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," BUG " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," MC " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," eWnd " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," eWdir" ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," cWnd " ); if(FDR[idx++].abLog > 0) fprintf(FlightDataRecorderFile," cWdir" ); fprintf(FlightDataRecorderFile,"\r" ); // Sync file, only for init fflush(FlightDataRecorderFile); }