/** * Retrieves GPS data from the DeviceBlackboard * @param nmea_info New GPS data */ void GlideComputerBlackboard::ReadBlackboard(const MoreData &nmea_info) { _time_retreated = nmea_info.HasTimeRetreatedSince(gps_info); if (_time_retreated) { // backwards in time, so reset last last_gps_info = nmea_info; last_calculated_info = calculated_info; _time_retreated = true; } else if (nmea_info.time > gps_info.time) { // forwards in time, so save state last_gps_info = gps_info; last_calculated_info = calculated_info; } gps_info = nmea_info; // if time hasn't advanced, don't copy last calculated }
void GlideComputerAirData::GR(const MoreData &basic, const MoreData &last_basic, const DerivedInfo &calculated, VarioInfo &vario_info) { if (!basic.NavAltitudeAvailable() || !last_basic.NavAltitudeAvailable()) { vario_info.ld_vario = INVALID_GR; vario_info.gr = INVALID_GR; return; } if (basic.HasTimeRetreatedSince(last_basic)) { vario_info.ld_vario = INVALID_GR; vario_info.gr = INVALID_GR; } const bool time_advanced = basic.HasTimeAdvancedSince(last_basic); if (time_advanced) { fixed DistanceFlown = basic.location.Distance(last_basic.location); // Glide ratio over ground vario_info.gr = UpdateGR(vario_info.gr, DistanceFlown, last_basic.nav_altitude - basic.nav_altitude, fixed(0.1)); if (calculated.flight.flying && !calculated.circling) gr_calculator.Add((int)DistanceFlown, (int)basic.nav_altitude); } // Lift / drag instantaneous from vario, updated every reading.. if (basic.total_energy_vario_available && basic.airspeed_available && calculated.flight.flying) { vario_info.ld_vario = UpdateGR(vario_info.ld_vario, basic.indicated_airspeed, -basic.total_energy_vario, fixed(0.3)); } else { vario_info.ld_vario = INVALID_GR; } }