static void ExpandTrafficMacros(TCHAR *buffer, size_t size) { TrafficWidget *widget = (TrafficWidget *) CommonInterface::main_window->GetFlavourWidget(_T("Traffic")); if (widget == nullptr) return; CondReplaceInString(widget->GetAutoZoom(), buffer, _T("$(TrafficZoomAutoToggleActionName)"), _("Manual"), _("Auto"), size); CondReplaceInString(widget->GetNorthUp(), buffer, _T("$(TrafficNorthUpToggleActionName)"), _("Track up"), _("North up"), size); }
static bool ExpandTaskMacros(TCHAR *OutBuffer, size_t Size, const DerivedInfo &calculated, const ComputerSettings &settings_computer) { const TaskStats &task_stats = calculated.task_stats; const TaskStats &ordered_task_stats = calculated.ordered_task_stats; const CommonStats &common_stats = calculated.common_stats; bool invalid = false; if (_tcsstr(OutBuffer, _T("$(CheckTaskResumed)"))) { // TODO code: check, does this need to be set with temporary task? if (common_stats.task_type == TaskType::ABORT || common_stats.task_type == TaskType::GOTO) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckTaskResumed)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckTask)"))) { if (!task_stats.task_valid) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckTask)"), _T(""), Size); } if (protected_task_manager == NULL) return true; ProtectedTaskManager::Lease task_manager(*protected_task_manager); const AbstractTask *task = task_manager->GetActiveTask(); if (task == NULL || !task_stats.task_valid || common_stats.task_type == TaskType::GOTO) { if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointNext)"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointPrevious)"), _("Previous Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Previous Turnpoint"), Size); } } else if (common_stats.task_type == TaskType::ABORT) { if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { if (!common_stats.active_has_next) invalid = true; CondReplaceInString(common_stats.next_is_last, OutBuffer, _T("$(WaypointNext)"), _("Furthest Landpoint"), _("Next Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { if (!common_stats.active_has_previous) invalid = true; CondReplaceInString(common_stats.previous_is_first, OutBuffer, _T("$(WaypointPrevious)"), _("Closest Landpoint"), _("Previous Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { if (!common_stats.active_has_next) invalid = true; CondReplaceInString(common_stats.next_is_last, OutBuffer, _T("$(WaypointNextArm)"), _("Furthest Landpoint"), _("Next Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { if (!common_stats.active_has_previous) invalid = true; CondReplaceInString(common_stats.previous_is_first, OutBuffer, _T("$(WaypointPreviousArm)"), _("Closest Landpoint"), _("Previous Landpoint"), Size); } } else { // ordered task mode const bool next_is_final = common_stats.next_is_last; const bool previous_is_start = common_stats.previous_is_first; const bool has_optional_starts = calculated.common_stats.ordered_has_optional_starts; if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { // Waypoint\nNext if (!common_stats.active_has_next) invalid = true; CondReplaceInString(next_is_final, OutBuffer, _T("$(WaypointNext)"), _("Finish Turnpoint"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { if (has_optional_starts && !common_stats.active_has_previous) { ReplaceInString(OutBuffer, _T("$(WaypointPrevious)"), _("Next Startpoint"), Size); } else { CondReplaceInString(previous_is_start, OutBuffer, _T("$(WaypointPrevious)"), _("Start Turnpoint"), _("Previous Turnpoint"), Size); if (!common_stats.active_has_previous) invalid = true; } } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { // Waypoint\nNext switch (task_manager->GetTaskAdvance().GetState()) { case TaskAdvance::MANUAL: case TaskAdvance::AUTO: case TaskAdvance::START_ARMED: case TaskAdvance::TURN_ARMED: CondReplaceInString(next_is_final, OutBuffer, _T("$(WaypointNextArm)"), _("Finish Turnpoint"), _("Next Turnpoint"), Size); if (!common_stats.active_has_next) invalid = true; break; case TaskAdvance::START_DISARMED: ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Arm start"), Size); break; case TaskAdvance::TURN_DISARMED: ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Arm turn"), Size); break; } } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { switch (task_manager->GetTaskAdvance().GetState()) { case TaskAdvance::MANUAL: case TaskAdvance::AUTO: case TaskAdvance::START_DISARMED: case TaskAdvance::TURN_DISARMED: if (has_optional_starts && !common_stats.active_has_previous) { ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Next Startpoint"), Size); } else { CondReplaceInString(previous_is_start, OutBuffer, _T("$(WaypointPreviousArm)"), _("Start Turnpoint"), _("Previous Turnpoint"), Size); if (!common_stats.active_has_previous) invalid = true; } break; case TaskAdvance::START_ARMED: ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Disarm start"), Size); break; case TaskAdvance::TURN_ARMED: ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Disarm turn"), Size); break; } } } if (_tcsstr(OutBuffer, _T("$(AdvanceArmed)"))) { switch (task_manager->GetTaskAdvance().GetState()) { case TaskAdvance::MANUAL: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Advance\n(manual)"), Size); invalid = true; break; case TaskAdvance::AUTO: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Advance\n(auto)"), Size); invalid = true; break; case TaskAdvance::START_ARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Abort\nStart"), Size); invalid = false; break; case TaskAdvance::START_DISARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Arm\nStart"), Size); invalid = false; break; case TaskAdvance::TURN_ARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Abort\nTurn"), Size); invalid = false; break; case TaskAdvance::TURN_DISARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Arm\nTurn"), Size); invalid = false; break; } } if (_tcsstr(OutBuffer, _T("$(CheckAutoMc)"))) { if (!task_stats.task_valid && settings_computer.task.IsAutoMCFinalGlideEnabled()) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckAutoMc)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(TaskAbortToggleActionName)"))) { if (common_stats.task_type == TaskType::GOTO) { CondReplaceInString(ordered_task_stats.task_valid, OutBuffer, _T("$(TaskAbortToggleActionName)"), _("Resume"), _("Abort"), Size); } else CondReplaceInString(common_stats.task_type == TaskType::ABORT, OutBuffer, _T("$(TaskAbortToggleActionName)"), _("Resume"), _("Abort"), Size); } return invalid; }
bool ButtonLabel::ExpandMacros(const TCHAR *In, TCHAR *OutBuffer, size_t Size) { // ToDo, check Buffer Size bool invalid = false; CopyString(OutBuffer, In, Size); if (_tcsstr(OutBuffer, _T("$(")) == NULL) return false; if (_tcsstr(OutBuffer, _T("$(CheckAirspace)"))) { if (airspace_database.empty()) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckAirspace)"), _T(""), Size); } invalid |= ExpandTaskMacros(OutBuffer, Size, Calculated(), GetComputerSettings()); ExpandTrafficMacros(OutBuffer, Size); if (_tcsstr(OutBuffer, _T("$(CheckFLARM)"))) { if (!Basic().flarm.status.available) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckFLARM)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckCircling)"))) { if (!Calculated().circling) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckCircling)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckVega)"))) { if (devVarioFindVega()== NULL) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckVega)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckReplay)"))) { if (CommonInterface::MovementDetected()) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckReplay)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckWaypointFile)"))) { invalid |= way_points.IsEmpty(); ReplaceInString(OutBuffer, _T("$(CheckWaypointFile)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckLogger)"))) { invalid |= Basic().gps.replay; ReplaceInString(OutBuffer, _T("$(CheckLogger)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckNet)"))) { #ifndef HAVE_HTTP invalid = true; #endif ReplaceInString(OutBuffer, _T("$(CheckNet)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckTerrain)"))) { if (!Calculated().terrain_valid) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckTerrain)"), _T(""), Size); } CondReplaceInString(logger != nullptr && logger->IsLoggerActive(), OutBuffer, _T("$(LoggerActive)"), _("Stop"), _("Start"), Size); if (_tcsstr(OutBuffer, _T("$(SnailTrailToggleName)"))) { switch (GetMapSettings().trail.length) { case TrailSettings::Length::OFF: ReplaceInString(OutBuffer, _T("$(SnailTrailToggleName)"), _("Long"), Size); break; case TrailSettings::Length::LONG: ReplaceInString(OutBuffer, _T("$(SnailTrailToggleName)"), _("Short"), Size); break; case TrailSettings::Length::SHORT: ReplaceInString(OutBuffer, _T("$(SnailTrailToggleName)"), _("Full"), Size); break; case TrailSettings::Length::FULL: ReplaceInString(OutBuffer, _T("$(SnailTrailToggleName)"), _("Off"), Size); break; } } if (_tcsstr(OutBuffer, _T("$(AirSpaceToggleName)"))) { ReplaceInString(OutBuffer, _T("$(AirSpaceToggleName)"), GetMapSettings().airspace.enable ? _("Off") : _("On"), Size); } if (_tcsstr(OutBuffer, _T("$(TerrainTopologyToggleName)"))) { char val = 0; if (GetMapSettings().topography_enabled) val++; if (GetMapSettings().terrain.enable) val += (char)2; switch (val) { case 0: ReplaceInString(OutBuffer, _T("$(TerrainTopologyToggleName)"), _("Topography On"), Size); break; case 1: ReplaceInString(OutBuffer, _T("$(TerrainTopologyToggleName)"), _("Terrain On"), Size); break; case 2: ReplaceInString(OutBuffer, _T("$(TerrainTopologyToggleName)"), _("Terrain + Topography"), Size); break; case 3: ReplaceInString(OutBuffer, _T("$(TerrainTopologyToggleName)"), _("Terrain Off"), Size); break; } } if (_tcsstr(OutBuffer, _T("$(TerrainTopographyToggleName)"))) { char val = 0; if (GetMapSettings().topography_enabled) val++; if (GetMapSettings().terrain.enable) val += (char)2; switch (val) { case 0: ReplaceInString(OutBuffer, _T("$(TerrainTopographyToggleName)"), _("Topography On"), Size); break; case 1: ReplaceInString(OutBuffer, _T("$(TerrainTopographyToggleName)"), _("Terrain On"), Size); break; case 2: ReplaceInString(OutBuffer, _T("$(TerrainTopographyToggleName)"), _("Terrain + Topography"), Size); break; case 3: ReplaceInString(OutBuffer, _T("$(TerrainTopographyToggleName)"), _("Terrain Off"), Size); break; } } CondReplaceInString(CommonInterface::main_window->GetFullScreen(), OutBuffer, _T("$(FullScreenToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetMapSettings().auto_zoom_enabled, OutBuffer, _T("$(ZoomAutoToggleActionName)"), _("Manual"), _("Auto"), Size); CondReplaceInString(GetMapSettings().topography_enabled, OutBuffer, _T("$(TopologyToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetMapSettings().topography_enabled, OutBuffer, _T("$(TopographyToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetMapSettings().terrain.enable, OutBuffer, _T("$(TerrainToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetMapSettings().airspace.enable, OutBuffer, _T("$(AirspaceToggleActionName)"), _("Off"), _("On"), Size); if (_tcsstr(OutBuffer, _T("$(MapLabelsToggleActionName)"))) { static const TCHAR *const labels[] = { N_("All"), N_("Task & Landables"), N_("Task"), N_("None") }; static constexpr unsigned int n = ARRAY_SIZE(labels); unsigned int i = (unsigned)GetMapSettings().waypoint.label_selection; ReplaceInString(OutBuffer, _T("$(MapLabelsToggleActionName)"), gettext(labels[(i + 1) % n]), Size); } CondReplaceInString(GetComputerSettings().task.auto_mc, OutBuffer, _T("$(MacCreadyToggleActionName)"), _("Manual"), _("Auto"), Size); CondReplaceInString(GetUIState().auxiliary_enabled, OutBuffer, _T("$(AuxInfoToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetUIState().force_display_mode == DisplayMode::CIRCLING, OutBuffer, _T("$(DispModeClimbShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetUIState().force_display_mode == DisplayMode::CRUISE, OutBuffer, _T("$(DispModeCruiseShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetUIState().force_display_mode == DisplayMode::NONE, OutBuffer, _T("$(DispModeAutoShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetUIState().force_display_mode == DisplayMode::FINAL_GLIDE, OutBuffer, _T("$(DispModeFinalShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.altitude_mode == AirspaceDisplayMode::ALLON, OutBuffer, _T("$(AirspaceModeAllShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.altitude_mode == AirspaceDisplayMode::CLIP, OutBuffer, _T("$(AirspaceModeClipShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.altitude_mode == AirspaceDisplayMode::AUTO, OutBuffer, _T("$(AirspaceModeAutoShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.altitude_mode == AirspaceDisplayMode::ALLBELOW, OutBuffer, _T("$(AirspaceModeBelowShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.altitude_mode == AirspaceDisplayMode::ALLOFF, OutBuffer, _T("$(AirspaceModeAllOffIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().trail.length == TrailSettings::Length::OFF, OutBuffer, _T("$(SnailTrailOffShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().trail.length == TrailSettings::Length::SHORT, OutBuffer, _T("$(SnailTrailShortShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().trail.length == TrailSettings::Length::LONG, OutBuffer, _T("$(SnailTrailLongShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().trail.length == TrailSettings::Length::FULL, OutBuffer, _T("$(SnailTrailFullShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(!GetMapSettings().airspace.enable, OutBuffer, _T("$(AirSpaceOffShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(GetMapSettings().airspace.enable, OutBuffer, _T("$(AirSpaceOnShortIndicator)"), _T("(*)"), _T(""), Size); CondReplaceInString(CommonInterface::GetUISettings().traffic.enable_gauge, OutBuffer, _T("$(FlarmDispToggleActionName)"), _("Off"), _("On"), Size); CondReplaceInString(GetMapSettings().auto_zoom_enabled, OutBuffer, _T("$(ZoomAutoToggleActionName)"), _("Manual"), _("Auto"), Size); if (_tcsstr(OutBuffer, _T("$(NextPageName)"))) { TCHAR label[30]; const PageLayout &page = CommonInterface::GetUISettings().pages.pages[Pages::NextIndex()]; page.MakeTitle(CommonInterface::GetUISettings().info_boxes, label, true); ReplaceInString(OutBuffer, _T("$(NextPageName)"), label, Size); } return invalid; }
// // TODO CHECK BUFFER SIZE, which is 100 (set in Buttons). // bool ExpandMacros(const TCHAR *In, TCHAR *OutBuffer, size_t Size){ TCHAR *a; LK_tcsncpy(OutBuffer, In, Size - 1); if (_tcsstr(OutBuffer, TEXT("$(")) == NULL) { return false; } short items=1; bool invalid = false; // Accelerator for entire label replacement- only one macro per label accepted a =_tcsstr(OutBuffer, TEXT("$(AC")); if (a != NULL) { TCHAR tbuf[20]; short i; i= (*(a+4)-'0')*10; i+= *(a+5)-'0'; LKASSERT(i>=0 && i<41); switch(i) { case 0: // LOCKMODE _tcscpy(OutBuffer,_T("")); // default is button invisible if (LockMode(0)) { // query availability if (LockMode(1)) // query status _tcscpy(OutBuffer,MsgToken(965)); // UNLOCK\nSCREEN else _tcscpy(OutBuffer,MsgToken(966)); // LOCK\nSCREEN if (!LockMode(3)) invalid=true; // button not usable } break; case 1: // Pan Supertoggle PanModeStatus mode=pan location=8 if ( MapWindow::mode.AnyPan() ) _stprintf(OutBuffer, _T("%s%s"),MsgToken(2004),MsgToken(491)); // OFF else _stprintf(OutBuffer, _T("%s%s"),MsgToken(2004),MsgToken(894)); // ON break; case 2: // Pan Supertoggle PanModeStatus mode=ScreenMode location=8 if ( MapWindow::mode.AnyPan() ) _stprintf(OutBuffer, _T("%s\n%s"),MsgToken(2082),MsgToken(491)); // OFF else _stprintf(OutBuffer, _T("%s\n%s"),MsgToken(2082),MsgToken(894)); // ON break; case 3: // DISABLED _tcscpy(OutBuffer,MsgToken(2023)); // Reserved invalid=true; break; case 4: // MacCreadyValue + 2078 _stprintf(tbuf,_T("%2.1lf"), iround(LIFTMODIFY*MACCREADY*10)/10.0); _stprintf(OutBuffer, _T("%s\n%s"), MsgToken(2078), tbuf); break; case 5: if (CALCULATED_INFO.AutoMacCready) { switch(AutoMcMode) { case amcFinalGlide: _stprintf(tbuf,_T("%s"), MsgToken(1681)); break; case amcAverageClimb: _stprintf(tbuf,_T("%s"), MsgToken(1682)); break; case amcEquivalent: _stprintf(tbuf,_T("%s"), MsgToken(1683)); break; case amcFinalAndClimb: if (CALCULATED_INFO.FinalGlide) _stprintf(tbuf,_T("%s"), MsgToken(1681)); else _stprintf(tbuf,_T("%s"), MsgToken(1682)); break; default: // LKTOKEN _@M1202_ "Auto" _stprintf(tbuf,_T("%s"), MsgToken(1202)); break; } } else { // LKTOKEN _@M1201_ "Man" _stprintf(tbuf,_T("%s"), MsgToken(1201)); } _stprintf(OutBuffer,_T("Mc %s\n%2.1lf"), tbuf,iround(LIFTMODIFY*MACCREADY*10)/10.0); break; case 6: // WaypointNext invalid = !ValidTaskPoint(ActiveTaskPoint+1); if (!ValidTaskPoint(ActiveTaskPoint+2)) _tcscpy(OutBuffer,MsgToken(801)); // Waypoint Finish else _tcscpy(OutBuffer,MsgToken(802)); // Waypoint Next break; case 7: // WaypointPrevious if (ActiveTaskPoint==1) { invalid = !ValidTaskPoint(ActiveTaskPoint-1); _tcscpy(OutBuffer,MsgToken(804)); // Waypoint Start } else if (EnableMultipleStartPoints) { invalid = !ValidTaskPoint(0); if (ActiveTaskPoint==0) _tcscpy(OutBuffer,_T("StartPnt\nCycle")); else _tcscpy(OutBuffer,MsgToken(803)); // Waypoint Previous } else { invalid = (ActiveTaskPoint<=0); _tcscpy(OutBuffer,MsgToken(803)); // Waypoint Previous } break; case 8: // RealTask check for Task reset if (! (ValidTaskPoint(ActiveTaskPoint) && ValidTaskPoint(1))) { invalid=true; } _tcscpy(OutBuffer,MsgToken(2019)); // Task reset break; case 9: // TerrainVisible for ChangeBack topology color if (CALCULATED_INFO.TerrainValid && IsMultimapTerrain() && !LKVarioBar) { invalid = true; } _tcscpy(OutBuffer,MsgToken(2037)); // Change topo back break; case 10: // TOGGLEHBAR HBARAVAILABLE for Toggle HBAR button if (!GPS_INFO.BaroAltitudeAvailable) { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2045),MsgToken(1068)); // Nav by HBAR invalid=true; } else { if (EnableNavBaroAltitude) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2045),MsgToken(1174)); // Nav by HGPS else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2045),MsgToken(1068)); // Nav by HBAR } break; case 11: // SIM MENU SIMONLY if (SIMMODE) _tcscpy(OutBuffer,MsgToken(2074)); // SIM MENU else _tcscpy(OutBuffer,_T("")); break; case 12: // THIS MACRO IS AVAILABLE FOR USE break; case 13: if(UseTotalEnergy) { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2115),MsgToken(894)); // TE ON } else { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2115),MsgToken(491)); // TE OFF } break; case 14: if ( Shading ) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2080),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2080),MsgToken(894)); // ON break; case 15: if (EnableSoundModes) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2055),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2055),MsgToken(894)); // ON break; case 16: // ActiveMap no more used now Radio Button #ifdef RADIO_ACTIVE if (RadioPara.Enabled) { _stprintf(OutBuffer,_T("%s\n"),MsgToken(2306)); // TEXT invalid=false; } else { _stprintf(OutBuffer,_T("%s\n"),MsgToken(2306)); // TEXT invalid=true; } #else invalid=true; #endif break; case 17: // Order is: ALL ON, TEXT ONLY, GAUGES ONLY, ALL OFF if (!HaveGauges()) { if (!IsMultimapOverlaysText()) { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(2234)); // TEXT } else { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(491)); // OFF } break; } if (!IsMultimapOverlaysText()&&!IsMultimapOverlaysGauges()) { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(899)); // ALL ON } else { if (IsMultimapOverlaysAll()) { _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(2234)); // TEXT } else { if (IsMultimapOverlaysText()) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(2235)); // GAUGES else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2079),MsgToken(898)); // ALL OFF } } break; case 18: if (Orbiter) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2065),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2065),MsgToken(894)); // ON if (!EnableThermalLocator) invalid = true; break; case 19: if (IsMultimapAirspace()) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(894)); // ON break; case 20: if (MapWindow::zoom.AutoZoom() ) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2009),MsgToken(418)); else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2009),MsgToken(897)); break; case 21: if (IsMultimapTopology()) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2027),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2027),MsgToken(894)); // ON break; case 22: if (IsMultimapTerrain()) _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2028),MsgToken(491)); // OFF else _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2028),MsgToken(894)); // ON break; case 23: if (MapSpaceMode!=MSM_MAP) invalid=true; if (MapWindow::mode.UserForcedMode() == MapWindow::Mode::MODE_FLY_CIRCLING) _stprintf(OutBuffer,_T("DspMode\n_%s_"),MsgToken(2031)); else _stprintf(OutBuffer,_T("DspMode\n%s"),MsgToken(2031)); break; case 24: if (MapSpaceMode!=MSM_MAP) invalid=true; if (MapWindow::mode.UserForcedMode() == MapWindow::Mode::MODE_FLY_CRUISE) _stprintf(OutBuffer,_T("DspMode\n_%s_"),MsgToken(2032)); else _stprintf(OutBuffer,_T("DspMode\n%s"),MsgToken(2032)); break; case 25: if (MapSpaceMode!=MSM_MAP) invalid=true; if (MapWindow::mode.UserForcedMode() == MapWindow::Mode::MODE_FLY_NONE) _stprintf(OutBuffer,_T("DspMode\n_%s_"),MsgToken(2034)); else _stprintf(OutBuffer,_T("DspMode\n%s"),MsgToken(2034)); break; case 26: if (MapSpaceMode!=MSM_MAP) invalid=true; if (MapWindow::mode.UserForcedMode() == MapWindow::Mode::MODE_FLY_FINAL_GLIDE) _stprintf(OutBuffer,_T("DspMode\n_%s_"),MsgToken(2033)); else _stprintf(OutBuffer,_T("DspMode\n%s"),MsgToken(2033)); break; case 27: // amcIsBoth if (CALCULATED_INFO.AutoMacCready && AutoMcMode==amcFinalAndClimb) _stprintf(OutBuffer,_T("Auto\n_%s_"),MsgToken(2117)); else _stprintf(OutBuffer,_T("Auto\n%s"),MsgToken(2117)); break; case 28: // amcIsFinal if (CALCULATED_INFO.AutoMacCready && AutoMcMode==amcFinalGlide) _stprintf(OutBuffer,_T("Auto\n_%s_"),MsgToken(2033)); else _stprintf(OutBuffer,_T("Auto\n%s"),MsgToken(2033)); break; case 29: // amcIsClimb if (CALCULATED_INFO.AutoMacCready && AutoMcMode==amcAverageClimb) _stprintf(OutBuffer,_T("Auto\n_%s_"),MsgToken(2075)); else _stprintf(OutBuffer,_T("Auto\n%s"),MsgToken(2075)); break; case 30: // amcIsEquiv if (CALCULATED_INFO.AutoMacCready && AutoMcMode==amcEquivalent) _stprintf(OutBuffer,_T("Auto\n_%s_"),MsgToken(2076)); else _stprintf(OutBuffer,_T("Auto\n%s"),MsgToken(2076)); break; case 31: // CheckManMc if (CALCULATED_INFO.AutoMacCready) _stprintf(OutBuffer,_T("Mc\n%s"),MsgToken(2077)); else _stprintf(OutBuffer,_T("Mc\n_%s_"),MsgToken(2077)); break; case 32: // AirspaceMode switch(AltitudeMode) { case 0: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(184)); // Clip break; case 1: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(897)); // Auto break; case 2: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(139)); // Below break; case 3: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(359)); // Inside break; case 4: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(75)); // All Off break; case 5: default: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2029),MsgToken(76)); // All On break; } break; case 33: // SnailTrailToggleName if (MapSpaceMode!=MSM_MAP) invalid=true; // Since we show the next choice, but the order is not respected in 5.0: // the new order is artificially off-short-long-full, as in the inputevents button management switch(TrailActive) { case 0: // off to short _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2035),MsgToken(612)); // Short break; case 1: // long to full _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2035),MsgToken(312)); // Full break; case 2: // short to long _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2035),MsgToken(410)); // Long break; case 3: // full to off default: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2035),MsgToken(491)); // OFF break; } break; case 34: // MapLabelsToggleActionName switch(GetMultimap_Labels()) { case MAPLABELS_ALLON: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2026),MsgToken(1203)); // WPTS break; case MAPLABELS_ONLYWPS: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2026),MsgToken(1204)); // TOPO break; case MAPLABELS_ONLYTOPO: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2026),MsgToken(898)); break; case MAPLABELS_ALLOFF: default: _stprintf(OutBuffer,_T("%s\n%s"),MsgToken(2026),MsgToken(899)); break; } break; case 35: // SIM PAN MODE REPOSITION, PANREPOS if (SIMMODE) _tcscpy(OutBuffer,MsgToken(2133)); // Position else _tcscpy(OutBuffer,_T("")); break; case 36: // // Order is: ALL ON, TASK ONLY, FAI ONLY, ALL OFF if (Flags_DrawTask&&Flags_DrawFAI) { _tcscpy(OutBuffer,MsgToken(2238)); // Draw Task } else { if (Flags_DrawTask&&!Flags_DrawFAI) { _tcscpy(OutBuffer,MsgToken(2239)); // Draw FAI } else { if (!Flags_DrawTask&&Flags_DrawFAI) { _tcscpy(OutBuffer,MsgToken(2240)); // NoDraw TaskFAI } else { _tcscpy(OutBuffer,MsgToken(2241)); // Draw TaskFAI } } } break; case 37: // if (SonarWarning) _tcscpy(OutBuffer,MsgToken(2243)); // Sonar OFF else _tcscpy(OutBuffer,MsgToken(2242)); // Sonar ON break; case 38: // if (MapSpaceMode!=MSM_MAP) invalid=true; _tcscpy(OutBuffer,MsgToken(2081)); // Set Map break; case 39: if (! (ValidTaskPoint(ActiveTaskPoint) && ValidTaskPoint(1))) { invalid=true; } _tcscpy(OutBuffer,MsgToken(1850)); // Task reverse break; case 40: if(IsKobo()) { #ifdef KOBO if(IsKoboWifiOn()) { _tcscpy(OutBuffer,_T("Wifi\nOff")); } else { _tcscpy(OutBuffer,_T("Wifi\nOn")); } #endif } else { _tcscpy(OutBuffer,_T("")); } break; default: _stprintf(OutBuffer, _T("INVALID\n%d"),i); break; } goto label_ret; } // ACcelerator // No accelerator? First check if we have a second macro embedded in string a =_tcsstr(OutBuffer, TEXT("&(")); if (a != NULL) { *a=_T('$'); items=2; } // Then go for one-by-one match search, slow if (_tcsstr(OutBuffer, TEXT("$(AdvanceArmed)"))) { switch (AutoAdvance) { case 0: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(892), Size); // (manual) invalid = true; break; case 1: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(893), Size); // (auto) invalid = true; break; case 2: if (ActiveTaskPoint>0) { if (ValidTaskPoint(ActiveTaskPoint+1)) { CondReplaceInString(AdvanceArmed, OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(161), // Cancel MsgToken(678), Size); // TURN } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(8), Size); // (finish) invalid = true; } } else { CondReplaceInString(AdvanceArmed, OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(161), // Cancel MsgToken(571), Size); // START } break; case 3: if (ActiveTaskPoint==0) { CondReplaceInString(AdvanceArmed, OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(161), // Cancel MsgToken(571), Size); // START } else if (ActiveTaskPoint==1) { CondReplaceInString(AdvanceArmed, OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(161), // Cancel MsgToken(539), Size); // RESTART } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(893), Size); // (auto) invalid = true; } break; // TODO bug: no need to arm finish case 4: if (ActiveTaskPoint>0) { if (ValidTaskPoint(ActiveTaskPoint+1)) { CondReplaceInString(AdvanceArmed, OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(161), // Cancel MsgToken(678), Size); // TURN } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(8), Size); // (finish) invalid = true; } } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), MsgToken(893), Size); // (auto) invalid = true; } break; default: break; } if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckFlying)"))) { if (!CALCULATED_INFO.Flying) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckFlying)"), TEXT(""), Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(NotInReplay)"))) { if (ReplayLogger::IsEnabled()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(NotInReplay)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckWaypointFile)"))) { if (!ValidWayPoint(NUMRESWP)) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckWaypointFile)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckSettingsLockout)"))) { if (LockSettingsInFlight && CALCULATED_INFO.Flying) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckSettingsLockout)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckTask)"))) { if (!ValidTaskPoint(ActiveTaskPoint)) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTask)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckAirspace)"))) { if (!CAirspaceManager::Instance().ValidAirspaces()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckAirspace)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(CheckFLARM)"))) { if (!GPS_INFO.FLARM_Available) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckFLARM)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } // If it is not SIM mode, it is invalid if (_tcsstr(OutBuffer, TEXT("$(OnlyInSim)"))) { if (!SIMMODE) invalid = true; ReplaceInString(OutBuffer, TEXT("$(OnlyInSim)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(OnlyInFly)"))) { #if TESTBENCH invalid=false; #else if (SIMMODE) invalid = true; #endif ReplaceInString(OutBuffer, TEXT("$(OnlyInFly)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(WCSpeed)"))) { TCHAR tbuf[10]; _stprintf(tbuf,_T("%.0f%s"),SPEEDMODIFY*WindCalcSpeed,Units::GetUnitName(Units::GetUserHorizontalSpeedUnit()) ); ReplaceInString(OutBuffer, TEXT("$(WCSpeed)"), tbuf, Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(GS"))) { TCHAR tbuf[10]; _stprintf(tbuf,_T("%.0f%s"),SPEEDMODIFY*GPS_INFO.Speed,Units::GetUnitName(Units::GetUserHorizontalSpeedUnit()) ); ReplaceInString(OutBuffer, TEXT("$(GS)"), tbuf, Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(HGPS"))) { TCHAR tbuf[10]; _stprintf(tbuf,_T("%.0f%s"),ALTITUDEMODIFY*GPS_INFO.Altitude,Units::GetUnitName(Units::GetUserAltitudeUnit()) ); ReplaceInString(OutBuffer, TEXT("$(HGPS)"), tbuf, Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(TURN"))) { TCHAR tbuf[10]; _stprintf(tbuf,_T("%.0f"),SimTurn); ReplaceInString(OutBuffer, TEXT("$(TURN)"), tbuf, Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(NETTO"))) { TCHAR tbuf[10]; _stprintf(tbuf,_T("%.1f"),SimNettoVario); ReplaceInString(OutBuffer, TEXT("$(NETTO)"), tbuf, Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(LoggerActive)"))) { CondReplaceInString(LoggerActive, OutBuffer, TEXT("$(LoggerActive)"), MsgToken(670), MsgToken(657), Size); // Stop Start if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(NoSmart)"))) { if (DisplayOrientation == NORTHSMART) invalid = true; ReplaceInString(OutBuffer, TEXT("$(NoSmart)"), TEXT(""), Size); if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(FinalForceToggleActionName)"))) { CondReplaceInString(ForceFinalGlide, OutBuffer, TEXT("$(FinalForceToggleActionName)"), MsgToken(896), // Unforce MsgToken(895), // Force Size); if (AutoForceFinalGlide) { invalid = true; } if (--items<=0) goto label_ret; // 100517 } if (_tcsstr(OutBuffer, TEXT("$(PCONLY)"))) { if(IsEmbedded()) { _tcscpy(OutBuffer,_T("")); invalid = true; } else { ReplaceInString(OutBuffer, TEXT("$(PCONLY)"), TEXT(""), Size); } if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(NOTPC)"))) { if(IsEmbedded()) { ReplaceInString(OutBuffer, TEXT("$(NOTPC)"), TEXT(""), Size); } else { _tcscpy(OutBuffer,_T("")); invalid = true; } if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(ONLYMAP)"))) { if (MapSpaceMode!=MSM_MAP) invalid=true; ReplaceInString(OutBuffer, TEXT("$(ONLYMAP)"), TEXT(""), Size); if (--items<=0) goto label_ret; } if (_tcsstr(OutBuffer, TEXT("$(SCREENROTATE)"))) { if(CanRotateScreen()) { ReplaceInString(OutBuffer, TEXT("$(SCREENROTATE)"), TEXT(""), Size); } else { _tcscpy(OutBuffer,_T("")); invalid = true; } if (--items<=0) goto label_ret; } extern unsigned int CustomKeyLabel[]; // We dont replace macro, we do replace the entire label a =_tcsstr(OutBuffer, TEXT("$(MM")); if (a != NULL) { short i; i= *(a+4)-48; LKASSERT(i>=0 && i<11); // get the label for the custom menu item here // Decide if invalid=true or if no label at all, setting Replace to empty string unsigned int ckeymode; // test mode only switch(i) { case 1: ckeymode=CustomMenu1; break; case 2: ckeymode=CustomMenu2; break; case 3: ckeymode=CustomMenu3; break; case 4: ckeymode=CustomMenu4; break; case 5: ckeymode=CustomMenu5; break; case 6: ckeymode=CustomMenu6; break; case 7: ckeymode=CustomMenu7; break; case 8: ckeymode=CustomMenu8; break; case 9: ckeymode=CustomMenu9; break; case 0: ckeymode=CustomMenu10; break; default: ckeymode=0; break; } if (ckeymode==0 || ckeymode>=ckTOP) { invalid=true; // non selectable // _stprintf(OutBuffer,_T("Key\n%d"),i); _tcscpy(OutBuffer,_T("")); // make it invisible } else { _tcscpy(OutBuffer,MsgToken( CustomKeyLabel[ckeymode] )); } } // MM label_ret: return invalid; }
static bool ExpandTaskMacros(TCHAR *OutBuffer, size_t Size, const DerivedInfo &calculated, const ComputerSettings &settings_computer) { if (protected_task_manager == NULL) return true; bool invalid = false; ProtectedTaskManager::Lease task_manager(*protected_task_manager); if (_tcsstr(OutBuffer, _T("$(CheckTaskResumed)"))) { // TODO code: check, does this need to be set with temporary task? if (task_manager->IsMode(TaskManager::MODE_ABORT) || task_manager->IsMode(TaskManager::MODE_GOTO)) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckTaskResumed)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(CheckTask)"))) { if (!calculated.task_stats.task_valid) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckTask)"), _T(""), Size); } const AbstractTask *task = task_manager->GetActiveTask(); if (task == NULL || !task->CheckTask() || task_manager->IsMode(TaskManager::MODE_GOTO)) { if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointNext)"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointPrevious)"), _("Previous Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { invalid = true; ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Previous Turnpoint"), Size); } } else if (task_manager->IsMode(TaskManager::MODE_ABORT)) { if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { if (!task->IsValidTaskPoint(1)) invalid = true; CondReplaceInString(task->IsValidTaskPoint(1) && !task->IsValidTaskPoint(2), OutBuffer, _T("$(WaypointNext)"), _("Furthest Landpoint"), _("Next Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { if (!task->IsValidTaskPoint(-1)) invalid = true; CondReplaceInString(task->IsValidTaskPoint(-1) && !task->IsValidTaskPoint(-2), OutBuffer, _T("$(WaypointPrevious)"), _("Closest Landpoint"), _("Previous Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { if (!task->IsValidTaskPoint(1)) invalid = true; CondReplaceInString(task->IsValidTaskPoint(1) && !task->IsValidTaskPoint(2), OutBuffer, _T("$(WaypointNextArm)"), _("Furthest Landpoint"), _("Next Landpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { if (!task->IsValidTaskPoint(-1)) invalid = true; CondReplaceInString(task->IsValidTaskPoint(-1) && !task->IsValidTaskPoint(-2), OutBuffer, _T("$(WaypointPreviousArm)"), _("Closest Landpoint"), _("Previous Landpoint"), Size); } } else { // ordered task mode const bool next_is_final = task->IsValidTaskPoint(1) && !task->IsValidTaskPoint(2); const bool previous_is_start = task->IsValidTaskPoint(-1) && !task->IsValidTaskPoint(-2); const bool has_optional_starts = calculated.common_stats.ordered_has_optional_starts; if (_tcsstr(OutBuffer, _T("$(WaypointNext)"))) { // Waypoint\nNext if (!task->IsValidTaskPoint(1)) invalid = true; CondReplaceInString(next_is_final, OutBuffer, _T("$(WaypointNext)"), _("Finish Turnpoint"), _("Next Turnpoint"), Size); } else if (_tcsstr(OutBuffer, _T("$(WaypointPrevious)"))) { if (has_optional_starts && !task->IsValidTaskPoint(-1)) { ReplaceInString(OutBuffer, _T("$(WaypointPrevious)"), _("Next Startpoint"), Size); } else { CondReplaceInString(previous_is_start, OutBuffer, _T("$(WaypointPrevious)"), _("Start Turnpoint"), _("Previous Turnpoint"), Size); if (!task->IsValidTaskPoint(-1)) invalid = true; } } else if (_tcsstr(OutBuffer, _T("$(WaypointNextArm)"))) { // Waypoint\nNext switch (task_manager->GetTaskAdvance().get_advance_state()) { case TaskAdvance::MANUAL: case TaskAdvance::AUTO: case TaskAdvance::START_ARMED: case TaskAdvance::TURN_ARMED: CondReplaceInString(next_is_final, OutBuffer, _T("$(WaypointNextArm)"), _("Finish Turnpoint"), _("Next Turnpoint"), Size); if (!task->IsValidTaskPoint(1)) invalid = true; break; case TaskAdvance::START_DISARMED: ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Arm start"), Size); break; case TaskAdvance::TURN_DISARMED: ReplaceInString(OutBuffer, _T("$(WaypointNextArm)"), _("Arm turn"), Size); break; } } else if (_tcsstr(OutBuffer, _T("$(WaypointPreviousArm)"))) { switch (task_manager->GetTaskAdvance().get_advance_state()) { case TaskAdvance::MANUAL: case TaskAdvance::AUTO: case TaskAdvance::START_DISARMED: case TaskAdvance::TURN_DISARMED: if (has_optional_starts && !task->IsValidTaskPoint(-1)) { ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Next Startpoint"), Size); } else { CondReplaceInString(previous_is_start, OutBuffer, _T("$(WaypointPreviousArm)"), _("Start Turnpoint"), _("Previous Turnpoint"), Size); if (!task->IsValidTaskPoint(-1)) invalid = true; } break; case TaskAdvance::START_ARMED: ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Disarm start"), Size); break; case TaskAdvance::TURN_ARMED: ReplaceInString(OutBuffer, _T("$(WaypointPreviousArm)"), _("Disarm turn"), Size); break; } } } if (_tcsstr(OutBuffer, _T("$(AdvanceArmed)"))) { switch (task_manager->GetTaskAdvance().get_advance_state()) { case TaskAdvance::MANUAL: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Advance\n(manual)"), Size); invalid = true; break; case TaskAdvance::AUTO: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Advance\n(auto)"), Size); invalid = true; break; case TaskAdvance::START_ARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Abort\nStart"), Size); invalid = false; break; case TaskAdvance::START_DISARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Arm\nStart"), Size); invalid = false; break; case TaskAdvance::TURN_ARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Abort\nTurn"), Size); invalid = false; break; case TaskAdvance::TURN_DISARMED: ReplaceInString(OutBuffer, _T("$(AdvanceArmed)"), _("Arm\nTurn"), Size); invalid = false; break; } } if (_tcsstr(OutBuffer, _T("$(CheckAutoMc)"))) { if (!calculated.task_stats.task_valid && ((settings_computer.task.auto_mc_mode==TaskBehaviour::AUTOMC_FINALGLIDE) || (settings_computer.task.auto_mc_mode==TaskBehaviour::AUTOMC_BOTH))) invalid = true; ReplaceInString(OutBuffer, _T("$(CheckAutoMc)"), _T(""), Size); } if (_tcsstr(OutBuffer, _T("$(TaskAbortToggleActionName)"))) { if (task_manager->IsMode(TaskManager::MODE_GOTO)) { CondReplaceInString(task_manager->GetOrderedTask().CheckTask(), OutBuffer, _T("$(TaskAbortToggleActionName)"), _("Resume"), _("Abort"), Size); } else CondReplaceInString(task_manager->IsMode(TaskManager::MODE_ABORT), OutBuffer, _T("$(TaskAbortToggleActionName)"), _("Resume"), _("Abort"), Size); } return invalid; }
bool ButtonLabel::ExpandMacros(const TCHAR *In, TCHAR *OutBuffer, size_t Size) { // ToDo, check Buffer Size bool invalid = false; _tcsncpy(OutBuffer, In, Size); OutBuffer[Size-1] = '\0'; if (_tcsstr(OutBuffer, TEXT("$(")) == NULL) return false; if (task.isTaskAborted()) { if (_tcsstr(OutBuffer, TEXT("$(WaypointNext)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()+1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()+2), OutBuffer, TEXT("$(WaypointNext)"), TEXT("Landpoint\nFurthest"), TEXT("Landpoint\nNext"), Size); } else if (_tcsstr(OutBuffer, TEXT("$(WaypointPrevious)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()-1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()-2), OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Landpoint\nClosest"), TEXT("Landpoint\nPrevious"), Size); } } else { if (_tcsstr(OutBuffer, TEXT("$(WaypointNext)"))) { // Waypoint\nNext invalid = !task.ValidTaskPoint(task.getActiveIndex()+1); CondReplaceInString(!task.ValidTaskPoint(task.getActiveIndex()+2), OutBuffer, TEXT("$(WaypointNext)"), TEXT("Waypoint\nFinish"), TEXT("Waypoint\nNext"), Size); } else if (_tcsstr(OutBuffer, TEXT("$(WaypointPrevious)"))) { if (task.getActiveIndex()==1) { invalid = !task.ValidTaskPoint(task.getActiveIndex()-1); ReplaceInString(OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Waypoint\nStart"), Size); } else if (task.getSettings().EnableMultipleStartPoints) { invalid = !task.ValidTaskPoint(0); CondReplaceInString((task.getActiveIndex()==0), OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("StartPoint\nCycle"), TEXT("Waypoint\nPrevious"), Size); } else { invalid = (task.getActiveIndex()<=0); ReplaceInString(OutBuffer, TEXT("$(WaypointPrevious)"), TEXT("Waypoint\nPrevious"), Size); } } } if (_tcsstr(OutBuffer, TEXT("$(AdvanceArmed)"))) { switch (task.getSettings().AutoAdvance) { case 0: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(manual)"), Size); invalid = true; break; case 1: ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(auto)"), Size); invalid = true; break; case 2: if (task.getActiveIndex()>0) { if (task.ValidTaskPoint(task.getActiveIndex()+1)) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("TURN"), Size); } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(finish)"), Size); invalid = true; } } else { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("START"), Size); } break; case 3: if (task.getActiveIndex()==0) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("START"), Size); } else if (task.getActiveIndex()==1) { CondReplaceInString(task.isAdvanceArmed(), OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("Cancel"), TEXT("RESTART"), Size); } else { ReplaceInString(OutBuffer, TEXT("$(AdvanceArmed)"), TEXT("(auto)"), Size); invalid = true; } // TODO bug: no need to arm finish default: break; } } if (_tcsstr(OutBuffer, TEXT("$(CheckReplay)"))) { if (!Basic().Replay && Basic().MovementDetected) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckReplay)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckWaypointFile)"))) { if (!way_points.verify_index(0)) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckWaypointFile)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckSettingsLockout)"))) { if (!is_simulator() && XCSoarInterface::LockSettingsInFlight && Calculated().Flying) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckSettingsLockout)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTaskResumed)"))) { if (task.isTaskAborted()) { // TODO code: check, does this need to be set with temporary task? invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTaskResumed)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTask)"))) { if (!task.Valid()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTask)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckAirspace)"))) { if (!ValidAirspace()) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckAirspace)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckFLARM)"))) { if (!Basic().FLARM_Available) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckFLARM)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckTerrain)"))) { if (!Calculated().TerrainValid) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckTerrain)"), TEXT(""), Size); } if (_tcsstr(OutBuffer, TEXT("$(CheckAutoMc)"))) { if (!task.Valid() && ((SettingsComputer().AutoMcMode==0) || (SettingsComputer().AutoMcMode==2))) { invalid = true; } ReplaceInString(OutBuffer, TEXT("$(CheckAutoMc)"), TEXT(""), Size); } CondReplaceInString(logger.isLoggerActive(), OutBuffer, TEXT("$(LoggerActive)"), TEXT("Stop"), TEXT("Start"), Size); if (_tcsstr(OutBuffer, TEXT("$(SnailTrailToggleName)"))) { switch(SettingsMap().TrailActive) { case 0: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Long"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Short"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Full"), Size); break; case 3: ReplaceInString(OutBuffer, TEXT("$(SnailTrailToggleName)"), TEXT("Off"), Size); break; } } // VENTA3 VisualGlide if (_tcsstr(OutBuffer, TEXT("$(VisualGlideToggleName)"))) { switch(SettingsMap().VisualGlide) { case 0: ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Steady"), Size); break; case 1: if (SettingsMap().ExtendedVisualGlide) ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Moving"), Size); else ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Off"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(VisualGlideToggleName)"), TEXT("Off"), Size); break; } } // VENTA3 AirSpace event if (_tcsstr(OutBuffer, TEXT("$(AirSpaceToggleName)"))) { switch(SettingsMap().OnAirSpace) { case 0: ReplaceInString(OutBuffer, TEXT("$(AirSpaceToggleName)"), TEXT("ON"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(AirSpaceToggleName)"), TEXT("OFF"), Size); break; } } if (_tcsstr(OutBuffer, TEXT("$(TerrainTopologyToggleName)"))) { char val; val = 0; if (SettingsMap().EnableTopology) val++; if (SettingsMap().EnableTerrain) val += (char)2; switch(val) { case 0: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Topology\nOn"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Terrain\nOn"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), TEXT("Terrain\nTopology"), Size); break; case 3: ReplaceInString(OutBuffer, TEXT("$(TerrainTopologyToggleName)"), gettext(TEXT("Terrain\nOff")), Size); break; } } ////// CondReplaceInString(task.TaskIsTemporary(), OutBuffer, TEXT("$(TaskAbortToggleActionName)"), TEXT("Resume"), TEXT("Abort"), Size); CondReplaceInString(SettingsMap().FullScreen, OutBuffer, TEXT("$(FullScreenToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().AutoZoom, OutBuffer, TEXT("$(ZoomAutoToggleActionName)"), TEXT("Manual"), TEXT("Auto"), Size); CondReplaceInString(SettingsMap().EnableTopology, OutBuffer, TEXT("$(TopologyToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().EnableTerrain, OutBuffer, TEXT("$(TerrainToggleActionName)"), TEXT("Off"), TEXT("On"), Size); if (_tcsstr(OutBuffer, TEXT("$(MapLabelsToggleActionName)"))) { switch(SettingsMap().DeclutterLabels) { case 0: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("MID"), Size); break; case 1: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("OFF"), Size); break; case 2: ReplaceInString(OutBuffer, TEXT("$(MapLabelsToggleActionName)"), TEXT("ON"), Size); break; } } CondReplaceInString(SettingsComputer().AutoMacCready != 0, OutBuffer, TEXT("$(MacCreadyToggleActionName)"), TEXT("Manual"), TEXT("Auto"), Size); CondReplaceInString(SettingsMap().EnableAuxiliaryInfo, OutBuffer, TEXT("$(AuxInfoToggleActionName)"), TEXT("Off"), TEXT("On"), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmCircling, OutBuffer, TEXT("$(DispModeClimbShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmCruise, OutBuffer, TEXT("$(DispModeCruiseShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmNone, OutBuffer, TEXT("$(DispModeAutoShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().UserForceDisplayMode == dmFinalGlide, OutBuffer, TEXT("$(DispModeFinalShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLON, OutBuffer, TEXT("$(AirspaceModeAllShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == CLIP, OutBuffer, TEXT("$(AirspaceModeClipShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == AUTO, OutBuffer, TEXT("$(AirspaceModeAutoShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLBELOW, OutBuffer, TEXT("$(AirspaceModeBelowShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsComputer().AltitudeMode == ALLOFF, OutBuffer, TEXT("$(AirspaceModeAllOffIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 0, OutBuffer, TEXT("$(SnailTrailOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 2, OutBuffer, TEXT("$(SnailTrailShortShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 1, OutBuffer, TEXT("$(SnailTrailLongShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().TrailActive == 3, OutBuffer, TEXT("$(SnailTrailFullShortIndicator)"), TEXT("(*)"), TEXT(""), Size); // VENTA3 VisualGlide CondReplaceInString(SettingsMap().VisualGlide == 0, OutBuffer, TEXT("$(VisualGlideOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().VisualGlide == 1, OutBuffer, TEXT("$(VisualGlideLightShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().VisualGlide == 2, OutBuffer, TEXT("$(VisualGlideHeavyShortIndicator)"), TEXT("(*)"), TEXT(""), Size); // VENTA3 AirSpace CondReplaceInString(SettingsMap().OnAirSpace == 0, OutBuffer, TEXT("$(AirSpaceOffShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().OnAirSpace == 1, OutBuffer, TEXT("$(AirSpaceOnShortIndicator)"), TEXT("(*)"), TEXT(""), Size); CondReplaceInString(SettingsMap().EnableFLARMGauge != 0, OutBuffer, TEXT("$(FlarmDispToggleActionName)"), TEXT("Off"), TEXT("On"), Size); return invalid; }