diff --git a/radio/src/gui/Taranis/view_main.cpp b/radio/src/gui/Taranis/view_main.cpp index 4e4956900..74f679f71 100755 --- a/radio/src/gui/Taranis/view_main.cpp +++ b/radio/src/gui/Taranis/view_main.cpp @@ -124,16 +124,16 @@ void doMainScreenGraphics() void displayTrims(uint8_t phase) { - for (uint8_t i=0; i<4; i++) { - static coord_t x[4] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X}; - static uint8_t vert[4] = {0,1,1,0}; + for (unsigned int i=0; i TRIM_MAX) { exttrim = true; @@ -166,6 +166,11 @@ void displayTrims(uint8_t phase) if (exttrim) { lcd_hline(xm-1, ym, 3); } + if (g_model.displayTrims != DISPLAY_TRIMS_NEVER) { + if ((g_model.displayTrims == DISPLAY_TRIMS_ALWAYS && dir != 0) || (trimsDisplayTimer > 0 && (trimsDisplayMask & (1<0 ? 25 : 57, xm-2, -abs(dir), TINSIZE|VERTICAL); + } + } } else { ym = 60; @@ -183,6 +188,11 @@ void displayTrims(uint8_t phase) if (exttrim) { lcd_vline(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 ? -9 : 22), ym-2, -abs(dir), TINSIZE); + } + } } lcd_square(xm-3, ym-3, 7, att); } diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 487b14c16..4af3a043a 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -896,6 +896,7 @@ enum menuModelSetupItems { CASE_CPUARM(ITEM_MODEL_TIMER3_COUNTDOWN_BEEP) ITEM_MODEL_EXTENDED_LIMITS, ITEM_MODEL_EXTENDED_TRIMS, + CASE_CPUARM(ITEM_MODEL_DISPLAY_TRIMS) ITEM_MODEL_TRIM_INC, CASE_PCBTARANIS(ITEM_MODEL_THROTTLE_LABEL) ITEM_MODEL_THROTTLE_REVERSED, @@ -1013,7 +1014,7 @@ void menuModelSetup(uint8_t event) #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) #define TIMER_ROWS 2, 0, CASE_PERSISTENT_TIMERS(0) 0, 0 bool CURSOR_ON_CELL = (m_posHorz >= 0); - MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, uint8_t(NAVIGATION_LINE_BY_LINE|getSwitchWarningsAllowed()), ONE_2x2POS_DEFINED() ? TITLE_ROW : HIDDEN_ROW, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, LABEL(InternalModule), 0, IF_INTERNAL_MODULE_ON(1), IF_INTERNAL_MODULE_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, uint8_t(NAVIGATION_LINE_BY_LINE|getSwitchWarningsAllowed()), ONE_2x2POS_DEFINED() ? TITLE_ROW : HIDDEN_ROW, POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, LABEL(InternalModule), 0, IF_INTERNAL_MODULE_ON(1), IF_INTERNAL_MODULE_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #elif defined(CPUARM) #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW) #define IF_EXTERNAL_MODULE_ON(x) (g_model.externalModule == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) @@ -1032,7 +1033,7 @@ void menuModelSetup(uint8_t event) #define EXTRA_MODULE_ROWS #endif #define TRAINER_MODULE_ROWS - MENU_TAB({ 0, 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, 0, LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); + MENU_TAB({ 0, 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, CASE_PCBTARANIS(LABEL(Throttle)) 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, 0, LABEL(ExternalModule), (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, EXTERNAL_MODULE_CHANNELS_ROWS(), (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW, IF_EXTERNAL_MODULE_XJT(FAILSAFE_ROWS(EXTERNAL_MODULE)), EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); #elif defined(CPUM64) #define CURSOR_ON_CELL (true) #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) @@ -1248,6 +1249,12 @@ void menuModelSetup(uint8_t event) #endif break; +#if defined(CPUARM) + case ITEM_MODEL_DISPLAY_TRIMS: + g_model.displayTrims = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, "Display Trims", "\006No\0 ChangeYes", g_model.displayTrims, 0, 2, attr, event); + break; +#endif + case ITEM_MODEL_TRIM_INC: g_model.trimInc = selectMenuItem(MODEL_SETUP_2ND_COLUMN, y, STR_TRIMINC, STR_VTRIMINC, g_model.trimInc, -2, 2, attr, event); break; diff --git a/radio/src/lcd.h b/radio/src/lcd.h index 9a7f83e76..ea6401a64 100644 --- a/radio/src/lcd.h +++ b/radio/src/lcd.h @@ -115,13 +115,14 @@ #define NO_UNIT 0x40 #if defined(CPUARM) - #define FONTSIZE(x) ((x) & 0x0F00) + #define FONTSIZE(x) ((x) & 0x0700) #define TINSIZE 0x0100 #define SMLSIZE 0x0200 #define MIDSIZE 0x0300 #define DBLSIZE 0x0400 #define XXLSIZE 0x0500 #define ERASEBG 0x8000 + #define VERTICAL 0x0800 #else #define DBLSIZE 0x04 #define MIDSIZE DBLSIZE diff --git a/radio/src/lcd_common.cpp b/radio/src/lcd_common.cpp index 19a85caea..cd05611a1 100644 --- a/radio/src/lcd_common.cpp +++ b/radio/src/lcd_common.cpp @@ -119,7 +119,10 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, } if (inv) plot = !plot; if (!blink) { - lcd_plot(x, y+j, plot ? FORCE : ERASE); + if (flags & VERTICAL) + lcd_plot(y+j, LCD_H-x, plot ? FORCE : ERASE); + else + lcd_plot(x, y+j, plot ? FORCE : ERASE); } } } diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 1947e109c..72676cf75 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -2034,6 +2034,13 @@ enum TelemetryType PROTOCOL_FRSKY_D_SECONDARY }; +enum DisplayTrims +{ + DISPLAY_TRIMS_NEVER, + DISPLAY_TRIMS_CHANGE, + DISPLAY_TRIMS_ALWAYS +}; + PACK(typedef struct { ModelHeader header; TimerData timers[MAX_TIMERS]; @@ -2042,7 +2049,8 @@ PACK(typedef struct { uint8_t thrTrim:1; // Enable Throttle Trim AVR_FIELD(int8_t ppmNCH:4) ARM_FIELD(uint8_t noGlobalFunctions:1) - ARM_FIELD(int8_t spare2:3) + ARM_FIELD(uint8_t displayTrims:2) + ARM_FIELD(uint8_t spare2:1) int8_t trimInc:3; // Trim Increments uint8_t disableThrottleWarning:1; ARM_FIELD(uint8_t displayChecklist:1) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 3e12e5c0c..5c21f2071 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -218,6 +218,13 @@ void per10ms() if (trimsCheckTimer) trimsCheckTimer--; if (ppmInValid) ppmInValid--; +#if defined(CPUARM) + if (trimsDisplayTimer) + trimsDisplayTimer--; + else + trimsDisplayMask = 0; +#endif + #if defined(RTCLOCK) /* Update global Date/Time every 100 per10ms cycles */ if (++g_ms100 == 100) { @@ -1281,6 +1288,11 @@ uint8_t checkTrim(uint8_t event) int before; bool thro; +#if defined(CPUARM) + trimsDisplayTimer = 200; // 2 seconds + trimsDisplayMask |= (1<