/** * Parse a "$VMVABD" sentence. * * Example: "$VMVABD,0000.0,M,0547.0,M,-0.0,,,MS,0.0,KH,22.4,C*65" */ static bool FlytecParseVMVABD(NMEAInputLine &line, NMEAInfo &info) { fixed value; // 0,1 = GPS altitude, unit if (line.ReadCheckedCompare(info.gps_altitude, "M")) info.gps_altitude_available.Update(info.clock); // 2,3 = baro altitude, unit if (line.ReadCheckedCompare(value, "M")) info.ProvideBaroAltitudeTrue(value); // 4-7 = integrated vario, unit line.Skip(4); // 8,9 = indicated or true airspeed, unit if (line.ReadCheckedCompare(value, "KH")) // XXX is that TAS or IAS? Documentation isn't clear. info.ProvideBothAirspeeds(Units::ToSysUnit(value, Unit::KILOMETER_PER_HOUR)); // 10,11 = temperature, unit info.temperature_available = line.ReadCheckedCompare(value, "C"); if (info.temperature_available) info.temperature = CelsiusToKelvin(value); return true; }
/** * $PWES0,DD,VVVV,MMMM,NNNN,BBBB,SSSS,AAAAA,QQQQQ,IIII,TTTT,UUU,CCCC*CS<CR><LF> */ static bool PWES0(NMEAInputLine &line, NMEAInfo &info) { int i; line.Skip(); /* device */ if (line.ReadChecked(i) && i >= -999 && i <= 999) info.ProvideTotalEnergyVario(fixed(i) / 10); line.Skip(); /* average vario */ if (line.ReadChecked(i) && i >= -999 && i <= 999) info.ProvideNettoVario(fixed(i) / 10); line.Skip(); /* average netto vario */ line.Skip(); /* speed to fly */ unsigned altitude; if (line.ReadChecked(altitude) && altitude <= 99999) info.ProvidePressureAltitude(fixed(altitude)); if (line.ReadChecked(altitude) && altitude <= 99999) info.ProvideBaroAltitudeTrue(fixed(altitude)); unsigned ias, tas; bool have_ias = line.ReadChecked(ias) && ias <= 9999; bool have_tas = line.ReadChecked(tas) && tas <= 9999; if (have_ias && have_tas) info.ProvideBothAirspeeds(Units::ToSysUnit(fixed(ias) / 10, Unit::KILOMETER_PER_HOUR), Units::ToSysUnit(fixed(tas) / 10, Unit::KILOMETER_PER_HOUR)); else if (!have_ias && have_tas) info.ProvideTrueAirspeed(Units::ToSysUnit(fixed(tas) / 10, Unit::KILOMETER_PER_HOUR)); unsigned voltage; if (line.ReadChecked(voltage) && voltage <= 999) { info.voltage = fixed(voltage) / 10; info.voltage_available.Update(info.clock); } if (line.ReadChecked(i) && i >= -999 && i <= 999) { info.temperature = CelsiusToKelvin(fixed(i) / 10); info.temperature_available = true; } return true; }
/** * $PWES0,DD,VVVV,MMMM,NNNN,BBBB,SSSS,AAAAA,QQQQQ,IIII,TTTT,UUU,CCCC*CS<CR><LF> */ static bool PWES0(NMEAInputLine &line, NMEAInfo &info) { int i, k; line.skip(); /* device */ if (line.read_checked(i)) info.ProvideTotalEnergyVario(fixed(i) / 10); line.skip(); /* average vario */ if (line.read_checked(i)) info.ProvideNettoVario(fixed(i) / 10); line.skip(); /* average netto vario */ line.skip(); /* speed to fly */ if (line.read_checked(i)) info.ProvidePressureAltitude(fixed(i)); if (line.read_checked(i)) info.ProvideBaroAltitudeTrue(fixed(i)); bool have_ias = line.read_checked(i); bool have_tas = line.read_checked(k); if (have_ias && have_tas) info.ProvideBothAirspeeds(Units::ToSysUnit(fixed(i) / 10, Unit::KILOMETER_PER_HOUR), Units::ToSysUnit(fixed(k) / 10, Unit::KILOMETER_PER_HOUR)); else if (!have_ias && have_tas) info.ProvideTrueAirspeed(Units::ToSysUnit(fixed(k) / 10, Unit::KILOMETER_PER_HOUR)); if (line.read_checked(i)) { info.voltage = fixed(i) / 10; info.voltage_available.Update(info.clock); } if (line.read_checked(i)) { info.temperature = CelsiusToKelvin(fixed(i) / 10); info.temperature_available = true; } return true; }
/** * $PWES0,DD,VVVV,MMMM,NNNN,BBBB,SSSS,AAAAA,QQQQQ,IIII,TTTT,UUU,CCC*CS<CR><LF> */ static bool PWES0(NMEAInputLine &line, NMEAInfo &info) { int i, k; line.skip(); /* device */ if (line.read_checked(i)) info.ProvideTotalEnergyVario(fixed(i) / 10); line.skip(); /* average vario */ if (line.read_checked(i)) info.ProvideNettoVario(fixed(i) / 10); line.skip(); /* average netto vario */ line.skip(); /* speed to fly */ if (line.read_checked(i)) info.ProvidePressureAltitude(fixed(i)); if (line.read_checked(i)) info.ProvideBaroAltitudeTrue(fixed(i)); bool have_ias = line.read_checked(i); bool have_tas = line.read_checked(k); if (have_ias && have_tas) info.ProvideBothAirspeeds(Units::ToSysUnit(fixed(i) / 10, unKiloMeterPerHour), Units::ToSysUnit(fixed(k) / 10, unKiloMeterPerHour)); if (line.read_checked(i)) { info.voltage = fixed(i) / 10; info.voltage_available.Update(info.clock); } if (line.read_checked(i)) { info.temperature = Units::ToSysUnit(fixed(i) / 10, unGradCelcius); info.temperature_available = true; } return true; }
/** * Parse a "$BRSF" sentence. * * Example: "$BRSF,063,-013,-0035,1,193,00351,535,485*38" */ static bool FlytecParseBRSF(NMEAInputLine &line, NMEAInfo &info) { fixed value; // 0 = indicated or true airspeed [km/h] if (line.ReadChecked(value)) // XXX is that TAS or IAS? Documentation isn't clear. info.ProvideBothAirspeeds(Units::ToSysUnit(value, Unit::KILOMETER_PER_HOUR)); // 1 = integrated vario [dm/s] // 2 = altitude A2 [m] (XXX what's this?) // 3 = waypoint // 4 = bearing to waypoint [degrees] // 5 = distance to waypoint [100m] // 6 = MacCready speed to fly [100m/h] // 7 = speed to fly, best glide [100m/h] return true; }
static bool PDVDV(NMEAInputLine &line, NMEAInfo &info) { fixed value; if (line.read_checked(value)) info.ProvideTotalEnergyVario(value / 10); bool ias_available = line.read_checked(value); fixed tas_ratio = line.read(fixed(1024)) / 1024; if (ias_available) info.ProvideBothAirspeeds(value / 10, value / 10 * tas_ratio); //hasVega = true; if (line.read_checked(value)) info.ProvidePressureAltitude(value); return true; }
static bool PDVDV(NMEAInputLine &line, NMEAInfo &info) { int value; if (line.ReadChecked(value)) info.ProvideTotalEnergyVario(fixed(value) / 10); bool ias_available = line.ReadChecked(value); int tas_ratio = line.Read(1024); if (ias_available) { const fixed ias = fixed(value) / 10; info.ProvideBothAirspeeds(ias, ias * tas_ratio / 1024); } //hasVega = true; if (line.ReadChecked(value)) info.ProvidePressureAltitude(fixed(value)); return true; }
bool IgcReplay::Update(NMEAInfo &basic) { IGCFix fix; while (true) { if (!ReadPoint(fix, basic)) return false; if (fix.time.IsPlausible()) break; } basic.clock = fixed(fix.time.GetSecondOfDay()); basic.alive.Update(basic.clock); basic.ProvideTime(basic.clock); basic.location = fix.location; basic.location_available.Update(basic.clock); if (fix.gps_altitude != 0) { basic.gps_altitude = fixed(fix.gps_altitude); basic.gps_altitude_available.Update(basic.clock); } else basic.gps_altitude_available.Clear(); if (fix.pressure_altitude != 0) { basic.ProvidePressureAltitude(fixed(fix.pressure_altitude)); basic.ProvideBaroAltitudeTrue(fixed(fix.pressure_altitude)); } else { basic.pressure_altitude_available.Clear(); basic.baro_altitude_available.Clear(); } if (fix.enl >= 0) { basic.engine_noise_level = fix.enl; basic.engine_noise_level_available.Update(basic.clock); } else basic.engine_noise_level_available.Clear(); if (fix.trt >= 0) { basic.track = Angle::Degrees(fixed(fix.trt)); basic.track_available.Update(basic.clock); } else basic.track_available.Clear(); if (fix.gsp >= 0) { basic.ground_speed = Units::ToSysUnit(fixed(fix.gsp), Unit::KILOMETER_PER_HOUR); basic.ground_speed_available.Update(basic.clock); } else basic.ground_speed_available.Clear(); if (fix.ias >= 0) { fixed ias = Units::ToSysUnit(fixed(fix.ias), Unit::KILOMETER_PER_HOUR); if (fix.tas >= 0) basic.ProvideBothAirspeeds(ias, Units::ToSysUnit(fixed(fix.tas), Unit::KILOMETER_PER_HOUR)); else basic.ProvideIndicatedAirspeedWithAltitude(ias, basic.pressure_altitude); } else if (fix.tas >= 0) basic.ProvideTrueAirspeed(Units::ToSysUnit(fixed(fix.tas), Unit::KILOMETER_PER_HOUR)); if (fix.siu >= 0) { basic.gps.satellites_used = fix.siu; basic.gps.satellites_used_available.Update(basic.clock); } basic.gps.real = false; basic.gps.replay = true; basic.gps.simulator = false; return true; }