diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 5d484c4ad..640f2b18f 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -1103,79 +1103,112 @@ void menuModelSetup(event_t event) #if defined(CPUARM) void menuModelFailsafe(event_t event) { - static bool longNames = false; - bool newLongNames = false; - uint8_t ch = 0; + uint8_t ch = 8 * (menuVerticalPosition / 8); + uint8_t channelStart = g_model.moduleData[g_moduleIdx].channelsStart; - if (event == EVT_KEY_LONG(KEY_ENTER) && s_editMode) { - START_NO_HIGHLIGHT(); - g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition] = channelOutputs[menuVerticalPosition]; - storageDirty(EE_MODEL); - AUDIO_WARNING1(); - SEND_FAILSAFE_NOW(g_moduleIdx); + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + event = 0; + if (s_editMode) { + g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition] = channelOutputs[ch+channelStart]; + storageDirty(EE_MODEL); + AUDIO_WARNING1(); + s_editMode = 0; + SEND_FAILSAFE_NOW(g_moduleIdx); + } + else { + int16_t & failsafe = g_model.moduleData[g_moduleIdx].failsafeChannels[menuVerticalPosition]; + if (failsafe < FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_HOLD; + else if (failsafe == FAILSAFE_CHANNEL_HOLD) + failsafe = FAILSAFE_CHANNEL_NOPULSE; + else + failsafe = 0; + storageDirty(EE_MODEL); + AUDIO_WARNING1(); + SEND_FAILSAFE_NOW(g_moduleIdx); + } } - SIMPLE_SUBMENU_NOTITLE(MAX_OUTPUT_CHANNELS); + SIMPLE_SUBMENU_NOTITLE(NUM_CHANNELS(g_moduleIdx)); - #define COL_W (LCD_W) const uint8_t SLIDER_W = 90; - ch = 8 * (menuVerticalPosition / 8); lcdDrawTextAlignedCenter(0*FH, FAILSAFESET); lcdInvertLine(0); - uint8_t col = 0; + unsigned int lim = g_model.extendedLimits ? 640*2 : 512*2; - { - coord_t x = col*COL_W+1; + coord_t x = 1; - // Channels - for (uint8_t line=0; line<8; line++) { - coord_t y = 9+line*7; - int32_t val; - uint8_t ofs = (col ? 0 : 1); + // Channels + for (uint8_t line=0; line<8; line++) { + coord_t y = 9+line*7; + int32_t channelValue = channelOutputs[ch+channelStart]; + int32_t failsafeValue = 0; + bool failsafeEditable = false; - if (ch < g_model.moduleData[g_moduleIdx].channelsStart || ch >= NUM_CHANNELS(g_moduleIdx) + g_model.moduleData[g_moduleIdx].channelsStart) - val = 0; - else if (s_editMode && menuVerticalPosition == ch) - val = channelOutputs[ch]; - else - val = g_model.moduleData[g_moduleIdx].failsafeChannels[8*col+line]; + if (ch < NUM_CHANNELS(g_moduleIdx)) { + failsafeValue = g_model.moduleData[g_moduleIdx].failsafeChannels[ch]; + failsafeEditable = true; + } - putsChn(x+1-ofs, y, ch+1, SMLSIZE); + if (failsafeEditable) { + //Channel + putsChn(x+1, y, ch+1, SMLSIZE); // Value LcdFlags flags = TINSIZE; - if (menuVerticalPosition == ch && !NO_HIGHLIGHT()) { + if (menuVerticalPosition == ch) { flags |= INVERS; - if (s_editMode) - flags |= BLINK; + if (s_editMode) { + if (failsafeValue == FAILSAFE_CHANNEL_HOLD || failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + s_editMode = 0; + } + else { + flags |= BLINK; + CHECK_INCDEC_MODELVAR(event, g_model.moduleData[g_moduleIdx].failsafeChannels[ch], -lim, +lim); + } + } } -#if defined(PPM_UNIT_US) - uint8_t wbar = (longNames ? SLIDER_W-10 : SLIDER_W); - lcdDrawNumber(x+COL_W-4-wbar-ofs, y, PPM_CH_CENTER(ch)+val/2, flags); -#elif defined(PPM_UNIT_PERCENT_PREC1) - uint8_t wbar = (longNames ? SLIDER_W-16 : SLIDER_W-6); - lcdDrawNumber(x+COL_W-4-wbar-ofs, y, calcRESXto1000(val), PREC1|flags); + +#if defined(PPM_UNIT_PERCENT_PREC1) + uint8_t wbar = SLIDER_W-6; #else - uint8_t wbar = (longNames ? SLIDER_W-10 : SLIDER_W); - lcdDrawNumber(x+COL_W-4-wbar-ofs, y, calcRESXto1000(val)/10, flags); + uint8_t wbar = SLIDER_W); #endif + uint8_t xValue = x+LCD_W-4-wbar; + if (failsafeValue == FAILSAFE_CHANNEL_HOLD) { + lcdDrawText(xValue, y, STR_HOLD, RIGHT|flags); + failsafeValue = 0; + } + else if (failsafeValue == FAILSAFE_CHANNEL_NOPULSE) { + lcdDrawText(xValue, y, STR_NONE, RIGHT|flags); + failsafeValue = 0; + } + else { +#if defined(PPM_UNIT_US) + lcdDrawNumber(xValue, y, PPM_CH_CENTER(ch)+failsafeValue/2, RIGHT|flags); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue), RIGHT|PREC1|flags); +#else + lcdDrawNumber(xValue, y, calcRESXto1000(failsafeValue)/10, RIGHT|flags); +#endif + } + // Gauge - lcdDrawRect(x+COL_W-3-wbar-ofs, y, wbar+1, 6); - uint16_t lim = g_model.extendedLimits ? 640*2 : 512*2; - uint8_t len = limit((uint8_t)1, uint8_t((abs(val) * wbar/2 + lim/2) / lim), uint8_t(wbar/2)); - coord_t x0 = (val>0) ? x+COL_W-ofs-3-wbar/2 : x+COL_W-ofs-2-wbar/2-len; - lcdDrawSolidHorizontalLine(x0, y+1, len); - lcdDrawSolidHorizontalLine(x0, y+2, len); - lcdDrawSolidHorizontalLine(x0, y+3, len); - lcdDrawSolidHorizontalLine(x0, y+4, len); - - ch++; + lcdDrawRect(x+LCD_W-3-wbar, y, wbar+1, 6); + unsigned int lenChannel = limit((uint8_t)1, uint8_t((abs(channelValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2)); + unsigned int lenFailsafe = limit((uint8_t)1, uint8_t((abs(failsafeValue) * wbar/2 + lim/2) / lim), uint8_t(wbar/2)); + coord_t xChannel = (channelValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenChannel; + coord_t xFailsafe = (failsafeValue>0) ? x+LCD_W-3-wbar/2 : x+LCD_W-2-wbar/2-lenFailsafe; + lcdDrawHorizontalLine(xChannel, y+1, lenChannel, DOTTED, 0); + lcdDrawHorizontalLine(xChannel, y+2, lenChannel, DOTTED, 0); + lcdDrawSolidHorizontalLine(xFailsafe, y+3, lenFailsafe); + lcdDrawSolidHorizontalLine(xFailsafe, y+4, lenFailsafe); } + ch++; } - - longNames = newLongNames; } #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index fc03515c8..37c61d029 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -1085,8 +1085,6 @@ void menuModelFailsafe(event_t event) SIMPLE_SUBMENU_NOTITLE(NUM_CHANNELS(g_moduleIdx)); - SET_SCROLLBAR_X(0); - #define COL_W (LCD_W/2) const uint8_t SLIDER_W = 64;