void InfoBoxContentNextAltitudeArrival::Update(InfoBoxData &data) { // pilots want this to be assuming terminal flight to this wp const MoreData &basic = CommonInterface::Basic(); const TaskStats &task_stats = XCSoarInterface::Calculated().task_stats; const GlideResult next_solution = XCSoarInterface::Calculated().common_stats.next_solution; if (!task_stats.task_valid || !next_solution.IsAchievable()) { data.SetInvalid(); return; } data.SetValueFromAltitude(next_solution.GetArrivalAltitude(basic.nav_altitude)); }
void UpdateInfoBoxNextAltitudeArrival(InfoBoxData &data) { // pilots want this to be assuming terminal flight to this wp const MoreData &basic = CommonInterface::Basic(); const TaskStats &task_stats = CommonInterface::Calculated().task_stats; const GlideResult next_solution = task_stats.current_leg.solution_remaining; if (!basic.NavAltitudeAvailable() || !task_stats.task_valid || !next_solution.IsAchievable()) { data.SetInvalid(); return; } data.SetValueFromAltitude(next_solution.GetArrivalAltitude(basic.nav_altitude)); }
void CrossSectionRenderer::PaintGlide(ChartRenderer &chart) const { if (!gps_info.NavAltitudeAvailable() || !glide_polar.IsValid()) return; const fixed altitude = gps_info.nav_altitude; const MacCready mc(glide_settings, glide_polar); const GlideState task(vec, fixed(0), altitude, calculated_info.GetWindOrZero()); const GlideResult result = mc.SolveStraight(task); if (!result.IsOk()) return; chart.DrawLine(fixed(0), altitude, result.vector.distance, result.GetArrivalAltitude(), ChartLook::STYLE_BLUETHIN); }
void InfoBoxContentNextAltitudeArrival::Update(InfoBoxData &data) { // pilots want this to be assuming terminal flight to this wp const TaskStats &task_stats = XCSoarInterface::Calculated().task_stats; const GlideResult next_solution = XCSoarInterface::Calculated().common_stats.next_solution; if (!task_stats.task_valid || !next_solution.IsFinalGlide()) { data.SetInvalid(); return; } // Set Value TCHAR tmp[32]; fixed alt = next_solution.GetArrivalAltitude(XCSoarInterface::Basic().nav_altitude); Units::FormatUserAltitude(alt, tmp, 32, false); data.SetValue(tmp); // Set Unit data.SetValueUnit(Units::current.altitude_unit); }
void GlideResult::Add(const GlideResult &s2) { if ((unsigned)s2.validity > (unsigned)validity) /* downgrade the validity */ validity = s2.validity; if (!IsDefined()) return; vector.distance += s2.vector.distance; if (!IsOk()) /* the other attributes are not valid if validity is not OK or PARTIAL */ return; if (s2.GetRequiredAltitudeWithDrift() < min_arrival_altitude) { /* must meet the safety height of the first leg */ assert(s2.min_arrival_altitude < s2.GetArrivalAltitudeWithDrift(min_arrival_altitude)); /* calculate a new minimum arrival height that considers the "mountain top" in the middle */ min_arrival_altitude = s2.GetArrivalAltitudeWithDrift(min_arrival_altitude); } else { /* must meet the safety height of the second leg */ /* apply the increased altitude requirement */ altitude_difference -= s2.GetRequiredAltitudeWithDrift() - min_arrival_altitude; /* adopt the minimum height of the second leg */ min_arrival_altitude = s2.min_arrival_altitude; } /* same as above, but for "pure glide" */ if (s2.GetRequiredAltitude() < pure_glide_min_arrival_altitude) { /* must meet the safety height of the first leg */ assert(s2.pure_glide_min_arrival_altitude < s2.GetArrivalAltitude(pure_glide_min_arrival_altitude)); /* calculate a new minimum arrival height that considers the "mountain top" in the middle */ pure_glide_min_arrival_altitude = s2.GetArrivalAltitude(pure_glide_min_arrival_altitude); } else { /* must meet the safety height of the second leg */ /* apply the increased altitude requirement */ pure_glide_altitude_difference -= s2.GetRequiredAltitude() - pure_glide_min_arrival_altitude; /* adopt the minimum height of the second leg */ pure_glide_min_arrival_altitude = s2.pure_glide_min_arrival_altitude; } pure_glide_height += s2.pure_glide_height; time_elapsed += s2.time_elapsed; height_glide += s2.height_glide; height_climb += s2.height_climb; time_virtual += s2.time_virtual; }