[all] Switch warnings can be enabled/disabled for each individual switch
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
+48
-37
@@ -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<NUM_SWITCHES; i++) {
|
||||
uint8_t line = attr;
|
||||
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
|
||||
uint8_t swactive = !(g_model.nSwToWarn & 1 << i);
|
||||
#if defined(PCBTARANIS)
|
||||
c = "\300-\301"[states & 0x03];
|
||||
lcd_putc(MODEL_SETUP_2ND_COLUMN+3+i*(2*FW), y, 'A'+i-1);
|
||||
lcd_putc(MODEL_SETUP_2ND_COLUMN+3+i*(2*FW)+FWNUM, y, c);
|
||||
states >>= 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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
+26
-12
@@ -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<NUM_SWITCHES-1; i++) {
|
||||
if (!(g_model.nSwToWarn & (1<<i))) {
|
||||
swstate_t mask = (0x03 << (i*2));
|
||||
if(!((states & mask) == (switches_states & mask)))
|
||||
warn = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
for (uint8_t i=0; i<MAX_PSWITCH-2; i++)
|
||||
if (!(g_model.nSwToWarn & (1<<(i-1))))
|
||||
if((states & (1 << i)) != (switches_states & (1 << i)))
|
||||
warn = true;
|
||||
#endif
|
||||
|
||||
if(!warn) return;
|
||||
|
||||
// first - display warning
|
||||
if (last_bad_switches != switches_states) {
|
||||
MESSAGE(STR_SWITCHWARN, NULL, STR_PRESSANYKEYTOSKIP, last_bad_switches == 0xff ? AU_SWITCH_ALERT : AU_NONE);
|
||||
#if defined(PCBTARANIS)
|
||||
for (uint8_t i=0; i<NUM_SWITCHES-1; i++) {
|
||||
swstate_t mask = (0x03 << (1+i*2));
|
||||
uint8_t attr = ((states & mask) == (switches_states & mask)) ? 0 : INVERS;
|
||||
char c = "\300-\301"[(states & mask) >> (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))) {
|
||||
swstate_t mask = (0x03 << (i*2));
|
||||
uint8_t attr = ((states & mask) == (switches_states & mask)) ? 0 : INVERS;
|
||||
char c = "\300-\301"[(states & mask) >> (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; i<MAX_PSWITCH-1; i++) {
|
||||
uint8_t attr = (states & (1 << i)) == (switches_states & (1 << i)) ? 0 : INVERS;
|
||||
putsSwitches(x, 5*FH, (i>2?(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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user