feat: Allow the timer count direction to be selected (#2038)

* timer direction: ellapsed or left

* Add AUDIO announcement support

* Storage for showElapsed

* Translations

* Fix storage

* BW implementation

* Different BW implementation

* Companion support

* Color LCD implementation and rebase to lvgl

* Fix problems found by raphaelcoeffic

* chore: Regenerate the YAML files properly

* fix: Remove unused `TR_SHOW` remnant

* chore: Formatting and cleanup

* fix: Timer dir choice was shown in wrong place
Wrong newline used in ce23b50

* Fix cpn ui triggers, remove unnecessary code and some formatting

* fix(colorlcd): Hide timer dir opt if zero value

Co-authored-by: Peter Feerick <peter.feerick@gmail.com>
Co-authored-by: elecpower <neilh713@tpg.com.au>
This commit is contained in:
eshifri
2022-08-03 09:22:42 +10:00
committed by GitHub
co-authored by Peter Feerick elecpower
parent 415b566a79
commit be7a6a51ab
50 changed files with 286 additions and 85 deletions
@@ -283,6 +283,7 @@ Node convert<TimerData>::encode(const TimerData& rhs)
node["persistent"] = rhs.persistent;
node["countdownStart"] = rhs.countdownStart;
node["value"] = rhs.pvalue;
node["showElapsed"] = rhs.showElapsed;
return node;
}
@@ -297,6 +298,7 @@ bool convert<TimerData>::decode(const Node& node, TimerData& rhs)
node["persistent"] >> rhs.persistent;
node["countdownStart"] >> rhs.countdownStart;
node["value"] >> rhs.pvalue;
node["showElapsed"] >> rhs.showElapsed;
return true;
}
+23
View File
@@ -180,6 +180,16 @@ QString TimerData::modeToString(const int value)
}
}
QString TimerData::showElapsedToString(const unsigned int value)
{
return (value) ? tr("Show Elapsed") : tr("Show Remaining");
}
QString TimerData::showElapsedToString() const
{
return showElapsedToString(showElapsed);
}
// static
AbstractStaticItemModel * TimerData::countdownBeepItemModel()
{
@@ -235,3 +245,16 @@ AbstractStaticItemModel * TimerData::modeItemModel()
mdl->loadItemList();
return mdl;
}
AbstractStaticItemModel * TimerData::showElapsedItemModel()
{
AbstractStaticItemModel *mdl = new AbstractStaticItemModel();
mdl->setName(AIM_TIMER_SHOWELAPSED);
for (unsigned int i = 0; i < TIMER_SHOW_COUNT; i++) {
mdl->appendToItemList(showElapsedToString(i), i);
}
mdl->loadItemList();
return mdl;
}
+12 -1
View File
@@ -32,6 +32,7 @@ constexpr char AIM_TIMER_COUNTDOWNBEEP[] {"timerdata.countdownBeep"};
constexpr char AIM_TIMER_COUNTDOWNSTART[] {"timerdata.countdownStart"};
constexpr char AIM_TIMER_PERSISTENT[] {"timerdata.persistent"};
constexpr char AIM_TIMER_MODE[] {"timerdata.mode"};
constexpr char AIM_TIMER_SHOWELAPSED[] {"timerdata.showElapsed"};
constexpr int TIMER_NAME_LEN {8};
@@ -74,6 +75,12 @@ class TimerData {
TIMERMODE_MAX = TIMERMODE_COUNT - 1
};
enum TimerShowDirection {
TIMER_SHOW_REMAINING,
TIMER_SHOW_ELAPSED,
TIMER_SHOW_COUNT
};
TimerData() { clear(); }
RawSwitch swtch;
@@ -85,6 +92,7 @@ class TimerData {
unsigned int persistent;
int countdownStart;
int pvalue;
unsigned int showElapsed;
void convert(RadioDataConversionState & cstate);
void clear();
@@ -97,6 +105,8 @@ class TimerData {
QString pvalueToString() const;
QString valToString() const;
QString modeToString() const;
QString showElapsedToString() const;
void countdownBeepChanged();
void modeChanged();
@@ -106,9 +116,10 @@ class TimerData {
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();
};
+17 -1
View File
@@ -59,6 +59,9 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G
ui->value->setField(timer.val, this);
ui->value->setMaximumTime(firmware->getMaxTimerStart());
connect(ui->value, &AutoTimeEdit::currentDataChanged, [=](const int val) {
update();
});
ui->mode->setModel(panelItemModels->getItemModel(AIM_TIMER_MODE));
ui->mode->setField(timer.mode, this);
@@ -85,6 +88,10 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G
ui->countdownStart->setModel(panelItemModels->getItemModel(AIM_TIMER_COUNTDOWNSTART));
ui->countdownStart->setField(timer.countdownStart, this);
ui->showElapsed->setModel(panelItemModels->getItemModel(AIM_TIMER_SHOWELAPSED));
ui->showElapsed->setField(timer.showElapsed, this);
disableMouseScrolling();
QWidget::setTabOrder(prevFocus, ui->name);
QWidget::setTabOrder(ui->name, ui->value);
@@ -93,6 +100,7 @@ TimerPanel::TimerPanel(QWidget * parent, ModelData & model, TimerData & timer, G
QWidget::setTabOrder(ui->countdownBeep, ui->countdownStart);
QWidget::setTabOrder(ui->countdownStart, ui->minuteBeep);
QWidget::setTabOrder(ui->minuteBeep, ui->persistent);
QWidget::setTabOrder(ui->persistent, ui->showElapsed);
update();
lock = false;
@@ -114,6 +122,7 @@ void TimerPanel::update()
ui->countdownBeep->updateValue();
ui->minuteBeep->updateValue();
ui->countdownStart->updateValue();
ui->showElapsed->updateValue();
if (timer.mode != TimerData::TIMERMODE_OFF)
ui->swtch->setEnabled(true);
@@ -134,6 +143,13 @@ void TimerPanel::update()
ui->persistentValue->setText(timer.pvalueToString());
}
if (timer.val) {
ui->showElapsed->setEnabled(true);
}
else {
ui->showElapsed->setEnabled(false);
}
lock = false;
}
@@ -1276,7 +1292,7 @@ SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & ge
panelItemModels->registerItemModel(TimerData::persistentItemModel());
panelItemModels->registerItemModel(TimerData::modeItemModel());
panelFilteredModels->registerItemModel(new FilteredItemModel(ModelData::trainerModeItemModel(generalSettings, firmware)), FIM_TRAINERMODE);
panelItemModels->registerItemModel(TimerData::showElapsedItemModel());
Board::Type board = firmware->getBoard();
memset(modules, 0, sizeof(modules));
+1 -1
View File
@@ -223,7 +223,7 @@ class SetupPanel : public ModelPanel
ModulePanel * modules[CPN_MAX_MODULES + 1];
TimerPanel * timers[CPN_MAX_TIMERS];
FunctionSwitchesPanel * funcswitches;
void updateStartupSwitches();
void updatePotWarnings();
void updateBeepCenter();
+3
View File
@@ -91,6 +91,9 @@
<item>
<widget class="AutoComboBox" name="persistent"/>
</item>
<item>
<widget class="AutoComboBox" name="showElapsed"/>
</item>
<item>
<widget class="QLabel" name="persistentValue">
<property name="text">
+1
View File
@@ -352,6 +352,7 @@ QString MultiModelPrinter::printTimers()
COMPARECELLWIDTH(model->timers[i].countdownStartToString(), 10);
COMPARECELLWIDTH(DataHelpers::boolToString(model->timers[i].minuteBeep, DataHelpers::BOOL_FMT_YESNO), 10);
COMPARECELLWIDTH(model->timers[i].persistentToString(false), 10);
COMPARECELLWIDTH(model->timers[i].showElapsedToString(), 12);
columns.appendRowEnd();
}
columns.appendTableEnd();
+12 -12
View File
@@ -54,7 +54,7 @@ static inline void check_struct()
CHKSIZE(LogicalSwitchData, 9);
CHKSIZE(CustomFunctionData, 11);
CHKSIZE(FlightModeData, 28 + 2*NUM_TRIMS);
CHKSIZE(TimerData, 11);
CHKSIZE(TimerData, 12);
CHKSIZE(SwashRingData, 8);
CHKSIZE(FrSkyBarData, 6);
CHKSIZE(FrSkyLineData, 4);
@@ -68,7 +68,7 @@ static inline void check_struct()
CHKSIZE(LogicalSwitchData, 9);
CHKSIZE(CustomFunctionData, 11);
CHKSIZE(FlightModeData, 40);
CHKSIZE(TimerData, 16);
CHKSIZE(TimerData, 17);
CHKSIZE(SwashRingData, 8);
CHKSIZE(FrSkyBarData, 6);
CHKSIZE(FrSkyLineData, 6);
@@ -81,7 +81,7 @@ static inline void check_struct()
CHKSIZE(LimitData, 13);
CHKSIZE(CustomFunctionData, 9);
CHKSIZE(FlightModeData, 44);
CHKSIZE(TimerData, 16);
CHKSIZE(TimerData, 17);
CHKSIZE(SwashRingData, 8);
CHKSIZE(ModelHeader, 31);
CHKSIZE(CurveHeader, 4);
@@ -118,33 +118,33 @@ static inline void check_struct()
#if defined(PCBXLITES)
CHKSIZE(RadioData, 861);
CHKSIZE(ModelData, 6161);
CHKSIZE(ModelData, 6164);
#elif defined(PCBXLITE)
CHKSIZE(RadioData, 859);
CHKSIZE(ModelData, 6161);
CHKSIZE(ModelData, 6164);
#elif defined(RADIO_TPRO)
CHKSIZE(RadioData, 842);
CHKSIZE(ModelData, 6186);
CHKSIZE(ModelData, 6189);
#elif defined(PCBX7)
CHKSIZE(RadioData, 865);
CHKSIZE(ModelData, 6161);
CHKSIZE(ModelData, 6164);
#elif defined(PCBX9E)
CHKSIZE(RadioData, 955);
CHKSIZE(ModelData, 6613);
CHKSIZE(ModelData, 6616);
#elif defined(PCBX9D) || defined(PCBX9DP)
CHKSIZE(RadioData, 897);
CHKSIZE(ModelData, 6605);
CHKSIZE(ModelData, 6608);
#elif defined(PCBHORUS)
#if defined(PCBX10)
CHKSIZE(RadioData, 923);
CHKSIZE(ModelData, 11025);
CHKSIZE(ModelData, 11028);
#else
CHKSIZE(RadioData, 905);
CHKSIZE(ModelData, 11023);
CHKSIZE(ModelData, 11026);
#endif
#elif defined(PCBNV14)
CHKSIZE(RadioData, 851);
CHKSIZE(ModelData, 10839);
CHKSIZE(ModelData, 10842);
#endif
#undef CHKSIZE
+2
View File
@@ -237,6 +237,8 @@ PACK(struct TimerData {
uint32_t minuteBeep:1;
uint32_t persistent:2;
int32_t countdownStart:2;
uint8_t showElapsed:1;
uint8_t spare:7 SKIP;
NOBACKUP(char name[LEN_TIMER_NAME]);
});
+10 -5
View File
@@ -925,18 +925,23 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att)
const TimerData &timer = g_model.timers[index];
if (timer.mode) {
const TimerData &timerData = g_model.timers[index];
const TimerState &timerState = timersStates[index];
const uint8_t negative = (timerState.val < 0 ? BLINK | INVERS : 0);
if (timerState.val < 60 * 60) { // display MM:SS
div_t qr = div((int) abs(timerState.val), 60);
int val = timerState.val;
if (timerData.start && timerData.showElapsed &&
timerData.start != timerState.val)
val = (int)timerData.start - (int)timerState.val;
if (val < 60 * 60) { // display MM:SS
div_t qr = div((int) abs(val), 60);
lcdDrawNumber(x - 5, y, qr.rem, att | LEADING0 | negative, 2);
lcdDrawText(lcdLastLeftPos, y, ":", att | BLINK | negative);
lcdDrawNumber(lcdLastLeftPos, y, qr.quot, att | negative);
if (negative)
lcdDrawText(lcdLastLeftPos, y, "-", att | negative);
}
else if (timerState.val < (99 * 60 * 60) + (59 * 60)) { // display HHhMM
div_t qr = div((int) (abs(timerState.val) / 60), 60);
else if (val < (99 * 60 * 60) + (59 * 60)) { // display HHhMM
div_t qr = div((int) (abs(val) / 60), 60);
lcdDrawNumber(x - 5, y, qr.rem, att | LEADING0, 2);
lcdDrawText(lcdLastLeftPos, y, "h", att);
lcdDrawNumber(lcdLastLeftPos, y, qr.quot, att);
@@ -945,7 +950,7 @@ void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att)
}
else { //display HHHH for crazy large persistent timers
lcdDrawText(x - 5, y, "h", att);
lcdDrawNumber(lcdLastLeftPos, y, timerState.val / 3600, att);
lcdDrawNumber(lcdLastLeftPos, y, val / 3600, att);
}
uint8_t xLabel = (negative ? x - 56 : x - 49);
uint8_t len = zlen(timer.name, LEN_TIMER_NAME);
+1 -1
View File
@@ -155,7 +155,7 @@ void menuModelLimitsOne(event_t event)
case ITEM_OUTPUTONE_DIR:
{
lcdDrawTextAlignedLeft(y, TR_LIMITS_HEADERS_DIRECTION);
lcdDrawTextAlignedLeft(y, STR_LIMITS_HEADERS_DIRECTION);
lcdDrawTextAtIndex(LIMITS_ONE_2ND_COLUMN, y, STR_MMMINV, ld->revert, attr);
if (active) {
CHECK_INCDEC_MODELVAR_ZERO(event, ld->revert, 1);
+17 -3
View File
@@ -188,7 +188,7 @@ enum MenuModelSetupItems {
ITEM_MODEL_SETUP_TRAINER_LABEL,
ITEM_MODEL_SETUP_TRAINER_MODE,
#if defined(BLUETOOTH)
ITEM_MODEL_SETUP_TRAINER_BLUETOOTH,
ITEM_MODEL_SETUP_TRAINER_BLUETOOTH,
#endif
ITEM_MODEL_SETUP_TRAINER_CHANNELS,
ITEM_MODEL_SETUP_TRAINER_PPM_PARAMS,
@@ -261,11 +261,13 @@ inline uint8_t MODULE_SUBTYPE_ROWS(int moduleIdx)
#define POT_WARN_ROWS ((g_model.potsWarnMode) ? (uint8_t)(NUM_POTS+NUM_SLIDERS) : (uint8_t)0)
#define TIMER_ROWS(x) \
1, 0, 1, 0, 0, \
1, 0, \
(uint8_t)((g_model.timers[x].start) ? 2 : 1), \
0, 0, \
g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 \
: (uint8_t)0
#define EXTRA_MODULE_ROWS
#define EXTRA_MODULE_ROWS
#if defined(FUNCTION_SWITCHES)
#define FUNCTION_SWITCHES_ROWS READONLY_ROW, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|3, NAVIGATION_LINE_BY_LINE|(NUM_FUNCTIONS_SWITCHES-1),
@@ -571,6 +573,12 @@ void menuModelSetup(event_t event)
menuHorizontalPosition == 0 ? attr : 0,
menuHorizontalPosition == 1 ? attr : 0);
if (timer->start) {
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, STR_TIMER_DIR,
timer->showElapsed,
menuHorizontalPosition == 2 ? attr : 0);
}
if (attr && s_editMode > 0) {
div_t qr = div(timer->start, 60);
switch (menuHorizontalPosition) {
@@ -586,6 +594,12 @@ void menuModelSetup(event_t event)
if ((int16_t) timer->start > 5999)
timer->start = 32399; // 8:59:59
break;
case 2:
if (timer->start) {
timer->showElapsed =
checkIncDecModel(event, timer->showElapsed, 0, 1);
}
break;
}
}
break;
+36 -12
View File
@@ -225,6 +225,12 @@ void editTimerStart(int timerIdx, coord_t y, LcdFlags attr, event_t event)
menuHorizontalPosition == 0 ? attr : 0,
menuHorizontalPosition == 1 ? attr : 0);
if (g_model.timers[timerIdx].start) {
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_TIMER_DIR,
g_model.timers[timerIdx].showElapsed,
menuHorizontalPosition == 2 ? attr : 0);
}
if (attr && menuHorizontalPosition < 0) {
lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN - 1, y - 1, 4 * FW, FH + 1);
}
@@ -242,6 +248,12 @@ void editTimerStart(int timerIdx, coord_t y, LcdFlags attr, event_t event)
if ((int16_t)timer->start < 0) timer->start = 0;
if ((int16_t)timer->start > 5999) timer->start = 32399; // 8:59:59
break;
case 2:
if (g_model.timers[timerIdx].start) {
g_model.timers[timerIdx].showElapsed = checkIncDecModel(
event, g_model.timers[timerIdx].showElapsed, 0, 1);
}
break;
}
}
}
@@ -289,7 +301,10 @@ void editTimerCountdown(int timerIdx, coord_t y, LcdFlags attr, event_t event)
#endif
#define TIMER_ROWS(x) \
1 | NAVIGATION_LINE_BY_LINE, 0, 1 | NAVIGATION_LINE_BY_LINE, 0, 0, \
1 | NAVIGATION_LINE_BY_LINE, 0, \
(uint8_t)(((g_model.timers[x].start) ? 2 : 1) | \
NAVIGATION_LINE_BY_LINE), \
0, 0, \
g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 \
: (uint8_t)0
@@ -520,17 +535,22 @@ void menuModelSetup(event_t event)
editTimerStart(0, y, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP:
g_model.timers[0].minuteBeep = editCheckBox(g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_MINUTE_BEEP:
g_model.timers[0].minuteBeep = editCheckBox(
g_model.timers[0].minuteBeep, MODEL_SETUP_2ND_COLUMN, y,
INDENT TR_MINUTEBEEP, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP:
editTimerCountdown(0, y, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_COUNTDOWN_BEEP:
editTimerCountdown(0, y, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_PERSISTENT:
g_model.timers[0].persistent = editChoice(
MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT,
g_model.timers[0].persistent, 0, 2, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER1_PERSISTENT:
g_model.timers[0].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, g_model.timers[0].persistent, 0, 2, attr, event);
break;
#if TIMERS > 1
case ITEM_MODEL_SETUP_TIMER2:
@@ -576,7 +596,9 @@ void menuModelSetup(event_t event)
break;
case ITEM_MODEL_SETUP_TIMER3_MINUTE_BEEP:
g_model.timers[2].minuteBeep = editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN, y, INDENT TR_MINUTEBEEP, attr, event);
g_model.timers[2].minuteBeep =
editCheckBox(g_model.timers[2].minuteBeep, MODEL_SETUP_2ND_COLUMN,
y, INDENT TR_MINUTEBEEP, attr, event);
break;
case ITEM_MODEL_SETUP_TIMER3_COUNTDOWN_BEEP:
@@ -584,7 +606,9 @@ void menuModelSetup(event_t event)
break;
case ITEM_MODEL_SETUP_TIMER3_PERSISTENT:
g_model.timers[2].persistent = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT, g_model.timers[2].persistent, 0, 2, attr, event);
g_model.timers[2].persistent = editChoice(
MODEL_SETUP_2ND_COLUMN, y, STR_PERSISTENT, STR_VPERSISTENT,
g_model.timers[2].persistent, 0, 2, attr, event);
break;
#endif
+5 -1
View File
@@ -318,7 +318,11 @@ void displayTimers()
else {
lcdDrawTextAtIndex(TIMERS_X, y-7, STR_VTMRMODES, timerData.mode, SMLSIZE);
}
drawTimer(TIMERS_X, y, timerState.val, TIMEHOUR|MIDSIZE|LEFT, TIMEHOUR|MIDSIZE|LEFT);
int val = timerState.val;
if (timerData.start && timerData.showElapsed &&
timerData.start != timerState.val)
val = (int)timerData.start - (int)timerState.val;
drawTimer(TIMERS_X, y, val, TIMEHOUR|MIDSIZE|LEFT, TIMEHOUR|MIDSIZE|LEFT);
if (timerData.persistent) {
lcdDrawChar(TIMERS_R, y+1, 'P', SMLSIZE);
}
+34 -3
View File
@@ -43,6 +43,21 @@ static std::function<void(uint32_t)> timerValueUpdater(uint8_t timer)
};
}
static void timer_start_changed(lv_event_t* e)
{
lv_obj_t* target = lv_event_get_target(e);
auto obj = (lv_obj_t*)lv_event_get_user_data(e);
auto val = (TimeEdit*)lv_obj_get_user_data(target);
if (!obj || !val) return;
if (val->getValue() > 0) {
lv_obj_clear_flag(obj, LV_OBJ_FLAG_HIDDEN);
} else {
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
}
}
TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS)
{
std::string title = std::string(STR_TIMER) + std::to_string(timer + 1);
@@ -74,8 +89,21 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS)
// Timer start value
line = form->newLine(&grid);
new StaticText(line, rect_t{}, STR_START, 0, COLOR_THEME_PRIMARY1);
new TimeEdit(line, rect_t{}, 0, TIMER_MAX, GET_DEFAULT(p_timer->start),
timerValueUpdater(timer));
auto timerValue =
new TimeEdit(line, rect_t{}, 0, TIMER_MAX, GET_DEFAULT(p_timer->start),
timerValueUpdater(timer));
// Timer direction
auto timerDirLine = form->newLine(&grid);
new StaticText(timerDirLine, rect_t{}, STR_LIMITS_HEADERS_DIRECTION, 0,
COLOR_THEME_PRIMARY1);
new Choice(timerDirLine, rect_t{}, STR_TIMER_DIR, 0, 1,
GET_SET_DEFAULT(p_timer->showElapsed));
if (timerValue->getValue() == 0) {
auto obj = timerDirLine->getLvObj();
lv_obj_add_flag(obj, LV_OBJ_FLAG_HIDDEN);
}
// Timer minute beep
line = form->newLine(&grid);
@@ -88,7 +116,7 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS)
auto box = new FormGroup(line, rect_t{});
box->setFlexLayout(LV_FLEX_FLOW_ROW);
new Choice(box, rect_t{}, STR_VBEEPCOUNTDOWN, COUNTDOWN_SILENT,
COUNTDOWN_COUNT - 1, GET_SET_DEFAULT(p_timer->countdownBeep));
new Choice(box, rect_t{}, STR_COUNTDOWNVALUES, 0, 3,
@@ -100,4 +128,7 @@ TimerWindow::TimerWindow(uint8_t timer) : Page(ICON_STATS_TIMERS)
new Choice(line, rect_t{}, STR_VPERSISTENT, 0, 2,
GET_SET_DEFAULT(p_timer->persistent));
lv_obj_add_event_cb(timerValue->getLvObj(), timer_start_changed,
LV_EVENT_VALUE_CHANGED, timerDirLine->getLvObj());
}
+20 -9
View File
@@ -41,8 +41,8 @@ STATIC_LZ4_BITMAP(LBM_TIMER_BACKGROUND);
class TimerWidget : public Widget
{
public:
TimerWidget(const WidgetFactory* factory, Window* parent,
const rect_t& rect, Widget::PersistentData* persistentData) :
TimerWidget(const WidgetFactory* factory, Window* parent, const rect_t& rect,
Widget::PersistentData* persistentData) :
Widget(factory, parent, rect, persistentData)
{
}
@@ -81,8 +81,11 @@ class TimerWidget : public Widget
dc->drawBitmapPattern(3, 4, LBM_TIMER, colorFore);
}
// value
splitTimer(sDigitGroup0, sDigitGroup1, sUnit0, sUnit1,
abs(timerState.val), false);
int val = timerState.val;
if (timerData.start && timerData.showElapsed &&
timerData.start != timerState.val)
val = (int)timerData.start - (int)timerState.val;
splitTimer(sDigitGroup0, sDigitGroup1, sUnit0, sUnit1, abs(val), false);
dc->drawSizedText(76, 31, sDigitGroup0, ZLEN(sDigitGroup0),
FONT(XL) | colorFore);
@@ -115,12 +118,16 @@ class TimerWidget : public Widget
FONT(XS) | COLOR_THEME_PRIMARY2);
}
// value
int val = timerState.val;
if (timerData.start && timerData.showElapsed &&
timerData.start != timerState.val)
val = (int)timerData.start - (int)timerState.val;
if (width() > 100 && height() > 40) {
if (abs(timerState.val) >= 3600) {
drawTimer(dc, 3, 20, abs(timerState.val),
if (abs(val) >= 3600) {
drawTimer(dc, 3, 20, abs(val),
COLOR_THEME_PRIMARY2 | LEFT | TIMEHOUR);
} else {
drawTimer(dc, 3, 18, abs(timerState.val),
drawTimer(dc, 3, 18, abs(val),
COLOR_THEME_PRIMARY2 | LEFT | FONT(STD));
}
}
@@ -130,8 +137,12 @@ class TimerWidget : public Widget
drawTimer(dc, 3, 20, abs(timerState.val),
COLOR_THEME_PRIMARY2 | LEFT | FONT(XS) | TIMEHOUR);
} else {
drawTimer(dc, 3, 18, abs(timerState.val),
COLOR_THEME_PRIMARY2 | LEFT);
// value
int val = timerState.val;
if (timerData.start && timerData.showElapsed &&
timerData.start != timerState.val)
val = (int)timerData.start - (int)timerState.val;
drawTimer(dc, 3, 18, abs(val), COLOR_THEME_PRIMARY2 | LEFT);
}
}
}
@@ -463,6 +463,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 8),
YAML_END
};
@@ -836,7 +838,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -888,7 +890,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -436,6 +436,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -812,7 +814,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -869,7 +871,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -487,6 +487,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 8),
YAML_END
};
@@ -860,7 +862,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -912,7 +914,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_END
};
@@ -485,6 +485,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 8),
YAML_END
};
@@ -858,7 +860,7 @@ static const struct YamlNode struct_TopBarPersistentData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -910,7 +912,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 248, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -438,6 +438,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 8),
YAML_END
};
@@ -819,7 +821,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 192, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -873,7 +875,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 192, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_END
};
@@ -477,6 +477,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 8),
YAML_END
};
@@ -858,7 +860,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 192, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -913,7 +915,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 192, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 128, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 136, 3, struct_TimerData, NULL),
YAML_END
};
@@ -415,6 +415,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -791,7 +793,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -843,7 +845,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -425,6 +425,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -801,7 +803,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -853,7 +855,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -422,6 +422,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -798,7 +800,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -850,7 +852,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -426,6 +426,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -802,7 +804,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -854,7 +856,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
@@ -430,6 +430,8 @@ static const struct YamlNode struct_TimerData[] = {
YAML_UNSIGNED( "minuteBeep", 1 ),
YAML_UNSIGNED( "persistent", 2 ),
YAML_SIGNED( "countdownStart", 2 ),
YAML_UNSIGNED( "showElapsed", 1 ),
YAML_PADDING( 7 ),
YAML_STRING("name", 3),
YAML_END
};
@@ -806,7 +808,7 @@ static const struct YamlNode struct_TelemetryScreenData[] = {
static const struct YamlNode struct_ModelData[] = {
YAML_CUSTOM("semver",nullptr,w_semver),
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_UNSIGNED( "telemetryProtocol", 3 ),
YAML_UNSIGNED( "thrTrim", 1 ),
YAML_UNSIGNED( "noGlobalFunctions", 1 ),
@@ -858,7 +860,7 @@ static const struct YamlNode struct_ModelData[] = {
};
static const struct YamlNode struct_PartialModel[] = {
YAML_STRUCT("header", 96, struct_ModelHeader, NULL),
YAML_ARRAY("timers", 88, 3, struct_TimerData, NULL),
YAML_ARRAY("timers", 96, 3, struct_TimerData, NULL),
YAML_END
};
+4 -1
View File
@@ -77,6 +77,7 @@ void evalTimers(int16_t throttle, uint8_t tick10ms)
tmrstart_t timerStart = g_model.timers[i].start;
int16_t timerSwtch = g_model.timers[i].swtch;
TimerState * timerState = &timersStates[i];
uint32_t showElapsed = g_model.timers[i].showElapsed;
if (timerMode) {
if ((timerState->state == TMR_OFF)
@@ -166,7 +167,9 @@ void evalTimers(int16_t throttle, uint8_t tick10ms)
AUDIO_TIMER_COUNTDOWN(i, newTimerVal);
}
if (g_model.timers[i].minuteBeep && (newTimerVal % 60) == 0) {
AUDIO_TIMER_MINUTE(newTimerVal);
tmrval_t announceVal = newTimerVal;
if (showElapsed) announceVal = timerStart - newTimerVal;
AUDIO_TIMER_MINUTE(announceVal);
// TRACE("Timer[%d] %d minute announcement", i, newTimerVal/60);
}
}
+2 -1
View File
@@ -99,7 +99,7 @@ ISTR(SBUS_INVERSION_VALUES);
ISTR(SPORT_MODES);
ISTR(FSGROUPS);
ISTR(ADCFILTERVALUES);
ISTR(TIMER_DIR);
#if defined(HELI)
ISTR(VSWASHTYPE);
@@ -778,6 +778,7 @@ const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE;
const char STR_TOUCH_PANEL[] = TR_TOUCH_PANEL;
const char STR_FILE_SIZE[] = TR_FILE_SIZE;
const char STR_FILE_OPEN[] = TR_FILE_OPEN;
const char STR_LIMITS_HEADERS_DIRECTION[] = TR_LIMITS_HEADERS_DIRECTION;
#if defined(COLORLCD)
const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH;
+2
View File
@@ -118,6 +118,7 @@ extern const char* STR_VTRIMINC[];
extern const char* STR_VDISPLAYTRIMS[];
extern const char* STR_RETA123[];
extern const char* STR_TIMER_DIR[];
extern const char* STR_VBLMODE[];
extern const char* STR_VCURVEFUNC[];
@@ -675,6 +676,7 @@ extern const char STR_SCRIPT_KILLED[];
extern const char STR_SCRIPT_ERROR[];
extern const char STR_PLAY_FILE[];
extern const char STR_ASSIGN_BITMAP[];
extern const char STR_LIMITS_HEADERS_DIRECTION[];
#if defined(COLORLCD)
extern const char STR_ASSIGN_SPLASH[];
extern const char STR_FIRST_CHANNEL[];
+1
View File
@@ -250,6 +250,7 @@
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值"
#define TR_TEXT_SIZE "标准","小","较小","中等","双倍"
#define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)", "=(整体)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -266,6 +266,7 @@
#define TR_VPREC "X","X.X","X.XX"
#define TR_VCELLINDEX "Nízký","1","2","3","4","5","6","Nejvíce","Delta"
#define TR_SUBTRIMMODES STR_CHAR_DELTA"(pouze středy)","= (symetrický)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
+1
View File
@@ -252,6 +252,7 @@
#define TR_VCELLINDEX "Lavest","1","2","3","4","5","6","Højst","Delta"
#define TR_TEXT_SIZE "Standard","Tynd","Lille","Medium","Dobbelt"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center kun)","= (symmetrisk)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -252,6 +252,7 @@
#define TR_VCELLINDEX "Niedrigst","1. Zelle","2. Zelle","3. Zelle","4. Zelle","5. Zelle","6. Zelle","Höchster","Differenz"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
+1
View File
@@ -250,6 +250,7 @@
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symmetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -249,6 +249,7 @@
#define TR_VCELLINDEX "Menor","1","2","3","4","5","6","Mayor","Delta"
#define TR_TEXT_SIZE "Normal","Muy pequeño","Pequeño","Medio","Doble"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -265,6 +265,7 @@
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Alin","1","2","3","4","5","6","Korkein","Ero"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
// ZERO TERMINATED STRINGS
#define INDENT "\001"
+1
View File
@@ -269,6 +269,7 @@
#define TR_VPREC "0.--","0.0","0.00"
#define TR_VCELLINDEX "Mini.","1","2","3","4","5","6","Maxi.","Diff."
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
+1
View File
@@ -254,6 +254,7 @@
#define TR_VCELLINDEX "Minore","1","2","3","4","5","6","Maggiore","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT "\007"
+1
View File
@@ -255,6 +255,7 @@
#define TR_GYROS "GyrX","GyrY"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -249,6 +249,7 @@
#define TR_VCELLINDEX "Niskie","1","2","3","4","5","6","Wysokie","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA" (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT "\007"
+1
View File
@@ -246,6 +246,7 @@
#define TR_VCELLINDEX "Lowest","1","2","3","4","5","6","Highest","Delta"
#define TR_TEXT_SIZE "Standard","Tiny","Small","Mid","Double"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT
+1
View File
@@ -271,6 +271,7 @@
#define TR_VCELLINDEX "Lägsta","1","2","3","4","5","6","Högsta","Skillnad"
#define TR_GYROS "GyrX","GyrY"
#define TR_SUBTRIMMODES STR_CHAR_DELTA " (center only)","= (symetrical)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
// ZERO TERMINATED STRINGS
#if defined(COLORLCD)
+1
View File
@@ -250,6 +250,7 @@
#define TR_VCELLINDEX "最低值","1","2","3","4","5","6","最高值","差值"
#define TR_TEXT_SIZE "標準","小","較小","中等","雙倍"
#define TR_SUBTRIMMODES STR_CHAR_DELTA "(中点)","=(整體)"
#define TR_TIMER_DIR TR("Remain", "Show Remain"), TR("Elaps.", "Show Elapsed")
#if defined(COLORLCD)
#define INDENT