1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-23 08:15:17 +03:00

[Taranis] PPM Center will now have a bigger range [-500:+500]

This commit is contained in:
bsongis 2014-08-21 21:40:44 +02:00
parent b5c63e339f
commit 07fe45ec5f
6 changed files with 81 additions and 30 deletions

View file

@ -1212,6 +1212,17 @@ class LimitField: public StructField {
LimitField(LimitData & limit, BoardEnum board, unsigned int version):
StructField("Limit")
{
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 {
if (IS_TARANIS(board) && version >= 216) {
Append(new ConversionField< SignedField<16> >(limit.min, +1000));
Append(new ConversionField< SignedField<16> >(limit.max, -1000));
@ -1231,6 +1242,7 @@ class LimitField: public StructField {
Append(new SignedField<8>(limit.curve.value));
}
}
}
};
class CurvesField: public TransformedField {

View file

@ -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:

View file

@ -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()));

View file

@ -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; i<NUM_CHNOUT; i++) {
#if defined(PCBTARANIS)
newModel.limitData[i].min = oldModel.limitData[i].min;
newModel.limitData[i].max = oldModel.limitData[i].max;
newModel.limitData[i].offset = oldModel.limitData[i].offset;
newModel.limitData[i].ppmCenter = oldModel.limitData[i].ppmCenter;
newModel.limitData[i].symetrical = oldModel.limitData[i].symetrical;
newModel.limitData[i].revert = oldModel.limitData[i].revert;
newModel.limitData[i].curve = oldModel.limitData[i].curve;
memcpy(newModel.limitData[i].name, oldModel.limitData[i].name, sizeof(newModel.limitData[i].name));
#else
newModel.limitData[i] = oldModel.limitData[i];
#endif
}
for (int i=0; i<MAX_EXPOS; i++) {
newModel.expoData[i] = oldModel.expoData[i];
#if defined(PCBTARANIS)

View file

@ -4173,7 +4173,7 @@ void menuModelLimits(uint8_t event)
case ITEM_LIMITS_PPM_CENTER:
lcd_outdezAtt(LIMITS_PPM_CENTER_POS, y, PPM_CENTER+ld->ppmCenter, 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

View file

@ -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)