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

Bsongis/x7d companion support (#4028)

[X7D] Companion support added
This commit is contained in:
Bertrand Songis 2016-11-16 12:59:15 +01:00 committed by GitHub
parent 4dda2c64d3
commit fb27acf286
22 changed files with 314 additions and 266 deletions

View file

@ -9,8 +9,9 @@ enum BoardEnum {
BOARD_SKY9X,
BOARD_9XRPRO,
BOARD_AR9X,
BOARD_TARANIS,
BOARD_TARANIS_PLUS,
BOARD_X7D,
BOARD_TARANIS_X9D,
BOARD_TARANIS_X9DP,
BOARD_TARANIS_X9E,
BOARD_FLAMENCO,
BOARD_HORUS
@ -38,4 +39,9 @@ enum BoardEnum {
#define C9X_NUM_SWITCHES 32
#define C9X_NUM_KEYS 32
const char * const ARROW_LEFT = "\xE2\x86\x90";
const char * const ARROW_UP = "\xE2\x86\x91";
const char * const ARROW_RIGHT = "\xE2\x86\x92";
const char * const ARROW_DOWN = "\xE2\x86\x93";
#endif

View file

@ -2,6 +2,7 @@
#include <list>
#include <float.h>
#include <QtWidgets>
#include <stdlib.h>
#include "eeprominterface.h"
#include "firmwares/er9x/er9xinterface.h"
#include "firmwares/th9x/th9xinterface.h"
@ -16,13 +17,6 @@
std::list<QString> EEPROMWarnings;
const char * switches9X[] = { "3POS", "THR", "RUD", "ELE", "AIL", "GEA", "TRN" };
const char * switchesX9D[] = { "SA", "SB", "SC", "SD", "SE", "SF", "SG", "SH", "SI", "SJ", "SK", "SL", "SM", "SN", "SO", "SP", "SQ", "SR" };
const char leftArrow[] = {(char)0xE2, (char)0x86, (char)0x90, 0};
const char rightArrow[] = {(char)0xE2, (char)0x86, (char)0x92, 0};
const char upArrow[] = {(char)0xE2, (char)0x86, (char)0x91, 0};
const char downArrow[] = {(char)0xE2, (char)0x86, (char)0x93, 0};
const uint8_t chout_ar[] = { // First number is 0..23 -> template setup, Second is relevant channel out
1,2,3,4 , 1,2,4,3 , 1,3,2,4 , 1,3,4,2 , 1,4,2,3 , 1,4,3,2,
2,1,3,4 , 2,1,4,3 , 2,3,1,4 , 2,3,4,1 , 2,4,1,3 , 2,4,3,1,
@ -500,7 +494,7 @@ QString RawSource::toString(const ModelData * model) const
case SOURCE_TYPE_MAX:
return QObject::tr("MAX");
case SOURCE_TYPE_SWITCH:
return (IS_TARANIS(GetEepromInterface()->getBoard()) ? CHECK_IN_ARRAY(switchesX9D, index) : CHECK_IN_ARRAY(switches9X, index));
return GetCurrentFirmware()->getSwitch(index).name;
case SOURCE_TYPE_CUSTOM_SWITCH:
return QObject::tr("L%1").arg(index+1);
case SOURCE_TYPE_CYC:
@ -542,19 +536,6 @@ bool RawSource::isSlider() const
index < NUM_STICKS+GetCurrentFirmware()->getCapability(Pots)+GetCurrentFirmware()->getCapability(Sliders));
}
QString SwitchUp(const char sw)
{
const char result[] = {'S', sw, upArrow[0], upArrow[1], upArrow[2], 0};
return QString::fromUtf8(result);
}
QString SwitchDn(const char sw)
{
const char result[] = {'S', sw, downArrow[0], downArrow[1], downArrow[2], 0};
return QString::fromUtf8(result);
}
QString RawSwitch::toString() const
{
static const QString switches9X[] = {
@ -563,27 +544,6 @@ QString RawSwitch::toString() const
QString("AIL"), QString("GEA"), QString("TRN")
};
static const QString switchesX9D[] = {
SwitchUp('A'), QString::fromUtf8("SA-"), SwitchDn('A'),
SwitchUp('B'), QString::fromUtf8("SB-"), SwitchDn('B'),
SwitchUp('C'), QString::fromUtf8("SC-"), SwitchDn('C'),
SwitchUp('D'), QString::fromUtf8("SD-"), SwitchDn('D'),
SwitchUp('E'), QString::fromUtf8("SE-"), SwitchDn('E'),
SwitchUp('F'), QString::fromUtf8("SF-"), SwitchDn('F'),
SwitchUp('G'), QString::fromUtf8("SG-"), SwitchDn('G'),
SwitchUp('H'), QString::fromUtf8("SH-"), SwitchDn('H'),
SwitchUp('I'), QString::fromUtf8("SI-"), SwitchDn('I'),
SwitchUp('J'), QString::fromUtf8("SJ-"), SwitchDn('J'),
SwitchUp('K'), QString::fromUtf8("SK-"), SwitchDn('K'),
SwitchUp('L'), QString::fromUtf8("SL-"), SwitchDn('L'),
SwitchUp('M'), QString::fromUtf8("SM-"), SwitchDn('M'),
SwitchUp('N'), QString::fromUtf8("SN-"), SwitchDn('N'),
SwitchUp('O'), QString::fromUtf8("SO-"), SwitchDn('O'),
SwitchUp('P'), QString::fromUtf8("SP-"), SwitchDn('P'),
SwitchUp('Q'), QString::fromUtf8("SQ-"), SwitchDn('Q'),
SwitchUp('R'), QString::fromUtf8("SR-"), SwitchDn('R'),
};
static const QString flightModes[] = {
QObject::tr("FM0"), QObject::tr("FM1"), QObject::tr("FM2"), QObject::tr("FM3"), QObject::tr("FM4"), QObject::tr("FM5"), QObject::tr("FM6"), QObject::tr("FM7"), QObject::tr("FM8")
};
@ -616,10 +576,15 @@ QString RawSwitch::toString() const
else {
switch(type) {
case SWITCH_TYPE_SWITCH:
if (IS_TARANIS(GetEepromInterface()->getBoard()))
return CHECK_IN_ARRAY(switchesX9D, index-1);
else
return CHECK_IN_ARRAY(switches9X, index-1);
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
div_t qr = div(index-1, 3);
Firmware::Switch sw = GetCurrentFirmware()->getSwitch(qr.quot);
const char * positions[] = { ARROW_UP, "-", ARROW_DOWN };
return QString(sw.name) + QString(positions[qr.rem]);
}
else {
return CHECK_IN_ARRAY(switches9X, index - 1);
}
case SWITCH_TYPE_VIRTUAL:
return QObject::tr("L%1").arg(index);
case SWITCH_TYPE_MULTIPOS_POT:
@ -1008,17 +973,17 @@ bool GeneralSettings::switchPositionAllowedTaranis(int index) const
if (index == 0)
return true;
SwitchInfo info = switchInfoFromSwitchPositionTaranis(abs(index));
if (index < 0 && switchConfig[info.index] != SWITCH_3POS)
if (index < 0 && switchConfig[info.index] != Firmware::SWITCH_3POS)
return false;
else if (info.position == 1)
return switchConfig[info.index] == SWITCH_3POS;
return switchConfig[info.index] == Firmware::SWITCH_3POS;
else
return switchConfig[info.index] != SWITCH_NONE;
return switchConfig[info.index] != Firmware::SWITCH_NONE;
}
bool GeneralSettings::switchSourceAllowedTaranis(int index) const
{
return switchConfig[index] != SWITCH_NONE;
return switchConfig[index] != Firmware::SWITCH_NONE;
}
bool GeneralSettings::isPotAvailable(int index) const
@ -1045,21 +1010,17 @@ GeneralSettings::GeneralSettings()
calibSpanNeg[i] = 0x180;
calibSpanPos[i] = 0x180;
}
for (int i=0; i<GetCurrentFirmware()->getCapability(Switches); i++) {
switchConfig[i] = GetCurrentFirmware()->getSwitch(i).type;
}
BoardEnum board = GetEepromInterface()->getBoard();
if (IS_TARANIS(board)) {
potConfig[0] = POT_WITH_DETENT;
potConfig[1] = POT_WITH_DETENT;
sliderConfig[0] = SLIDER_WITH_DETENT;
sliderConfig[1] = SLIDER_WITH_DETENT;
switchConfig[0] = SWITCH_3POS;
switchConfig[1] = SWITCH_3POS;
switchConfig[2] = SWITCH_3POS;
switchConfig[3] = SWITCH_3POS;
switchConfig[4] = SWITCH_3POS;
switchConfig[5] = SWITCH_2POS;
switchConfig[6] = SWITCH_3POS;
switchConfig[7] = SWITCH_TOGGLE;
}
else {
for (int i=0; i<3; i++) {
@ -1604,8 +1565,8 @@ void registerEEpromInterfaces()
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_GRUVIN9X));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_SKY9X));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_9XRPRO));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_TARANIS));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_TARANIS_PLUS));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_TARANIS_X9D));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_TARANIS_X9DP));
eepromInterfaces.push_back(new OpenTxEepromInterface(BOARD_TARANIS_X9E));
eepromInterfaces.push_back(new Gruvin9xInterface(BOARD_STOCK));
eepromInterfaces.push_back(new Gruvin9xInterface(BOARD_GRUVIN9X));
@ -1754,8 +1715,8 @@ const int Firmware::getFlashSize()
case BOARD_9XRPRO:
case BOARD_AR9X:
return FSIZE_9XRPRO;
case BOARD_TARANIS:
case BOARD_TARANIS_PLUS:
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_FLAMENCO:
return FSIZE_TARANIS;

