void LocalPath(TCHAR* buffer, const TCHAR* file) { if (_tcslen(file)>0) _stprintf(buffer,TEXT("%s\\%s"),LKGetLocalPath(),file); else _tcscpy(buffer,LKGetLocalPath()); }
void LocalPath(TCHAR* buffer, const TCHAR* file) { // remove leading directory separator from file. const TCHAR* ptr2 = file; while( (*ptr2) == _T('\\') && (*ptr2) ) { ++ptr2; } if (_tcslen(file)>0) _stprintf(buffer,TEXT("%s%s"),LKGetLocalPath(),ptr2); else _tcscpy(buffer,LKGetLocalPath()); }
const TCHAR * LKGetSystemPath(void) { #ifdef KOBO return _T("/opt/" LKDATADIR "/share/"); #else return LKGetLocalPath(); #endif }
// // Reset will apply only to TXT and LST, not to the CSV // void ResetLogBook(void) { TCHAR filename[MAX_PATH]; #if TESTBENCH StartupStore(_T("... ResetLogBook <%s>\n"),filename); #endif wsprintf(filename,_T("%s\\%S\\%S"), LKGetLocalPath(), LKD_LOGS,LKF_LOGBOOKTXT); DeleteFile(filename); wsprintf(filename,_T("%s\\%S\\%S"), LKGetLocalPath(), LKD_LOGS,LKF_LOGBOOKLST); DeleteFile(filename); return; }
const TCHAR * LKGetSystemPath(void) { #if defined(KOBO) || defined(OPENVARIO) return _T("/opt/" LKDATADIR "/share/"); #elif defined(ANDROID) // we use assets stored in apk, so, system directory is apk file.... static TCHAR szPakagePath[MAX_PATH] = {0}; if(szPakagePath[0] == '\0') { native_view->getPackagePath(szPakagePath, sizeof(szPakagePath)); strcat(szPakagePath, "/"); } return szPakagePath; #else return LKGetLocalPath(); #endif }
// Returns false if something went wrong bool UpdateLogBookTXT(bool welandedforsure) { TCHAR filename[MAX_PATH]; TCHAR Temp[300], TUtc[20]; TCHAR line[300]; int ivalue; _stprintf(filename,_T("%s\\%S\\%S"), LKGetLocalPath(), LKD_LOGS,LKF_LOGBOOKTXT); #if TESTBENCH StartupStore(_T("... UpdateLogBookTXT <%s>\n"),filename); #endif bool dofirstline = !Utf8File::Exists(filename); Utf8File file; if (!file.Open(filename, Utf8File::io_append)) { StartupStore(_T(".... ERROR updating LogBookTXT, file open failure!%s"),NEWLINE); return false; } if (dofirstline) { file.WriteLn(_T("### AUTO-GENERATED LOGBOOK (ENCODED IN UTF-8)")); file.WriteLn(_T("###")); } // // Header line for new note // _stprintf(line,_T("[%04d-%02d-%02d @%02d:%02d]"), GPS_INFO.Year, GPS_INFO.Month, GPS_INFO.Day, GPS_INFO.Hour, GPS_INFO.Minute); file.WriteLn(line); if (SIMMODE) { file.WriteLn(gettext(_T("_@M1211_"))); } file.WriteLn(PilotName_Config); // // D-1234 (Ka6-CR) // _stprintf(line,_T("%s (%s)"), AircraftRego_Config,AircraftType_Config); file.WriteLn(line); file.WriteLn(); // // Takeoff time // Units::TimeToTextS(Temp,(int)TimeLocal((long)CALCULATED_INFO.TakeOffTime)); Units::TimeToText(TUtc, (int)CALCULATED_INFO.TakeOffTime); _stprintf(line,_T("%s: %s (UTC %s)"),gettext(_T("_@M680_")),Temp,TUtc); file.WriteLn(line); _stprintf(line,_T("%s: %s"),gettext(_T("_@M930_")),TAKEOFFWP_Name); file.WriteLn(line); // // Landing time // if (!CALCULATED_INFO.Flying || welandedforsure ) { Units::TimeToTextS(Temp,(int)TimeLocal((long)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime))); Units::TimeToText(TUtc, (int)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime)); _stprintf(line,_T("%s: %s (UTC %s)"),gettext(_T("_@M386_")),Temp,TUtc); file.WriteLn(line); _stprintf(line,_T("%s: %s"),gettext(_T("_@M931_")),LANDINGWP_Name); file.WriteLn(line); } else { #if TESTBENCH StartupStore(_T(".... LogBookTXT, logging but still flying!%s"),NEWLINE); #endif _stprintf(line,_T("%s: ??:??:??"),gettext(_T("_@M386_"))); file.WriteLn(line); } // // Flight time // Units::TimeToTextS(Temp, (int)CALCULATED_INFO.FlightTime); _stprintf(line,_T("%s: %s"),gettext(_T("_@M306_")),Temp); file.WriteLn(line); file.WriteLn(); // // FREE FLIGHT DETECTION // if (ISGLIDER) { // Attention, FFStartTime is 0 for CAR,SIMMODE and other situations if ( CALCULATED_INFO.FreeFlightStartTime>0 ) { Units::TimeToTextS(Temp, (int)TimeLocal((long)CALCULATED_INFO.FreeFlightStartTime)); _stprintf(line,_T("%s: %s @%.0f%s QNH"), gettext(_T("_@M1754_")), Temp, ALTITUDEMODIFY*CALCULATED_INFO.FreeFlightStartQNH, Units::GetAltitudeName()); file.WriteLn(line); Units::TimeToTextS(Temp, (int)(CALCULATED_INFO.FreeFlightStartTime-CALCULATED_INFO.TakeOffTime) ); _stprintf(line,_T("%s: %s @%.0f%s QFE"), gettext(_T("_@M1755_")), Temp, ALTITUDEMODIFY*(CALCULATED_INFO.FreeFlightStartQNH - CALCULATED_INFO.FreeFlightStartQFE), Units::GetAltitudeName()); file.WriteLn(line); file.WriteLn(); } } if (ISGLIDER || ISPARAGLIDER) { // // OLC Classic Dist // ivalue=CContestMgr::TYPE_OLC_CLASSIC; if (OlcResults[ivalue].Type()!=CContestMgr::TYPE_INVALID) { _stprintf(Temp, TEXT("%5.0f"),DISTANCEMODIFY*OlcResults[ivalue].Distance()); _stprintf(line,_T("%s: %s %s"), gettext(_T("_@M1455_")), Temp, Units::GetDistanceName()); file.WriteLn(line); } // // OLC FAI Dist // ivalue=CContestMgr::TYPE_OLC_FAI; if (OlcResults[ivalue].Type()!=CContestMgr::TYPE_INVALID) { _stprintf(Temp, TEXT("%5.0f"), DISTANCEMODIFY*OlcResults[ivalue].Distance()); _stprintf(line,_T("%s: %s %s"),gettext(_T("_@M1457_")), Temp, Units::GetDistanceName()); file.WriteLn(line); } // // Max Altitude gained // _stprintf(line,_T("%s: %.0f %s"),gettext(_T("_@M1769_")), ALTITUDEMODIFY*CALCULATED_INFO.MaxHeightGain, Units::GetAltitudeName()); file.WriteLn(line); } // // Max Altitude reached // _stprintf(line,_T("%s: %.0f %s"),gettext(_T("_@M1767_")),ALTITUDEMODIFY*CALCULATED_INFO.MaxAltitude,Units::GetAltitudeName()); file.WriteLn(line); // // Odometer, add a spare CR LF to separate next logfield // _stprintf(line,_T("%s: %.0f %s"),gettext(_T("_@M1167_")),DISTANCEMODIFY*CALCULATED_INFO.Odometer,Units::GetDistanceName()); file.WriteLn(line); file.WriteLn(); return true; }
// // This is a simple text list of the logbook // bool UpdateLogBookLST(bool welandedforsure) { TCHAR filename[MAX_PATH]; TCHAR Temp[300]; TCHAR line[300]; TCHAR stakeoff[20],stakeoffutc[20],slanding[20],slandingutc[20],sflighttime[20]; TCHAR pilotname[100]; _stprintf(filename,_T("%s\\%S\\%S"), LKGetLocalPath(), LKD_LOGS,LKF_LOGBOOKLST); #if TESTBENCH StartupStore(_T("... UpdateLogBookLST <%s>\n"),filename); #endif bool dofirstline = !Utf8File::Exists(filename); Utf8File file; if (!file.Open(filename, Utf8File::io_append)) { StartupStore(_T(".... ERROR updating LogBookLST, file open failure!%s"),NEWLINE); return false; } if (dofirstline) { file.WriteLn(_T("### AUTO-GENERATED LOGBOOK (ENCODED IN UTF-8)")); file.WriteLn(_T("###")); _stprintf(line,_T("[%s]"),gettext(_T("_@M1753_"))); // List of flights file.WriteLn(line); } Units::TimeToTextS(stakeoff,(int)TimeLocal((long)CALCULATED_INFO.TakeOffTime)); Units::TimeToText(Temp, (int)CALCULATED_INFO.TakeOffTime); _stprintf(stakeoffutc,_T("(UTC %s)"),Temp); if (!CALCULATED_INFO.Flying || welandedforsure) { Units::TimeToTextS(slanding,(int)TimeLocal((long)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime))); Units::TimeToText(Temp, (int)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime)); _stprintf(slandingutc,_T("(UTC %s)"),Temp); } else { #if TESTBENCH StartupStore(_T(".... LogBookLST, logging but still flying!%s"),NEWLINE); #endif _tcscpy(slanding,_T("???")); _tcscpy(slandingutc,_T("")); } Units::TimeToTextS(sflighttime, (int)CALCULATED_INFO.FlightTime); if (_tcslen(PilotName_Config)>0) { _tcscpy(pilotname,PilotName_Config); pilotname[20]=0; } else _tcscpy(pilotname,_T("")); if (!dofirstline) { file.WriteLn(_T("________________________________________")); } if (SIMMODE) { file.WriteLn(gettext(_T("_@M1211_"))); } _stprintf(line,_T("%04d/%02d/%02d %s %s %s"), GPS_INFO.Year, GPS_INFO.Month, GPS_INFO.Day, sflighttime, AircraftRego_Config, pilotname); file.WriteLn(line); _stprintf(line,_T(" %s %s %s"),stakeoff,stakeoffutc,TAKEOFFWP_Name); file.WriteLn(line); _stprintf(line,_T(" %s %s %s"),slanding,slandingutc,LANDINGWP_Name); file.WriteLn(line); return true; }
// // This is the comma separated value logbook, ready for excel and spreadsheets // bool UpdateLogBookCSV(bool welandedforsure) { TCHAR filename[MAX_PATH]; TCHAR line[300]; int ivalue; TCHAR stakeoff[20],stakeoffutc[20],slanding[20],slandingutc[20],sflighttime[20], solcdist[20]; _stprintf(filename,_T("%s\\%S\\%S"), LKGetLocalPath(), LKD_LOGS,LKF_LOGBOOKCSV); #if TESTBENCH StartupStore(_T("... UpdateLogBookCSV <%s>\n"),filename); #endif bool dofirstline = !Utf8File::Exists(filename); Utf8File file; if (!file.Open(filename, Utf8File::io_append)) { StartupStore(_T(".... ERROR updating LogBookCSV, file open failure!%s"),NEWLINE); return false; } if (dofirstline) { file.WriteLn(_T("Year,Month,Day,Pilot,AircraftRego,AircraftType,TakeoffTime,TakeoffUTC,TakeOffLocation,LandingTime,LandingUTC,LandingLocation,TowingTime,TowingAltitude,AltUnits,TotalFlyTime,Odometer,OLCdist,DistUnits")); } Units::TimeToTextS(stakeoff,(int)TimeLocal((long)CALCULATED_INFO.TakeOffTime)); Units::TimeToTextS(stakeoffutc, (int)CALCULATED_INFO.TakeOffTime); if (!CALCULATED_INFO.Flying || welandedforsure) { Units::TimeToTextS(slanding,(int)TimeLocal((long)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime))); Units::TimeToTextS(slandingutc, (int)(CALCULATED_INFO.TakeOffTime+CALCULATED_INFO.FlightTime)); } else { #if TESTBENCH StartupStore(_T(".... LogBookCSV, logging but still flying!%s"),NEWLINE); #endif _tcscpy(slanding,_T("???")); _tcscpy(slandingutc,_T("???")); } ivalue=CContestMgr::TYPE_OLC_CLASSIC; if (OlcResults[ivalue].Type()!=CContestMgr::TYPE_INVALID) { _stprintf(solcdist, _T("%.0f"),DISTANCEMODIFY*OlcResults[ivalue].Distance()); } else { _tcscpy(solcdist, _T("---")); } Units::TimeToTextS(sflighttime, (int)CALCULATED_INFO.FlightTime); TCHAR simmode[8]; if (SIMMODE) _tcscpy(simmode,_T(",SIM")); else _tcscpy(simmode,_T("")); TCHAR towtime[20]; _tcscpy(towtime,_T("")); int towaltitude=0; if (ISGLIDER && (CALCULATED_INFO.FreeFlightStartTime>0)) { Units::TimeToTextS(towtime, (int)(CALCULATED_INFO.FreeFlightStartTime-CALCULATED_INFO.TakeOffTime) ); towaltitude=(int) (ALTITUDEMODIFY*(CALCULATED_INFO.FreeFlightStartQNH - CALCULATED_INFO.FreeFlightStartQFE)); } _stprintf(line,_T("%04d,%02d,%02d,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%d,%s,%s,%d,%s,%s%s"), GPS_INFO.Year, GPS_INFO.Month, GPS_INFO.Day, PilotName_Config, AircraftRego_Config, AircraftType_Config, stakeoff, stakeoffutc,TAKEOFFWP_Name,slanding, slandingutc,LANDINGWP_Name, towtime, towaltitude, Units::GetAltitudeName(), sflighttime, (int)(DISTANCEMODIFY*CALCULATED_INFO.Odometer), solcdist, Units::GetDistanceName(), simmode ); file.WriteLn(line); return true; }
void LocalPath(TCHAR* buffer, const TCHAR* file) { GetPath(buffer, _T(""), file, LKGetLocalPath()); }
void LocalPath(TCHAR* buffer, const TCHAR* SubPath, const TCHAR* file) { GetPath(buffer, SubPath, file, LKGetLocalPath()); }
// // 259 still active, very bad // 0 is the only OK that we want! // other values, very bad // int RunSignature() { DWORD retval=99; TCHAR homedir[MAX_PATH]; TCHAR path[MAX_PATH]; LocalPath(path,_T(LKD_LOGS)); #if (WINDOWSPC>0) _tcscat(path,_T("\\LKRECORD_PC.LK8")); #endif // CAREFUL!!! PNA is ALSO PPC2003!! // // ATTENTION: on PNA we are executing LKRECORD_PNA.LK8.EXE really #ifdef PNA _tcscat(path,_T("\\LKRECORD_PNA.LK8")); #else #ifdef PPC2002 _tcscat(path,_T("\\LKRECORD_2002.LK8")); #endif #ifdef PPC2003 _tcscat(path,_T("\\LKRECORD_2003.LK8")); #endif #endif LocalPath(homedir,TEXT(LKD_LOGS)); #if TESTBENCH StartupStore(_T(".... RunSignature: homedir <%s>%s"),homedir,NEWLINE); #endif PROCESS_INFORMATION pi; #if (WINDOWSPC>0) // Sadly, some parameters cannot be passed in the CE version STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.wShowWindow= SW_SHOWNORMAL; si.dwFlags = STARTF_USESHOWWINDOW; if (!::CreateProcess(path,homedir, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { #else if (!::CreateProcess(path,homedir, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, NULL, &pi)) { #endif DWORD lasterr=GetLastError(); if (lasterr!=2) { // External executable failure, bad ! StartupStore(_T(".... RunSignature exec <%s> FAILED, error code=%d"),path,lasterr,NEWLINE); #if TESTBENCH StartupStore(_T(".... Trying with DoSignature\n")); #endif } #if TESTBENCH else StartupStore(_T(".... no executable <%s> found, proceeding with DoSignature\n"),path); #endif extern int DoSignature(TCHAR *hpath); retval=DoSignature(homedir); return retval; } ::WaitForSingleObject(pi.hProcess, 30000); // 30s GetExitCodeProcess(pi.hProcess,&retval); // STILL_ACTIVE = 259, this retval should be checked for #if TESTBENCH StartupStore(_T(".... RunSignature exec <%s> terminated, retval=%d%s"),path,retval,NEWLINE); #endif return retval; } // // Paolo+Durval: feed external headers to LK for PNAdump software // #define EXTHFILE "COMPE.CNF" //#define DEBUGHFILE 1 void AdditionalHeaders(void) { TCHAR pathfilename[MAX_PATH+1]; wsprintf(pathfilename, TEXT("%s\\%s\\%S"), LKGetLocalPath(), TEXT(LKD_LOGS), EXTHFILE); if (GetFileAttributes(pathfilename) == 0xffffffff) { #if DEBUGHFILE StartupStore(_T("... No additional headers file <%s>\n"),pathfilename); #endif return; } #if DEBUGHFILE StartupStore(_T("... HFILE <%s> FOUND\n"),pathfilename); #endif HANDLE hfile = CreateFile(pathfilename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( hfile == INVALID_HANDLE_VALUE) { StartupStore(_T("... ERROR, extHFILE <%s> not found!%s"),pathfilename,NEWLINE); return; } #define MAXHLINE 100 TCHAR tmpString[MAXHLINE+1]; char tmps[MAXHLINE+1]; //char line[MAXHLINE+12]; tmpString[0]=0; while (ReadString(hfile, MAXHLINE, tmpString)) { size_t len = _tcslen(tmpString); if (len < 2) continue; if (tmpString[0]!='$' ) { #if DEBUGHFILE StartupStore(_T("Line skipped: <%s>\n"),tmpString); #endif continue; } // Remove trailing cr lf, three times to be sure if ( (tmpString[len - 1] == '\r') || (tmpString[len-1]== '\n')) { tmpString[len - 1]= 0; len--; } if (len > 0) { if ( (tmpString[len - 1] == '\r') || (tmpString[len-1]== '\n')) { tmpString[len - 1]= 0; len--; } } if (len > 0) { if ( (tmpString[len - 1] == '\r') || (tmpString[len-1]== '\n')) { tmpString[len - 1]= 0; } } #if DEBUGHFILE StartupStore(_T("ADDING HEADER <%s>\n"),tmpString); #endif /* unicode2ascii(&tmpString[1],tmps,MAXHLINE); strcpy(line,"HFREMARK:"); strcat(line,tmps); strcat(line,"\r\n"); */ sprintf(tmps,"HFREMARK:%S\r\n",&tmpString[1]); IGCWriteRecord(tmps); } CloseHandle(hfile); }