static inline const char* wind_name(int n_wind) { static char buffer[80]; sprintf(buffer,"%d m/s @ %d", (int)wind_to_mag(n_wind), (int)wind_to_dir(n_wind).Degrees()); return buffer; }
TestFlightResult run_flight(TestFlightComponents components, TaskManager &task_manager, const AutopilotParameters &parms, const int n_wind, const double speed_factor) { AircraftStateFilter *aircraft_filter = components.aircraft_filter; Airspaces *airspaces = components.airspaces; TestFlightResult result; TaskAccessor ta(task_manager, fixed_300); PrintTaskAutoPilot autopilot(parms); AircraftSim aircraft; autopilot.SetDefaultLocation(GeoPoint(Angle::Degrees(1), Angle::Degrees(0))); unsigned print_counter=0; if (n_wind) aircraft.SetWind(wind_to_mag(n_wind), wind_to_dir(n_wind)); autopilot.SetSpeedFactor(fixed(speed_factor)); Directory::Create(_T("output/results")); std::ofstream f4("output/results/res-sample.txt"); std::ofstream f5("output/results/res-sample-filtered.txt"); bool do_print = verbose; bool first = true; static const fixed fixed_10(10); const AirspaceAircraftPerformance perf(task_manager.GetGlidePolar()); if (aircraft_filter) aircraft_filter->Reset(aircraft.GetState()); autopilot.Start(ta); aircraft.Start(autopilot.location_start, autopilot.location_previous, parms.start_alt); AirspaceWarningManager *airspace_warnings; if (airspaces) { airspace_warnings = new AirspaceWarningManager(*airspaces); airspace_warnings->Reset(aircraft.GetState()); } else { airspace_warnings = NULL; } do { if ((task_manager.GetActiveTaskPointIndex() == 1) && first && (task_manager.GetStats().total.time_elapsed > fixed_10)) { result.time_remaining = (double)task_manager.GetStats().total.time_remaining_now; first = false; result.time_planned = (double)task_manager.GetStats().total.time_planned; if (verbose > 1) { printf("# time remaining %g\n", result.time_remaining); printf("# time planned %g\n", result.time_planned); } } if (do_print) { PrintHelper::taskmanager_print(task_manager, aircraft.GetState()); const AircraftState state = aircraft.GetState(); f4 << state.time << " " << state.location.longitude << " " << state.location.latitude << " " << state.altitude << "\n"; f4.flush(); if (aircraft_filter) { f5 << aircraft_filter->GetSpeed() << " " << aircraft_filter->GetBearing() << " " << aircraft_filter->GetClimbRate() << "\n"; f5.flush(); } } if (airspaces) { scan_airspaces(aircraft.GetState(), *airspaces, perf, do_print, autopilot.GetTarget(ta)); } if (airspace_warnings) { if (verbose > 1) { bool warnings_updated = airspace_warnings->Update(aircraft.GetState(), task_manager.GetGlidePolar(), task_manager.GetStats(), false, 1); if (warnings_updated) { printf("# airspace warnings updated, size %d\n", (int)airspace_warnings->size()); print_warnings(*airspace_warnings); WaitPrompt(); } } } n_samples++; do_print = (++print_counter % output_skip == 0) && verbose; if (aircraft_filter) aircraft_filter->Update(aircraft.GetState()); autopilot.UpdateState(ta, aircraft.GetState()); aircraft.Update(autopilot.heading); { const AircraftState state = aircraft.GetState(); const AircraftState state_last = aircraft.GetLastState(); task_manager.Update(state, state_last); task_manager.UpdateIdle(state); task_manager.UpdateAutoMC(state, fixed(0)); } } while (autopilot.UpdateAutopilot(ta, aircraft.GetState())); if (verbose) { PrintHelper::taskmanager_print(task_manager, aircraft.GetState()); const AircraftState state = aircraft.GetState(); f4 << state.time << " " << state.location.longitude << " " << state.location.latitude << " " << state.altitude << "\n"; f4 << "\n"; f4.flush(); task_report(task_manager, "end of task\n"); } WaitPrompt(); result.time_elapsed = (double)task_manager.GetStats().total.time_elapsed; result.time_planned = (double)task_manager.GetStats().total.time_planned; result.calc_cruise_efficiency = (double)task_manager.GetStats().cruise_efficiency; result.calc_effective_mc = (double)task_manager.GetStats().effective_mc; if (verbose) PrintDistanceCounts(); if (airspace_warnings) delete airspace_warnings; result.result = true; return result; }
bool run_flight(TaskManager &task_manager, const AutopilotParameters &parms, const int n_wind, const double speed_factor) { DirectTaskAccessor ta(task_manager); PrintTaskAutoPilot autopilot(parms); AircraftSim aircraft; autopilot.set_default_location(GeoPoint(Angle::degrees(fixed(1.0)), Angle::degrees(fixed(0.0)))); unsigned print_counter=0; if (n_wind) aircraft.set_wind(wind_to_mag(n_wind), wind_to_dir(n_wind)); autopilot.set_speed_factor(fixed(speed_factor)); std::ofstream f4("results/res-sample.txt"); std::ofstream f5("results/res-sample-filtered.txt"); bool do_print = verbose; bool first = true; time_elapsed = 0.0; time_planned = 1.0; time_remaining = 0; calc_cruise_efficiency = 1.0; calc_effective_mc = 1.0; static const fixed fixed_10(10); AirspaceAircraftPerformanceGlide perf(task_manager.get_glide_polar()); if (aircraft_filter) aircraft_filter->Reset(aircraft.get_state()); autopilot.Start(ta); aircraft.Start(autopilot.location_start, autopilot.location_previous, parms.start_alt); if (airspaces) { airspace_warnings = new AirspaceWarningManager(*airspaces, task_manager); airspace_warnings->reset(aircraft.get_state()); } do { if ((task_manager.getActiveTaskPointIndex() == 1) && first && (task_manager.get_stats().total.time_elapsed > fixed_10)) { time_remaining = task_manager.get_stats().total.time_remaining; first = false; time_planned = task_manager.get_stats().total.time_planned; if (verbose > 1) { printf("# time remaining %g\n", time_remaining); printf("# time planned %g\n", time_planned); } } if (do_print) { PrintHelper::taskmanager_print(task_manager, aircraft.get_state()); const AircraftState state = aircraft.get_state(); f4 << state.time << " " << state.location.Longitude << " " << state.location.Latitude << " " << state.altitude << "\n"; f4.flush(); if (aircraft_filter) { f5 << aircraft_filter->GetSpeed() << " " << aircraft_filter->GetBearing() << " " << aircraft_filter->GetClimbRate() << "\n"; f5.flush(); } } if (airspaces) { scan_airspaces(aircraft.get_state(), *airspaces, perf, do_print, autopilot.target(ta)); } if (airspace_warnings) { if (verbose > 1) { bool warnings_updated = airspace_warnings->update(aircraft.get_state(), false, 1); if (warnings_updated) { printf("# airspace warnings updated, size %d\n", (int)airspace_warnings->size()); print_warnings(); wait_prompt(); } } } n_samples++; do_print = (++print_counter % output_skip == 0) && verbose; if (aircraft_filter) aircraft_filter->Update(aircraft.get_state()); autopilot.update_state(ta, aircraft.get_state()); aircraft.Update(autopilot.heading); { const AircraftState state = aircraft.get_state(); const AircraftState state_last = aircraft.get_state_last(); task_manager.update(state, state_last); task_manager.update_idle(state); task_manager.update_auto_mc(state, fixed_zero); } } while (autopilot.update_autopilot(ta, aircraft.get_state(), aircraft.get_state_last())); aircraft.Stop(); autopilot.Stop(); if (verbose) { PrintHelper::taskmanager_print(task_manager, aircraft.get_state()); const AircraftState state = aircraft.get_state(); f4 << state.time << " " << state.location.Longitude << " " << state.location.Latitude << " " << state.altitude << "\n"; f4 << "\n"; f4.flush(); task_report(task_manager, "end of task\n"); } wait_prompt(); time_elapsed = task_manager.get_stats().total.time_elapsed; time_planned = task_manager.get_stats().total.time_planned; calc_cruise_efficiency = task_manager.get_stats().cruise_efficiency; calc_effective_mc = task_manager.get_stats().effective_mc; if (verbose) distance_counts(); if (airspace_warnings) delete airspace_warnings; return true; }