diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index 88fcc076a..529eb416a 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -220,6 +220,19 @@ void ConvertGeneralSettings_215_to_216(EEGeneral &settings) } #if defined(PCBTARANIS) +int ConvertSource_215_to_216(int source, bool insertZero=false) +{ + if (insertZero) + source += 1; + // Virtual Inputs and Lua Outputs added + if (source > 0) + source += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; + // 4 GVARS added + if (source > MIXSRC_GVAR1+4) + source += 4; + return source; +} + int ConvertSwitch_215_to_216(int swtch) { if (swtch <= SWSRC_LAST_SWITCH) @@ -228,7 +241,15 @@ int ConvertSwitch_215_to_216(int swtch) return swtch + (2*4) + (2*6); // 4 trims and 2 * 6-pos added as switches } #else -inline int ConvertSwitch_215_to_216(int swtch) +int ConvertSource_215_to_216(int source, bool removeZero=false) +{ + // 4 GVARS added + if (source > MIXSRC_GVAR1+4) + source += 4; + return source; +} + +int ConvertSwitch_215_to_216(int swtch) { if (swtch <= SWSRC_LAST_SWITCH) return swtch; @@ -260,7 +281,7 @@ void ConvertModel_215_to_216(ModelData &model) memcpy(&g_model.header, &oldModel.header, sizeof(g_model.header)); for (uint8_t i=0; i<2; i++) { - g_model.timers[i].mode = oldModel.timers[i].mode; + g_model.timers[i].mode = oldModel.timers[i].mode > 4 ? ConvertSwitch_215_to_216(oldModel.timers[i].mode): oldModel.timers[i].mode; g_model.timers[i].start = oldModel.timers[i].start; g_model.timers[i].minuteBeep = oldModel.timers[i].minuteBeep; g_model.timers[i].persistent = oldModel.timers[i].persistent; @@ -277,43 +298,44 @@ void ConvertModel_215_to_216(ModelData &model) g_model.beepANACenter = oldModel.beepANACenter; for (uint8_t i=0; i<64; i++) { + MixData & mix = g_model.mixData[i]; #if defined(PCBTARANIS) - g_model.mixData[i].destCh = oldModel.mixData[i].destCh; - g_model.mixData[i].phases = oldModel.mixData[i].phases; - g_model.mixData[i].mltpx = oldModel.mixData[i].mltpx; - g_model.mixData[i].weight = oldModel.mixData[i].weight; - g_model.mixData[i].swtch = ConvertSwitch_215_to_216(oldModel.mixData[i].swtch); + mix.destCh = oldModel.mixData[i].destCh; + mix.phases = oldModel.mixData[i].phases; + mix.mltpx = oldModel.mixData[i].mltpx; + mix.weight = oldModel.mixData[i].weight; + mix.swtch = ConvertSwitch_215_to_216(oldModel.mixData[i].swtch); if (oldModel.mixData[i].curveMode==0/*differential*/) { - g_model.mixData[i].curve.type = CURVE_REF_DIFF; - g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam; + mix.curve.type = CURVE_REF_DIFF; + mix.curve.value = oldModel.mixData[i].curveParam; } else if (oldModel.mixData[i].curveParam <= 6) { - g_model.mixData[i].curve.type = CURVE_REF_FUNC; - g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam; + mix.curve.type = CURVE_REF_FUNC; + mix.curve.value = oldModel.mixData[i].curveParam; } else { - g_model.mixData[i].curve.type = CURVE_REF_CUSTOM; - g_model.mixData[i].curve.value = oldModel.mixData[i].curveParam - 6; + mix.curve.type = CURVE_REF_CUSTOM; + mix.curve.value = oldModel.mixData[i].curveParam - 6; } - g_model.mixData[i].mixWarn = oldModel.mixData[i].mixWarn; - g_model.mixData[i].delayUp = oldModel.mixData[i].delayUp; - g_model.mixData[i].delayDown = oldModel.mixData[i].delayDown; - g_model.mixData[i].speedUp = oldModel.mixData[i].speedUp; - g_model.mixData[i].speedDown = oldModel.mixData[i].speedDown; - g_model.mixData[i].srcRaw = oldModel.mixData[i].srcRaw; - if (g_model.mixData[i].srcRaw > 4 || oldModel.mixData[i].noExpo) - g_model.mixData[i].srcRaw += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; - g_model.mixData[i].offset = oldModel.mixData[i].offset; - memcpy(g_model.mixData[i].name, oldModel.mixData[i].name, LEN_EXPOMIX_NAME); + mix.mixWarn = oldModel.mixData[i].mixWarn; + mix.delayUp = oldModel.mixData[i].delayUp; + mix.delayDown = oldModel.mixData[i].delayDown; + mix.speedUp = oldModel.mixData[i].speedUp; + mix.speedDown = oldModel.mixData[i].speedDown; + mix.srcRaw = oldModel.mixData[i].srcRaw; + if (mix.srcRaw > 4 || oldModel.mixData[i].noExpo) + mix.srcRaw = ConvertSource_215_to_216(mix.srcRaw); + mix.offset = oldModel.mixData[i].offset; + memcpy(mix.name, oldModel.mixData[i].name, LEN_EXPOMIX_NAME); #else - memcpy(&g_model.mixData[i], &oldModel.mixData[i], sizeof(g_model.mixData[i])); + memcpy(&mix, &oldModel.mixData[i], sizeof(mix)); #endif - if (g_model.mixData[i].weight <= -508) - g_model.mixData[i].weight = g_model.mixData[i].weight + 512 - 4096; - else if (g_model.mixData[i].weight >= 507) - g_model.mixData[i].weight = g_model.mixData[i].weight - 512 + 4096; + if (mix.weight <= -508) + mix.weight = mix.weight + 512 - 4096; + else if (mix.weight >= 507) + mix.weight = mix.weight - 512 + 4096; else - g_model.mixData[i].offset = g_model.mixData[i].offset * g_model.mixData[i].weight / 100; + mix.offset = mix.offset * mix.weight / 100; } for (uint8_t i=0; i<32; i++) { g_model.limitData[i].min = 10 * oldModel.limitData[i].min; @@ -414,63 +436,65 @@ void ConvertModel_215_to_216(ModelData &model) sw.andsw = oldModel.customSw[i].andsw; #if defined(PCBTARANIS) uint8_t cstate = cswFamily(sw.func); - if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_COMP || cstate == LS_FAMILY_DIFF) { - 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_BOOL) { + sw.v1 = ConvertSwitch_215_to_216(sw.v1); + sw.v2 = ConvertSwitch_215_to_216(sw.v2); } - if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_DIFF) { - 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: - 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: - sw.v2 = (sw.v2+128) * 8 - 500; - break; - case MIXSRC_FIRST_TELEM + TELEM_RPM-1: - case MIXSRC_FIRST_TELEM + TELEM_MAX_RPM-1: - 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: - sw.v2 = (sw.v2+128) + 30; - break; - case MIXSRC_FIRST_TELEM + TELEM_CELL-1: - case MIXSRC_FIRST_TELEM + TELEM_HDG-1: - sw.v2 = (sw.v2+128) * 2; - break; - case MIXSRC_FIRST_TELEM + TELEM_DIST-1: - case MIXSRC_FIRST_TELEM + TELEM_MAX_DIST-1: - sw.v2 = (sw.v2+128) * 8; - break; - case MIXSRC_FIRST_TELEM + TELEM_CURRENT-1: - case MIXSRC_FIRST_TELEM + TELEM_POWER-1: - sw.v2 = (sw.v2+128) * 5; - break; - case MIXSRC_FIRST_TELEM + TELEM_CONSUMPTION-1: - sw.v2 = (sw.v2+128) * 20; - break; - default: - sw.v2 += 128; - break; + else if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_COMP || cstate == LS_FAMILY_DIFF) { + sw.v1 = ConvertSource_215_to_216(sw.v1); + if (cstate == LS_FAMILY_OFS || cstate == LS_FAMILY_DIFF) { + 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: + 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: + sw.v2 = (sw.v2+128) * 8 - 500; + break; + case MIXSRC_FIRST_TELEM + TELEM_RPM-1: + case MIXSRC_FIRST_TELEM + TELEM_MAX_RPM-1: + 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: + sw.v2 = (sw.v2+128) + 30; + break; + case MIXSRC_FIRST_TELEM + TELEM_CELL-1: + case MIXSRC_FIRST_TELEM + TELEM_HDG-1: + sw.v2 = (sw.v2+128) * 2; + break; + case MIXSRC_FIRST_TELEM + TELEM_DIST-1: + case MIXSRC_FIRST_TELEM + TELEM_MAX_DIST-1: + sw.v2 = (sw.v2+128) * 8; + break; + case MIXSRC_FIRST_TELEM + TELEM_CURRENT-1: + case MIXSRC_FIRST_TELEM + TELEM_POWER-1: + sw.v2 = (sw.v2+128) * 5; + break; + case MIXSRC_FIRST_TELEM + TELEM_CONSUMPTION-1: + sw.v2 = (sw.v2+128) * 20; + break; + default: + sw.v2 += 128; + break; + } } } - } - if (cstate == LS_FAMILY_COMP) { - if (sw.v2 > 0) sw.v2 += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; - if (sw.v2 > MIXSRC_GVAR1+4) sw.v2 += 4; + if (cstate == LS_FAMILY_COMP) { + sw.v2 = ConvertSource_215_to_216(sw.v2); + } } #endif } for (uint8_t i=0; i<32; i++) { CustomFnData & fn = g_model.funcSw[i]; - fn.swtch = oldModel.funcSw[i].swtch; + fn.swtch = ConvertSwitch_215_to_216(oldModel.funcSw[i].swtch); fn.func = oldModel.funcSw[i].func; if (fn.func <= 15) { fn.all.param = fn.func; @@ -537,17 +561,13 @@ void ConvertModel_215_to_216(ModelData &model) } 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) - fn.all.param += 1 + MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; + fn.all.param = ConvertSource_215_to_216(fn.all.param, true); #endif - if (fn.all.param > MIXSRC_GVAR1+4) fn.all.param += 4; } } g_model.swashR = oldModel.swashR; -#if defined(PCBTARANIS) - if (g_model.swashR.collectiveSource > 0) g_model.swashR.collectiveSource += MAX_INPUTS + MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS; - if (g_model.swashR.collectiveSource > MIXSRC_GVAR1+4) g_model.swashR.collectiveSource += 4; -#endif + g_model.swashR.collectiveSource = ConvertSource_215_to_216(g_model.swashR.collectiveSource); for (uint8_t i=0; i<9; i++) { memcpy(&g_model.phaseData[i], &oldModel.phaseData[i], sizeof(oldModel.phaseData[i])); // the last 4 gvars will remain blank diff --git a/radio/src/gui/menu_model.cpp b/radio/src/gui/menu_model.cpp index 9d65e18c0..8d271aa56 100644 --- a/radio/src/gui/menu_model.cpp +++ b/radio/src/gui/menu_model.cpp @@ -4543,10 +4543,11 @@ void menuModelLogicalSwitches(uint8_t event) // CSW params uint8_t cstate = cswFamily(cs->func); #if defined(CPUARM) - int16_t v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM; + int16_t v1_unsigned=(uint8_t)cs->v1, v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM; int16_t v3_min=0, v3_max=100; #else int8_t v1_min=0, v1_max=MIXSRC_LAST_TELEM, v2_min=0, v2_max=MIXSRC_LAST_TELEM; + uint8_t v1_unsigned = cs->v1; #endif if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { @@ -4582,7 +4583,7 @@ void menuModelLogicalSwitches(uint8_t event) } #endif else if (cstate == LS_FAMILY_COMP) { - putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, attr1); + putsMixerSource(CSW_2ND_COLUMN, y, v1_unsigned, attr1); putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, attr2); INCDEC_SET_FLAG(INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); @@ -4596,7 +4597,7 @@ void menuModelLogicalSwitches(uint8_t event) INCDEC_ENABLE_CHECK(NULL); } else { - putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, attr1); + putsMixerSource(CSW_2ND_COLUMN, y, v1_unsigned, attr1); if (horz == 1) { INCDEC_SET_FLAG(INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); @@ -4606,11 +4607,11 @@ void menuModelLogicalSwitches(uint8_t event) INCDEC_ENABLE_CHECK(NULL); } #if defined(FRSKY) - if (cs->v1 >= MIXSRC_FIRST_TELEM) { - putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), LEFT|attr2); - v2_max = maxTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1); + if (v1_unsigned >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannel(CSW_3RD_COLUMN, y, v1_unsigned - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), LEFT|attr2); + v2_max = maxTelemValue(v1_unsigned - MIXSRC_FIRST_TELEM + 1); #if defined(CPUARM) - v2_min = minTelemValue(cs->v1 - MIXSRC_FIRST_TELEM + 1); + v2_min = minTelemValue(v1_unsigned - MIXSRC_FIRST_TELEM + 1); if (cs->v2 < v2_min || cs->v2 > v2_max) { cs->v2 = 0; eeDirty(EE_MODEL); @@ -4635,8 +4636,8 @@ void menuModelLogicalSwitches(uint8_t event) v2_min = -125; v2_max = 125; } #else - if (cs->v1 >= MIXSRC_FIRST_TELEM) { - putsTelemetryChannel(CSW_3RD_COLUMN, y, cs->v1 - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), LEFT|attr2); + if (v1_unsigned >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannel(CSW_3RD_COLUMN, y, v1_unsigned - MIXSRC_FIRST_TELEM, convertCswTelemValue(cs), LEFT|attr2); v2_min = -128; v2_max = 127; } else { @@ -4711,17 +4712,17 @@ void menuModelLogicalSwitches(uint8_t event) break; } case LS_FIELD_V1: - cs->v1 = CHECK_INCDEC_PARAM(event, cs->v1, v1_min, v1_max); + cs->v1 = CHECK_INCDEC_PARAM(event, v1_unsigned, v1_min, v1_max); break; case LS_FIELD_V2: cs->v2 = CHECK_INCDEC_PARAM(event, cs->v2, v2_min, v2_max); #if defined(PCBTARANIS) - if (cstate==LS_FAMILY_OFS && cs->v1!=0 && event==EVT_KEY_LONG(KEY_ENTER)) { + if (cstate==LS_FAMILY_OFS && v1_unsigned!=0 && event==EVT_KEY_LONG(KEY_ENTER)) { killEvents(event); - getvalue_t x = getValue(cs->v1); - if (cs->v1 < MIXSRC_GVAR1) + getvalue_t x = getValue(v1_unsigned); + if (v1_unsigned < MIXSRC_GVAR1) cs->v2 = calcRESXto100(x); - else if (cs->v1 - MIXSRC_FIRST_TELEM + 1 == TELEM_ALT) + else if (v1_unsigned - MIXSRC_FIRST_TELEM + 1 == TELEM_ALT) cs->v2 *= 100; eeDirty(EE_MODEL); }