// PDTSM,duration_ms,"free text" static bool PDTSM(NMEAInputLine &line, gcc_unused NMEAInfo &info) { /* int duration = (int)strtol(String, NULL, 10); */ line.skip(); const char *message = line.rest(); #ifdef _UNICODE TCHAR buffer[strlen(message)]; if (MultiByteToWideChar(CP_ACP, 0, message, -1, buffer, ARRAY_SIZE(buffer)) <= 0) return false; #else const char *buffer = message; #endif // todo duration handling Message::AddMessage(_T("VEGA:"), buffer); return true; }
/** * Parse a "$FLYSEN" sentence. * * @see http://www.flytec.ch/public/Special%20NMEA%20sentence.pdf */ static bool FlytecParseFLYSEN(NMEAInputLine &line, NMEAInfo &info) { // Detect firmware/sentence version // // V or A in field 9 -> 3.31- // V or A in field 10 -> 3.32+ NMEAInputLine line_copy(line.rest()); line_copy.skip(8); bool has_date_field = false; char validity = line_copy.read_first_char(); if (validity != 'A' && validity != 'V') { validity = line_copy.read_first_char(); if (validity != 'A' && validity != 'V') return false; has_date_field = true; } // Date(ddmmyy), 6 Digits (only in firmware version 3.32+) if (has_date_field) line.skip(); // Time(hhmmss), 6 Digits line.skip(); if (validity == 'V') { // In case of V (void=not valid) GPS data should not be used. // GPS altitude, position and speed should be ignored. line.skip(7); } else { // Latitude(ddmm.mmm), 8 Digits incl. decimal // N (or S), 1 Digit // Longitude(dddmm.mmm), 9 Digits inc. decimal // E (or W), 1 Digit GeoPoint location; if (NMEAParser::ReadGeoPoint(line, location)) { info.location = location; info.location_available.Update(info.clock); } // Track (xxx Deg), 3 Digits fixed track; if (line.read_checked(track)) { info.track = Angle::Degrees(track); info.track_available.Update(info.clock); } // Speed over Ground (xxxxx cm/s) 5 Digits fixed ground_speed; if (line.read_checked(ground_speed)) { info.ground_speed = ground_speed / 100; info.ground_speed_available.Update(info.clock); } // GPS altitude (xxxxx meter), 5 Digits fixed gps_altitude; if (line.read_checked(gps_altitude)) { info.gps_altitude = gps_altitude; info.gps_altitude_available.Update(info.clock); } } // Validity of 3 D fix A or V, 1 Digit line.skip(); // Satellites in Use (0 to 12), 2 Digits unsigned satellites_used; if (line.read_checked(satellites_used)) { info.gps.satellites_used = satellites_used; info.gps.satellites_used_available.Update(info.clock); } // Raw pressure (xxxxxx Pa), 6 Digits fixed pressure; if (line.read_checked(pressure)) info.ProvideStaticPressure(AtmosphericPressure::Pascal(pressure)); // Baro Altitude (xxxxx meter), 5 Digits (-xxxx to xxxxx) (Based on 1013.25hPa) fixed baro_altitude; if (line.read_checked(baro_altitude)) info.ProvidePressureAltitude(baro_altitude); // Variometer (xxxx cm/s), 4 or 5 Digits (-9999 to 9999) fixed vario; if (line.read_checked(vario)) info.ProvideTotalEnergyVario(vario / 100); // True airspeed (xxxxx cm/s), 5 Digits (0 to 99999cm/s = 3600km/h) fixed tas; if (line.read_checked(tas)) info.ProvideTrueAirspeed(tas / 100); // Airspeed source P or V, 1 Digit P= pitot, V = Vane wheel line.skip(); // Temp. PCB (xxx �C), 3 Digits fixed pcb_temperature; bool pcb_temperature_available = line.read_checked(pcb_temperature); // Temp. Balloon Envelope (xxx �C), 3 Digits fixed balloon_temperature; bool balloon_temperature_available = line.read_checked(balloon_temperature); if (balloon_temperature_available) { info.temperature = CelsiusToKelvin(balloon_temperature); info.temperature_available = true; } else if (pcb_temperature_available) { info.temperature = CelsiusToKelvin(pcb_temperature); info.temperature_available = true; } // Battery Capacity Bank 1 (0 to 100%) 3 Digits fixed battery_level_1; bool battery_level_1_available = line.read_checked(battery_level_1); // Battery Capacity Bank 2 (0 to 100%) 3 Digits fixed battery_level_2; bool battery_level_2_available = line.read_checked(battery_level_2); if (battery_level_1_available) { if (battery_level_2_available) info.battery_level = (battery_level_1 + battery_level_2) / 2; else info.battery_level = battery_level_1; info.battery_level_available.Update(info.clock); } else if (battery_level_2_available) { info.battery_level = battery_level_2; info.battery_level_available.Update(info.clock); } // Dist. to WP (xxxxxx m), 6 Digits (Max 200000m) // Bearing (xxx Deg), 3 Digits // Speed to fly1 (MC0 xxxxx cm/s), 5 Digits // Speed to fly2 (McC. xxxxx cm/s) 5 Digits // Keypress Code (Experimental empty to 99) 2 Digits return true; }