static bool PZAN3(NMEAInputLine &line, NMEAInfo &info) { // old: $PZAN3,+,026,V,321,035,A,321,035,V*cc // new: $PZAN3,+,026,A,321,035,V[,A]*cc line.skip(3); int direction, speed; if (!line.read_checked(direction) || !line.read_checked(speed)) return false; char okay = line.read_first_char(); if (okay == 'V') { okay = line.read_first_char(); if (okay == 'V') return true; if (okay != 'A') { line.skip(); okay = line.read_first_char(); } } if (okay == 'A') { SpeedVector wind(Angle::Degrees(fixed(direction)), Units::ToSysUnit(fixed(speed), unKiloMeterPerHour)); info.ProvideExternalWind(wind); } return true; }
/** * $PWES1,DD,MM,S,AAA,F,V,LLL,BB*CS<CR><LF> */ static bool PWES1(NMEAInputLine &line, NMEAInfo &info) { line.skip(); /* device */ int i; if (line.read_checked(i)) info.settings.ProvideMacCready(fixed(i) / 10, info.clock); if (line.read_checked(i)) { if (i == 0) { info.switch_state.flight_mode = SwitchInfo::FlightMode::CIRCLING; info.switch_state.speed_command = false; info.switch_state_available = true; } else if (i == 1) { info.switch_state.flight_mode = SwitchInfo::FlightMode::CRUISE; info.switch_state.speed_command = true; info.switch_state_available = true; } } line.skip(3); if (line.read_checked(i)) info.settings.ProvideWingLoading(fixed(i) / 10, info.clock); if (line.read_checked(i)) info.settings.ProvideBugs(fixed(100 - i) / 100, info.clock); 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; }
bool NMEAParser::GSA(NMEAInputLine &line, NMEAInfo &info) { /* * $--GSA,a,a,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x.x,x.x,x.x*hh * * Field Number: * 1) Selection mode * M=Manual, forced to operate in 2D or 3D * A=Automatic, 3D/2D * 2) Mode (1 = no fix, 2 = 2D fix, 3 = 3D fix) * 3) ID of 1st satellite used for fix * 4) ID of 2nd satellite used for fix * ... * 14) ID of 12th satellite used for fix * 15) PDOP * 16) HDOP * 17) VDOP * 18) checksum */ line.skip(); if (line.read(0) == 1) info.location_available.Clear(); // satellites are in items 4-15 of GSA string (4-15 is 1-indexed) for (unsigned i = 0; i < GPSState::MAXSATELLITES; i++) info.gps.satellite_ids[i] = line.read(0); info.gps.satellite_ids_available.Update(info.clock); return true; }
/** * 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, NMEA_INFO &info) { fixed value; // 0,1 = GPS altitude, unit if (line.read_checked_compare(info.GPSAltitude, "M")) info.GPSAltitudeAvailable.Update(info.clock); // 2,3 = baro altitude, unit if (line.read_checked_compare(value, "M")) info.ProvideBaroAltitudeTrue(value); // 4-7 = integrated vario, unit line.skip(4); // 8,9 = indicated or true airspeed, unit if (line.read_checked_compare(value, "KH")) // XXX is that TAS or IAS? Documentation isn't clear. info.ProvideBothAirspeeds(Units::ToSysUnit(value, unKiloMeterPerHour)); // 10,11 = temperature, unit info.TemperatureAvailable = line.read_checked_compare(value, "C"); if (info.TemperatureAvailable) info.OutsideAirTemperature = Units::ToSysUnit(value, unGradCelcius); return true; }
/** * 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, NMEA_INFO &info, bool enable_baro) { fixed value; // 0,1 = GPS altitude, unit line.read_checked_compare(info.GPSAltitude, "M"); // 2,3 = baro altitude, unit bool available = line.read_checked_compare(value, "M"); if (enable_baro) { if (available) info.BaroAltitude = value; info.BaroAltitudeAvailable = available; } // 4-7 = integrated vario, unit line.skip(4); // 8,9 = indicated or true airspeed, unit info.AirspeedAvailable = line.read_checked_compare(value, "KH"); if (info.AirspeedAvailable) { // XXX is that TAS or IAS? Documentation isn't clear. info.TrueAirspeed = Units::ToSysUnit(value, unKiloMeterPerHour); info.IndicatedAirspeed = info.TrueAirspeed; } // 10,11 = temperature, unit info.TemperatureAvailable = line.read_checked_compare(value, "C"); if (info.TemperatureAvailable) info.OutsideAirTemperature = Units::ToSysUnit(value, unGradCelcius); return true; }
/** * 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.read_checked_compare(info.gps_altitude, "M")) info.gps_altitude_available.Update(info.clock); // 2,3 = baro altitude, unit if (line.read_checked_compare(value, "M")) info.ProvideBaroAltitudeTrue(value); // 4-7 = integrated vario, unit line.skip(4); // 8,9 = indicated or true airspeed, unit if (line.read_checked_compare(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.read_checked_compare(value, "C"); if (info.temperature_available) info.temperature = CelsiusToKelvin(value); return true; }
// $PDVDS,nx,nz,flap,stallratio,netto static bool PDVDS(NMEAInputLine &line, NMEAInfo &info) { fixed AccelX = line.read(fixed_zero); fixed AccelZ = line.read(fixed_zero); int mag = (int)hypot(AccelX, AccelZ); info.acceleration.ProvideGLoad(fixed(mag) / 100, true); /* double flap = line.read(0.0); */ line.skip(); info.stall_ratio = line.read(fixed_zero); info.stall_ratio_available.Update(info.clock); fixed value; if (line.read_checked(value)) info.ProvideNettoVario(value / 10); //hasVega = true; return true; }
static bool LXWP2(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { /* * $LXWP2, * maccready value, (m/s) * ballast, (1.0 - 1.5) * bugs, (0 - 100%) * polar_a, * polar_b, * polar_c, * audio volume */ fixed value; // MacCready value if (line.read_checked(value)) GPS_INFO->MacCready = value; // Ballast line.skip(); /* if (line.read_checked(value)) GPS_INFO->Ballast = value; */ // Bugs if (line.read_checked(value)) GPS_INFO->Bugs = fixed(100) - value; return true; }
/** * Parses a PFLAU sentence * (Operating status and priority intruder and obstacle data) * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param GPS_INFO GPS_INFO struct to parse into * @return Parsing success * @see http://flarm.com/support/manual/FLARM_DataportManual_v4.06E.pdf */ bool NMEAParser::PFLAU(NMEAInputLine &line, FLARM_STATE &flarm) { static int old_flarm_rx = 0; flarm.FLARM_Available = true; isFlarm = true; // PFLAU,<RX>,<TX>,<GPS>,<Power>,<AlarmLevel>,<RelativeBearing>,<AlarmType>, // <RelativeVertical>,<RelativeDistance>(,<ID>) flarm.FLARM_RX = line.read(0); flarm.FLARM_TX = line.read(0); flarm.FLARM_GPS = line.read(0); line.skip(); flarm.FLARM_AlarmLevel = line.read(0); // process flarm updates if (flarm.FLARM_RX && old_flarm_rx == 0) // traffic has appeared.. InputEvents::processGlideComputer(GCE_FLARM_TRAFFIC); if (flarm.FLARM_RX == 0 && old_flarm_rx) // traffic has disappeared.. InputEvents::processGlideComputer(GCE_FLARM_NOTRAFFIC); // TODO feature: add another event for new traffic. old_flarm_rx = flarm.FLARM_RX; return false; }
static bool LXWP2(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { /* * $LXWP2, * maccready value, (m/s) * ballast, (1.0 - 1.5) * bugs, (0 - 100%) * polar_a, * polar_b, * polar_c, * audio volume */ fixed value; // MacCready value if (line.read_checked(value)) GPS_INFO->settings.ProvideMacCready(value, GPS_INFO->Time); // Ballast line.skip(); /* if (line.read_checked(value)) GPS_INFO->ProvideBallast(value, GPS_INFO->Time); */ // Bugs if (line.read_checked(value)) GPS_INFO->settings.ProvideBugs((fixed(100) - value) / 100, GPS_INFO->Time); 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; }
static bool LXWP0(NMEAInputLine &line, NMEA_INFO *GPS_INFO, bool enable_baro) { /* $LXWP0,Y,222.3,1665.5,1.71,,,,,,239,174,10.1 0 loger_stored (Y/N) 1 IAS (kph) ----> Condor uses TAS! 2 baroaltitude (m) 3-8 vario (m/s) (last 6 measurements in last second) 9 heading of plane 10 windcourse (deg) 11 windspeed (kph) */ line.skip(); fixed airspeed; GPS_INFO->AirspeedAvailable = line.read_checked(airspeed); fixed alt = line.read(fixed_zero); if (GPS_INFO->AirspeedAvailable) { GPS_INFO->TrueAirspeed = Units::ToSysUnit(airspeed, unKiloMeterPerHour); GPS_INFO->IndicatedAirspeed = GPS_INFO->TrueAirspeed / AtmosphericPressure::AirDensityRatio(alt); } if (enable_baro) { GPS_INFO->BaroAltitudeAvailable = true; GPS_INFO->BaroAltitude = alt; // ToDo check if QNH correction is needed! } GPS_INFO->TotalEnergyVarioAvailable = line.read_checked(GPS_INFO->TotalEnergyVario); line.skip(6); GPS_INFO->ExternalWindAvailable = ReadSpeedVector(line, GPS_INFO->wind); TriggerVarioUpdate(); return true; }
static bool LXWP0(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { /* $LXWP0,Y,222.3,1665.5,1.71,,,,,,239,174,10.1 0 loger_stored (Y/N) 1 IAS (kph) ----> Condor uses TAS! 2 baroaltitude (m) 3-8 vario (m/s) (last 6 measurements in last second) 9 heading of plane 10 windcourse (deg) 11 windspeed (kph) */ fixed value; line.skip(); fixed airspeed; bool tas_available = line.read_checked(airspeed); fixed alt = fixed_zero; if (line.read_checked(alt)) /* a dump on a LX7007 has confirmed that the LX sends uncorrected altitude above 1013.25hPa here */ GPS_INFO->ProvidePressureAltitude(alt); if (tas_available) GPS_INFO->ProvideTrueAirspeedWithAltitude(Units::ToSysUnit(airspeed, unKiloMeterPerHour), alt); if (line.read_checked(value)) GPS_INFO->ProvideTotalEnergyVario(value); line.skip(6); SpeedVector wind; if (ReadSpeedVector(line, wind)) GPS_INFO->ProvideExternalWind(wind); return true; }
/** * $PWES1,DD,MM,S,AAA,F,V,LLL,BB*CS<CR><LF> */ static bool PWES1(NMEAInputLine &line, NMEAInfo &info) { line.skip(); /* device */ int i; if (line.read_checked(i)) info.settings.ProvideMacCready(fixed(i) / 10, info.clock); line.skip(4); if (line.read_checked(i)) info.settings.ProvideWingLoading(fixed(i) / 10, info.clock); if (line.read_checked(i)) info.settings.ProvideBugs(fixed(100 - i) / 100, info.clock); return true; }
static bool GPWIN(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { line.skip(2); fixed value; if (line.read_checked(value)) GPS_INFO->ProvidePressureAltitude(value / 10); return false; }
static bool GPWIN(NMEAInputLine &line, NMEAInfo &info) { line.skip(2); fixed value; if (line.read_checked(value)) info.ProvidePressureAltitude(value / 10); return false; }
/* !w,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>*hh<CR><LF> <1> Vector wind direction in degrees <2> Vector wind speed in 10ths of meters per second <3> Vector wind age in seconds <4> Component wind in 10ths of Meters per second + 500 (500 = 0, 495 = 0.5 m/s tailwind) <5> True altitude in Meters + 1000 <6> Instrument QNH setting <7> True airspeed in 100ths of Meters per second <8> Variometer reading in 10ths of knots + 200 <9> Averager reading in 10ths of knots + 200 <10> Relative variometer reading in 10ths of knots + 200 <11> Instrument MacCready setting in 10ths of knots <12> Instrument Ballast setting in percent of capacity <13> Instrument Bug setting *hh Checksum, XOR of all bytes */ static bool cai_w(NMEAInputLine &line, NMEAInfo &info) { SpeedVector wind; if (ReadSpeedVector(line, wind)) info.ProvideExternalWind(wind.Reciprocal()); line.skip(2); fixed value; if (line.read_checked(value)) info.ProvideBaroAltitudeTrue(value - fixed(1000)); if (line.read_checked(value)) info.settings.ProvideQNH(value, info.clock); if (line.read_checked(value)) info.ProvideTrueAirspeed(value / 100); if (line.read_checked(value)) info.ProvideTotalEnergyVario(Units::ToSysUnit((value - fixed(200)) / 10, unKnots)); line.skip(2); int i; if (line.read_checked(i)) info.settings.ProvideMacCready(Units::ToSysUnit(fixed(i) / 10, unKnots), info.clock); if (line.read_checked(i)) info.settings.ProvideBallastFraction(fixed(i) / 100, info.clock); if (line.read_checked(i)) info.settings.ProvideBugs(fixed(i) / 100, info.clock); return true; }
static bool GPWIN(NMEAInputLine &line, NMEA_INFO *GPS_INFO, bool enable_baro) { line.skip(2); fixed value; if (enable_baro && line.read_checked(value)) { GPS_INFO->BaroAltitude = GPS_INFO->pressure.AltitudeToQNHAltitude(value / 10); GPS_INFO->BaroAltitudeAvailable = true; } return false; }
/** * Parses a GSA sentence * * $--GSA,a,a,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x.x,x.x,x.x*hh * * Field Number: * 1) Selection mode * M=Manual, forced to operate in 2D or 3D * A=Automatic, 3D/2D * 2) Mode (1 = no fix, 2 = 2D fix, 3 = 3D fix) * 3) ID of 1st satellite used for fix * 4) ID of 2nd satellite used for fix * ... * 14) ID of 12th satellite used for fix * 15) PDOP * 16) HDOP * 17) VDOP * 18) checksum * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param info NMEA_INFO struct to parse into * @return Parsing success */ bool NMEAParser::GSA(NMEAInputLine &line, NMEAInfo &info) { line.skip(); if (line.read(0) == 1) info.location_available.Clear(); // satellites are in items 4-15 of GSA string (4-15 is 1-indexed) for (unsigned i = 0; i < GPSState::MAXSATELLITES; i++) info.gps.satellite_ids[i] = line.read(0); return true; }
/** * Parses a GSA sentence * * $--GSA,a,a,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x.x,x.x,x.x*hh * * Field Number: * 1) Selection mode * M=Manual, forced to operate in 2D or 3D * A=Automatic, 3D/2D * 2) Mode (1 = no fix, 2 = 2D fix, 3 = 3D fix) * 3) ID of 1st satellite used for fix * 4) ID of 2nd satellite used for fix * ... * 14) ID of 12th satellite used for fix * 15) PDOP * 16) HDOP * 17) VDOP * 18) checksum * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param GPS_INFO GPS_INFO struct to parse into * @return Parsing success */ bool NMEAParser::GSA(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { if (GPS_INFO->gps.Replay) return true; line.skip(2); // satellites are in items 4-15 of GSA string (4-15 is 1-indexed) for (unsigned i = 0; i < MAXSATELLITES; i++) GPS_INFO->gps.SatelliteIDs[i] = line.read(0); GSAAvailable = true; return true; }
/** * Parses a PFLAU sentence * (Operating status and priority intruder and obstacle data) * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param info NMEA_INFO struct to parse into * @return Parsing success * @see http://flarm.com/support/manual/FLARM_DataportManual_v5.00E.pdf */ bool NMEAParser::PFLAU(NMEAInputLine &line, FLARM_STATE &flarm, fixed clock) { flarm.available.Update(clock); // PFLAU,<RX>,<TX>,<GPS>,<Power>,<AlarmLevel>,<RelativeBearing>,<AlarmType>, // <RelativeVertical>,<RelativeDistance>(,<ID>) flarm.rx = line.read(0); flarm.tx = line.read(false); flarm.gps = (FLARM_STATE::GPSStatus)line.read(FLARM_STATE::GPS_NONE); line.skip(); flarm.alarm_level = (FLARM_TRAFFIC::AlarmType) line.read(FLARM_TRAFFIC::ALARM_NONE); return true; }
/* $PCAID,<1>,<2>,<3>,<4>*hh<CR><LF> <1> Logged 'L' Last point Logged 'N' Last Point not logged <2> Barometer Altitude in meters (Leading zeros will be transmitted) <3> Engine Noise Level <4> Log Flags *hh Checksum, XOR of all bytes of the sentence after the $ and before the * */ static bool cai_PCAID(NMEAInputLine &line, NMEAInfo &data) { line.skip(); fixed value; if (line.read_checked(value)) data.ProvidePressureAltitude(value); unsigned enl; if (line.read_checked(enl)) { data.engine_noise_level = enl; data.engine_noise_level_available.Update(data.clock); } return true; }
bool NMEAParser::PTAS1(NMEAInputLine &line, NMEAInfo &info) { /* * $PTAS1,xxx,yyy,zzzzz,aaa*CS<CR><LF> * * xxx * CV or current vario. =vario*10+200 range 0-400(display +/-20.0 knots) * * yyy * AV or average vario. =vario*10+200 range 0-400(display +/-20.0 knots) * * zzzzz * Barometric altitude in feet +2000 * * aaa * TAS knots 0-200 */ // Parse current vario data fixed vario; if (line.read_checked(vario)) { // Properly convert to m/s vario = Units::ToSysUnit((vario - fixed(200)) / 10, unKnots); info.ProvideTotalEnergyVario(vario); } // Skip average vario data line.skip(); // Parse barometric altitude fixed baro_altitude; if (line.read_checked(baro_altitude)) { // Properly convert to meter baro_altitude = Units::ToSysUnit(baro_altitude - fixed(2000), unFeet); info.ProvidePressureAltitude(baro_altitude); } // Parse true airspeed fixed vtas; if (line.read_checked(vtas)) info.ProvideTrueAirspeed(Units::ToSysUnit(vtas, unKnots)); return true; }
bool NMEAParser::PFLAU(NMEAInputLine &line, FlarmState &flarm, fixed time) { flarm.available.Update(time); // PFLAU,<RX>,<TX>,<GPS>,<Power>,<AlarmLevel>,<RelativeBearing>,<AlarmType>, // <RelativeVertical>,<RelativeDistance>(,<ID>) flarm.rx = line.read(0); flarm.tx = line.read(false); flarm.gps = (FlarmState::GPSStatus) line.read((int)FlarmState::GPSStatus::NONE); line.skip(); flarm.alarm_level = (FlarmTraffic::AlarmType) line.read((int)FlarmTraffic::AlarmType::NONE); return true; }
/** * Parse a "$D" sentence. * * Example: "$D,+0,100554,+25,18,+31,,0,-356,+25,+11,115,96*6A" */ static bool LeonardoParseD(NMEAInputLine &line, NMEA_INFO &info) { fixed value; // 0 = vario [dm/s] if (line.read_checked(value)) info.ProvideTotalEnergyVario(value / 10); // 1 = air pressure [Pa] if (line.skip() == 0) /* short "$C" sentence ends after airspeed */ return true; // 2 = netto vario [dm/s] if (line.read_checked(value)) info.ProvideNettoVario(value / 10); // 3 = airspeed [km/h] /* XXX is that TAS or IAS? */ if (line.read_checked(value)) info.ProvideTrueAirspeed(Units::ToSysUnit(value, unKiloMeterPerHour)); // 4 = temperature [deg C] fixed oat; info.TemperatureAvailable = line.read_checked(oat); if (info.TemperatureAvailable) info.OutsideAirTemperature = Units::ToSysUnit(oat, unGradCelcius); // 5 = compass [degrees] /* XXX unsupported by XCSoar */ // 6 = optimal speed [km/h] /* XXX unsupported by XCSoar */ // 7 = equivalent MacCready [cm/s] /* XXX unsupported by XCSoar */ // 8 = wind speed [km/h] /* not used here, the "$C" record repeats it together with the direction */ return true; }
// RMN: Volkslogger // Source data: // $PGCS,1,0EC0,FFF9,0C6E,02*61 // $PGCS,1,0EC0,FFFA,0C6E,03*18 static bool vl_PGCS1(NMEAInputLine &line, NMEA_INFO *GPS_INFO, bool enable_baro) { GPS_STATE &gps = GPS_INFO->gps; if (line.read(1) != 1) return false; /* pressure sensor */ line.skip(); // four characers, hex, barometric altitude long altitude = line.read_hex(0L); if (enable_baro) { if (altitude > 60000) /* Assuming that altitude has wrapped around. 60 000 m occurs at QNH ~2000 hPa */ altitude -= 65535; GPS_INFO->BaroAltitude = GPS_INFO->pressure.AltitudeToQNHAltitude(fixed(altitude)); GPS_INFO->BaroAltitudeAvailable = true; } // ExtractParameter(String,ctemp,3); // four characters, hex, constant. Value 1371 (dec) // nSatellites = (int)(min(12,HexStrToDouble(ctemp, NULL))); if (gps.SatellitesUsed <= 0) { gps.SatellitesUsed = 4; // just to make XCSoar quit complaining. VL doesn't tell how many // satellites it uses. Without this XCSoar won't do wind // measurements. } return false; }
/** * Parses a PTAS1 sentence * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param GPS_INFO GPS_INFO struct to parse into * @return Parsing success */ bool NMEAParser::PTAS1(NMEAInputLine &line, NMEA_INFO *GPS_INFO) { fixed wnet; if (line.read_checked(wnet)) { GPS_INFO->TotalEnergyVario = Units::ToSysUnit((wnet - fixed(200)) / 10, unKnots); GPS_INFO->TotalEnergyVarioAvailable = true; } line.skip(); // average vario +200 fixed baralt; bool valid_baralt = false; if (line.read_checked(baralt)) { baralt = max(fixed_zero, Units::ToSysUnit(baralt - fixed(2000), unFeet)); valid_baralt = true; GPS_INFO->BaroAltitudeAvailable = true; GPS_INFO->BaroAltitude = GPS_INFO->pressure.AltitudeToQNHAltitude(baralt); } fixed vtas; bool valid_vtas = false; if (line.read_checked(vtas)) { vtas = Units::ToSysUnit(vtas, unKnots); GPS_INFO->AirspeedAvailable = true; GPS_INFO->TrueAirspeed = vtas; } if (valid_baralt && valid_vtas) GPS_INFO->IndicatedAirspeed = vtas / GPS_INFO->pressure.AirDensityRatio(baralt); TriggerVarioUpdate(); return false; }
/** * Parses a PTAS1 sentence (Tasman Instruments proprietary). * * @param String Input string * @param params Parameter array * @param nparams Number of parameters * @param info NMEA_INFO struct to parse into * @return Parsing success */ bool NMEAParser::PTAS1(NMEAInputLine &line, NMEAInfo &info) { fixed wnet; if (line.read_checked(wnet)) info.ProvideTotalEnergyVario(Units::ToSysUnit((wnet - fixed(200)) / 10, unKnots)); line.skip(); // average vario +200 fixed baralt; if (line.read_checked(baralt)) { baralt = max(fixed_zero, Units::ToSysUnit(baralt - fixed(2000), unFeet)); info.ProvidePressureAltitude(baralt); } fixed vtas; if (line.read_checked(vtas)) info.ProvideTrueAirspeed(Units::ToSysUnit(vtas, unKnots)); return true; }
// 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; }