diff --git a/src/Makefile b/src/Makefile index 0f3004ae5..8b3ea8797 100644 --- a/src/Makefile +++ b/src/Makefile @@ -113,9 +113,10 @@ PWM_BACKLIGHT = NO # Values = YES, NO, FIXED SPLASH = YES -# GRAPHICS (sliders / checkboxes / bold) +# GRAPHICS (sliders / checkboxes / bold / batt graph) GRAPHICS = YES BOLD = YES +BATTGRAPH = YES # THR trace (in STATS screen) THR_TRACE = YES @@ -389,6 +390,12 @@ ifeq ($(BOLD), YES) CPPDEFS += -DBOLD_FONT endif +ifneq ($(PCB), X9D) + ifeq ($(BATTGRAPH), YES) + CPPDEFS += -DBATTGRAPH + endif +endif + ifeq ($(THR_TRACE), YES) CPPDEFS += -DTHRTRACE endif diff --git a/src/frsky.cpp b/src/frsky.cpp index 2e431650b..163fc3a03 100644 --- a/src/frsky.cpp +++ b/src/frsky.cpp @@ -1039,9 +1039,9 @@ int16_t convertCswTelemValue(CustomSwData * cs) { int16_t val; if (CS_STATE(cs->func)==CS_VOFS) - val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2); + val = convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128+cs->v2); else - val = convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128+cs->v2) - convertTelemValue(cs->v1 - MIXSRC_LAST_CH, 128); + val = convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128+cs->v2) - convertTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1, 128); return val; } @@ -1308,7 +1308,7 @@ void menuTelemetryFrsky(uint8_t event) uint8_t y = barHeight+6+i*(barHeight+6); lcd_putsiAtt(0, y+barHeight-5, STR_VTELEMCHNS, source, 0); lcd_rect(25, y, 101, barHeight+2); - int16_t value = getValue(MIXSRC_LAST_CH+source-1); + int16_t value = getValue(MIXSRC_FIRST_TELEM+source-2); int16_t threshold = 0; uint8_t thresholdX = 0; if (source <= TELEM_TM2) @@ -1381,7 +1381,7 @@ void menuTelemetryFrsky(uint8_t event) } if (field) { fields_count++; - int16_t value = getValue(MIXSRC_LAST_CH+field-1); + int16_t value = getValue(MIXSRC_FIRST_TELEM+field-2); uint8_t att = (i==3 ? NO_UNIT : DBLSIZE|NO_UNIT); if (field >= TELEM_TM1 && field <= TELEM_TM2) { uint8_t x = (i==3 ? j?80:20 : j?74:10); diff --git a/src/general_menus.cpp b/src/general_menus.cpp index 26f4fe31e..6aadfe89f 100644 --- a/src/general_menus.cpp +++ b/src/general_menus.cpp @@ -76,8 +76,8 @@ const MenuFuncP_PROGMEM menuTabDiag[] PROGMEM = { #define RADIO_SETUP_DATE_COLUMN RADIO_SETUP_2ND_COLUMN + 4*FWNUM #define RADIO_SETUP_TIME_COLUMN RADIO_SETUP_2ND_COLUMN + 2*FWNUM #else -#define RADIO_SETUP_2ND_COLUMN (LCD_W-5*FW-MENUS_SCROLLBAR_WIDTH) -#define RADIO_SETUP_TIME_COLUMN (FW*15+5) +#define RADIO_SETUP_2ND_COLUMN (LCD_W-6*FW-3-MENUS_SCROLLBAR_WIDTH) +#define RADIO_SETUP_TIME_COLUMN (FW*15+9) #define RADIO_SETUP_DATE_COLUMN (FW*15+5) #endif @@ -114,6 +114,7 @@ const MenuFuncP_PROGMEM menuTabDiag[] PROGMEM = { enum menuGeneralSetupItems { IF_RTCLOCK(ITEM_SETUP_DATE) IF_RTCLOCK(ITEM_SETUP_TIME) + IF_BATTGRAPH(ITEM_SETUP_BATT_RANGE) ITEM_SETUP_SOUND_LABEL, ITEM_SETUP_BEEPER_MODE, ITEM_SETUP_BEEPER_LENGTH, @@ -166,7 +167,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/}); + MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), 0, 0, IF_AUDIO(0) IF_VOICE(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) IF_PCBSKY9X(0) IF_9X(0) LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_CPUARM(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) 0, LABEL(TIMER_EVENTS), 0, 0, LABEL(BACKLIGHT), 0, 0, CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_FRSKY(0) IF_FRSKY(0) 0, LABEL(TX_MODE), CASE_PCBX9D(0) 1/*to force edit mode*/}); uint8_t sub = m_posVert - 1; @@ -233,6 +234,21 @@ void menuGeneralSetup(uint8_t event) break; #endif +#if defined(BATTGRAPH) + case ITEM_SETUP_BATT_RANGE: + lcd_putsLeft(y, PSTR("Battery Range")); + lcd_putc(g_eeGeneral.vBatMin >= 10 ? RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-1 : RADIO_SETUP_2ND_COLUMN+2*FW+FWNUM-FW/2, y, '-'); + putsVolts(RADIO_SETUP_2ND_COLUMN, y, 90+g_eeGeneral.vBatMin, (m_posHorz==0 ? attr : 0)|LEFT|NO_UNIT); + putsVolts(RADIO_SETUP_2ND_COLUMN+4*FW-2, y, 120+g_eeGeneral.vBatMax, (m_posHorz!=0 ? attr : 0)|LEFT|NO_UNIT); + if (attr && s_editMode>0) { + if (m_posHorz==0) + CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMin, -50, g_eeGeneral.vBatMax+20); // min=4.0V + else + CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatMax, g_eeGeneral.vBatMin-20, +40); // max=16.0V + } + break; +#endif + case ITEM_SETUP_SOUND_LABEL: lcd_putsLeft(y, STR_SOUND_LABEL); break; @@ -327,7 +343,7 @@ void menuGeneralSetup(uint8_t event) break; case ITEM_SETUP_BATTERY_WARNING: - lcd_putsLeft( y,STR_BATTERYWARNING); + lcd_putsLeft(y, STR_BATTERYWARNING); putsVolts(RADIO_SETUP_2ND_COLUMN, y, g_eeGeneral.vBatWarn, attr|LEFT); if(attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.vBatWarn, 40, 120); //4-12V break; diff --git a/src/lcd.cpp b/src/lcd.cpp index 1664b30c6..f45590652 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -771,8 +771,12 @@ void putsMixerSource(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags att) putsStrIdx(x, y, STR_PPM, idx-MIXSRC_PPM1+1, att); else if (idx <= MIXSRC_LAST_CH) putsStrIdx(x, y, STR_CH, idx-MIXSRC_CH1+1, att); +#if defined(GVARS) + else if (idx <= MIXSRC_LAST_GVAR) + putsStrIdx(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); +#endif else - lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_LAST_CH, att); + lcd_putsiAtt(x, y, STR_VTELEMCHNS, idx-MIXSRC_FIRST_TELEM+1, att); } void putsChnLetter(xcoord_t x, uint8_t y, uint8_t idx, LcdFlags attr) diff --git a/src/main_views.cpp b/src/main_views.cpp index 894708dfd..154bc541c 100644 --- a/src/main_views.cpp +++ b/src/main_views.cpp @@ -224,9 +224,30 @@ void displayTimers() } #endif +void displayBattVoltage() +{ +#if defined(BATTGRAPH) + putsVBat(VBATT_X-8, VBATT_Y+1, 0); + lcd_filled_rect(VBATT_X-25, VBATT_Y+9, 22, 5); + lcd_vline(VBATT_X-3, VBATT_Y+10, 3); + uint8_t count = limit(2, 20 * (g_vbat100mV - g_eeGeneral.vBatMin - 90) / (30 + g_eeGeneral.vBatMax - g_eeGeneral.vBatMin), 20); + for (uint8_t i=0; i g_eeGeneral.vBatWarn || BLINK_ON_PHASE) + lcd_filled_rect(VBATT_X-26, VBATT_Y, 25, 15); +#else + LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE; + putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT); +#if LCD_W >= 212 + lcd_putcAtt(VBATTUNIT_X, VBATTUNIT_Y, 'v', MIDSIZE); +#else + lcd_putc(VBATT_X, VBATTUNIT_Y, 'V'); +#endif +#endif +} #if defined(CPUARM) -void displayVoltage() +void displayVoltageOrAlarm() { if (g_vbat100mV > g_eeGeneral.vBatWarn && g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { putsTelemetryValue(6*FW-1, 3*FH, getTemperature(), UNIT_DEGREES, BLINK|INVERS|DBLSIZE); @@ -237,22 +258,11 @@ void displayVoltage() } #endif else { - LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE; - putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT); -#if LCD_W >= 212 - lcd_putcAtt(VBATTUNIT_X, VBATTUNIT_Y, 'v', MIDSIZE); -#else - lcd_putc(VBATT_X, VBATTUNIT_Y, 'V'); -#endif + displayBattVoltage(); } } #else -void displayVoltage() -{ - LcdFlags att = (g_vbat100mV <= g_eeGeneral.vBatWarn ? BLINK|INVERS : 0) | BIGSIZE; - putsVBat(VBATT_X-1, VBATT_Y, att|NO_UNIT); - lcd_putc(VBATT_X, VBATTUNIT_Y, 'V'); -} + #define displayVoltageOrAlarm() displayBattVoltage() #endif #if defined(PCBX9D) || defined(PCBACT) @@ -431,7 +441,7 @@ void menuMainView(uint8_t event) putsModelName(MODELNAME_X, 0*FH, g_model.name, g_eeGeneral.currModel, BIGSIZE); // Main Voltage (or alarm if any) - displayVoltage(); + displayVoltageOrAlarm(); // Timers displayTimers(); diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 4b1194569..ccd8cb1d3 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -899,6 +899,7 @@ void menuModelSetup(uint8_t event) getMovedSwitch(); g_model.switchWarningStates = 0x01 + (switches_states << 1); // no break + CASE_EVT_ROTARY_BREAK case EVT_KEY_BREAK(KEY_ENTER): #if !defined(PCBX9D) case EVT_KEY_BREAK(KEY_LEFT): @@ -1036,7 +1037,7 @@ void menuModelSetup(uint8_t event) lcd_outdezAtt(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.ppmDelay*50)+300, m_posHorz==1 ? attr : 0); lcd_putcAtt(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.pulsePol ? '+' : '-', m_posHorz==2 ? attr : 0); - if(attr && (editMode>0 || p1valdiff)) { + if (attr && (editMode>0 || p1valdiff)) { switch (m_posHorz) { case 0: CHECK_INCDEC_MODELVAR(event, g_model.ppmFrameLength, -20, 35); @@ -3021,7 +3022,7 @@ void menuModelCustomSwitchOne(uint8_t event) case CSW_FIELD_V1: { lcd_putsLeft(y, STR_V1); - int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY; + int8_t v1_min=0, v1_max=MIXSRC_LAST_TELEM; if (cstate == CS_VBOOL) { putsSwitches(CSWONE_2ND_COLUMN, y, cs->v1, attr); v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1; @@ -3037,7 +3038,7 @@ void menuModelCustomSwitchOne(uint8_t event) case CSW_FIELD_V2: { lcd_putsLeft(y, STR_V2); - int8_t v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY; + int8_t v2_min=0, v2_max=MIXSRC_LAST_TELEM; if (cstate == CS_VBOOL) { putsSwitches(CSWONE_2ND_COLUMN, y, cs->v2, attr); v2_min = SWSRC_OFF+1; v2_max = SWSRC_OFF-1; @@ -3047,9 +3048,9 @@ void menuModelCustomSwitchOne(uint8_t event) } else { #if defined(FRSKY) - if (cs->v1 > MIXSRC_LAST_CH) { - putsTelemetryChannel(CSWONE_2ND_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), attr|LEFT); - v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH); + if (cs->v1 >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannel(CSWONE_2ND_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), attr|LEFT); + v2_max = maxTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1); if (cstate == CS_VOFS) { v2_min = -128; v2_max -= 128; @@ -3158,8 +3159,8 @@ void menuModelCustomSwitches(uint8_t event) putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); #if defined(FRSKY) - if (cs->v1 > MIXSRC_LAST_CH) { - putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), 0); + if (cs->v1 >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), 0); } else #endif @@ -3205,7 +3206,7 @@ void menuModelCustomSwitches(uint8_t event) // CSW params uint8_t cstate = CS_STATE(cs->func); - int8_t v1_min=0, v1_max=MIXSRC_LAST_CH+NUM_TELEMETRY, v2_min=0, v2_max=MIXSRC_LAST_CH+NUM_TELEMETRY; + int8_t v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM; if (cstate == CS_VBOOL) { putsSwitches(CSW_2ND_COLUMN, y, cs->v1, m_posHorz==1 ? attr : 0); @@ -3221,9 +3222,9 @@ void menuModelCustomSwitches(uint8_t event) putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, (m_posHorz==1 ? attr : 0)); #if defined(FRSKY) - if (cs->v1 > MIXSRC_LAST_CH) { - putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_LAST_CH - 1, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0); - v2_max = maxTelemValue(cs->v1 - MIXSRC_LAST_CH); + if (cs->v1 >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), m_posHorz==2 ? attr : 0); + v2_max = maxTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1); if (cstate == CS_VOFS) { v2_min = -128; v2_max -= 128; @@ -3348,37 +3349,49 @@ void menuModelCustomFunctions(uint8_t event) case 1: if (sd->swtch) { uint8_t func_displayed; - if (sd->func < FUNC_TRAINER) { + if (CFN_FUNC(sd) < FUNC_TRAINER) { func_displayed = 0; - putsChn(MODEL_CUSTOM_FUNC_2ND_COLUMN+6*FW, y, sd->func+1, attr); + putsChn(MODEL_CUSTOM_FUNC_2ND_COLUMN+6*FW, y, CFN_CH_NUMBER(sd)+1, attr); } - else if (sd->func < 16 + NUM_STICKS + 1) { + else if (CFN_FUNC(sd) <= FUNC_TRAINER + NUM_STICKS) { func_displayed = 1; - if (sd->func != FUNC_TRAINER) - putsMixerSource(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, sd->func-FUNC_TRAINER, attr); + if (CFN_FUNC(sd) != FUNC_TRAINER) + putsMixerSource(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, CFN_FUNC(sd)-FUNC_TRAINER, attr); } #if defined(DEBUG) - else if (sd->func == FUNC_TEST) { + else if (CFN_FUNC(sd) == FUNC_TEST) { #if defined(GVARS) - func_displayed = FUNC_TEST - 16 - NUM_STICKS - MAX_GVARS + 2; + func_displayed = FUNC_TEST - FUNC_TRAINER - NUM_STICKS - MAX_GVARS + 2; #else - func_displayed = FUNC_TEST - 16 - NUM_STICKS + 1; + func_displayed = FUNC_TEST - FUNC_TRAINER - NUM_STICKS + 1; #endif } #endif #if defined(GVARS) - else if (sd->func >= FUNC_ADJUST_GV1) { - func_displayed = FUNC_ADJUST_GV1 - 16 - NUM_STICKS + 1; - putsStrIdx(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, STR_GV, sd->func-FUNC_ADJUST_GV1+1, attr); + else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1) { + func_displayed = FUNC_ADJUST_GV1 - FUNC_TRAINER - NUM_STICKS + 1; + putsStrIdx(MODEL_CUSTOM_FUNC_2ND_COLUMN+7*FW, y, STR_GV, CFN_FUNC(sd)-FUNC_ADJUST_GV1+1, attr); } #endif else { - func_displayed = 2 + sd->func - 16 - NUM_STICKS - 1; + func_displayed = 2 + CFN_FUNC(sd) - FUNC_TRAINER - NUM_STICKS - 1; } lcd_putsiAtt(MODEL_CUSTOM_FUNC_2ND_COLUMN, y, STR_VFSWFUNC, func_displayed, attr); if (active) { - CHECK_INCDEC_MODELVAR_ZERO(event, sd->func, FUNC_MAX-1); - if (checkIncDec_Ret) CFN_RESET_PARAM(sd); +#if defined(CPUARM) + CHECK_INCDEC_MODELVAR_ZERO(event, CFN_FUNC(sd), FUNC_MAX-1); + if (checkIncDec_Ret) + CFN_RESET_PARAM(sd); +#else + if (CFN_FUNC(sd) < FUNC_TRAINER) { + CHECK_INCDEC_MODELVAR_ZERO(event, sd->internal.func_safety.func, 16); + } + else { + CHECK_INCDEC_MODELVAR_ZERO(event, CFN_FUNC(sd), FUNC_MAX-1); + if (CFN_FUNC(sd) < FUNC_TRAINER) + sd->internal.func_safety.func = 15; + } +#endif } } else if (attr) { @@ -3391,7 +3404,7 @@ void menuModelCustomFunctions(uint8_t event) int16_t val_displayed = CFN_PARAM(sd); int8_t val_min = 0; uint8_t val_max = 255; - if (sd->func == FUNC_PLAY_SOUND) { + if (CFN_FUNC(sd) == FUNC_PLAY_SOUND) { #if defined(AUDIO) val_max = AU_FRSKY_LAST-AU_FRSKY_FIRST-1; lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_FUNCSOUNDS, val_displayed, attr); @@ -3400,54 +3413,69 @@ void menuModelCustomFunctions(uint8_t event) #endif } #if defined(HAPTIC) - else if (sd->func == FUNC_HAPTIC) { + else if (CFN_FUNC(sd) == FUNC_HAPTIC) { val_max = 3; lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); } #endif #if defined(CPUARM) && defined(SDCARD) - else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_BACKGND_MUSIC) { - uint8_t x = (sd->func == FUNC_PLAY_TRACK ? MODEL_CUSTOM_FUNC_2ND_COLUMN + FW + FW*strlen(TR_PLAY_TRACK) : MODEL_CUSTOM_FUNC_3RD_COLUMN); - if (ZLEN(sd->param)) - lcd_putsnAtt(x, y, sd->param, sizeof(sd->param), attr); + else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_BACKGND_MUSIC) { + uint8_t x = (CFN_FUNC(sd) == FUNC_PLAY_TRACK ? MODEL_CUSTOM_FUNC_2ND_COLUMN + FW + FW*strlen(TR_PLAY_TRACK) : MODEL_CUSTOM_FUNC_3RD_COLUMN); + if (ZLEN(sd->param.name)) + lcd_putsnAtt(x, y, sd->param.name, sizeof(sd->param.name), attr); else lcd_putsiAtt(x, y, STR_VCSWFUNC, 0, attr); if (active && event==EVT_KEY_BREAK(KEY_ENTER)) { s_editMode = 0; _event = 0; - if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, sizeof(sd->param), sd->param)) { + if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, sizeof(sd->param.name), sd->param.name)) { s_warning = STR_NO_SOUNDS_ON_SD; s_menu_flags = 0; } } break; } - else if (sd->func == FUNC_PLAY_VALUE) { - val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1; + else if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) { + val_max = MIXSRC_FIRST_TELEM + TELEM_DISPLAY_MAX - 2; putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr); } #endif #if defined(CPUARM) - else if (sd->func == FUNC_VOLUME) { + else if (CFN_FUNC(sd) == FUNC_VOLUME) { val_max = MIXSRC_LAST_CH-1; putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr); } #elif defined(VOICE) - else if (sd->func == FUNC_PLAY_TRACK) { + else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK) { +#if defined(GVARS) + if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + s_editMode = !s_editMode; + active = true; + val_displayed = (val_displayed > 250 ? 0 : 251); + } + if (val_displayed > 250) { + putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed-250, attr); + } + else { + lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT); + } +#else lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+PROMPT_CUSTOM_BASE, attr|LEFT); +#endif } - else if (sd->func == FUNC_PLAY_BOTH) { + else if (CFN_FUNC(sd) == FUNC_PLAY_BOTH) { lcd_putcAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN-2+3*FWNUM, y, '|', attr); lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+3*FWNUM, y, val_displayed+PROMPT_CUSTOM_BASE, attr); lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN+2+3*FWNUM, y, (val_displayed+PROMPT_CUSTOM_BASE+1)%10, attr|LEFT); } - else if (sd->func == FUNC_PLAY_VALUE) { - val_max = MIXSRC_LAST_CH + TELEM_DISPLAY_MAX - 1; + else if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) { + val_max = MIXSRC_FIRST_TELEM + TELEM_DISPLAY_MAX - 2; putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr); } #endif #if defined(SDCARD) - else if (sd->func == FUNC_LOGS) { + else if (CFN_FUNC(sd) == FUNC_LOGS) { if (val_displayed) { lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|PREC1|LEFT); lcd_putc(lcdLastPos, y, 's'); @@ -3457,23 +3485,46 @@ void menuModelCustomFunctions(uint8_t event) } } #endif - else if (sd->func == FUNC_RESET) { + else if (CFN_FUNC(sd) == FUNC_RESET) { val_max = 3; lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_VFSWRESET, CFN_PARAM(sd), attr); } - else if (sd->func <= FUNC_SAFETY_CH16) { + else if (CFN_FUNC(sd) < FUNC_TRAINER) { val_displayed = (int8_t)CFN_PARAM(sd); val_min = -125; val_max = 125; lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); } #if defined(GVARS) - else if (sd->func >= FUNC_ADJUST_GV1 + else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1 #if defined(DEBUG) - && sd->func != FUNC_TEST + && CFN_FUNC(sd) <= FUNC_ADJUST_GV5 #endif ) { - val_max = MIXSRC_LAST_CH-1; - putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr); + switch (CFN_GVAR_MODE(sd)) { + case 0: + val_min = -125; val_max = +125; + lcd_outdezAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT); + break; + case 1: + val_max = MIXSRC_LAST_CH-1; + putsMixerSource(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, val_displayed+1, attr); + break; + case 2: + val_max = MAX_GVARS-1; + putsStrIdx(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, STR_GV, val_displayed+1, attr); + break; + default: + val_max = 1; + lcd_putsiAtt(MODEL_CUSTOM_FUNC_3RD_COLUMN, y, PSTR("\002+1-1"), val_displayed, attr); + break; + } + + if (attr && event==EVT_KEY_LONG(KEY_ENTER)) { + s_editMode = !s_editMode; + killEvents(event); + CFN_GVAR_MODE(sd) += 1; + val_displayed = 0; + } } #endif else { @@ -3491,24 +3542,31 @@ void menuModelCustomFunctions(uint8_t event) break; case 3: - if (sd->swtch && sd->func <= FUNC_INSTANT_TRIM) { - menu_lcd_onoff(MODEL_CUSTOM_FUNC_4TH_COLUMN, y, sd->active, attr); - if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 1); + if (sd->swtch && (CFN_FUNC(sd) <= FUNC_INSTANT_TRIM +#if defined(GVARS) + || CFN_FUNC(sd) >= FUNC_ADJUST_GV1 +#endif +#if defined(CPUARM) + || CFN_FUNC(sd) == FUNC_VOLUME +#endif + )) { + menu_lcd_onoff(MODEL_CUSTOM_FUNC_4TH_COLUMN, y, CFN_ACTIVE(sd), attr); + if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_ACTIVE(sd), 1); } #if defined(VOICE) - else if (sd->swtch && sd->func >= FUNC_PLAY_TRACK && sd->func <= FUNC_PLAY_VALUE) { + else if (sd->swtch && CFN_FUNC(sd) >= FUNC_PLAY_TRACK && CFN_FUNC(sd) <= FUNC_PLAY_VALUE) { #if defined(CPUARM) - if (sd->active) - lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, sd->active*5, attr); + if (CFN_PLAY_REPEAT(sd)) + lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(sd)*5, attr); else lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr); - if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 12); + if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_PLAY_REPEAT(sd), 12); #else - if (sd->active) - lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, 15 << (sd->active-1), attr); + if (CFN_PLAY_REPEAT(sd)) + lcd_outdezAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2+FW, y, CFN_PLAY_REPEAT(sd)*10, attr); else lcd_putcAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+1, y, '-', attr); - if (active) CHECK_INCDEC_MODELVAR_ZERO(event, sd->active, 3); + if (active) CHECK_INCDEC_MODELVAR_ZERO(event, CFN_PLAY_REPEAT(sd), 6); #endif } #endif @@ -3532,7 +3590,7 @@ void menuModelCustomFunctions(uint8_t event) } else { // The user choosed a wav file in the list - memcpy(g_model.funcSw[sub].param, result, sizeof(g_model.funcSw[sub].param)); + memcpy(g_model.funcSw[sub].param.name, result, sizeof(g_model.funcSw[sub].param.name)); eeDirty(EE_MODEL); } } diff --git a/src/myeeprom.h b/src/myeeprom.h index 3cb2f0f8c..194a21228 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -190,6 +190,8 @@ PACK(typedef struct t_EEGeneral { uint8_t unexpectedShutdown:1; uint8_t speakerPitch; int8_t speakerVolume; + int8_t vBatMin; + int8_t vBatMax; EXTRA_GENERAL_FIELDS; @@ -345,8 +347,15 @@ PACK(typedef struct t_CustomSwData { // Custom Switches data #endif enum Functions { +#if defined(CPUARM) FUNC_SAFETY_CH1, FUNC_SAFETY_CH16=FUNC_SAFETY_CH1+15, +#else + FUNC_SAFETY_GROUP1, + FUNC_SAFETY_GROUP2, + FUNC_SAFETY_GROUP3, + FUNC_SAFETY_GROUP4, +#endif FUNC_TRAINER, FUNC_TRAINER_RUD, FUNC_TRAINER_ELE, @@ -401,20 +410,52 @@ enum ResetFunctionParam { #if defined(CPUARM) PACK(typedef struct t_CustomFnData { // Function Switches data - int8_t swtch; //input + int8_t swtch; uint8_t func; - char param[6]; - uint8_t active; + union { + char name[6]; + struct { + uint32_t val; + uint16_t spare; + } composite; + } param; + uint8_t mode:2; + uint8_t active:6; }) CustomFnData; -#define CFN_PARAM(p) (*((uint32_t*)(p)->param)) -#define CFN_RESET_PARAM(p) memset(p->param, 0, sizeof(p->param)) +#define CFN_FUNC(p) ((p)->func) +#define CFN_ACTIVE(p) ((p)->active) +#define CFN_CH_NUMBER(p) (CFN_FUNC(p)) +#define CFN_PLAY_REPEAT(p) ((p)->active) +#define CFN_GVAR_MODE(p) ((p)->mode) +#define CFN_PARAM(p) ((p)->param.composite.val) +#define CFN_RESET_PARAM(p) memset(&(p)->param, 0, sizeof((p)->param)) #else PACK(typedef struct t_CustomFnData { // Function Switches data int8_t swtch; // input - uint8_t func:6; - uint8_t active:2; + union { + struct { + uint8_t param:3; + uint8_t func:5; + } func_param; + + struct { + uint8_t active:1; + uint8_t param:2; + uint8_t func:5; + } func_param_enable; + + struct { + uint8_t active:1; + uint8_t func:7; + } func_safety; + } internal; uint8_t param; }) CustomFnData; +#define CFN_FUNC(p) ((p)->internal.func_param.func) +#define CFN_ACTIVE(p) ((p)->internal.func_param_enable.active) +#define CFN_CH_NUMBER(p) ((p)->internal.func_safety.func) +#define CFN_PLAY_REPEAT(p) ((p)->internal.func_param.param) +#define CFN_GVAR_MODE(p) ((p)->internal.func_param_enable.param) #define CFN_PARAM(p) ((p)->param) #define CFN_RESET_PARAM(p) CFN_PARAM(p) = 0 #endif @@ -521,6 +562,18 @@ enum VarioSource { VARIO_SOURCE_LAST = VARIO_SOURCE_A2 }; +#if defined(FRSKY_HUB) + #define NUM_TELEMETRY TELEM_CSW_MAX +#elif defined(WS_HOW_HIGH) + #define NUM_TELEMETRY TELEM_ALT +#elif defined(FRSKY) + #define NUM_TELEMETRY TELEM_A2 +#elif defined(MAVLINK) + #define NUM_TELEMETRY 4 +#else + #define NUM_TELEMETRY TELEM_TM2 +#endif + PACK(typedef struct t_FrSkyBarData { uint8_t source; uint8_t barMin; // minimum for bar display @@ -918,7 +971,13 @@ enum MixSources { MIXSRC_CH14, MIXSRC_CH15, MIXSRC_CH16, - MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1 + MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1, + + MIXSRC_GVAR1, + MIXSRC_LAST_GVAR = MIXSRC_GVAR1+MAX_GVARS-1, + + MIXSRC_FIRST_TELEM, + MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1, }; #define MIN_POINTS 3 diff --git a/src/open9x.cpp b/src/open9x.cpp index 0a64d9ecf..1faecaad7 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -706,37 +706,40 @@ int16_t getValue(uint8_t i) else if (iv1 > MIXSRC_LAST_CH) { - if (frskyStreaming <= 0 && cs->v1 > MIXSRC_LAST_CH+MAX_TIMERS) + if (cs->v1 >= MIXSRC_FIRST_TELEM) { + if (frskyStreaming <= 0 && cs->v1 > MIXSRC_FIRST_TELEM-1+MAX_TIMERS) return swtch > 0 ? false : true; y = convertCswTelemValue(cs); #if defined(FRSKY_HUB) if (s == CS_VOFS) { - uint8_t idx = cs->v1-MIXSRC_LAST_CH-TELEM_ALT; + uint8_t idx = cs->v1-MIXSRC_FIRST_TELEM+1-TELEM_ALT; if (idx < THLD_MAX) { // Fill the threshold array barsThresholds[idx] = 128 + cs->v2; @@ -855,7 +858,7 @@ bool __getSwitch(int8_t swtch) y = calc100toRESX(cs->v2); } #else - if (cs->v1 > MIXSRC_LAST_CH) { + if (cs->v1 >= MIXSRC_FIRST_TELEM) { y = cs->v2; // it's a timer } else { @@ -865,7 +868,12 @@ bool __getSwitch(int8_t swtch) switch (cs->func) { case CS_VEQUAL: - result = (abs(x-y) < STICK_TOLERANCE); +#if defined(GVARS) + if (cs->v1 >= MIXSRC_GVAR1 && cs->v1 <= MIXSRC_LAST_GVAR) + result = (x==y); + else +#endif + result = (abs(x-y) < (1024 / STICK_TOLERANCE)); break; case CS_VPOS: result = (x>y); @@ -1955,25 +1963,25 @@ PLAY_FUNCTION(playValue, uint8_t idx) // TODO add the MIXSRC_TELEM_TM1 and so on. switch (idx) { - case MIXSRC_LAST_CH+TELEM_TX_VOLTAGE-1: + case MIXSRC_FIRST_TELEM-1+TELEM_TX_VOLTAGE-1: PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1); break; - case MIXSRC_LAST_CH+TELEM_TM1-1: - case MIXSRC_LAST_CH+TELEM_TM2-1: + case MIXSRC_FIRST_TELEM-1+TELEM_TM1-1: + case MIXSRC_FIRST_TELEM-1+TELEM_TM2-1: PLAY_DURATION(val); break; #if defined(FRSKY) - case MIXSRC_LAST_CH+TELEM_RSSI_TX-1: - case MIXSRC_LAST_CH+TELEM_RSSI_RX-1: + case MIXSRC_FIRST_TELEM-1+TELEM_RSSI_TX-1: + case MIXSRC_FIRST_TELEM-1+TELEM_RSSI_RX-1: PLAY_NUMBER(val, 1+UNIT_DBM, 0); break; - case MIXSRC_LAST_CH+TELEM_MIN_A1-1: - case MIXSRC_LAST_CH+TELEM_MIN_A2-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A1-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MIN_A2-1: idx -= TELEM_MIN_A1-TELEM_A1; // no break - case MIXSRC_LAST_CH+TELEM_A1-1: - case MIXSRC_LAST_CH+TELEM_A2-1: - idx -= (MIXSRC_LAST_CH+TELEM_A1-1); + case MIXSRC_FIRST_TELEM-1+TELEM_A1-1: + case MIXSRC_FIRST_TELEM-1+TELEM_A2-1: + idx -= (MIXSRC_FIRST_TELEM-1+TELEM_A1-1); // A1 and A2 { uint8_t att = 0; @@ -1985,41 +1993,41 @@ PLAY_FUNCTION(playValue, uint8_t idx) break; } - case MIXSRC_LAST_CH+TELEM_CELL-1: + case MIXSRC_FIRST_TELEM-1+TELEM_CELL-1: PLAY_NUMBER(val/10, 1+UNIT_VOLTS, PREC1); break; - case MIXSRC_LAST_CH+TELEM_VFAS-1: - case MIXSRC_LAST_CH+TELEM_CELLS_SUM-1: + case MIXSRC_FIRST_TELEM-1+TELEM_VFAS-1: + case MIXSRC_FIRST_TELEM-1+TELEM_CELLS_SUM-1: PLAY_NUMBER(val, 1+UNIT_VOLTS, PREC1); break; - case MIXSRC_LAST_CH+TELEM_CURRENT-1: - case MIXSRC_LAST_CH+TELEM_MAX_CURRENT-1: + case MIXSRC_FIRST_TELEM-1+TELEM_CURRENT-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MAX_CURRENT-1: PLAY_NUMBER(val, 1+UNIT_AMPS, PREC1); break; - case MIXSRC_LAST_CH+TELEM_ACCx-1: - case MIXSRC_LAST_CH+TELEM_ACCy-1: - case MIXSRC_LAST_CH+TELEM_ACCz-1: + case MIXSRC_FIRST_TELEM-1+TELEM_ACCx-1: + case MIXSRC_FIRST_TELEM-1+TELEM_ACCy-1: + case MIXSRC_FIRST_TELEM-1+TELEM_ACCz-1: PLAY_NUMBER(val/10, 1+UNIT_G, PREC1); break; - case MIXSRC_LAST_CH+TELEM_VSPD-1: + case MIXSRC_FIRST_TELEM-1+TELEM_VSPD-1: PLAY_NUMBER(val/10, 1+UNIT_METERS_PER_SECOND, PREC1); break; - case MIXSRC_LAST_CH+TELEM_CONSUMPTION-1: + case MIXSRC_FIRST_TELEM-1+TELEM_CONSUMPTION-1: PLAY_NUMBER(val, 1+UNIT_MAH, 0); break; - case MIXSRC_LAST_CH+TELEM_POWER-1: + case MIXSRC_FIRST_TELEM-1+TELEM_POWER-1: PLAY_NUMBER(val, 1+UNIT_WATTS, 0); break; - case MIXSRC_LAST_CH+TELEM_ALT-1: - case MIXSRC_LAST_CH+TELEM_MIN_ALT-1: - case MIXSRC_LAST_CH+TELEM_MAX_ALT-1: + case MIXSRC_FIRST_TELEM-1+TELEM_ALT-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MIN_ALT-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MAX_ALT-1: #if defined(IMPERIAL_UNITS) if (g_model.frsky.usrProto == USR_PROTO_WS_HOW_HIGH) PLAY_NUMBER(val, 1+UNIT_FEET, 0); @@ -2028,24 +2036,24 @@ PLAY_FUNCTION(playValue, uint8_t idx) PLAY_NUMBER(val, 1+UNIT_METERS, 0); break; - case MIXSRC_LAST_CH+TELEM_RPM-1: - case MIXSRC_LAST_CH+TELEM_MAX_RPM-1: + case MIXSRC_FIRST_TELEM-1+TELEM_RPM-1: + case MIXSRC_FIRST_TELEM-1+TELEM_MAX_RPM-1: PLAY_NUMBER(val, 1+UNIT_RPMS, 0); break; - case MIXSRC_LAST_CH+TELEM_HDG-1: + case MIXSRC_FIRST_TELEM-1+TELEM_HDG-1: PLAY_NUMBER(val, 1+UNIT_DEGREES, 0); break; default: { uint8_t unit = 1; - if (idx < MIXSRC_LAST_CH+TELEM_TM1-1) + if (idx < MIXSRC_FIRST_TELEM-1+TELEM_TM1-1) val = calcRESXto100(val); - if (idx >= MIXSRC_LAST_CH+TELEM_ALT-1 && idx <= MIXSRC_LAST_CH+TELEM_GPSALT-1) - unit = idx - (MIXSRC_LAST_CH+TELEM_ALT-1); - else if (idx >= MIXSRC_LAST_CH+TELEM_MAX_T1-1 && idx <= MIXSRC_LAST_CH+TELEM_MAX_DIST-1) - unit = 3 + idx - (MIXSRC_LAST_CH+TELEM_MAX_T1-1); + if (idx >= MIXSRC_FIRST_TELEM-1+TELEM_ALT-1 && idx <= MIXSRC_FIRST_TELEM-1+TELEM_GPSALT-1) + unit = idx - (MIXSRC_FIRST_TELEM-1+TELEM_ALT-1); + else if (idx >= MIXSRC_FIRST_TELEM-1+TELEM_MAX_T1-1 && idx <= MIXSRC_FIRST_TELEM-1+TELEM_MAX_DIST-1) + unit = 3 + idx - (MIXSRC_FIRST_TELEM-1+TELEM_MAX_T1-1); unit = pgm_read_byte(bchunit_ar+unit); #if !defined(IMPERIAL_UNITS) @@ -2078,8 +2086,8 @@ uint8_t fnSwitchDuration[NUM_CFN] = { 0 }; inline void playCustomFunctionFile(CustomFnData *sd, uint8_t id) { char lfn[] = SOUNDS_PATH "/xxxxxx.wav"; - strncpy(lfn+sizeof(SOUNDS_PATH), sd->param, sizeof(sd->param)); - lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param)] = '\0'; + strncpy(lfn+sizeof(SOUNDS_PATH), sd->param.name, sizeof(sd->param.name)); + lfn[sizeof(SOUNDS_PATH)+sizeof(sd->param.name)] = '\0'; strcat(lfn+sizeof(SOUNDS_PATH), SOUNDS_EXT); PLAY_FILE(lfn, sd->func==FUNC_BACKGND_MUSIC ? PLAY_BACKGROUND : 0, id); } @@ -2108,7 +2116,7 @@ void evalFunctions() CustomFnData *sd = &g_model.funcSw[i]; int8_t swtch = sd->swtch; if (swtch) { - MASK_FUNC_TYPE function_mask = (sd->func >= FUNC_TRAINER ? ((MASK_FUNC_TYPE)1 << (sd->func-FUNC_TRAINER)) : 0); + MASK_FUNC_TYPE function_mask = (CFN_FUNC(sd) >= FUNC_TRAINER ? ((MASK_FUNC_TYPE)1 << (CFN_FUNC(sd)-FUNC_TRAINER)) : 0); MASK_CFN_TYPE switch_mask = ((MASK_CFN_TYPE)1 << i); uint8_t momentary = 0; @@ -2158,7 +2166,7 @@ void evalFunctions() active = !(activeFnSwitches & switch_mask); #if !defined(CPUARM) - if (sd->func == FUNC_PLAY_BOTH && !active) { + if (CFN_FUNC(sd) == FUNC_PLAY_BOTH && !active) { momentary = 1; } else @@ -2184,19 +2192,19 @@ void evalFunctions() #endif } #if !defined(CPUARM) - else if (sd->func == FUNC_PLAY_BOTH) { + else if (CFN_FUNC(sd) == FUNC_PLAY_BOTH) { momentary = 1; } #endif if (active || momentary) { - if (sd->active) { - if (sd->func < FUNC_TRAINER) { - safetyCh[sd->func] = CFN_PARAM(sd); + if (CFN_ACTIVE(sd)) { + if (CFN_FUNC(sd) < FUNC_TRAINER) { + safetyCh[CFN_FUNC(sd)] = CFN_CH_NUMBER(sd); } if (!(activeFunctions & function_mask)) { - if (sd->func == FUNC_INSTANT_TRIM) { + if (CFN_FUNC(sd) == FUNC_INSTANT_TRIM) { if (g_menuStack[0] == menuMainView #if defined(FRSKY) || g_menuStack[0] == menuTelemetryFrsky @@ -2206,18 +2214,17 @@ void evalFunctions() } } } - else if (sd->func <= FUNC_INSTANT_TRIM) { - function_mask = 0; - switch_mask = 0; + else if (CFN_FUNC(sd) <= FUNC_INSTANT_TRIM) { + active = false; } #if defined(SDCARD) - if (sd->func == FUNC_LOGS) { + if (CFN_FUNC(sd) == FUNC_LOGS) { logDelay = CFN_PARAM(sd); } #endif - if (sd->func == FUNC_RESET) { + if (CFN_FUNC(sd) == FUNC_RESET) { switch (CFN_PARAM(sd)) { case FUNC_RESET_TIMER1: case FUNC_RESET_TIMER2: @@ -2242,24 +2249,24 @@ void evalFunctions() } } - if (sd->func == FUNC_PLAY_SOUND) { + if (CFN_FUNC(sd) == FUNC_PLAY_SOUND) { AUDIO_PLAY(AU_FRSKY_FIRST+CFN_PARAM(sd)); } #if defined(HAPTIC) - if (sd->func == FUNC_HAPTIC) { + if (CFN_FUNC(sd) == FUNC_HAPTIC) { haptic.event(AU_FRSKY_LAST+CFN_PARAM(sd)); } #endif #if defined(CPUARM) && defined(SDCARD) - else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_VALUE) { + else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_PLAY_VALUE) { tmr10ms_t tmr10ms = get_tmr10ms(); - uint8_t repeatParam = sd->active; + uint8_t repeatParam = CFN_PLAY_REPEAT(sd); if (!lastFunctionTime[i] || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=500*repeatParam)) { if (!IS_PLAYING(i+1)) { lastFunctionTime[i] = tmr10ms; - if (sd->func == FUNC_PLAY_VALUE) { + if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) { PLAY_VALUE(CFN_PARAM(sd), i+1); } else { @@ -2268,51 +2275,75 @@ void evalFunctions() } } } - else if (sd->func == FUNC_BACKGND_MUSIC) { + else if (CFN_FUNC(sd) == FUNC_BACKGND_MUSIC) { if (!IS_PLAYING(i+1)) { playCustomFunctionFile(sd, i+1); } } - else if (sd->func == FUNC_VOLUME) { - requiredSpeakerVolume = ((1024 + getValue(CFN_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048; + else if (CFN_FUNC(sd) == FUNC_VOLUME) { + if (CFN_ACTIVE(sd)) { + requiredSpeakerVolume = ((1024 + getValue(CFN_PARAM(sd))) * VOLUME_LEVEL_MAX) / 2048; + } + else { + active = false; + } } #elif defined(VOICE) - else if (sd->func == FUNC_PLAY_TRACK || sd->func == FUNC_PLAY_BOTH || sd->func == FUNC_PLAY_VALUE) { + else if (CFN_FUNC(sd) == FUNC_PLAY_TRACK || CFN_FUNC(sd) == FUNC_PLAY_BOTH || CFN_FUNC(sd) == FUNC_PLAY_VALUE) { tmr10ms_t tmr10ms = get_tmr10ms(); - uint8_t repeatParam = sd->active; - if (!lastFunctionTime[i] || (sd->func==FUNC_PLAY_BOTH && active!=(bool)(activeFnSwitches&switch_mask)) || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=(1500<<(repeatParam-1)))) { + uint8_t repeatParam = CFN_PLAY_REPEAT(sd); + if (!lastFunctionTime[i] || (CFN_FUNC(sd)==FUNC_PLAY_BOTH && active!=(bool)(activeFnSwitches&switch_mask)) || (repeatParam && (signed)(tmr10ms-lastFunctionTime[i])>=1000*repeatParam)) { lastFunctionTime[i] = tmr10ms; - if (sd->func == FUNC_PLAY_VALUE) { - PLAY_VALUE(CFN_PARAM(sd), i+1); + uint8_t param = CFN_PARAM(sd); + if (CFN_FUNC(sd) == FUNC_PLAY_VALUE) { + PLAY_VALUE(param, i+1); } else { - PUSH_CUSTOM_PROMPT(active ? sd->param : sd->param+1, i+1); + if (CFN_FUNC(sd) == FUNC_PLAY_TRACK && param > 250) + param = GVAR_VALUE(param-251, getGVarFlightPhase(s_perout_flight_phase, param-251)); + PUSH_CUSTOM_PROMPT(active ? param : param+1, i+1); } } } #endif #if defined(DEBUG) - else if (sd->func == FUNC_TEST) { + else if (CFN_FUNC(sd) == FUNC_TEST) { testFunc(); } #endif #if defined(GVARS) - else if (sd->func >= FUNC_ADJUST_GV1) { - if (CFN_PARAM(sd) >= MIXSRC_TrimRud-1 && CFN_PARAM(sd) <= MIXSRC_TrimAil-1) { - trimGvar[CFN_PARAM(sd)-MIXSRC_TrimRud+1] = sd->func-FUNC_ADJUST_GV1; - } + else if (CFN_FUNC(sd) >= FUNC_ADJUST_GV1) { + if (CFN_ACTIVE(sd)) { + if (CFN_GVAR_MODE(sd) == 0) { + SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, CFN_PARAM(sd), s_perout_flight_phase); + } + else if (CFN_GVAR_MODE(sd) == 2) { + SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_PARAM(sd), s_perout_flight_phase), s_perout_flight_phase); + } + else if (CFN_GVAR_MODE(sd) == 3) { + if (!(activeFnSwitches & switch_mask)) { + SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_FUNC(sd)-FUNC_ADJUST_GV1, getGVarFlightPhase(s_perout_flight_phase, CFN_FUNC(sd)-FUNC_ADJUST_GV1)) + (CFN_PARAM(sd) ? +1 : -1), s_perout_flight_phase); + } + } + else if (CFN_PARAM(sd) >= MIXSRC_TrimRud-1 && CFN_PARAM(sd) <= MIXSRC_TrimAil-1) { + trimGvar[CFN_PARAM(sd)-MIXSRC_TrimRud+1] = CFN_FUNC(sd)-FUNC_ADJUST_GV1; + } #if defined(ROTARY_ENCODERS) - else if (CFN_PARAM(sd) >= MIXSRC_REa-1 && CFN_PARAM(sd) < MIXSRC_TrimRud-1) { - int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY); - if (scroll) { - SET_GVAR(sd->func-FUNC_ADJUST_GV1, GVAR_VALUE(sd->func-FUNC_ADJUST_GV1, s_perout_flight_phase) + scroll, s_perout_flight_phase); + else if (CFN_PARAM(sd) >= MIXSRC_REa-1 && CFN_PARAM(sd) < MIXSRC_TrimRud-1) { + int8_t scroll = rePreviousValues[CFN_PARAM(sd)-MIXSRC_REa+1] - (g_rotenc[CFN_PARAM(sd)-MIXSRC_REa+1] / ROTARY_ENCODER_GRANULARITY); + if (scroll) { + SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, GVAR_VALUE(CFN_FUNC(sd)-FUNC_ADJUST_GV1, getGVarFlightPhase(s_perout_flight_phase, CFN_FUNC(sd)-FUNC_ADJUST_GV1)) + scroll, s_perout_flight_phase); + } + } +#endif + else { + SET_GVAR(CFN_FUNC(sd)-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(CFN_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase); } } -#endif else { - SET_GVAR(sd->func-FUNC_ADJUST_GV1, limit((int16_t)-1250, getValue(CFN_PARAM(sd)), (int16_t)1250) / 10, s_perout_flight_phase); + active = false; } } #endif @@ -2328,7 +2359,7 @@ void evalFunctions() fnSwitchDuration[i] = 0; #endif #if defined(CPUARM) && defined(SDCARD) - if (sd->func == FUNC_BACKGND_MUSIC && isFunctionActive(FUNC_BACKGND_MUSIC)) { + if (CFN_FUNC(sd) == FUNC_BACKGND_MUSIC && isFunctionActive(FUNC_BACKGND_MUSIC)) { STOP_PLAY(i+1); } #endif diff --git a/src/open9x.h b/src/open9x.h index c3117bdab..c36d4887a 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -68,6 +68,12 @@ #define IF_CPUARM(x) #endif +#if defined(BATTGRAPH) +#define IF_BATTGRAPH(x) x, +#else +#define IF_BATTGRAPH(x) +#endif + #if defined(RTCLOCK) #define IF_RTCLOCK(x) x, #else @@ -534,18 +540,6 @@ enum CswFunctions { #define NUM_CAL_PPM 4 #define NUM_PPM 8 -#if defined(FRSKY_HUB) -#define NUM_TELEMETRY TELEM_CSW_MAX -#elif defined(WS_HOW_HIGH) -#define NUM_TELEMETRY TELEM_ALT -#elif defined(FRSKY) -#define NUM_TELEMETRY TELEM_A2 -#elif defined(MAVLINK) -#define NUM_TELEMETRY 4 -#else -#define NUM_TELEMETRY TELEM_TM2 -#endif - #define THRCHK_DEADBAND 16 #if defined(FSPLASH) || defined(XSPLASH)