int main(int argc, char **argv) { NarrowString<1024> usage; usage = "DRIVER\n\n" "Where DRIVER is one of:"; { const DeviceRegister *driver; for (unsigned i = 0; (driver = GetDriverByIndex(i)) != nullptr; ++i) { WideToUTF8Converter driver_name(driver->name); usage.AppendFormat("\n\t%s", (const char *)driver_name); } } Args args(argc, argv, usage); tstring driver_name = args.ExpectNextT(); args.ExpectEnd(); driver = FindDriverByName(driver_name.c_str()); if (driver == nullptr) { _ftprintf(stderr, _T("No such driver: %s\n"), driver_name.c_str()); return 1; } DeviceConfig config; config.Clear(); NullPort port; Device *device = driver->CreateOnPort != nullptr ? driver->CreateOnPort(config, port) : nullptr; NMEAParser parser; NMEAInfo data; data.Reset(); char buffer[1024]; while (fgets(buffer, sizeof(buffer), stdin) != nullptr) { StripRight(buffer); if (device == nullptr || !device->ParseNMEA(buffer, data)) parser.ParseLine(buffer, data); } Dump(data); return EXIT_SUCCESS; }
static void TestLXV7() { NullPort null; Device *device = lx_driver.CreateOnPort(dummy_config, null); ok1(device != NULL); NMEAInfo basic; basic.Reset(); basic.clock = fixed(1); LXDevice &lx_device = *(LXDevice *)device; lx_device.ResetDeviceDetection(); ok1(device->ParseNMEA("$PLXVF,,1.00,0.87,-0.12,-0.25,90.2,244.3,*64", basic)); ok1(basic.netto_vario_available); ok1(equals(basic.netto_vario, -0.25)); ok1(basic.airspeed_available); ok1(equals(basic.indicated_airspeed, 90.2)); ok1(basic.pressure_altitude_available); ok1(equals(basic.pressure_altitude, 244.3)); ok1(lx_device.IsV7()); lx_device.ResetDeviceDetection(); ok1(device->ParseNMEA("$PLXVS,23.1,0,12.3,*71", basic)); ok1(basic.temperature_available); ok1(equals(basic.temperature, 296.25)); ok1(basic.switch_state.flight_mode == SwitchState::FlightMode::CIRCLING); ok1(basic.voltage_available); ok1(equals(basic.voltage, 12.3)); ok1(lx_device.IsV7()); delete device; }
static bool test_replay() { Directory::Create(Path(_T("output/results"))); std::ofstream f("output/results/res-sample.txt"); GlidePolar glide_polar(4.0); Waypoints waypoints; AircraftState state_last; TaskBehaviour task_behaviour; task_behaviour.SetDefaults(); task_behaviour.auto_mc = true; TaskManager task_manager(task_behaviour, waypoints); TaskEventsPrint default_events(verbose); task_manager.SetTaskEvents(default_events); glide_polar.SetBallast(1.0); task_manager.SetGlidePolar(glide_polar); OrderedTask* t = task_load(task_behaviour); if (t) { task_manager.Commit(*t); delete t; task_manager.Resume(); } else { return false; } // task_manager.get_task_advance().get_advance_state() = TaskAdvance::AUTO; Error error; FileLineReaderA *reader = new FileLineReaderA(replay_file, error); if (reader->error()) { delete reader; fprintf(stderr, "%s\n", error.GetMessage()); return false; } ReplayLoggerSim sim(reader); sim.state.netto_vario = 0; bool do_print = verbose; unsigned print_counter=0; NMEAInfo basic; basic.Reset(); while (sim.Update(basic) && !sim.started) { } state_last = sim.state; sim.state.wind.norm = 7; sim.state.wind.bearing = Angle::Degrees(330); auto time_last = sim.state.time; // uncomment this to manually go to first tp // task_manager.incrementActiveTaskPoint(1); FlyingComputer flying_computer; flying_computer.Reset(); FlyingState flying_state; flying_state.Reset(); while (sim.Update(basic)) { if (sim.state.time>time_last) { n_samples++; flying_computer.Compute(glide_polar.GetVTakeoff(), sim.state, sim.state.time - time_last, flying_state); sim.state.flying = flying_state.flying; task_manager.Update(sim.state, state_last); task_manager.UpdateIdle(sim.state); task_manager.UpdateAutoMC(sim.state, 0); task_manager.SetTaskAdvance().SetArmed(true); state_last = sim.state; if (verbose>1) { sim.print(f); f.flush(); } if (do_print) { PrintHelper::taskmanager_print(task_manager, sim.state); } do_print = (++print_counter % output_skip ==0) && verbose; } time_last = sim.state.time; }; if (verbose) { PrintDistanceCounts(); printf("# task elapsed %d (s)\n", (int)task_manager.GetStats().total.time_elapsed); printf("# task speed %3.1f (kph)\n", (int)task_manager.GetStats().total.travelled.GetSpeed()*3.6); printf("# travelled distance %4.1f (km)\n", (double)task_manager.GetStats().total.travelled.GetDistance()/1000.0); printf("# scored distance %4.1f (km)\n", (double)task_manager.GetStats().distance_scored/1000.0); if (task_manager.GetStats().total.time_elapsed > 0) { printf("# scored speed %3.1f (kph)\n", (double)task_manager.GetStats().distance_scored/(double)task_manager.GetStats().total.time_elapsed*3.6); } } return true; }
int main(int argc, char *argv[]) { Args args(argc, argv, "HOST KEY"); const char *host = args.ExpectNext(); const char *key = args.ExpectNext(); SocketAddress address; if (!address.Lookup(host, "5597", SOCK_DGRAM)) { fprintf(stderr, "Failed to look up: %s\n", host); return EXIT_FAILURE; } #ifdef HAVE_SKYLINES_TRACKING_HANDLER InitialiseIOThread(); #endif SkyLinesTracking::Client client; #ifdef HAVE_SKYLINES_TRACKING_HANDLER client.SetIOThread(io_thread); Handler handler; client.SetHandler(&handler); #endif client.SetKey(ParseUint64(key, NULL, 16)); if (!client.Open(address)) { fprintf(stderr, "Failed to create client\n"); return EXIT_FAILURE; } if (args.IsEmpty() || StringIsEqual(args.PeekNext(), "fix")) { NMEAInfo basic; basic.Reset(); basic.UpdateClock(); basic.time = fixed(1); basic.time_available.Update(basic.clock); return client.SendFix(basic) ? EXIT_SUCCESS : EXIT_FAILURE; } else if (StringIsEqual(args.PeekNext(), "ping")) { client.SendPing(1); #ifdef HAVE_SKYLINES_TRACKING_HANDLER handler.Wait(); #endif } else if (StringIsEqual(args.PeekNext(), "traffic")) { client.SendTrafficRequest(true, true); #ifdef HAVE_SKYLINES_TRACKING_HANDLER handler.Wait(); #endif } else { DebugReplay *replay = CreateDebugReplay(args); if (replay == NULL) return EXIT_FAILURE; while (replay->Next()) { client.SendFix(replay->Basic()); usleep(100000); } } #ifdef HAVE_SKYLINES_TRACKING_HANDLER client.Close(); DeinitialiseIOThread(); #endif return EXIT_SUCCESS; }
static bool test_replay_retrospective() { Directory::Create(_T("output/results")); std::ofstream f("output/results/res-sample.txt"); Waypoints waypoints; WaypointReader w(waypoint_file.c_str(), 0); if (!ok1(!w.Error())) { printf("# waypoint file %s\n", waypoint_file.c_str()); skip(2, 0, "opening waypoint file failed"); return false; } NullOperationEnvironment operation; if(!ok1(w.Parse(waypoints, operation))) { skip(1, 0, "parsing waypoint file failed"); return false; } waypoints.Optimise(); ok1(!waypoints.IsEmpty()); Retrospective retro(waypoints); retro.search_range = range_threshold; retro.angle_tolerance = Angle::Degrees(autopilot_parms.bearing_noise); FileLineReaderA *reader = new FileLineReaderA(replay_file.c_str()); if (reader->error()) { delete reader; return false; } waypoints.Optimise(); IgcReplay sim(reader); NMEAInfo basic; basic.Reset(); while (sim.Update(basic)) { n_samples++; if (retro.UpdateSample(basic.location)) { std::ofstream g("output/results/res-retro.txt"); // report task auto candidate_list = retro.getNearWaypointList(); for (auto it = candidate_list.begin(); it != candidate_list.end(); ++it) { const Waypoint& wp = it->waypoint; g << (double)wp.location.longitude.Degrees() << " " << (double)wp.location.latitude.Degrees() << " " << "\"" << wp.name << "\"\n"; } } f << (double)basic.time << " " << (double)basic.location.longitude.Degrees() << " " << (double)basic.location.latitude.Degrees() << "\n"; f.flush(); }; double d_ach, d_can; retro.CalcDistances(d_ach, d_can); printf("# distances %f %f\n", (double)d_ach, (double)d_can); printf("# size %d\n", retro.getNearWaypointList().size()); return true; }