From 9337fa861f199829e214a4073b50c7a143a08fe9 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 10 Feb 2014 17:52:53 +0100 Subject: [PATCH] EEPROM v216 conversions fixes --- radio/src/eeprom_conversions.cpp | 147 +++++++++++++++++++++++++------ radio/src/gui/menu_general.cpp | 6 +- radio/src/gui/menu_model.cpp | 7 +- radio/src/myeeprom.h | 4 +- radio/src/opentx.h | 6 +- 5 files changed, 133 insertions(+), 37 deletions(-) diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index 99bd2c841..88fcc076a 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -133,6 +133,30 @@ PACK(typedef struct { gvar_t gvars[5]; }) PhaseData_v215; +PACK(typedef struct { + int16_t v1; + int16_t v2; + uint8_t func; + uint8_t delay; + uint8_t duration; + int8_t andsw; +}) LogicalSwitchData_v215; + +PACK(typedef struct { + int8_t swtch; + uint8_t func; + PACK(union { + char name[LEN_CFN_NAME]; + struct { + int16_t val; + int16_t ext1; + int16_t ext2; + } composite; + }) param; + uint8_t mode:2; + uint8_t active:6; +}) CustomFnData_v215; + PACK(typedef struct { FrSkyChannelData channels[2]; uint8_t usrProto; // Protocol in FrSky user data, 0=None, 1=FrSky hub, 2=WS HowHigh, 3=Halcyon @@ -170,8 +194,8 @@ PACK(typedef struct { int16_t curves[16]; int8_t points[NUM_POINTS]; - LogicalSwitchData customSw[NUM_CSW]; - CustomFnData funcSw[NUM_CFN]; + LogicalSwitchData_v215 customSw[NUM_CSW]; + CustomFnData_v215 funcSw[NUM_CFN]; SwashRingData swashR; PhaseData_v215 phaseData[MAX_PHASES]; @@ -379,75 +403,144 @@ void ConvertModel_215_to_216(ModelData &model) g_model.points[i] = oldModel.points[i]; } for (uint8_t i=0; i<32; i++) { - g_model.customSw[i] = oldModel.customSw[i]; + LogicalSwitchData & sw = g_model.customSw[i]; + sw.func = oldModel.customSw[i].func; + if (sw.func >= LS_FUNC_RANGE) sw.func += 1; + if (sw.func >= LS_FUNC_STAY) sw.func += 1; + sw.v1 = oldModel.customSw[i].v1; + sw.v2 = oldModel.customSw[i].v2; + sw.delay = oldModel.customSw[i].delay; + sw.duration = oldModel.customSw[i].duration; + sw.andsw = oldModel.customSw[i].andsw; #if defined(PCBTARANIS) - LogicalSwitchData * cs = &g_model.customSw[i]; - uint8_t cstate = cswFamily(cs->func); + uint8_t cstate = cswFamily(sw.func); if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_COMP || cstate == LS_FAMILY_DIFF) { - if (cs->v1 > 0) cs->v1 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; - if (cs->v1 > MIXSRC_GVAR1+4) cs->v1 += 4; + if (sw.v1 > 0) sw.v1 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; + if (sw.v1 > MIXSRC_GVAR1+4) sw.v1 += 4; } if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_DIFF) { - if (cs->v1 >= MIXSRC_FIRST_TELEM) { - switch ((uint8_t)cs->v1) { + if (sw.v1 >= MIXSRC_FIRST_TELEM) { + switch ((uint8_t)sw.v1) { case MIXSRC_FIRST_TELEM + TELEM_TM1-1: case MIXSRC_FIRST_TELEM + TELEM_TM2-1: - cs->v2 = (cs->v2+128) * 3; + sw.v2 = (sw.v2+128) * 3; break; case MIXSRC_FIRST_TELEM + TELEM_ALT-1: case MIXSRC_FIRST_TELEM + TELEM_GPSALT-1: case MIXSRC_FIRST_TELEM + TELEM_MIN_ALT-1: case MIXSRC_FIRST_TELEM + TELEM_MAX_ALT-1: - cs->v2 = (cs->v2+128) * 8 - 500; + sw.v2 = (sw.v2+128) * 8 - 500; break; case MIXSRC_FIRST_TELEM + TELEM_RPM-1: case MIXSRC_FIRST_TELEM + TELEM_MAX_RPM-1: - cs->v2 = (cs->v2+128) * 50; + sw.v2 = (sw.v2+128) * 50; break; case MIXSRC_FIRST_TELEM + TELEM_T1-1: case MIXSRC_FIRST_TELEM + TELEM_T2-1: case MIXSRC_FIRST_TELEM + TELEM_MAX_T1-1: case MIXSRC_FIRST_TELEM + TELEM_MAX_T2-1: - cs->v2 = (cs->v2+128) + 30; + sw.v2 = (sw.v2+128) + 30; break; case MIXSRC_FIRST_TELEM + TELEM_CELL-1: case MIXSRC_FIRST_TELEM + TELEM_HDG-1: - cs->v2 = (cs->v2+128) * 2; + sw.v2 = (sw.v2+128) * 2; break; case MIXSRC_FIRST_TELEM + TELEM_DIST-1: case MIXSRC_FIRST_TELEM + TELEM_MAX_DIST-1: - cs->v2 = (cs->v2+128) * 8; + sw.v2 = (sw.v2+128) * 8; break; case MIXSRC_FIRST_TELEM + TELEM_CURRENT-1: case MIXSRC_FIRST_TELEM + TELEM_POWER-1: - cs->v2 = (cs->v2+128) * 5; + sw.v2 = (sw.v2+128) * 5; break; case MIXSRC_FIRST_TELEM + TELEM_CONSUMPTION-1: - cs->v2 = (cs->v2+128) * 20; + sw.v2 = (sw.v2+128) * 20; break; default: - cs->v2 += 128; + sw.v2 += 128; break; } } } if (cstate == LS_FAMILY_COMP) { - if (cs->v2 > 0) cs->v2 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; - if (cs->v2 > MIXSRC_GVAR1+4) cs->v2 += 4; + if (sw.v2 > 0) sw.v2 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; + if (sw.v2 > MIXSRC_GVAR1+4) sw.v2 += 4; } #endif } for (uint8_t i=0; i<32; i++) { - g_model.funcSw[i] = oldModel.funcSw[i]; - CustomFnData *sd = &g_model.funcSw[i]; - if (CFN_FUNC(sd) == FUNC_PLAY_VALUE || CFN_FUNC(sd) == FUNC_VOLUME || (IS_ADJUST_GV_FUNC(CFN_FUNC(sd)) && CFN_GVAR_MODE(sd) == FUNC_ADJUST_GVAR_SOURCE)) { + CustomFnData & fn = g_model.funcSw[i]; + fn.swtch = oldModel.funcSw[i].swtch; + fn.func = oldModel.funcSw[i].func; + if (fn.func <= 15) { + fn.all.param = fn.func; + fn.func = FUNC_SAFETY_CHANNEL; + } + else if (fn.func <= 20) { + fn.all.param = fn.func - 16; + fn.func = FUNC_TRAINER; + } + else if (fn.func == 21) { + fn.func = FUNC_INSTANT_TRIM; + } + else if (fn.func == 22) { + fn.func = FUNC_PLAY_SOUND; + } +#if defined(PCBSKY9X) + else if (fn.func == 23) { + fn.func = FUNC_HAPTIC; + } +#endif + else if (fn.func == 23+IS_PCBSKY9X) { + fn.func = FUNC_RESET; + } + else if (fn.func == 24+IS_PCBSKY9X) { + fn.func = FUNC_VARIO; + } + else if (fn.func == 25+IS_PCBSKY9X) { + fn.func = FUNC_PLAY_TRACK; + } + else if (fn.func == 26+IS_PCBSKY9X) { + fn.func = FUNC_PLAY_VALUE; + } + else if (fn.func == 27+IS_PCBSKY9X) { + fn.func = FUNC_LOGS; + } + else if (fn.func == 28+IS_PCBSKY9X) { + fn.func = FUNC_VOLUME; + } + else if (fn.func == 29+IS_PCBSKY9X) { + fn.func = FUNC_BACKLIGHT; + } + else if (fn.func == 30+IS_PCBSKY9X) { + fn.func = FUNC_BACKGND_MUSIC; + } + else if (fn.func == 31+IS_PCBSKY9X) { + fn.func = FUNC_BACKGND_MUSIC_PAUSE; + } + else { + fn.all.param = fn.func - 32 - IS_PCBSKY9X; + fn.all.mode = oldModel.funcSw[i].mode; + fn.func = FUNC_ADJUST_GVAR; + } + + fn.active = oldModel.funcSw[i].active; + if (HAS_REPEAT_PARAM(fn.func)) { + fn.active *= 5; + } + + if (fn.func == FUNC_PLAY_TRACK || fn.func == FUNC_BACKGND_MUSIC) { + memcpy(fn.play.name, oldModel.funcSw[i].param.name, LEN_CFN_NAME); + } + else { + fn.all.val = oldModel.funcSw[i].param.composite.val; + } + if (fn.func == FUNC_PLAY_VALUE || fn.func == FUNC_VOLUME || (IS_ADJUST_GV_FUNC(fn.func) && fn.all.mode == FUNC_ADJUST_GVAR_SOURCE)) { #if defined(PCBTARANIS) - CFN_PARAM(sd) += 1 + MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; + fn.all.param += 1 + MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; #endif - if (CFN_PARAM(sd) > MIXSRC_GVAR1+4) CFN_PARAM(sd) += 4; + if (fn.all.param > MIXSRC_GVAR1+4) fn.all.param += 4; } - if (HAS_REPEAT_PARAM(sd)) - CFN_PLAY_REPEAT(sd) *= 5; } g_model.swashR = oldModel.swashR; diff --git a/radio/src/gui/menu_general.cpp b/radio/src/gui/menu_general.cpp index 25c9a28c5..3b1ae8a7d 100644 --- a/radio/src/gui/menu_general.cpp +++ b/radio/src/gui/menu_general.cpp @@ -160,8 +160,8 @@ enum menuGeneralSetupItems { ITEM_SETUP_CONTRAST, ITEM_SETUP_ALARMS_LABEL, ITEM_SETUP_BATTERY_WARNING, - IF_PCBSKY9X(ITEM_SETUP_CAPACITY_WARNING) - IF_PCBSKY9X(ITEM_SETUP_TEMPERATURE_WARNING) + CASE_PCBSKY9X(ITEM_SETUP_CAPACITY_WARNING) + CASE_PCBSKY9X(ITEM_SETUP_TEMPERATURE_WARNING) ITEM_SETUP_INACTIVITY_ALARM, ITEM_SETUP_MEMORY_WARNING, ITEM_SETUP_ALARM_WARNING, @@ -211,7 +211,7 @@ void menuGeneralSetup(uint8_t event) } #endif - MENU(STR_MENURADIOSETUP, menuTabDiag, e_Setup, ITEM_SETUP_MAX+1, {0, IF_RTCLOCK(2) IF_RTCLOCK(2) IF_BATTGRAPH(1) LABEL(SOUND), IF_AUDIO(0) IF_BUZZER(0) IF_VOICE(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) 0, IF_AUDIO(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) 0, LABEL(ALARMS), 0, IF_PCBSKY9X(0) IF_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, IF_CPUARM(0) CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_GPS(0) IF_GPS(0) IF_PXX(0) IF_CPUARM(0) IF_CPUARM(0) IF_FAI_CHOICE(0) 0, LABEL(TX_MODE), CASE_PCBTARANIS(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), IF_AUDIO(0) IF_BUZZER(0) IF_VOICE(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) IF_CPUARM(0) 0, IF_AUDIO(0) IF_HAPTIC(LABEL(HAPTIC)) IF_HAPTIC(0) IF_HAPTIC(0) IF_HAPTIC(0) 0, LABEL(ALARMS), 0, CASE_PCBSKY9X(0) CASE_PCBSKY9X(0) 0, 0, 0, IF_ROTARY_ENCODERS(0) LABEL(BACKLIGHT), 0, 0, IF_CPUARM(0) CASE_PWM_BACKLIGHT(0) CASE_PWM_BACKLIGHT(0) 0, IF_SPLASH(0) IF_GPS(0) IF_GPS(0) IF_PXX(0) IF_CPUARM(0) IF_CPUARM(0) IF_FAI_CHOICE(0) 0, LABEL(TX_MODE), CASE_PCBTARANIS(0) 1/*to force edit mode*/}); uint8_t sub = m_posVert - 1; diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index db47af0c2..9d65e18c0 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -976,7 +976,7 @@ void menuModelSetup(uint8_t event) #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, 6, 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, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, CASE_PCBSKY9X(1) CASE_PCBSKY9X(2) }); #endif if (!MENU_CHECK(menuTabModel, e_ModelSetup, MODEL_SETUP_MAX_LINES)) { @@ -1163,7 +1163,6 @@ void menuModelSetup(uint8_t event) switch(event) { CASE_EVT_ROTARY_BREAK case EVT_KEY_BREAK(KEY_ENTER): - killEvents(event); #if defined(CPUM64) g_model.nSwToWarn ^= (1 << m_posHorz); eeDirty(EE_MODEL); @@ -1190,10 +1189,12 @@ void menuModelSetup(uint8_t event) eeDirty(EE_MODEL); } #endif + killEvents(event); break; } } } + LcdFlags line = attr; for (uint8_t i=0; i= 212 lcd_putsAtt(MODEL_CUSTOM_FUNC_4TH_COLUMN+2, y, "1x", attr); diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index ed9a62510..2c5476807 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -775,9 +775,9 @@ enum Functions { #endif #if defined(VOICE) - #define HAS_REPEAT_PARAM(sd) (CFN_FUNC(sd) == FUNC_PLAY_SOUND || (CFN_FUNC(sd) >= FUNC_PLAY_TRACK && CFN_FUNC(sd) <= FUNC_PLAY_VALUE)) + #define HAS_REPEAT_PARAM(func) (func == FUNC_PLAY_SOUND || (func >= FUNC_PLAY_TRACK && func <= FUNC_PLAY_VALUE)) #else - #define HAS_REPEAT_PARAM(sd) (CFN_FUNC(sd) == FUNC_PLAY_SOUND) + #define HAS_REPEAT_PARAM(func) (func == FUNC_PLAY_SOUND) #endif enum ResetFunctionParam { diff --git a/radio/src/opentx.h b/radio/src/opentx.h index f282209a0..54da33e7c 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -45,9 +45,11 @@ // TODO change all IF_xxx by CASE_xxx when used with a comma! #if defined(PCBSKY9X) -#define IF_PCBSKY9X(x) x, +#define IS_PCBSKY9X true +#define CASE_PCBSKY9X(x) x, #else -#define IF_PCBSKY9X(x) +#define IS_PCBSKY9X false +#define CASE_PCBSKY9X(x) #endif #if defined(PCBTARANIS)