diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index c57692d81..ccab36a00 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -196,10 +196,12 @@ endif() if(CURVES) add_definitions(-DCURVES) + set(SRC ${SRC} curves.cpp) endif() if(GVARS) add_definitions(-DGVARS) + set(SRC ${SRC} gvars.cpp) math(EXPR EEPROM_VARIANT ${EEPROM_VARIANT}+${GVARS_VARIANT}) endif() @@ -285,13 +287,6 @@ set(SRC trainer_input.cpp ) -if(CURVES) - set(SRC - ${SRC} - curves.cpp - ) -endif() - if(GUI) add_definitions(-DGUI) set(SRC diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 3c3adf5d1..205964819 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -402,36 +402,34 @@ void evalFunctions() #if defined(GVARS) case FUNC_ADJUST_GVAR: - if (isRepeatDelayElapsed(functions, functionsContext, i)) { - if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_CONSTANT) { - SET_GVAR(CFN_GVAR_INDEX(cfn), CFN_PARAM(cfn), mixerCurrentFlightMode); - } - else if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_GVAR) { - SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_PARAM(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_PARAM(cfn))), mixerCurrentFlightMode); - } - else if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_INCDEC) { + if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_CONSTANT) { + SET_GVAR(CFN_GVAR_INDEX(cfn), CFN_PARAM(cfn), mixerCurrentFlightMode); + } + else if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_GVAR) { + SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_PARAM(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_PARAM(cfn))), mixerCurrentFlightMode); + } + else if (CFN_GVAR_MODE(cfn) == FUNC_ADJUST_GVAR_INCDEC) { #if defined(CPUARM) - SET_GVAR(CFN_GVAR_INDEX(cfn), limit(CFN_GVAR_CST_MIN+g_model.gvars[CFN_GVAR_INDEX(cfn)].min, GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + CFN_PARAM(cfn), CFN_GVAR_CST_MAX-g_model.gvars[CFN_GVAR_INDEX(cfn)].max), mixerCurrentFlightMode); + SET_GVAR(CFN_GVAR_INDEX(cfn), limit(CFN_GVAR_CST_MIN+g_model.gvars[CFN_GVAR_INDEX(cfn)].min, GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + CFN_PARAM(cfn), CFN_GVAR_CST_MAX-g_model.gvars[CFN_GVAR_INDEX(cfn)].max), mixerCurrentFlightMode); #else - if (!(functionsContext.activeSwitches & switch_mask)) { - SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + (CFN_PARAM(cfn) ? +1 : -1), mixerCurrentFlightMode); - } + if (!(functionsContext.activeSwitches & switch_mask)) { + SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + (CFN_PARAM(cfn) ? +1 : -1), mixerCurrentFlightMode); + } #endif - } - else if (CFN_PARAM(cfn) >= MIXSRC_TrimRud && CFN_PARAM(cfn) <= MIXSRC_TrimAil) { - trimGvar[CFN_PARAM(cfn)-MIXSRC_TrimRud] = CFN_GVAR_INDEX(cfn); - } + } + else if (CFN_PARAM(cfn) >= MIXSRC_TrimRud && CFN_PARAM(cfn) <= MIXSRC_TrimAil) { + trimGvar[CFN_PARAM(cfn)-MIXSRC_TrimRud] = CFN_GVAR_INDEX(cfn); + } #if defined(ROTARY_ENCODERS) - else if (CFN_PARAM(cfn) >= MIXSRC_REa && CFN_PARAM(cfn) < MIXSRC_TrimRud) { - int8_t scroll = rePreviousValues[CFN_PARAM(cfn)-MIXSRC_REa] - (rotencValue[CFN_PARAM(cfn)-MIXSRC_REa] / ROTARY_ENCODER_GRANULARITY); - if (scroll) { - SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + scroll, mixerCurrentFlightMode); - } + else if (CFN_PARAM(cfn) >= MIXSRC_REa && CFN_PARAM(cfn) < MIXSRC_TrimRud) { + int8_t scroll = rePreviousValues[CFN_PARAM(cfn)-MIXSRC_REa] - (rotencValue[CFN_PARAM(cfn)-MIXSRC_REa] / ROTARY_ENCODER_GRANULARITY); + if (scroll) { + SET_GVAR(CFN_GVAR_INDEX(cfn), GVAR_VALUE(CFN_GVAR_INDEX(cfn), getGVarFlightMode(mixerCurrentFlightMode, CFN_GVAR_INDEX(cfn))) + scroll, mixerCurrentFlightMode); } + } #endif - else { - SET_GVAR(CFN_GVAR_INDEX(cfn), calcRESXto100(getValue(CFN_PARAM(cfn))), mixerCurrentFlightMode); - } + else { + SET_GVAR(CFN_GVAR_INDEX(cfn), calcRESXto100(getValue(CFN_PARAM(cfn))), mixerCurrentFlightMode); } break; #endif diff --git a/radio/src/gvars.cpp b/radio/src/gvars.cpp new file mode 100644 index 000000000..64ef322d7 --- /dev/null +++ b/radio/src/gvars.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +#if defined(PCBSTD) +int16_t getGVarFieldValue(int16_t x, int16_t min, int16_t max) +{ + if (GV_IS_GV_VALUE(x, min, max)) { + int8_t idx = GV_INDEX_CALCULATION(x, max); + int8_t mul = 1; + + if (idx < 0) { + idx = -1-idx; + mul = -1; + } + + x = GVAR_VALUE(idx, -1) * mul; + } + + return limit(min, x, max); +} + +void setGVarValue(uint8_t idx, int8_t value) +{ + if (GVAR_VALUE(idx, -1) != value) { + SET_GVAR_VALUE(idx, -1, value); + } +} +#else +uint8_t gvarDisplayTimer = 0; +uint8_t gvarLastChanged = 0; + +uint8_t getGVarFlightMode(uint8_t fm, uint8_t gv) // TODO change params order to be consistent! +{ + for (uint8_t i=0; i= fm) result++; + fm = result; + } + return 0; +} + +int16_t getGVarValue(int8_t gv, int8_t fm) +{ + int8_t mul = 1; + if (gv < 0) { + gv = -1-gv; + mul = -1; + } + return GVAR_VALUE(gv, getGVarFlightMode(fm, gv)) * mul; +} + +int32_t getGVarValuePrec1(int8_t gv, int8_t fm) +{ + int8_t mul; + uint8_t prec = g_model.gvars[gv].prec; + if (prec == 0) + mul = 10; + else + mul = 1; + + if (gv < 0) { + gv = -1-gv; + mul = -mul; + } + return GVAR_VALUE(gv, getGVarFlightMode(fm, gv)) * mul; +} + +void setGVarValue(uint8_t gv, int16_t value, int8_t fm) +{ + fm = getGVarFlightMode(fm, gv); + if (GVAR_VALUE(gv, fm) != value) { + SET_GVAR_VALUE(gv, fm, value); + } +} + +int16_t getGVarFieldValue(int16_t val, int16_t min, int16_t max, int8_t fm) +{ + if (GV_IS_GV_VALUE(val, min, max)) { + int8_t gv = GV_INDEX_CALCULATION(val, max); + val = getGVarValue(gv, fm); + } + return limit(min, val, max); +} + +int32_t getGVarFieldValuePrec1(int16_t val, int16_t min, int16_t max, int8_t fm) +{ + if (GV_IS_GV_VALUE(val, min, max)) { + int8_t gv = GV_INDEX_CALCULATION(val, max); + val = getGVarValuePrec1(gv, fm); + } + else { + val *= 10; + } + return limit(min*10, val, max*10); +} +#endif diff --git a/radio/src/gvars.h b/radio/src/gvars.h new file mode 100644 index 000000000..176a7cf93 --- /dev/null +++ b/radio/src/gvars.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _GVARS_H_ +#define _GVARS_H_ + +#if defined(PCBSTD) + // GVars are common to all flight modes + #define GVAR_VALUE(x, p) g_model.gvars[x] + #define SET_GVAR_VALUE(idx, phase, value) \ + (GVAR_VALUE(idx, phase) = value, storageDirty(EE_MODEL)) +#else + // GVars have one value per flight mode + #define GVAR_VALUE(gv, fm) g_model.flightModeData[fm].gvars[gv] + #define SET_GVAR_VALUE(idx, phase, value) \ + GVAR_VALUE(idx, phase) = value; \ + storageDirty(EE_MODEL); \ + if (g_model.gvars[idx].popup) { \ + gvarLastChanged = idx; \ + gvarDisplayTimer = GVAR_DISPLAY_TIME; \ + } +#endif + +#if defined(GVARS) + #if defined(PCBSTD) + int16_t getGVarFieldValue(int16_t x, int16_t min, int16_t max); + void setGVarValue(uint8_t x, int8_t value); + #define GET_GVAR(x, min, max, fm) getGVarFieldValue(x, min, max) + #define SET_GVAR(idx, val, fm) setGVarValue(idx, val) + #else + uint8_t getGVarFlightMode(uint8_t fm, uint8_t gv); + int16_t getGVarFieldValue(int16_t x, int16_t min, int16_t max, int8_t fm); + int32_t getGVarFieldValuePrec1(int16_t x, int16_t min, int16_t max, int8_t fm); + int16_t getGVarValue(int8_t gv, int8_t fm); + int32_t getGVarValuePrec1(int8_t gv, int8_t fm); + void setGVarValue(uint8_t x, int16_t value, int8_t fm); + #define GET_GVAR(x, min, max, fm) getGVarFieldValue(x, min, max, fm) + #define SET_GVAR(idx, val, fm) setGVarValue(idx, val, fm) + #define GVAR_DISPLAY_TIME 100 /*1 second*/; + #define GET_GVAR_PREC1(x, min, max, fm) getGVarFieldValuePrec1(x, min, max, fm) + extern uint8_t gvarDisplayTimer; + extern uint8_t gvarLastChanged; + #endif +#else + #define GET_GVAR(x, ...) (x) + #define GET_GVAR_PREC1(x, ...) (x*10) +#endif + +#if defined(CPUARM) + #define GV_GET_GV1_VALUE(max) ((max<=GV_RANGESMALL && min>=GV_RANGESMALL_NEG) ? GV1_SMALL : GV1_LARGE) + #define GV_INDEX_CALCULATION(x,max) ((max<=GV_RANGESMALL && min>=GV_RANGESMALL_NEG) ? (uint8_t) x-GV1_SMALL : ((x&(GV1_LARGE*2-1))-GV1_LARGE)) + #define GV_IS_GV_VALUE(x,min,max) ((max>GV1_SMALL || min<-GV1_SMALL) ? (x>GV_RANGELARGE || xmax) || (xmax) || (xrotaryEncoders[idx]; + return flightModeAddress(getRotaryEncoderFlightMode(idx))->rotaryEncoders[idx]; } void incRotaryEncoder(uint8_t idx, int8_t inc) { rotencValue[idx] += inc; - int16_t *value = &(flightModeAddress(getRotaryEncoderFlightPhase(idx))->rotaryEncoders[idx]); + int16_t *value = &(flightModeAddress(getRotaryEncoderFlightMode(idx))->rotaryEncoders[idx]); *value = limit((int16_t)-RESX, (int16_t)(*value + (inc * 8)), (int16_t)+RESX); storageDirty(EE_MODEL); } #endif -#if defined(GVARS) - -#if defined(PCBSTD) - #define SET_GVAR_VALUE(idx, phase, value) \ - (GVAR_VALUE(idx, phase) = value, storageDirty(EE_MODEL)) -#else - #define SET_GVAR_VALUE(idx, phase, value) \ - GVAR_VALUE(idx, phase) = value; \ - storageDirty(EE_MODEL); \ - if (g_model.gvars[idx].popup) { \ - gvarLastChanged = idx; \ - gvarDisplayTimer = GVAR_DISPLAY_TIME; \ - } -#endif - -#if defined(PCBSTD) -int16_t getGVarFieldValue(int16_t x, int16_t min, int16_t max) -{ - if (GV_IS_GV_VALUE(x, min, max)) { - int8_t idx = GV_INDEX_CALCULATION(x, max); - int8_t mul = 1; - - if (idx < 0) { - idx = -1-idx; - mul = -1; - } - - x = GVAR_VALUE(idx, -1) * mul; - } - - return limit(min, x, max); -} - -void setGVarValue(uint8_t idx, int8_t value) -{ - if (GVAR_VALUE(idx, -1) != value) { - SET_GVAR_VALUE(idx, -1, value); - } -} -#else -uint8_t gvarDisplayTimer = 0; -uint8_t gvarLastChanged = 0; - -uint8_t getGVarFlightMode(uint8_t fm, uint8_t gv) // TODO change params order to be consistent! -{ - for (uint8_t i=0; i= fm) result++; - fm = result; - } - return 0; -} - -int16_t getGVarValue(int8_t gv, int8_t fm) -{ - int8_t mul = 1; - if (gv < 0) { - gv = -1-gv; - mul = -1; - } - return GVAR_VALUE(gv, getGVarFlightMode(fm, gv)) * mul; -} - -int32_t getGVarValuePrec1(int8_t gv, int8_t fm) -{ - int8_t mul; - uint8_t prec = g_model.gvars[gv].prec; - if (prec == 0) - mul = 10; - else - mul = 1; - - if (gv < 0) { - gv = -1-gv; - mul = -mul; - } - return GVAR_VALUE(gv, getGVarFlightMode(fm, gv)) * mul; -} - -void setGVarValue(uint8_t gv, int16_t value, int8_t fm) -{ - fm = getGVarFlightMode(fm, gv); - if (GVAR_VALUE(gv, fm) != value) { - SET_GVAR_VALUE(gv, fm, value); - } -} - -int16_t getGVarFieldValue(int16_t val, int16_t min, int16_t max, int8_t fm) -{ - if (GV_IS_GV_VALUE(val, min, max)) { - int8_t gv = GV_INDEX_CALCULATION(val, max); - val = getGVarValue(gv, fm); - } - return limit(min, val, max); -} - -int32_t getGVarFieldValuePrec1(int16_t val, int16_t min, int16_t max, int8_t fm) -{ - if (GV_IS_GV_VALUE(val, min, max)) { - int8_t gv = GV_INDEX_CALCULATION(val, max); - val = getGVarValuePrec1(gv, fm); - } - else { - val *= 10; - } - return limit(min*10, val, max*10); -} -#endif - -#endif - #if defined(CPUARM) getvalue_t convert16bitsTelemValue(source_t channel, ls_telemetry_value_t value) { @@ -1380,7 +1266,7 @@ uint8_t checkTrim(event_t event) thro = false; } else { - phase = getTrimFlightPhase(mixerCurrentFlightMode, idx); + phase = getTrimFlightMode(mixerCurrentFlightMode, idx); #if defined(CPUARM) before = getTrimValue(phase, idx); #else @@ -1389,7 +1275,7 @@ uint8_t checkTrim(event_t event) thro = (idx==THR_STICK && g_model.thrTrim); } #else - phase = getTrimFlightPhase(mixerCurrentFlightMode, idx); + phase = getTrimFlightMode(mixerCurrentFlightMode, idx); #if defined(CPUARM) before = getTrimValue(phase, idx); #else @@ -2359,7 +2245,7 @@ void instantTrim() for (uint8_t stick=0; stick=GV_RANGESMALL_NEG) ? GV1_SMALL : GV1_LARGE ) - #define GV_INDEX_CALCULATION(x,max) ( (max<=GV_RANGESMALL && min>=GV_RANGESMALL_NEG) ? (uint8_t) x-GV1_SMALL : ((x&(GV1_LARGE*2-1))-GV1_LARGE) ) - #define GV_IS_GV_VALUE(x,min,max) ( (max>GV1_SMALL || min<-GV1_SMALL) ? (x>GV_RANGELARGE || xmax) || (xmax) || (x