diff --git a/companion/src/firmwares/edgetx/yaml_modeldata.cpp b/companion/src/firmwares/edgetx/yaml_modeldata.cpp index 2f052ef48f2..3a8d70f4b12 100644 --- a/companion/src/firmwares/edgetx/yaml_modeldata.cpp +++ b/companion/src/firmwares/edgetx/yaml_modeldata.cpp @@ -274,17 +274,27 @@ namespace YAML { Node convert::encode(const TimerData& rhs) { + unsigned int countdownBeep = rhs.countdownBeep; + unsigned int extraHaptic = rhs.extraHaptic; + if (countdownBeep > TimerData::COUNTDOWNBEEP_VOICE + 1) { + extraHaptic = 1; + countdownBeep -= TimerData::COUNTDOWNBEEP_VOICE + 1; + } + else { + extraHaptic = 0; + } Node node; node["swtch"] = rhs.swtch; node["mode"] = timerModeLut << rhs.mode; node["name"] = rhs.name; node["minuteBeep"] = (int)rhs.minuteBeep; - node["countdownBeep"] = rhs.countdownBeep; + node["countdownBeep"] = countdownBeep; node["start"] = rhs.val; node["persistent"] = rhs.persistent; node["countdownStart"] = rhs.countdownStart; node["value"] = rhs.pvalue; node["showElapsed"] = rhs.showElapsed; + node["extraHaptic"] = extraHaptic; return node; } @@ -300,6 +310,11 @@ bool convert::decode(const Node& node, TimerData& rhs) node["countdownStart"] >> rhs.countdownStart; node["value"] >> rhs.pvalue; node["showElapsed"] >> rhs.showElapsed; + node["extraHaptic"] >> rhs.extraHaptic; + + if (rhs.extraHaptic) + rhs.countdownBeep += TimerData::COUNTDOWNBEEP_VOICE + 1; + return true; } diff --git a/companion/src/firmwares/timerdata.cpp b/companion/src/firmwares/timerdata.cpp index 15a9a109acf..8a10876ca5c 100644 --- a/companion/src/firmwares/timerdata.cpp +++ b/companion/src/firmwares/timerdata.cpp @@ -110,6 +110,10 @@ QString TimerData::countdownBeepToString(const int value) return tr("Voice"); case COUNTDOWNBEEP_HAPTIC: return tr("Haptic"); + case COUNTDOWNBEEP_BEEPS_AND_HAPTIC: + return tr("Beeps and Haptic"); + case COUNTDOWNBEEP_VOICE_AND_HAPTIC: + return tr("Voice and Haptic"); default: return CPN_STR_UNKNOWN_ITEM; } diff --git a/companion/src/firmwares/timerdata.h b/companion/src/firmwares/timerdata.h index 4a0d938a7d2..63cd48e8533 100644 --- a/companion/src/firmwares/timerdata.h +++ b/companion/src/firmwares/timerdata.h @@ -40,86 +40,90 @@ class TimerData { Q_DECLARE_TR_FUNCTIONS(TimerData) public: - enum CountDownBeepType { - COUNTDOWNBEEP_SILENT, - COUNTDOWNBEEP_BEEPS, - COUNTDOWNBEEP_VOICE, - COUNTDOWNBEEP_HAPTIC, - COUNTDOWNBEEP_COUNT - }; - - enum CountDownStart { - COUNTDOWNSTART_5 = -2, - COUNTDOWNSTART_FIRST = COUNTDOWNSTART_5, - COUNTDOWNSTART_10, - COUNTDOWNSTART_20, - COUNTDOWNSTART_30, - COUNTDOWNSTART_LAST = COUNTDOWNSTART_30 - }; - - enum PersistentType { - PERSISTENT_NOT, - PERSISTENT_FLIGHT, - PERSISTENT_MANUALRESET, - PERSISTENT_COUNT - }; - - enum TimerMode { - TIMERMODE_OFF, - TIMERMODE_ON, - TIMERMODE_START, - TIMERMODE_THR, - TIMERMODE_THR_REL, - TIMERMODE_THR_START, - TIMERMODE_COUNT, - TIMERMODE_MAX = TIMERMODE_COUNT - 1 - }; - - enum TimerShowDirection { - TIMER_SHOW_REMAINING, - TIMER_SHOW_ELAPSED, - TIMER_SHOW_COUNT - }; - - TimerData() { clear(); } - - RawSwitch swtch; - unsigned int mode; - char name[TIMER_NAME_LEN + 1]; - bool minuteBeep; - unsigned int countdownBeep; - unsigned int val; - unsigned int persistent; - int countdownStart; - int pvalue; - unsigned int showElapsed; - - void convert(RadioDataConversionState & cstate); - void clear(); - bool isEmpty() const; - bool isModeOff(); - QString nameToString(int index) const; - QString countdownBeepToString() const; - QString countdownStartToString() const; - QString persistentToString(const bool verbose = true) const; - QString pvalueToString() const; - QString valToString() const; - QString modeToString() const; - QString showElapsedToString() const; - - void countdownBeepChanged(); - void modeChanged(); - - static QString countdownBeepToString(const int value); - static QString countdownStartToString(const int value); - static QString persistentToString(const int value, const bool verbose = true); - static QString pvalueToString(const int value); - static QString valToString(const int value); - static QString modeToString(const int value); - static QString showElapsedToString(const unsigned int value); - static AbstractStaticItemModel * countdownBeepItemModel(); - static AbstractStaticItemModel * countdownStartItemModel(); - static AbstractStaticItemModel * persistentItemModel(); - static AbstractStaticItemModel * modeItemModel(); - static AbstractStaticItemModel * showElapsedItemModel(); + enum CountDownBeepType { + COUNTDOWNBEEP_SILENT, + COUNTDOWNBEEP_BEEPS, + COUNTDOWNBEEP_VOICE, + COUNTDOWNBEEP_HAPTIC, + COUNTDOWNBEEP_BEEPS_AND_HAPTIC, + COUNTDOWNBEEP_VOICE_AND_HAPTIC, + COUNTDOWNBEEP_COUNT + }; + + enum CountDownStart { + COUNTDOWNSTART_5 = -2, + COUNTDOWNSTART_FIRST = COUNTDOWNSTART_5, + COUNTDOWNSTART_10, + COUNTDOWNSTART_20, + COUNTDOWNSTART_30, + COUNTDOWNSTART_LAST = COUNTDOWNSTART_30 + }; + + enum PersistentType { + PERSISTENT_NOT, + PERSISTENT_FLIGHT, + PERSISTENT_MANUALRESET, + PERSISTENT_COUNT + }; + + enum TimerMode { + TIMERMODE_OFF, + TIMERMODE_ON, + TIMERMODE_START, + TIMERMODE_THR, + TIMERMODE_THR_REL, + TIMERMODE_THR_START, + TIMERMODE_COUNT, + TIMERMODE_MAX = TIMERMODE_COUNT - 1 + }; + + enum TimerShowDirection { + TIMER_SHOW_REMAINING, + TIMER_SHOW_ELAPSED, + TIMER_SHOW_COUNT + }; + + TimerData() { clear(); } + + RawSwitch swtch; + unsigned int mode; + char name[TIMER_NAME_LEN + 1]; + bool minuteBeep; + unsigned int countdownBeep; + unsigned int val; + unsigned int persistent; + int countdownStart; + int pvalue; + unsigned int showElapsed; + unsigned int extraHaptic; + + void convert(RadioDataConversionState& cstate); + void clear(); + bool isEmpty() const; + bool isModeOff(); + QString nameToString(int index) const; + QString countdownBeepToString() const; + QString countdownStartToString() const; + QString persistentToString(const bool verbose = true) const; + QString pvalueToString() const; + QString valToString() const; + QString modeToString() const; + QString showElapsedToString() const; + + void countdownBeepChanged(); + void modeChanged(); + + static QString countdownBeepToString(const int value); + static QString countdownStartToString(const int value); + static QString persistentToString(const int value, + const bool verbose = true); + static QString pvalueToString(const int value); + static QString valToString(const int value); + static QString modeToString(const int value); + static QString showElapsedToString(const unsigned int value); + static AbstractStaticItemModel* countdownBeepItemModel(); + static AbstractStaticItemModel* countdownStartItemModel(); + static AbstractStaticItemModel* persistentItemModel(); + static AbstractStaticItemModel* modeItemModel(); + static AbstractStaticItemModel* showElapsedItemModel(); }; diff --git a/radio/src/audio.cpp b/radio/src/audio.cpp index 718188d0bfc..a4555178da1 100644 --- a/radio/src/audio.cpp +++ b/radio/src/audio.cpp @@ -996,32 +996,36 @@ void audioTrimPress(int value) void audioTimerCountdown(uint8_t timer, int value) { if (g_model.timers[timer].countdownBeep == COUNTDOWN_VOICE) { - if (value >= 0 && value <= TIMER_COUNTDOWN_START(timer)) { - playNumber(value, 0, 0, 0); + int announceValue = value; + if (g_model.timers[timer].showElapsed) { + announceValue = g_model.timers[timer].start - value; } - else if (value == 30 || value == 20) { - playDuration(value, 0, 0); + if (value >= 0 && value <= TIMER_COUNTDOWN_START(timer)) { + if (announceValue > 60 && !(announceValue % 2) && (announceValue % 30) && + (announceValue % 30)) + playNumber(announceValue / 60, 0, 0, 0); + if (announceValue < 60 || + (announceValue > 60 && !(announceValue % 2) && (announceValue % 60))) + playNumber(announceValue % 60, 0, 0, 0); + } else if ((!(announceValue % 30) || !(announceValue % 20)) && value < 31) { + playDuration(announceValue, 0, 0); } - } - else if (g_model.timers[timer].countdownBeep == COUNTDOWN_BEEPS) { + } else if (g_model.timers[timer].countdownBeep == COUNTDOWN_BEEPS) { if (value == 0) { audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 300, 20, PLAY_NOW); - } - else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) { + } else if (value > 0 && value <= TIMER_COUNTDOWN_START(timer)) { audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 100, 20, PLAY_NOW); - } - else if (value == 30) { + } else if (value == 30) { audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(2)); - } - else if (value == 20) { + } else if (value == 20) { audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_REPEAT(1)); - } - else if (value == 10) { + } else if (value == 10) { audioQueue.playTone(BEEP_DEFAULT_FREQ + 150, 120, 20, PLAY_NOW); } } #if defined(HAPTIC) - else if (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) { + if ( (g_model.timers[timer].countdownBeep == COUNTDOWN_HAPTIC) || + (g_model.timers[timer].extraHaptic) ) { if (value == 0) { haptic.play(15, 3, PLAY_NOW); } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 392f70db071..95505ce79db 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -866,8 +866,11 @@ enum CountDownModes { COUNTDOWN_SILENT, COUNTDOWN_BEEPS, COUNTDOWN_VOICE, + COUNTDOWN_NON_HAPTIC_LAST = COUNTDOWN_VOICE, #if defined(HAPTIC) COUNTDOWN_HAPTIC, + COUNTDOWN_BEEPS_AND_HAPTIC, + COUNTDOWN_VOICE_AND_HPTIC, #endif COUNTDOWN_COUNT SKIP }; diff --git a/radio/src/datastructs_private.h b/radio/src/datastructs_private.h index 5f8364e3b62..a6ca581eb23 100644 --- a/radio/src/datastructs_private.h +++ b/radio/src/datastructs_private.h @@ -238,7 +238,8 @@ PACK(struct TimerData { uint32_t persistent:2; int32_t countdownStart:2; uint8_t showElapsed:1; - uint8_t spare:7 SKIP; + uint8_t extraHaptic:1; + uint8_t spare:6 SKIP; NOBACKUP(char name[LEN_TIMER_NAME]); }); diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index d52077c7d40..bc7853e6be9 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -341,16 +341,29 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) { TimerData & timer = g_model.timers[timerIdx]; lcdDrawTextAlignedLeft(y, STR_BEEPCOUNTDOWN); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition == 0 ? attr : 0)); + int value = timer.countdownBeep; + if (timer.extraHaptic) value += (COUNTDOWN_VOICE + 1); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, value, (menuHorizontalPosition == 0 ? attr : 0)); if (timer.countdownBeep != COUNTDOWN_SILENT) { lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 6 * FW, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); } if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { - case 0: - CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1); - break; + case 0: + { + value = timer.countdownBeep; + if (timer.extraHaptic) value += (COUNTDOWN_NON_HAPTIC_LAST + 1); + CHECK_INCDEC_MODELVAR(event, value, COUNTDOWN_SILENT, + COUNTDOWN_COUNT - 1); + if (value > COUNTDOWN_VOICE + 1) { + timer.extraHaptic = 1; + timer.countdownBeep = value - (COUNTDOWN_NON_HAPTIC_LAST + 1); + } else { + timer.extraHaptic = 0; + timer.countdownBeep = value; + } + } break; case 1: timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2); break; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 9eb748fd3cd..8fea42fb3d9 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -262,7 +262,10 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) { TimerData & timer = g_model.timers[timerIdx]; lcdDrawTextAlignedLeft(y, STR_BEEPCOUNTDOWN); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, timer.countdownBeep, (menuHorizontalPosition==0 ? attr : 0)); + int value = timer.countdownBeep; + if (timer.extraHaptic) value += (COUNTDOWN_NON_HAPTIC_LAST + 1); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VBEEPCOUNTDOWN, value, + (menuHorizontalPosition == 0 ? attr : 0)); if (timer.countdownBeep != COUNTDOWN_SILENT) { lcdDrawNumber(MODEL_SETUP_3RD_COLUMN, y, TIMER_COUNTDOWN_START(timerIdx), (menuHorizontalPosition == 1 ? attr : 0) | LEFT); lcdDrawChar(lcdLastRightPos, y, 's'); @@ -270,8 +273,20 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event) if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: - CHECK_INCDEC_MODELVAR(event, timer.countdownBeep, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1); - break; + { + value = timer.countdownBeep; + if (timer.extraHaptic) value += (COUNTDOWN_NON_HAPTIC_LAST + 1); + TRACE("value=%d\ttimer.extraHaptic=%d", value, timer.extraHaptic); + CHECK_INCDEC_MODELVAR(event, value, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1); + if (value > COUNTDOWN_VOICE + 1) { + timer.extraHaptic = 1; + timer.countdownBeep = value - (COUNTDOWN_NON_HAPTIC_LAST + 1); + } else { + timer.extraHaptic = 0; + timer.countdownBeep = value; + } + } + break; case 1: timer.countdownStart = -checkIncDecModel(event, -timer.countdownStart, -1, +2); break; diff --git a/radio/src/gui/colorlcd/timer_setup.cpp b/radio/src/gui/colorlcd/timer_setup.cpp index a44bb7ed017..3000b2df3b4 100644 --- a/radio/src/gui/colorlcd/timer_setup.cpp +++ b/radio/src/gui/colorlcd/timer_setup.cpp @@ -117,8 +117,28 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS) box->setFlexLayout(LV_FLEX_FLOW_ROW); lv_obj_set_width(box->getLvObj(), LV_SIZE_CONTENT); - new Choice(box, rect_t{}, STR_VBEEPCOUNTDOWN, COUNTDOWN_SILENT, - COUNTDOWN_COUNT - 1, GET_SET_DEFAULT(p_timer->countdownBeep)); + new Choice( + box, rect_t{}, STR_VBEEPCOUNTDOWN, COUNTDOWN_SILENT, COUNTDOWN_COUNT - 1, + [=]() -> int { + int value = p_timer->countdownBeep; + if (p_timer->extraHaptic) { + value += (COUNTDOWN_NON_HAPTIC_LAST + 1); + } + return (value); + }, + [=](int value) { + if (value > COUNTDOWN_NON_HAPTIC_LAST + 1) { + p_timer->extraHaptic = 1; + p_timer->countdownBeep = value - (COUNTDOWN_NON_HAPTIC_LAST + 1); + } else { + p_timer->extraHaptic = 0; + p_timer->countdownBeep = value; + } + SET_DIRTY(); + TRACE("value=%d\tcountdownBeep = %d\textraHaptic = %d", value, + p_timer->countdownBeep, p_timer->extraHaptic); + }); + new Choice(box, rect_t{}, STR_COUNTDOWNVALUES, 0, 3, GET_SET_WITH_OFFSET(p_timer->countdownStart, 2)); diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 91b19dbe039..aacc12f7224 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -294,6 +294,7 @@ static int luaModelGetTimer(lua_State *L) lua_pushtableboolean(L, "showElapsed", timer.showElapsed); lua_pushtableinteger(L, "switch", timer.swtch); lua_pushtableinteger(L, "countdownStart", timer.countdownStart); + lua_pushtableinteger(L, "extraHaptic", timer.extraHaptic); } else { lua_pushnil(L); @@ -349,13 +350,16 @@ static int luaModelSetTimer(lua_State *L) } else if (!strcmp(key, "showElapsed")) { timer.showElapsed = lua_toboolean(L, -1); - } + } else if (!strcmp(key, "switch")) { timer.swtch = luaL_checkinteger(L, -1); } else if (!strcmp(key, "countdownStart")) { timer.countdownStart = luaL_checkinteger(L, -1); } + else if (!strcmp(key, "extraHaptic")) { + timer.extraHaptic = lua_tointeger(L, -1); + } } storageDirty(EE_MODEL); } diff --git a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp index 4a780484587..42814002278 100644 --- a/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_lr3pro.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp index 8d58d0fb8ad..00266fd6cae 100644 --- a/radio/src/storage/yaml/yaml_datastructs_nv14.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_nv14.cpp @@ -470,7 +470,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 8), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t12.cpp b/radio/src/storage/yaml/yaml_datastructs_t12.cpp index 200c666487d..c63117247d2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t12.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_t8.cpp b/radio/src/storage/yaml/yaml_datastructs_t8.cpp index 4a780484587..42814002278 100644 --- a/radio/src/storage/yaml/yaml_datastructs_t8.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_t8.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp index 4a780484587..42814002278 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tlite.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp index d4aebedff08..02488a728d8 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tpro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tpro.cpp @@ -442,7 +442,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp index 6557324474f..e18a1730eff 100644 --- a/radio/src/storage/yaml/yaml_datastructs_tx12.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp index 0ca01633c00..4a3f3e9038c 100755 --- a/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_tx12mk2.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x10.cpp b/radio/src/storage/yaml/yaml_datastructs_x10.cpp index 1f018874517..0d5be3bd4fe 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x10.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x10.cpp @@ -501,7 +501,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 8), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp index faa58f0937d..a645ff117ac 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x12s.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x12s.cpp @@ -499,7 +499,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 8), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x7.cpp b/radio/src/storage/yaml/yaml_datastructs_x7.cpp index 4a780484587..42814002278 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x7.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x7.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp index 6007846398a..f3d64ed24a4 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9d.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9d.cpp @@ -444,7 +444,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 8), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp index a49055c1b48..2114cbcb46c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9e.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9e.cpp @@ -483,7 +483,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 8), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp index a606778cfba..e5110c32aa0 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lite.cpp @@ -421,7 +421,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp index 1cca91d6a85..c5c1cf7c0c2 100644 --- a/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_x9lites.cpp @@ -431,7 +431,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp index b990cc155ef..26ef4e8eb0c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlite.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlite.cpp @@ -428,7 +428,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp index 46df93ef3cf..6420e0feeae 100644 --- a/radio/src/storage/yaml/yaml_datastructs_xlites.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_xlites.cpp @@ -432,7 +432,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp index 0ca01633c00..4a3f3e9038c 100644 --- a/radio/src/storage/yaml/yaml_datastructs_zorro.cpp +++ b/radio/src/storage/yaml/yaml_datastructs_zorro.cpp @@ -436,7 +436,8 @@ static const struct YamlNode struct_TimerData[] = { YAML_UNSIGNED( "persistent", 2 ), YAML_SIGNED( "countdownStart", 2 ), YAML_UNSIGNED( "showElapsed", 1 ), - YAML_PADDING( 7 ), + YAML_UNSIGNED( "extraHaptic", 1 ), + YAML_PADDING( 6 ), YAML_STRING("name", 3), YAML_END }; diff --git a/radio/src/timers.cpp b/radio/src/timers.cpp index b5ef9f66010..8ce337209e1 100644 --- a/radio/src/timers.cpp +++ b/radio/src/timers.cpp @@ -166,9 +166,9 @@ void evalTimers(int16_t throttle, uint8_t tick10ms) if (g_model.timers[i].countdownBeep && g_model.timers[i].start) { AUDIO_TIMER_COUNTDOWN(i, newTimerVal); } - if (g_model.timers[i].minuteBeep && (newTimerVal % 60) == 0) { - tmrval_t announceVal = newTimerVal; - if (showElapsed) announceVal = timerStart - newTimerVal; + tmrval_t announceVal = newTimerVal; + if (showElapsed) announceVal = timerStart - newTimerVal; + if (g_model.timers[i].minuteBeep && (announceVal % 60) == 0) { AUDIO_TIMER_MINUTE(announceVal); // TRACE("Timer[%d] %d minute announcement", i, newTimerVal/60); } diff --git a/radio/src/translations.h b/radio/src/translations.h index 3d3d7fc3d88..72b1d133424 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -97,6 +97,12 @@ #define TR(x, y) TR2(x, y) // for compatibility +#if LCD_W <= 212 && !defined(COLORLCD) + #define TR2_2(x, y) x +#else + #define TR2_2(x, y) TR2(x, y) +#endif + #if defined(COLORLCD) #define BUTTON(x) x #define INDENT diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index cd8934ea127..e02bca06fac 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -64,7 +64,7 @@ #define TR_MULTI_CUSTOM "自定义" #define TR_VTRIMINC "指数","很小","较小","中等","较大" #define TR_VDISPLAYTRIMS "不显示","改变时","始终显示" -#define TR_VBEEPCOUNTDOWN "静音","蜂鸣","语音","震动" +#define TR_VBEEPCOUNTDOWN "静音","蜂鸣","语音","震动",TR2_2("B & H","Beeps & Haptic"),TR2_2("V & H","Voice & Haptic") #define TR_COUNTDOWNVALUES "5秒","10秒","20秒","30秒" #define TR_VVARIOCENTER "音调","静音" #define TR_CURVE_TYPES "标准","自定义" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index d8ed8975c3f..fc3f85af0cb 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -68,7 +68,7 @@ #define TR_MULTI_CUSTOM "Vlastní" #define TR_VTRIMINC "Expo","ExJemný","Jemný","Střední","Hrubý" #define TR_VDISPLAYTRIMS "Ne","Změna","Ano" -#define TR_VBEEPCOUNTDOWN "Ne","Zvuk","Hlas","Vibrace" +#define TR_VBEEPCOUNTDOWN "Ne", "Zvuk", "Hlas", "Vibrace", TR2_2("Zv & Vib","Zvuk & Vibrace"),TR2_2("Hl & Vib", "Hlas & Vibrace") #define TR_VVARIOCENTER "Tón","Ticho" #define TR_CURVE_TYPES "Rastr-X","Volná-XY" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 426bae4f1ad..26bd590ea7b 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -70,7 +70,7 @@ #define TR_MULTI_CUSTOM "Tilpasset" #define TR_VTRIMINC TR("Expo","Exponentiel"),TR("ExFin","Ekstra fin"),"Fin","Medium","Grov" #define TR_VDISPLAYTRIMS "Nej","Ændre","Ja" -#define TR_VBEEPCOUNTDOWN "Stille","Bip","Stemme","Vibration" +#define TR_VBEEPCOUNTDOWN "Stille","Bip","Stemme","Vibration",TR2_2("B & V","Bips & Vibration"),TR2_2("St & Vib","Stemme & Vibration") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tone","Stille" #define TR_CURVE_TYPES "Standard","Tilpasset" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 1d85221886c..0d875b1b4de 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -68,7 +68,7 @@ #define TR_MULTI_CUSTOM "Benutzer" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("ExFein","Extrafein"),"Fein","Mittel","Grob" #define TR_VDISPLAYTRIMS "Nein","Kurz","Ja" // Trimmwerte Keine, kurze Anzeigen, Ja -#define TR_VBEEPCOUNTDOWN "Kein","Pieps","Stimme","Haptik" +#define TR_VBEEPCOUNTDOWN "Kein", "Pieps", "Stimme", "Haptik", TR2_2("P & H","Pieps & Haptik"), TR2_2("St & H","Stimme & Haptik") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Ton","Ruhe" #define TR_CURVE_TYPES "Nur Y","X und Y" // "Standard","Custom" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 0dcc437f733..c6ef6bf6ed8 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -63,7 +63,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponential"),TR("ExFine","Extra Fine"),"Fine","Medium","Coarse" #define TR_VDISPLAYTRIMS "No","Change","Yes" -#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic" +#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic",TR2_2("B & H","Beeps & Haptic"),TR2_2("V & H","Voice & Haptic") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tone","Silent" #define TR_CURVE_TYPES "Standard","Custom" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index ad33d09e7f7..dee67f7effd 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -65,7 +65,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponencial"),TR("ExFino","Extra fino")"Fino","Medio","Grueso" #define TR_VDISPLAYTRIMS "No","Cambiar","Si" -#define TR_VBEEPCOUNTDOWN "Silencio","Beeps","Voz","Haptic" +#define TR_VBEEPCOUNTDOWN "Silencio", "Beeps", "Voz", "Haptic", TR2_2("B & H","Beeps & Haptic"),TR2_2("V & H", "Voz & Haptic") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tono","Silencio" #define TR_CURVE_TYPES "Normal","Custom" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index b193987af48..136bbd3f778 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -68,7 +68,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponential"),TR("EriHie","Eri Hieno"),"Hieno","Keski","Karkea" #define TR_VDISPLAYTRIMS "No","Change","Yes" -#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic" +#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic",TR2_2("B & H","Beeps & Haptic"),TR2_2("V & H","Voice & Haptic") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tone","Silent" #define TR_CURVE_TYPES "Standard","Custom" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index dab81d65371..444a88a67d7 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -68,7 +68,7 @@ #define TR_MULTI_CUSTOM "Perso" #define TR_VTRIMINC TR("Expo","Exponentiel"),TR("ExFin","Extra Fin"),"Fin","Moyen",TR("Gros","Grossier") #define TR_VDISPLAYTRIMS "Non","Change","Oui" -#define TR_VBEEPCOUNTDOWN "Aucun","Bips","Voix","Haptic" +#define TR_VBEEPCOUNTDOWN "Aucun","Bips","Voix","Haptic",TR2_2("B & H","Bips & Haptic"),TR2_2("V & H","Voix & Haptic") #define TR_VVARIOCENTER "Tone","Silent" #define TR_CURVE_TYPES "Standard","Libre" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index 7d30c78bb10..f5af140b170 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -67,7 +67,7 @@ #define TR_MULTI_CUSTOM "Person." #define TR_VTRIMINC "Exp","ExFine","Fine","Medio","Ampio " #define TR_VDISPLAYTRIMS "No","Cambio","Si" -#define TR_VBEEPCOUNTDOWN "Niente","Suoni","Voce","Vibra" +#define TR_VBEEPCOUNTDOWN "Niente", "Suoni", "Voce", "Vibra", TR2_2("S & V","Suoni & Vibra"),TR2_2("V & V","Voce & Vibra") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tono","Silenz." #define TR_CURVE_TYPES "Fisso","Modific." diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 5d12a1ff071..e103b1fc829 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -64,7 +64,7 @@ #define TR_MULTI_CUSTOM "カスタム" #define TR_VTRIMINC "ステップExpo","ステップ極小","ステップ小","ステップ中","ステップ大" #define TR_VDISPLAYTRIMS "非表示","変更時","常時表示" -#define TR_VBEEPCOUNTDOWN "消音","ビープ","音声","バイブレート" +#define TR_VBEEPCOUNTDOWN "消音","ビープ","音声","バイブレート",TR2_2("B & H","Beeps & Haptic"),TR("V & H","Voice & Haptic") #define TR_COUNTDOWNVALUES "5秒","10秒","20秒","30秒" #define TR_VVARIOCENTER "トーン","消音" #define TR_CURVE_TYPES "スタンダード","カスタム" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index 6a6615af9d8..858303c82b1 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -66,7 +66,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Exponentieel"),TR("ExFijn","Extra Fijn"),"Fijn","Medium","Grof" #define TR_VDISPLAYTRIMS "Nee","Kort","Ja" -#define TR_VBEEPCOUNTDOWN "Stilte","Beeps","Spraak","Tril" +#define TR_VBEEPCOUNTDOWN "Stilte","Beeps","Spraak","Tril",TR2_2("B & T","Beeps & Tril"),TR2_2("Spr & Tr","Spraak & Tril") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tonen","Stilte" #define TR_CURVE_TYPES "Standaard","Custom" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index 40a2132443c..2c5bf44a4e2 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -65,7 +65,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC TR("Expo","Expotencja"),TR("B.Dokł","B.Dokładny"),TR("Dokł.","Dokładny"),"Średni",TR("Zgrubn","Zgrubny") #define TR_VDISPLAYTRIMS "Nie","Zmień","Tak" -#define TR_VBEEPCOUNTDOWN "Cichy","Pik","Dźwięk","Wibrac" +#define TR_VBEEPCOUNTDOWN "Cichy","Pik","Dźwięk","Wibrac",TR2_2("P & W","Pik & Wibrac"),TR2_2("Dzw & Wbr","Dźwięk & Wibrac") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Ton","Cicho" #define TR_CURVE_TYPES "Standard","Własny" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 5298525259e..f41a9d87ed3 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -65,7 +65,7 @@ #define TR_MULTI_CUSTOM "Custom" #define TR_VTRIMINC "Expo","ExFino","Fino","Medio","Largo" #define TR_VDISPLAYTRIMS "No","Change","Yes" -#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic" +#define TR_VBEEPCOUNTDOWN "Silent","Beeps","Voice","Haptic",TR2_2("B & H","Beeps & Haptic"),TR2_2("V & H","Voice & Haptic") #define TR_COUNTDOWNVALUES "5s","10s","20s","30s" #define TR_VVARIOCENTER "Tone","Silent" #define TR_CURVE_TYPES "Standard","Custom" diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 210e71886de..9e85dbfd054 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -74,7 +74,7 @@ #define TR_MULTI_CUSTOM "Anpassad" #define TR_VTRIMINC TR("Expo","Exponentiell"),TR("xFin","Extra fin"),"Fin","Medium","Grov" #define TR_VDISPLAYTRIMS "Nej","Ändring","Ja" -#define TR_VBEEPCOUNTDOWN "Tyst","Pip","Röst","Vibrera" +#define TR_VBEEPCOUNTDOWN "Tyst", "Pip", "Röst", "Vibrera", TR2_2("P & Vib","Pips & Vibrera"),TR2_2("R & Vib","Röst & Vibrera") #define TR_VVARIOCENTER "Pip","Tyst" #define TR_CURVE_TYPES "Normal","Anpassad" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index 7b8eb74b199..51fdfe3bd99 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -64,7 +64,7 @@ #define TR_MULTI_CUSTOM "自定義" #define TR_VTRIMINC "指數","很小","較小","中等","較大" #define TR_VDISPLAYTRIMS "不顯示","改變時","始終顯示" -#define TR_VBEEPCOUNTDOWN "靜音","蜂鳴","語音","震動" +#define TR_VBEEPCOUNTDOWN "靜音","蜂鳴","語音","震動","Beeps & Haptic","Voice & Haptic" #define TR_COUNTDOWNVALUES "5秒","10秒","20秒","30秒" #define TR_VVARIOCENTER "音調","靜音" #define TR_CURVE_TYPES "標準","自定義"