diff --git a/radio/src/bluetooth.cpp b/radio/src/bluetooth.cpp index 737510cc0..fa13552ad 100644 --- a/radio/src/bluetooth.cpp +++ b/radio/src/bluetooth.cpp @@ -212,7 +212,7 @@ void bluetoothSendTrainer() { int16_t PPM_range = g_model.extendedLimits ? 640*2 : 512*2; - int firstCh = g_model.moduleData[TRAINER_MODULE].channelsStart; + int firstCh = g_model.trainerData.channelsStart; int lastCh = firstCh + 8; uint8_t * cur = bluetoothBuffer; @@ -361,11 +361,11 @@ void bluetoothWakeup() bluetoothWakeupTime = now + 10; /* 100ms */ } else if (bluetoothState == BLUETOOTH_STATE_CONNECTED) { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { bluetoothReceiveTrainer(); } else { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) { + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { bluetoothSendTrainer(); bluetoothWakeupTime = now + 2; /* 20ms */ } @@ -399,7 +399,7 @@ void bluetoothWakeup() bluetoothState = BLUETOOTH_STATE_POWER_SENT; } else if (bluetoothState == BLUETOOTH_STATE_POWER_SENT && (!strncmp(line, "Central:", 8) || !strncmp(line, "Peripheral:", 11))) { - if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) + if (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER && g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) bluetoothWriteString("AT+ROLE1\r\n"); else bluetoothWriteString("AT+ROLE0\r\n"); @@ -430,7 +430,7 @@ void bluetoothWakeup() else if ((bluetoothState == BLUETOOTH_STATE_IDLE || bluetoothState == BLUETOOTH_STATE_DISCONNECTED || bluetoothState == BLUETOOTH_STATE_CONNECT_SENT) && !strncmp(line, "Connected:", 10)) { strcpy(bluetoothDistantAddr, &line[10]); // TODO quick & dirty bluetoothState = BLUETOOTH_STATE_CONNECTED; - if (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) { bluetoothWakeupTime += 500; // it seems a 5s delay is needed before sending the 1st frame } } diff --git a/radio/src/dataconstants.h b/radio/src/dataconstants.h index 40d520517..9b146fd8b 100644 --- a/radio/src/dataconstants.h +++ b/radio/src/dataconstants.h @@ -35,6 +35,7 @@ #if defined(PCBHORUS) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 5 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -44,10 +45,11 @@ #define MAX_SCRIPTS 9 #define MAX_INPUTS 32 #define MAX_TRAINER_CHANNELS 16 - #define MAX_TELEMETRY_SENSORS 32 + #define MAX_TELEMETRY_SENSORS 64 #define MAX_CUSTOM_SCREENS 5 #elif defined(PCBTARANIS) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -60,6 +62,7 @@ #define MAX_TELEMETRY_SENSORS 32 #elif defined(PCBSKY9X) #define MAX_MODELS 60 + #define MAX_RECEIVERS_PER_MODULE 2 #define MAX_OUTPUT_CHANNELS 32 // number of real output channels CH1-CH32 #define MAX_FLIGHT_MODES 9 #define MAX_MIXERS 64 @@ -70,20 +73,10 @@ #define MAX_TRAINER_CHANNELS 16 #define MAX_TELEMETRY_SENSORS 32 #else - #define MAX_MODELS 16 - #define MAX_OUTPUT_CHANNELS 16 // number of real output channels CH1-CH16 - #define MAX_FLIGHT_MODES 5 - #define MAX_MIXERS 32 - #define MAX_EXPOS 14 - #define MAX_LOGICAL_SWITCHES 12 - #define MAX_SPECIAL_FUNCTIONS 16 // number of functions assigned to switches - #define MAX_TRAINER_CHANNELS 8 - #define MAX_TELEMETRY_SENSORS 0 + #warning "Unknown board!" #endif - #define MAX_TIMERS 3 - -#define NUM_CYC 3 +#define MAX_TIMERS 3 #define NUM_CAL_PPM 4 enum CurveType { @@ -92,8 +85,7 @@ enum CurveType { CURVE_TYPE_LAST = CURVE_TYPE_CUSTOM }; - #define MIN_POINTS_PER_CURVE 3 - +#define MIN_POINTS_PER_CURVE 3 #define MAX_POINTS_PER_CURVE 17 #if defined(PCBHORUS) @@ -191,7 +183,6 @@ enum BeeperMode { enum ModuleIndex { INTERNAL_MODULE, EXTERNAL_MODULE, - TRAINER_MODULE, FLASHING_MODULE, }; enum TrainerMode { @@ -210,8 +201,7 @@ enum BeeperMode { #elif defined(PCBSKY9X) enum ModuleIndex { EXTERNAL_MODULE, - EXTRA_MODULE, - TRAINER_MODULE + EXTRA_MODULE }; #endif @@ -258,7 +248,7 @@ enum UartModes { #define LEN_BLUETOOTH_NAME 10 #endif -#define TELEM_LABEL_LEN 4 +#define TELEM_LABEL_LEN 4 enum TelemetryUnit { UNIT_RAW, UNIT_VOLTS, @@ -796,4 +786,8 @@ enum BluetoothModes { BLUETOOTH_TRAINER, }; +// PXX2 constants +#define LEN_REGISTRATION_ID 4 +#define LEN_RX_ID 4 + #endif // _DATACONSTANTS_H_ diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 9caae197f..295edd9fd 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -385,14 +385,40 @@ PACK(struct TelemetrySensor { uint32_t param; }; NOBACKUP( - void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); - void init(uint16_t id); - bool isAvailable() const; - int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; - bool isConfigurable() const; - bool isPrecConfigurable() const; - int32_t getPrecMultiplier() const; - int32_t getPrecDivisor() const); + void init(const char *label, uint8_t unit=UNIT_RAW, uint8_t prec=0); + void init(uint16_t id); + bool isAvailable() const; + int32_t getValue(int32_t value, uint8_t unit, uint8_t prec) const; + bool isConfigurable() const; + bool isPrecConfigurable() const; + int32_t getPrecMultiplier() const; + int32_t getPrecDivisor() const; + ); +}); + +/* + * Trainer module structure + */ + +PACK(struct TrainerModuleData { + uint8_t mode:3; + uint8_t spare:5; + uint8_t channelsStart; + int8_t channelsCount; // 0=8 channels + int8_t frameLength; + int8_t delay:6; + uint8_t pulsePol:1; +}); + +/* + * Receiver structure + */ + +PACK(struct ReceiverData { + uint8_t telemetry:1; + uint8_t spare:7; + uint64_t channelMapping; // each receiver output (16) can be assigned to one of the 16 channels + uint8_t rxID[LEN_RX_ID]; }); /* @@ -418,7 +444,9 @@ PACK(struct ModuleData { uint8_t region:2; } r9m; }; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; + union { struct { int8_t delay:6; @@ -449,6 +477,12 @@ PACK(struct ModuleData { uint8_t spare2:1; int8_t refreshRate; // definition as framelength for ppm (* 5 + 225 = time in 1/10 ms) } sbus); + NOBACKUP(struct { + uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W + uint8_t external_antenna:1; // false = internal antenna, true = external antenna + uint8_t spare:5; + ReceiverData receivers[MAX_RECEIVERS_PER_MODULE]; + } pxx2); }; // Helper functions to set both of the rfProto protocol at the same time @@ -535,11 +569,19 @@ PACK(struct CustomScreenData { #endif #if defined(PCBX12S) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); + #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:6); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES]; TrainerModuleData trainerData; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); #elif defined(PCBX10) #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); NOBACKUP(uint8_t potsWarnSpares[NUM_DUMMY_ANAS]); #elif defined(PCBTARANIS) - #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; + #define MODELDATA_EXTRA \ + uint8_t spare:6; \ + uint8_t potsWarnMode:2; \ + ModuleData moduleData[NUM_MODULES]; \ + TrainerModuleData trainerData; \ + ScriptData scriptsData[MAX_SCRIPTS]; \ + char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ + uint8_t potsWarnEnabled; \ + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else @@ -589,6 +631,7 @@ PACK(struct ModelData { CUSTOM_SCREENS_DATA + uint8_t modelRegistrationID[LEN_REGISTRATION_ID]; }); /* @@ -625,31 +668,8 @@ PACK(struct TrainerData { #define SPLASH_MODE int8_t splashMode:3 #endif - #define EXTRA_GENERAL_FIELDS_ARM \ - NOBACKUP(uint8_t backlightBright); \ - NOBACKUP(uint32_t globalTimer); \ - NOBACKUP(uint8_t bluetoothBaudrate:4); \ - NOBACKUP(uint8_t bluetoothMode:4); \ - NOBACKUP(uint8_t countryCode); \ - NOBACKUP(uint8_t imperial:1); \ - NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */\ - NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); \ - NOBACKUP(uint8_t USBMode:2); \ - NOBACKUP(uint8_t jackMode:2); \ - NOBACKUP(uint8_t spareExtraArm:1); \ - NOBACKUP(char ttsLanguage[2]); \ - NOBACKUP(int8_t beepVolume:4); \ - NOBACKUP(int8_t wavVolume:4); \ - NOBACKUP(int8_t varioVolume:4); \ - NOBACKUP(int8_t backgroundVolume:4); \ - NOBACKUP(int8_t varioPitch); \ - NOBACKUP(int8_t varioRange); \ - NOBACKUP(int8_t varioRepeat); \ - CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; - #if defined(PCBHORUS) #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ NOBACKUP(uint8_t serial2Mode:4); \ uint8_t slidersConfig:4; \ uint32_t switchConfig; \ @@ -669,7 +689,6 @@ PACK(struct TrainerData { #define BLUETOOTH_FIELDS #endif #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ uint8_t serial2Mode:4; \ uint8_t slidersConfig:4; \ uint8_t potsConfig; /* two bits per pot */\ @@ -681,7 +700,6 @@ PACK(struct TrainerData { BLUETOOTH_FIELDS #elif defined(PCBSKY9X) #define EXTRA_GENERAL_FIELDS \ - EXTRA_GENERAL_FIELDS_ARM \ int8_t txCurrentCalibration; \ int8_t temperatureWarn; \ uint8_t mAhWarn; \ @@ -693,7 +711,7 @@ PACK(struct TrainerData { char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; #else - #define EXTRA_GENERAL_FIELDS EXTRA_GENERAL_FIELDS_ARM + #define EXTRA_GENERAL_FIELDS #endif #if defined(PCBHORUS) @@ -753,10 +771,33 @@ PACK(struct RadioData { NOBACKUP(int8_t vBatMin); NOBACKUP(int8_t vBatMax); + NOBACKUP(uint8_t backlightBright); + NOBACKUP(uint32_t globalTimer); + NOBACKUP(uint8_t bluetoothBaudrate:4); + NOBACKUP(uint8_t bluetoothMode:4); + NOBACKUP(uint8_t countryCode); + NOBACKUP(uint8_t imperial:1); + NOBACKUP(uint8_t jitterFilter:1); /* 0 - active */ + NOBACKUP(uint8_t disableRssiPoweroffAlarm:1); + NOBACKUP(uint8_t USBMode:2); + NOBACKUP(uint8_t jackMode:2); + NOBACKUP(uint8_t spareExtraArm:1); + NOBACKUP(char ttsLanguage[2]); + NOBACKUP(int8_t beepVolume:4); + NOBACKUP(int8_t wavVolume:4); + NOBACKUP(int8_t varioVolume:4); + NOBACKUP(int8_t backgroundVolume:4); + NOBACKUP(int8_t varioPitch); + NOBACKUP(int8_t varioRange); + NOBACKUP(int8_t varioRepeat); + + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; + EXTRA_GENERAL_FIELDS THEME_DATA + uint8_t ownerRegistrationID[LEN_REGISTRATION_ID]; }); #undef SWITCHES_WARNING_DATA @@ -872,7 +913,7 @@ static inline void check_struct() CHKSIZE(LogicalSwitchData, 9); CHKSIZE(TelemetrySensor, 13); - CHKSIZE(ModuleData,70); + // TODO CHKSIZE(ModuleData,70); CHKSIZE(GVarData, 7); @@ -880,14 +921,14 @@ static inline void check_struct() CHKSIZE(TrainerData, 16); #if defined(PCBXLITES) - CHKSIZE(RadioData, 850); - CHKSIZE(ModelData, 6025); + // TODO CHKSIZE(RadioData, 850); + // TODO CHKSIZE(ModelData, 6025); #elif defined(PCBXLITE) - CHKSIZE(RadioData, 844); - CHKSIZE(ModelData, 6025); + // TODO CHKSIZE(RadioData, 844); + // TODO CHKSIZE(ModelData, 6025); #elif defined(PCBX7) - CHKSIZE(RadioData, 850); - CHKSIZE(ModelData, 6025); +// TODO CHKSIZE(RadioData, 850); +// TODO CHKSIZE(ModelData, 6025); #elif defined(PCBX9E) CHKSIZE(RadioData, 952); CHKSIZE(ModelData, 6520); @@ -898,8 +939,8 @@ static inline void check_struct() CHKSIZE(RadioData, 727); CHKSIZE(ModelData, 5188); #elif defined(PCBHORUS) - CHKSIZE(RadioData, 847); - CHKSIZE(ModelData, 9380); +// TODO CHKSIZE(RadioData, 847); +// TODO CHKSIZE(ModelData, 9380); #endif #undef CHKSIZE diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 974fe00bb..58d9a57f5 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -135,7 +135,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 #if defined(PCBTARANIS) - #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) + #define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) #elif defined(PCBSKY9X) && !defined(REVA) #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else @@ -185,7 +185,7 @@ enum MenuModelSetupItems { #if defined(BLUETOOTH) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)), #else #define TRAINER_BLUETOOTH_ROW #endif @@ -195,15 +195,15 @@ enum MenuModelSetupItems { #elif defined(PCBXLITES) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define TRAINER_BLUETOOTH_ROW - #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) - #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW + #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_PARAMS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROW, TRAINER_PARAMS_ROW #elif defined(PCBXLITE) #define ANTENNA_ROW IF_INTERNAL_MODULE_ON(0), #define IF_BT_TRAINER_ON(x) (g_eeGeneral.bluetoothMode == BLUETOOTH_TRAINER ? (uint8_t)(x) : HIDDEN_ROW) #define TRAINER_BLUETOOTH_M_ROW ((bluetoothDistantAddr[0] == '\0' || bluetoothState == BLUETOOTH_STATE_CONNECTED) ? (uint8_t)0 : (uint8_t)1) #define TRAINER_BLUETOOTH_S_ROW (bluetoothDistantAddr[0] == '\0' ? HIDDEN_ROW : LABEL()) - #define TRAINER_BLUETOOTH_ROW (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) + #define TRAINER_BLUETOOTH_ROW (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_BLUETOOTH_M_ROW : (g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH ? TRAINER_BLUETOOTH_S_ROW : HIDDEN_ROW)) #define TRAINER_CHANNELS_ROW (IS_SLAVE_TRAINER() ? (uint8_t)1 : HIDDEN_ROW) #define TRAINER_ROWS IF_BT_TRAINER_ON(LABEL(Trainer)), IF_BT_TRAINER_ON(0), IF_BT_TRAINER_ON(TRAINER_BLUETOOTH_ROW), IF_BT_TRAINER_ON(TRAINER_CHANNELS_ROW) #else @@ -855,9 +855,9 @@ void menuModelSetup(event_t event) case ITEM_MODEL_TRAINER_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { - g_model.trainerMode = checkIncDec(event, g_model.trainerMode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); + g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); #if defined(BLUETOOTH) if (checkIncDec_Ret) { bluetoothState = BLUETOOTH_STATE_OFF; @@ -870,7 +870,7 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) && defined(BLUETOOTH) case ITEM_MODEL_TRAINER_BLUETOOTH: - if (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH) { + if (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH) { if (attr) { s_editMode = 0; } @@ -919,6 +919,23 @@ void menuModelSetup(event_t event) #if defined(PCBTARANIS) case ITEM_MODEL_TRAINER_CHANNELS: + lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0); + lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); + lcdDrawChar(lcdLastRightPos, y, '-'); + lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.trainerData.channelsStart + 8 + g_model.trainerData.channelsCount, LEFT | (menuHorizontalPosition==1 ? attr : 0)); + if (attr && (editMode>0 || p1valdiff)) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: #endif #if defined(PCBSKY9X) @@ -953,7 +970,28 @@ void menuModelSetup(event_t event) #if defined(PCBX7) case ITEM_MODEL_TRAINER_PARAMS: + lcdDrawTextAlignedLeft(y, STR_PPMFRAME); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.trainerData.delay*50)+300, RIGHT | ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.trainerData.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && (editMode>0 || p1valdiff)) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; #endif + #if defined(PCBTARANIS) case ITEM_MODEL_INTERNAL_MODULE_BIND: #endif diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 193f3b805..d1522f2d7 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -104,7 +104,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_RANGE_OFS 7*FW #define MODEL_SETUP_SET_FAILSAFE_OFS 10*FW-2 -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) void onBindMenu(const char * result) { @@ -248,8 +248,8 @@ int getSwitchWarningsCount() #define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH ? TRAINER_LINE1_BLUETOOTH_M_ROWS : (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH ? (uint8_t)1 : HIDDEN_ROW))) #define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #else - #define TRAINER_LINE1_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) - #define TRAINER_LINE2_ROWS (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) + #define TRAINER_LINE1_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)1 : HIDDEN_ROW) + #define TRAINER_LINE2_ROWS (g_model.trainerData.mode == TRAINER_MODE_SLAVE ? (uint8_t)2 : HIDDEN_ROW) #endif #define TIMER_ROWS(x) 2|NAVIGATION_LINE_BY_LINE, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t) 1 : (uint8_t)0 @@ -713,9 +713,9 @@ void menuModelSetup(event_t event) #endif case ITEM_MODEL_TRAINER_MODE: lcdDrawTextAlignedLeft(y, STR_MODE); - lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, attr); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerData.mode, attr); if (attr) { - g_model.trainerMode = checkIncDec(event, g_model.trainerMode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); + g_model.trainerData.mode = checkIncDec(event, g_model.trainerData.mode, 0, TRAINER_MODE_MAX(), EE_MODEL, isTrainerModeAvailable); } #if defined(BLUETOOTH) && defined(USEHORUSBT) if (attr && checkIncDec_Ret) { @@ -870,7 +870,24 @@ void menuModelSetup(event_t event) // no break #else case ITEM_MODEL_TRAINER_LINE1: + lcdDrawTextAlignedLeft(y, STR_CHANNELRANGE); + lcdDrawText(MODEL_SETUP_2ND_COLUMN, y, STR_CH, menuHorizontalPosition==0 ? attr : 0); + lcdDrawNumber(lcdLastRightPos, y, g_model.trainerData.channelsStart+1, LEFT | (menuHorizontalPosition==0 ? attr : 0)); + lcdDrawChar(lcdLastRightPos, y, '-'); + lcdDrawNumber(lcdLastRightPos + FW+1, y, g_model.trainerData.channelsStart+8+g_model.trainerData.channelsCount, LEFT | (menuHorizontalPosition==1 ? attr : 0)); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.channelsStart, 32-8-g_model.trainerData.channelsCount); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.channelsCount, -4, min(MAX_TRAINER_CHANNELS_M8, 32-8-g_model.trainerData.channelsStart)); + break; + } + } + break; #endif + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: case ITEM_MODEL_EXTERNAL_MODULE_CHANNELS: { @@ -911,9 +928,30 @@ void menuModelSetup(event_t event) break; } + case ITEM_MODEL_TRAINER_LINE2: + lcdDrawTextAlignedLeft(y, STR_PPMFRAME); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawText(lcdLastRightPos, y, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+6*FW, y, (g_model.trainerData.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + lcdDrawChar(lcdLastRightPos, y, 'u'); + lcdDrawChar(MODEL_SETUP_2ND_COLUMN+12*FW, y, g_model.trainerData.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_BIND: case ITEM_MODEL_EXTERNAL_MODULE_BIND: - case ITEM_MODEL_TRAINER_LINE2: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index ef90129b2..eb120ca4d 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -98,7 +98,7 @@ enum MenuModelSetupItems { #define MODEL_SETUP_SET_FAILSAFE_OFS 100 #define MODEL_SETUP_SLIDPOT_SPACING 45 -#define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#define CURRENT_MODULE_EDITED(k) (k >= ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE) void checkModelIdUnique(uint8_t moduleIdx) { @@ -858,9 +858,28 @@ bool menuModelSetup(event_t event) break; } + case ITEM_MODEL_TRAINER_LINE2: + lcdDrawText(MENUS_MARGIN_LEFT, y, STR_PPMFRAME); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.trainerData.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT, 0, NULL, STR_MS); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+80, y, (g_model.trainerData.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr|LEFT : LEFT, 0, NULL, "us"); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+160, y, g_model.trainerData.pulsePol ? "+" : "-", (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.frameLength, -20, 35); + break; + case 1: + CHECK_INCDEC_MODELVAR(event, g_model.trainerData.delay, -4, 10); + break; + case 2: + CHECK_INCDEC_MODELVAR_ZERO(event, g_model.trainerData.pulsePol, 1); + break; + } + } + break; + case ITEM_MODEL_INTERNAL_MODULE_BIND: case ITEM_MODEL_EXTERNAL_MODULE_BIND: - case ITEM_MODEL_TRAINER_LINE2: { uint8_t moduleIdx = CURRENT_MODULE_EDITED(k); ModuleData & moduleData = g_model.moduleData[moduleIdx]; diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index dacfab2d6..e4f606dc3 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -23,25 +23,27 @@ #include "datastructs.h" -#define EEPROM_VER 218 +#define EEPROM_VER 219 #define FIRST_CONV_EEPROM_VER 216 -#define GET_PPM_POLARITY(idx) g_model.moduleData[idx].ppm.pulsePol -#define GET_SBUS_POLARITY(idx) g_model.moduleData[idx].sbus.noninverted -#define GET_PPM_DELAY(idx) (g_model.moduleData[idx].ppm.delay * 50 + 300) -#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) +#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(idx) (g_model.trainerData.delay * 50 + 300) +#define SET_DEFAULT_PPM_FRAME_LENGTH(idx) g_model.moduleData[idx].ppm.frameLength = 4 * max((int8_t)0, g_model.moduleData[idx].channelsCount) #if defined(PCBHORUS) #define IS_TRAINER_EXTERNAL_MODULE() false #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) #elif defined(PCBTARANIS) - #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerMode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerMode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) - #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) + #define IS_TRAINER_EXTERNAL_MODULE() (g_model.trainerData.mode == TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE || g_model.trainerData.mode == TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE) + #define HAS_WIRELESS_TRAINER_HARDWARE() (g_eeGeneral.serial2Mode==UART_MODE_SBUS_TRAINER) #else #define IS_TRAINER_EXTERNAL_MODULE() false #endif -#define IS_PLAY_FUNC(func) ((func) >= FUNC_PLAY_SOUND && func <= FUNC_PLAY_VALUE) +#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) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index fb3a0f269..4a50bc1c5 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -464,7 +464,7 @@ void modelDefault(uint8_t id) #endif #if defined(PCBXLITE) - g_model.trainerMode = TRAINER_MODE_MASTER_BLUETOOTH; + g_model.trainerData.mode = TRAINER_MODE_MASTER_BLUETOOTH; #endif #if defined(EEPROM) diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 61d252886..86e5b784a 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -194,8 +194,8 @@ #define IS_BLUETOOTH_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE) #else - #define IS_BLUETOOTH_TRAINER() (g_model.trainerMode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) - #define IS_SLAVE_TRAINER() (g_model.trainerMode == TRAINER_MODE_SLAVE || g_model.trainerMode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_BLUETOOTH_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_MASTER_BLUETOOTH || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) + #define IS_SLAVE_TRAINER() (g_model.trainerData.mode == TRAINER_MODE_SLAVE || g_model.trainerData.mode == TRAINER_MODE_SLAVE_BLUETOOTH) #endif #else #define IS_BLUETOOTH_TRAINER() false diff --git a/radio/src/pulses/modules.h b/radio/src/pulses/modules.h index 7d9a7275c..6e4ca4144 100644 --- a/radio/src/pulses/modules.h +++ b/radio/src/pulses/modules.h @@ -86,15 +86,13 @@ inline bool isExtraModule(uint8_t) #if defined(TARANIS_INTERNAL_PPM) inline bool isModulePPM(uint8_t idx) { - return idx == TRAINER_MODULE || - (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || + return (idx == INTERNAL_MODULE && g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_PPM) || (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #else inline bool isModulePPM(uint8_t idx) { - return idx == TRAINER_MODULE || - isExtraModule(idx) || + return isExtraModule(idx) || (idx == EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM); } #endif @@ -194,27 +192,12 @@ inline int8_t maxModuleChannels_M8(uint8_t idx) { if (isExtraModule(idx)) return MAX_EXTRA_MODULE_CHANNELS_M8; - else if (idx == TRAINER_MODULE) - return MAX_TRAINER_CHANNELS_M8; else if (isModuleXJT(idx)) return maxChannelsXJT[1 + g_model.moduleData[idx].rfProtocol]; else return maxChannelsModules[g_model.moduleData[idx].type]; } -inline int8_t maxModuleChannels(uint8_t idx) -{ - return 8 + maxModuleChannels_M8(idx); -} - -inline int8_t minModuleChannels(uint8_t idx) -{ - if (isModuleCrossfire(idx)) - return 16; - else - return 1; -} - inline int8_t defaultModuleChannels_M8(uint8_t idx) { if (isModulePPM(idx)) diff --git a/radio/src/pulses/ppm_arm.cpp b/radio/src/pulses/ppm_arm.cpp index 04b8f50c7..cb47c1ada 100644 --- a/radio/src/pulses/ppm_arm.cpp +++ b/radio/src/pulses/ppm_arm.cpp @@ -21,7 +21,7 @@ #include "opentx.h" template -void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) +void setupPulsesPPM(PpmPulsesData * ppmPulsesData, uint8_t channelsStart, int8_t channelsCount, int8_t frameLength) { int16_t PPM_range = g_model.extendedLimits ? (512*LIMIT_EXT_PERCENT/100) * 2 : 512 * 2; // range of 0.7 .. 1.7msec @@ -29,8 +29,8 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) // each pulse is 0.7..1.7ms long with a 0.3ms stop tail // The pulse ISR is 2mhz that's why everything is multiplied by 2 - uint32_t firstCh = g_model.moduleData[port].channelsStart; - uint32_t lastCh = min(MAX_OUTPUT_CHANNELS, firstCh + 8 + g_model.moduleData[port].channelsCount); + uint8_t firstCh = channelsStart; + uint8_t lastCh = min(MAX_OUTPUT_CHANNELS, firstCh + 8 + channelsCount); #if defined(STM32) ppmPulsesData->ptr = ppmPulsesData->pulses; @@ -40,7 +40,7 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) #endif int32_t rest = 22500u * 2; - rest += (int32_t(g_model.moduleData[port].ppm.frameLength)) * 1000; + rest += int32_t(frameLength) * 1000; for (uint32_t i=firstCh; i * ppmPulsesData) void setupPulsesPPMModule(uint8_t port) { - setupPulsesPPM(port, &modulePulsesData[port].ppm); + setupPulsesPPM(&modulePulsesData[port].ppm, g_model.moduleData[port].channelsStart, g_model.moduleData[port].channelsCount, g_model.moduleData[port].ppm.frameLength); } void setupPulsesPPMTrainer() { - setupPulsesPPM(TRAINER_MODULE, &trainerPulsesData.ppm); + setupPulsesPPM(&trainerPulsesData.ppm, g_model.trainerData.channelsStart, g_model.trainerData.channelsCount, g_model.trainerData.frameLength); } diff --git a/radio/src/pulses/pxx2.h b/radio/src/pulses/pxx2.h index 5893ef975..f78985947 100644 --- a/radio/src/pulses/pxx2.h +++ b/radio/src/pulses/pxx2.h @@ -69,7 +69,13 @@ class Pxx2Pulses: public PxxPulses { Pxx2Transport::addByteWithoutCrc(0x00); // TYPE_C + TYPE_ID - Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + // TODO optimization ? Pxx2Transport::addByte(0x26); // This one is CRC-ed on purpose + } + + void addFrameType(uint8_t type_c, uint8_t type_id) + { + Pxx2Transport::addByte(type_c); + Pxx2Transport::addByte(type_id); } void addCrc() diff --git a/radio/src/rtos.h b/radio/src/rtos.h index d352b953a..28532298b 100644 --- a/radio/src/rtos.h +++ b/radio/src/rtos.h @@ -33,6 +33,7 @@ extern "C++" { #include #define SIMU_SLEEP_OR_EXIT_MS(x) simuSleep(x) + #define RTOS_MS_PER_TICK 1 typedef pthread_t RTOS_TASK_HANDLE; typedef pthread_mutex_t RTOS_MUTEX_HANDLE; @@ -57,7 +58,7 @@ extern "C++" { static inline void RTOS_WAIT_TICKS(uint32_t x) { - RTOS_WAIT_MS(x * 2); + RTOS_WAIT_MS(x * RTOS_MS_PER_TICK); } #ifdef __cplusplus diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 0046fb2d1..357977afe 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -1208,7 +1208,7 @@ void ConvertModel_217_to_218(ModelData & model) newModel.moduleData[i] = oldModel.moduleData[i]; } #if defined(PCBTARANIS) - newModel.trainerMode = oldModel.trainerMode; + newModel.trainerData.mode = oldModel.trainerMode; memcpy(newModel.scriptsData, oldModel.scriptsData, sizeof(newModel.scriptsData)); memcpy(newModel.inputNames, oldModel.inputNames, sizeof(newModel.inputNames)); #endif diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 02f54c5fc..855439cc9 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -252,7 +252,7 @@ uint8_t currentTrainerMode = 0xff; void checkTrainerSettings() { - uint8_t requiredTrainerMode = g_model.trainerMode; + uint8_t requiredTrainerMode = g_model.trainerData.mode; if (requiredTrainerMode != currentTrainerMode) { switch (currentTrainerMode) { case TRAINER_MODE_MASTER_TRAINER_JACK: diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 09639e812..7d71b20e8 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -97,7 +97,7 @@ extern "C" { extern uint16_t sessionTimer; -#define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) +#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #if defined(PCBX10) #define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_SET) diff --git a/radio/src/targets/horus/extmodule_driver.cpp b/radio/src/targets/horus/extmodule_driver.cpp index 630db99c1..be1248b54 100644 --- a/radio/src/targets/horus/extmodule_driver.cpp +++ b/radio/src/targets/horus/extmodule_driver.cpp @@ -102,8 +102,8 @@ void extmodulePpmStart() EXTMODULE_TIMER->DIER = TIM_DIER_UDE; // Update DMA request EXTMODULE_TIMER->CR1 = TIM_CR1_CEN; // Start timer #else - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; // Reloads register values now EXTMODULE_TIMER->DIER |= TIM_DIER_UDE; // Update DMA request @@ -217,14 +217,14 @@ void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { #if defined(PCBX10) || PCBREV >= 13 - EXTMODULE_TIMER->CCR3 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); + EXTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC3P : 0); EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; #else - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = TIM_CCER_CC1E | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? TIM_CCER_CC1P : 0); EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_DMA_STREAM->CR |= EXTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_1 | DMA_SxCR_MSIZE_1 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index d05648b47..d5b34cc1e 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -37,8 +37,8 @@ void init_trainer_ppm() TRAINER_TIMER->CR1 &= ~TIM_CR1_CEN; TRAINER_TIMER->PSC = TRAINER_TIMER_FREQ / 2000000 - 1; // 0.5uS TRAINER_TIMER->ARR = 45000; - TRAINER_TIMER->CCR2 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC2E | (g_model.moduleData[TRAINER_MODULE].ppm.pulsePol ? 0 : TIM_CCER_CC2P); + TRAINER_TIMER->CCR2 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC2E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC2P); TRAINER_TIMER->CCMR1 = TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_0; // Force O/P high TRAINER_TIMER->BDTR = TIM_BDTR_MOE; TRAINER_TIMER->EGR = 1; @@ -100,8 +100,8 @@ void stop_trainer_capture() void trainerSendNextFrame() { - TRAINER_TIMER->CCR2 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC2E | (g_model.moduleData[TRAINER_MODULE].ppm.pulsePol ? 0 : TIM_CCER_CC2P); + TRAINER_TIMER->CCR2 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC2E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC2P); TRAINER_TIMER->CCR1 = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA diff --git a/radio/src/targets/sky9x/pulses_driver.cpp b/radio/src/targets/sky9x/pulses_driver.cpp index 4764b1c43..cac101283 100644 --- a/radio/src/targets/sky9x/pulses_driver.cpp +++ b/radio/src/targets/sky9x/pulses_driver.cpp @@ -23,8 +23,8 @@ void setExternalModulePolarity() { Pwm * pwmptr = PWM; - pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = GET_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS - if (GET_PPM_POLARITY(EXTERNAL_MODULE)) + pwmptr->PWM_CH_NUM[3].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS + if (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE)) pwmptr->PWM_CH_NUM[3].PWM_CMR &= ~0x00000200; // CPOL else pwmptr->PWM_CH_NUM[3].PWM_CMR |= 0x00000200; // CPOL @@ -33,8 +33,8 @@ void setExternalModulePolarity() void setExtraModulePolarity() { Pwm * pwmptr = PWM; - pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_PPM_DELAY(EXTRA_MODULE) * 2; // Duty in half uS - if (GET_PPM_POLARITY(EXTRA_MODULE)) + pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTRA_MODULE) * 2; // Duty in half uS + if (GET_MODULE_PPM_POLARITY(EXTRA_MODULE)) pwmptr->PWM_CH_NUM[1].PWM_CMR &= ~0x00000200; // CPOL else pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200; // CPOL @@ -74,7 +74,7 @@ void init_main_ppm(uint32_t period, uint32_t out_enable) pwmptr->PWM_CH_NUM[3].PWM_CMR = 0x0004000B; // CLKA pwmptr->PWM_CH_NUM[3].PWM_CPDR = period; // Period in half uS pwmptr->PWM_CH_NUM[3].PWM_CPDRUPD = period; // Period in half uS - pwmptr->PWM_CH_NUM[3].PWM_CDTY = GET_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS + pwmptr->PWM_CH_NUM[3].PWM_CDTY = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; // Duty in half uS pwmptr->PWM_ENA = PWM_ENA_CHID3; // Enable channel 3 pwmptr->PWM_IER1 = PWM_IER1_CHID3; @@ -98,13 +98,13 @@ void init_second_ppm(uint32_t period) Pwm * pwmptr = PWM; configure_pins(PIO_PC15, PIN_PERIPHERAL | PIN_INPUT | PIN_PER_B | PIN_PORTC | PIN_NO_PULLUP); pwmptr->PWM_CH_NUM[1].PWM_CMR = 0x0000000B; // CLKB - if (!GET_PPM_POLARITY(EXTRA_MODULE)) { + if (!GET_MODULE_PPM_POLARITY(EXTRA_MODULE)) { pwmptr->PWM_CH_NUM[1].PWM_CMR |= 0x00000200; // CPOL } pwmptr->PWM_CH_NUM[1].PWM_CPDR = period; // Period pwmptr->PWM_CH_NUM[1].PWM_CPDRUPD = period; // Period - pwmptr->PWM_CH_NUM[1].PWM_CDTY = GET_PPM_DELAY(EXTRA_MODULE)*2; // Duty - pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_PPM_DELAY(EXTRA_MODULE)*2; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTY = GET_MODULE_PPM_DELAY(EXTRA_MODULE)*2; // Duty + pwmptr->PWM_CH_NUM[1].PWM_CDTYUPD = GET_MODULE_PPM_DELAY(EXTRA_MODULE)*2; // Duty pwmptr->PWM_ENA = PWM_ENA_CHID1; // Enable channel 1 pwmptr->PWM_IER1 = PWM_IER1_CHID1; #endif diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 3f638832c..b0982942e 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -311,7 +311,7 @@ uint8_t currentTrainerMode = 0xff; void checkTrainerSettings() { - uint8_t requiredTrainerMode = g_model.trainerMode; + uint8_t requiredTrainerMode = g_model.trainerData.mode; if (requiredTrainerMode != currentTrainerMode) { switch (currentTrainerMode) { case TRAINER_MODE_MASTER_TRAINER_JACK: diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index f7545c8fd..d451cd5ad 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -192,7 +192,7 @@ void init_module_timer( uint32_t module_index, uint32_t period, uint8_t state); void disable_module_timer( uint32_t module_index); // Trainer driver -#define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) +#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE) #if defined(PCBX9E) #define TRAINER_CONNECTED() (true) #elif defined(PCBX7) diff --git a/radio/src/targets/taranis/extmodule_driver.cpp b/radio/src/targets/taranis/extmodule_driver.cpp index 2e15ba244..b092499b9 100644 --- a/radio/src/targets/taranis/extmodule_driver.cpp +++ b/radio/src/targets/taranis/extmodule_driver.cpp @@ -89,8 +89,8 @@ void extmodulePpmStart() EXTMODULE_TIMER->CR1 &= ~TIM_CR1_CEN; EXTMODULE_TIMER->PSC = EXTMODULE_TIMER_FREQ / 2000000 - 1; // 0.5uS from 30MHz EXTMODULE_TIMER->ARR = 45000; - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE)*2; + EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->BDTR = TIM_BDTR_MOE; EXTMODULE_TIMER->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // Force O/P high EXTMODULE_TIMER->EGR = 1; @@ -239,8 +239,8 @@ void extmodulePxxStart() void extmoduleSendNextFrame() { if (s_current_protocol[EXTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { - EXTMODULE_TIMER->CCR1 = GET_PPM_DELAY(EXTERNAL_MODULE)*2; - EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here + EXTMODULE_TIMER->CCR1 = GET_MODULE_PPM_DELAY(EXTERNAL_MODULE) * 2; + EXTMODULE_TIMER->CCER = EXTMODULE_TIMER_OUTPUT_ENABLE | (GET_MODULE_PPM_POLARITY(EXTERNAL_MODULE) ? EXTMODULE_TIMER_OUTPUT_POLARITY : 0); // // we are using complementary output so logic has to be reversed here EXTMODULE_TIMER->CCR2 = *(modulePulsesData[EXTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance EXTMODULE_TIMER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA EXTMODULE_TIMER_DMA_STREAM->CR |= EXTMODULE_TIMER_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/taranis/intmodule_pulses_driver.cpp b/radio/src/targets/taranis/intmodule_pulses_driver.cpp index 4610474a6..10ef3303c 100644 --- a/radio/src/targets/taranis/intmodule_pulses_driver.cpp +++ b/radio/src/targets/taranis/intmodule_pulses_driver.cpp @@ -71,8 +71,8 @@ void intmoduleSendNextFrame() } #if defined(TARANIS_INTERNAL_PPM) else if (s_current_protocol[INTERNAL_MODULE] == PROTOCOL_CHANNELS_PPM) { - INTMODULE_TIMER->CCR3 = GET_PPM_DELAY(INTERNAL_MODULE)*2; - INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); + INTMODULE_TIMER->CCR3 = GET_MODULE_PPM_DELAY(INTERNAL_MODULE) * 2; + INTMODULE_TIMER->CCER = TIM_CCER_CC3E | (GET_MODULE_PPM_POLARITY(INTERNAL_MODULE) ? 0 : TIM_CCER_CC3P); INTMODULE_TIMER->CCR2 = *(modulePulsesData[INTERNAL_MODULE].ppm.ptr - 1) - 4000; // 2mS in advance INTMODULE_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA INTMODULE_DMA_STREAM->CR |= INTMODULE_DMA_CHANNEL | DMA_SxCR_DIR_0 | DMA_SxCR_MINC | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_PL_0 | DMA_SxCR_PL_1; diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index 1992d635e..3c18b14bc 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -98,8 +98,8 @@ void stop_trainer_capture() void trainerSendNextFrame() { - TRAINER_TIMER->CCR4 = GET_PPM_DELAY(TRAINER_MODULE)*2; - TRAINER_TIMER->CCER = TIM_CCER_CC4E | (GET_PPM_POLARITY(TRAINER_MODULE) ? 0 : TIM_CCER_CC4P); + TRAINER_TIMER->CCR4 = GET_TRAINER_PPM_DELAY() * 2; + TRAINER_TIMER->CCER = TIM_CCER_CC4E | (GET_TRAINER_PPM_POLARITY() ? 0 : TIM_CCER_CC4P); TRAINER_TIMER->CCR1 = *(trainerPulsesData.ppm.ptr - 1) - 4000; // 2mS in advance TRAINER_DMA_STREAM->CR &= ~DMA_SxCR_EN; // Disable DMA