diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 836e60e88..65f12aa48 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -168,6 +168,7 @@ enum MainViews { VIEW_OUTPUTS_BARS, VIEW_INPUTS, VIEW_TIMER2, + VIEW_CHAN_MONITOR, VIEW_COUNT }; #endif diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 8ac31d239..d7e1538f5 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -235,6 +235,9 @@ void pushMenuTextView(const char *filename); void pushModelNotes(); void readModelNotes(); +void menuChannelsView(event_t event); +void menuChannelsViewCommon(event_t event); + #define CURSOR_MOVED_LEFT(event) (IS_ROTARY_LEFT(event) || EVT_KEY_MASK(event) == KEY_LEFT) #define CURSOR_MOVED_RIGHT(event) (IS_ROTARY_RIGHT(event) || EVT_KEY_MASK(event) == KEY_RIGHT) @@ -294,6 +297,7 @@ void drawProgressScreen(const char * title, const char * message, int num, int d void drawSleepBitmap(); void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uint16_t count, uint8_t visible); +void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max); void drawAlertBox(const char * title, const char * text, const char * action); void showAlertBox(const char * title, const char * text, const char * action , uint8_t sound); @@ -303,7 +307,7 @@ void showAlertBox(const char * title, const char * text, const char * action , u #define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView #define IS_TELEMETRY_VIEW_DISPLAYED() menuHandlers[0] == menuViewTelemetry -#define IS_OTHER_VIEW_DISPLAYED() false +#define IS_OTHER_VIEW_DISPLAYED() menuHandlers[0] == menuChannelsView void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); diff --git a/radio/src/gui/128x64/lcd.h b/radio/src/gui/128x64/lcd.h index 3e7e609ac..f1fc72810 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -114,8 +114,6 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len); void lcdDrawTextAlignedLeft(coord_t y, const char * s); void drawTimerWithMode(coord_t x, coord_t y, uint8_t index, LcdFlags att); -#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s) - void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawHexChar(coord_t x, coord_t y, uint8_t val, LcdFlags flags=0); diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 188f4c868..51294e1b3 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -161,6 +161,18 @@ void menuModelCurveOne(event_t event) POPUP_MENU_START(onCurveOneMenu); } break; + +#if defined(NAVIGATION_X7) + case EVT_KEY_LONG(KEY_MENU): + pushMenu(menuChannelsView); + killEvents(event); + break; +#elif defined(NAVIGATION_XLITE) + case EVT_KEY_LONG(KEY_SHIFT): + pushMenu(menuChannelsView); + killEvents(event); + break; +#endif } drawCurve(0); diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp index f0a926074..7648cd9f3 100644 --- a/radio/src/gui/128x64/model_failsafe.cpp +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -51,7 +51,7 @@ void menuModelFailsafe(event_t event) SIMPLE_SUBMENU_NOTITLE(sentModuleChannels(g_moduleIdx)); - lcdDrawTextAlignedCenter(0, TR_FAILSAFESET); + lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED); lcdInvertLine(0); for (uint8_t i=0; ichn, 0); diff --git a/radio/src/gui/128x64/model_mix_edit.cpp b/radio/src/gui/128x64/model_mix_edit.cpp index 785d8a989..681b425b4 100644 --- a/radio/src/gui/128x64/model_mix_edit.cpp +++ b/radio/src/gui/128x64/model_mix_edit.cpp @@ -85,6 +85,17 @@ void drawOffsetBar(uint8_t x, uint8_t y, MixData * md) void menuModelMixOne(event_t event) { +#if defined(NAVIGATION_X7) + if (event == EVT_KEY_LONG(KEY_MENU)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#elif defined(NAVIGATION_XLITE) + if (event == EVT_KEY_LONG(KEY_SHIFT)) { + pushMenu(menuChannelsView); + killEvents(event); + } +#endif MixData * md2 = mixAddress(s_currIdx) ; putsChn(PSIZE(TR_MIXES)*FW+FW, 0, md2->destCh+1,0); diff --git a/radio/src/gui/128x64/radio_calibration.cpp b/radio/src/gui/128x64/radio_calibration.cpp index a8004c7a2..3e1a30d20 100644 --- a/radio/src/gui/128x64/radio_calibration.cpp +++ b/radio/src/gui/128x64/radio_calibration.cpp @@ -179,7 +179,7 @@ void menuFirstCalib(event_t event) chainMenu(menuMainView); } else { - lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION); + lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED); lcdInvertLine(0); menuCommonCalib(event); } diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp index f13b871ce..2e3ed0a40 100644 --- a/radio/src/gui/128x64/view_channels.cpp +++ b/radio/src/gui/128x64/view_channels.cpp @@ -20,7 +20,30 @@ #include "opentx.h" -void menuChannelsView(event_t event) +constexpr coord_t CHANNEL_NAME_OFFSET = 1; +constexpr coord_t CHANNEL_VALUE_OFFSET = CHANNEL_NAME_OFFSET + 42; +constexpr coord_t CHANNEL_GAUGE_OFFSET = CHANNEL_VALUE_OFFSET; +constexpr coord_t CHANNEL_BAR_WIDTH = 70; +constexpr coord_t CHANNEL_PROPERTIES_OFFSET = CHANNEL_GAUGE_OFFSET + CHANNEL_BAR_WIDTH + 2; + +#if defined(NAVIGATION_X7) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_LONG(KEY_PAGE) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) +#define EVT_KEY_NEXT_PAGE EVT_ROTARY_RIGHT +#define EVT_KEY_PREVIOUS_PAGE EVT_ROTARY_LEFT +#elif defined(NAVIGATION_XLITE) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN) +#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT) +#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT) +#else +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN) +#define EVT_KEY_NEXT_PAGE EVT_KEY_BREAK(KEY_RIGHT) +#define EVT_KEY_PREVIOUS_PAGE EVT_KEY_BREAK(KEY_LEFT) +#endif + +void menuChannelsViewCommon(event_t event) { bool newLongNames = false; @@ -31,13 +54,79 @@ void menuChannelsView(event_t event) memclear(&reusableBuffer.viewChannels, sizeof(reusableBuffer.viewChannels)); break; + case EVT_KEY_FIRST(KEY_ENTER): + reusableBuffer.viewChannels.mixersView = !reusableBuffer.viewChannels.mixersView; + break; + } + + ch = 8 * (g_eeGeneral.view / ALTERNATE_VIEW); + + // Screen title + lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED); + lcdInvertLine(0); + + int16_t limits = 512 * 2; + + // Channels + for (uint8_t line = 0; line < 8; line++) { + LimitData * ld = limitAddress(ch); + const uint8_t y = 9 + line * 7; + const int32_t val = reusableBuffer.viewChannels.mixersView ? ex_chans[ch] : channelOutputs[ch]; + const uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); + + // Channel name if present, number if not + if (lenLabel > 0) { + if (lenLabel > 4) + reusableBuffer.viewChannels.longNames = true; + lcdDrawSizedText(CHANNEL_NAME_OFFSET, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); + } + else { + putsChn(CHANNEL_NAME_OFFSET, y, ch + 1, SMLSIZE); + } + + // Value +#if defined(PPM_UNIT_US) + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, PPM_CH_CENTER(ch) + val / 2, TINSIZE | RIGHT); +#elif defined(PPM_UNIT_PERCENT_PREC1) + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val), PREC1 | TINSIZE | RIGHT); +#else + lcdDrawNumber(CHANNEL_VALUE_OFFSET, y + 1, calcRESXto1000(val) / 10, TINSIZE | RIGHT); +#endif + + // Gauge + drawGauge(CHANNEL_GAUGE_OFFSET, y, CHANNEL_BAR_WIDTH, 6, val, limits); + + if (!reusableBuffer.viewChannels.mixersView) { + // Properties +#if defined(OVERRIDE_CHANNEL_FUNCTION) + if (safetyCh[ch] != OVERRIDE_CHANNEL_UNDEFINED) + lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "OVR", TINSIZE); + else +#endif + if (ld && ld->revert) { + lcdDrawText(CHANNEL_PROPERTIES_OFFSET, y, "INV", TINSIZE); + } + } + + ++ch; + } + + reusableBuffer.viewChannels.longNames = newLongNames; +} + +void menuChannelsView(event_t event) +{ + switch (event) { case EVT_KEY_BREAK(KEY_EXIT): popMenu(); break; - case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_LEFT): - reusableBuffer.viewChannels.secondPage = !reusableBuffer.viewChannels.secondPage; + case EVT_KEY_NEXT_PAGE: + g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) + ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW); + break; + + case EVT_KEY_PREVIOUS_PAGE: + g_eeGeneral.view = (g_eeGeneral.view + (4 * ALTERNATE_VIEW) - ALTERNATE_VIEW) % (4 * ALTERNATE_VIEW); break; case EVT_KEY_FIRST(KEY_ENTER): @@ -45,67 +134,5 @@ void menuChannelsView(event_t event) break; } - if (reusableBuffer.viewChannels.secondPage) - ch = 16; - else - ch = 0; - - if (reusableBuffer.viewChannels.mixersView) { - lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR); - } - else { - lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR); - } - - lcdInvertLine(0); - - // Column separator - lcdDrawSolidVerticalLine(LCD_W/2, FH, LCD_H-FH); - - for (uint8_t col=0; col<2; col++) { - - uint8_t x = col*LCD_W/2+1; - - // Channels - for (uint8_t line=0; line<8; line++) { - uint8_t y = 9+line*7; - int32_t val = (reusableBuffer.viewChannels.mixersView) ? ex_chans[ch] : channelOutputs[ch]; - uint8_t ofs = (col ? 0 : 1); - - // Channel name if present, number if not - uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); - if (lenLabel > 4) { - newLongNames = reusableBuffer.viewChannels.longNames = true; - } - - if (lenLabel > 0) - lcdDrawSizedText(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); - else - putsChn(x+1-ofs, y, ch+1, SMLSIZE); - - // Value -#if defined(PPM_UNIT_US) - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, PPM_CH_CENTER(ch)+val/2, TINSIZE|RIGHT); -#elif defined(PPM_UNIT_PERCENT_PREC1) - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 48 : 58); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val), PREC1|TINSIZE|RIGHT); -#else - uint8_t wbar = (reusableBuffer.viewChannels.longNames ? 54 : 64); - lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val)/10, TINSIZE|RIGHT); -#endif - - // Gauge -// uint16_t lim = (g_model.extendedLimits ? (512 * (long)LIMIT_EXT_PERCENT / 100) : 512) * 2; -//#ifdef MIXERS_MONITOR -// if (mixersView) -// lim = 512 * 2 * 2; -//#endif - // TODO ? drawGauge(x+LCD_W/2-3-wbar-ofs, y, wbar, 6, val, lim); - - ch++; - } - } - - reusableBuffer.viewChannels.longNames = newLongNames; + menuChannelsViewCommon(event); } diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index b1ab8cd79..b5f067162 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -56,7 +56,7 @@ void drawExternalAntennaAndRSSI() { #if defined(INTERNAL_MODULE_PXX1) && defined(EXTERNAL_ANTENNA) if (isModuleXJT(INTERNAL_MODULE) && isExternalAntennaEnabled()) { - lcdDrawText(VBATT_X-1, VBATT_Y+8, "E", TINSIZE); + lcdDrawText(VBATT_X - 1, VBATT_Y + 8, "E", TINSIZE); } #endif @@ -75,10 +75,10 @@ void drawExternalAntennaAndRSSI() void drawPotsBars() { // Optimization by Mike Blandford - for (uint8_t x=LCD_W/2 - (NUM_POTS+NUM_SLIDERS-1) * 5 / 2, i=NUM_STICKS; i TRIM_MAX) { exttrim = true; } - if (val < -(TRIM_LEN+1)*4) { - val = -(TRIM_LEN+1); + if (val < -(TRIM_LEN + 1) * 4) { + val = -(TRIM_LEN + 1); } - else if (val > (TRIM_LEN+1)*4) { - val = TRIM_LEN+1; + else if (val > (TRIM_LEN + 1) * 4) { + val = TRIM_LEN + 1; } else { val /= 4; @@ -129,65 +129,65 @@ void displayTrims(uint8_t phase) if (vert[i]) { ym = 31; - lcdDrawSolidVerticalLine(xm, ym-TRIM_LEN, TRIM_LEN*2); - if (i!=2 || !g_model.thrTrim) { - lcdDrawSolidVerticalLine(xm-1, ym-1, 3); - lcdDrawSolidVerticalLine(xm+1, ym-1, 3); + lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2); + if (i != 2 || !g_model.thrTrim) { + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); } ym -= val; - lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); if (dir >= 0) { - lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); } if (dir <= 0) { - lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); } if (exttrim) { - lcdDrawSolidHorizontalLine(xm-1, ym, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym, 3); } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? 12 : 40, xm-2, -abs(dir), TINSIZE|VERTICAL); + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), TINSIZE | VERTICAL); } } } else { ym = 60; - lcdDrawSolidHorizontalLine(xm-TRIM_LEN, ym, TRIM_LEN*2); - lcdDrawSolidHorizontalLine(xm-1, ym-1, 3); - lcdDrawSolidHorizontalLine(xm-1, ym+1, 3); + lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2); + lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); + lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); xm += val; - lcdDrawFilledRect(xm-3, ym-3, 7, 7, SOLID, att|ERASE); + lcdDrawFilledRect(xm - 3, ym - 3, 7, 7, SOLID, att | ERASE); if (dir >= 0) { - lcdDrawSolidVerticalLine(xm+1, ym-1, 3); + lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); } if (dir <= 0) { - lcdDrawSolidVerticalLine(xm-1, ym-1, 3); + lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); } if (exttrim) { - lcdDrawSolidVerticalLine(xm, ym-1, 3); + lcdDrawSolidVerticalLine(xm, ym - 1, 3); } if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir>0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym-2, -abs(dir), TINSIZE); + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber((stickIndex == 0 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)), ym - 2, -abs(dir), TINSIZE); } } } - lcdDrawSquare(xm-3, ym-3, 7, att); + lcdDrawSquare(xm - 3, ym - 3, 7, att); } } void displayBattVoltage() { #if defined(BATTGRAPH) - putsVBat(VBATT_X-8, VBATT_Y+1, RIGHT); - lcdDrawSolidFilledRect(VBATT_X-25, VBATT_Y+9, 21, 5); - lcdDrawSolidVerticalLine(VBATT_X-4, VBATT_Y+10, 3); + putsVBat(VBATT_X - 8, VBATT_Y + 1, RIGHT); + lcdDrawSolidFilledRect(VBATT_X - 25, VBATT_Y + 9, 21, 5); + lcdDrawSolidVerticalLine(VBATT_X - 4, VBATT_Y + 10, 3); uint8_t count = GET_TXBATT_BARS(20); - for (uint8_t i=0; i= 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); y += 4; if (val > 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); y += 4; } } - lcdDrawChar(width==5 ? x+1 : x, y, 'A'+index, SMLSIZE); + lcdDrawChar(width == 5 ? x + 1 : x, y, 'A' + index, SMLSIZE); y += 7; if (val <= 0) { lcdDrawSolidHorizontalLine(x, y, width); - lcdDrawSolidHorizontalLine(x, y+2, width); + lcdDrawSolidHorizontalLine(x, y + 2, width); if (val < 0) { - lcdDrawSolidHorizontalLine(x, y+4, width); - lcdDrawSolidHorizontalLine(x, y+6, width); + lcdDrawSolidHorizontalLine(x, y + 4, width); + lcdDrawSolidHorizontalLine(x, y + 6, width); } } } @@ -320,25 +320,20 @@ void menuMainView(event_t event) killEvents(KEY_DOWN); break; - /* TODO if timer2 is OFF, it's possible to use this timer2 as in er9x... - case EVT_KEY_BREAK(KEY_MENU): - if (view_base == VIEW_TIMER2) { - Timer2_running = !Timer2_running; - AUDIO_KEY_PRESS(); - } - break; - */ - + /* TODO if timer2 is OFF, it's possible to use this timer2 as in er9x... + case EVT_KEY_BREAK(KEY_MENU): + if (view_base == VIEW_TIMER2) { + Timer2_running = !Timer2_running; + AUDIO_KEY_PRESS(); + } + break; + */ case EVT_KEY_NEXT_PAGE: case EVT_KEY_PREVIOUS_PAGE: - if (view_base <= VIEW_INPUTS) { - if (view_base == VIEW_INPUTS) - g_eeGeneral.view ^= ALTERNATE_VIEW; - else - g_eeGeneral.view = (g_eeGeneral.view + (4*ALTERNATE_VIEW) + ((event==EVT_KEY_PREVIOUS_PAGE) ? -ALTERNATE_VIEW : ALTERNATE_VIEW)) % (4*ALTERNATE_VIEW); - storageDirty(EE_GENERAL); - AUDIO_KEY_PRESS(); - } + if (view_base == VIEW_INPUTS) + g_eeGeneral.view ^= ALTERNATE_VIEW; + else + g_eeGeneral.view = (g_eeGeneral.view + (4*ALTERNATE_VIEW) + ((event==EVT_KEY_PREVIOUS_PAGE) ? -ALTERNATE_VIEW : ALTERNATE_VIEW)) % (4*ALTERNATE_VIEW); break; case EVT_KEY_CONTEXT_MENU: @@ -379,12 +374,13 @@ void menuMainView(event_t event) case EVT_KEY_PREVIOUS_VIEW: case EVT_KEY_NEXT_VIEW: // TODO try to split those 2 cases on 9X - g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1)); + g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT - 1 ? 0 : view_base + 1) : (view_base == 0 ? VIEW_COUNT - 1 : view_base - + 1)); storageDirty(EE_GENERAL); break; #else case EVT_KEY_NEXT_VIEW: - g_eeGeneral.view = (view_base == 0 ? VIEW_COUNT-1 : view_base-1); + g_eeGeneral.view = (view_base == 0 ? VIEW_COUNT - 1 : view_base - 1); storageDirty(EE_GENERAL); break; #endif @@ -410,53 +406,34 @@ void menuMainView(event_t event) break; } - { - // Flight Mode Name - uint8_t mode = mixerCurrentFlightMode; - lcdDrawSizedText(PHASE_X, PHASE_Y, g_model.flightModeData[mode].name, sizeof(g_model.flightModeData[mode].name), ZCHAR|PHASE_FLAGS); + switch (view_base) { + case VIEW_CHAN_MONITOR: + menuChannelsViewCommon(event); + break; - // Model Name - putsModelName(MODELNAME_X, MODELNAME_Y, g_model.header.name, g_eeGeneral.currModel, BIGSIZE); + case VIEW_OUTPUTS_VALUES: + case VIEW_OUTPUTS_BARS: + // scroll bar + lcdDrawHorizontalLine(38, 34, 54, DOTTED); + lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID); + for (uint8_t i=0; i<8; i++) { + uint8_t x0, y0; + uint8_t chan = 8 * (g_eeGeneral.view / ALTERNATE_VIEW) + i; + int16_t val = channelOutputs[chan]; - // Main Voltage (or alarm if any) - displayVoltageOrAlarm(); - - // Timer 1 - drawTimerWithMode(125, 2*FH, 0, RIGHT | DBLSIZE); - - // Trims sliders - displayTrims(mode); - - // RSSI gauge / external antenna - drawExternalAntennaAndRSSI(); - } - - if (view_base < VIEW_INPUTS) { - // scroll bar - lcdDrawHorizontalLine(38, 34, 54, DOTTED); - lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID); - - for (uint8_t i=0; i<8; i++) { - uint8_t x0,y0; - uint8_t chan = 8*(g_eeGeneral.view / ALTERNATE_VIEW) + i; - - int16_t val = channelOutputs[chan]; - - switch (view_base) { - case VIEW_OUTPUTS_VALUES: - x0 = (i%4*9+3)*FW/2; - y0 = i/4*FH+40; + if (view_base == VIEW_OUTPUTS_VALUES) { + x0 = (i % 4 * 9 + 3) * FW / 2; + y0 = i / 4 * FH + 40; #if defined(PPM_UNIT_US) - lcdDrawNumber(x0+4*FW , y0, PPM_CH_CENTER(chan)+val/2, RIGHT); + lcdDrawNumber(x0 + 4 * FW, y0, PPM_CH_CENTER(chan) + val / 2, RIGHT); #elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val), RIGHT|PREC1); + lcdDrawNumber(x0 + 4 * FW, y0, calcRESXto1000(val), RIGHT | PREC1); #else lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val)/10, RIGHT); // G: Don't like the decimal part* #endif - break; - - case VIEW_OUTPUTS_BARS: -#define WBAR2 (50/2) + } + else { + constexpr coord_t WBAR2 = (50/2); x0 = i<4 ? LCD_W/4+2 : LCD_W*3/4-2; y0 = 38+(i%4)*5; @@ -473,99 +450,121 @@ void menuMainView(event_t event) x0 -= len; lcdDrawSolidHorizontalLine(x0, y0+1, len); lcdDrawSolidHorizontalLine(x0, y0-1, len); - break; + } } - } - } - else if (view_base == VIEW_INPUTS) { - if (view == VIEW_INPUTS) { - // Sticks + Pots - doMainScreenGraphics(); + break; - // Switches + case VIEW_TIMER2: + drawTimerWithMode(87, 5 * FH, 1, RIGHT | DBLSIZE); + break; + + case VIEW_INPUTS: + if (view == VIEW_INPUTS) { + // Sticks + Pots + doMainScreenGraphics(); + + // Switches #if defined(PCBX9LITES) - static const uint8_t x[NUM_SWITCHES-2] = {2*FW-2, 2*FW-2, 17*FW+1, 2*FW-2, 17*FW+1}; - static const uint8_t y[NUM_SWITCHES-2] = {4*FH+1, 5*FH+1, 5*FH+1, 6*FH+1, 6*FH+1}; - for (int i=0; i= switches/2) { - x = 16*FW+1; - y -= (switches/2)*FH; + static const uint8_t x[NUM_SWITCHES-2] = {2*FW-2, 2*FW-2, 17*FW+1, 2*FW-2, 17*FW+1}; + static const uint8_t y[NUM_SWITCHES-2] = {4*FH+1, 5*FH+1, 5*FH+1, 6*FH+1, 6*FH+1}; + for (int i=0; i= switches / 2) { + x = 16 * FW + 1; + y -= (switches / 2) * FH; + } + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH + i); + getvalue_t sw = ((val < 0) ? 3 * i + 1 : ((val == 0) ? 3 * i + 2 : 3 * i + 3)); + drawSwitch(x, y, sw, 0, false); } - getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); - getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); - drawSwitch(x, y, sw, 0, false); } - } #else - // The ID0 3-POS switch is merged with the TRN switch - for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) { - int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); - uint8_t x = 2*FW-2, y = i*FH+1; - if (i >= SWSRC_AIL) { - x = 17*FW-1; - y -= 3*FH; + // The ID0 3-POS switch is merged with the TRN switch + for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) { + int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); + uint8_t x = 2*FW-2, y = i*FH+1; + if (i >= SWSRC_AIL) { + x = 17*FW-1; + y -= 3*FH; + } + drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0, false); } - drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0, false); - } #endif - } - else { - // Logical Switches - uint8_t index = 0; - uint8_t y = LCD_H-20; - for (uint8_t line=0; line<2; line++) { - for (uint8_t column=0; column0) ? x+w/2 : x+1+w/2-len; + for (coord_t i=h-2; i>0; i--) { + lcdDrawSolidHorizontalLine(x0, y+i, len); + } +} + void title(const char * s) { lcdDrawText(0, 0, s, INVERS); diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index c4e427771..8fdafdfd4 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -111,8 +111,6 @@ void lcdDrawText(coord_t x, coord_t y, const char * s); void lcdDrawSizedText(coord_t x, coord_t y, const char * s, unsigned char len); void lcdDrawTextAlignedLeft(coord_t y, const char * s); -#define lcdDrawTextAlignedCenter(y, s) lcdDrawText((LCD_W-sizeof(s)*FW+FW+1)/2, y, s) - void lcdDrawHexNumber(coord_t x, coord_t y, uint32_t val, LcdFlags mode=0); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode, uint8_t len); void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); diff --git a/radio/src/gui/212x64/model_failsafe.cpp b/radio/src/gui/212x64/model_failsafe.cpp index 939e7927a..85ab66805 100644 --- a/radio/src/gui/212x64/model_failsafe.cpp +++ b/radio/src/gui/212x64/model_failsafe.cpp @@ -80,7 +80,7 @@ void menuModelFailsafe(event_t event) } } - lcdDrawTextAlignedCenter(0, TR_FAILSAFESET); + lcdDrawText(LCD_W / 2, 0, STR_FAILSAFESET, CENTERED); lcdInvertLine(0); coord_t x = colW; diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index bf4c829c3..6ec060e6f 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -202,7 +202,7 @@ void menuFirstCalib(event_t event) chainMenu(menuMainView); } else { - lcdDrawTextAlignedCenter(0*FH, TR_MENUCALIBRATION); + lcdDrawText(LCD_W / 2, 0, STR_MENUCALIBRATION, CENTERED); lcdInvertLine(0); menuCommonCalib(event); } diff --git a/radio/src/gui/212x64/view_channels.cpp b/radio/src/gui/212x64/view_channels.cpp index 4b34f7f4f..e00b3e9d0 100644 --- a/radio/src/gui/212x64/view_channels.cpp +++ b/radio/src/gui/212x64/view_channels.cpp @@ -61,11 +61,7 @@ void menuChannelsView(event_t event) else if (g_model.extendedLimits) limits *= LIMIT_EXT_PERCENT / 100; - if (reusableBuffer.viewChannels.mixersView) - lcdDrawTextAlignedCenter(0, TR_MIXERS_MONITOR); - else - lcdDrawTextAlignedCenter(0, TR_CHANNELS_MONITOR); - + lcdDrawText(LCD_W / 2, 0, reusableBuffer.viewChannels.mixersView ? STR_MIXERS_MONITOR : STR_CHANNELS_MONITOR, CENTERED); lcdInvertLine(0); // Column separator diff --git a/radio/src/gui/480x272/view_text.cpp b/radio/src/gui/480x272/view_text.cpp index a7969d21f..24a1779db 100644 --- a/radio/src/gui/480x272/view_text.cpp +++ b/radio/src/gui/480x272/view_text.cpp @@ -59,14 +59,6 @@ bool menuTextView(event_t event) lcd->drawTextMaxWidth(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP + i * FH, reusableBuffer.viewText.lines[i], 0, LCD_W - 2 * MENUS_MARGIN_LEFT); } -#if 0 - char * title = s_text_file; -#if defined(SIMU) - if (!strncmp(title, "./", 2)) title += 2; -#endif - lcdDrawTextAlignedCenter(MENU_FOOTER_TOP, title, HEADER_COLOR); -#endif - drawVerticalScrollbar(LCD_W-5, 50, 195, menuVerticalOffset, lines_count, NUM_BODY_LINES); return true; diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index cb207e10a..0036e3630 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -71,6 +71,7 @@ set(GUI_SRC radio_diaganas.cpp view_telemetry.cpp view_about.cpp + view_channels.cpp ) if(GVARS)