void ProcessTimer::Process(void) { CommonProcessTimer(); if (!is_simulator()) { // now check GPS status devTick(CommonInterface::Calculated()); static int itimeout = -1; itimeout++; // also service replay logger if (replay && replay->Update()) { if (CommonInterface::MovementDetected()) replay->Stop(); return; } if (itimeout % 10 == 0) // check connection status every 5 seconds itimeout = ConnectionProcessTimer(itimeout); } else { static PeriodClock m_clock; if (m_clock.elapsed() < 0) m_clock.update(); if (replay && replay->Update()) { m_clock.update(); } else if (m_clock.elapsed() >= 1000) { m_clock.update(); device_blackboard->ProcessSimulation(); } } #ifdef HAVE_TRACKING if (tracking != NULL && CommonInterface::Basic().gps.real) { tracking->SetSettings(CommonInterface::GetComputerSettings().tracking); tracking->OnTimer(CommonInterface::Basic(), CommonInterface::Calculated()); } #endif }
void ProcessTimer::Process(void) { CommonProcessTimer(); if (!is_simulator()) { // now check GPS status devTick(); static int itimeout = -1; itimeout++; // also service replay logger if (replay.Update()) { if (Basic().gps.MovementDetected && !replay.NmeaReplayEnabled()) replay.Stop(); device_blackboard.RaiseConnection(); device_blackboard.SetNAVWarning(false); return; } if (itimeout % 10 == 0) // check connection status every 5 seconds itimeout = ConnectionProcessTimer(itimeout); } else { static PeriodClock m_clock; if (m_clock.elapsed() < 0) m_clock.update(); if (replay.Update()) { m_clock.update(); } else if (m_clock.elapsed() >= 1000) { m_clock.update(); device_blackboard.ProcessSimulation(); TriggerGPSUpdate(); device_blackboard.RaiseConnection(); } } }
/** * Process slow calculations. Called by the CalculationThread. */ void GlideComputer::ProcessIdle() { PeriodClock clock; clock.update(); // Log GPS fixes for internal usage // (snail trail, stats, olc, ...) DoLogging(); GlideComputerAirData::ProcessIdle(); GlideComputerTask::ProcessIdle(); SetCalculated().time_process_idle = clock.elapsed(); }
void WorkerThread::Run() { PeriodClock clock; while (true) { /* wait for work */ event_trigger.Wait(); /* got the "stop" trigger? */ if (delay > 0 ? WaitForStopped(delay) : CheckStoppedOrSuspended()) break; /* reset the trigger here, because our client might have called Trigger() a few more times while we were suspended in CheckStoppedOrSuspended() */ event_trigger.Reset(); if (IsCommandPending()) { /* just in case we got another suspend/stop command after CheckStoppedOrSuspended() returned and before the trigger got reset: restore the trigger and skip this iteration, to fix the race condition */ event_trigger.Signal(); continue; } /* do the actual work */ if (period_min > 0) clock.update(); Tick(); unsigned idle = idle_min; if (period_min > 0) { unsigned elapsed = clock.elapsed(); if (elapsed + idle < period_min) idle = period_min - elapsed; } if (idle > 0 && WaitForStopped(idle)) break; } }
/** * Is called by the CalculationThread and processes the received GPS data in Basic() */ bool GlideComputer::ProcessGPS() { PeriodClock clock; clock.update(); // Process basic information ProcessBasic(); // Process basic task information ProcessBasicTask(); ProcessMoreTask(); // Check if everything is okay with the gps time and process it if (!FlightTimes()) { return false; } // Process extended information ProcessVertical(); // Calculate the team code CalculateOwnTeamCode(); // Calculate the bearing and range of the teammate CalculateTeammateBearingRange(); // Calculate the bearing and range of the teammate // (if teammate is a FLARM target) FLARM_ScanTraffic(); vegavoice.Update(&Basic(), &Calculated(), SettingsComputer()); // Update the ConditionMonitors ConditionMonitorsUpdate(*this); SetCalculated().time_process_gps = clock.elapsed(); return true; }
/** * "Boots" up XCSoar * @param hInstance Instance handle * @param lpCmdLine Command line string * @return True if bootup successful, False otherwise */ bool XCSoarInterface::Startup(HINSTANCE hInstance, LPTSTR lpCmdLine) { // The title bar text TCHAR szTitle[MAX_LOADSTRING]; // Store instance handle in our global variable hInst = hInstance; // IDS_APP_TITLE = XCSoar (see XCSoar.rc) LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); //If it is already running, then focus on the window if (MainWindow::find(szTitle)) return false; // Send the SettingsMap to the DeviceBlackboard SendSettingsMap(); // Register window classes PaintWindow::register_class(hInst); MainWindow::register_class(hInst); MapWindow::register_class(hInst); // Fill the fast(co)sine table InitSineTable(); PreloadInitialisation(true); // Send the SettingsMap to the DeviceBlackboard SendSettingsMap(); // Creates the main window StartupStore(TEXT("Create main window\n")); RECT WindowSize = SystemWindowSize(); main_window.set(szTitle, WindowSize.left, WindowSize.top, WindowSize.right, WindowSize.bottom); if (!main_window.defined()) { return false; } main_window.install_timer(); // Initialize DeviceBlackboard device_blackboard.Initialise(); // Initialize Marks marks = new Marks("xcsoar-marks"); topology = new TopologyStore(marks->GetTopology()); // Show the main and map windows StartupStore(TEXT("Create map window\n")); main_window.show(); main_window.map.show(); #ifdef HAVE_ACTIVATE_INFO SHSetAppKeyWndAssoc(VK_APP1, main_window); SHSetAppKeyWndAssoc(VK_APP2, main_window); SHSetAppKeyWndAssoc(VK_APP3, main_window); SHSetAppKeyWndAssoc(VK_APP4, main_window); // Typical Record Button // Why you can't always get this to work // http://forums.devbuzz.com/m_1185/mpage_1/key_/tm.htm // To do with the fact it is a global hotkey, but you can with code above // Also APPA is record key on some systems SHSetAppKeyWndAssoc(VK_APP5, main_window); SHSetAppKeyWndAssoc(VK_APP6, main_window); #endif // Initialize main blackboard data task.ClearTask(); glide_computer.Initialise(); logger.LinkGRecordDLL(); // try to link DLL if it exists // Load the EGM96 geoid data OpenGeoid(); PreloadInitialisation(false); Profile::LoadWindFromRegistry(); // TODO TB: seems to be out of date?! CalculateNewPolarCoef(); // Calculate polar-related data and saves it to the cache StartupStore(TEXT("GlidePolar::UpdatePolar\n")); GlidePolar::UpdatePolar(false, SettingsComputer()); // Show startup info depending on device StartupInfo(); // Read the topology file(s) topology->Open(); // Read the terrain file terrain.OpenTerrain(); // Read the waypoint files ReadWayPoints(way_points, terrain); // Read and parse the airfield info file ReadAirfieldFile(); // Set the home waypoint SetHome(way_points, terrain, SetSettingsComputer(), false, true); // ReSynchronise the blackboards here since SetHome touches them ReadBlackboardBasic(device_blackboard.Basic()); terrain.ServiceFullReload(Basic().Location); // Scan for weather forecast CreateProgressDialog(gettext(TEXT("Scanning weather forecast"))); StartupStore(TEXT("RASP load\n")); RASP.ScanAll(Basic().Location); // Reads the airspace files ReadAirspace(); // Sorts the airspaces by priority SortAirspace(); // Read the FLARM details file OpenFLARMDetails(); #ifndef DISABLEAUDIOVARIO /* VarioSound_Init(); VarioSound_EnableSound(EnableSoundVario); VarioSound_SetVdead(SoundDeadband); VarioSound_SetV(0); VarioSound_SetSoundVolume(SoundVolume); */ #endif // Start the device thread(s) CreateProgressDialog(gettext(TEXT("Starting devices"))); devStartup(lpCmdLine); // Reset polar in case devices need the data StartupStore(TEXT("GlidePolar::UpdatePolar\n")); GlidePolar::UpdatePolar(true, SettingsComputer()); CreateProgressDialog(gettext(TEXT("Initialising display"))); // Finally ready to go.. all structures must be present before this. // Create the drawing thread StartupStore(TEXT("CreateDrawingThread\n")); draw_thread = new DrawThread(main_window.map, main_window.flarm); draw_thread->start(); // Show the infoboxes StartupStore(TEXT("ShowInfoBoxes\n")); InfoBoxManager::Show(); // Create the calculation thread StartupStore(TEXT("CreateCalculationThread\n")); CreateCalculationThread(); #ifdef NEWTASK { // NEWTASK PeriodClock t; t.reset(); t.update(); CreateProgressDialog(gettext(TEXT("Running test 0"))); test_newtask(0); StartupStore(TEXT("test 0 %d\n"),t.elapsed()); /* t.update(); CreateProgressDialog(gettext(TEXT("Running test 1"))); test_newtask(1); StartupStore(TEXT("test 1 %d\n"),t.elapsed()); t.update(); CreateProgressDialog(gettext(TEXT("Running test 2"))); test_newtask(2); StartupStore(TEXT("test 2 %d\n"),t.elapsed()); t.update(); CreateProgressDialog(gettext(TEXT("Running test 3"))); test_newtask(3); StartupStore(TEXT("test 3 %d\n"),t.elapsed()); t.update(); CreateProgressDialog(gettext(TEXT("Running test 4"))); test_newtask(4); StartupStore(TEXT("test 4 %d\n"),t.elapsed()); */ CreateProgressDialog(gettext(TEXT("test complete"))); } #endif // Initialise the airspace warning dialog StartupStore(TEXT("dlgAirspaceWarningInit\n")); dlgAirspaceWarningInit(); // Find unique ID of this PDA ReadAssetNumber(); StartupStore(TEXT("ProgramStarted\n")); // Give focus to the map main_window.map.set_focus(); // Start calculation thread calculation_thread->start(); // Start instrument thread instrument_thread->start(); globalRunningEvent.trigger(); return true; }