void LastThermalStats(NMEA_INFO *Basic, DERIVED_INFO *Calculated) { static int LastCircling = FALSE; if((Calculated->Circling == FALSE) && (LastCircling == TRUE) && (Calculated->ClimbStartTime>=0)) { double ThermalTime = Calculated->CruiseStartTime - Calculated->ClimbStartTime; if(ThermalTime >0) { double ThermalGain = Calculated->CruiseStartAlt + Calculated->EnergyHeight - Calculated->ClimbStartAlt; if (ThermalGain>0) { if (ThermalTime>THERMAL_TIME_MIN) { Calculated->LastThermalAverage = ThermalGain/ThermalTime; Calculated->LastThermalGain = ThermalGain; Calculated->LastThermalTime = ThermalTime; flightstats.ThermalAverage. least_squares_update(Calculated->LastThermalAverage); #ifdef DEBUG_STATS DebugStore("%f %f # thermal stats\n", flightstats.ThermalAverage.m, flightstats.ThermalAverage.b ); #endif if (EnableThermalLocator) { ThermalSources(Basic, Calculated); } } } } } LastCircling = Calculated->Circling; }
inline void GlideComputerAirData::LastThermalStats(const MoreData &basic, DerivedInfo &calculated, bool last_circling) { if (calculated.circling || !last_circling || !positive(calculated.climb_start_time)) return; fixed duration = calculated.cruise_start_time - calculated.climb_start_time; if (duration < THERMAL_TIME_MIN) return; fixed gain = calculated.cruise_start_altitude_te - calculated.climb_start_altitude_te; if (!positive(gain)) return; bool was_defined = calculated.last_thermal.IsDefined(); calculated.last_thermal.start_time = calculated.climb_start_time; calculated.last_thermal.end_time = calculated.cruise_start_time; calculated.last_thermal.gain = gain; calculated.last_thermal.duration = duration; calculated.last_thermal.CalculateLiftRate(); if (!was_defined) calculated.last_thermal_average_smooth = calculated.last_thermal.lift_rate; else calculated.last_thermal_average_smooth = LowPassFilter(calculated.last_thermal_average_smooth, calculated.last_thermal.lift_rate, fixed(0.3)); ThermalSources(basic, calculated, calculated.thermal_locator); }