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(); }
// // Reinit screen upon resolution/orientation change detected // // Test is possible from VirtualKeys.cpp, activating the customkey at line 229 // In this case, enable a testbench development option. // void ReinitScreen(void) { static int oldSCREENWIDTH=0; static int oldSCREENHEIGHT=0; RECT WindowSize, rc; // This is needed to hide any menu currently on, as first thing. InputEvents::setMode(TEXT("default")); #if TESTBENCH StartupStore(_T("... ChangeScreen suspending Draw Thread\n")); #endif MapWindow::SuspendDrawingThread(); // MapWndProc will get a WM_SIZE // // Detect the current screen geometry // #if (WINDOWSPC>0) // For PC we assume that the desired resolution is in SCREENxx WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = SCREENWIDTH; WindowSize.bottom = SCREENHEIGHT; #else WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = GetSystemMetrics(SM_CXSCREEN); WindowSize.bottom = GetSystemMetrics(SM_CYSCREEN); #endif // // ----------- DEVELOPMENT TESTBENCH OPTIONS ------------- // #if 0 // Force a test resolution, for testing only! // Using always the same resolution will not work when asking for the same resolution again. // dont know why (yet)... WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = 480; WindowSize.bottom = 272; #endif #if 0 // Simulate changin one resolution to another static bool vhflip=true; if (vhflip) { WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = 480; WindowSize.bottom = 272; vhflip=false; } else { WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = 800; WindowSize.bottom = 480; vhflip=true;; } #endif #if 0 // Simulate Portrait<>Landscape flip/flop WindowSize.left = 0; WindowSize.top = 0; WindowSize.right = SCREENHEIGHT; WindowSize.bottom = SCREENWIDTH; #endif // // --------------------------------------------------------- // if (oldSCREENWIDTH!=WindowSize.right || oldSCREENHEIGHT!=WindowSize.bottom) { #if TESTBENCH StartupStore(_T(".... CHANGING RESOLUTION\n")); #endif #if (WINDOWSPC>0) SCREENWIDTH = WindowSize.right; SCREENHEIGHT= WindowSize.bottom; #endif oldSCREENWIDTH = WindowSize.right; oldSCREENHEIGHT= WindowSize.bottom; } else { // THIS DOES NOT STILL WORK! NO EFFECT. #if TESTBENCH StartupStore(_T(".... CHANGE RESOLUTION, SAME SIZE, WM_SIZE FORCED\n")); #endif #if (WINDOWSPC>0) SCREENWIDTH = WindowSize.right; SCREENHEIGHT= WindowSize.bottom; #endif SendMessage(hWndMapWindow, WM_SIZE, (WPARAM)SIZE_RESTORED, MAKELPARAM(0,0)); } #if (WINDOWSPC>0) WindowSize.right = SCREENWIDTH + 2*GetSystemMetrics( SM_CXFIXEDFRAME); WindowSize.left = (GetSystemMetrics(SM_CXSCREEN) - WindowSize.right) / 2; WindowSize.bottom = SCREENHEIGHT + 2*GetSystemMetrics( SM_CYFIXEDFRAME) + GetSystemMetrics(SM_CYCAPTION); WindowSize.top = (GetSystemMetrics(SM_CYSCREEN) - WindowSize.bottom) / 2; // We must consider the command bar size on PC window MoveWindow(hWndMainWindow, WindowSize.left, WindowSize.top, WindowSize.right, WindowSize.bottom, TRUE); MoveWindow(hWndMapWindow, 0, 0, SCREENWIDTH, SCREENHEIGHT, FALSE); // also TRUE? #else // Still to be tested! MoveWindow(hWndMainWindow, WindowSize.left, WindowSize.top, WindowSize.right, WindowSize.bottom, TRUE); MoveWindow(hWndMapWindow, 0, 0, WindowSize.right, WindowSize.bottom, FALSE); #endif GetClientRect(hWndMainWindow, &rc); #if (WINDOWSPC>0) rc.left = 0; rc.right = SCREENWIDTH; rc.top = 0; rc.bottom = SCREENHEIGHT; #endif InitLKScreen(); LKSW_ReloadProfileBitmaps=true; LKObjects_Delete(); LKObjects_Create(); ButtonLabel::Destroy(); ButtonLabel::CreateButtonLabels(rc); extern void InitialiseFonts(RECT rc); InitialiseFonts(rc); InitLKFonts(); ButtonLabel::SetFont(MapWindowBoldFont); Message::Destroy(); Message::Initialize(rc); // creates window, sets fonts LockTerrainDataGraphics(); CloseTerrainRenderer(); UnlockTerrainDataGraphics(); Reset_Single_DoInits(MDI_DRAWLOOK8000); Reset_Single_DoInits(MDI_DRAWTRI); Reset_Single_DoInits(MDI_DRAWHSI); Reset_Single_DoInits(MDI_DRAWASPNEAREST); Reset_Single_DoInits(MDI_DRAWCOMMON); Reset_Single_DoInits(MDI_DRAWFLARMTRAFFIC); Reset_Single_DoInits(MDI_DRAWINFOPAGE); Reset_Single_DoInits(MDI_WRITEINFO); Reset_Single_DoInits(MDI_DRAWLOOK8000); Reset_Single_DoInits(MDI_DRAWMAPSPACE); Reset_Single_DoInits(MDI_DRAWNEAREST); Reset_Single_DoInits(MDI_DRAWTARGET); Reset_Single_DoInits(MDI_DRAWTHERMALHISTORY); Reset_Single_DoInits(MDI_DRAWTRAFFIC); Reset_Single_DoInits(MDI_DRAWVARIO); Reset_Single_DoInits(MDI_PROCESSVIRTUALKEY); Reset_Single_DoInits(MDI_ONPAINTLISTITEM); Reset_Single_DoInits(MDI_DRAWMAPSCALE); Reset_Single_DoInits(MDI_MAPWPLABELADD); Reset_Single_DoInits(MDI_CHECKLABELBLOCK); Reset_Single_DoInits(MDI_LKPROCESS); Reset_Single_DoInits(MDI_COMPASS); Reset_Single_DoInits(MDI_LOOKABLEND); Reset_Single_DoInits(MDI_MAPWPVECTORS); Reset_Single_DoInits(MDI_MAPASP); Reset_Single_DoInits(MDI_MAPRADAR); // doing nothing reallt Reset_Single_DoInits(MDI_FLARMRADAR); Reset_Single_DoInits(MDI_MAPWNDPROC); Reset_Single_DoInits(MDI_DRAWBOTTOMBAR); Reset_Single_DoInits(MDI_DRAWTASK); #if TESTBENCH StartupStore(_T("... ChangeScreen resuming Draw Thread\n")); #endif MapWindow::ResumeDrawingThread(); ShowWindow(hWndMainWindow, SW_SHOWNORMAL); BringWindowToTop(hWndMainWindow); return; }