bool BlueFlyDevice::ParsePRS(const char *content, NMEAInfo &info) { // e.g. PRS 17CBA char *endptr; long value = strtol(content, &endptr, 16); if (endptr != content) { AtmosphericPressure pressure = AtmosphericPressure::Pascal(fixed(value)); kalman_filter.Update(pressure.GetHectoPascal(), fixed(0.25), fixed(0.02)); info.ProvideNoncompVario(ComputeNoncompVario(kalman_filter.GetXAbs(), kalman_filter.GetXVel())); info.ProvideStaticPressure(AtmosphericPressure::HectoPascal(kalman_filter.GetXAbs())); } return true; }
static bool LK8EX1(NMEAInputLine &line, NMEAInfo &info) { unsigned pressure; bool pressure_available = (line.ReadChecked(pressure) && pressure != 999999); if (pressure_available) info.ProvideStaticPressure(AtmosphericPressure::Pascal(fixed(pressure))); unsigned altitude; bool altitude_available = (line.ReadChecked(altitude) && altitude != 99999); if (altitude_available && !pressure_available) info.ProvidePressureAltitude(fixed(altitude)); int vario; if (line.ReadChecked(vario) && vario != 9999) info.ProvideNoncompVario(fixed(vario) / 100); int temperature; if (line.ReadChecked(temperature) && temperature != 99) { info.temperature = fixed(temperature); info.temperature_available = true; } fixed battery_value; if (line.ReadChecked(battery_value) && (unsigned)(battery_value + fixed(0.5)) != 999) { if (battery_value > fixed(1000)) { info.battery_level = battery_value - fixed(1000); info.battery_level_available.Update(info.clock); } else { info.voltage = battery_value; info.voltage_available.Update(info.clock); } } return true; }
bool FlyNetDevice::ParsePRS(const char *content, NMEAInfo &info) { // e.g. _PRS 00017CBA // The frequency at which the device sends _PRS sentences static constexpr double frequency = 1 / 0.048; char *endptr; long value = strtol(content, &endptr, 16); if (endptr != content) { auto pressure = AtmosphericPressure::Pascal(value); if (info.static_pressure_available) { // Calculate non-compensated vario value auto last_pressure = info.static_pressure; auto alt = AtmosphericPressure::StaticPressureToPressureAltitude(pressure); auto last_alt = AtmosphericPressure::StaticPressureToPressureAltitude(last_pressure); auto vario = (alt - last_alt) * frequency; vario_filter.Update(vario); auto vario_filtered = vario_filter.Average(); info.ProvideNoncompVario(vario_filtered); } else { // Reset filter when the first new pressure sentence is received vario_filter.Reset(); } info.ProvideStaticPressure(pressure); } return true; }