diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index 87d4cfd25..d9c4ac99c 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -95,7 +95,7 @@ if(PCB STREQUAL HORUS) menu_model_inputs.cpp menu_model_mixes.cpp view_channels.cpp - view_logic_switches.cpp + view_logical_switches.cpp view_about.cpp view_text.cpp screens_setup.cpp diff --git a/radio/src/gui/horus/menus.h b/radio/src/gui/horus/menus.h index 3ab61daa7..58ed613b0 100644 --- a/radio/src/gui/horus/menus.h +++ b/radio/src/gui/horus/menus.h @@ -100,8 +100,7 @@ enum MenuIcons { ICON_MONITOR_OUTPUTS2, ICON_MONITOR_MIXERS1, ICON_MONITOR_MIXERS2, -/* ICON_MONITOR_LOGIC_SWITCHES1, - ICON_MONITOR_LOGIC_SWITCHES2,*/ + ICON_MONITOR_LOGICAL_SWITCHES, MENUS_ICONS_COUNT }; @@ -167,8 +166,7 @@ const uint8_t MONITOR_ICONS[] = { ICON_MONITOR_OUTPUTS2, ICON_MONITOR_MIXERS1, ICON_MONITOR_MIXERS2, -/* ICON_MONITOR_LOGIC_SWITCHES1, - ICON_MONITOR_LOGIC_SWITCHES2*/ + ICON_MONITOR_LOGICAL_SWITCHES }; bool menuModelSetup(evt_t event); @@ -234,16 +232,15 @@ static const MenuHandlerFunc menuTabStats[] PROGMEM = { enum EnumTabMonitors { - e_Outputs1, - e_Outputs2, - e_Mixers1, - e_Mixers2, -/* e_LogicSwitches1, - e_LogicSwitches2,*/ - e_TabChannelsPagesCount + e_MonOutputs1, + e_MonOutputs2, + e_MonMixers1, + e_MonMixers2, + e_MonLogicalSwitches, + e_MonTabChannelsPagesCount }; -extern const MenuHandlerFunc menuTabMonitors[e_TabChannelsPagesCount]; +extern const MenuHandlerFunc menuTabMonitors[e_MonTabChannelsPagesCount]; extern uint8_t lastMonitorPage; extern const MenuHandlerFunc menuTabScreensSetup[1+MAX_CUSTOM_SCREENS] PROGMEM; diff --git a/radio/src/gui/horus/themes/darkblue.cpp b/radio/src/gui/horus/themes/darkblue.cpp index 9baf62ce0..eb19da425 100644 --- a/radio/src/gui/horus/themes/darkblue.cpp +++ b/radio/src/gui/horus/themes/darkblue.cpp @@ -111,8 +111,7 @@ class DarkblueTheme: public Theme loadMenuIcon(ICON_MONITOR_OUTPUTS2, "mask_monitor_outputs2.png"); loadMenuIcon(ICON_MONITOR_MIXERS1, "mask_monitor_mixes1.png"); loadMenuIcon(ICON_MONITOR_MIXERS2, "mask_monitor_mixes2.png"); -/* loadMenuIcon(ICON_MONITOR_LOGIC_SWITCHES1, "mask_monitor_outputs1.png"); - loadMenuIcon(ICON_MONITOR_LOGIC_SWITCHES2, "mask_monitor_outputs1.png");*/ + loadMenuIcon(ICON_MONITOR_LOGICAL_SWITCHES, "/mask_monitor_logsw.png"); } virtual void load() const diff --git a/radio/src/gui/horus/themes/default.cpp b/radio/src/gui/horus/themes/default.cpp index bc91d4fee..9414078a3 100644 --- a/radio/src/gui/horus/themes/default.cpp +++ b/radio/src/gui/horus/themes/default.cpp @@ -127,8 +127,7 @@ class DefaultTheme: public Theme loadMenuIcon(ICON_MONITOR_OUTPUTS2, "mask_monitor_outputs2.png"); loadMenuIcon(ICON_MONITOR_MIXERS1, "mask_monitor_mixes1.png"); loadMenuIcon(ICON_MONITOR_MIXERS2, "mask_monitor_mixes2.png"); -/* loadMenuIcon(ICON_MONITOR_LOGIC_SWITCHES1, "mask_monitor_outputs1.png"); - loadMenuIcon(ICON_MONITOR_LOGIC_SWITCHES2, "mask_monitor_outputs1.png");*/ + loadMenuIcon(ICON_MONITOR_LOGICAL_SWITCHES, "/mask_monitor_logsw.png"); BitmapBuffer * background = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_bg.png")); BitmapBuffer * shadow = BitmapBuffer::loadMask(getThemePath("mask_currentmenu_shadow.png")); diff --git a/radio/src/gui/horus/view_channels.cpp b/radio/src/gui/horus/view_channels.cpp index 135b13e57..710bed6a2 100644 --- a/radio/src/gui/horus/view_channels.cpp +++ b/radio/src/gui/horus/view_channels.cpp @@ -36,68 +36,66 @@ const BitmapBuffer * outR_bmp = NULL; bool menuOutputs1(evt_t); bool menuOutputs2(evt_t); +bool menuMixers1(evt_t); +bool menuMixers2(evt_t); -extern bool menuLogicSwitches1(evt_t); -extern bool menuLogicSwitches2(evt_t); -extern bool menuMixers1(evt_t); -extern bool menuMixers2(evt_t); +extern bool menuLogicalSwitches(evt_t); const MenuHandlerFunc menuTabMonitors[] PROGMEM = { menuOutputs1, menuOutputs2, menuMixers1, menuMixers2, -/* menuLogicSwitches1, - menuLogicSwitches2*/ + menuLogicalSwitches }; uint8_t lastMonitorPage = 0; -uint16_t posOnBar(int16_t value_to100){ - return divRoundClosest((value_to100 + (g_model.extendedLimits ? 150 : 100)) * COLUMN_SIZE, (g_model.extendedLimits ? 150 : 100)*2); +uint16_t posOnBar(int16_t value_to100) +{ + return divRoundClosest((value_to100 + (g_model.extendedLimits ? 150 : 100)) * COLUMN_SIZE, (g_model.extendedLimits ? 150 : 100) * 2); } -void drawSingleMixerBar(uint16_t x, uint16_t y, uint8_t Chan) +void drawSingleMixerBar(coord_t x, coord_t y, uint8_t chan) { - char chanString[] = "CH 32"; + char chanString[] = "Ch 32"; + int16_t chanVal = calcRESXto100(ex_chans[chan]); - int16_t chanVal = calcRESXto100(ex_chans[Chan]); - strAppend(chanString, "Ch "); - strAppendSigned(&chanString[3], Chan + 1, 2); + strAppendSigned(&chanString[3], chan + 1, 2); lcdDrawText(x + X_OFFSET, y + 1, chanString, TINSIZE | TEXT_COLOR | LEFT); - - lcdDrawSizedText(x + X_OFFSET + 50, y + 1, g_model.limitData[Chan].name, sizeof(g_model.limitData[Chan].name), TINSIZE | TEXT_COLOR | LEFT | ZCHAR); - lcdColorTable[CUSTOM_COLOR_INDEX]= RGB(222, 222, 222); + lcdDrawSizedText(x + X_OFFSET + 50, y + 1, g_model.limitData[chan].name, sizeof(g_model.limitData[chan].name), TINSIZE | TEXT_COLOR | LEFT | ZCHAR); + + lcdColorTable[CUSTOM_COLOR_INDEX] = RGB(222, 222, 222); lcdDrawSolidFilledRect(x + X_OFFSET, y + 11, COLUMN_SIZE, BAR_HEIGHT, CUSTOM_COLOR); - lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(chanVal), y + 11, BAR_HEIGHT , HEADER_BGCOLOR); + lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(chanVal), y + 11, BAR_HEIGHT, HEADER_BGCOLOR); strAppendSigned(chanString, chanVal); lcdDrawText(x + X_OFFSET + COLUMN_SIZE - 2, y + 1, chanString, TINSIZE | TEXT_COLOR | RIGHT); - - lcdColorTable[CUSTOM_COLOR_INDEX]= RGB(25, 150, 50); - if(chanVal > 0){ - lcdDrawSolidFilledRect(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, divRoundClosest(chanVal * COLUMN_SIZE, 200) , BAR_HEIGHT, CUSTOM_COLOR); + + lcdColorTable[CUSTOM_COLOR_INDEX] = RGB(25, 150, 50); + if (chanVal > 0) { + lcdDrawSolidFilledRect(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, divRoundClosest(chanVal * COLUMN_SIZE, 200), BAR_HEIGHT, CUSTOM_COLOR); } else if (chanVal < 0) { uint16_t endpoint = x + X_OFFSET + COLUMN_SIZE / 2; uint16_t size = divRoundClosest(-chanVal * COLUMN_SIZE, 200); - lcdDrawSolidFilledRect(endpoint - size, y + 11, size, BAR_HEIGHT, CUSTOM_COLOR); + lcdDrawSolidFilledRect(endpoint - size, y + 11, size, BAR_HEIGHT, CUSTOM_COLOR); } - lcd->drawSolidVerticalLine(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, BAR_HEIGHT , TEXT_COLOR); + lcd->drawSolidVerticalLine(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, BAR_HEIGHT, TEXT_COLOR); } -void drawSingleOutputBar(uint16_t x, uint16_t y, uint8_t channel) +void drawSingleOutputBar(coord_t x, coord_t y, uint8_t channel) { char chanString[] = "Ch 32"; uint16_t limits = (g_model.extendedLimits ? 300 : 200); int16_t chanVal = calcRESXto100(channelOutputs[channel]); LimitData * ld = limitAddress(channel); - + if (!locked_bmp) locked_bmp = BitmapBuffer::load(getThemePath("mask_monitor_lockch.png")); if (!inver_bmp) inver_bmp = BitmapBuffer::load(getThemePath("mask_monitor_inver.png")); if (!outL_bmp) outL_bmp = BitmapBuffer::load(getThemePath("mask_monitor_outL.png")); @@ -105,22 +103,22 @@ void drawSingleOutputBar(uint16_t x, uint16_t y, uint8_t channel) strAppendSigned(&chanString[3], channel + 1, 2); lcdDrawText(x + X_OFFSET, y + 1, chanString, TINSIZE | TEXT_COLOR | LEFT); - + lcdDrawSizedText(x + X_OFFSET + 50, y + 1, g_model.limitData[channel].name, sizeof(g_model.limitData[channel].name), TINSIZE | TEXT_COLOR | LEFT | ZCHAR); - lcdColorTable[CUSTOM_COLOR_INDEX]= RGB(222, 222, 222); + lcdColorTable[CUSTOM_COLOR_INDEX] = RGB(222, 222, 222); lcdDrawSolidFilledRect(x + X_OFFSET, y + 11, COLUMN_SIZE, BAR_HEIGHT, CUSTOM_COLOR); - - lcdDrawText(x + X_OFFSET + posOnBar(-100 + ld->min/10)+2, y + 10, "]",TINSIZE| TEXT_COLOR | RIGHT); - lcdDrawText(x + X_OFFSET + posOnBar(100 + ld->max/10), y + 10, "[",TINSIZE| TEXT_COLOR); - lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(calcRESXto100(ld->offset)), y + 11, BAR_HEIGHT , MAINVIEW_GRAPHICS_COLOR); - lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(chanVal), y + 11, BAR_HEIGHT , HEADER_BGCOLOR); + lcdDrawText(x + X_OFFSET + posOnBar(-100 + ld->min / 10) + 2, y + 10, "]", TINSIZE | TEXT_COLOR | RIGHT); + lcdDrawText(x + X_OFFSET + posOnBar(100 + ld->max / 10), y + 10, "[", TINSIZE | TEXT_COLOR); + + lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(calcRESXto100(ld->offset)), y + 11, BAR_HEIGHT, MAINVIEW_GRAPHICS_COLOR); + lcd->drawSolidVerticalLine(x + X_OFFSET + posOnBar(chanVal), y + 11, BAR_HEIGHT, HEADER_BGCOLOR); strAppendSigned(chanString, chanVal); if (chanVal < -limits / 2) { lcd->drawBitmap(x + X_OFFSET + COLUMN_SIZE / 2 - 55, y + 8, outL_bmp); - chanVal = - limits / 2; + chanVal = -limits / 2; lcdDrawText(x + X_OFFSET + COLUMN_SIZE - 2, y + 1, chanString, TINSIZE | TEXT_COLOR | RIGHT | INVERS); } else if (chanVal > limits / 2) { @@ -131,31 +129,31 @@ void drawSingleOutputBar(uint16_t x, uint16_t y, uint8_t channel) else { lcdDrawText(x + X_OFFSET + COLUMN_SIZE - 2, y + 1, chanString, TINSIZE | TEXT_COLOR | RIGHT); } - - if(posOnBar(chanVal) > posOnBar(calcRESXto100(ld->offset))){ - lcdDrawSolidFilledRect(x + X_OFFSET + posOnBar(calcRESXto100(ld->offset)), y + 11, posOnBar(chanVal) - posOnBar(calcRESXto100(ld->offset)), BAR_HEIGHT, MAINVIEW_GRAPHICS_COLOR); + + if (posOnBar(chanVal) > posOnBar(calcRESXto100(ld->offset))) { + lcdDrawSolidFilledRect(x + X_OFFSET + posOnBar(calcRESXto100(ld->offset)), y + 11, posOnBar(chanVal) - posOnBar(calcRESXto100(ld->offset)), BAR_HEIGHT, MAINVIEW_GRAPHICS_COLOR); } else if (posOnBar(chanVal) < posOnBar(calcRESXto100(ld->offset))) { uint16_t endpoint = x + X_OFFSET + posOnBar(calcRESXto100(ld->offset)); uint16_t size = posOnBar(calcRESXto100(ld->offset)) - posOnBar(chanVal); - lcdDrawSolidFilledRect(endpoint - size, y + 11, size, BAR_HEIGHT, MAINVIEW_GRAPHICS_COLOR); + lcdDrawSolidFilledRect(endpoint - size, y + 11, size, BAR_HEIGHT, MAINVIEW_GRAPHICS_COLOR); } - + if (safetyCh[channel] != OVERRIDE_CHANNEL_UNDEFINED) lcd->drawBitmap(x + 3, y + 5, locked_bmp); if (ld->revert) lcd->drawBitmap(x + 16, y + 5, inver_bmp); - lcd->drawSolidVerticalLine(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, BAR_HEIGHT , TEXT_COLOR); + lcd->drawSolidVerticalLine(x + X_OFFSET + COLUMN_SIZE / 2, y + 11, BAR_HEIGHT, TEXT_COLOR); } bool menuOutputsMonitor(evt_t event, uint8_t page) { - uint8_t channel = 16*page; - uint16_t x=1, y=Y_OFFSET; - for (uint8_t i=0; i<8; i++, channel++, y+=ROW_HEIGHT) { + uint8_t channel = 16 * page; + uint16_t x = 1, y = Y_OFFSET; + for (uint8_t i = 0; i < 8; i++, channel++, y += ROW_HEIGHT) { drawSingleOutputBar(x, y, channel); } - x = 1 + LCD_W/2; + x = 1 + LCD_W / 2; y = Y_OFFSET; - for(uint8_t i=0; i<8; i++, channel++, y+=ROW_HEIGHT) { + for (uint8_t i = 0; i < 8; i++, channel++, y += ROW_HEIGHT) { drawSingleOutputBar(x, y, channel); } return true; @@ -163,28 +161,28 @@ bool menuOutputsMonitor(evt_t event, uint8_t page) bool menuOutputs1(evt_t event) { - MENU("Output monitor 1-16", MONITOR_ICONS, menuTabMonitors, e_Outputs1, 0, { 0 }); - lastMonitorPage = e_Outputs1; + MENU(STR_MONITOR_OUTPUTS1, MONITOR_ICONS, menuTabMonitors, e_MonOutputs1, 0, { 0 }); + lastMonitorPage = e_MonOutputs1; return menuOutputsMonitor(event, 0); } bool menuOutputs2(evt_t event) { - MENU("Output monitor 17-32", MONITOR_ICONS, menuTabMonitors, e_Outputs2, 0, { 0 }); - lastMonitorPage = e_Outputs2; + MENU(STR_MONITOR_OUTPUTS2, MONITOR_ICONS, menuTabMonitors, e_MonOutputs2, 0, { 0 }); + lastMonitorPage = e_MonOutputs2; return menuOutputsMonitor(event, 1); } bool menuMixersMonitor(evt_t event, uint8_t page) { - uint8_t channel = 16*page; - uint16_t x=1, y=Y_OFFSET; - for (uint8_t i=0; i<8; i++, channel++, y+=ROW_HEIGHT) { + uint8_t channel = 16 * page; + uint16_t x = 1, y = Y_OFFSET; + for (uint8_t i = 0; i < 8; i++, channel++, y += ROW_HEIGHT) { drawSingleMixerBar(x, y, channel); } - x = 1 + LCD_W/2; + x = 1 + LCD_W / 2; y = Y_OFFSET; - for(uint8_t i=0; i<8; i++, channel++, y+=ROW_HEIGHT) { + for (uint8_t i = 0; i < 8; i++, channel++, y += ROW_HEIGHT) { drawSingleMixerBar(x, y, channel); } return true; @@ -192,14 +190,14 @@ bool menuMixersMonitor(evt_t event, uint8_t page) bool menuMixers1(evt_t event) { - MENU("Mixer monitor 1-16", MONITOR_ICONS, menuTabMonitors, e_Mixers1, 0, { 0 }); - lastMonitorPage = e_Mixers1; + MENU(STR_MONITOR_MIXERS1, MONITOR_ICONS, menuTabMonitors, e_MonMixers1, 0, { 0 }); + lastMonitorPage = e_MonMixers1; return menuMixersMonitor(event, 0); } bool menuMixers2(evt_t event) { - MENU("Mixer monitor 1-16", MONITOR_ICONS, menuTabMonitors, e_Mixers2, 0, { 0 }); - lastMonitorPage = e_Mixers2; + MENU(STR_MONITOR_MIXERS2, MONITOR_ICONS, menuTabMonitors, e_MonMixers2, 0, { 0 }); + lastMonitorPage = e_MonMixers2; return menuMixersMonitor(event, 1); } diff --git a/radio/src/gui/horus/view_logic_switches.cpp b/radio/src/gui/horus/view_logic_switches.cpp deleted file mode 100644 index 0ae00864f..000000000 --- a/radio/src/gui/horus/view_logic_switches.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -/* -extern bool menuChannelsMonitor(evt_t, uint8_t); - -uint8_t drawLS_Table(uint16_t x, uint16_t y){ - -} - -bool menuLogicSwitches1(evt_t event) -{ - MENU("Logic Switches monitor 1-32", MONITOR_ICONS, menuTabMonitors, e_LogicSwitches1, 0, { 0 }); - lastMonitorPage = e_LogicSwitches1; - return menuChannelsMonitor(event, 4); -} - -bool menuLogicSwitches2(evt_t event) -{ - MENU("Logic Switches 33-64",MONITOR_ICONS, menuTabMonitors, e_LogicSwitches2, 0, { 0 }); - lastMonitorPage = e_LogicSwitches2; - return menuChannelsMonitor(event, 5); -}*/ diff --git a/radio/src/gui/horus/view_logical_switches.cpp b/radio/src/gui/horus/view_logical_switches.cpp new file mode 100644 index 000000000..e4ef8d6f2 --- /dev/null +++ b/radio/src/gui/horus/view_logical_switches.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +#define X_OFF 15 +#define Y_OFF 55 +#define HLINE_Y_OFF 215 +#define LS_COL_WIDTH 50 +#define LS_LINE_HEIGHT 17 +#define X_FUNC 50 +#define Y_FUNC 225 + +#define CSW_1ST_COLUMN 50 +#define CSW_2ND_COLUMN 120 +#define CSW_3RD_COLUMN 200 +#define CSW_4TH_COLUMN 280 +#define CSW_5TH_COLUMN 340 +#define CSW_6TH_COLUMN 390 +#define NUM_LOGICAL_SWITCH 64 + + +int lsScrollIdx = 0; +bool menuLogicalSwitchesMonitor(evt_t, uint8_t); +extern void putsEdgeDelayParam(coord_t, coord_t, LogicalSwitchData *, uint8_t, uint8_t); + +bool scrollLogicalSwitchesMonitor(evt_t event) +{ + switch (event) { + case EVT_ROTARY_LEFT: + if (lsScrollIdx > 0) { + lsScrollIdx--; + } + else { + lsScrollIdx = NUM_LOGICAL_SWITCH - 1; + } + killEvents(event); + break; + + case EVT_ROTARY_RIGHT: + if (lsScrollIdx < NUM_LOGICAL_SWITCH - 1) { + lsScrollIdx++; + } + else { + lsScrollIdx = 0; + } + killEvents(event); + break; + + case EVT_KEY_FIRST(KEY_EXIT): + popMenu(); + } + return true; +} + +void displayLogicalSwitchedDetails(coord_t x, coord_t y, uint8_t idx) +{ + LogicalSwitchData * cs = lswAddress(idx); + lcdDrawTextAtIndex(x, y, STR_VCSWFUNC, cs->func, 0); + // CSW params + unsigned int cstate = lswFamily(cs->func); + + if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { + putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); + putsSwitches(CSW_3RD_COLUMN, y, cs->v2, 0); + } + else if (cstate == LS_FAMILY_EDGE) { + putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); + putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, 0, 0); + } + else if (cstate == LS_FAMILY_COMP) { + putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); + putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, 0); + } + else if (cstate == LS_FAMILY_TIMER) { + lcdDrawNumber(CSW_2ND_COLUMN, y, lswTimerValue(cs->v1), LEFT | PREC1); + lcdDrawNumber(CSW_3RD_COLUMN, y, lswTimerValue(cs->v2), LEFT | PREC1); + } + else { + putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); + putsChannelValue(CSW_3RD_COLUMN, y, cs->v1, cs->v1 <= MIXSRC_LAST_CH ? calc100toRESX(cs->v2) : cs->v2, LEFT); + } + + // CSW AND switch + putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, 0); + + // CSW duration + if (cs->duration > 0) + lcdDrawNumber(CSW_5TH_COLUMN, y, cs->duration, PREC1 | LEFT); + else + lcdDrawTextAtIndex(CSW_5TH_COLUMN, y, STR_MMMINV, 0, 0); + + // CSW delay + if (cstate == LS_FAMILY_EDGE) { + lcdDrawText(CSW_6TH_COLUMN, y, STR_NA); + } + else if (cs->delay > 0) { + lcdDrawNumber(CSW_6TH_COLUMN, y, cs->delay, PREC1 | LEFT); + } + else { + lcdDrawTextAtIndex(CSW_6TH_COLUMN, y, STR_MMMINV, 0, 0); + } +} + +bool menuLogicalSwitchesMonitor(evt_t event, uint8_t page) +{ + char lsString[] = "L64"; + uint8_t col, lsIdx, line; + LcdFlags attr; + + lcdColorTable[CUSTOM_COLOR_INDEX] = RGB(160, 160, 160); + scrollLogicalSwitchesMonitor(event); + for (line = 1, lsIdx = 1; line < 9; line++) { + for (col = 1; col < 9; col++, lsIdx++) { + strAppendSigned(&lsString[1], lsIdx, 2); + LogicalSwitchData * cs = lswAddress(lsIdx - 1); + attr = (CENTERED); + if (cs->func == LS_FUNC_NONE) attr += (CUSTOM_COLOR); + else if (getSwitch(SWSRC_SW1 + lsIdx - 1)) attr += (BOLD); + if (lsIdx == (lsScrollIdx + 1)) attr += (INVERS); + lcdDrawText(X_OFF + col * LS_COL_WIDTH, Y_OFF + line * LS_LINE_HEIGHT, lsString, attr); + } + } + lcdDrawHorizontalLine(0, HLINE_Y_OFF, LCD_W, SOLID); + displayLogicalSwitchedDetails(X_FUNC, Y_FUNC, lsScrollIdx); + + return true; +} + +bool menuLogicalSwitches(evt_t event) +{ + MENU(STR_MONITOR_SWITCHES, MONITOR_ICONS, menuTabMonitors, e_MonLogicalSwitches, 0, { 0 }); + lastMonitorPage = e_MonLogicalSwitches; + return menuLogicalSwitchesMonitor(event, 4); +} + + diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 5c9f115fb..85b3be2fc 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -365,6 +365,11 @@ const pm_char STR_MENUTEMPLATES[] PROGMEM = TR_MENUTEMPLATES; const pm_char STR_MENUSTAT[] PROGMEM = TR_MENUSTAT; const pm_char STR_MENUDEBUG[] PROGMEM = TR_MENUDEBUG; +const pm_char STR_MONITOR_OUTPUTS1[] PROGMEM = TR_MONITOR_OUTPUTS1; +const pm_char STR_MONITOR_OUTPUTS2[] PROGMEM = TR_MONITOR_OUTPUTS2; +const pm_char STR_MONITOR_SWITCHES[] PROGMEM = TR_MONITOR_SWITCHES; +const pm_char STR_MONITOR_MIXERS1[] PROGMEM = TR_MONITOR_MIXERS1; +const pm_char STR_MONITOR_MIXERS2[] PROGMEM = TR_MONITOR_MIXERS2; const pm_char STR_MENUGLOBALVARS[] PROGMEM = TR_MENUGLOBALVARS; #if defined(DSM2) || defined(PXX) diff --git a/radio/src/translations.h b/radio/src/translations.h index 07c7f7c14..cb3ac14f9 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -564,6 +564,11 @@ extern const pm_char STR_MENUTELEMETRY[]; extern const pm_char STR_MENUTEMPLATES[]; extern const pm_char STR_MENUSTAT[]; extern const pm_char STR_MENUDEBUG[]; +extern const pm_char STR_MONITOR_OUTPUTS1[]; +extern const pm_char STR_MONITOR_OUTPUTS2[]; +extern const pm_char STR_MONITOR_SWITCHES[]; +extern const pm_char STR_MONITOR_MIXERS1[]; +extern const pm_char STR_MONITOR_MIXERS2[]; extern const pm_char STR_MENUGLOBALVARS[]; extern const pm_char STR_INVERT_THR[]; extern const pm_char STR_AND_SWITCH[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index ee1f720a4..5f91f707d 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -847,6 +847,11 @@ #define TR_MENUTEMPLATES "ŠABLONY" #define TR_MENUSTAT "STATISTIKA" #define TR_MENUDEBUG "DIAG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "RX číslo", INDENT "Číslo přijímače") #define TR_RECEIVER INDENT "Receiver" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 1b59ddc0b..680f02dac 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -851,6 +851,11 @@ #define TR_MENUTEMPLATES "VORLAGEN" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "Empf Nr.", INDENT "Modell-Match-Nr.") #define TR_RECEIVER INDENT "Receiver" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 00a555727..29344d3c4 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -865,6 +865,11 @@ #define TR_MENUTEMPLATES "TEMPLATES" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver No.") #define TR_RECEIVER INDENT "Receiver" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7b159d3fd..28f41f03e 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -815,6 +815,11 @@ #define TR_MENUTEMPLATES "PLANTILLAS" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #define TR_RECEIVER_NUM TR("RxNum", INDENT"Receptor No.") #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index d6b752082..9cb6a2112 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -815,6 +815,11 @@ #define TR_MENUTEMPLATES "TEMPLATES" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #define TR_RECEIVER_NUM TR("RxNum", INDENT"Receiver No.") #define TR_RECEIVER INDENT "Receiver" #define TR_MULTI_RFTUNE INDENT "RF Freq. fine tune" diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index 75d3acadd..e25b7f38c 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -842,6 +842,11 @@ #define TR_MENUTEMPLATES "GABARITS" #define TR_MENUSTAT TR("STATS", "STATISTIQUES") #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "NumRx", INDENT "No. récepteur") #define TR_RECEIVER INDENT "Récepteur" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 5d7ab3e20..76247bb1f 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -846,6 +846,11 @@ #define TR_MENUTEMPLATES "ESEMPI GUIDA" #define TR_MENUSTAT "STATO" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Ricevente No.") #define TR_RECEIVER INDENT "Receiver" diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index aadb28954..c0fe4d63b 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -860,6 +860,11 @@ #define TR_MENUTEMPLATES "SJABLONEN" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Receiver No.") #define TR_RECEIVER INDENT "Receiver" @@ -971,7 +976,7 @@ #define TR_MONTHS { "Jan", "Fev", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } #define TR_ROTARY_ENCODER "Draaischakelaar" #define TR_CHANNELS_MONITOR "Kanaal-Monitor==>" -#define TR_MIXERS_MONITOR "==>Mixer Monitor" +#define TR_MIXERS_MONITOR "==>MIXERS MONitor" #define TR_PATH_TOO_LONG "Pad te Lang" #define TR_VIEW_TEXT "Lees Tekst" #define TR_FLASH_BOOTLOADER "Flash BootLoader" diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 3e37d679f..40ad3d2d9 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -848,6 +848,11 @@ #define TR_MENUTEMPLATES "SZABLONY" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR( INDENT "Nr RX",INDENT "Nr odbiornika") #define TR_RECEIVER INDENT "Receiver" diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 64cd03599..a6cb800b0 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -811,6 +811,11 @@ #define TR_MENUTEMPLATES "MODELOS" #define TR_MENUSTAT "REGISTROS" #define TR_MENUDEBUG "DEPURAR" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #define TR_RECEIVER_NUM "RxNum" #define TR_RECEIVER INDENT "Receiver" #define TR_SYNCMENU "Sync [MENU]" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 828eb92d4..fd365183c 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -859,6 +859,11 @@ #define TR_MENUTEMPLATES "MALLAR" #define TR_MENUSTAT "STATISTIK" #define TR_MENUDEBUG "DEBUG" +#define TR_MONITOR_OUTPUTS1 "OUTPUTS MONITOR 1/16" +#define TR_MONITOR_OUTPUTS2 "OUTPUTS MONITOR 17/32" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_MIXERS1 "MIXERS MONITOR 1/16" +#define TR_MONITOR_MIXERS2 "MIXERS MONITOR 17/32" #if defined(CPUARM) #define TR_RECEIVER_NUM TR(INDENT "RxNum", INDENT "Mottagare Nr.") #define TR_RECEIVER INDENT "Receiver"