View file

@ -51,13 +51,14 @@
#define IS_2560(board) (board==BOARD_GRUVIN9X || board==BOARD_MEGA2560)
#define IS_SKY9X(board) (board==BOARD_SKY9X || board==BOARD_9XRPRO || board==BOARD_AR9X)
#define IS_9XRPRO(board) (board==BOARD_9XRPRO)
#define IS_TARANIS(board) (board==BOARD_TARANIS || board==BOARD_TARANIS_PLUS || board==BOARD_TARANIS_X9E)
#define IS_TARANIS_PLUS(board) (board==BOARD_TARANIS_PLUS || board==BOARD_TARANIS_X9E)
#define IS_TARANIS(board) (board==BOARD_TARANIS_X9D || board==BOARD_TARANIS_X9DP || board==BOARD_TARANIS_X9E || board==BOARD_X7D)
#define IS_TARANIS_PLUS(board) (board==BOARD_TARANIS_X9DP || board==BOARD_TARANIS_X9E)
#define IS_TARANIS_X9E(board) (board==BOARD_TARANIS_X9E)
#define IS_HORUS(board) (board==BOARD_HORUS)
#define IS_FLAMENCO(board) (board==BOARD_FLAMENCO)
#define IS_STM32(board) (IS_TARANIS(board) || IS_HORUS(board) || IS_FLAMENCO(board))
#define IS_ARM(board) (IS_STM32(board) || IS_SKY9X(board))
#define HAS_LARGE_LCD(board) (IS_TARANIS(board) && board != BOARD_X7D)
const uint8_t modn12x3[4][4]= {
{1, 2, 3, 4},
@ -65,14 +66,6 @@ const uint8_t modn12x3[4][4]= {
{4, 2, 3, 1},
{4, 3, 2, 1} };
#define STK_RUD 1
#define STK_ELE 2
#define STK_THR 3
#define STK_AIL 4
#define STK_P1 5
#define STK_P2 6
#define STK_P3 7
enum Switches {
SWITCH_NONE,
@ -149,18 +142,6 @@ enum FailsafeModes {
#define TRIM_T6_UP 11
#define TRIM_NONE 12
// Beep center bits
#define BC_BIT_RUD (0x01)
#define BC_BIT_ELE (0x02)
#define BC_BIT_THR (0x04)
#define BC_BIT_AIL (0x08)
#define BC_BIT_P1 (0x10)
#define BC_BIT_P2 (0x20)
#define BC_BIT_P3 (0x40)
#define BC_BIT_P4 (0x80)
#define BC_BIT_REA (0x80)
#define BC_BIT_REB (0x100)
#define CHAR_FOR_NAMES " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-."
#define CHAR_FOR_NAMES_REGEX "[ A-Za-z0-9_.-,]*"
@ -172,13 +153,6 @@ enum HeliSwashTypes {
HELI_SWASH_TYPE_90
};
extern const char * switches9X[];
extern const char * switchesX9D[];
extern const char leftArrow[];
extern const char rightArrow[];
extern const char upArrow[];
extern const char downArrow[];
class ModelData;
class GeneralSettings;
@ -1187,13 +1161,6 @@ class GeneralSettings {
SLIDER_WITH_DETENT
};
enum SwitchConfig {
SWITCH_NONE,
SWITCH_TOGGLE,
SWITCH_2POS,
SWITCH_3POS,
};
GeneralSettings();
int getDefaultStick(unsigned int channel) const;
@ -1315,6 +1282,7 @@ class RadioData {
};
enum Capability {
ModelName,
FlightModes,
FlightModesName,
FlightModesHaveFades,
@ -1597,7 +1565,7 @@ struct Option {
};
class Firmware {
public:
Firmware(const QString & id, const QString & name, const BoardEnum board, EEPROMInterface * eepromInterface):
id(id),
@ -1678,7 +1646,21 @@ class Firmware {
return eepromInterface;
}
virtual int getCapability(const Capability) = 0;
virtual int getCapability(Capability) = 0;
enum SwitchType {
SWITCH_NONE,
SWITCH_TOGGLE,
SWITCH_2POS,
SWITCH_3POS
};
struct Switch {
SwitchType type;
const char * name;
};
virtual Switch getSwitch(unsigned int index) = 0;
virtual QTime getMaxTimerStart() = 0;

View file

@ -10,12 +10,11 @@
#define IS_DBLRAM(board, version) ((IS_2560(board) && version >= 213) || (board==BOARD_M128 && version >= 213 && version <= 214))
#define HAS_PERSISTENT_TIMERS(board) (IS_ARM(board) || IS_2560(board))
#define HAS_LARGE_LCD(board) IS_TARANIS(board)
#define MAX_VIEWS(board) (HAS_LARGE_LCD(board) ? 2 : 256)
#define MAX_POTS(board, version) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : (version >= 216 ? 3 : 2)) : 3)
#define MAX_SLIDERS(board) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : 2) : 0)
#define MAX_SWITCHES(board, version) (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 18 : 8) : 7)
#define MAX_SWITCHES_POSITION(board, version) (IS_TARANIS_X9E(board) ? 18*3 : (IS_TARANIS(board) ? 8*3 : 9))
#define MAX_POTS(board, version) (board == BOARD_X7D ? 2 : (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : (version >= 216 ? 3 : 2)) : 3))
#define MAX_SLIDERS(board) (board == BOARD_X7D ? 0 : (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 4 : 2) : 0))
#define MAX_SWITCHES(board, version) (board == BOARD_X7D ? 6 : (IS_TARANIS(board) ? (IS_TARANIS_X9E(board) ? 18 : 8) : 7))
#define MAX_SWITCHES_POSITION(board, version) (board == BOARD_X7D ? 6*3 : (IS_TARANIS_X9E(board) ? 18*3 : (IS_TARANIS(board) ? 8*3 : 9)))
#define MAX_ROTARY_ENCODERS(board) (IS_2560(board) ? 2 : (IS_SKY9X(board) ? 1 : 0))
#define MAX_FLIGHT_MODES(board, version) (IS_ARM(board) ? 9 : (IS_DBLRAM(board, version) ? 6 : 5))
#define MAX_TIMERS(board, version) ((IS_ARM(board) && version >= 217) ? 3 : 2)
@ -24,7 +23,7 @@
#define MAX_EXPOS(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 64 : 32) : (IS_DBLRAM(board, version) ? 16 : 14))
#define MAX_LOGICAL_SWITCHES(board, version) (IS_ARM(board) ? (version >= 218 ? 64 : 32) : ((IS_DBLEEPROM(board, version) && version<217) ? 15 : 12))
#define MAX_CUSTOM_FUNCTIONS(board, version) (IS_ARM(board) ? (version >= 216 ? 64 : 32) : (IS_DBLEEPROM(board, version) ? 24 : 16))
#define MAX_CURVES(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 32 : 16) : 8)
#define MAX_CURVES(board, version) (IS_ARM(board) ? ((HAS_LARGE_LCD(board) && version >= 216) ? 32 : 16) : 8)
#define MAX_GVARS(board, version) ((IS_ARM(board) && version >= 216) ? 9 : 5)
#define MAX_TELEMETRY_SENSORS(board, version) (32)
#define NUM_PPM_INPUTS(board, version) ((IS_ARM(board) && version >= 216) ? 16 : 8)
@ -794,6 +793,12 @@ class FlightModeField: public TransformedField {
for (int i=0; i<NUM_STICKS; i++)
internalField.Append(new SignedField<2>(trimExt[i]));
}
else if (IS_ARM(board) && version >= 218) {
for (int i=0; i<NUM_STICKS; i++) {
internalField.Append(new SignedField<11>(phase.trim[i]));
internalField.Append(new UnsignedField<5>(trimMode[i]));
}
}
else if (IS_TARANIS(board) && version >= 216) {
for (int i=0; i<NUM_STICKS; i++) {
internalField.Append(new SignedField<11>(phase.trim[i]));
@ -932,7 +937,7 @@ class MixField: public TransformedField {
version(version),
model(model)
{
if (IS_TARANIS(board) && version >= 218) {
if (IS_ARM(board) && version >= 218) {
internalField.Append(new SignedField<11>(_weight));
internalField.Append(new UnsignedField<5>(_destCh));
internalField.Append(new SourceField<10>(mix.srcRaw, board, version, FLAG_NOTELEMETRY));
@ -948,7 +953,10 @@ class MixField: public TransformedField {
internalField.Append(new UnsignedField<8>(mix.delayDown));
internalField.Append(new UnsignedField<8>(mix.speedUp));
internalField.Append(new UnsignedField<8>(mix.speedDown));
internalField.Append(new ZCharField<8>(mix.name));
if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<8>(mix.name));
else
internalField.Append(new ZCharField<6>(mix.name));
}
else if (IS_TARANIS(board) && version >= 217) {
internalField.Append(new UnsignedField<8>(_destCh));
@ -1218,7 +1226,7 @@ class InputField: public TransformedField {
board(board),
version(version)
{
if (IS_TARANIS(board) && version >= 218) {
if (IS_ARM(board) && version >= 218) {
internalField.Append(new UnsignedField<2>(expo.mode, "Mode"));
internalField.Append(new UnsignedField<14>(expo.scale, "Scale"));
internalField.Append(new SourceField<10>(expo.srcRaw, board, version, 0));
@ -1228,7 +1236,10 @@ class InputField: public TransformedField {
internalField.Append(new UnsignedField<9>(expo.flightModes));
internalField.Append(new SignedField<8>(_weight, "Weight"));
internalField.Append(new SpareBitsField<1>());
internalField.Append(new ZCharField<8>(expo.name));
if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<8>(expo.name));
else
internalField.Append(new ZCharField<6>(expo.name));
internalField.Append(new SignedField<8>(_offset, "Offset"));
internalField.Append(new CurveReferenceField(expo.curve, board, version));
}
@ -1416,7 +1427,27 @@ class LimitField: public StructField {
LimitField(LimitData & limit, BoardEnum board, unsigned int version):
StructField("Limit")
{
if (IS_TARANIS(board) && version >= 217) {
if (IS_ARM(board) && version >= 218) {
if (HAS_LARGE_LCD(board)) {
Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>));
Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>));
}
else {
Append(new ConversionField< SignedField<11> >(limit.min, +100, 10));
Append(new ConversionField< SignedField<11> >(limit.max, -100, 10));
}
Append(new SignedField<10>(limit.ppmCenter));
Append(new ConversionField< SignedField<11> >(limit.offset, exportLimitValue<0, 1024>, importLimitValue<0, 1024>));
Append(new BoolField<1>(limit.symetrical));
Append(new BoolField<1>(limit.revert));
Append(new SpareBitsField<3>());
Append(new SignedField<8>(limit.curve.value));
if (HAS_LARGE_LCD(board))
Append(new ZCharField<6>(limit.name));
else
Append(new ZCharField<4>(limit.name));
}
else if (IS_TARANIS(board) && version >= 217) {
Append(new ConversionField< SignedField<11> >(limit.min, exportLimitValue<1000, 1024>, importLimitValue<1000, 1024>));
Append(new ConversionField< SignedField<11> >(limit.max, exportLimitValue<-1000, 1024>, importLimitValue<-1000, 1024>));
Append(new SignedField<10>(limit.ppmCenter));
@ -1425,9 +1456,7 @@ class LimitField: public StructField {
Append(new BoolField<1>(limit.revert));
Append(new SpareBitsField<3>());
Append(new SignedField<8>(limit.curve.value));
if (HAS_LARGE_LCD(board)) {
Append(new ZCharField<6>(limit.name));
}
Append(new ZCharField<6>(limit.name));
}
else {
if (IS_TARANIS(board) && version >= 216) {
@ -1466,7 +1495,7 @@ class CurvesField: public TransformedField {
maxPoints(IS_ARM(board) ? 512 : 112-8)
{
for (int i=0; i<maxCurves; i++) {
if (IS_TARANIS(board) && version >= 218) {
if (IS_ARM(board) && version >= 218) {
internalField.Append(new UnsignedField<1>((unsigned int &)curves[i].type));
internalField.Append(new BoolField<1>(curves[i].smooth));
internalField.Append(new ConversionField< SignedField<6> >(curves[i].count, -5));
@ -2523,7 +2552,7 @@ class FrskyScreenField: public DataField {
}
}
int columns = (IS_TARANIS(board) ? 3 : 2);
int columns = (HAS_LARGE_LCD(board) ? 3 : 2);
for (int i=0; i<4; i++) {
for (int j=0; j<columns; j++) {
if (IS_TARANIS(board) && version >= 217)
@ -2968,7 +2997,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
internalField.Append(new UnsignedField<8>(modelData.moduleData[1].modelId));
}
if (IS_TARANIS(board) && version >= 215) {
if (HAS_LARGE_LCD(board) && version >= 215) {
internalField.Append(new CharField<10>(modelData.bitmap));
}
@ -2981,7 +3010,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
internalField.Append(new BoolField<1>(modelData.timers[i].minuteBeep));
internalField.Append(new UnsignedField<2>(modelData.timers[i].persistent));
internalField.Append(new SpareBitsField<3>());
if (IS_TARANIS(board))
if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<8>(modelData.timers[i].name));
else
internalField.Append(new ZCharField<3>(modelData.timers[i].name));
@ -3119,20 +3148,30 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
else if (version >= 216)
internalField.Append(new UnsignedField<8>(modelData.switchWarningEnable));
if ((board == BOARD_STOCK || (board == BOARD_M128 && version >= 215)) && (variant & GVARS_VARIANT)) {
for (int i=0; i<MAX_GVARS(board, version); i++) {
// on M64 GVARS are common to all phases, and there is no name
internalField.Append(new SignedField<16>(modelData.flightModeData[0].gvars[i]));
}
}
if (board != BOARD_STOCK && (board != BOARD_M128 || version < 215)) {
for (int i=0; i<MAX_GVARS(board, version); i++) {
internalField.Append(new ZCharField<6>(modelData.gvars_names[i]));
if (version >= 216) {
if (version >= 218) {
internalField.Append(new ZCharField<3>(modelData.gvars_names[i]));
internalField.Append(new SpareBitsField<12>()); // TODO min
internalField.Append(new SpareBitsField<12>()); // TODO max
internalField.Append(new BoolField<1>(modelData.gvars_popups[i]));
internalField.Append(new SpareBitsField<7>());
internalField.Append(new SpareBitsField<1>());
internalField.Append(new SpareBitsField<2>());
internalField.Append(new SpareBitsField<4>());
}
else {
internalField.Append(new ZCharField<6>(modelData.gvars_names[i]));
if (version >= 216) {
internalField.Append(new BoolField<1>(modelData.gvars_popups[i]));
internalField.Append(new SpareBitsField<7>());
}
}
}
}
else if (variant & GVARS_VARIANT) {
for (int i=0; i<MAX_GVARS(board, version); i++) {
// on M64 GVARS are common to all flight modes, and there is no name
internalField.Append(new SignedField<16>(modelData.flightModeData[0].gvars[i]));
}
}
@ -3214,7 +3253,17 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
}
if (IS_TARANIS(board)) {
if (version >= 217) {
if (version >= 218) {
for (int i=0; i<7; i++) {
ScriptData & script = modelData.scriptData[i];
internalField.Append(new CharField<6>(script.filename));
internalField.Append(new ZCharField<6>(script.name));
for (int j=0; j<6; j++) {
internalField.Append(new SignedField<16>(script.inputs[j]));
}
}
}
else if (version >= 217) {
for (int i=0; i<7; i++) {
ScriptData & script = modelData.scriptData[i];
internalField.Append(new CharField<8>(script.filename));
@ -3238,7 +3287,10 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne
if (IS_TARANIS(board) && version >= 216) {
for (int i=0; i<32; i++) {
internalField.Append(new ZCharField<4>(modelData.inputNames[i]));
if (HAS_LARGE_LCD(board))
internalField.Append(new ZCharField<4>(modelData.inputNames[i]));
else
internalField.Append(new ZCharField<3>(modelData.inputNames[i]));
}
}
@ -3375,6 +3427,7 @@ OpenTxGeneralData::OpenTxGeneralData(GeneralSettings & generalData, BoardEnum bo
if (version >= 216) {
for (int i=0; i<inputsCount; i++) {
qDebug() << "CALIB" << i;
internalField.Append(new SignedField<16>(generalData.calibMid[i]));
internalField.Append(new SignedField<16>(generalData.calibSpanNeg[i]));
internalField.Append(new SignedField<16>(generalData.calibSpanPos[i]));

View file

@ -63,12 +63,14 @@ const char * OpenTxEepromInterface::getName()
return "OpenTX for MEGA2560 board";
case BOARD_GRUVIN9X:
return "OpenTX for Gruvin9x board / 9X";
case BOARD_TARANIS:
return "OpenTX for FrSky Taranis";
case BOARD_TARANIS_PLUS:
return "OpenTX for FrSky Taranis Plus";
case BOARD_TARANIS_X9D:
return "OpenTX for FrSky Taranis X9D";
case BOARD_TARANIS_X9DP:
return "OpenTX for FrSky Taranis X9D+";
case BOARD_TARANIS_X9E:
return "OpenTX for FrSky Taranis X9E";
case BOARD_X7D:
return "OpenTX for FrSky X7D";
case BOARD_SKY9X:
return "OpenTX for Sky9x board / 9X";
case BOARD_9XRPRO:
@ -99,8 +101,9 @@ const int OpenTxEepromInterface::getEEpromSize()
case BOARD_9XRPRO:
case BOARD_AR9X:
return EESIZE_9XRPRO;
case BOARD_TARANIS:
case BOARD_TARANIS_PLUS:
case BOARD_X7D:
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_FLAMENCO:
case BOARD_HORUS:
@ -320,7 +323,7 @@ unsigned long OpenTxEepromInterface::loadxml(RadioData &radioData, QDomDocument
return errors.to_ulong();
}
unsigned long OpenTxEepromInterface::load(RadioData &radioData, const uint8_t *eeprom, int size)
unsigned long OpenTxEepromInterface::load(RadioData & radioData, const uint8_t * eeprom, int size)
{
std::cout << "trying " << getName() << " import...";
@ -403,8 +406,9 @@ int OpenTxEepromInterface::save(uint8_t *eeprom, RadioData &radioData, uint32_t
if (!version) {
switch(board) {
case BOARD_TARANIS:
case BOARD_TARANIS_PLUS:
case BOARD_X7D:
case BOARD_TARANIS_X9D:
case BOARD_TARANIS_X9DP:
case BOARD_TARANIS_X9E:
case BOARD_SKY9X:
case BOARD_AR9X:
@ -527,7 +531,7 @@ Firmware * OpenTxFirmware::getFirmwareVariant(const QString & id)
}
}
int OpenTxFirmware::getCapability(const Capability capability)
int OpenTxFirmware::getCapability(Capability capability)
{
switch (capability) {
case Imperial:
@ -536,15 +540,9 @@ int OpenTxFirmware::getCapability(const Capability capability)
else
return id.contains("imperial") ? 1 : 0;
case ModelImage:
if (IS_TARANIS(board))
return 1;
else
return 0;
return (board==BOARD_TARANIS_X9D || board==BOARD_TARANIS_X9DP || board==BOARD_TARANIS_X9E);
case HasBeeper:
if (IS_ARM(board))
return 0;
else
return 1;
return (!IS_ARM(board));
case HasPxxCountry:
return 1;
case HasGeneralUnits:
@ -553,10 +551,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
else
return 0;
case HasNegAndSwitches:
if (IS_ARM(board))
return 1;
else
return 0;
return IS_ARM(board);
case PPMExtCtrl:
return 1;
case PPMFrameLength:
@ -582,6 +577,8 @@ int OpenTxFirmware::getCapability(const Capability capability)
return IS_ARM(board) ? 9 : 5;
else
return 0;
case ModelName:
return (HAS_LARGE_LCD(board) ? 12 : 10);
case FlightModesName:
return (IS_TARANIS(board) ? 10 : 6);
case GvarsName:
@ -599,21 +596,25 @@ int OpenTxFirmware::getCapability(const Capability capability)
case Timers:
return (IS_ARM(board) ? 3 : 2);
case TimersName:
return (IS_TARANIS(board) ? 8 : (IS_ARM(board) ? 3 : 0));
return (HAS_LARGE_LCD(board) ? 8 : (IS_ARM(board) ? 3 : 0));
case PermTimers:
if (IS_2560(board) || IS_ARM(board))
return 1;
else
return 0;
case Pots:
if (IS_TARANIS_X9E(board))
if (board == BOARD_X7D)
return 2;
else if (IS_TARANIS_X9E(board))
return 4;
else if (IS_TARANIS(board))
return 3; //Taranis has only 2 pots but still has a placeholder in settings for 3 pots
else
return 3;
case Sliders:
if (IS_TARANIS_X9E(board))
if (board == BOARD_X7D)
return 0;
else if (IS_TARANIS_X9E(board))
return 4;
else if (IS_TARANIS(board))
return 2;
@ -622,6 +623,8 @@ int OpenTxFirmware::getCapability(const Capability capability)
case Switches:
if (IS_TARANIS_X9E(board))
return 18;
else if (board == BOARD_X7D)
return 6;
else if (IS_TARANIS(board))
return 8;
else
@ -691,7 +694,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
case Simulation:
return 1;
case NumCurves:
return (IS_TARANIS(board) ? 32 : (IS_ARM(board) ? 16 : 8));
return (HAS_LARGE_LCD(board) ? 32 : (IS_ARM(board) ? 16 : 8));
case HasMixerNames:
return (IS_ARM(board) ? (IS_TARANIS(board) ? 8 : 6) : false);
case HasExpoNames:
@ -699,7 +702,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
case HasNoExpo:
return (IS_TARANIS(board) ? false : true);
case ChannelsName:
return (IS_TARANIS(board) ? 6 : 0);
return (IS_ARM(board) ? (HAS_LARGE_LCD(board) ? 6 : 4) : 0);
case HasCvNames:
return (IS_TARANIS(board) ? 1 : 0);
case Telemetry:
@ -712,7 +715,7 @@ int OpenTxFirmware::getCapability(const Capability capability)
case TelemetryCustomScreens:
return IS_ARM(board) ? 4 : 2;
case TelemetryCustomScreensFieldsPerLine:
return IS_TARANIS(board) ? 3 : 2;
return HAS_LARGE_LCD(board) ? 3 : 2;
case NoTelemetryProtocol:
return IS_TARANIS(board) ? 1 : 0;
case TelemetryUnits:
@ -813,6 +816,50 @@ int OpenTxFirmware::getCapability(const Capability capability)
}
}
Firmware::Switch OpenTxFirmware::getSwitch(unsigned int index)
{
if (board == BOARD_X7D) {
const Switch switches[] = { { SWITCH_3POS, "SA" },
{ SWITCH_3POS, "SB" },
{ SWITCH_3POS, "SC" },
{ SWITCH_3POS, "SD" },
{ SWITCH_2POS, "SF" },
{ SWITCH_TOGGLE, "SH" } };
return switches[index];
}
else if (IS_TARANIS(board) || board == BOARD_HORUS) {
const Switch switches[] = { { SWITCH_3POS, "SA" },
{ SWITCH_3POS, "SB" },
{ SWITCH_3POS, "SC" },
{ SWITCH_3POS, "SD" },
{ SWITCH_3POS, "SE" },
{ SWITCH_2POS, "SF" },
{ SWITCH_3POS, "SG" },
{ SWITCH_TOGGLE, "SH" },
{ SWITCH_3POS, "SI" },
{ SWITCH_3POS, "SJ" },
{ SWITCH_3POS, "SK" },
{ SWITCH_3POS, "SL" },
{ SWITCH_3POS, "SM" },
{ SWITCH_3POS, "SN" },
{ SWITCH_3POS, "SO" },
{ SWITCH_3POS, "SP" },
{ SWITCH_3POS, "SQ" },
{ SWITCH_3POS, "SR" } };
return switches[index];
}
else {
const Switch switches[] = {{SWITCH_3POS, "3POS"},
{SWITCH_2POS, "THR"},
{SWITCH_2POS, "RUD"},
{SWITCH_2POS, "ELE"},
{SWITCH_2POS, "AIL"},
{SWITCH_2POS, "GEA"},
{SWITCH_TOGGLE, "SH"}};
return switches[index];
}
}
QTime OpenTxFirmware::getMaxTimerStart()
{
if (IS_TARANIS(board) || IS_HORUS(board))
@ -1036,7 +1083,7 @@ unsigned long OpenTxEepromInterface::loadBackup(RadioData &radioData, uint8_t *e
BoardEnum backupBoard = (BoardEnum)-1;
switch (eeprom[3]) {
case 0x33:
backupBoard = BOARD_TARANIS;
backupBoard = BOARD_TARANIS_X9D;
break;
case 0x32:
backupBoard = BOARD_SKY9X;
@ -1176,27 +1223,33 @@ void registerOpenTxFirmwares()
Option nav_options[] = { { "rotenc", QObject::tr("Rotary Encoder use in menus navigation") }, { "potscroll", QObject::tr("Pots use in menus navigation") }, { NULL } };
Option dsm2_options[] = { { "DSM2", QObject::tr("Support for DSM2 modules"), 0 }, { "DSM2PPM", QObject::tr("Support for DSM2 modules using ppm instead of true serial"), 0 }, { NULL } };
/* Taranis Plus board */
firmware = new OpenTxFirmware("opentx-x9d+", QObject::tr("FrSky Taranis Plus"), BOARD_TARANIS_PLUS);
/* FrSky Taranis X9D+ board */
firmware = new OpenTxFirmware("opentx-x9d+", QObject::tr("FrSky Taranis X9D+"), BOARD_TARANIS_X9DP);
addOpenTxTaranisOptions(firmware);
addOpenTxCommonOptions(firmware);
firmwares.push_back(firmware);
/* Taranis board */
firmware = new OpenTxFirmware("opentx-x9d", QObject::tr("FrSky Taranis"), BOARD_TARANIS);
/* FrSky Taranis X9D board */
firmware = new OpenTxFirmware("opentx-x9d", QObject::tr("FrSky Taranis X9D"), BOARD_TARANIS_X9D);
firmware->addOption("haptic", QObject::tr("Haptic module installed"));
addOpenTxTaranisOptions(firmware);
addOpenTxCommonOptions(firmware);
firmwares.push_back(firmware);
/* Taranis X9E board */
/* FrSky Taranis X9E board */
firmware = new OpenTxFirmware("opentx-x9e", QObject::tr("FrSky Taranis X9E"), BOARD_TARANIS_X9E);
firmware->addOption("shutdownconfirm", QObject::tr("Confirmation before radio shutdown"));
addOpenTxTaranisOptions(firmware);
addOpenTxCommonOptions(firmware);
firmwares.push_back(firmware);
/* Horus board */
/* FrSky X7D board */
firmware = new OpenTxFirmware("opentx-x7d", QObject::tr("FrSky X7D"), BOARD_X7D);
addOpenTxTaranisOptions(firmware);
addOpenTxCommonOptions(firmware);
firmwares.push_back(firmware);
/* FrSky Horus board */
firmware = new OpenTxFirmware("opentx-horus", QObject::tr("FrSky Horus"), BOARD_HORUS);
firmware->addOption("noheli", QObject::tr("Disable HELI menu and cyclic mix support"));
firmware->addOption("nogvars", QObject::tr("Disable Global variables"));

View file

@ -117,7 +117,9 @@ class OpenTxFirmware: public Firmware {
virtual QString getFirmwareUrl();
virtual int getCapability(const Capability);
virtual int getCapability(Capability);
virtual Switch getSwitch(unsigned int index);
virtual QTime getMaxTimerStart();

View file

@ -8,7 +8,7 @@ void HardwarePanel::setupSwitchConfig(int index, QLabel *label, AutoLineEdit *na
if (IS_TARANIS(firmware->getBoard())) {
if (IS_TARANIS_X9E(firmware->getBoard())) {
enabled = true;
type->addItem(tr("None"), GeneralSettings::SWITCH_NONE);
type->addItem(tr("None"), Firmware::SWITCH_NONE);
}
else if (index < 8) {
enabled = true;
@ -16,9 +16,9 @@ void HardwarePanel::setupSwitchConfig(int index, QLabel *label, AutoLineEdit *na
}
if (enabled) {
type->addItem(tr("2 Positions Toggle"), GeneralSettings::SWITCH_TOGGLE);
type->addItem(tr("2 Positions"), GeneralSettings::SWITCH_2POS);
if (threePos) type->addItem(tr("3 Positions"), GeneralSettings::SWITCH_3POS);
type->addItem(tr("2 Positions Toggle"), Firmware::SWITCH_TOGGLE);
type->addItem(tr("2 Positions"), Firmware::SWITCH_2POS);
if (threePos) type->addItem(tr("3 Positions"), Firmware::SWITCH_3POS);
name->setField(generalSettings.switchName[index], 3, this);
type->setField(generalSettings.switchConfig[index], this);
}

View file

@ -804,7 +804,7 @@ void startSimulation(QWidget * parent, RadioData & radioData, int modelIdx)
else if (board == BOARD_FLAMENCO) {
sd = new SimulatorDialogFlamenco(parent, si, flags);
}
else if (IS_TARANIS(board)) {
else if (board == BOARD_TARANIS_X9D || board == BOARD_TARANIS_X9DP || board == BOARD_TARANIS_X9E) {
for (int i=0; i<GetCurrentFirmware()->getCapability(Pots); i++) {
if (radioData.generalSettings.isPotAvailable(i)) {
flags |= (SIMULATOR_FLAGS_S1 << i);

View file

@ -178,7 +178,7 @@ void MdiChild::modelEdit()
else {
QApplication::setOverrideCursor(Qt::WaitCursor);
checkAndInitModel( row );
ModelData &model = radioData.models[row - 1];
ModelData & model = radioData.models[row - 1];
gStopwatch.restart();
gStopwatch.report("ModelEdit creation");
ModelEdit *t = new ModelEdit(this, radioData, (row - 1), GetCurrentFirmware()/*firmware*/);
@ -213,7 +213,7 @@ void MdiChild::openEditWindow()
generalEdit();
}
else{
ModelData &model = radioData.models[row - 1];
ModelData & model = radioData.models[row - 1];
if (model.isEmpty() && g.useWizard()) {
wizardEdit();
}

View file

@ -25,7 +25,7 @@ LimitsGroup::LimitsGroup(Firmware * firmware, TableLayout * tableLayout, int row
spinbox->setSuffix("%");
}
if (IS_TARANIS(board) || deflt == 0 /*it's the offset*/) {
if (HAS_LARGE_LCD(board) || deflt == 0 /*it's the offset*/) {
spinbox->setDecimals(1);
}
else {

View file

@ -181,8 +181,7 @@ ModulePanel::ModulePanel(QWidget *parent, ModelData & model, ModuleData & module
}
}
for (int i=0; i<=MM_RF_PROTO_LAST; i++)
{
for (int i=0; i<=MM_RF_PROTO_LAST; i++) {
ui->multiProtocol->addItem(ModelPrinter::printMultiRfProtocol(i, false), (QVariant) i);
}
@ -531,7 +530,7 @@ void ModulePanel::updateFailsafe(int channel)
/******************************************************************************/
SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware):
SetupPanel::SetupPanel(QWidget * parent, ModelData & model, GeneralSettings & generalSettings, Firmware * firmware):
ModelPanel(parent, model, generalSettings, firmware),
ui(new Ui::Setup)
{
@ -545,7 +544,7 @@ SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & gen
QRegExp rx(CHAR_FOR_NAMES_REGEX);
ui->name->setValidator(new QRegExpValidator(rx, this));
ui->name->setMaxLength(IS_TARANIS(board) ? 12 : 10);
ui->name->setMaxLength(firmware->getCapability(ModelName));
if (firmware->getCapability(ModelImage)) {
QStringList items;
@ -594,7 +593,7 @@ SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & gen
ui->imagePreview->hide();
}
QWidget *prevFocus = ui->image;
QWidget * prevFocus = ui->image;
for (int i=0; i<C9X_MAX_TIMERS; i++) {
if (i<firmware->getCapability(Timers)) {
timers[i] = new TimerPanel(this, model, model.timers[i], generalSettings, firmware, prevFocus);
@ -655,15 +654,12 @@ SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & gen
// Startup switches warnings
for (int i=0; i<firmware->getCapability(Switches); i++) {
Firmware::Switch sw = firmware->getSwitch(i);
if (IS_TARANIS(firmware->getBoard())) {
if (generalSettings.switchConfig[i] == GeneralSettings::SWITCH_NONE || generalSettings.switchConfig[i] == GeneralSettings::SWITCH_TOGGLE) {
continue;
}
sw.type = Firmware::SwitchType(generalSettings.switchConfig[i]);
}
else {
if (i==firmware->getCapability(Switches)-1) {
continue;
}
if (sw.type == Firmware::SWITCH_NONE || sw.type == Firmware::SWITCH_TOGGLE) {
continue;
}
QLabel * label = new QLabel(this);
QSlider * slider = new QSlider(this);
@ -678,14 +674,8 @@ SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & gen
slider->setSingleStep(1);
slider->setPageStep(1);
slider->setTickInterval(1);
if (IS_TARANIS(board)) {
label->setText(switchesX9D[i]);
slider->setMaximum(generalSettings.switchConfig[i] == GeneralSettings::SWITCH_3POS ? 2 : 1);
}
else {
label->setText(switches9X[i]);
slider->setMaximum(i==0 ? 2 : 1);
}
label->setText(sw.name);
slider->setMaximum(sw.type == Firmware::SWITCH_3POS ? 2 : 1);
cb->setProperty("index", i);
ui->switchesStartupLayout->addWidget(label, 0, i+1);
ui->switchesStartupLayout->setAlignment(label, Qt::AlignCenter);
@ -701,8 +691,7 @@ SetupPanel::SetupPanel(QWidget *parent, ModelData & model, GeneralSettings & gen
QWidget::setTabOrder(slider, cb);
prevFocus = cb;
}
ui->switchesStartupLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, firmware->getCapability(Switches));
// Pot warnings
prevFocus = ui->potWarningMode;
if (IS_TARANIS(board)) {
@ -931,7 +920,7 @@ void SetupPanel::updateStartupSwitches()
bool enabled = !(model->switchWarningEnable & (1 << index));
if (IS_TARANIS(GetEepromInterface()->getBoard())) {
value = (switchStates >> 2*index) & 0x03;
if (generalSettings.switchConfig[index] != GeneralSettings::SWITCH_3POS && value == 2)
if (generalSettings.switchConfig[index] != Firmware::SWITCH_3POS && value == 2)
value = 1;
}
else {
@ -969,7 +958,7 @@ void SetupPanel::startupSwitchEdited(int value)
model->switchWarningStates &= ~mask;
if (IS_TARANIS(GetEepromInterface()->getBoard()) && generalSettings.switchConfig[index] != GeneralSettings::SWITCH_3POS) {
if (IS_TARANIS(GetEepromInterface()->getBoard()) && generalSettings.switchConfig[index] != Firmware::SWITCH_3POS) {
if (value == 1) value = 2;
}

View file

@ -55,14 +55,14 @@ SimulatorDialog9X::SimulatorDialog9X(QWidget * parent, SimulatorInterface *simul
if (g.simuSW())
restoreSwitches();
ui->trimHR_L->setText(QString::fromUtf8(leftArrow));
ui->trimHR_R->setText(QString::fromUtf8(rightArrow));
ui->trimVR_U->setText(QString::fromUtf8(upArrow));
ui->trimVR_D->setText(QString::fromUtf8(downArrow));
ui->trimHL_L->setText(QString::fromUtf8(leftArrow));
ui->trimHL_R->setText(QString::fromUtf8(rightArrow));
ui->trimVL_U->setText(QString::fromUtf8(upArrow));
ui->trimVL_D->setText(QString::fromUtf8(downArrow));
ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
for (int i=0; i<pots.count(); i++) {
pots[i]->setProperty("index", i);
connect(pots[i], SIGNAL(valueChanged(int)), this, SLOT(dialChanged(int)));

View file

@ -25,14 +25,14 @@ SimulatorDialogFlamenco::SimulatorDialogFlamenco(QWidget * parent, SimulatorInte
if (g.simuSW())
restoreSwitches();
ui->trimHR_L->setText(QString::fromUtf8(leftArrow));
ui->trimHR_R->setText(QString::fromUtf8(rightArrow));
ui->trimVR_U->setText(QString::fromUtf8(upArrow));
ui->trimVR_D->setText(QString::fromUtf8(downArrow));
ui->trimHL_L->setText(QString::fromUtf8(leftArrow));
ui->trimHL_R->setText(QString::fromUtf8(rightArrow));
ui->trimVL_U->setText(QString::fromUtf8(upArrow));
ui->trimVL_D->setText(QString::fromUtf8(downArrow));
ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));

View file

@ -43,14 +43,14 @@ SimulatorDialogHorus::SimulatorDialogHorus(QWidget * parent, SimulatorInterface
if (g.simuSW())
restoreSwitches();
ui->trimHR_L->setText(QString::fromUtf8(leftArrow));
ui->trimHR_R->setText(QString::fromUtf8(rightArrow));
ui->trimVR_U->setText(QString::fromUtf8(upArrow));
ui->trimVR_D->setText(QString::fromUtf8(downArrow));
ui->trimHL_L->setText(QString::fromUtf8(leftArrow));
ui->trimHL_R->setText(QString::fromUtf8(rightArrow));
ui->trimVL_U->setText(QString::fromUtf8(upArrow));
ui->trimVL_D->setText(QString::fromUtf8(downArrow));
ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));

View file

@ -50,14 +50,14 @@ SimulatorDialogTaranis::SimulatorDialogTaranis(QWidget * parent, SimulatorInterf
}
}
ui->trimHR_L->setText(QString::fromUtf8(leftArrow));
ui->trimHR_R->setText(QString::fromUtf8(rightArrow));
ui->trimVR_U->setText(QString::fromUtf8(upArrow));
ui->trimVR_D->setText(QString::fromUtf8(downArrow));
ui->trimHL_L->setText(QString::fromUtf8(leftArrow));
ui->trimHL_R->setText(QString::fromUtf8(rightArrow));
ui->trimVL_U->setText(QString::fromUtf8(upArrow));
ui->trimVL_D->setText(QString::fromUtf8(downArrow));
ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));

View file

@ -24,7 +24,7 @@ void registerSimulator(const QString &filename)
typedef SimulatorFactory * (*RegisterSimulator)();
RegisterSimulator registerSimulator = (RegisterSimulator)lib.resolve("registerSimu");
if (registerSimulator) {
SimulatorFactory *factory = registerSimulator();
SimulatorFactory * factory = registerSimulator();
registerSimulatorFactory(factory);
}
else {

View file

@ -157,7 +157,7 @@ int main(int argc, char *argv[])
options.add("help", "show this help text");
options.alias("help", "h");
options.parse(QCoreApplication::arguments());
if(options.count("help") || options.showUnrecognizedWarning()) {
if (options.count("help") || options.showUnrecognizedWarning()) {
QString msg;
QTextStream stream(&msg);
stream << "Usage: simulator [OPTION]... [EEPROM.BIN FILE] " << endl << endl;
@ -216,7 +216,7 @@ int main(int argc, char *argv[])
qDebug() << "eepromFileName" << eepromFileName;
// TODO display used eeprom filename somewhere
SimulatorFactory *factory = getSimulatorFactory(firmwareId);
SimulatorFactory * factory = getSimulatorFactory(firmwareId);
if (!factory) {
showMessage(QObject::tr("ERROR: Simulator %1 not found").arg(firmwareId), QMessageBox::Critical);
return 2;
@ -225,7 +225,7 @@ int main(int argc, char *argv[])
dialog = new SimulatorDialogHorus(NULL, factory->create());
else if (factory->type() == BOARD_FLAMENCO)
dialog = new SimulatorDialogFlamenco(NULL, factory->create());
else if (factory->type() == BOARD_TARANIS)
else if (factory->type() == BOARD_TARANIS_X9D || factory->type() == BOARD_TARANIS_X9DP || factory->type() == BOARD_TARANIS_X9E)
dialog = new SimulatorDialogTaranis(NULL, factory->create(), SIMULATOR_FLAGS_S1|SIMULATOR_FLAGS_S2);
else
dialog = new SimulatorDialog9X(NULL, factory->create());

View file

@ -164,7 +164,7 @@ enum CurveType {
#define LEN_TIMER_NAME 3
#define LEN_FLIGHT_MODE_NAME 6
#define LEN_EXPOMIX_NAME 6
#define LEN_CHANNEL_NAME 6
#define LEN_CHANNEL_NAME 4
#define LEN_INPUT_NAME 3
#define LEN_CURVE_NAME 3
#define LEN_FUNCTION_NAME 6
@ -527,15 +527,13 @@ enum PotsWarnMode {
// even we do not spend space in EEPROM for 10 GVARS, we reserve the space inside the range of values, like offset, weight, etc.
#if defined(PCBSTD) && defined(GVARS)
#define MAX_GVARS 5
#define MAX_GVARS 5
#elif defined(PCBSTD)
#define MAX_GVARS 0
#define MAX_GVARS 0
#elif defined(CPUARM)
#define MAX_GVARS 9
#else
#if defined(CPUARM)
#define MAX_GVARS 9
#else
#define MAX_GVARS 5
#endif
#define MAX_GVARS 5
#endif
enum SwitchSources {
@ -836,21 +834,25 @@ enum MixSources {
MIXSRC_SB, LUA_EXPORT("sb", "Switch B")
MIXSRC_SC, LUA_EXPORT("sc", "Switch C")
MIXSRC_SD, LUA_EXPORT("sd", "Switch D")
#if !defined(PCBX7D)
MIXSRC_SE, LUA_EXPORT("se", "Switch E")
#endif
MIXSRC_SF, LUA_EXPORT("sf", "Switch F")
#if !defined(PCBX7D)
MIXSRC_SG, LUA_EXPORT("sg", "Switch G")
#endif
MIXSRC_SH, LUA_EXPORT("sh", "Switch H")
#if defined(PCBX9E)
MIXSRC_SI, LUA_EXPORT("si", "Switch I (X9E only)")
MIXSRC_SJ, LUA_EXPORT("sj", "Switch J (X9E only)")
MIXSRC_SK, LUA_EXPORT("sk", "Switch K (X9E only)")
MIXSRC_SL, LUA_EXPORT("sl", "Switch L (X9E only)")
MIXSRC_SM, LUA_EXPORT("sm", "Switch M (X9E only)")
MIXSRC_SN, LUA_EXPORT("sn", "Switch N (X9E only)")
MIXSRC_SO, LUA_EXPORT("so", "Switch O (X9E only)")
MIXSRC_SP, LUA_EXPORT("sp", "Switch P (X9E only)")
MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q (X9E only)")
MIXSRC_SR, LUA_EXPORT("sr", "Switch R (X9E only)")
MIXSRC_SI, LUA_EXPORT("si", "Switch I")
MIXSRC_SJ, LUA_EXPORT("sj", "Switch J")
MIXSRC_SK, LUA_EXPORT("sk", "Switch K")
MIXSRC_SL, LUA_EXPORT("sl", "Switch L")
MIXSRC_SM, LUA_EXPORT("sm", "Switch M")
MIXSRC_SN, LUA_EXPORT("sn", "Switch N")
MIXSRC_SO, LUA_EXPORT("so", "Switch O")
MIXSRC_SP, LUA_EXPORT("sp", "Switch P")
MIXSRC_SQ, LUA_EXPORT("sq", "Switch Q")
MIXSRC_SR, LUA_EXPORT("sr", "Switch R")
MIXSRC_LAST_SWITCH = MIXSRC_SR,
#else
MIXSRC_LAST_SWITCH = MIXSRC_SH,
@ -867,10 +869,6 @@ enum MixSources {
#endif
MIXSRC_FIRST_LOGICAL_SWITCH,
MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES)
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, LUA_EXPORT_MULTIPLE("trn", "Trainer input %d", MAX_TRAINER_CHANNELS)

View file

@ -38,9 +38,9 @@ void menuRadioTrainer(event_t event)
y = MENU_HEADER_HEIGHT + 1 + FH;
for (uint8_t i=HEADER_LINE; i<HEADER_LINE+NUM_STICKS; i++) {
uint8_t chan = channel_order(i);
volatile TrainerMix *td = &g_eeGeneral.trainer.mix[chan-1];
for (uint8_t i=0; i<NUM_STICKS; i++) {
uint8_t chan = channel_order(i+1);
volatile TrainerMix * td = &g_eeGeneral.trainer.mix[chan-1];
drawSource(0, y, MIXSRC_Rud-1+chan, (menuVerticalPosition==i && CURSOR_ON_LINE()) ? INVERS : 0);

View file

@ -1181,9 +1181,11 @@ const luaR_value_entry opentxConstants[] = {
{ "MIXSRC_SB", MIXSRC_SB },
{ "MIXSRC_SC", MIXSRC_SC },
{ "MIXSRC_SD", MIXSRC_SD },
#if !defined(PCBX7D)
{ "MIXSRC_SE", MIXSRC_SE },
{ "MIXSRC_SF", MIXSRC_SF },
{ "MIXSRC_SG", MIXSRC_SG },
#endif
{ "MIXSRC_SF", MIXSRC_SF },
{ "MIXSRC_SH", MIXSRC_SH },
{ "MIXSRC_CH1", MIXSRC_CH1 },
{ "SWSRC_LAST", SWSRC_LAST_LOGICAL_SWITCH },

View file

@ -241,7 +241,7 @@ class OpenTxSimulatorFactory: public SimulatorFactory
{
}
virtual SimulatorInterface *create()
virtual SimulatorInterface * create()
{
return new OpenTxSimulator();
}
@ -257,8 +257,10 @@ class OpenTxSimulatorFactory: public SimulatorFactory
return BOARD_HORUS;
#elif defined(PCBFLAMENCO)
return BOARD_FLAMENCO;
#elif defined(PCBX7D)
return BOARD_X7D;
#elif defined(PCBTARANIS)
return BOARD_TARANIS;
return BOARD_TARANIS_X9D;
#else
return BOARD_STOCK;
#endif

View file

@ -376,7 +376,7 @@ enum Analogs {
NUMBER_ANALOG
};
#define NUM_POTS (POT_LAST-POT_FIRST+1)
#define NUM_SLIDERS (TX_VOLTAGE-POT_FIRST-NUM_POTS)
#define NUM_SLIDERS (TX_VOLTAGE-POT_LAST-1)
#define NUM_XPOTS NUM_POTS
#if defined(PCBX9D)
#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT2) // POT3 is only defined in software