From db27a81a5d822dc4952456a535689f2708badd68 Mon Sep 17 00:00:00 2001 From: Bertrand Songis Date: Mon, 18 Mar 2019 15:14:27 +0100 Subject: [PATCH] Conversions refactoring started --- radio/src/CMakeLists.txt | 1 + .../conversions/conversions_216_217.cpp | 213 +++++++++++- .../src/storage/conversions/datastructs_216.h | 313 +++++++++++++++++- 3 files changed, 504 insertions(+), 23 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index b1f15aa49..8fc00e6d6 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -134,6 +134,7 @@ endif() if(ARCH STREQUAL ARM AND NOT PCB STREQUAL X12S AND NOT PCB STREQUAL X10 AND NOT PCB STREQUAL XLITE AND NOT PCB STREQUAL XLITES AND NOT PCB STREQUAL X3) add_definitions(-DEEPROM_CONVERSIONS) set(SRC ${SRC} storage/eeprom_conversions.cpp) + # set(SRC ${SRC} storage/conversions/conversions_216_217.cpp) endif() add_definitions(-DFLAVOUR="${FLAVOUR}") diff --git a/radio/src/storage/conversions/conversions_216_217.cpp b/radio/src/storage/conversions/conversions_216_217.cpp index fe069a164..eea103a58 100644 --- a/radio/src/storage/conversions/conversions_216_217.cpp +++ b/radio/src/storage/conversions/conversions_216_217.cpp @@ -1,3 +1,207 @@ +#include +#include "datastructs_216.h" + +enum SwitchSources { + SWSRC_NONE = 0, + + SWSRC_FIRST_SWITCH, + +#if defined(PCBTARANIS) + SWSRC_SA0 = SWSRC_FIRST_SWITCH, + SWSRC_SA1, + SWSRC_SA2, + SWSRC_SB0, + SWSRC_SB1, + SWSRC_SB2, + SWSRC_SC0, + SWSRC_SC1, + SWSRC_SC2, + SWSRC_SD0, + SWSRC_SD1, + SWSRC_SD2, + SWSRC_SE0, + SWSRC_SE1, + SWSRC_SE2, + SWSRC_SF0, + SWSRC_SF2, + SWSRC_SG0, + SWSRC_SG1, + SWSRC_SG2, + SWSRC_SH0, + SWSRC_SH2, + SWSRC_TRAINER = SWSRC_SH2, +#else + SWSRC_ID0 = SWSRC_FIRST_SWITCH, + SWSRC_ID1, + SWSRC_ID2, + SWSRC_THR, + SWSRC_RUD, + SWSRC_ELE, + SWSRC_AIL, + SWSRC_GEA, + SWSRC_TRN, + SWSRC_TRAINER = SWSRC_TRN, +#endif + + SWSRC_LAST_SWITCH = SWSRC_TRAINER, + +#if defined(PCBTARANIS) + SWSRC_FIRST_MULTIPOS_SWITCH, + SWSRC_LAST_MULTIPOS_SWITCH = SWSRC_FIRST_MULTIPOS_SWITCH + (NUM_XPOTS*XPOTS_MULTIPOS_COUNT) - 1, +#endif + + SWSRC_FIRST_TRIM, + SWSRC_TrimRudLeft = SWSRC_FIRST_TRIM, + SWSRC_TrimRudRight, + SWSRC_TrimEleDown, + SWSRC_TrimEleUp, + SWSRC_TrimThrDown, + SWSRC_TrimThrUp, + SWSRC_TrimAilLeft, + SWSRC_TrimAilRight, + SWSRC_LAST_TRIM = SWSRC_TrimAilRight, + +#if defined(PCBSKY9X) + SWSRC_REa, +#endif + + SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW1 = SWSRC_FIRST_LOGICAL_SWITCH, + SWSRC_SW2, + SWSRC_SW3, + SWSRC_SW4, + SWSRC_SW5, + SWSRC_SW6, + SWSRC_SW7, + SWSRC_SW8, + SWSRC_SW9, + SWSRC_SWA, + SWSRC_SWB, + SWSRC_SWC, + SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + SWSRC_ON, + SWSRC_One, + + SWSRC_FIRST_FLIGHT_MODE, + SWSRC_LAST_FLIGHT_MODE = SWSRC_FIRST_FLIGHT_MODE+MAX_FLIGHT_MODES-1, + + SWSRC_COUNT, + + SWSRC_OFF = -SWSRC_ON, + + SWSRC_LAST = SWSRC_COUNT-1, + SWSRC_FIRST = -SWSRC_LAST, + + SWSRC_LAST_IN_LOGICAL_SWITCHES = SWSRC_LAST_FLIGHT_MODE, + SWSRC_LAST_IN_MIXES = SWSRC_LAST_FLIGHT_MODE, + SWSRC_FIRST_IN_LOGICAL_SWITCHES = -SWSRC_LAST_IN_LOGICAL_SWITCHES, + SWSRC_FIRST_IN_MIXES = -SWSRC_LAST_IN_MIXES, +}; + +enum MixSources { + MIXSRC_NONE, + +#if defined(PCBTARANIS) + MIXSRC_FIRST_INPUT, + MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, + + MIXSRC_FIRST_LUA, + MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, +#endif + + MIXSRC_Rud, + MIXSRC_Ele, + MIXSRC_Thr, + MIXSRC_Ail, + + MIXSRC_FIRST_POT, +#if defined(PCBTARANIS) + MIXSRC_POT1 = MIXSRC_FIRST_POT, + MIXSRC_POT2, + MIXSRC_POT3, + MIXSRC_SLIDER1, + MIXSRC_SLIDER2, + MIXSRC_LAST_POT = MIXSRC_SLIDER2, +#else + MIXSRC_P1 = MIXSRC_FIRST_POT, + MIXSRC_P2, + MIXSRC_P3, + MIXSRC_LAST_POT = MIXSRC_P3, +#endif + +#if defined(PCBSKY9X) + MIXSRC_REa, + MIXSRC_LAST_ROTARY_ENCODER = MIXSRC_REa, +#endif + + MIXSRC_MAX, + + MIXSRC_CYC1, + MIXSRC_CYC2, + MIXSRC_CYC3, + + MIXSRC_TrimRud, + MIXSRC_TrimEle, + MIXSRC_TrimThr, + MIXSRC_TrimAil, + + MIXSRC_FIRST_SWITCH, + +#if defined(PCBTARANIS) + MIXSRC_SA = MIXSRC_FIRST_SWITCH, + MIXSRC_SB, + MIXSRC_SC, + MIXSRC_SD, + MIXSRC_SE, + MIXSRC_SF, + MIXSRC_SG, + MIXSRC_SH, +#else + MIXSRC_3POS = MIXSRC_FIRST_SWITCH, + MIXSRC_THR, + MIXSRC_RUD, + MIXSRC_ELE, + MIXSRC_AIL, + MIXSRC_GEA, + MIXSRC_TRN, +#endif + MIXSRC_FIRST_LOGICAL_SWITCH, + MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, + MIXSRC_SW9 = MIXSRC_SW1 + 8, + MIXSRC_SWA, + MIXSRC_SWB, + MIXSRC_SWC, + MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, + + MIXSRC_FIRST_TRAINER, + MIXSRC_LAST_TRAINER = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, + + MIXSRC_FIRST_CH, + MIXSRC_CH1 = MIXSRC_FIRST_CH, + MIXSRC_CH2, + MIXSRC_CH3, + MIXSRC_CH4, + MIXSRC_CH5, + MIXSRC_CH6, + MIXSRC_CH7, + MIXSRC_CH8, + MIXSRC_CH9, + MIXSRC_CH10, + MIXSRC_CH11, + MIXSRC_CH12, + MIXSRC_CH13, + MIXSRC_CH14, + MIXSRC_CH15, + MIXSRC_CH16, + MIXSRC_LAST_CH = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, + + MIXSRC_GVAR1, + MIXSRC_LAST_GVAR = MIXSRC_GVAR1+MAX_GVARS-1, + + MIXSRC_FIRST_TELEM, + MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1 +}; int ConvertTelemetrySource_216_to_217(int source) { @@ -52,9 +256,7 @@ int ConvertGVar_216_to_217(int value) return value; } - - -void ConvertRadioData_216_to_217(RadioData & settings) +void ConvertRadioData_216_to_217(void * settings) { RadioData_v216 * settings_v216 = (RadioData_v216 *)&settings; settings_v216->version = 217; @@ -64,8 +266,7 @@ void ConvertRadioData_216_to_217(RadioData & settings) #endif } - -void ConvertModel_216_to_217(ModelData & model) +void ConvertModel_216_to_217(void * model) { // Timer3 added // 32bits Timers @@ -73,7 +274,7 @@ void ConvertModel_216_to_217(ModelData & model) // PPM center range // Telemetry custom screens - assert(sizeof(ModelData_v216) <= sizeof(ModelData)); + // TODO perhaps will be needed, but elsewhere assert(sizeof(ModelData_v216) <= sizeof(ModelData)); ModelData_v216 oldModel; memcpy(&oldModel, &model, sizeof(oldModel)); diff --git a/radio/src/storage/conversions/datastructs_216.h b/radio/src/storage/conversions/datastructs_216.h index 22d7a21a6..ca496dc9d 100644 --- a/radio/src/storage/conversions/datastructs_216.h +++ b/radio/src/storage/conversions/datastructs_216.h @@ -1,3 +1,223 @@ +#include "definitions.h" +#include "board.h" + +#define NUM_STICKS 4 + +#define XPOTS_MULTIPOS_COUNT 6 + +#define MAX_SCRIPT_INPUTS 10 +#define MAX_SCRIPT_OUTPUTS 6 +#define MAX_GVARS 9 + +#if defined(PCBHORUS) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 9 + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 + #define MAX_CUSTOM_SCREENS 5 +#elif defined(PCBTARANIS) + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 64 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_SCRIPTS 7 + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 +#else + #define MAX_MODELS 60 + #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 + #define MAX_FLIGHT_MODES 9 + #define MAX_MIXERS 64 + #define MAX_EXPOS 32 + #define MAX_LOGICAL_SWITCHES 64 + #define MAX_SPECIAL_FUNCTIONS 64 // number of functions assigned to switches + #define MAX_INPUTS 32 + #define MAX_TRAINER_CHANNELS 16 + #define MAX_TELEMETRY_SENSORS 32 +#endif + + +#if defined(PCBHORUS) + #define LEN_SWITCH_NAME 3 + #define LEN_ANA_NAME 3 + #define LEN_MODEL_FILENAME 16 + #define LEN_BLUETOOTH_NAME 10 +#else + #define LEN_SWITCH_NAME 3 + #define LEN_ANA_NAME 3 + #define LEN_BLUETOOTH_NAME 10 +#endif + +#if defined(PCBHORUS) + #define LEN_MODEL_NAME 15 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 10 // TODO next EEPROM change: we need 14 here as we have to store the file extension + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#elif LCD_W == 212 + #define LEN_MODEL_NAME 12 + #define LEN_TIMER_NAME 8 + #define LEN_FLIGHT_MODE_NAME 10 + #define LEN_BITMAP_NAME 10 + #define LEN_EXPOMIX_NAME 8 // TODO next EEPROM change: 6 seem enough + #define LEN_CHANNEL_NAME 6 + #define LEN_INPUT_NAME 4 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 8 + #define MAX_CURVES 32 + #define MAX_CURVE_POINTS 512 +#else + #define LEN_MODEL_NAME 10 + #define LEN_TIMER_NAME 3 + #define LEN_FLIGHT_MODE_NAME 6 + #define LEN_EXPOMIX_NAME 6 + #define LEN_CHANNEL_NAME 4 + #define LEN_INPUT_NAME 3 + #define LEN_CURVE_NAME 3 + #define LEN_FUNCTION_NAME 6 + #define MAX_CURVES 16 // TODO next EEPROM check if can be changed to 32 to have all ARM the same + #define MAX_CURVE_POINTS 512 +#endif + +enum TelemetrySource { + TELEM_NONE, + TELEM_TX_VOLTAGE, + TELEM_TX_TIME, + TELEM_RESERVE1, + TELEM_RESERVE2, + TELEM_RESERVE3, + TELEM_RESERVE4, + TELEM_RESERVE5, + TELEM_TIMER1, + TELEM_TIMER2, + TELEM_SWR, + TELEM_RSSI_TX, + TELEM_RSSI_RX, + TELEM_RESERVE0, + TELEM_A_FIRST, + TELEM_A1=TELEM_A_FIRST, + TELEM_A2, + TELEM_A3, + TELEM_A4, + TELEM_A_LAST=TELEM_A4, + TELEM_ALT, + TELEM_RPM, + TELEM_FUEL, + TELEM_T1, + TELEM_T2, + TELEM_SPEED, + TELEM_DIST, + TELEM_GPSALT, + TELEM_CELL, + TELEM_CELLS_SUM, + TELEM_VFAS, + TELEM_CURRENT, + TELEM_CONSUMPTION, + TELEM_POWER, + TELEM_ACCx, + TELEM_ACCy, + TELEM_ACCz, + TELEM_HDG, + TELEM_VSPEED, + TELEM_ASPEED, + TELEM_DTE, + TELEM_RESERVE6, + TELEM_RESERVE7, + TELEM_RESERVE8, + TELEM_RESERVE9, + TELEM_RESERVE10, + TELEM_MIN_A_FIRST, + TELEM_MIN_A1=TELEM_MIN_A_FIRST, + TELEM_MIN_A2, + TELEM_MIN_A3, + TELEM_MIN_A4, + TELEM_MIN_A_LAST=TELEM_MIN_A4, + // TODO: add A1-4 MAX + TELEM_MIN_ALT, + TELEM_MAX_ALT, + TELEM_MAX_RPM, + TELEM_MAX_T1, + TELEM_MAX_T2, + TELEM_MAX_SPEED, + TELEM_MAX_DIST, + TELEM_MAX_ASPEED, + TELEM_MIN_CELL, + TELEM_MIN_CELLS_SUM, + TELEM_MIN_VFAS, + TELEM_MAX_CURRENT, + TELEM_MAX_POWER, + TELEM_RESERVE11, + TELEM_RESERVE12, + TELEM_RESERVE13, + TELEM_RESERVE14, + TELEM_RESERVE15, + TELEM_ACC, + TELEM_GPS_TIME, + TELEM_CSW_MAX = TELEM_MAX_POWER, + TELEM_NOUSR_MAX = TELEM_A2, + TELEM_DISPLAY_MAX = TELEM_MAX_POWER, + TELEM_STATUS_MAX = TELEM_GPS_TIME, + TELEM_FIRST_STREAMED_VALUE = TELEM_RSSI_TX, +}; + +#define NUM_TELEMETRY TELEM_CSW_MAX + +#if defined(PCBTARANIS) +enum CurveType { + CURVE_TYPE_STANDARD, + CURVE_TYPE_CUSTOM, + CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM +}; +PACK(typedef struct { + uint8_t type:3; + uint8_t smooth:1; + uint8_t spare:4; + int8_t points; +}) CurveInfo; +#define NUM_POINTS 512 +#define CURVDATA CurveInfo +#else +#define LEN_MODEL_NAME 10 + #define LEN_EXPOMIX_NAME 6 + #define LEN_FP_NAME 6 + #define NUM_POINTS 512 + #define CURVDATA int16_t +#endif + +#if defined(PCBTARANIS) +enum CurveRefType { + CURVE_REF_DIFF, + CURVE_REF_EXPO, + CURVE_REF_FUNC, + CURVE_REF_CUSTOM +}; +PACK(typedef struct { + uint8_t type; + int8_t value; +}) CurveRef; +#else +#define MODE_DIFFERENTIAL 0 + #define MODE_EXPO 0 + #define MODE_CURVE 1 +#endif + #if defined(PCBTARANIS) PACK(typedef struct { uint8_t srcRaw; @@ -120,7 +340,7 @@ PACK(typedef struct { uint8_t fadeIn; uint8_t fadeOut; int16_t rotaryEncoders[1]; - gvar_t gvars[9]; + int16_t gvars[9]; }) FlightModeData_v216; PACK(typedef struct { // Logical Switches data @@ -188,6 +408,13 @@ PACK(typedef struct { uint8_t barMax; // ditto for max display (would usually = ratio) }) FrSkyBarData_v216; + +#if LCD_W >= 212 +#define NUM_LINE_ITEMS 3 +#else +#define NUM_LINE_ITEMS 2 +#endif + PACK(typedef struct { uint8_t sources[NUM_LINE_ITEMS]; }) FrSkyLineData_v216; @@ -263,6 +490,16 @@ PACK(typedef struct { }) ModelHeader_v216; #endif +PACK(struct GVarData { + char name[3]; + uint32_t min:12; + uint32_t max:12; + uint32_t popup:1; + uint32_t prec:1; + uint32_t unit:2; + uint32_t spare:4; +}); + PACK(typedef struct { ModelHeader_v216 header; TimerData_v216 timers[2]; @@ -275,7 +512,7 @@ PACK(typedef struct { uint8_t extendedLimits:1; uint8_t extendedTrims:1; uint8_t throttleReversed:1; - BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 + uint16_t beepANACenter; // 1<<0->A1.. 1<<6->A7 MixData_v216 mixData[MAX_MIXERS]; LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; ExpoData_v216 expoData[MAX_EXPOS]; @@ -299,11 +536,11 @@ PACK(typedef struct { uint8_t externalModule; -if defined(PCBTARANIS) +#if defined(PCBTARANIS) uint8_t trainerMode; #endif - ModuleData_v216 moduleData[NUM_MODULES+1]; + ModuleData_v216 moduleData[2 + 1]; #if defined(PCBTARANIS) char curveNames[MAX_CURVES][6]; @@ -317,6 +554,41 @@ if defined(PCBTARANIS) }) ModelData_v216; +PACK(struct CalibData { + int16_t mid; + int16_t spanNeg; + int16_t spanPos; +}); + + +PACK(struct TrainerMix { + uint8_t srcChn:6; // 0-7 = ch1-8 + uint8_t mode:2; // off,add-mode,subst-mode + int8_t studWeight; + }); + + +PACK(struct TrainerData { + int16_t calib[4]; + TrainerMix mix[4]; +}); + +#if defined(COLORLCD) +typedef uint16_t swconfig_t; +typedef uint32_t swarnstate_t; +#elif defined(PCBX9E) +typedef uint64_t swconfig_t; +typedef uint64_t swarnstate_t; +typedef uint32_t swarnenable_t; +#elif defined(PCBTARANIS) +typedef uint16_t swconfig_t; +typedef uint16_t swarnstate_t; +typedef uint8_t swarnenable_t; +#else +typedef uint8_t swarnstate_t; +typedef uint8_t swarnenable_t; +#endif + PACK(typedef struct { uint8_t version; uint16_t variant; @@ -348,7 +620,9 @@ PACK(typedef struct { int8_t PPM_Multiplier; int8_t hapticLength; uint8_t reNavigation; - N_TARANIS_FIELD(uint8_t stickReverse) +#if !defined(PCBTARANIS) + uint8_t stickReverse; +#endif int8_t beepLength:3; int8_t hapticStrength:3; uint8_t gpsFormat:1; @@ -380,17 +654,22 @@ PACK(typedef struct { int8_t varioRepeat; int8_t backgroundVolume; - TARANIS_FIELD(uint8_t serial2Mode:6) - TARANIS_FIELD(uint8_t slidersConfig:2) - TARANIS_FIELD(uint8_t potsConfig) - TARANIS_FIELD(uint8_t backlightColor) - TARANIS_FIELD(swarnstate_t switchUnlockStates) - TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) - TARANIS_FIELD(swconfig_t switchConfig) - TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) - TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) - N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) +#if defined(PCBTARANIS) + uint8_t serial2Mode:6; + uint8_t slidersConfig:2; + uint8_t potsConfig; + uint8_t backlightColor; + swarnstate_t switchUnlockStates; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; + swconfig_t switchConfig; + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; +#else + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; +#endif - TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) - TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) +#if defined(PCBX9E) + uint8_t bluetoothEnable; + char bluetoothName[LEN_BLUETOOTH_NAME]; +#endif }) RadioData_v216;