Exemple #1
0
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();
}
Exemple #2
0
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/// 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);
}
Exemple #5
0
//
// 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);
  
}