diff --git a/radio/src/bitmaps/128x64/asterisk.png b/radio/src/bitmaps/128x64/asterisk.png index 506ee247b79..24a88478a93 100644 Binary files a/radio/src/bitmaps/128x64/asterisk.png and b/radio/src/bitmaps/128x64/asterisk.png differ diff --git a/radio/src/bitmaps/128x64/sleep.png b/radio/src/bitmaps/128x64/sleep.png index 1b682d2e145..0e22ef3ea8a 100644 Binary files a/radio/src/bitmaps/128x64/sleep.png and b/radio/src/bitmaps/128x64/sleep.png differ diff --git a/radio/src/definitions.h b/radio/src/definitions.h index f01ebc8a487..79182a1fb01 100644 --- a/radio/src/definitions.h +++ b/radio/src/definitions.h @@ -86,6 +86,12 @@ #define PACK(__Declaration__) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) ) #endif +#if defined(SIMU) + #define PACK_NOT_SIMU(__Declaration__) __Declaration__ +#else + #define PACK_NOT_SIMU(__Declaration__) PACK(__Declaration__) +#endif + #if defined(SIMU) #define CONVERT_PTR_UINT(x) ((uint32_t)(uint64_t)(x)) #define CONVERT_UINT_PTR(x) ((uint32_t*)(uint64_t)(x)) diff --git a/radio/src/gui/128x64/menu_model.cpp b/radio/src/gui/128x64/menu_model.cpp index 7e9773f1c51..7dd3fadfd3e 100644 --- a/radio/src/gui/128x64/menu_model.cpp +++ b/radio/src/gui/128x64/menu_model.cpp @@ -21,6 +21,28 @@ #include "opentx.h" +const MenuHandler menuTabModel[MENU_MODEL_PAGES_COUNT] = { + { menuModelSelect, nullptr }, + { menuModelSetup, nullptr }, +#if defined(HELI) + { menuModelHeli, modelHeliEnabled }, +#endif +#if defined(FLIGHT_MODES) + { menuModelFlightModesAll, modelFMEnabled }, +#endif + { menuModelExposAll, nullptr }, + { menuModelMixAll, nullptr }, + { menuModelLimits, nullptr }, + { menuModelCurvesAll, modelCurvesEnabled }, + { menuModelLogicalSwitches, modelLSEnabled }, + { menuModelSpecialFunctions, modelSFEnabled }, +#if defined(LUA_MODEL_SCRIPTS) + { menuModelCustomScripts, modelCustomScriptsEnabled }, +#endif + { menuModelTelemetry, modelTelemetryEnabled }, + { menuModelDisplay, nullptr } +}; + uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec) { lcdDrawTextAlignedLeft(y, str); diff --git a/radio/src/gui/128x64/menu_radio.cpp b/radio/src/gui/128x64/menu_radio.cpp index 32b56229ff8..4e1c2826daa 100644 --- a/radio/src/gui/128x64/menu_radio.cpp +++ b/radio/src/gui/128x64/menu_radio.cpp @@ -21,6 +21,20 @@ #include "opentx.h" +const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { +#if defined(RADIO_TOOLS) + { menuRadioTools, nullptr }, +#endif +#if defined(SDCARD) + { menuRadioSdManager, nullptr }, +#endif + { menuRadioSetup, nullptr }, + { menuRadioSpecialFunctions, radioGFEnabled }, + { menuRadioTrainer, radioTrainerEnabled }, + { menuRadioHardware, nullptr }, + { menuRadioVersion, nullptr } +}; + void menuRadioSpecialFunctions(event_t event) { #if defined(NAVIGATION_X7) diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index de39941ba26..b071c85c607 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -19,8 +19,7 @@ * GNU General Public License for more details. */ -#ifndef _MENUS_H_ -#define _MENUS_H_ +#pragma once #include "keys.h" #include "common/stdlcd/menus.h" @@ -82,19 +81,7 @@ void menuGhostModuleConfig(event_t event); extern bool radioGFEnabled(); extern bool radioTrainerEnabled(); -static const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT] = { -#if defined(RADIO_TOOLS) - { menuRadioTools, nullptr }, -#endif -#if defined(SDCARD) - { menuRadioSdManager, nullptr }, -#endif - { menuRadioSetup, nullptr }, - { menuRadioSpecialFunctions, radioGFEnabled }, - { menuRadioTrainer, radioTrainerEnabled }, - { menuRadioHardware, nullptr }, - { menuRadioVersion, nullptr } -}; +extern const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT]; enum MenuModelIndexes { MENU_MODEL_SELECT, @@ -150,31 +137,9 @@ extern bool modelSFEnabled(); extern bool modelCustomScriptsEnabled(); extern bool modelTelemetryEnabled(); -static const MenuHandler menuTabModel[] = { - { menuModelSelect, nullptr }, - { menuModelSetup, nullptr }, -#if defined(HELI) - { menuModelHeli, modelHeliEnabled }, -#endif -#if defined(FLIGHT_MODES) - { menuModelFlightModesAll, modelFMEnabled }, -#endif - { menuModelExposAll, nullptr }, - { menuModelMixAll, nullptr }, - { menuModelLimits, nullptr }, - { menuModelCurvesAll, modelCurvesEnabled }, - { menuModelLogicalSwitches, modelLSEnabled }, - { menuModelSpecialFunctions, modelSFEnabled }, -#if defined(LUA_MODEL_SCRIPTS) - { menuModelCustomScripts, modelCustomScriptsEnabled }, -#endif - { menuModelTelemetry, modelTelemetryEnabled }, - { menuModelDisplay, nullptr } -}; +extern const MenuHandler menuTabModel[MENU_MODEL_PAGES_COUNT]; void menuStatisticsView(event_t event); void menuStatisticsDebug(event_t event); void menuStatisticsDebug2(event_t event); void menuAboutView(event_t event); - -#endif // _MENUS_H_ diff --git a/radio/src/gui/128x64/model_curve_edit.cpp b/radio/src/gui/128x64/model_curve_edit.cpp index cbaff946171..8291fd3e5ef 100644 --- a/radio/src/gui/128x64/model_curve_edit.cpp +++ b/radio/src/gui/128x64/model_curve_edit.cpp @@ -154,10 +154,7 @@ void menuModelCurveOne(event_t event) case EVT_KEY_LONG(KEY_ENTER): if (menuVerticalPosition > 1) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); - POPUP_MENU_ADD_ITEM(STR_MIRROR); - POPUP_MENU_ADD_ITEM(STR_CLEAR); - POPUP_MENU_START(onCurveOneMenu); + POPUP_MENU_START(onCurveOneMenu, 3, STR_CURVE_PRESET, STR_MIRROR, STR_CLEAR); } break; diff --git a/radio/src/gui/128x64/model_failsafe.cpp b/radio/src/gui/128x64/model_failsafe.cpp index c3622594658..23d553a0d2f 100644 --- a/radio/src/gui/128x64/model_failsafe.cpp +++ b/radio/src/gui/128x64/model_failsafe.cpp @@ -66,11 +66,7 @@ void menuModelFailsafe(event_t event) if (sub == k && !READ_ONLY() && event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_NONE); - POPUP_MENU_ADD_ITEM(STR_HOLD); - POPUP_MENU_ADD_ITEM(STR_CHANNEL2FAILSAFE); - POPUP_MENU_ADD_ITEM(STR_CHANNELS2FAILSAFE); - POPUP_MENU_START(onFailsafeMenu); + POPUP_MENU_START(onFailsafeMenu, 4, STR_NONE, STR_HOLD, STR_CHANNEL2FAILSAFE, STR_CHANNELS2FAILSAFE); } // Channel diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index 737ebb97c87..e3c4a02acf9 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -234,12 +234,7 @@ void menuModelLimits(event_t event) if (sub==k && event==EVT_KEY_FIRST(KEY_ENTER) && !READ_ONLY() && (k != MAX_OUTPUT_CHANNELS) ) { killEvents(event); s_editMode = 0; - POPUP_MENU_ADD_ITEM(STR_EDIT); - POPUP_MENU_ADD_ITEM(STR_RESET); - POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); - POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); - POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS); - POPUP_MENU_START(onLimitsMenu); + POPUP_MENU_START(onLimitsMenu, 5, STR_EDIT, STR_RESET, STR_COPY_TRIMS_TO_OFS, STR_COPY_STICKS_TO_OFS, STR_COPY_MIN_MAX_TO_OUTPUTS); } if (k == MAX_OUTPUT_CHANNELS) { diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index b5c7340eac6..5a0c874ab0a 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -174,10 +174,7 @@ void menuModelTelemetry(event_t event) s_currIdx = index; if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_EDIT); - POPUP_MENU_ADD_ITEM(STR_COPY); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_START(onSensorMenu); + POPUP_MENU_START(onSensorMenu, 3, STR_EDIT, STR_COPY, STR_DELETE); } else if (event == EVT_KEY_BREAK(KEY_ENTER)) { pushMenu(menuModelSensor); diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index 86d928cc8b0..2ed74169ddc 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -28,7 +28,7 @@ const unsigned char ASTERISK_BITMAP[] = { void drawAlertBox(const char * title, const char * text, const char * action) { lcdClear(); - lcdDraw1bitBitmap(2, 0, ASTERISK_BITMAP, 0, 0); + lcdDraw1bitBitmap(2, 2, ASTERISK_BITMAP, 0, 0); #define MESSAGE_LCD_OFFSET 6*FW diff --git a/radio/src/gui/128x64/startup_shutdown.cpp b/radio/src/gui/128x64/startup_shutdown.cpp index b3c4aaf34e4..92f6f0211d2 100644 --- a/radio/src/gui/128x64/startup_shutdown.cpp +++ b/radio/src/gui/128x64/startup_shutdown.cpp @@ -22,8 +22,8 @@ #include "opentx.h" -#define SLEEP_BITMAP_WIDTH 60 -#define SLEEP_BITMAP_HEIGHT 60 +#define SLEEP_BITMAP_WIDTH 42 +#define SLEEP_BITMAP_HEIGHT 47 const unsigned char bmp_sleep[] = { #include "sleep.lbm" diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index 86fbe6964e3..0f89b2bd30e 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -49,10 +49,10 @@ #define TRIM_LV_X 3 #define TRIM_RV_X (LCD_W-4) #define TRIM_RH_X (LCD_W-TRIM_LEN-5) -#define TRIM_LH_NEG (TRIM_LH_X+1*FW) -#define TRIM_LH_POS (TRIM_LH_X-4*FW) -#define TRIM_RH_NEG (TRIM_RH_X+1*FW) -#define TRIM_RH_POS (TRIM_RH_X-4*FW) +#define TRIM_LH_NEG (TRIM_LH_X+3*FW+1) +#define TRIM_LH_POS (TRIM_LH_X-4*FW+3) +#define TRIM_RH_NEG (TRIM_RH_X+3*FW+1) +#define TRIM_RH_POS (TRIM_RH_X-4*FW+3) #define RSSSI_X (30) #define RSSSI_Y (31) #define RSSI_MAX 105 @@ -148,43 +148,48 @@ void doMainScreenGraphics() void displayTrims(uint8_t phase) { - for (uint8_t i = 0; i < keysGetMaxTrims(); i++) { #if defined(SURFACE_RADIO) - static coord_t x[] = {TRIM_RH_X, TRIM_LH_X, TRIM_RV_X, TRIM_LV_X, TRIM_LV_X}; - static uint8_t vert[] = {0, 0, 1, 1, 1}; + static uint8_t x[] = {TRIM_RH_X, TRIM_LH_X, TRIM_RV_X, TRIM_LV_X, TRIM_LV_X}; + static uint8_t vert[] = {0, 0, 1, 1, 1}; #else - static coord_t x[] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X, TRIM_LH_X, TRIM_LV_X, TRIM_RH_X, TRIM_RV_X}; - static uint8_t vert[] = {0, 1, 1, 0, 0, 1, 0, 1}; + static uint8_t x[] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X, TRIM_LH_X, TRIM_LV_X, TRIM_RH_X, TRIM_RV_X}; + static uint8_t vert[] = {0, 1, 1, 0, 0, 1, 0, 1}; #endif - coord_t xm, ym; - uint8_t stickIndex = inputMappingConvertMode(i); - xm = x[stickIndex]; - uint8_t att = ROUND; - int16_t val = getTrimValue(phase, i); + + bool squareMarker = (keysGetMaxTrims() <= 4); + + for (uint8_t i = 0; i < keysGetMaxTrims(); i++) { if (getRawTrimValue(phase, i).mode == TRIM_MODE_NONE || getRawTrimValue(phase, i).mode == TRIM_MODE_3POS) continue; + coord_t ym; + uint8_t stickIndex = inputMappingConvertMode(i); + coord_t xm = x[stickIndex]; + uint8_t att = ROUND; + int16_t val = getTrimValue(phase, i); + int16_t dir = val; bool exttrim = false; if (val < TRIM_MIN || val > TRIM_MAX) { exttrim = true; } - if (val < -(TRIM_LEN + 1) * 4) { - val = -(TRIM_LEN + 1); - } - else if (val > (TRIM_LEN + 1) * 4) { - val = TRIM_LEN + 1; + val = (val * TRIM_LEN) / TRIM_MAX; + if (val < -TRIM_LEN) { + val = -TRIM_LEN; } - else { - val /= 4; + else if (val > TRIM_LEN) { + val = TRIM_LEN; } + uint8_t nx, ny; + LcdFlags nFlg = TINSIZE; + if (vert[i]) { ym = 31; if (!getPixel(xm, ym)) lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2 + 1); - if (keysGetMaxTrims() <= 4) { + if (squareMarker) { if (i != 2 || !g_model.thrTrim) { lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3); lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3); @@ -200,14 +205,6 @@ void displayTrims(uint8_t phase) if (exttrim) { 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 << i)))) { - lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), - TINSIZE | VERTICAL); - } - } - lcdDrawSquare(xm - 3, ym - 3, 7, att); } else { ym -= val; @@ -221,20 +218,16 @@ void displayTrims(uint8_t phase) lcdDrawSolidVerticalLine(xm + 2, ym - 1, 3); lcdDrawSolidVerticalLine(xm + 3, ym - 2, 5); } - if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || - (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { - lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir), - TINSIZE | VERTICAL); - } - } } + nx = dir > 0 ? 12 : 52; + ny = xm - 2; + nFlg |= VERTICAL; } else { ym = 60; if (!getPixel(xm, ym)) lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2 + 1); - if (keysGetMaxTrims() <= 4) { + if (squareMarker) { lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3); lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3); xm += val; @@ -248,16 +241,6 @@ void displayTrims(uint8_t phase) if (exttrim) { 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 << 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); } else { xm += val; @@ -271,18 +254,19 @@ void displayTrims(uint8_t phase) lcdDrawSolidHorizontalLine(xm - 1, ym - 2, 3); lcdDrawSolidHorizontalLine(xm - 2, ym - 3, 5); } - if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) { - if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || - (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { - lcdDrawNumber( - (xm < LCD_W / 2 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) - : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)), - ym - 2, -abs(dir), TINSIZE); - } - } } + nx = xm < LCD_W / 2 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG) + : (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG); + ny = ym - 2; } - + if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) { + if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS || + (trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) { + lcdDrawNumber(nx, ny, -abs(dir), nFlg | (dir < 0 ? RIGHT : 0)); + } + } + if (squareMarker) + lcdDrawSquare(xm - 3, ym - 3, 7, att); } } @@ -388,12 +372,7 @@ void onMainViewMenu(const char * result) pushModelNotes(); } else if (result == STR_RESET_SUBMENU) { - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER1); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER2); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER3); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_START(onMainViewMenu); + POPUP_MENU_START(onMainViewMenu, 5, STR_RESET_FLIGHT, STR_RESET_TIMER1, STR_RESET_TIMER2, STR_RESET_TIMER3, STR_RESET_TELEMETRY); } else if (result == STR_RESET_TELEMETRY) { telemetryReset(); @@ -474,11 +453,7 @@ void menuMainView(event_t event) POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); } - POPUP_MENU_ADD_ITEM(STR_RESET_SUBMENU); - - POPUP_MENU_ADD_ITEM(STR_STATISTICS); - POPUP_MENU_ADD_ITEM(STR_ABOUT_US); - POPUP_MENU_START(onMainViewMenu); + POPUP_MENU_START(onMainViewMenu, 3, STR_RESET_SUBMENU, STR_STATISTICS, STR_ABOUT_US); break; #if defined(EVT_KEY_LAST_MENU) diff --git a/radio/src/gui/212x64/model_curve_edit.cpp b/radio/src/gui/212x64/model_curve_edit.cpp index c9e257fb37e..10b12ffc050 100644 --- a/radio/src/gui/212x64/model_curve_edit.cpp +++ b/radio/src/gui/212x64/model_curve_edit.cpp @@ -162,10 +162,7 @@ void menuModelCurveOne(event_t event) case EVT_KEY_LONG(KEY_ENTER): if (menuVerticalPosition > 1) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET); - POPUP_MENU_ADD_ITEM(STR_MIRROR); - POPUP_MENU_ADD_ITEM(STR_CLEAR); - POPUP_MENU_START(onCurveOneMenu); + POPUP_MENU_START(onCurveOneMenu, 3, STR_CURVE_PRESET, STR_MIRROR, STR_CLEAR); } break; diff --git a/radio/src/gui/212x64/model_gvars.cpp b/radio/src/gui/212x64/model_gvars.cpp index f852800846f..852b92a9541 100644 --- a/radio/src/gui/212x64/model_gvars.cpp +++ b/radio/src/gui/212x64/model_gvars.cpp @@ -198,8 +198,6 @@ void menuModelGVars(event_t event) if ((menuHorizontalPosition<0 || !modelFMEnabled()) && event==EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_EDIT); - POPUP_MENU_ADD_ITEM(STR_CLEAR); - POPUP_MENU_START(onGVARSMenu); + POPUP_MENU_START(onGVARSMenu, 2, STR_EDIT, STR_CLEAR); } } diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index d46b4d3a1ae..05a21f08b78 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -148,11 +148,7 @@ void menuModelLimits(event_t event) putsChn(0, y, k+1, (sub==k && menuHorizontalPosition < 0) ? INVERS : 0); if (sub==k && menuHorizontalPosition < 0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET); - POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS); - POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS); - POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS); - POPUP_MENU_START(onLimitsMenu); + POPUP_MENU_START(onLimitsMenu, 4, STR_RESET, STR_COPY_TRIMS_TO_OFS, STR_COPY_STICKS_TO_OFS, STR_COPY_MIN_MAX_TO_OUTPUTS); } for (int j=0; j TRIM_MAX) { exttrim = true; } - if (val < -(TRIM_LEN+1)*4) { - val = -(TRIM_LEN+1); + val = (val * TRIM_LEN) / TRIM_MAX; + if (val < -TRIM_LEN) { + val = -TRIM_LEN; } - else if (val > (TRIM_LEN+1)*4) { - val = TRIM_LEN+1; - } - else { - val /= 4; + else if (val > TRIM_LEN) { + val = TRIM_LEN; } if (vert[i]) { @@ -411,12 +410,7 @@ void onMainViewMenu(const char * result) pushModelNotes(); } else if (result == STR_RESET_SUBMENU) { - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER1); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER2); - POPUP_MENU_ADD_ITEM(STR_RESET_TIMER3); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_START(onMainViewMenu); + POPUP_MENU_START(onMainViewMenu, 5, STR_RESET_FLIGHT, STR_RESET_TIMER1, STR_RESET_TIMER2, STR_RESET_TIMER3, STR_RESET_TELEMETRY); } else if (result == STR_RESET_TELEMETRY) { telemetryReset(); @@ -482,10 +476,7 @@ void menuMainView(event_t event) if (modelHasNotes()) { POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); } - POPUP_MENU_ADD_ITEM(STR_RESET_SUBMENU); - POPUP_MENU_ADD_ITEM(STR_STATISTICS); - POPUP_MENU_ADD_ITEM(STR_ABOUT_US); - POPUP_MENU_START(onMainViewMenu); + POPUP_MENU_START(onMainViewMenu, 3, STR_RESET_SUBMENU, STR_STATISTICS, STR_ABOUT_US); break; case EVT_KEY_BREAK(KEY_MENU): diff --git a/radio/src/gui/common/stdlcd/model_inputs.cpp b/radio/src/gui/common/stdlcd/model_inputs.cpp index dd0d4c8be42..1ee25cfdb3f 100644 --- a/radio/src/gui/common/stdlcd/model_inputs.cpp +++ b/radio/src/gui/common/stdlcd/model_inputs.cpp @@ -319,13 +319,7 @@ void menuModelExposAll(event_t event) else { event = 0; s_copyMode = 0; - POPUP_MENU_ADD_ITEM(STR_EDIT); - POPUP_MENU_ADD_ITEM(STR_INSERT_BEFORE); - POPUP_MENU_ADD_ITEM(STR_INSERT_AFTER); - POPUP_MENU_ADD_ITEM(STR_COPY); - POPUP_MENU_ADD_ITEM(STR_MOVE); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_START(onExposMenu); + POPUP_MENU_START(onExposMenu, 6, STR_EDIT, STR_INSERT_BEFORE, STR_INSERT_AFTER, STR_COPY, STR_MOVE, STR_DELETE); } } } diff --git a/radio/src/gui/common/stdlcd/model_mixes.cpp b/radio/src/gui/common/stdlcd/model_mixes.cpp index bebd95e141f..6dbfc88e3df 100644 --- a/radio/src/gui/common/stdlcd/model_mixes.cpp +++ b/radio/src/gui/common/stdlcd/model_mixes.cpp @@ -236,13 +236,7 @@ void menuModelMixAll(event_t event) else { event = 0; s_copyMode = 0; - POPUP_MENU_ADD_ITEM(STR_EDIT); - POPUP_MENU_ADD_ITEM(STR_INSERT_BEFORE); - POPUP_MENU_ADD_ITEM(STR_INSERT_AFTER); - POPUP_MENU_ADD_ITEM(STR_COPY); - POPUP_MENU_ADD_ITEM(STR_MOVE); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_START(onMixesMenu); + POPUP_MENU_START(onMixesMenu, 6, STR_EDIT, STR_INSERT_BEFORE, STR_INSERT_AFTER, STR_COPY, STR_MOVE, STR_DELETE); } } } diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp index b607fa246b2..bae701868e1 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx2.cpp @@ -72,9 +72,7 @@ void onPXX2BindMenu(const char * result) } else if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) { reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED; - POPUP_MENU_ADD_ITEM(STR_FLEX_868); - POPUP_MENU_ADD_ITEM(STR_FLEX_915); - POPUP_MENU_START(onPXX2R9MBindModeMenu); + POPUP_MENU_START(onPXX2R9MBindModeMenu, 2, STR_FLEX_868, STR_FLEX_915); } else { #if defined(SIMU) @@ -332,11 +330,6 @@ void modelSetupModulePxx2ReceiverLine(uint8_t moduleIdx, uint8_t receiverIdx, co } if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) { - POPUP_MENU_ADD_ITEM(STR_BIND); - POPUP_MENU_ADD_ITEM(STR_OPTIONS); - POPUP_MENU_ADD_ITEM(STR_SHARE); - POPUP_MENU_ADD_ITEM(STR_DELETE); - POPUP_MENU_ADD_ITEM(STR_RESET); - POPUP_MENU_START(onPXX2ReceiverMenu); + POPUP_MENU_START(onPXX2ReceiverMenu, 5, STR_BIND, STR_OPTIONS, STR_SHARE, STR_DELETE, STR_RESET); } } diff --git a/radio/src/gui/common/stdlcd/popups.cpp b/radio/src/gui/common/stdlcd/popups.cpp index dc9973a7d7b..1d52ba08c76 100644 --- a/radio/src/gui/common/stdlcd/popups.cpp +++ b/radio/src/gui/common/stdlcd/popups.cpp @@ -247,3 +247,117 @@ void drawProgressScreen(const char * title, const char * message, int num, int d } lcdRefresh(); } + +void CLEAR_POPUP() +{ + warningText = nullptr; + warningInfoText = nullptr; + popupMenuTitle = nullptr; + popupMenuHandler = nullptr; + popupMenuItemsCount = 0; +} + +void POPUP_WAIT(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_WAIT; + popupFunc = runPopupWarning; +} + +void POPUP_INFORMATION(const char * s) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_INFO; + popupFunc = runPopupWarning; +} + +void POPUP_WARNING(const char * message, const char * info, bool waitForClose) +{ + (void)waitForClose; + + warningText = message; + warningInfoText = info; + warningInfoLength = info ? strlen(info) : 0; + warningInfoFlags = 0; + warningType = WARNING_TYPE_ASTERISK; + popupFunc = runPopupWarning; +} + +void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) +{ + warningInfoText = info; + warningInfoLength = length; + warningInfoFlags = flags; +} + +void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) +{ + if (s != warningText) { + killAllEvents(); + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_CONFIRM; + popupFunc = runPopupWarning; + popupMenuHandler = handler; + } +} + +void POPUP_INPUT(const char * s, PopupFunc func) +{ + warningText = s; + warningInfoText = nullptr; + warningType = WARNING_TYPE_INPUT; + popupFunc = func; +} + +bool isEventCaughtByPopup() +{ + if (warningText && warningType != WARNING_TYPE_WAIT) + return true; + + if (popupMenuItemsCount > 0) + return true; + + return false; +} + +void POPUP_MENU_ADD_ITEM(const char * s) +{ + popupMenuOffsetType = MENU_OFFSET_INTERNAL; + if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) { + popupMenuItems[popupMenuItemsCount++] = s; + } +} + +void POPUP_MENU_SELECT_ITEM(uint8_t index) +{ + popupMenuSelectedItem = (index > 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0); +} + +void POPUP_MENU_TITLE(const char * s) +{ + popupMenuTitle = s; +} + +void POPUP_MENU_START(PopupMenuHandler handler) +{ + if (handler != popupMenuHandler) { + killAllEvents(); + AUDIO_KEY_PRESS(); + popupMenuHandler = handler; + } +} + +void POPUP_MENU_START(PopupMenuHandler handler, int count, ...) +{ + va_list ap; + va_start(ap, count); + for(int i = 0; i < count; i += 1) { + const char* s = va_arg(ap, const char*); + POPUP_MENU_ADD_ITEM(s); + } + va_end(ap); + POPUP_MENU_START(handler); +} diff --git a/radio/src/gui/common/stdlcd/popups.h b/radio/src/gui/common/stdlcd/popups.h index 84165115ac0..2324d3e18d7 100644 --- a/radio/src/gui/common/stdlcd/popups.h +++ b/radio/src/gui/common/stdlcd/popups.h @@ -19,8 +19,7 @@ * GNU General Public License for more details. */ -#ifndef _STDLCD_POPUPS_H_ -#define _STDLCD_POPUPS_H_ +#pragma once #include #include "audio.h" @@ -80,89 +79,17 @@ enum inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { } #else #define DISPLAY_WARNING(evt) (*popupFunc)(evt) - inline void CLEAR_POPUP() - { - warningText = nullptr; - warningInfoText = nullptr; - popupMenuTitle = nullptr; - popupMenuHandler = nullptr; - popupMenuItemsCount = 0; - } - - inline void POPUP_WAIT(const char * s) - { - warningText = s; - warningInfoText = nullptr; - warningType = WARNING_TYPE_WAIT; - popupFunc = runPopupWarning; - } - - inline void POPUP_INFORMATION(const char * s) - { - warningText = s; - warningInfoText = nullptr; - warningType = WARNING_TYPE_INFO; - popupFunc = runPopupWarning; - } - - inline void POPUP_WARNING(const char * message, const char * info = nullptr, bool waitForClose = true) - { - (void)waitForClose; - - warningText = message; - warningInfoText = info; - warningInfoLength = info ? strlen(info) : 0; - warningInfoFlags = 0; - warningType = WARNING_TYPE_ASTERISK; - popupFunc = runPopupWarning; - } - - inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) - { - warningInfoText = info; - warningInfoLength = length; - warningInfoFlags = flags; - } - - inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler) - { - if (s != warningText) { - killAllEvents(); - warningText = s; - warningInfoText = nullptr; - warningType = WARNING_TYPE_CONFIRM; - popupFunc = runPopupWarning; - popupMenuHandler = handler; - } - } - - inline void POPUP_INPUT(const char * s, PopupFunc func) - { - warningText = s; - warningInfoText = nullptr; - warningType = WARNING_TYPE_INPUT; - popupFunc = func; - } - - inline bool isEventCaughtByPopup() - { - if (warningText && warningType != WARNING_TYPE_WAIT) - return true; - - if (popupMenuItemsCount > 0) - return true; - - return false; - } + extern void CLEAR_POPUP(); + extern void POPUP_WAIT(const char * s); + extern void POPUP_INFORMATION(const char * s); + extern void POPUP_WARNING(const char * message, const char * info = nullptr, bool waitForClose = true); + extern void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags); + extern void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler); + extern void POPUP_INPUT(const char * s, PopupFunc func); + extern bool isEventCaughtByPopup(); #endif -inline void POPUP_MENU_ADD_ITEM(const char * s) -{ - popupMenuOffsetType = MENU_OFFSET_INTERNAL; - if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) { - popupMenuItems[popupMenuItemsCount++] = s; - } -} +extern void POPUP_MENU_ADD_ITEM(const char * s); #if defined(SDCARD) #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) @@ -170,26 +97,12 @@ inline void POPUP_MENU_ADD_ITEM(const char * s) #define POPUP_MENU_ADD_SD_ITEM(s) #endif -inline void POPUP_MENU_SELECT_ITEM(uint8_t index) -{ - popupMenuSelectedItem = (index > 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0); -} +extern void POPUP_MENU_SELECT_ITEM(uint8_t index); -inline void POPUP_MENU_TITLE(const char * s) -{ - popupMenuTitle = s; -} +extern void POPUP_MENU_TITLE(const char * s); -inline void POPUP_MENU_START(PopupMenuHandler handler) -{ - if (handler != popupMenuHandler) { - killAllEvents(); - AUDIO_KEY_PRESS(); - popupMenuHandler = handler; - } -} +extern void POPUP_MENU_START(PopupMenuHandler handler); +extern void POPUP_MENU_START(PopupMenuHandler handler, int count, ...); // For compatability with color LCD code base, not (currently) required for B&W #define POPUP_WARNING_ON_UI_TASK POPUP_WARNING - -#endif // _STDLCD_POPUPS_H_ diff --git a/radio/src/gui/common/stdlcd/view_telemetry.cpp b/radio/src/gui/common/stdlcd/view_telemetry.cpp index 0b6fc8b69e0..4f3c55b1b9b 100644 --- a/radio/src/gui/common/stdlcd/view_telemetry.cpp +++ b/radio/src/gui/common/stdlcd/view_telemetry.cpp @@ -73,9 +73,7 @@ void menuViewTelemetry(event_t event) } else if (event == EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); - POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY); - POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT); - POPUP_MENU_START(onMainViewMenu); + POPUP_MENU_START(onMainViewMenu, 2, STR_RESET_TELEMETRY, STR_RESET_FLIGHT); } for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) { diff --git a/radio/src/gui/gui_common.cpp b/radio/src/gui/gui_common.cpp index f6883a4f017..a019916b50d 100644 --- a/radio/src/gui/gui_common.cpp +++ b/radio/src/gui/gui_common.cpp @@ -699,9 +699,7 @@ void checkExternalAntenna() #if defined(COLORLCD) runAntennaSelectionMenu(); #else - POPUP_MENU_ADD_ITEM(STR_USE_INTERNAL_ANTENNA); - POPUP_MENU_ADD_ITEM(STR_USE_EXTERNAL_ANTENNA); - POPUP_MENU_START(onAntennaSelection); + POPUP_MENU_START(onAntennaSelection, 2, STR_USE_INTERNAL_ANTENNA, STR_USE_EXTERNAL_ANTENNA); #endif } else { globalData.externalAntennaEnabled = false; @@ -1240,3 +1238,174 @@ void setPotType(int index, int value) { g_eeGeneral.potsConfig = bfSet(g_eeGeneral.potsConfig, value, (POT_CFG_BITS * index), POT_CFG_TYPE_BITS); } + +#if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) +uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax) +{ + if (horTab) { + uint8_t result = 0; + while (result < horTabMax && horTab[result] >= HIDDEN_ROW) + ++result; + return result; + } + else { + return 0; + } +} +#endif + +uint8_t MODULE_BIND_ROWS(int moduleIdx) +{ + if (isModuleCrossfire(moduleIdx)) + return 0; + + if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return 1; + else + return 2; + } + else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || isModuleAFHDS3(moduleIdx) || isModuleDSMP(moduleIdx)) { + return 1; + } + else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) { + return 2; + } + else { + return HIDDEN_ROW; + } +} + +uint8_t MODULE_CHANNELS_ROWS(int moduleIdx) +{ + if (!IS_MODULE_ENABLED(moduleIdx)) { + return HIDDEN_ROW; + } +#if defined(MULTIMODULE) + else if (isModuleMultimodule(moduleIdx)) { + if (IS_RX_MULTI(moduleIdx)) + return HIDDEN_ROW; + else if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) + return 1; + else + return 0; + } +#endif + else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || + isModuleGhost(moduleIdx) || isModuleSBUS(moduleIdx) || + isModuleDSMP(moduleIdx)) { + // fixed number of channels + return 0; + } else { + return 1; + } +} + +#if defined(MULTIMODULE) +uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx) +{ + if (!isModuleMultimodule(moduleIdx)) + return HIDDEN_ROW; + + uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol; + if (protocol < MODULE_SUBTYPE_MULTI_LAST) { + const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol); + if (pdef->disable_ch_mapping) + return 0; + } + + return HIDDEN_ROW; +} + +uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) +{ + if (!isModuleMultimodule(moduleIdx)) + return HIDDEN_ROW; + + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + if (status.isValid()) { + return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW; + } + + return MULTI_DISABLE_CHAN_MAP_ROW_STATIC(moduleIdx); +} + +bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx) +{ + if (!isModuleMultimodule(moduleIdx)) { + return false; + } + + if (g_model.moduleData[moduleIdx].multi.rfProtocol < MODULE_SUBTYPE_MULTI_LAST) { + return true; + } + + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + if (status.isValid()) { + return status.protocolValid(); + } + + return false; +} + +bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx) +{ + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + int proto = g_model.moduleData[moduleIdx].multi.rfProtocol; + + if (status.isValid()) { + TRACE("(%d) status.protocolSubNbr = %d", proto, status.protocolSubNbr); + return status.protocolSubNbr > 0; + } + else + { + if (proto > MODULE_SUBTYPE_MULTI_LAST) { + return true; + } + else { + auto subProto = getMultiProtocolDefinition(proto); + return subProto->subTypeString != nullptr; + } + } +} + +uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx) +{ +#if LCD_W < 212 + if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) + return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : HIDDEN_ROW); + else + return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW); +#else + return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : 0); +#endif +} + +uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) +{ + if (!isModuleMultimodule(moduleIdx)) + return false; + + uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol; + MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); + + if (status.isValid()) + return status.optionDisp; + + if (protocol < MODULE_SUBTYPE_MULTI_LAST) + return getMultiProtocolDefinition(protocol)->optionsstr != nullptr; + + return false; +} +#endif + +uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx) +{ + if(isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx)) + return TITLE_ROW; + if(isModuleAFHDS3(moduleIdx)) + return HIDDEN_ROW; + if(isModuleGhost(moduleIdx)) + return 0; + return MULTIMODULE_OPTIONS_ROW(moduleIdx); +} diff --git a/radio/src/gui/gui_common.h b/radio/src/gui/gui_common.h index 69045381a35..33f908f97ee 100644 --- a/radio/src/gui/gui_common.h +++ b/radio/src/gui/gui_common.h @@ -39,18 +39,7 @@ #endif #if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D) -inline uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax) -{ - if (horTab) { - uint8_t result = 0; - while (result < horTabMax && horTab[result] >= HIDDEN_ROW) - ++result; - return result; - } - else { - return 0; - } -} +extern uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax); #endif #if defined(LIBOPENUI) @@ -147,52 +136,8 @@ void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0); #define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW) #define IF_MODULE_ON(moduleIndex, x) (IS_MODULE_ENABLED(moduleIndex) ? (uint8_t)(x) : HIDDEN_ROW) -inline uint8_t MODULE_BIND_ROWS(int moduleIdx) -{ - if (isModuleCrossfire(moduleIdx)) - return 0; - - if (isModuleMultimodule(moduleIdx)) { - if (IS_RX_MULTI(moduleIdx)) - return 1; - else - return 2; - } - else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || isModuleAFHDS3(moduleIdx) || isModuleDSMP(moduleIdx)) { - return 1; - } - else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) { - return 2; - } - else { - return HIDDEN_ROW; - } -} - -inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx) -{ - if (!IS_MODULE_ENABLED(moduleIdx)) { - return HIDDEN_ROW; - } -#if defined(MULTIMODULE) - else if (isModuleMultimodule(moduleIdx)) { - if (IS_RX_MULTI(moduleIdx)) - return HIDDEN_ROW; - else if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) - return 1; - else - return 0; - } -#endif - else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) || - isModuleGhost(moduleIdx) || isModuleSBUS(moduleIdx) || - isModuleDSMP(moduleIdx)) { - // fixed number of channels - return 0; - } else { - return 1; - } -} +extern uint8_t MODULE_BIND_ROWS(int moduleIdx); +extern uint8_t MODULE_CHANNELS_ROWS(int moduleIdx); #if defined(EXTERNAL_ANTENNA) && defined(INTERNAL_MODULE_PXX1) void onAntennaSwitchConfirm(const char * result); @@ -229,101 +174,13 @@ inline uint8_t IF_ALLOW_RACING_MODE(int) #endif #if defined(MULTIMODULE) -inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx) -{ - if (!isModuleMultimodule(moduleIdx)) - return HIDDEN_ROW; - - uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol; - if (protocol < MODULE_SUBTYPE_MULTI_LAST) { - const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol); - if (pdef->disable_ch_mapping) - return 0; - } - - return HIDDEN_ROW; -} - -inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx) -{ - if (!isModuleMultimodule(moduleIdx)) - return HIDDEN_ROW; - - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - if (status.isValid()) { - return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW; - } - - return MULTI_DISABLE_CHAN_MAP_ROW_STATIC(moduleIdx); -} - -inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx) -{ - if (!isModuleMultimodule(moduleIdx)) { - return false; - } - - if (g_model.moduleData[moduleIdx].multi.rfProtocol < MODULE_SUBTYPE_MULTI_LAST) { - return true; - } - - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - if (status.isValid()) { - return status.protocolValid(); - } - - return false; -} - -inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx) -{ - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - int proto = g_model.moduleData[moduleIdx].multi.rfProtocol; - - if (status.isValid()) { - TRACE("(%d) status.protocolSubNbr = %d", proto, status.protocolSubNbr); - return status.protocolSubNbr > 0; - } - else - { - if (proto > MODULE_SUBTYPE_MULTI_LAST) { - return true; - } - else { - auto subProto = getMultiProtocolDefinition(proto); - return subProto->subTypeString != nullptr; - } - } -} +extern uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx); +extern uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx); +extern bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx); +extern bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx); +extern uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx); +extern uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx); -inline uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx) -{ -#if LCD_W < 212 - if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) - return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : HIDDEN_ROW); - else - return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW); -#else - return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : 0); -#endif -} - -inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) -{ - if (!isModuleMultimodule(moduleIdx)) - return false; - - uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol; - MultiModuleStatus &status = getMultiModuleStatus(moduleIdx); - - if (status.isValid()) - return status.optionDisp; - - if (protocol < MODULE_SUBTYPE_MULTI_LAST) - return getMultiProtocolDefinition(protocol)->optionsstr != nullptr; - - return false; -} #if defined(MANUFACTURER_FRSKY) #define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP #else @@ -363,15 +220,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx) #define FAILSAFE_ROW(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW -inline uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx) { - if(isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx)) - return TITLE_ROW; - if(isModuleAFHDS3(moduleIdx)) - return HIDDEN_ROW; - if(isModuleGhost(moduleIdx)) - return 0; - return MULTIMODULE_OPTIONS_ROW(moduleIdx); -} +extern uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx); void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event, LcdFlags flags, uint8_t old_editMode); diff --git a/radio/src/main.cpp b/radio/src/main.cpp index a6e1d36b77a..2b6eda4ae9c 100644 --- a/radio/src/main.cpp +++ b/radio/src/main.cpp @@ -118,13 +118,12 @@ void onUSBConnectMenu(const char *result) void openUsbMenu() { if (popupMenuHandler != onUSBConnectMenu) { - POPUP_MENU_ADD_ITEM(STR_USB_JOYSTICK); - POPUP_MENU_ADD_ITEM(STR_USB_MASS_STORAGE); + POPUP_MENU_TITLE(STR_SELECT_MODE); #if defined(USB_SERIAL) - POPUP_MENU_ADD_ITEM(STR_USB_SERIAL); + POPUP_MENU_START(onUSBConnectMenu, 3, STR_USB_JOYSTICK, STR_USB_MASS_STORAGE, STR_USB_SERIAL); +#else + POPUP_MENU_START(onUSBConnectMenu, 2, STR_USB_JOYSTICK, STR_USB_MASS_STORAGE); #endif - POPUP_MENU_TITLE(STR_SELECT_MODE); - POPUP_MENU_START(onUSBConnectMenu); } } @@ -251,9 +250,7 @@ void handleJackConnection() enableTrainer(); } else if (popupMenuItemsCount == 0) { - POPUP_MENU_ADD_ITEM(STR_JACK_HEADPHONE); - POPUP_MENU_ADD_ITEM(STR_JACK_TRAINER); - POPUP_MENU_START(onJackConnectMenu); + POPUP_MENU_START(onJackConnectMenu, 2, STR_JACK_HEADPHONE, STR_JACK_TRAINER); } } else if (jackState == SPEAKER_ACTIVE && !isJackPlugged() && popupMenuItemsCount > 0 && popupMenuHandler == onJackConnectMenu) { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 2beb5d5987d..76b2b8e4846 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1885,3 +1885,53 @@ bool modelCustomScriptsEnabled() { bool modelTelemetryEnabled() { return FEATURE_ENABLED(modelTelemetryDisabled); } + +void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags) +{ + if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) { + valMax = g_model.extendedTrims ? TRIM_EXTENDED_MAX : TRIM_MAX; + valMin = -valMax; + } +#if defined(LUA_INPUTS) + else if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) { + valMax = 30000; + valMin = -valMax; + } +#endif + else if (source < MIXSRC_FIRST_CH) { + valMax = 100; + valMin = -valMax; + } + else if (source <= MIXSRC_LAST_CH) { + valMax = g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100; + valMin = -valMax; + } +#if defined(GVARS) + else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) { + valMax = min(CFN_GVAR_CST_MAX, MODEL_GVAR_MAX(source-MIXSRC_FIRST_GVAR)); + valMin = max(CFN_GVAR_CST_MIN, MODEL_GVAR_MIN(source-MIXSRC_FIRST_GVAR)); + if (flags && g_model.gvars[source-MIXSRC_FIRST_GVAR].prec) + *flags |= PREC1; + } +#endif + else if (source == MIXSRC_TX_VOLTAGE) { + valMax = 255; + valMin = 0; + if (flags) + *flags |= PREC1; + } + else if (source == MIXSRC_TX_TIME) { + valMax = 23 * 60 + 59; + valMin = 0; + } + else if (source >= MIXSRC_FIRST_TIMER && source <= MIXSRC_LAST_TIMER) { + valMax = 9 * 60 * 60 - 1; + valMin = -valMax; + if (flags) + *flags |= TIMEHOUR; + } + else { + valMax = 30000; + valMin = -valMax; + } +} diff --git a/radio/src/opentx.h b/radio/src/opentx.h index e9119dae68c..6b71c8aeb1e 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -389,55 +389,7 @@ inline int calcRESXto100(int x) int expo(int x, int k); -inline void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0) -{ - if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) { - valMax = g_model.extendedTrims ? TRIM_EXTENDED_MAX : TRIM_MAX; - valMin = -valMax; - } -#if defined(LUA_INPUTS) - else if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) { - valMax = 30000; - valMin = -valMax; - } -#endif - else if (source < MIXSRC_FIRST_CH) { - valMax = 100; - valMin = -valMax; - } - else if (source <= MIXSRC_LAST_CH) { - valMax = g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100; - valMin = -valMax; - } -#if defined(GVARS) - else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) { - valMax = min(CFN_GVAR_CST_MAX, MODEL_GVAR_MAX(source-MIXSRC_FIRST_GVAR)); - valMin = max(CFN_GVAR_CST_MIN, MODEL_GVAR_MIN(source-MIXSRC_FIRST_GVAR)); - if (flags && g_model.gvars[source-MIXSRC_FIRST_GVAR].prec) - *flags |= PREC1; - } -#endif - else if (source == MIXSRC_TX_VOLTAGE) { - valMax = 255; - valMin = 0; - if (flags) - *flags |= PREC1; - } - else if (source == MIXSRC_TX_TIME) { - valMax = 23 * 60 + 59; - valMin = 0; - } - else if (source >= MIXSRC_FIRST_TIMER && source <= MIXSRC_LAST_TIMER) { - valMax = 9 * 60 * 60 - 1; - valMin = -valMax; - if (flags) - *flags |= TIMEHOUR; - } - else { - valMax = 30000; - valMin = -valMax; - } -} +extern void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0); void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx=0, int16_t ovwrValue=0); int16_t applyLimits(uint8_t channel, int32_t value); diff --git a/radio/src/pulses/modules_helpers.cpp b/radio/src/pulses/modules_helpers.cpp index 63dcf3ac0de..3950f65b24c 100644 --- a/radio/src/pulses/modules_helpers.cpp +++ b/radio/src/pulses/modules_helpers.cpp @@ -42,3 +42,94 @@ bool isExternalAntennaEnabled() } } #endif + +int8_t maxModuleChannels_M8(uint8_t moduleIdx) +{ + if (isExtraModule(moduleIdx)) { + return MAX_EXTRA_MODULE_CHANNELS_M8; + } else if (isModuleXJT(moduleIdx)) { + return maxChannelsXJT_M8[1 + g_model.moduleData[moduleIdx].subType]; + } else if (isModuleISRMD16(moduleIdx)) { + return maxChannelsXJT_M8[MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16]; + } else if (isModuleR9M(moduleIdx)) { + if (isModuleR9M_LBT(moduleIdx)) { + if (isModuleR9MLite(moduleIdx)) + return g_model.moduleData[moduleIdx].pxx.power == + R9M_LITE_LBT_POWER_25_8CH + ? 0 + : 8; + else + return g_model.moduleData[moduleIdx].pxx.power == R9M_LBT_POWER_25_8CH + ? 0 + : 8; + } else { + return 8; // always 16 channels in FCC / FLEX + } + } else if (isModuleMultimoduleDSM2(moduleIdx)) { + return 4; // 12 channels + } else if (isModuleDSMP(moduleIdx) && + (g_model.moduleData[moduleIdx].dsmp.flags != 0)) { + return g_model.moduleData[moduleIdx].channelsCount; + } else { + return maxChannelsModules_M8[g_model.moduleData[moduleIdx].type]; + } +} + +int8_t sentModuleChannels(uint8_t idx) +{ + if (isModuleCrossfire(idx)) + return CROSSFIRE_CHANNELS_COUNT; + else if (isModuleGhost(idx)) + return GHOST_CHANNELS_COUNT; + else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) + return 16; + else if (isModuleSBUS(idx)) + return 16; + else + return sentModulePXXChannels(idx); +} + +uint8_t getMaxRxNum(uint8_t idx) +{ + if (isModuleDSM2(idx)) + return 20; + +#if defined(MULTIMODULE) + if (isModuleMultimodule(idx)) { + switch (g_model.moduleData[idx].multi.rfProtocol) { + case MODULE_SUBTYPE_MULTI_OLRS: + return MODULE_SUBTYPE_MULTI_OLRS_RXNUM; + case MODULE_SUBTYPE_MULTI_BUGS: + return MODULE_SUBTYPE_MULTI_BUGS_RXNUM; + case MODULE_SUBTYPE_MULTI_BUGS_MINI: + return MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM; + } + } +#endif + +#if defined(AFHDS3) + if (isModuleAFHDS3(idx)) return AFHDS3_MAX_MODEL_ID; +#endif + + return MAX_RXNUM; +} + +void setModuleType(uint8_t moduleIdx, uint8_t moduleType) +{ + ModuleData & moduleData = g_model.moduleData[moduleIdx]; + memclear(&moduleData, sizeof(ModuleData)); + moduleData.type = moduleType; + moduleData.channelsCount = defaultModuleChannels_M8(moduleIdx); + if (moduleData.type == MODULE_TYPE_SBUS) + moduleData.sbus.refreshRate = -31; + else if (moduleData.type == MODULE_TYPE_PPM) + setDefaultPpmFrameLength(moduleIdx); + else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) { + resetAfhds2AOptions(moduleIdx); + } + else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) { + resetAfhds3Options(moduleIdx); + } + else + resetAccessAuthenticationCount(); +} diff --git a/radio/src/pulses/modules_helpers.h b/radio/src/pulses/modules_helpers.h index 1c8bf5a9b69..b9d90ae5c3c 100644 --- a/radio/src/pulses/modules_helpers.h +++ b/radio/src/pulses/modules_helpers.h @@ -19,8 +19,7 @@ * GNU General Public License for more details. */ -#ifndef _MODULES_HELPERS_H_ -#define _MODULES_HELPERS_H_ +#pragma once #include "libopenui/src/bitfield.h" #include "definitions.h" @@ -85,14 +84,14 @@ extern uint32_t NV14internalModuleFwVersion; const uint8_t getMaxMultiOptions(); - struct mm_protocol_definition { + PACK_NOT_SIMU(struct mm_protocol_definition { uint8_t protocol; - uint8_t maxSubtype; - bool failsafe; - bool disable_ch_mapping; + uint8_t maxSubtype:6; + bool failsafe:1; + bool disable_ch_mapping:1; const char* const* subTypeString; const char* optionsstr; - }; + }); const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol); @@ -461,37 +460,7 @@ static_assert(MODULE_SUBTYPE_PXX1_LAST + 2 == sizeof(maxChannelsXJT_M8), constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8; constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM -inline int8_t maxModuleChannels_M8(uint8_t moduleIdx) -{ - if (isExtraModule(moduleIdx)) { - return MAX_EXTRA_MODULE_CHANNELS_M8; - } else if (isModuleXJT(moduleIdx)) { - return maxChannelsXJT_M8[1 + g_model.moduleData[moduleIdx].subType]; - } else if (isModuleISRMD16(moduleIdx)) { - return maxChannelsXJT_M8[MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16]; - } else if (isModuleR9M(moduleIdx)) { - if (isModuleR9M_LBT(moduleIdx)) { - if (isModuleR9MLite(moduleIdx)) - return g_model.moduleData[moduleIdx].pxx.power == - R9M_LITE_LBT_POWER_25_8CH - ? 0 - : 8; - else - return g_model.moduleData[moduleIdx].pxx.power == R9M_LBT_POWER_25_8CH - ? 0 - : 8; - } else { - return 8; // always 16 channels in FCC / FLEX - } - } else if (isModuleMultimoduleDSM2(moduleIdx)) { - return 4; // 12 channels - } else if (isModuleDSMP(moduleIdx) && - (g_model.moduleData[moduleIdx].dsmp.flags != 0)) { - return g_model.moduleData[moduleIdx].channelsCount; - } else { - return maxChannelsModules_M8[g_model.moduleData[moduleIdx].type]; - } -} +extern int8_t maxModuleChannels_M8(uint8_t moduleIdx); inline int8_t maxModuleChannels(uint8_t moduleIdx) { @@ -525,19 +494,7 @@ inline uint8_t sentModulePXXChannels(uint8_t idx) return 8 + g_model.moduleData[idx].channelsCount; } -inline int8_t sentModuleChannels(uint8_t idx) -{ - if (isModuleCrossfire(idx)) - return CROSSFIRE_CHANNELS_COUNT; - else if (isModuleGhost(idx)) - return GHOST_CHANNELS_COUNT; - else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx)) - return 16; - else if (isModuleSBUS(idx)) - return 16; - else - return sentModulePXXChannels(idx); -} +extern int8_t sentModuleChannels(uint8_t idx); inline bool isDefaultModelRegistrationID() { @@ -676,30 +633,7 @@ inline bool isModuleRangeAvailable(uint8_t moduleIdx) constexpr uint8_t MAX_RXNUM = 63; -inline uint8_t getMaxRxNum(uint8_t idx) -{ - if (isModuleDSM2(idx)) - return 20; - -#if defined(MULTIMODULE) - if (isModuleMultimodule(idx)) { - switch (g_model.moduleData[idx].multi.rfProtocol) { - case MODULE_SUBTYPE_MULTI_OLRS: - return MODULE_SUBTYPE_MULTI_OLRS_RXNUM; - case MODULE_SUBTYPE_MULTI_BUGS: - return MODULE_SUBTYPE_MULTI_BUGS_RXNUM; - case MODULE_SUBTYPE_MULTI_BUGS_MINI: - return MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM; - } - } -#endif - -#if defined(AFHDS3) - if (isModuleAFHDS3(idx)) return AFHDS3_MAX_MODEL_ID; -#endif - - return MAX_RXNUM; -} +extern uint8_t getMaxRxNum(uint8_t idx); inline const char * getModuleDelay(uint8_t idx) { @@ -827,26 +761,6 @@ inline void resetAfhds2AOptions(uint8_t moduleIdx) #endif } -inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType) -{ - ModuleData & moduleData = g_model.moduleData[moduleIdx]; - memclear(&moduleData, sizeof(ModuleData)); - moduleData.type = moduleType; - moduleData.channelsCount = defaultModuleChannels_M8(moduleIdx); - if (moduleData.type == MODULE_TYPE_SBUS) - moduleData.sbus.refreshRate = -31; - else if (moduleData.type == MODULE_TYPE_PPM) - setDefaultPpmFrameLength(moduleIdx); - else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) { - resetAfhds2AOptions(moduleIdx); - } - else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) { - resetAfhds3Options(moduleIdx); - } - else - resetAccessAuthenticationCount(); -} +extern void setModuleType(uint8_t moduleIdx, uint8_t moduleType); extern bool isExternalAntennaEnabled(); - -#endif // _MODULES_HELPERS_H_ diff --git a/radio/src/storage/yaml/yaml_bits.cpp b/radio/src/storage/yaml/yaml_bits.cpp index 34b06f05e6c..2351a073be0 100644 --- a/radio/src/storage/yaml/yaml_bits.cpp +++ b/radio/src/storage/yaml/yaml_bits.cpp @@ -19,6 +19,8 @@ * GNU General Public License for more details. */ +#include + #include #include "yaml_bits.h" #include "yaml_parser.h" @@ -192,53 +194,31 @@ uint32_t yaml_hex2uint(const char* val, uint8_t val_len) return i_val; } -static char int2str_buffer[MAX_STR] = {0}; -static const char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' }; +constexpr int INT2STR_LEN = 16; + +static char int2str_buffer[INT2STR_LEN] = {0}; char* yaml_unsigned2str(uint32_t i) { - char* c = &(int2str_buffer[MAX_STR-2]); - do { - *(c--) = _int2str_lookup[i % 10]; - i = i / 10; - } while((c > int2str_buffer) && i); - - return (c + 1); + snprintf(int2str_buffer, INT2STR_LEN, "%" PRIu32, i); + return int2str_buffer; } char* yaml_signed2str(int32_t i) { - if (i < 0) { - char* c = yaml_unsigned2str(-i); - *(--c) = '-'; - return c; - } - - return yaml_unsigned2str((uint32_t)i); + snprintf(int2str_buffer, INT2STR_LEN, "%" PRId32, i); + return int2str_buffer; } -static const char _int2hex_lookup[] = {'0', '1', '2', '3', - '4', '5', '6', '7', - '8', '9', 'A', 'B', - 'C', 'D', 'E', 'F'}; - char* yaml_unsigned2hex(uint32_t i) { - char* c = int2str_buffer; - for (int n = sizeof(uint32_t) * 2; n > 0; n--) { - *(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF]; - } - *c = '\0'; + snprintf(int2str_buffer, INT2STR_LEN, "%08" PRIX32, i); return int2str_buffer; } char* yaml_rgb2hex(uint32_t i) { - char* c = int2str_buffer; - for (int n = 3 * 2; n > 0; n--) { - *(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF]; - } - *c = '\0'; + snprintf(int2str_buffer, INT2STR_LEN, "%06" PRIX32, i); return int2str_buffer; } @@ -250,4 +230,3 @@ int32_t yaml_to_signed(uint32_t i, uint32_t bits) return i; } - diff --git a/radio/src/storage/yaml/yaml_node.h b/radio/src/storage/yaml/yaml_node.h index c5a43a7d0e0..afa14b08ff5 100644 --- a/radio/src/storage/yaml/yaml_node.h +++ b/radio/src/storage/yaml/yaml_node.h @@ -42,11 +42,11 @@ enum YamlDataType { YDT_CUSTOM }; -struct YamlIdStr +PACK_NOT_SIMU(struct YamlIdStr { - int id; + int16_t id; const char* str; -}; +}); // return false if error typedef bool (*yaml_writer_func)(void* opaque, const char* str, size_t len); diff --git a/radio/src/telemetry/frsky_d.cpp b/radio/src/telemetry/frsky_d.cpp index 4ea6a491178..c21ff8a2b77 100644 --- a/radio/src/telemetry/frsky_d.cpp +++ b/radio/src/telemetry/frsky_d.cpp @@ -99,12 +99,12 @@ void frskyDProcessPacket(uint8_t module, const uint8_t *packet, uint8_t len) } } -struct FrSkyDSensor { +PACK_NOT_SIMU(struct FrSkyDSensor { const uint8_t id; - const TelemetryUnit unit; - const uint8_t prec; + const TelemetryUnit unit:6; + const uint8_t prec:2; const char * name; -}; +}); #define FS(id,name,unit,prec) {id,unit,prec,name} diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 7c7b9c083ea..652997ff59d 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -291,7 +291,7 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t module, uint8_t origin, const } else if (dataId == R9_PWR_ID) { // convert 'dBm' to 'mW' - static const uint32_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10}, + static const uint16_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10}, {13, 20}, {14, 25}, {20, 100}, {23, 200}, {27, 500}, {30, 1000}}; uint32_t dBm = SPORT_DATA_U8(packet); diff --git a/radio/util/hw_defs/hal_adc_inputs.jinja b/radio/util/hw_defs/hal_adc_inputs.jinja index cd947b3b890..19a860d0346 100644 --- a/radio/util/hw_defs/hal_adc_inputs.jinja +++ b/radio/util/hw_defs/hal_adc_inputs.jinja @@ -15,7 +15,7 @@ static const etx_hal_adc_input_t _main_inputs[] = { {% set flex_offset = n_mains %} {% set flex_inputs = adc_inputs.inputs | selectattr('type', '==', 'FLEX') | list %} {% set n_flex = flex_inputs | count %} -static etx_hal_adc_input_t _flex_inputs[] = { +static const etx_hal_adc_input_t _flex_inputs[] = { {% for input in flex_inputs %} { "{{ input.name }}", "{{ input.label }}", "{{ input.short_label }}" }, {% endfor %}