Merge pull request #6635 from opentx/raphaelcoeffic/cpn-horus-fixes

[X10/X12S] Companion fixes
This commit is contained in:
Bertrand Songis
2019-08-17 20:05:35 +02:00
committed by GitHub
7 changed files with 884 additions and 798 deletions
+1 -1
View File
@@ -38,7 +38,7 @@
#define CPN_MAX_MODULES 2
#define CPN_MAX_STICKS Board::STICK_AXIS_COUNT
#define CPN_MAX_TRIMS Board::TRIM_AXIS_COUNT
#define CPN_MAX_KNOBS 4
#define CPN_MAX_KNOBS 8
#define CPN_MAX_SLIDERS 4
#define CPN_MAX_POTS (CPN_MAX_KNOBS + CPN_MAX_SLIDERS)
#define CPN_MAX_CYC 3
+23 -3
View File
@@ -270,9 +270,19 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
else if (IS_HORUS_X10(board))
return 5;
else if (IS_HORUS_X12S(board))
return 3;
else
return 3;
case PotsStorage:
if (IS_HORUS(board))
return 5;
else
return getCapability(board, Pots);
case FactoryInstalledPots:
if (IS_TARANIS_X9(board))
return 2;
@@ -287,8 +297,14 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
else
return 0;
case SlidersStorage:
if (IS_HORUS_X10(board))
return 4;
else
return getCapability(board, Sliders);
case MouseAnalogs:
if (IS_HORUS_X12S(board))
if (IS_HORUS(board))
return 2;
else
return 0;
@@ -321,10 +337,12 @@ const int Boards::getCapability(Board::Type board, Board::Capability capability)
return 6;
else if (IS_TARANIS_XLITE(board))
return 6;
else if (IS_TARANIS(board))
return 8;
else if (board == Board::BOARD_TARANIS_X9DP_2019)
return 9;
else if (IS_HORUS_OR_TARANIS(board))
return 8;
else if (IS_HORUS(board))
return 10;
else
return 7;
@@ -450,6 +468,8 @@ const QString Boards::getAnalogInputName(Board::Type board, int index)
"S1",
"6P",
"S2",
"EX1",
"EX2",
"LS",
"RS"
};
+2
View File
@@ -114,8 +114,10 @@ namespace Board {
enum Capability {
Sticks,
Pots,
PotsStorage,
FactoryInstalledPots,
Sliders,
SlidersStorage,
MouseAnalogs,
GyroAnalogs,
MaxAnalogs,
+57 -15
View File
@@ -29,25 +29,42 @@
using namespace Board;
#define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256)
#define MAX_SLIDERS(board) (IS_HORUS_X10(board) ? 4 : (Boards::getCapability(board, Board::Sliders))) //TODO need to be remove when x10 eeprom gets fixed
#define MAX_MOUSE_ANALOGS(board) (IS_HORUS_X10(board) ? 2 : (Boards::getCapability(board, Board::MouseAnalogs))) //TODO need to be remove when x10 eeprom gets fixed
#define MAX_GYRO_ANALOGS(board, version) (version >= 219 ? Boards::getCapability(board, Board::GyroAnalogs) : 0)
inline int MAX_SWITCHES(Board::Type board, int version)
{
if (version <= 218 && IS_TARANIS_X7(board))
return 6;
if (version <= 218 && IS_TARANIS_X9D(board))
if (version <= 218 && (IS_TARANIS_X9D(board) || IS_HORUS(board)))
return 8;
return Boards::getCapability(board, Board::Switches);
}
#define MAX_KNOBS(board, version) (IS_HORUS(board) ? 8 : 4)
inline int MAX_POTS(Board::Type board, int version)
{
if (version <= 218 && IS_HORUS(board))
return 3;
return Boards::getCapability(board, Board::Pots);
}
inline int MAX_POTS_STORAGE(Board::Type board, int version)
{
if (version <= 218 && IS_HORUS(board))
return 3;
return Boards::getCapability(board, Board::PotsStorage);
}
// bitsize of swconfig_t / 2 (see radio/src/datastructs.h)
inline int MAX_SWITCH_SLOTS(Board::Type board, int version)
{
if (IS_TARANIS_X9E(board))
return 32;
if (IS_HORUS(board))
return 16;
if (version >= 219 && IS_TARANIS_X9D(board))
return 16;
@@ -105,7 +122,7 @@ class SwitchesConversionTable: public ConversionTable {
}
if (IS_HORUS_OR_TARANIS(board)) {
for (int i=1; i<=Boards::getCapability(board, Board::Pots)*6; i++) {
for (int i=1; i<=MAX_POTS(board, version)*6; i++) {
addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, -i), -val+offset);
addConversion(RawSwitch(SWITCH_TYPE_MULTIPOS_POT, i), val++);
}
@@ -227,7 +244,7 @@ class SourcesConversionTable: public ConversionTable {
}
}
for (int i=0; i<CPN_MAX_STICKS+Boards::getCapability(board, Board::Pots)+MAX_SLIDERS(board)+MAX_MOUSE_ANALOGS(board)+MAX_GYRO_ANALOGS(board, version); i++) {
for (int i=0; i<CPN_MAX_STICKS+MAX_POTS(board,version)+Boards::getCapability(board, Board::Sliders)+Boards::getCapability(board, Board::MouseAnalogs)+MAX_GYRO_ANALOGS(board, version); i++) {
addConversion(RawSource(SOURCE_TYPE_STICK, i), val++);
}
@@ -1946,7 +1963,10 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
internalField.Append(new UnsignedField<8>(this, modelData.moduleData[1].modelId));
if (HAS_LARGE_LCD(board)) {
internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap"));
if (version >= 219 && IS_HORUS(board))
internalField.Append(new CharField<14>(this, modelData.bitmap, true, "Model bitmap"));
else
internalField.Append(new CharField<10>(this, modelData.bitmap, true, "Model bitmap"));
}
for (int i=0; i<MAX_TIMERS(board, version); i++) {
@@ -2151,13 +2171,13 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
}
for (int i=0; i<8; i++) {
if (i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board))
if (i < Boards::getCapability(board, Board::Pots) + Boards::getCapability(board, Board::Sliders))
internalField.Append(new BoolField<1>(this, modelData.potsWarningEnabled[i]));
else
internalField.Append(new SpareBitsField<1>(this));
}
for (int i=0; i < Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board); i++) {
for (int i=0; i < Boards::getCapability(board, Board::Pots) + Boards::getCapability(board, Board::Sliders); i++) {
internalField.Append(new SignedField<8>(this, modelData.potPosition[i]));
}
@@ -2300,7 +2320,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
generalData(generalData),
board(board),
version(version),
inputsCount(CPN_MAX_STICKS + Boards::getCapability(board, Board::Pots) + MAX_SLIDERS(board) + MAX_MOUSE_ANALOGS(board))
inputsCount(CPN_MAX_STICKS + Boards::getCapability(board, Board::PotsStorage) + Boards::getCapability(board, Board::SlidersStorage) + Boards::getCapability(board, Board::MouseAnalogs))
{
qCDebug(eepromImport) << QString("OpenTxGeneralData::OpenTxGeneralData(board: %1, version:%2, variant:%3)").arg(board).arg(version).arg(variant);
@@ -2311,6 +2331,10 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
internalField.Append(new UnsignedField<16>(this, generalData.variant));
for (int i=0; i<inputsCount; i++) {
if (version <= 218 && IS_HORUS(board) && (i == CPN_MAX_STICKS + 3)) {
// skip not yet existing pots (EXT1 / EXT2 for X10)
i += 2;
}
internalField.Append(new SignedField<16>(this, generalData.calibMid[i]));
internalField.Append(new SignedField<16>(this, generalData.calibSpanNeg[i]));
internalField.Append(new SignedField<16>(this, generalData.calibSpanPos[i]));
@@ -2453,6 +2477,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
if (IS_STM32(board)) {
if (version >= 218) {
internalField.Append(new UnsignedField<4>(this, generalData.hw_uartMode));
// not on Horus...
for (uint8_t i=0; i<4; i++) {
internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i]));
}
@@ -2469,19 +2494,32 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
}
if (IS_HORUS(board)) {
for (int i=0; i<16; i++) {
for (int i=0; i<MAX_SWITCH_SLOTS(board, version); i++) { // bits swconfig_t / 2
if (i < MAX_SWITCHES(board, version))
internalField.Append(new UnsignedField<2>(this, generalData.switchConfig[i]));
else
internalField.Append(new SpareBitsField<2>(this));
}
}
for (int i=0; i<4; i++) {
if (i < Boards::getCapability(board, Board::Pots))
for (int i=0; i<MAX_KNOBS(board, version); i++) {
// 2 new pots for Horus from 219 on
if (version <= 218 && IS_HORUS(board) && (i == 3))
i += 2;
if (i < Boards::getCapability(board, Board::PotsStorage))
internalField.Append(new UnsignedField<2>(this, generalData.potConfig[i]));
else
internalField.Append(new SpareBitsField<2>(this));
}
if (IS_HORUS(board)) {
for (int i=0; i<8; i++) {
if (i < Boards::getCapability(board, Board::SlidersStorage))
internalField.Append(new UnsignedField<1>(this, generalData.sliderConfig[i]));
else
internalField.Append(new SpareBitsField<1>(this));
}
}
if (!IS_HORUS(board)) {
internalField.Append(new UnsignedField<8>(this, generalData.backlightColor));
}
@@ -2515,10 +2553,14 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
for (int i=0; i<CPN_MAX_STICKS; ++i) {
internalField.Append(new ZCharField<3>(this, generalData.stickName[i], "Stick name"));
}
for (int i=0; i<Boards::getCapability(board, Board::Pots); ++i) {
for (int i=0; i<Boards::getCapability(board, Board::PotsStorage); ++i) {
if (version <= 218 && IS_HORUS(board) && (i == 3)) {
// skip not yet existing pots (EXT1 / EXT2 for X10)
i += 2;
}
internalField.Append(new ZCharField<3>(this, generalData.potName[i], "Pot name"));
}
for (int i=0; i<MAX_SLIDERS(board); ++i) {
for (int i=0; i<Boards::getCapability(board, Board::SlidersStorage); ++i) {
internalField.Append(new ZCharField<3>(this, generalData.sliderName[i], "Slider name"));
}
internalField.Append(new CharField<17>(this, generalData.currModelFilename, true, "Current model filename"));
@@ -2539,7 +2581,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, Board::Type
for (int i=0; i<Boards::getCapability(board, Board::Pots); ++i) {
internalField.Append(new ZCharField<3>(this, generalData.potName[i], "Pot name"));
}
for (int i=0; i<MAX_SLIDERS(board); ++i) {
for (int i=0; i<Boards::getCapability(board, Board::Sliders); ++i) {
internalField.Append(new ZCharField<3>(this, generalData.sliderName[i], "Slider name"));
}
}
+1
View File
@@ -126,6 +126,7 @@ HardwarePanel::HardwarePanel(QWidget * parent, GeneralSettings & generalSettings
setupPotType(1, ui->pot2Label, ui->pot2Name, ui->pot2Type);
setupPotType(2, ui->pot3Label, ui->pot3Name, ui->pot3Type);
setupPotType(3, ui->pot4Label, ui->pot4Name, ui->pot4Type);
setupPotType(4, ui->pot5Label, ui->pot5Name, ui->pot5Type);
setupSliderType(0, ui->lsLabel, ui->lsName, ui->lsType);
setupSliderType(1, ui->rsLabel, ui->rsName, ui->rsType);
File diff suppressed because it is too large Load Diff
@@ -342,22 +342,30 @@ void convertRadioData_218_to_219(RadioData & settings)
#endif
#if defined(PCBHORUS)
// 2 new pots from X10:
// - copy btw. 'chkSum' and 'auxSerialMode' (excl.)
memcpy(&settings.chkSum, &oldSettings.chkSum, offsetof(RadioData, auxSerialMode) - offsetof(RadioData, chkSum));
// - move calibration data
memcpy(&settings.calib[NUM_STICKS + 5], &oldSettings.calib[NUM_STICKS + 3], sizeof(CalibData) * (STORAGE_NUM_SLIDERS + STORAGE_NUM_MOUSE_ANALOGS));
memclear(&settings.calib[NUM_STICKS + 3], sizeof(CalibData) * 2);
// move fields after custom functions
settings.auxSerialMode = oldSettings.auxSerialMode;
settings.switchConfig = oldSettings.switchConfig;
settings.potsConfig = oldSettings.potsConfig;
settings.slidersConfig = oldSettings.slidersConfig;
// 2 new switches
memcpy(&settings.switchNames[0], &oldSettings.switchNames[0], 8 * LEN_SWITCH_NAME);
memclear(&settings.switchNames[8], 2 * LEN_SWITCH_NAME);
// 2 new pots for X10
// - split 'anaNames' (sticks + 3 old pots, 2 new pots, other old analogs)
memcpy(&settings.anaNames[0], &oldSettings.anaNames[0], (NUM_STICKS + 3) * LEN_ANA_NAME);
memclear(&settings.anaNames[NUM_STICKS + 3], 2 * LEN_SWITCH_NAME);
memcpy(&settings.anaNames[NUM_STICKS + 5], &oldSettings.anaNames[NUM_STICKS + 3], STORAGE_NUM_SLIDERS * LEN_ANA_NAME);
// - copy rest of RadioData struct
memcpy(&settings.currModelFilename[0], &oldSettings.currModelFilename[0], sizeof(RadioData_v218) - offsetof(RadioData_v218, currModelFilename[0]));
#endif