fix(color): UI freeze when setting up 'Set' special function with no timers configured (#6377)

This commit is contained in:
philmoz
2025-06-21 20:03:30 +10:00
committed by GitHub
parent f4c019bbb1
commit 847d779de0
25 changed files with 1098 additions and 1040 deletions
@@ -267,9 +267,15 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}
#endif // GVARS
else if (func == FUNC_SET_TIMER) {
maxParam = MAX_TIMERS - 1;
lcdDrawTextAtIndex(lcdNextPos, y, STR_VFSWRESET, CFN_TIMER_INDEX(cfn), attr);
if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable);
if (timersSetupCount()> 0) {
maxParam = MAX_TIMERS - 1;
lcdDrawTextAtIndex(lcdNextPos, y, STR_VFSWRESET, CFN_TIMER_INDEX(cfn), attr);
if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable);
} else {
lcdDrawText(lcdNextPos + FW, y, STR_NO_TIMERS, 0);
if (attr)
repeatLastCursorHorMove(event);
}
break;
}
#if defined(FUNCTION_SWITCHES)
@@ -317,8 +323,12 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}
#endif
else if (func == FUNC_SET_TIMER) {
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr);
if (timersSetupCount() > 0) {
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr);
} else if (attr) {
repeatLastCursorHorMove(event);
}
}
#if defined(AUDIO)
else if (func == FUNC_PLAY_SOUND) {
@@ -256,9 +256,15 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}
#endif
else if (func == FUNC_SET_TIMER) {
maxParam = TIMERS-1;
drawStringWithIndex(lcdNextPos, y, STR_TIMER, CFN_TIMER_INDEX(cfn)+1, attr);
if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable);
if (timersSetupCount()> 0) {
maxParam = TIMERS-1;
drawStringWithIndex(lcdNextPos, y, STR_TIMER, CFN_TIMER_INDEX(cfn)+1, attr);
if (active) CFN_TIMER_INDEX(cfn) = checkIncDec(event, CFN_TIMER_INDEX(cfn), 0, maxParam, eeFlags, isTimerSourceAvailable);
} else {
lcdDrawText(lcdNextPos + FW, y, STR_NO_TIMERS, 0);
if (attr)
repeatLastCursorHorMove(event);
}
break;
}
else if (attr) {
@@ -300,8 +306,12 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF
}
#endif
else if (func == FUNC_SET_TIMER) {
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr);
if (timersSetupCount() > 0) {
getMixSrcRange(MIXSRC_FIRST_TIMER, val_min, val_max);
drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr);
} else if (attr) {
repeatLastCursorHorMove(event);
}
}
else if (func == FUNC_PLAY_SOUND) {
val_max = AU_SPECIAL_SOUND_LAST-AU_SPECIAL_SOUND_FIRST-1;
@@ -200,9 +200,13 @@ void FunctionLineButton::refresh()
break;
case FUNC_SET_TIMER:
sprintf(s + strlen(s), "%s%d = %s", STR_SRC_TIMER,
CFN_TIMER_INDEX(cfn) + 1,
getTimerString(CFN_PARAM(cfn), {.options = SHOW_TIME}));
if (isTimerSourceAvailable(CFN_TIMER_INDEX(cfn))) {
sprintf(s + strlen(s), "%s%d = %s", STR_SRC_TIMER,
CFN_TIMER_INDEX(cfn) + 1,
getTimerString(CFN_PARAM(cfn), {.options = SHOW_TIME}));
} else {
sprintf(s + strlen(s), "---");
}
break;
case FUNC_SET_FAILSAFE:
@@ -464,18 +468,22 @@ void FunctionEditPage::updateSpecialFunctionOneWindow()
case FUNC_SET_TIMER: {
new StaticText(line, rect_t{}, STR_TIMER);
auto timerchoice = new Choice(line, rect_t{}, 0, TIMERS - 1,
GET_SET_DEFAULT(CFN_TIMER_INDEX(cfn)));
timerchoice->setTextHandler([](int32_t value) {
return std::string(STR_TIMER) + std::to_string(value + 1);
});
timerchoice->setAvailableHandler(
[=](int value) { return isTimerSourceAvailable(value); });
if (timersSetupCount() > 0) {
auto timerchoice = new Choice(line, rect_t{}, 0, TIMERS - 1,
GET_SET_DEFAULT(CFN_TIMER_INDEX(cfn)));
timerchoice->setTextHandler([](int32_t value) {
return std::string(STR_TIMER) + std::to_string(value + 1);
});
timerchoice->setAvailableHandler(
[=](int value) { return isTimerSourceAvailable(value); });
line = specialFunctionOneWindow->newLine(grid);
new StaticText(line, rect_t{}, STR_VALUE);
new TimeEdit(line, rect_t{}, 0, 9 * 60 * 60 - 1,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
line = specialFunctionOneWindow->newLine(grid);
new StaticText(line, rect_t{}, STR_VALUE);
new TimeEdit(line, rect_t{}, 0, 9 * 60 * 60 - 1,
GET_SET_DEFAULT(CFN_PARAM(cfn)));
} else {
new StaticText(line, rect_t{}, STR_NO_TIMERS);
}
break;
}
+9
View File
@@ -693,6 +693,15 @@ bool isAssignableFunctionAvailable(int function)
}
#endif
int timersSetupCount()
{
int tc = 0;
for (int i = 0; i < MAX_TIMERS; i += 1)
if (isTimerSourceAvailable(i))
tc += 1;
return tc;
}
bool isTimerSourceAvailable(int index)
{
TimerData *timer = &g_model.timers[index];
+1
View File
@@ -61,6 +61,7 @@ bool isThrottleSourceAvailable(int source);
bool isLogicalSwitchAvailable(int index);
bool isAssignableFunctionAvailable(int function);
bool isSourceAvailable(int source);
int timersSetupCount();
bool isTimerSourceAvailable(int source);
bool isSourceAvailableInGlobalFunctions(int source);
bool isSourceAvailableInCustomSwitches(int source);
+1
View File
@@ -152,6 +152,7 @@ const char STR_NAME[] = TR_NAME;
const char STR_BITMAP[] = TR_BITMAP;
const char STR_NO_PICTURE[] = TR_NO_PICTURE;
const char STR_TIMER[] = TR_TIMER;
const char STR_NO_TIMERS[] = TR_NO_TIMERS;
const char STR_START[] = TR_START;
const char STR_ELIMITS[] = TR_ELIMITS;
const char STR_ETRIMS[] = TR_ETRIMS;
+1
View File
@@ -276,6 +276,7 @@ extern const char STR_NAME[];
extern const char STR_BITMAP[];
extern const char STR_NO_PICTURE[];
extern const char STR_TIMER[];
extern const char STR_NO_TIMERS[];
extern const char STR_START[];
extern const char STR_ELIMITS[];
extern const char STR_ETRIMS[];
+1
View File
@@ -268,6 +268,7 @@
#define TR_BITMAP "模型图片"
#define TR_NO_PICTURE "无图片"
#define TR_TIMER TR("计时器", "计时器 ")
#define TR_NO_TIMERS "No timers"
#define TR_START "开始"
#define TR_ELIMITS TR("扩展行程", "扩展通道行程")
#define TR_ETRIMS TR("扩展微调", "扩展微调量")
+1
View File
@@ -281,6 +281,7 @@
#define TR_BITMAP "Obrázek"
#define TR_NO_PICTURE "Bez obrázku"
#define TR_TIMER "Stopky"
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("Limit +25%", "Kanál +/- 125%")
#define TR_ETRIMS TR("širší Trim", "Široký trim")
+1
View File
@@ -274,6 +274,7 @@
#define TR_BITMAP "Model billede"
#define TR_NO_PICTURE "Ingen billede"
#define TR_TIMER TR("Tid", "Tid ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("Udv.Grænser", "Udvidet grænser")
#define TR_ETRIMS TR("Udv.Trim", "Udvidet trim")
+1
View File
@@ -271,6 +271,7 @@
#define TR_BITMAP "Model image"
#define TR_NO_PICTURE "No Picture"
#define TR_TIMER TR("Timer", "Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("E.Limits", "Extended limits")
#define TR_ETRIMS TR("E.Trims", "Extended trims")
+1
View File
@@ -269,6 +269,7 @@
#define TR_BITMAP "Imagen modelo"
#define TR_NO_PICTURE "No Picture"
#define TR_TIMER TR("Timer", "Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("E.Límite", "Ampliar límites")
#define TR_ETRIMS TR("E.Trims", "Ampliar trims")
+1
View File
@@ -282,6 +282,7 @@
#define TR_BITMAP "Model Image"
#define TR_NO_PICTURE "No Picture"
#define TR_TIMER "Timer"
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("E.Limits", "Extended Limits")
#define TR_ETRIMS TR("E.Trims", "Extended Trims")
+1
View File
@@ -277,6 +277,7 @@
#define TR_BITMAP "Image Modèle"
#define TR_NO_PICTURE "Pas d'image"
#define TR_TIMER "Chrono "
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("Limites ét.", "Limites étendues")
#define TR_ETRIMS TR("Trims ét.", "Trims étendus")
+1
View File
@@ -275,6 +275,7 @@
#define TR_BITMAP "תמונה מודל"
#define TR_NO_PICTURE "אין תמונה"
#define TR_TIMER TR("שעון", "שעון ")
#define TR_NO_TIMERS "No timers"
#define TR_START "התחלה"
#define TR_ELIMITS TR("E.Limits", "הרחב תצוגות")
#define TR_ETRIMS TR("E.Trims", "הרחב תצוגות")
+1
View File
@@ -271,6 +271,7 @@
#define TR_BITMAP "Immagine"
#define TR_NO_PICTURE "No immagine"
#define TR_TIMER TR("Timer", "Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Partenza"
#define TR_ELIMITS TR("Lim. Est.", "Limiti Estesi")
#define TR_ETRIMS TR("Trim Est.", "Trim Estesi")
+1
View File
@@ -270,6 +270,7 @@
#define TR_BITMAP "モデルイメージ"
#define TR_NO_PICTURE "画像なし"
#define TR_TIMER TR("タイマー", "タイマー ")
#define TR_NO_TIMERS "No timers"
#define TR_START "スタート"
#define TR_ELIMITS TR("E.Limit", "リミット拡張")
#define TR_ETRIMS TR("E.Trims", "トリム拡張")
+1017 -1016
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -268,6 +268,7 @@
#define TR_BITMAP "Modelafbeelding"
#define TR_NO_PICTURE "No Picture"
#define TR_TIMER TR("Timer", "Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("E.Limits", "Extended Limits")
#define TR_ETRIMS TR("E.Trims", "Extended Trims")
+1
View File
@@ -268,6 +268,7 @@
#define TR_BITMAP "Obrazek"
#define TR_NO_PICTURE "Bez obrazka"
#define TR_TIMER TR("Timer", "Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("Limi+25%", "Kanał +/- 125% ")
#define TR_ETRIMS TR("E.Trym ", "Poszer Trymery")
+1
View File
@@ -274,6 +274,7 @@
#define TR_BITMAP "Img modelo"
#define TR_NO_PICTURE "Sem foto"
#define TR_TIMER "Crono"
#define TR_NO_TIMERS "No timers"
#define TR_START "Iniciar"
#define TR_ELIMITS TR("E.Limites", "Limites extend.")
#define TR_ETRIMS TR("E.Trims", "Trims extend.")
+1
View File
@@ -273,6 +273,7 @@
#define TR_BITMAP "Изображ"
#define TR_NO_PICTURE "Без изображ"
#define TR_TIMER TR("Таймер", "Таймер ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Старт"
#define TR_ELIMITS TR("расш лимит", "Расш лимит")
#define TR_ETRIMS TR("Расш трим", "Расш тримы")
+1
View File
@@ -283,6 +283,7 @@
#define TR_NO_PICTURE "Ingen bild"
#define TR_BITMAP "Modellikon"
#define TR_TIMER TR("Timer","Timer ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start"
#define TR_ELIMITS TR("Gränser++","Utökade gränser")
#define TR_ETRIMS TR("Trimmar++","Utökade trimmar")
+1
View File
@@ -273,6 +273,7 @@
#define TR_BITMAP "模型圖片"
#define TR_NO_PICTURE "無圖片"
#define TR_TIMER TR("計時器", "計時器 ")
#define TR_NO_TIMERS "No timers"
#define TR_START "開始"
#define TR_ELIMITS TR("擴展行程", "擴展通道行程")
#define TR_ETRIMS TR("擴展微調", "擴展微調量")
+1
View File
@@ -273,6 +273,7 @@
#define TR_BITMAP "Зображ. моделі"
#define TR_NO_PICTURE "Немає зображ."
#define TR_TIMER TR("Таймер", "Таймер ")
#define TR_NO_TIMERS "No timers"
#define TR_START "Start" /* use english */
#define TR_ELIMITS TR("Розш.Ліміт", "Розширені Ліміти")
#define TR_ETRIMS TR("Розш.Трим.", "Розширене Обрізання") /* ned to be clarified by context */