/* * Copyright (C) EdgeTX * * Based on code named * opentx - https://github.com/opentx/opentx * 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 _MYEEPROM_H_ #define _MYEEPROM_H_ #include "datastructs.h" #include "bitfield.h" #include "storage/yaml/yaml_defs.h" #include "hal/switch_driver.h" #define GET_MODULE_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol #define GET_TRAINER_PPM_POLARITY() g_model.trainerData.pulsePol #define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted #define GET_MODULE_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300) #define GET_TRAINER_PPM_DELAY() (g_model.trainerData.delay * 50 + 300) #define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) #if defined(GVARS) #define IS_ADJUST_GV_FUNC(func) ((func) == FUNC_ADJUST_GVAR) #else #define IS_ADJUST_GV_FUNC(func) (0) #endif #if defined(HAPTIC) #define IS_HAPTIC_FUNC(func) ((func) == FUNC_HAPTIC) #else #define IS_HAPTIC_FUNC(func) (0) #endif #define HAS_REPEAT_PARAM(func) (IS_PLAY_FUNC(func) || IS_HAPTIC_FUNC(func) || func == FUNC_PLAY_SCRIPT || func == FUNC_RGB_LED || func == FUNC_SET_SCREEN) #define CFN_EMPTY(p) (!(p)->swtch) #define CFN_SWITCH(p) ((p)->swtch) #define CFN_FUNC(p) ((p)->func) #define CFN_ACTIVE(p) ((p)->active) #define CFN_CH_INDEX(p) ((p)->all.param) #define CFN_CS_INDEX(p) ((p)->all.param) #define CFN_GVAR_INDEX(p) ((p)->all.param) #define CFN_TIMER_INDEX(p) ((p)->all.param) #define CFN_PLAY_REPEAT(p) ((p)->repeat) #define CFN_PLAY_REPEAT_MUL 1 #define CFN_PLAY_REPEAT_NOSTART -1 #define CFN_GVAR_MODE(p) ((p)->all.mode) #define CFN_PARAM(p) ((p)->all.val) #define CFN_VAL2(p) ((p)->all.val2) #define CFN_RESET(p) ((p)->active=0, (p)->clear.val1=0, (p)->clear.val2=0) #define CFN_GVAR_CST_MIN -GVAR_MAX #define CFN_GVAR_CST_MAX GVAR_MAX #define MODEL_GVAR_MIN(idx) (CFN_GVAR_CST_MIN + g_model.gvars[idx].min) #define MODEL_GVAR_MAX(idx) (CFN_GVAR_CST_MAX - g_model.gvars[idx].max) // stick config #define STICK_CFG_INV_BITS 1 // pots config #define POT_CFG_TYPE_BITS 3 #define POT_CFG_INV_BITS 1 #define POT_CFG_BITS (POT_CFG_TYPE_BITS + POT_CFG_INV_BITS) #define POT_CFG_MASK ((1 << POT_CFG_BITS) - 1) #define POT_CONFIG_POS(x) (POT_CFG_BITS * (x)) #define POT_CONFIG_MASK(x) (POT_CFG_MASK << POT_CONFIG_POS(x)) #define POT_CONFIG_DISABLE_MASK(x) (~POT_CONFIG_MASK(x)) #define SW_CFG_BITS 2 #define SW_CFG_MASK ((1 << SW_CFG_BITS) - 1) #define SWITCH_CONFIG_MASK(x) ((swconfig_t)SW_CFG_MASK << (SW_CFG_BITS * (x))) #define SWITCH_EXISTS(x) (g_model.getSwitchType(x) != SWITCH_NONE) #define IS_CONFIG_3POS(x) (g_model.getSwitchType(x) == SWITCH_3POS) #define IS_CONFIG_TOGGLE(x) (g_model.getSwitchType(x) == SWITCH_TOGGLE) #define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !IS_CONFIG_TOGGLE(x)) #define ALTERNATE_VIEW 0x10 #define SWITCHES_DELAY() uint8_t(15+g_eeGeneral.switchesDelay) #define SWITCHES_DELAY_NONE (-15) #define HAPTIC_STRENGTH() (3+g_eeGeneral.hapticStrength) enum CurveRefType { CURVE_REF_DIFF, CURVE_REF_EXPO, CURVE_REF_FUNC, CURVE_REF_CUSTOM }; #define EXPO_VALID(ed) ((ed)->mode) #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) #define limit_min_max_t int16_t #define LIMIT_EXT_PERCENT 150 #define LIMIT_STD_PERCENT 100 #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) #define LIMIT_STD_MAX (LIMIT_STD_PERCENT*10) #define PPM_CENTER_MAX 500 #define LIMIT_MAX(lim) \ (GV_IS_GV_VALUE(lim->max) \ ? GET_GVAR_PREC1(lim->max, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \ mixerCurrentFlightMode) \ : lim->max + LIMIT_STD_MAX) #define LIMIT_MIN(lim) \ (GV_IS_GV_VALUE(lim->min) \ ? GET_GVAR_PREC1(lim->min, -LIMIT_EXT_MAX, +LIMIT_EXT_MAX, \ mixerCurrentFlightMode) \ : lim->min - LIMIT_STD_MAX) #define LIMIT_OFS(lim) \ (GV_IS_GV_VALUE(lim->offset) \ ? GET_GVAR_PREC1(lim->offset, -LIMIT_STD_MAX, +LIMIT_STD_MAX, \ mixerCurrentFlightMode) \ : lim->offset) #define LIMIT_MAX_RESX(lim) calc1000toRESX(LIMIT_MAX(lim)) #define LIMIT_MIN_RESX(lim) calc1000toRESX(LIMIT_MIN(lim)) #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) #define LIMITS_MIN_MAX_OFFSET LIMIT_STD_MAX #define TRIM_OFF (1) #define TRIM_ON (0) enum MixerMultiplex { MLTPX_ADD = 0, MLTPX_MUL = 1, MLTPX_REPL = 2, }; enum TrainerMultiplex { TRAINER_OFF = 0, TRAINER_ADD = 1, TRAINER_REPL = 2, }; #define DELAY_MAX 250 /* 25 seconds */ #define SLOW_MAX 250 /* 25 seconds */ #define MD_WEIGHT(md) (md->weight) #define MD_WEIGHT_TO_UNION(md, var) var.word = md->weight #define MD_UNION_TO_WEIGHT(var, md) md->weight = var.word #define MD_OFFSET(md) (md->offset) #define MD_OFFSET_TO_UNION(md, var) var.word = md->offset #define MD_UNION_TO_OFFSET(var, md) md->offset = var.word enum LogicalSwitchesFunctions { LS_FUNC_NONE, LS_FUNC_VEQUAL, // v==offset LS_FUNC_VALMOSTEQUAL, // v~=offset LS_FUNC_VPOS, // v>offset LS_FUNC_VNEG, // voffset LS_FUNC_ANEG, // |v|