void UpdateInfoBoxFinalETEVMG(InfoBoxData &data) { const NMEAInfo &basic = CommonInterface::Basic(); const TaskStats &task_stats = CommonInterface::Calculated().task_stats; if (!basic.ground_speed_available || !task_stats.task_valid || !task_stats.total.remaining.IsDefined()) { data.SetInvalid(); return; } const fixed d = task_stats.total.remaining.GetDistance(); const fixed v = basic.ground_speed; if (!task_stats.task_valid || !positive(d) || !positive(v)) { data.SetInvalid(); return; } TCHAR value[32]; TCHAR comment[32]; const int dd = (int)(d/v); FormatTimeTwoLines(value, comment, dd); data.SetValue(value); data.SetComment(comment); }
void UpdateInfoBoxTaskAATimeDelta(InfoBoxData &data) { const auto &calculated = CommonInterface::Calculated(); const TaskStats &task_stats = calculated.ordered_task_stats; const CommonStats &common_stats = calculated.common_stats; if (!task_stats.has_targets || !task_stats.total.IsAchievable()) { data.SetInvalid(); return; } assert(!negative(task_stats.total.time_remaining_start)); fixed diff = task_stats.total.time_remaining_start - common_stats.aat_time_remaining; TCHAR value[32]; TCHAR comment[32]; const int dd = abs((int)diff); FormatTimeTwoLines(value, comment, dd); data.UnsafeFormatValue(negative(diff) ? _T("-%s") : _T("%s"), value); data.SetComment(comment); // Set Color (red/blue/black) data.SetValueColor(negative(diff) ? 1 : task_stats.total.time_remaining_start > common_stats.aat_time_remaining + fixed(5*60) ? 2 : 0); }
void UpdateInfoBoxTaskTimeUnderMaxHeight(InfoBoxData &data) { const auto &calculated = CommonInterface::Calculated(); const TaskStats &task_stats = calculated.ordered_task_stats; const CommonStats &common_stats = calculated.common_stats; const fixed maxheight = fixed(protected_task_manager-> GetOrderedTaskSettings().start_constraints.max_height); if (!task_stats.task_valid || !positive(maxheight) || !protected_task_manager || !positive(common_stats.TimeUnderStartMaxHeight)) { data.SetInvalid(); return; } const int dd = (int)(CommonInterface::Basic().time - common_stats.TimeUnderStartMaxHeight); TCHAR value[32]; TCHAR comment[32]; FormatTimeTwoLines(value, comment, dd); data.SetValue(value); data.SetComment(_("Time Below")); }
void InfoBoxContentTaskTimeUnderMaxHeight::Update(InfoBoxData &data) { const CommonStats &common_stats = XCSoarInterface::Calculated().common_stats; const TaskStats &task_stats = XCSoarInterface::Calculated().task_stats; const fixed maxheight = fixed(protected_task_manager-> GetOrderedTaskBehaviour().start_max_height); if (!task_stats.task_valid || !positive(maxheight) || !protected_task_manager || !positive(common_stats.TimeUnderStartMaxHeight)) { data.SetInvalid(); return; } const int dd = (int)(XCSoarInterface::Basic().time - common_stats.TimeUnderStartMaxHeight); TCHAR value[32]; TCHAR comment[32]; FormatTimeTwoLines(value, comment, dd); data.SetValue(value); data.SetComment(_("Time Below")); }
void UpdateInfoBoxTimeFlight(InfoBoxData &data) { const FlyingState &flight = CommonInterface::Calculated().flight; if (!positive(flight.flight_time)) { data.SetInvalid(); return; } // Set Value TCHAR value[32], comment[32]; FormatTimeTwoLines(value, comment, (int)flight.flight_time); data.SetValue(value); data.SetComment(comment); }
void UpdateInfoBoxThermalLastTime(InfoBoxData &data) { const OneClimbInfo &thermal = CommonInterface::Calculated().last_thermal; if (!thermal.IsDefined()) { data.SetInvalid(); return; } // Set Value TCHAR value[32], comment[32]; FormatTimeTwoLines(value, comment, (int)thermal.duration); data.SetValue(value); data.SetComment(comment); }
void UpdateInfoBoxFinalETE(InfoBoxData &data) { const TaskStats &task_stats = CommonInterface::Calculated().task_stats; if (!task_stats.task_valid || !task_stats.total.IsAchievable()) { data.SetInvalid(); return; } assert(!negative(task_stats.total.time_remaining_now)); TCHAR value[32]; TCHAR comment[32]; const int dd = abs((int)task_stats.total.time_remaining_now); FormatTimeTwoLines(value, comment, dd); data.SetValue(value); data.SetComment(comment); }
void UpdateInfoBoxNextETE(InfoBoxData &data) { // use proper non-terminal next task stats const TaskStats &task_stats = CommonInterface::Calculated().task_stats; if (!task_stats.task_valid || !task_stats.current_leg.IsAchievable()) { data.SetInvalid(); return; } assert(!negative(task_stats.current_leg.time_remaining_now)); TCHAR value[32]; TCHAR comment[32]; const int dd = (int)task_stats.current_leg.time_remaining_now; FormatTimeTwoLines(value, comment, dd); data.SetValue(value); data.SetComment(comment); }
void InfoBoxContentTaskAATime::Update(InfoBoxData &data) { const TaskStats &task_stats = XCSoarInterface::Calculated().task_stats; const CommonStats &common_stats = XCSoarInterface::Calculated().common_stats; if (!common_stats.ordered_has_targets || !task_stats.task_valid || !task_stats.total.IsAchievable()) { data.SetInvalid(); return; } TCHAR value[32]; TCHAR comment[32]; FormatTimeTwoLines(value, comment, abs((int) common_stats.aat_time_remaining)); data.UnsafeFormatValue(negative(common_stats.aat_time_remaining) ? _T("-%s") : _T("%s"), value); data.SetValueColor(negative(common_stats.aat_time_remaining) ? 1 : 0); data.SetComment(comment); }
void UpdateInfoBoxTaskAATime(InfoBoxData &data) { const auto &calculated = CommonInterface::Calculated(); const TaskStats &task_stats = calculated.ordered_task_stats; const CommonStats &common_stats = calculated.common_stats; if (!task_stats.has_targets || !task_stats.total.IsAchievable()) { data.SetInvalid(); return; } TCHAR value[32]; TCHAR comment[32]; FormatTimeTwoLines(value, comment, abs((int) common_stats.aat_time_remaining)); data.UnsafeFormatValue(common_stats.aat_time_remaining < 0 ? _T("-%s") : _T("%s"), value); data.SetValueColor(common_stats.aat_time_remaining < 0 ? 1 : 0); data.SetComment(comment); }
static void TestTwoLines() { TCHAR buffer[256], buffer2[256]; FormatTimeTwoLines(buffer, buffer2, 0); ok1(StringIsEqual(buffer, _T("00'00"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 1); ok1(StringIsEqual(buffer, _T("00'01"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 59); ok1(StringIsEqual(buffer, _T("00'59"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 60); ok1(StringIsEqual(buffer, _T("01'00"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 60 * 5); ok1(StringIsEqual(buffer, _T("05'00"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 60 * 59); ok1(StringIsEqual(buffer, _T("59'00"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, 60 * 60); ok1(StringIsEqual(buffer, _T("01:00"))); ok1(StringIsEqual(buffer2, _T("00"))); FormatTimeTwoLines(buffer, buffer2, 60 * 60 * 3 + 60 * 25 + 13); ok1(StringIsEqual(buffer, _T("03:25"))); ok1(StringIsEqual(buffer2, _T("13"))); FormatTimeTwoLines(buffer, buffer2, 60 * 60 * 19 + 60 * 47 + 28); ok1(StringIsEqual(buffer, _T("19:47"))); ok1(StringIsEqual(buffer2, _T("28"))); FormatTimeTwoLines(buffer, buffer2, -(60 * 59)); ok1(StringIsEqual(buffer, _T("59'00"))); ok1(StringIsEqual(buffer2, _T(""))); FormatTimeTwoLines(buffer, buffer2, -(60 * 60 * 19 + 60 * 47 + 28)); ok1(StringIsEqual(buffer, _T("19:47"))); ok1(StringIsEqual(buffer2, _T("28"))); }