void Shutdown(void) { int i; // LKTOKEN _@M1219_ "Shutdown, please wait..." CreateProgressDialog(gettext(TEXT("_@M1219_"))); LKSound(_T("LK_DISCONNECT.WAV")); Poco::Thread::sleep(500); // real WAV length is 410+ms if (!GlobalRunning) { // shutdown on startup (before sim/fly or clicking on the window X) StartupStore(_T(". Quick shutdown requested before terminating startup%s"),NEWLINE); // force exit mode for the case of being in welcome screen: OnTimerNotify will catch it RUN_MODE=RUN_SHUTDOWN; CloseCalculations(); CloseGeoid(); DeInitCustomHardware(); LKRunStartEnd(false); return; } StartupStore(_T(". Entering shutdown %s%s"), WhatTimeIsIt(),NEWLINE); MapWindow::Event_Pan(0); // return from PAN restores the Task in case of Turnpoint moving #if TESTBENCH StartupLogFreeRamAndStorage(); #endif // turn off all displays GlobalRunning = false; // LKTOKEN _@M1220_ "Shutdown, saving logs..." CreateProgressDialog(gettext(TEXT("_@M1220_"))); // In case we quit while are still flying UpdateLogBook(false); // false=only log if still flying // stop logger guiStopLogger(true); // LKTOKEN _@M1221_ "Shutdown, saving profile..." CreateProgressDialog(gettext(TEXT("_@M1221_"))); extern void LKAircraftSave(const TCHAR *szFile); extern void LKPilotSave(const TCHAR *szFile); extern void LKDeviceSave(const TCHAR *szFile); LKPilotSave(defaultPilotFile); LKAircraftSave(defaultAircraftFile); LKProfileSave(defaultProfileFile); LKDeviceSave(defaultDeviceFile); #if TESTBENCH StartupStore(TEXT(". Save_Recent_WP_history%s"),NEWLINE); #endif SaveRecentList(); // Stop sound // Stop drawing // LKTOKEN _@M1219_ "Shutdown, please wait..." CreateProgressDialog(gettext(TEXT("_@M1219_"))); // 100526 this is creating problem in SIM mode when quit is called from X button, and we are in waypoint details // or probably in other menu related screens. However it cannot happen from real PNA or PDA because we don't have // that X button. MapWindow::CloseDrawingThread(); // Stop calculating too (wake up) dataTriggerEvent.set(); drawTriggerEvent.set(); // Clear data // LKTOKEN _@M1222_ "Shutdown, saving task..." CreateProgressDialog(gettext(TEXT("_@M1222_"))); #if TESTBENCH StartupStore(TEXT(".... Save default task%s"),NEWLINE); #endif SaveDefaultTask(); #if TESTBENCH StartupStore(TEXT(".... Clear task data%s"),NEWLINE); #endif LockTaskData(); Task[0].Index = -1; ActiveWayPoint = -1; AATEnabled = FALSE; CloseWayPoints(); UnlockTaskData(); // LKTOKEN _@M1219_ "Shutdown, please wait..." CreateProgressDialog(gettext(TEXT("_@M1219_"))); #if TESTBENCH StartupStore(TEXT(".... CloseTerrainTopology%s"),NEWLINE); #endif RasterTerrain::CloseTerrain(); CloseTopology(); #if USETOPOMARKS TopologyCloseMarks(); #endif CloseTerrainRenderer(); LiveTrackerShutdown(); #ifndef NO_DATARECORDER CloseFlightDataRecorder(); #endif // Stop COM devices StartupStore(TEXT(". Stop COM devices%s"),NEWLINE); devCloseAll(); CloseFLARMDetails(); ProgramStarted = psInitInProgress; // Kill windows #if TESTBENCH StartupStore(TEXT(".... Close Messages%s"),NEWLINE); #endif Message::Destroy(); #if TESTBENCH StartupStore(TEXT(".... Destroy Button Labels%s"),NEWLINE); #endif ButtonLabel::Destroy(); #if TESTBENCH StartupStore(TEXT(".... Delete Objects%s"),NEWLINE); #endif // Kill graphics objects #ifdef LXMINIMAP hBrushButtonHasFocus.Release(); #endif CAirspaceManager::Instance().CloseAirspaces(); #if TESTBENCH StartupStore(TEXT(".... Delete Critical Sections%s"),NEWLINE); #endif // Wait end of Calculation thread before deinit critical section. WaitThreadCalculation(); #if TESTBENCH StartupStore(TEXT(".... Close Progress Dialog%s"),NEWLINE); #endif CloseProgressDialog(); #if TESTBENCH StartupStore(TEXT(".... Close Calculations%s"),NEWLINE); #endif CloseCalculations(); CloseGeoid(); DeInitCustomHardware(); #if TESTBENCH StartupStore(TEXT(".... Close Windows%s"),NEWLINE); #endif #if TESTBENCH StartupLogFreeRamAndStorage(); #endif for (i=0;i<NUMDEV;i++) { if (ComPortStatus[i]!=0) { StartupStore(_T(". ComPort %d: status=%d Rx=%ld Tx=%ld ErrRx=%ld + ErrTx=%ld (==%ld)%s"), i, ComPortStatus[i], ComPortRx[i],ComPortTx[i], ComPortErrRx[i],ComPortErrTx[i],ComPortErrors[i],NEWLINE); } } StartupStore(_T(". Finished shutdown %s%s"), WhatTimeIsIt(),NEWLINE); LKRunStartEnd(false); #ifdef DEBUG TCHAR foop[80]; TASK_POINT wp; TASK_POINT *wpr = ℘ _stprintf(foop,TEXT(". Sizes %d %d %d%s"), sizeof(TASK_POINT), ((long)&wpr->AATTargetLocked)-((long)wpr), ((long)&wpr->Target)-((long)wpr), NEWLINE ); StartupStore(foop); #endif StartupStore(_T("Destroy MainWindow" NEWLINE)); MainWindow.Destroy(); }
void SettingsLeave() { if (!GlobalRunning) return; SwitchToMapWindow(); // Locking everything here prevents the calculation thread from running, // while shared data is potentially reloaded. LockFlightData(); LockTaskData(); MenuActive = false; // 101020 LKmaps contain only topology , so no need to force total reload! if(MAPFILECHANGED) { #if TESTBENCH StartupStore(_T(".... MAPFILECHANGED from configuration\n")); #endif if (LKTopo==0) { AIRSPACEFILECHANGED = TRUE; AIRFIELDFILECHANGED = TRUE; WAYPOINTFILECHANGED = TRUE; TERRAINFILECHANGED = TRUE; } TOPOLOGYFILECHANGED = TRUE; } if (TERRAINFILECHANGED) { #if TESTBENCH StartupStore(_T(".... TERRAINFILECHANGED from configuration\n")); #endif RasterTerrain::CloseTerrain(); RasterTerrain::OpenTerrain(); // NO! We dont reload waypoints on terrain change. // SetHome(WAYPOINTFILECHANGED==TRUE); MapWindow::ForceVisibilityScan = true; } if((WAYPOINTFILECHANGED) || (AIRFIELDFILECHANGED)) { #if TESTBENCH StartupStore(_T(".... WAYPOINT OR AIRFIELD CHANGED from configuration\n")); #endif SaveDefaultTask(); //@ 101020 BUGFIX ClearTask(); ReadWayPoints(); StartupStore(_T(". RELOADED %d WAYPOINTS + %d virtuals%s"),WayPointList.size()-NUMRESWP,NUMRESWP,NEWLINE); SetHome(true); // force home reload if (WAYPOINTFILECHANGED) { #if TESTBENCH StartupStore(_T(".... WAYPOINTFILECHANGED from configuration\n")); #endif SaveRecentList(); LoadRecentList(); RangeLandableNumber=0; RangeAirportNumber=0; RangeTurnpointNumber=0; CommonNumber=0; SortedNumber=0; // SortedTurnpointNumber=0; 101222 LastDoRangeWaypointListTime=0; LKForceDoCommon=true; LKForceDoNearest=true; LKForceDoRecent=true; // LKForceDoNearestTurnpoint=true; 101222 } InputEvents::eventTaskLoad(_T(LKF_DEFAULTASK)); //@ BUGFIX 101020 } if (TOPOLOGYFILECHANGED) { #if TESTBENCH StartupStore(_T(".... TOPOLOGYFILECHANGED from configuration\n")); #endif CloseTopology(); OpenTopology(); MapWindow::ForceVisibilityScan = true; } if(AIRSPACEFILECHANGED) { #if TESTBENCH StartupStore(_T(".... AIRSPACEFILECHANGED from configuration\n")); #endif CAirspaceManager::Instance().CloseAirspaces(); CAirspaceManager::Instance().ReadAirspaces(); CAirspaceManager::Instance().SortAirspaces(); MapWindow::ForceVisibilityScan = true; } if (POLARFILECHANGED) { #if TESTBENCH StartupStore(_T(".... POLARFILECHANGED from configuration\n")); #endif CalculateNewPolarCoef(); GlidePolar::SetBallast(); } if (AIRFIELDFILECHANGED || AIRSPACEFILECHANGED || WAYPOINTFILECHANGED || TERRAINFILECHANGED || TOPOLOGYFILECHANGED ) { CloseProgressDialog(); MainWindow.SetFocus(); } extern void ReinitScreen(void); if (FONTSCHANGED) { ReinitScreen(); } UnlockTaskData(); UnlockFlightData(); if(!SIMMODE && COMPORTCHANGED) { #if TESTBENCH StartupStore(_T(".... COMPORTCHANGED from configuration. ForceComPortReset @%s\n"),WhatTimeIsIt()); #endif LKForceComPortReset=true; // RestartCommPorts(); 110605 } MapWindow::ResumeDrawingThread(); // allow map and calculations threads to continue on their merry way }
void StartLogger() { HANDLE hFile; int i; TCHAR path[MAX_PATH+1]; TCHAR cAsset[3]; // strAsset is initialized with DUM. if (_tcslen(PilotName_Config)>0) { strAssetNumber[0]= IsAlphaNum(PilotName_Config[0]) ? PilotName_Config[0] : _T('A'); strAssetNumber[1]= IsAlphaNum(PilotName_Config[1]) ? PilotName_Config[1] : _T('A'); } else { strAssetNumber[0]= _T('D'); strAssetNumber[1]= _T('U'); } if (_tcslen(AircraftType_Config)>0) { strAssetNumber[2]= IsAlphaNum(AircraftType_Config[0]) ? AircraftType_Config[0] : _T('A'); } else { strAssetNumber[2]= _T('M'); } strAssetNumber[0]= towupper(strAssetNumber[0]); strAssetNumber[1]= towupper(strAssetNumber[1]); strAssetNumber[2]= towupper(strAssetNumber[2]); strAssetNumber[3]= _T('\0'); for (i=0; i < 3; i++) { // chars must be legal in file names cAsset[i] = IsAlphaNum(strAssetNumber[i]) ? strAssetNumber[i] : _T('A'); } LocalPath(path,TEXT(LKD_LOGS)); if (TaskModified) { SaveDefaultTask(); } wsprintf(szLoggerFileName, TEXT("%s\\LOGGER_TMP.IGC"), path); wsprintf(szSLoggerFileName, TEXT("%s\\LOGGER_SIG.IGC"), path); TCHAR newfile[MAX_PATH+20]; if (GetFileAttributes(szLoggerFileName) != 0xffffffff) { StartupStore(_T("---- Logger recovery: Existing LOGGER_TMP.IGC found, renamed to LOST%s"),NEWLINE); wsprintf(newfile, TEXT("%s\\LOST_%02d%02d%02d.IGC"), path, GPS_INFO.Hour, GPS_INFO.Minute, GPS_INFO.Second); CopyFile(szLoggerFileName,newfile,TRUE); DeleteFile(szLoggerFileName); } if (GetFileAttributes(szSLoggerFileName) != 0xffffffff) { StartupStore(_T("---- Logger recovery (G): Existing LOGGER_SIG.IGC found, renamed to LOSTG%s"),NEWLINE); wsprintf(newfile, TEXT("%s\\LOSTG_%02d%02d%02d.IGC"), path, GPS_INFO.Hour, GPS_INFO.Minute, GPS_INFO.Second); CopyFile(szSLoggerFileName,newfile,TRUE); DeleteFile(szSLoggerFileName); } for(i=1;i<99;i++) { // 2003-12-31-XXX-987-01.IGC // long filename form of IGC file. // XXX represents manufacturer code if (!LoggerShortName) { // Long file name wsprintf(szFLoggerFileName, TEXT("%s\\%04d-%02d-%02d-%s-%c%c%c-%02d.IGC"), path, GPS_INFO.Year, GPS_INFO.Month, GPS_INFO.Day, _T(LOGGER_MANUFACTURER), cAsset[0], cAsset[1], cAsset[2], i); wsprintf(szFLoggerFileNameRoot, TEXT("%s\\%04d-%02d-%02d-%s-%c%c%c-%02d.IGC"), TEXT(""), // this creates it in root if MoveFile() fails GPS_INFO.Year, GPS_INFO.Month, GPS_INFO.Day, _T(LOGGER_MANUFACTURER), cAsset[0], cAsset[1], cAsset[2], i); } else { // Short file name TCHAR cyear, cmonth, cday, cflight; cyear = NumToIGCChar((int)GPS_INFO.Year % 10); cmonth = NumToIGCChar(GPS_INFO.Month); cday = NumToIGCChar(GPS_INFO.Day); cflight = NumToIGCChar(i); wsprintf(szFLoggerFileName, TEXT("%s\\%c%c%cX%c%c%c%c.IGC"), path, cyear, cmonth, cday, cAsset[0], cAsset[1], cAsset[2], cflight); wsprintf(szFLoggerFileNameRoot, TEXT("%s\\%c%c%cX%c%c%c%c.IGC"), TEXT(""), // this creates it in root if MoveFile() fails cyear, cmonth, cday, cAsset[0], cAsset[1], cAsset[2], cflight); } // end if hFile = CreateFile(szFLoggerFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); if(hFile!=INVALID_HANDLE_VALUE ) { // file already exists CloseHandle(hFile); DeleteFile(szFLoggerFileName); break; } } // end while StartupStore(_T(". Logger Started %s File <%s>%s"), WhatTimeIsIt(), szFLoggerFileName,NEWLINE); return; }