[128x64] Fix and cleanup custom failsafe menu (Fix #4123)

This commit is contained in:
Andre Bernet
2016-12-10 17:51:24 +01:00
parent a747d99ec4
commit 98b695c284
2 changed files with 83 additions and 52 deletions
+83 -50
View File
@@ -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
-2
View File
@@ -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;