diff --git a/CREDITS.txt b/CREDITS.txt index 52e7ad5f4..f4c1799f1 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -1704,3 +1704,5 @@ Roland Nittby Frank Barbas Scott McCoy Fabrice Debonnet +James Laver +Kevin Bowens diff --git a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua index abe3460d5..215d589ac 100755 --- a/radio/sdcard/horus/WIDGETS/BattCheck/main.lua +++ b/radio/sdcard/horus/WIDGETS/BattCheck/main.lua @@ -36,6 +36,8 @@ local function create(zone, options) counter = 0, shadowed = 0, + telemResetCount = 0, + telemResetLowestMinRSSI = 101, no_telem_blink = 0, isDataAvailable = 0, cellDataLive = {0,0,0,0,0,0}, @@ -76,14 +78,47 @@ local function update(wgt, options) end --- A quick and dirty check for empty table -local function isEmpty(self) - for _, _ in pairs(self) do - return false - end - return true + +-- clear old telemetry data upon reset event +local function onTelemetryResetEvent(wgt) + wgt.telemResetCount = wgt.telemResetCount + 1 + + wgt.cellDataLive = {0,0,0,0,0,0} + wgt.cellDataHistoryLowest = {5,5,5,5,5,5} + wgt.cellDataHistoryCellLowest = 5 end + +-- workaround to detect telemetry-reset event, until a proper implementation on the lua interface will be created +-- this workaround assume that: +-- RSSI- is always going down +-- RSSI- is reset on the C++ side when a telemetry-reset is pressed by user +-- widget is calling this func on each refresh/background +-- on event detection, the function onTelemetryResetEvent() will be trigger +-- +local function detectResetEvent(wgt) + + local currMinRSSI = getValue('RSSI-') + if (currMinRSSI == nil) then return + end + if (currMinRSSI == wgt.telemResetLowestMinRSSI) then return end + + if (currMinRSSI < wgt.telemResetLowestMinRSSI) then + -- rssi just got lower, record it + wgt.telemResetLowestMinRSSI = currMinRSSI + return + end + + + -- reset telemetry detected + wgt.telemResetLowestMinRSSI = 101 + + -- notify event + onTelemetryResetEvent(wgt) + +end + + --- This function return the percentage remaining in a single Lipo cel local function getCellPercent(cellValue) if cellValue == nil then @@ -293,13 +328,14 @@ local function refreshZoneMedium(wgt) for i = 1, wgt.cellCount, 1 do local cellY = wgt.zone.y + (i-1)* (cellH -1) - -- fill current value + -- fill current cell lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataLive[i], wgt.cellMax, wgt.cellMax - 0.2)) --lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, 58, cellH, CUSTOM_COLOR) local percentCurrent = getCellPercent(wgt.cellDataLive[i]) local percentMin = getCellPercent(wgt.cellDataHistoryLowest[i]) lcd.drawFilledRectangle(wgt.zone.x + cellX , cellY, cellW * percentCurrent / 100, cellH, CUSTOM_COLOR) + -- fill min lcd.setColor(CUSTOM_COLOR, getRangeColor(wgt.cellDataHistoryLowest[i], wgt.cellMax, wgt.cellMax - 0.2)) lcd.drawFilledRectangle(wgt.zone.x + cellX + ((percentCurrent - percentMin) / 100) , cellY, cellW - (cellW * (percentCurrent - percentMin) / 100), cellH, CUSTOM_COLOR) @@ -413,6 +449,8 @@ end local function background(wgt) if (wgt == nil) then return end + detectResetEvent(wgt) + calculateBatteryData(wgt) end @@ -430,6 +468,7 @@ local function refresh(wgt) wgt.shadowed = 0 end + detectResetEvent(wgt) calculateBatteryData(wgt) diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 25b34982c..0ff525398 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -169,6 +169,7 @@ enum MainViews { VIEW_OUTPUTS_BARS, VIEW_INPUTS, VIEW_TIMER2, + VIEW_CHAN_MONITOR, VIEW_COUNT }; #endif diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 2f5add70e..85abade3a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -813,7 +813,7 @@ PACK(struct RadioData { NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); NOBACKUP(uint8_t USBMode:2); NOBACKUP(uint8_t jackMode:2); - NOBACKUP(uint8_t spare3:1 SKIP); + NOBACKUP(uint8_t sportUpdatePower:1 SKIP); NOBACKUP(char ttsLanguage[2]); NOBACKUP(int8_t beepVolume:4); NOBACKUP(int8_t wavVolume:4); @@ -973,4 +973,4 @@ static inline void check_struct() #undef CHKSIZE } -#endif /* BACKUP */ +#endif /* BACKUP */ \ No newline at end of file diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index c42249d39..bde61cd9f 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -233,6 +233,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) @@ -292,6 +295,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); @@ -301,7 +305,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 9539606fd..d069490a1 100644 --- a/radio/src/gui/128x64/lcd.h +++ b/radio/src/gui/128x64/lcd.h @@ -109,8 +109,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/menus.h b/radio/src/gui/128x64/menus.h index daa3f1885..a1e980874 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -50,7 +50,7 @@ void menuSpecialFunctions(event_t event, CustomFunctionData * functions, CustomF enum MenuRadioIndexes { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) MENU_RADIO_TOOLS, #endif CASE_SDCARD(MENU_RADIO_SD_MANAGER) @@ -76,7 +76,7 @@ void menuRadioPowerMeter(event_t event); void menuRadioCalibration(event_t event); static const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) +#if defined(RADIO_TOOLS) menuRadioTools, #endif CASE_SDCARD(menuRadioSdManager) diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index 49d13ef3f..b225283d4 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 f880c1618..7f4b859e8 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/model_telemetry_sensor.cpp b/radio/src/gui/128x64/model_telemetry_sensor.cpp index 264fe6f4c..e13e091d3 100644 --- a/radio/src/gui/128x64/model_telemetry_sensor.cpp +++ b/radio/src/gui/128x64/model_telemetry_sensor.cpp @@ -104,7 +104,7 @@ void menuModelSensor(event_t event) if (sensor->type == TELEM_TYPE_CUSTOM) { lcdDrawTextAlignedLeft(y, STR_ID); lcdDrawHexNumber(SENSOR_2ND_COLUMN, y, sensor->id, LEFT|(menuHorizontalPosition==0 ? attr : 0)); - lcdDrawHexChar(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0)); + lcdDrawNumber(SENSOR_3RD_COLUMN, y, (sensor->instance & 0x1F) + 1, LEFT|(menuHorizontalPosition==1 ? attr : 0)); if (attr && s_editMode > 0) { switch (menuHorizontalPosition) { case 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 3a8824504..a6f77528b 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: @@ -369,7 +364,7 @@ void menuMainView(event_t event) break; case EVT_KEY_GENERAL_MENU: - pushMenu(menuRadioTools); + pushMenu(menuTabGeneral[0]); killEvents(event); break; #endif @@ -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 - drawModelName(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; + uint8_t switches = min(NUM_SWITCHES, 6); + for (int i = 0; i < switches; ++i) { + if (SWITCH_EXISTS(i)) { + uint8_t x = 2 * FW - 2, y = 4 * FH + i * FH + 1; + if (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 270d25959..73bd600f4 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -110,8 +110,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/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index 6e7647a72..fe5765cb6 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -21,7 +21,7 @@ #include "opentx.h" const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(LUA) || defined(PXX2) +#if defined(RADIO_TOOLS) menuRadioTools, #endif menuRadioSdManager, 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 622be6e4e..3dcb9c27f 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/212x64/view_main.cpp b/radio/src/gui/212x64/view_main.cpp index 5cd64e749..bf8d6abb7 100644 --- a/radio/src/gui/212x64/view_main.cpp +++ b/radio/src/gui/212x64/view_main.cpp @@ -455,7 +455,7 @@ void menuMainView(event_t event) break; case EVT_KEY_LONG(KEY_MENU): - pushMenu(menuRadioTools); + pushMenu(menuTabGeneral[0]); killEvents(event); break; #endif diff --git a/radio/src/gui/colorlcd/view_text.cpp b/radio/src/gui/colorlcd/view_text.cpp index a7969d21f..24a1779db 100644 --- a/radio/src/gui/colorlcd/view_text.cpp +++ b/radio/src/gui/colorlcd/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/gui/common/stdlcd/radio_hardware.cpp b/radio/src/gui/common/stdlcd/radio_hardware.cpp index ccf69f105..5dd184322 100644 --- a/radio/src/gui/common/stdlcd/radio_hardware.cpp +++ b/radio/src/gui/common/stdlcd/radio_hardware.cpp @@ -184,6 +184,9 @@ enum { ITEM_RADIO_HARDWARE_JITTER_FILTER, ITEM_RADIO_HARDWARE_RAS, +#if defined(SPORT_UPDATE_PWR_GPIO) + ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER, +#endif ITEM_RADIO_HARDWARE_DEBUG, #if defined(EEPROM_RLC) ITEM_RADIO_BACKUP_EEPROM, @@ -295,6 +298,12 @@ void onHardwareAntennaSwitchConfirm(const char * result) #define HW_SETTINGS_COLUMN2 (HW_SETTINGS_COLUMN1 + 5*FW) #endif +#if defined(SPORT_UPDATE_PWR_GPIO) + #define SPORT_POWER_ROWS 0, +#else + #define SPORT_POWER_ROWS +#endif + #if defined(EEPROM_RLC) void onFactoryResetConfirm(const char * result) { @@ -334,7 +343,7 @@ void menuRadioHardware(event_t event) 0 /* ADC filter */, READONLY_ROW /* RAS */, - + SPORT_POWER_ROWS 1 /* debugs */, 0, @@ -631,6 +640,14 @@ void menuRadioHardware(event_t event) else lcdDrawText(lcdNextPos, y, "---"); break; +#if defined(SPORT_UPDATE_PWR_GPIO) + case ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER: + g_eeGeneral.sportUpdatePower = editChoice(HW_SETTINGS_COLUMN2, y, STR_SPORT_UPDATE_POWER_MODE, STR_SPORT_UPDATE_POWER_MODES, g_eeGeneral.sportUpdatePower, 0, 1, attr, event); + if (attr && checkIncDec_Ret) { + SPORT_UPDATE_POWER_INIT(); + } + break; +#endif case ITEM_RADIO_HARDWARE_DEBUG: lcdDrawTextAlignedLeft(y, STR_DEBUG); diff --git a/radio/src/io/frsky_firmware_update.cpp b/radio/src/io/frsky_firmware_update.cpp index abaff7eb3..23df6cb52 100644 --- a/radio/src/io/frsky_firmware_update.cpp +++ b/radio/src/io/frsky_firmware_update.cpp @@ -488,6 +488,7 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename, Pro uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); progressHandler(getBasename(filename), STR_DEVICE_RESET, 0, 0); @@ -532,6 +533,10 @@ const char * FrskyDeviceFirmwareUpdate::flashFirmware(const char * filename, Pro setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + state = SPORT_IDLE; resumePulses(); @@ -753,6 +758,7 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, Progr uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); if (wait) { @@ -792,6 +798,10 @@ const char * FrskyChipFirmwareUpdate::flashFirmware(const char * filename, Progr setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + resumePulses(); return result; diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index f3105e61e..b2eafab1c 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -536,6 +536,7 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) uint8_t extPwr = IS_EXTERNAL_MODULE_ON(); EXTERNAL_MODULE_OFF(); + uint8_t spuPwr = IS_SPORT_UPDATE_POWER_ON(); SPORT_UPDATE_POWER_OFF(); #if defined(COLORLCD) @@ -587,6 +588,10 @@ bool multiFlashFirmware(uint8_t moduleIdx, const char * filename) setupPulsesExternalModule(); } + if (spuPwr) { + SPORT_UPDATE_POWER_ON(); + } + resumePulses(); return result == nullptr; diff --git a/radio/src/lua/api_model.cpp b/radio/src/lua/api_model.cpp index 0fd75a5c3..3cc4ee98b 100644 --- a/radio/src/lua/api_model.cpp +++ b/radio/src/lua/api_model.cpp @@ -1265,7 +1265,7 @@ static int luaModelSetOutput(lua_State *L) } /*luadoc -@function model.getGlobalVariable(index [, flight_mode]) +@function model.getGlobalVariable(index, flight_mode) Return current global variable value diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index a09fb0e63..9e41bc5f2 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -2025,6 +2025,10 @@ void opentxInit() btInit(); #endif +#if defined(SPORT_UPDATE_PWR_GPIO) + SPORT_UPDATE_POWER_INIT(); +#endif + #if defined(COLORLCD) loadTheme(); #endif diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 56dfda875..2836ce2c2 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -225,6 +225,10 @@ #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #endif +#if defined(LUA) || defined(PXX2) || defined(MULTIMODULE) + #define RADIO_TOOLS +#endif + // RESX range is used for internal calculation; The menu says -100.0 to 100.0; internally it is -1024 to 1024 to allow some optimizations #define RESX_SHIFT 10 #define RESX 1024 diff --git a/radio/src/options.h b/radio/src/options.h index e7ddb0caf..2afb1596b 100644 --- a/radio/src/options.h +++ b/radio/src/options.h @@ -59,6 +59,9 @@ static const char * options[] = { #if defined(INTERNAL_MODULE_MULTI) "internalmulti", #endif +#if defined(INTERNAL_MODULE_PXX2) + "internalaccess", +#endif #if defined(MULTIMODULE) "multimodule", #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 3e8ad4752..61a429a70 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -74,6 +74,14 @@ void sportUpdatePowerOff() { GPIO_ResetBits(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN); } + +void sportUpdatePowerInit() +{ + if (g_eeGeneral.sportUpdatePower == 1) + sportUpdatePowerOn(); + else + sportUpdatePowerOff(); +} #endif void boardInit() diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 078144d0b..8b88b674e 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -592,11 +592,16 @@ void telemetryPortInvertedInit(uint32_t baudrate); #if HAS_SPORT_UPDATE_CONNECTOR() void sportUpdatePowerOn(); void sportUpdatePowerOff(); +void sportUpdatePowerInit(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() #define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff() +#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit() +#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET) #else #define SPORT_UPDATE_POWER_ON() #define SPORT_UPDATE_POWER_OFF() +#define SPORT_UPDATE_POWER_INIT() +#define IS_SPORT_UPDATE_POWER_ON() (false) #endif // Second serial port driver diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index 5cf4fe52b..96babf4be 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -326,7 +326,7 @@ uint8_t OpenTxSimulator::getSensorInstance(uint16_t id, uint8_t defaultValue) if (isTelemetryFieldAvailable(i)) { TelemetrySensor * sensor = &g_model.telemetrySensors[i]; if (sensor->id == id) { - return sensor->instance; + return sensor->frskyInstance.physID + 1; } } } diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 9b04ff266..0ec31e6ba 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -466,6 +466,10 @@ void sportUpdatePowerOff() { } +void sportUpdatePowerInit() +{ +} + void boardInit() { } diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index 193c99df5..cff6a53b9 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -74,6 +74,7 @@ set(GUI_SRC radio_diaganas.cpp view_telemetry.cpp view_about.cpp + view_channels.cpp ) if(GVARS) diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 3cd6742f3..521ab1d9b 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -62,6 +62,14 @@ void sportUpdatePowerOff() { GPIO_SPORT_UPDATE_PWR_GPIO_OFF(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN); } + +void sportUpdatePowerInit() +{ + if (g_eeGeneral.sportUpdatePower == 1) + sportUpdatePowerOn(); + else + sportUpdatePowerOff(); +} #endif void boardInit() diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 4189d1fcd..32078c5bf 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -719,12 +719,17 @@ void telemetryPortInvertedInit(uint32_t baudrate); void sportUpdateInit(); void sportUpdatePowerOn(); void sportUpdatePowerOff(); +void sportUpdatePowerInit(); #define SPORT_UPDATE_POWER_ON() sportUpdatePowerOn() #define SPORT_UPDATE_POWER_OFF() sportUpdatePowerOff() +#define SPORT_UPDATE_POWER_INIT() sportUpdatePowerInit() +#define IS_SPORT_UPDATE_POWER_ON() (GPIO_ReadInputDataBit(SPORT_UPDATE_PWR_GPIO, SPORT_UPDATE_PWR_GPIO_PIN) == Bit_SET) #else #define sportUpdateInit() #define SPORT_UPDATE_POWER_ON() #define SPORT_UPDATE_POWER_OFF() +#define SPORT_UPDATE_POWER_INIT() +#define IS_SPORT_UPDATE_POWER_ON() (false) #endif // Audio driver diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 83ae73124..5143c5a33 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -168,7 +168,13 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe if (primId == DATA_FRAME) { uint8_t originMask; if (origin == TELEMETRY_ENDPOINT_SPORT) { +#if defined(SIMU) && defined(INTERNAL_MODULE_PXX2) + // When running simu on ACCESS radio, we set the origin as internal module + origin = 0; + originMask = 0x01; +#else originMask = 0x04; +#endif } else { uint8_t moduleIndex = (origin >> 2); diff --git a/radio/src/telemetry/telemetry.h b/radio/src/telemetry/telemetry.h index c0b4ade7b..74dc66987 100644 --- a/radio/src/telemetry/telemetry.h +++ b/radio/src/telemetry/telemetry.h @@ -153,7 +153,7 @@ inline uint8_t modelTelemetryProtocol() return PROTOCOL_TELEMETRY_MULTIMODULE; } #if defined(INTERNAL_MODULE_MULTI) - if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) { + if (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE) { return PROTOCOL_TELEMETRY_MULTIMODULE; } #endif diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 04a715b3a..119ed442b 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -80,6 +80,7 @@ ISTR(SWTYPES); ISTR(POTTYPES); ISTR(SLIDERTYPES); ISTR(ANTENNA_MODES); +ISTR(SPORT_UPDATE_POWER_MODES); ISTR(CRSF_BAUDRATE); ISTR(PPM_POL); @@ -693,6 +694,7 @@ const char STR_RTC_CHECK[] = TR_RTC_CHECK; const char STR_EXIT[] = TR_EXIT; const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; +const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; #if defined(PCBHORUS) const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; diff --git a/radio/src/translations.h b/radio/src/translations.h index e01a2e2b0..7340b8a3b 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -987,6 +987,8 @@ extern const char STR_MENU_OTHER[]; extern const char STR_MENU_INVERT[]; extern const char STR_JITTER_FILTER[]; extern const char STR_RTC_CHECK[]; +extern const char STR_SPORT_UPDATE_POWER_MODE[]; +extern const char STR_SPORT_UPDATE_POWER_MODES[]; #if MENUS_LOCK == 1 extern const char STR_UNLOCKED[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 0039da53c..98cff9d9b 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -990,6 +990,9 @@ #define STR_FACTORYRESET "Tovární reset" #define TR_CONFIRMRESET TR("Smazat vše ?", "Smazat modely a nastavení?") #define TR_TOO_MANY_LUA_SCRIPTS "Příliš mnoho skriptů!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index 7fec7bb00..a67cd1b96 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -1003,6 +1003,9 @@ #define STR_FACTORYRESET TR("Werksreset", "Auf Werkseinstellungen") #define TR_CONFIRMRESET TR("Alles löschen? ","ALLE Modelle+Einst. löschen?") #define TR_TOO_MANY_LUA_SCRIPTS "Zu viele Skripte!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index 327c171ea..1fc4d74b2 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -1002,6 +1002,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?") #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 7580dee8a..592a4d182 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -1025,6 +1025,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 8285e3fa8..70b509573 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -1019,6 +1019,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index fada9b386..6d8391762 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -1027,6 +1027,9 @@ #endif #define TR_CONFIRMRESET TR("Effacer TOUT?","Effacer TOUS modèles/réglages?") #define TR_TOO_MANY_LUA_SCRIPTS "Trop de scripts lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index 58b80dc9e..510f0cbdd 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -1024,6 +1024,9 @@ #define STR_FACTORYRESET "Inizializza dati" #define TR_CONFIRMRESET "Resettare TUTTI i dati?" #define TR_TOO_MANY_LUA_SCRIPTS "Troppi Scripts Lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index 766aa9df0..130d0b3d4 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -1011,6 +1011,9 @@ #endif #define TR_CONFIRMRESET TR("Wis Alles?", "Wis ALLE modellen en instellingen?") #define TR_TOO_MANY_LUA_SCRIPTS "Te veel Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index 651c9d84e..cd4dd5c77 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -1020,6 +1020,9 @@ #define STR_FACTORYRESET "Ustaw.Fabrycz" #define TR_CONFIRMRESET "WYkasować wszytkie modele? " #define TR_TOO_MANY_LUA_SCRIPTS "Za dużo skryptów Lua!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 422ec03d1..4a644e9c6 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -1010,6 +1010,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "Too many Lua scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index 1fb2b511f..39d2b1970 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -1023,6 +1023,9 @@ #define STR_FACTORYRESET "Factory reset" #define TR_CONFIRMRESET "Erase ALL models and settings?" #define TR_TOO_MANY_LUA_SCRIPTS "För många Lua-scripts!" +#define TR_SPORT_UPDATE_POWER_MODE "SP Power" +#define LEN_SPORT_UPDATE_POWER_MODES "\004" +#define TR_SPORT_UPDATE_POWER_MODES "AUTO""ON\0 " // Horus and Taranis column headers