diff --git a/src/eeprom_conversions.cpp b/src/eeprom_conversions.cpp index 3442e3c5d..b14295e2a 100644 --- a/src/eeprom_conversions.cpp +++ b/src/eeprom_conversions.cpp @@ -107,6 +107,8 @@ PACK(typedef struct { }) MixData_v215; #endif + + PACK(typedef struct { int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw uint16_t start:12; @@ -419,7 +421,7 @@ void ConvertModel_215_to_216(ModelData &model) memcpy(&g_model.phaseData[i], &oldModel.phaseData[i], sizeof(oldModel.phaseData[i])); // the last 4 gvars will remain blank } g_model.thrTraceSrc = oldModel.thrTraceSrc; - g_model.switchWarningStates = oldModel.switchWarningStates; + g_model.switchWarningStates = oldModel.switchWarningStates >> 1; for (uint8_t i=0; i<5; i++) { memcpy(g_model.gvars[i].name, oldModel.gvar_names[i], LEN_GVAR_NAME); } diff --git a/src/gui/menu_model.cpp b/src/gui/menu_model.cpp index d94e42ebf..b3e5381ea 100644 --- a/src/gui/menu_model.cpp +++ b/src/gui/menu_model.cpp @@ -953,19 +953,19 @@ void menuModelSetup(uint8_t event) #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) bool CURSOR_ON_CELL = (m_posHorz >= 0); - MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_PORT1_ON(FAILSAFE_ROWS(0)), LABEL(ExternalModule), (g_model.externalModule==MODULE_TYPE_XJT || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_XJT(1) && IS_D8_RX(1)) ? (uint8_t)1 : (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) || IS_MODULE_DSM2(1)) ? (uint8_t)2 : HIDDEN_ROW, IF_PORT2_XJT(FAILSAFE_ROWS(1)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), LABEL(InternalModule), 0, IF_PORT1_ON(1), IF_PORT1_ON(IS_D8_RX(0) ? (uint8_t)1 : (uint8_t)2), IF_PORT1_ON(FAILSAFE_ROWS(0)), LABEL(ExternalModule), (g_model.externalModule==MODULE_TYPE_XJT || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0, PORT2_CHANNELS_ROWS(), (IS_MODULE_XJT(1) && IS_D8_RX(1)) ? (uint8_t)1 : (IS_MODULE_PPM(1) || IS_MODULE_XJT(1) || IS_MODULE_DSM2(1)) ? (uint8_t)2 : HIDDEN_ROW, IF_PORT2_XJT(FAILSAFE_ROWS(1)), LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #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) uint8_t protocol = g_model.protocol; - MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2 }); + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2 }); #else #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) uint8_t protocol = g_model.protocol; - MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, IF_PCBSKY9X(1) IF_PCBSKY9X(2) }); + MENU_TAB({ 0, 0, CASE_PCBTARANIS(0) 2, IF_PERSISTENT_TIMERS(0) 0, 0, 2, IF_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, 5, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, IF_PCBSKY9X(1) IF_PCBSKY9X(2) }); #endif if (!MENU_CHECK(menuTabModel, e_ModelSetup, MODEL_SETUP_MAX_LINES)) { @@ -1138,8 +1138,7 @@ void menuModelSetup(uint8_t event) { lcd_putsLeft(y, STR_SWITCHWARNING); swstate_t states = g_model.switchWarningStates; - char c = !(states & 1); - menu_lcd_onoff(MODEL_SETUP_2ND_COLUMN, y, c, attr); + char c; if (attr) { s_editMode = 0; switch(event) { @@ -1147,45 +1146,48 @@ void menuModelSetup(uint8_t event) if (!READ_ONLY()) { killEvents(event); getMovedSwitch(); - g_model.switchWarningStates = 0x01 + (switches_states << 1); - } - // no break - CASE_EVT_ROTARY_BREAK - case EVT_KEY_BREAK(KEY_ENTER): -#if !defined(PCBTARANIS) - case EVT_KEY_BREAK(KEY_LEFT): - case EVT_KEY_BREAK(KEY_RIGHT): -#endif - if (!READ_ONLY()) { - g_model.switchWarningStates ^= 0x01; + g_model.switchWarningStates = switches_states; eeDirty(EE_MODEL); } break; + CASE_EVT_ROTARY_BREAK + case EVT_KEY_BREAK(KEY_ENTER): + if (!READ_ONLY()) { + killEvents(event); + g_model.nSwToWarn ^= (1 << m_posHorz); + eeDirty(EE_MODEL); + } + break; } } - if (c) { - states >>= 1; - for (uint8_t i=1; i>= 2; + c = "\300-\301"[states & 0x03]; + lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+i*(2*FW), y, 'A'+i, line && (m_posHorz == i) ? BLINK : 0); + if(swactive) lcd_putc(MODEL_SETUP_2ND_COLUMN+i*(2*FW)+FWNUM, y, c); + states >>= 2; #else - attr = 0; - if (IS_3POS(i-1)) { - c = '0'+(states & 0x03); - states >>= 2; - } - else { - if (states & 0x01) - attr = INVERS; - c = pgm_read_byte(STR_VSWITCHES - 2 + 6 + (3*i)); - states >>= 1; - } - lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+2*FW+i*FW, y, c, attr); -#endif + attr = 0; + + if (IS_3POS(i)) { + c = '0'+(states & 0x03); + states >>= 2; } + else { + if (states & 0x01) + attr = INVERS; + c = pgm_read_byte(STR_VSWITCHES - 2 + 9 + (3*i)); + states >>= 1; + } + if(line && (m_posHorz == i)) { + attr = BLINK; + if(swactive) + attr |= INVERS; + } + if(swactive || (attr & BLINK)) lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+i*FW, y, c, attr); +#endif } break; } @@ -5167,6 +5169,7 @@ enum menuModelTelemetryItems { #endif ITEM_TELEMETRY_USR_VOLTAGE_SOURCE, ITEM_TELEMETRY_USR_CURRENT_SOURCE, + ITEM_TELEMETRY_FAS_OFFSET, #if defined(CPUARM) ITEM_TELEMTETRY_PERSISTENT_MAH, #endif @@ -5249,7 +5252,7 @@ enum menuModelTelemetryItems { void menuModelTelemetry(uint8_t event) { - MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, CHANNEL_ROWS CHANNEL_ROWS RSSI_ROWS USRDATA_LINES 0, 0, IF_CPUARM(0) IF_VARIO(LABEL(Vario)) IF_VARIO(0) IF_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) SCREEN_TYPE_ROWS, 2, 2, 2, 2, SCREEN_TYPE_ROWS, 2, 2, 2, 2, IF_CPUARM(SCREEN_TYPE_ROWS) IF_CPUARM(2) IF_CPUARM(2) IF_CPUARM(2) IF_CPUARM(2) }); + MENU(STR_MENUTELEMETRY, menuTabModel, e_Telemetry, ITEM_TELEMETRY_MAX+1, {0, CHANNEL_ROWS CHANNEL_ROWS RSSI_ROWS USRDATA_LINES 0, 0, 0, IF_CPUARM(0) IF_VARIO(LABEL(Vario)) IF_VARIO(0) IF_VARIO(VARIO_RANGE_ROWS) CASE_PCBTARANIS(LABEL(TopBar)) CASE_PCBTARANIS(0) SCREEN_TYPE_ROWS, 2, 2, 2, 2, SCREEN_TYPE_ROWS, 2, 2, 2, 2, IF_CPUARM(SCREEN_TYPE_ROWS) IF_CPUARM(2) IF_CPUARM(2) IF_CPUARM(2) IF_CPUARM(2) }); uint8_t sub = m_posVert - 1; @@ -5420,6 +5423,14 @@ void menuModelTelemetry(uint8_t event) if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.frsky.currentSource, 3); break; + case ITEM_TELEMETRY_FAS_OFFSET: + lcd_putsLeft(y, STR_FAS_OFFSET); + lcd_outdezAtt(TELEM_COL2, y, g_model.frsky.fasOffset, attr|LEFT|PREC1); + lcd_outdezAtt(TELEM_COL2+6*FW, y, frskyData.hub.current, LEFT|PREC1); + lcd_putc(TELEM_COL2+8*FW, y, 'A'); + if (attr) g_model.frsky.fasOffset = checkIncDec(event, g_model.frsky.fasOffset, -15, 15, EE_MODEL); + break; + #if defined(CPUARM) case ITEM_TELEMTETRY_PERSISTENT_MAH: g_model.frsky.mAhPersistent = onoffMenuItem(g_model.frsky.mAhPersistent, TELEM_COL2, y, STR_PERSISTENT_MAH, attr, event); diff --git a/src/myeeprom.h b/src/myeeprom.h index 60238e09d..c40cfbbb2 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -988,6 +988,8 @@ PACK(typedef struct t_FrSkyData { FrSkyRSSIAlarm rssiAlarms[2]; uint16_t mAhPersistent:1; uint16_t storedMah:15; + int8_t fasOffset:5; + uint8_t spare:3; }) FrSkyData; #else #define MAX_FRSKY_SCREENS 2 @@ -1005,6 +1007,8 @@ PACK(typedef struct t_FrSkyData { int8_t varioCenterMin:5; uint8_t currentSource:3; int8_t varioCenterMax:5; + int8_t fasOffset:5; + uint8_t spare:3; }) FrSkyData; #endif @@ -1437,6 +1441,7 @@ PACK(typedef struct t_ModelData { uint8_t thrTraceSrc; swstate_t switchWarningStates; + uint8_t nSwToWarn; MODEL_GVARS_DATA diff --git a/src/opentx.cpp b/src/opentx.cpp index d1612ec1d..267f2919b 100644 --- a/src/opentx.cpp +++ b/src/opentx.cpp @@ -2183,29 +2183,43 @@ void checkSwitches() #endif getMovedSwitch(); - - switches_states <<= 1; - - if ((states & 0x01) || (states == switches_states)) { - return; + + uint8_t warn = false; +#if defined(PCBTARANIS) + for (uint8_t i=0; i> (1+i*2)]; - lcd_putcAtt(60+i*(2*FW+FW/2), 5*FH, 'A'+i, attr); - lcd_putcAtt(60+i*(2*FW+FW/2)+FW, 5*FH, c, attr); + if(!(g_model.nSwToWarn & (1<> (i*2)]; + lcd_putcAtt(60+i*(2*FW+FW/2), 5*FH, 'A'+i, attr); + lcd_putcAtt(60+i*(2*FW+FW/2)+FW, 5*FH, c, attr); + } } #else uint8_t x = 2; for (uint8_t i=1; i2?(i+1):1+((states>>1)&0x3)), attr); + uint8_t attr = (states & (1 << (i-1))) == (switches_states & (1 << (i-1))) ? 0 : INVERS; + if(!(g_model.nSwToWarn & (1<<(i-2)))) putsSwitches(x, 5*FH, (i>2?(i+1):1+((states>>1)&0x3)), attr); if (i == 1 && attr) i++; if (i != 1) x += 3*FW+FW/2; }