diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 248346f09..feec83d47 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -1212,23 +1212,35 @@ class LimitField: public StructField { LimitField(LimitData & limit, BoardEnum board, unsigned int version): StructField("Limit") { - if (IS_TARANIS(board) && version >= 216) { - Append(new ConversionField< SignedField<16> >(limit.min, +1000)); - Append(new ConversionField< SignedField<16> >(limit.max, -1000)); + if (IS_TARANIS(board) && version >= 217) { + Append(new ConversionField< SignedField<11> >(limit.min, +1000)); + Append(new ConversionField< SignedField<11> >(limit.max, -1000)); + Append(new SignedField<11>(limit.offset)); + Append(new SignedField<11>(limit.ppmCenter)); + Append(new BoolField<1>(limit.symetrical)); + Append(new BoolField<1>(limit.revert)); + Append(new SpareBitsField<2>()); + Append(new SignedField<8>(limit.curve.value)); } else { - Append(new ConversionField< SignedField<8> >(limit.min, +100, 10)); - Append(new ConversionField< SignedField<8> >(limit.max, -100, 10)); - } - Append(new SignedField<8>(limit.ppmCenter)); - Append(new SignedField<14>(limit.offset)); - Append(new BoolField<1>(limit.symetrical)); - Append(new BoolField<1>(limit.revert)); - if (HAS_LARGE_LCD(board)) { - Append(new ZCharField<6>(limit.name)); - } - if (IS_TARANIS(board) && version >= 216) { - Append(new SignedField<8>(limit.curve.value)); + if (IS_TARANIS(board) && version >= 216) { + Append(new ConversionField< SignedField<16> >(limit.min, +1000)); + Append(new ConversionField< SignedField<16> >(limit.max, -1000)); + } + else { + Append(new ConversionField< SignedField<8> >(limit.min, +100, 10)); + Append(new ConversionField< SignedField<8> >(limit.max, -100, 10)); + } + Append(new SignedField<8>(limit.ppmCenter)); + Append(new SignedField<14>(limit.offset)); + Append(new BoolField<1>(limit.symetrical)); + Append(new BoolField<1>(limit.revert)); + if (HAS_LARGE_LCD(board)) { + Append(new ZCharField<6>(limit.name)); + } + if (IS_TARANIS(board) && version >= 216) { + Append(new SignedField<8>(limit.curve.value)); + } } } }; diff --git a/companion/src/firmwares/opentx/opentxinterface.cpp b/companion/src/firmwares/opentx/opentxinterface.cpp index 2ab53e513..f11ec646a 100644 --- a/companion/src/firmwares/opentx/opentxinterface.cpp +++ b/companion/src/firmwares/opentx/opentxinterface.cpp @@ -665,7 +665,7 @@ int OpenTxFirmware::getCapability(const Capability capability) case TelemetryMaxMultiplier: return (IS_ARM(board) ? 32 : 8); case PPMCenter: - return 1; + return (IS_TARANIS(board) ? 500 : 125); case SYMLimits: return 1; case OptrexDisplay: diff --git a/companion/src/modeledit/channels.cpp b/companion/src/modeledit/channels.cpp index a4e45b05c..06956ebb4 100644 --- a/companion/src/modeledit/channels.cpp +++ b/companion/src/modeledit/channels.cpp @@ -113,12 +113,13 @@ Channels::Channels(QWidget * parent, ModelData & model, GeneralSettings & genera } // PPM center - if (firmware->getCapability(PPMCenter)) { + int ppmCenterMax = firmware->getCapability(PPMCenter); + if (ppmCenterMax) { QSpinBox * center = new QSpinBox(this); center->setProperty("index", i); center->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); - center->setMinimum(1375); - center->setMaximum(1625); + center->setMinimum(1500-ppmCenterMax); + center->setMaximum(1500+ppmCenterMax); center->setValue(1500); center->setValue(model.limitData[i].ppmCenter + 1500); connect(center, SIGNAL(editingFinished()), this, SLOT(ppmcenterEdited())); diff --git a/radio/src/eeprom_conversions.cpp b/radio/src/eeprom_conversions.cpp index 1882663ed..1c05068ee 100644 --- a/radio/src/eeprom_conversions.cpp +++ b/radio/src/eeprom_conversions.cpp @@ -148,6 +148,21 @@ PACK(typedef struct { LIMITDATA_V215_EXTRA }) LimitData_v215; +#if defined(PCBTARANIS) +PACK(typedef struct { + int16_t min; + int16_t max; + int8_t ppmCenter; + int16_t offset:14; + uint16_t symetrical:1; + uint16_t revert:1; + char name[LEN_CHANNEL_NAME]; + int8_t curve; +}) LimitData_v216; +#else +#define LimitData_v216 LimitData +#endif + #if defined(PCBTARANIS) PACK(typedef struct { uint8_t destCh; @@ -339,7 +354,7 @@ PACK(typedef struct { AVR_FIELD(int8_t ppmDelay) BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 MixData mixData[MAX_MIXERS]; - LimitData limitData[NUM_CHNOUT]; + LimitData_v216 limitData[NUM_CHNOUT]; ExpoData expoData[MAX_EXPOS]; CURVDATA curves[MAX_CURVES]; @@ -1074,7 +1089,20 @@ void ConvertModel_216_to_217(ModelData &model) newModel.mixData[i] = oldModel.mixData[i]; newModel.mixData[i].srcRaw = ConvertSource_216_to_217(oldModel.mixData[i].srcRaw); } - memcpy(newModel.limitData, oldModel.limitData, sizeof(newModel.limitData)); + for (int i=0; ippmCenter, attr); if (active) { - CHECK_INCDEC_MODELVAR(event, ld->ppmCenter, -125, +125); + CHECK_INCDEC_MODELVAR(event, ld->ppmCenter, -PPM_CENTER_MAX, +PPM_CENTER_MAX); } break; #endif diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 1c7e77941..21e58a346 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -357,7 +357,6 @@ PACK(typedef struct t_ScriptData { }; #define MODELDATA_BITMAP char bitmap[LEN_BITMAP_NAME]; #define MODELDATA_EXTRA uint8_t externalModule; uint8_t trainerMode; ModuleData moduleData[NUM_MODULES+1]; char curveNames[MAX_CURVES][6]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t nPotsToWarn; int8_t potPosition[NUM_POTS]; uint8_t spare[2]; - #define LIMITDATA_EXTRA char name[LEN_CHANNEL_NAME]; int8_t curve; #define swstate_t uint16_t #elif defined(PCBSKY9X) enum ModuleIndex { @@ -367,12 +366,10 @@ PACK(typedef struct t_ScriptData { }; #define MODELDATA_BITMAP #define MODELDATA_EXTRA uint8_t externalModule; ModuleData moduleData[NUM_MODULES+1]; uint8_t nPotsToWarn; int8_t potPosition[NUM_POTS]; uint8_t rxBattAlarms[2]; - #define LIMITDATA_EXTRA #define swstate_t uint8_t #else #define MODELDATA_BITMAP #define MODELDATA_EXTRA - #define LIMITDATA_EXTRA #define swstate_t uint8_t #endif @@ -555,6 +552,7 @@ PACK(typedef struct t_ExpoData { #define limit_min_max_t int16_t #define LIMIT_EXT_PERCENT 150 #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) + #define PPM_CENTER_MAX 500 #define LIMIT_MAX(lim) (GV_IS_GV_VALUE(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->max, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode)*10 : lim->max+1000) #define LIMIT_MIN(lim) (GV_IS_GV_VALUE(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX) ? GET_GVAR(lim->min, -LIMIT_EXT_MAX, LIMIT_EXT_MAX, mixerCurrentFlightMode)*10 : lim->min-1000) #define LIMIT_OFS(lim) (GV_IS_GV_VALUE(lim->offset, -1000, 1000) ? GET_GVAR(lim->offset, -1000, 1000, mixerCurrentFlightMode)*10 : lim->offset) @@ -565,6 +563,7 @@ PACK(typedef struct t_ExpoData { #define limit_min_max_t int8_t #define LIMIT_EXT_PERCENT 125 #define LIMIT_EXT_MAX LIMIT_EXT_PERCENT + #define PPM_CENTER_MAX 125 #define LIMIT_MAX(lim) (lim->max+100) #define LIMIT_MIN(lim) (lim->min-100) #define LIMIT_OFS(lim) (lim->offset) @@ -573,17 +572,28 @@ PACK(typedef struct t_ExpoData { #define LIMIT_OFS_RESX(lim) calc1000toRESX(LIMIT_OFS(lim)) #endif +#if defined(PCBTARANIS) PACK(typedef struct t_LimitData { - limit_min_max_t min; - limit_min_max_t max; + int16_t min:11; + int16_t max:11; + int16_t offset:11; + int16_t ppmCenter:11; + uint8_t symetrical:1; + uint8_t revert:1; + uint8_t spare:2; + int8_t curve; + char name[LEN_CHANNEL_NAME]; +}) LimitData; +#else +PACK(typedef struct t_LimitData { + int8_t min; + int8_t max; int8_t ppmCenter; int16_t offset:14; uint16_t symetrical:1; uint16_t revert:1; - - LIMITDATA_EXTRA - }) LimitData; +#endif #define TRIM_OFF (1) #define TRIM_ON (0)