static void TestTasman() { NMEAParser parser; NMEAInfo nmea_info; nmea_info.Reset(); nmea_info.clock = fixed(1); ok1(parser.ParseLine("$PTAS1,200,200,02426,000*25", nmea_info)); ok1(nmea_info.total_energy_vario_available); ok1(equals(nmea_info.total_energy_vario, fixed(0))); ok1(nmea_info.pressure_altitude_available); ok1(equals(nmea_info.pressure_altitude, Units::ToSysUnit(fixed(426), Unit::FEET))); ok1(nmea_info.airspeed_available); ok1(equals(nmea_info.true_airspeed, fixed(0))); ok1(parser.ParseLine("$PTAS1,234,000,00426,062*26", nmea_info)); ok1(nmea_info.total_energy_vario_available); ok1(equals(nmea_info.total_energy_vario, Units::ToSysUnit(fixed(3.4), Unit::KNOTS))); ok1(nmea_info.pressure_altitude_available); ok1(equals(nmea_info.pressure_altitude, Units::ToSysUnit(fixed(-1574), Unit::FEET))); ok1(nmea_info.airspeed_available); ok1(equals(nmea_info.true_airspeed, Units::ToSysUnit(fixed(62), Unit::KNOTS))); }
static void TestVega() { NullPort null; Device *device = vega_driver.CreateOnPort(dummy_config, null); ok1(device != NULL); NMEAInfo nmea_info; nmea_info.Reset(); nmea_info.clock = fixed(1); /* enable FLARM mode (switches the $PGRMZ parser to pressure altitude) */ NMEAParser parser; ok1(parser.ParseLine("$PFLAU,0,0,0,1,0,,0,,*63", nmea_info)); ok1(parser.ParseLine("$PGRMZ,2447,F,2*0F", nmea_info)); ok1(nmea_info.pressure_altitude_available); ok1(equals(nmea_info.pressure_altitude, 745.845)); ok1(device->ParseNMEA("$PDSWC,0,1002000,100,115*54", nmea_info)); ok1(nmea_info.settings.mac_cready_available); ok1(equals(nmea_info.settings.mac_cready, 0)); ok1(nmea_info.voltage_available); ok1(equals(nmea_info.voltage, 11.5)); ok1(device->ParseNMEA("$PDVDV,1,0,1062,762,9252,0*5B", nmea_info)); ok1(nmea_info.total_energy_vario_available); ok1(equals(nmea_info.total_energy_vario, 0.1)); ok1(nmea_info.airspeed_available); ok1(equals(nmea_info.true_airspeed, 0)); ok1(equals(nmea_info.indicated_airspeed, 0)); ok1(!nmea_info.static_pressure_available); ok1(!nmea_info.baro_altitude_available); ok1(nmea_info.pressure_altitude_available); ok1(equals(nmea_info.pressure_altitude, 762)); /* parse $PGRMZ again, it should be ignored */ ok1(parser.ParseLine("$PGRMZ,2447,F,2*0F", nmea_info)); ok1(nmea_info.pressure_altitude_available); ok1(equals(nmea_info.pressure_altitude, 762)); delete device; }
static void TestGeneric() { NMEAParser parser; NMEAInfo nmea_info; nmea_info.Reset(); nmea_info.clock = fixed(1); nmea_info.alive.Update(nmea_info.clock); /* no GPS reception */ ok1(parser.ParseLine("$GPRMC,082310,V,,,,,230610*3f", nmea_info)); ok1(nmea_info.alive); ok1(!nmea_info.location_available); ok1(nmea_info.date_time_utc.year == 2010); ok1(nmea_info.date_time_utc.month == 6); ok1(nmea_info.date_time_utc.day == 23); ok1(nmea_info.date_time_utc.hour == 8); ok1(nmea_info.date_time_utc.minute == 23); ok1(nmea_info.date_time_utc.second == 10); /* got a GPS fix */ ok1(parser.ParseLine("$GPRMC,082311,A,5103.5403,N,00741.5742,E,055.3,022.4,230610,000.3,W*6C", nmea_info)); ok1(nmea_info.alive); ok1(nmea_info.location_available); ok1(nmea_info.date_time_utc.hour == 8); ok1(nmea_info.date_time_utc.minute == 23); ok1(nmea_info.date_time_utc.second == 11); ok1(equals(nmea_info.location.longitude, 7.693)); ok1(equals(nmea_info.location.latitude, 51.059)); ok1(!nmea_info.baro_altitude_available); /* baro altitude (proprietary Garmin sentence) */ ok1(parser.ParseLine("$PGRMZ,100,m,3*11", nmea_info)); ok1(nmea_info.baro_altitude_available); ok1(equals(nmea_info.baro_altitude, 100)); }
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; }
bool DebugReplayNMEA::Next() { last_basic = basic; last_calculated = calculated; const char *line; while ((line = reader->read()) != NULL) { if (basic.time_available) basic.clock = basic.time; if (device == NULL || !device->ParseNMEA(line, basic)) parser.ParseLine(line, basic); if (basic.location_available != last_basic.location_available) { Compute(); return true; } } return false; }
static void TestFLARM() { NMEAParser parser; NMEAInfo nmea_info; nmea_info.Reset(); nmea_info.clock = fixed(1); ok1(parser.ParseLine("$PFLAU,3,1,1,1,0*50", nmea_info)); ok1(nmea_info.flarm.status.rx == 3); ok1(nmea_info.flarm.status.tx); ok1(nmea_info.flarm.status.gps == FlarmStatus::GPSStatus::GPS_2D); ok1(nmea_info.flarm.status.alarm_level == FlarmTraffic::AlarmType::NONE); ok1(nmea_info.flarm.traffic.GetActiveTrafficCount() == 0); ok1(!nmea_info.flarm.traffic.new_traffic); ok1(parser.ParseLine("$PFLAA,0,100,-150,10,2,DDA85C,123,13,24,1.4,2*7f", nmea_info)); ok1(nmea_info.flarm.traffic.new_traffic); ok1(nmea_info.flarm.traffic.GetActiveTrafficCount() == 1); FlarmId id = FlarmId::Parse("DDA85C", NULL); FlarmTraffic *traffic = nmea_info.flarm.traffic.FindTraffic(id); if (ok1(traffic != NULL)) { ok1(traffic->valid); ok1(traffic->alarm_level == FlarmTraffic::AlarmType::NONE); ok1(equals(traffic->relative_north, 100)); ok1(equals(traffic->relative_east, -150)); ok1(equals(traffic->relative_altitude, 10)); ok1(equals(traffic->track, 123)); ok1(traffic->track_received); ok1(equals(traffic->turn_rate, 13)); ok1(traffic->turn_rate_received); ok1(equals(traffic->speed, 24)); ok1(traffic->speed_received); ok1(equals(traffic->climb_rate, 1.4)); ok1(traffic->climb_rate_received); ok1(traffic->type == FlarmTraffic::AircraftType::TOW_PLANE); ok1(!traffic->stealth); } else { skip(16, 0, "traffic == NULL"); } ok1(parser.ParseLine("$PFLAA,2,20,10,24,2,DEADFF,,,,,1*46", nmea_info)); ok1(nmea_info.flarm.traffic.GetActiveTrafficCount() == 2); id = FlarmId::Parse("DEADFF", NULL); traffic = nmea_info.flarm.traffic.FindTraffic(id); if (ok1(traffic != NULL)) { ok1(traffic->valid); ok1(traffic->alarm_level == FlarmTraffic::AlarmType::IMPORTANT); ok1(equals(traffic->relative_north, 20)); ok1(equals(traffic->relative_east, 10)); ok1(equals(traffic->relative_altitude, 24)); ok1(!traffic->track_received); ok1(!traffic->turn_rate_received); ok1(!traffic->speed_received); ok1(!traffic->climb_rate_received); ok1(traffic->type == FlarmTraffic::AircraftType::GLIDER); ok1(traffic->stealth); } else { skip(12, 0, "traffic == NULL"); } ok1(parser.ParseLine("$PFLAA,0,1206,574,21,2,DDAED5,196,,32,1.0,1*10", nmea_info)); ok1(nmea_info.flarm.traffic.GetActiveTrafficCount() == 3); id = FlarmId::Parse("DDAED5", NULL); traffic = nmea_info.flarm.traffic.FindTraffic(id); if (ok1(traffic != NULL)) { ok1(traffic->valid); ok1(traffic->alarm_level == FlarmTraffic::AlarmType::NONE); ok1(equals(traffic->relative_north, 1206)); ok1(equals(traffic->relative_east, 574)); ok1(equals(traffic->relative_altitude, 21)); ok1(equals(traffic->track, 196)); ok1(traffic->track_received); ok1(!traffic->turn_rate_received); ok1(equals(traffic->speed, 32)); ok1(traffic->speed_received); ok1(equals(traffic->climb_rate, 1.0)); ok1(traffic->climb_rate_received); ok1(traffic->type == FlarmTraffic::AircraftType::GLIDER); ok1(!traffic->stealth); } else { skip(15, 0, "traffic == NULL"); } }