Merge pull request #3883 from opentx/schwabe/spektrum_dsm2_bind
Update OpenTX Multi code to match current DIY-MULTI module code
This commit is contained in:
@@ -1864,11 +1864,11 @@ unsigned int getNumSubtypes(MultiModuleRFProtocols type) {
|
||||
case MM_RF_PROTO_KN:
|
||||
return 2;
|
||||
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_CG023:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
return 3;
|
||||
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
return 4;
|
||||
|
||||
@@ -1877,7 +1877,6 @@ unsigned int getNumSubtypes(MultiModuleRFProtocols type) {
|
||||
return 5;
|
||||
|
||||
case MM_RF_PROTO_CX10:
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
return 8;
|
||||
default:
|
||||
return 1;
|
||||
|
||||
@@ -868,8 +868,12 @@ enum MultiModuleRFProtocols {
|
||||
MM_RF_PROTO_SHENQI,
|
||||
MM_RF_PROTO_FY326,
|
||||
MM_RF_PROTO_SFHSS,
|
||||
MM_RF_PROTO_CUSTOM,
|
||||
MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM
|
||||
MM_RF_PROTO_J6PRO,
|
||||
MM_RF_PROTO_FQ777,
|
||||
MM_RF_PROTO_ASSAN,
|
||||
MM_RF_PROTO_HONTAI,
|
||||
MM_RF_PROTO_OLRS,
|
||||
MM_RF_PROTO_LAST= MM_RF_PROTO_OLRS
|
||||
};
|
||||
|
||||
unsigned int getNumSubtypes(MultiModuleRFProtocols type);
|
||||
@@ -894,32 +898,26 @@ class ModuleData {
|
||||
unsigned int failsafeMode;
|
||||
int failsafeChannels[C9X_NUM_CHNOUT];
|
||||
|
||||
// By pure coincidence the struct are unions with the same datatype in Companion
|
||||
// and the firmware itself. If this changes the multi struct needs it own logic in the eeprom interface
|
||||
union {
|
||||
struct {
|
||||
|
||||
struct {
|
||||
int delay;
|
||||
bool pulsePol; // false = positive
|
||||
bool outputType; // false = open drain, true = push pull
|
||||
int frameLength;
|
||||
} ppm;
|
||||
struct {
|
||||
int rfProtocol;
|
||||
bool autoBindMode;
|
||||
bool lowPowerMode;
|
||||
int optionValue;
|
||||
} multi;
|
||||
};
|
||||
} ppm;
|
||||
|
||||
struct {
|
||||
unsigned int rfProtocol;
|
||||
bool autoBindMode;
|
||||
bool lowPowerMode;
|
||||
bool customProto;
|
||||
int optionValue;
|
||||
} multi;
|
||||
|
||||
|
||||
// Currently the Eeprom read/write code does not work with unions
|
||||
// define a hack for the multi rf Protocol to get the real numbers here
|
||||
// (reverse the int => ms logic of the ppm delay)
|
||||
int getMultiRfProtocol () { return (multi.rfProtocol - 300) / 50; }
|
||||
void setMultiRfProtocol (int val) { multi.rfProtocol = 300 + 50 * val; }
|
||||
|
||||
void clear() { memset(this, 0, sizeof(ModuleData)); }
|
||||
QString polarityToString() const { return ppm.pulsePol ? QObject::tr("Positive") : QObject::tr("Negative"); } // TODO ModelPrinter
|
||||
|
||||
};
|
||||
|
||||
#define C9X_MAX_SCRIPTS 7
|
||||
|
||||
@@ -3290,7 +3290,17 @@ void OpenTxModelData::beforeExport()
|
||||
subprotocols[module] = modelData.moduleData[module].protocol - PULSES_PXX_XJT_X16;
|
||||
else if (modelData.moduleData[module].protocol >= PULSES_LP45 && modelData.moduleData[module].protocol <= PULSES_DSMX)
|
||||
subprotocols[module] = modelData.moduleData[module].protocol - PULSES_LP45;
|
||||
else
|
||||
else if (modelData.moduleData[module].protocol == PULSES_MULTIMODULE) {
|
||||
// copy multi settings to ppm settings to get them written to the eeprom
|
||||
// (reverse the int => ms logic of the ppm delay) since only ppm is written
|
||||
|
||||
subprotocols[module] = modelData.moduleData[module].multi.rfProtocol & (0x1f);
|
||||
int multiByte = ((modelData.moduleData[module].multi.rfProtocol >> 4) & 0x03) | (modelData.moduleData[module].multi.customProto << 7);
|
||||
modelData.moduleData[module].ppm.delay = 300 + 50 * multiByte;
|
||||
modelData.moduleData[module].ppm.frameLength = modelData.moduleData[module].multi.optionValue;
|
||||
modelData.moduleData[module].ppm.outputType = modelData.moduleData[module].multi.lowPowerMode;
|
||||
modelData.moduleData[module].ppm.pulsePol = modelData.moduleData[module].multi.autoBindMode;
|
||||
} else
|
||||
subprotocols[module] = (module==0 ? -1 : 0);
|
||||
}
|
||||
}
|
||||
@@ -3324,6 +3334,15 @@ void OpenTxModelData::afterImport()
|
||||
modelData.moduleData[module].protocol += subprotocols[module];
|
||||
else
|
||||
modelData.moduleData[module].protocol = PULSES_OFF;
|
||||
} else if (modelData.moduleData[module].protocol == PULSES_MULTIMODULE) {
|
||||
// Copy data from ppm struct to multi struct
|
||||
unsigned int multiByte = (unsigned int)((modelData.moduleData[module].ppm.delay - 300) / 50);
|
||||
modelData.moduleData[module].multi.rfProtocol = subprotocols[module] | ((multiByte & 0x3) << 4);
|
||||
|
||||
modelData.moduleData[module].multi.customProto = (multiByte & 0x80) == 0x80;
|
||||
modelData.moduleData[module].multi.optionValue = modelData.moduleData[module].ppm.frameLength;
|
||||
modelData.moduleData[module].multi.lowPowerMode = modelData.moduleData[module].ppm.outputType;
|
||||
modelData.moduleData[module].multi.autoBindMode = modelData.moduleData[module].ppm.pulsePol;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ ModulePanel::ModulePanel(QWidget *parent, ModelData & model, ModuleData & module
|
||||
|
||||
for (int i=0; i<=MM_RF_PROTO_LAST; i++)
|
||||
{
|
||||
ui->multiProtocol->addItem(ModelPrinter::printMultiRfProtocol(i), (QVariant) i);
|
||||
ui->multiProtocol->addItem(ModelPrinter::printMultiRfProtocol(i, false), (QVariant) i);
|
||||
}
|
||||
|
||||
if (firmware->getCapability(HasFailsafe)) {
|
||||
@@ -318,19 +318,21 @@ void ModulePanel::update()
|
||||
// Multi settings fields
|
||||
ui->label_multiProtocol->setVisible(mask & MASK_MULTIMODULE);
|
||||
ui->multiProtocol->setVisible(mask & MASK_MULTIMODULE);
|
||||
ui->multiProtocol->setCurrentIndex(module.getMultiRfProtocol());
|
||||
ui->multiProtocol->setCurrentIndex(module.multi.rfProtocol);
|
||||
ui->label_multiSubType->setVisible(mask & MASK_MULTIMODULE);
|
||||
ui->multiSubType->setVisible(mask & MASK_MULTIMODULE);
|
||||
|
||||
if (mask & MASK_MULTIMODULE) {
|
||||
int numEntries = getNumSubtypes(static_cast<MultiModuleRFProtocols>(module.getMultiRfProtocol()));
|
||||
int numEntries = getNumSubtypes(static_cast<MultiModuleRFProtocols>(module.multi.rfProtocol));
|
||||
if (module.multi.customProto)
|
||||
numEntries=8;
|
||||
// Removes extra items
|
||||
ui->multiSubType->setMaxCount(numEntries);
|
||||
for (int i=0; i < numEntries; i++) {
|
||||
if (i < ui->multiSubType->count())
|
||||
ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.getMultiRfProtocol(), i));
|
||||
ui->multiSubType->setItemText(i, ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i));
|
||||
else
|
||||
ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.getMultiRfProtocol(), i), (QVariant) i);
|
||||
ui->multiSubType->addItem(ModelPrinter::printMultiSubType(module.multi.rfProtocol, module.multi.customProto, i), (QVariant) i);
|
||||
}
|
||||
}
|
||||
ui->multiSubType->setCurrentIndex(module.subType);
|
||||
@@ -474,8 +476,10 @@ void ModulePanel::on_multiProtocol_currentIndexChanged(int index)
|
||||
{
|
||||
if (!lock) {
|
||||
lock=true;
|
||||
module.setMultiRfProtocol(index);
|
||||
module.multi.rfProtocol = index;
|
||||
unsigned int maxSubTypes = getNumSubtypes(static_cast<MultiModuleRFProtocols>(index));
|
||||
if (module.multi.customProto)
|
||||
maxSubTypes=8;
|
||||
module.subType = std::min(module.subType, maxSubTypes -1);
|
||||
update();
|
||||
emit modified();
|
||||
|
||||
@@ -105,36 +105,37 @@ QString ModelPrinter::printModuleProtocol(unsigned int protocol)
|
||||
return CHECK_IN_ARRAY(strings, protocol);
|
||||
}
|
||||
|
||||
QString ModelPrinter::printMultiRfProtocol(int rfProtocol)
|
||||
QString ModelPrinter::printMultiRfProtocol(int rfProtocol, bool custom)
|
||||
{
|
||||
static const char *strings[] = {
|
||||
"FlySky", "Hubsan", "FrSky", "Hisky", "V2x2", "DSM", "Devo", "YD717", "KN", "SymaX", "SLT", "CX10", "CG023",
|
||||
"Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "Custom"
|
||||
"Bayang", "ESky", "MT99XX", "MJXQ", "Shenqi", "FY326", "SFHSS", "J6 PRO","FQ777","Assan","Hontai","OLRS","Custom"
|
||||
};
|
||||
if (rfProtocol > MM_RF_PROTO_CUSTOM)
|
||||
return "Custom - proto " + QString::number(rfProtocol & 0x1f);
|
||||
if (custom)
|
||||
return "Custom - proto " + QString::number(rfProtocol);
|
||||
else
|
||||
return CHECK_IN_ARRAY(strings, rfProtocol);
|
||||
}
|
||||
|
||||
QString ModelPrinter::printMultiSubType(int rfProtocol, int subType) {
|
||||
QString ModelPrinter::printMultiSubType(int rfProtocol, bool custom, int subType) {
|
||||
/* custom protocols */
|
||||
static const char *custom_subtype_strings[] = {"Subtype 0","Subtype 1","Subtype 2","Subtype 3","Subtype 4","Subtype 5","Subtype 6","Subtype 7"};
|
||||
static const char *flysky_strings[] = {"Standard","V9x9","V6x6","V912"};
|
||||
static const char *frsky_strings[] = {"D16", "D8", "D16 8ch", "LR12"};
|
||||
static const char *frsky_strings[] = {"D16", "D8", "D16 8ch", "V8"};
|
||||
static const char *hisky_strings[] = { "HiSky", "HK310" };
|
||||
static const char *dsm2_strings[] = {"DSM2", "DSMX"};
|
||||
static const char *dsm2_strings[] = {"DSM2 22ms", "DSM2 11ms", "DSMX 22ms", "DSMX 11ms"};
|
||||
static const char *yd717_strings[] = {"YD717", "Skywalker", "Syma X2", "XINXUN", "NIHUI"};
|
||||
static const char *symax_strings[] = {"Standard", "Syma X5C"};
|
||||
static const char *cx10_strings[] = {"Green", "Blue", "DM007", "Q282", "JC3015a", "JC3015b", "MK33041", "Q242"};
|
||||
static const char *cg023_strings[] = {"CG023", "YD829", "H3 3D"};
|
||||
static const char* kn_strings[] = {"WLtoys", "FeiLun"};
|
||||
static const char* mt99_strings[] = {"MT99","H7","YZ"};
|
||||
static const char* mjxq_strings[] = {"WLH08", "X600", "X800", "H26D", "E010"};
|
||||
static const char *kn_strings[] = {"WLtoys", "FeiLun"};
|
||||
static const char *mt99_strings[] = {"MT99","H7","YZ"};
|
||||
static const char *mjxq_strings[] = {"WLH08", "X600", "X800", "H26D", "E010"};
|
||||
static const char *hontai_strings[] = {"Standard","JJRC X1","X5C1 Clone"};
|
||||
|
||||
if (rfProtocol >= MM_RF_PROTO_CUSTOM) {
|
||||
if (custom)
|
||||
return CHECK_IN_ARRAY(custom_subtype_strings, subType);
|
||||
}
|
||||
|
||||
switch (rfProtocol) {
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
return CHECK_IN_ARRAY(flysky_strings, subType);
|
||||
@@ -158,6 +159,8 @@ QString ModelPrinter::printMultiSubType(int rfProtocol, int subType) {
|
||||
return CHECK_IN_ARRAY(mt99_strings, subType);
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
return CHECK_IN_ARRAY(mjxq_strings, subType);
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
return CHECK_IN_ARRAY(hontai_strings, subType);
|
||||
default:
|
||||
return "DEFAULT";
|
||||
}
|
||||
@@ -175,7 +178,7 @@ QString ModelPrinter::printModule(int idx) {
|
||||
result += " " + tr("Receiver number(%1)").arg(module.modelId);
|
||||
}
|
||||
if (module.protocol == PULSES_MULTIMODULE)
|
||||
result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol)).arg(printMultiSubType(module.multi.rfProtocol, module.subType)).arg(module.multi.optionValue);
|
||||
result += " " + tr("radio Protocol %1, subType %2, option value %3").arg(printMultiRfProtocol(module.multi.rfProtocol, module.multi.customProto)).arg(printMultiSubType(module.multi.rfProtocol, module.multi.customProto, module.subType)).arg(module.multi.optionValue);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,8 +38,8 @@ class ModelPrinter: public QObject
|
||||
QString printTrimIncrementMode();
|
||||
QString printThrottleTrimMode();
|
||||
static QString printModuleProtocol(unsigned int protocol);
|
||||
static QString printMultiRfProtocol(int rfProtocol);
|
||||
static QString printMultiSubType(int rfProtocol, int subType);
|
||||
static QString printMultiRfProtocol(int rfProtocol, bool custom);
|
||||
static QString printMultiSubType(int rfProtocol, bool custom, int subType);
|
||||
QString printFlightModeSwitch(int index);
|
||||
QString printFlightModeName(int index);
|
||||
QString printFlightModes(unsigned int flightModes);
|
||||
|
||||
+19
-1
@@ -644,6 +644,8 @@ PACK(struct TelemetrySensor {
|
||||
* Module structure
|
||||
*/
|
||||
|
||||
// Only used in case switch and if statements as "virtual" protocol
|
||||
#define MM_RF_CUSTOM_SELECTED 0xff
|
||||
PACK(struct ModuleData {
|
||||
uint8_t type:4;
|
||||
int8_t rfProtocol:4;
|
||||
@@ -661,7 +663,9 @@ PACK(struct ModuleData {
|
||||
int8_t frameLength;
|
||||
} ppm;
|
||||
NOBACKUP(struct {
|
||||
uint8_t rfProtocol:6; // can be changed to rfProtocol if rfProtocol gets more bits, currently 6 bits used
|
||||
uint8_t rfProtocolExtra:2;
|
||||
uint8_t spare:3;
|
||||
uint8_t customProto:1;
|
||||
uint8_t autoBindMode:1;
|
||||
uint8_t lowPowerMode:1;
|
||||
int8_t optionValue;
|
||||
@@ -673,6 +677,20 @@ PACK(struct ModuleData {
|
||||
uint8_t spare3;
|
||||
} pxx);
|
||||
};
|
||||
|
||||
// Helper functions to set both of the rfProto protocol at the same time
|
||||
NOBACKUP(inline uint8_t getMultiProtocol(bool returnCustom) {
|
||||
if (returnCustom && multi.customProto)
|
||||
return MM_RF_CUSTOM_SELECTED;
|
||||
return ((uint8_t) (rfProtocol & 0x0f)) + (multi.rfProtocolExtra << 4);
|
||||
})
|
||||
|
||||
NOBACKUP(inline void setMultiProtocol(uint8_t proto)
|
||||
{
|
||||
rfProtocol = (uint8_t) (proto & 0x0f);
|
||||
multi.rfProtocolExtra = (proto & 0x30) >> 4;
|
||||
})
|
||||
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
@@ -129,11 +129,8 @@ enum MenuModelSetupItems {
|
||||
#endif
|
||||
|
||||
#define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x))
|
||||
#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8)
|
||||
#define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1)
|
||||
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1)
|
||||
#define EXTERNAL_MODULE_BIND_ROWS() (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW
|
||||
|
||||
#if defined(PCBSKY9X) && defined(REVX)
|
||||
@@ -143,26 +140,6 @@ enum MenuModelSetupItems {
|
||||
#endif
|
||||
#define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0)
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM)
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW
|
||||
#else
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
|
||||
#endif
|
||||
#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x))
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ)
|
||||
#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1
|
||||
#define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW,
|
||||
#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t) 0 : HIDDEN_ROW
|
||||
#define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW,
|
||||
#else
|
||||
#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0
|
||||
#define MULTIMODULE_MODULE_ROWS
|
||||
#define MULTIMODULE_SUBTYPE_ROWS(x)
|
||||
#endif
|
||||
|
||||
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0
|
||||
|
||||
#define CURSOR_ON_CELL (true)
|
||||
@@ -602,8 +579,11 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM);
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0);
|
||||
else
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
}
|
||||
#endif
|
||||
if (attr && (editMode>0 || p1valdiff)) {
|
||||
@@ -621,19 +601,20 @@ void menuModelSetup(event_t event)
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
if (checkIncDec_Ret) {
|
||||
// When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST.
|
||||
// Reset to MM_RF_PROTO_LAST-1 in that case
|
||||
if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM);
|
||||
if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 6ch@22ms
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION;
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
|
||||
} else {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -653,8 +634,7 @@ void menuModelSetup(event_t event)
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_SUBTYPE:
|
||||
{
|
||||
lcdDrawTextAlignedLeft(y, STR_SUBTYPE);
|
||||
int8_t multi_rfProto = min<int8_t>(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM);
|
||||
switch (multi_rfProto) {
|
||||
switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0);
|
||||
break;
|
||||
@@ -665,7 +645,7 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType + 1, menuHorizontalPosition == 0 ? attr : 0);
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_YD717:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0);
|
||||
@@ -688,17 +668,19 @@ void menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition == 0 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2);
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_CUSTOM_SELECTED:
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 3 * FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), RIGHT | (menuHorizontalPosition == 0 ? attr : 0), 2);
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN + 5 * FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, RIGHT | (menuHorizontalPosition == 1 ? attr : 0), 2);
|
||||
break;
|
||||
}
|
||||
if (attr && (editMode > 0 || p1valdiff)) {
|
||||
switch (menuHorizontalPosition) {
|
||||
case 0:
|
||||
switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) {
|
||||
switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_HISKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
case MM_RF_PROTO_SYMAX:
|
||||
case MM_RF_PROTO_KN:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1);
|
||||
@@ -708,6 +690,7 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3);
|
||||
break;
|
||||
@@ -718,9 +701,9 @@ void menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_CX10:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
case MM_RF_CUSTOM_SELECTED:
|
||||
//custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL);
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
@@ -905,7 +888,7 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
|
||||
switch (g_model.moduleData[moduleIdx].multi.rfProtocol)
|
||||
switch (g_model.moduleData[moduleIdx].getMultiProtocol(true))
|
||||
{
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_SFHSS:
|
||||
@@ -914,18 +897,13 @@ void menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_HUBSAN:
|
||||
lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMFRAME, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event);
|
||||
break;
|
||||
default:
|
||||
lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION);
|
||||
break;
|
||||
}
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) {
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -934,7 +912,10 @@ void menuModelSetup(event_t event)
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event);
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
|
||||
break;
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER:
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
|
||||
|
||||
@@ -211,33 +211,14 @@ int getSwitchWarningsCount()
|
||||
#define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x))
|
||||
#endif
|
||||
#define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x))
|
||||
#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8)
|
||||
#define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW)
|
||||
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1)
|
||||
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1)
|
||||
#define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1)
|
||||
#define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS()))
|
||||
|
||||
#if defined MULTIMODULE
|
||||
#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM)
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW
|
||||
#else
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
|
||||
#endif
|
||||
|
||||
#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x))
|
||||
#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
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ)
|
||||
#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1
|
||||
#define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW,
|
||||
#else
|
||||
#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0
|
||||
#define MULTIMODULE_MODULE_ROWS
|
||||
#endif
|
||||
|
||||
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
|
||||
|
||||
#if TIMERS == 1
|
||||
@@ -714,11 +695,15 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM);
|
||||
// Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
|
||||
switch(multi_rfProto) {
|
||||
// Do not use MODEL_SETUP_3RD_COLUMN here since some the protocol string are so long that we cannot afford the 2 spaces (+6) here
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0);
|
||||
else
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+5*FW, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
|
||||
switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
@@ -729,7 +714,7 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0);
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_YD717:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+10*FW, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
@@ -752,8 +737,11 @@ void menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2);
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN+11*FW, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_CUSTOM_SELECTED:
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+14*FW, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition==2 ? attr : 0, 2);
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+16*FW, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2);
|
||||
break;
|
||||
}
|
||||
@@ -774,19 +762,20 @@ void menuModelSetup(event_t event)
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
if (checkIncDec_Ret) {
|
||||
// When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST.
|
||||
// Reset to MM_RF_PROTO_LAST-1 in that case
|
||||
if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM);
|
||||
if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 6ch@22ms
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION;
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
|
||||
} else {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -800,32 +789,34 @@ void menuModelSetup(event_t event)
|
||||
break;
|
||||
#if defined(MULTIMODULE)
|
||||
case 2:
|
||||
switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) {
|
||||
case MM_RF_PROTO_HISKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
case MM_RF_PROTO_SYMAX:
|
||||
case MM_RF_PROTO_KN:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1);
|
||||
break;
|
||||
case MM_RF_PROTO_CG023:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2);
|
||||
break;
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3);
|
||||
break;
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
case MM_RF_PROTO_YD717:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4);
|
||||
break;
|
||||
case MM_RF_PROTO_CX10:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
//custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL);
|
||||
break;
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL));
|
||||
break;
|
||||
} else {
|
||||
switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_HISKY:
|
||||
case MM_RF_PROTO_SYMAX:
|
||||
case MM_RF_PROTO_KN:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1);
|
||||
break;
|
||||
case MM_RF_PROTO_CG023:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2);
|
||||
break;
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3);
|
||||
break;
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
case MM_RF_PROTO_YD717:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4);
|
||||
break;
|
||||
case MM_RF_PROTO_CX10:
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
@@ -939,6 +930,12 @@ void menuModelSetup(event_t event)
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+xOffsetBind, y, STR_MODULE_BIND, l_posHorz==1 ? attr : 0);
|
||||
lcdDrawText(MODEL_SETUP_2ND_COLUMN+MODEL_SETUP_RANGE_OFS+xOffsetBind, y, STR_MODULE_RANGE, l_posHorz==2 ? attr : 0);
|
||||
uint8_t newFlag = 0;
|
||||
#if defined(MULTIMODULE)
|
||||
if (spektrumBindFinished) {
|
||||
spektrumBindFinished = false;
|
||||
s_editMode=0;
|
||||
}
|
||||
#endif
|
||||
if (attr && l_posHorz>0 && s_editMode>0) {
|
||||
if (l_posHorz == 1)
|
||||
newFlag = MODULE_BIND;
|
||||
@@ -947,6 +944,7 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
}
|
||||
moduleFlag[moduleIdx] = newFlag;
|
||||
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -985,7 +983,7 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
|
||||
switch (g_model.moduleData[moduleIdx].multi.rfProtocol)
|
||||
switch ( g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true))
|
||||
{
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_SFHSS:
|
||||
@@ -994,18 +992,13 @@ void menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_HUBSAN:
|
||||
lcdDrawTextAlignedLeft(y, STR_MULTI_VIDFREQ);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSMFRAME, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event);
|
||||
break;
|
||||
default:
|
||||
lcdDrawTextAlignedLeft(y, STR_MULTI_OPTION);
|
||||
break;
|
||||
}
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) {
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1013,7 +1006,10 @@ void menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_DSM_AUTODTECT, attr, event);
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_AUTOBIND, attr, event);
|
||||
break;
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER:
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.lowPowerMode, MODEL_SETUP_2ND_COLUMN, y, STR_MULTI_LOWPOWER, attr, event);
|
||||
|
||||
@@ -179,34 +179,16 @@ int getSwitchWarningsCount()
|
||||
}
|
||||
|
||||
#define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)x : HIDDEN_ROW)
|
||||
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8)
|
||||
#define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x))
|
||||
#define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x))
|
||||
#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
|
||||
#define INTERNAL_MODULE_MODE_ROWS (uint8_t)0
|
||||
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1)
|
||||
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1)
|
||||
#define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1)
|
||||
#define PORT_CHANNELS_ROWS(x) (x==INTERNAL_MODULE ? INTERNAL_MODULE_CHANNELS_ROWS : (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : TRAINER_CHANNELS_ROWS()))
|
||||
#if defined MULTIMODULE
|
||||
#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x >= MM_RF_PROTO_CUSTOM)
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW
|
||||
#else
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
|
||||
#endif
|
||||
|
||||
#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x))
|
||||
#define TIMER_ROWS(x) NAVIGATION_LINE_BY_LINE|1, 0, 0, 0, g_model.timers[x].countdownBeep != COUNTDOWN_SILENT ? (uint8_t)1 : (uint8_t)0
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ)
|
||||
#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.rfProtocol >= MM_RF_PROTO_CUSTOM ) ? (uint8_t) 3 : MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].multi.rfProtocol) ? (uint8_t)2 : (uint8_t)1
|
||||
#define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW,
|
||||
#else
|
||||
#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0
|
||||
#define MULTIMODULE_MODULE_ROWS
|
||||
#endif
|
||||
|
||||
#define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE)) ? (uint8_t)1 : IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? MULTIMODULE_MODE_ROWS(EXTERNAL_MODULE) : (uint8_t)0
|
||||
|
||||
@@ -646,10 +628,13 @@ bool menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, (menuHorizontalPosition==1 ? attr : 0));
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
uint8_t multi_rfProto = min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM);
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
int multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
lcdDrawText(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_CUSTOM, menuHorizontalPosition==1 ? attr : 0);
|
||||
else
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_3RD_COLUMN, y, STR_MULTI_PROTOCOLS, multi_rfProto, menuHorizontalPosition==1 ? attr : 0);
|
||||
|
||||
switch(multi_rfProto) {
|
||||
switch(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_FLYSKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
@@ -660,7 +645,7 @@ bool menuModelSetup(event_t event)
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_HISKY, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType+1, menuHorizontalPosition==2 ? attr : 0);
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_DSM, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_YD717:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_YD717, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
@@ -683,8 +668,11 @@ bool menuModelSetup(event_t event)
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_MJXQ, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, menuHorizontalPosition==2 ? attr : 0, 2);
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
lcdDrawTextAtIndex(MODEL_SETUP_4TH_COLUMN, y, STR_SUBTYPE_HONTAI, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==2 ? attr : 0);
|
||||
break;
|
||||
case MM_RF_CUSTOM_SELECTED:
|
||||
lcdDrawNumber(MODEL_SETUP_4TH_COLUMN, y, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), menuHorizontalPosition==2 ? attr : 0, 2);
|
||||
lcdDrawNumber(MODEL_SETUP_4TH_COLUMN + MODEL_SETUP_BIND_OFS, y, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==3 ? attr : 0, 2);
|
||||
break;
|
||||
}
|
||||
@@ -703,58 +691,64 @@ bool menuModelSetup(event_t event)
|
||||
case 1:
|
||||
if (IS_MODULE_DSM2(EXTERNAL_MODULE))
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.customProto == 1 ? MM_RF_PROTO_CUSTOM : g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false);
|
||||
CHECK_INCDEC_MODELVAR(event, multiRfProto, MM_RF_PROTO_FIRST, MM_RF_PROTO_LAST);
|
||||
if (checkIncDec_Ret) {
|
||||
// When in custom protocol mode the highest bit (0x20) is set to indicate the protocl we might be way above MM_RF_PROTO_LAST.
|
||||
// Reset to MM_RF_PROTO_LAST-1 in that case
|
||||
if (checkIncDec_Ret == -1 && g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol >= MM_RF_PROTO_LAST) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = MM_RF_PROTO_LAST-1;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.customProto = (multiRfProto == MM_RF_PROTO_CUSTOM);
|
||||
if (!g_model.moduleData[EXTERNAL_MODULE].multi.customProto)
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 6ch@22ms
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = MM_RF_DSM2_22MS_6CH_OPTION;
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 1;
|
||||
} else {
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = 0;
|
||||
}
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.optionValue = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, RF_PROTO_X16, RF_PROTO_LAST);
|
||||
}
|
||||
if (checkIncDec_Ret) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].channelsStart = 0;
|
||||
g_model.moduleData[EXTERNAL_MODULE].channelsCount = DEFAULT_CHANNELS(EXTERNAL_MODULE);
|
||||
g_model.moduleData[EXTERNAL_MODULE].channelsCount = MAX_EXTERNAL_MODULE_CHANNELS();
|
||||
}
|
||||
break;
|
||||
#if defined(MULTIMODULE)
|
||||
case 2:
|
||||
switch (min(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol, (uint8_t) MM_RF_PROTO_CUSTOM)) {
|
||||
case MM_RF_PROTO_HISKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
case MM_RF_PROTO_SYMAX:
|
||||
case MM_RF_PROTO_KN:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1);
|
||||
break;
|
||||
case MM_RF_PROTO_CG023:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2);
|
||||
break;
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3);
|
||||
break;
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
case MM_RF_PROTO_YD717:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4);
|
||||
break;
|
||||
case MM_RF_PROTO_CX10:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7);
|
||||
break;
|
||||
case MM_RF_PROTO_CUSTOM:
|
||||
//custom protocol using the highest bit 0x20 to indicate that the protocol and the lower bits as the rfProtocol
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = 0x20 | checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol & 0x1f, 1, 31, EE_MODEL);
|
||||
break;
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.customProto) {
|
||||
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(checkIncDec(event, g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false), 0, 63, EE_MODEL));
|
||||
break;
|
||||
} else {
|
||||
switch (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true)) {
|
||||
case MM_RF_PROTO_HISKY:
|
||||
case MM_RF_PROTO_SYMAX:
|
||||
case MM_RF_PROTO_KN:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 1);
|
||||
break;
|
||||
case MM_RF_PROTO_CG023:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 2);
|
||||
break;
|
||||
case MM_RF_PROTO_FLYSKY:
|
||||
case MM_RF_PROTO_MT99XX:
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_DSM2:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 3);
|
||||
break;
|
||||
case MM_RF_PROTO_MJXQ:
|
||||
case MM_RF_PROTO_YD717:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 4);
|
||||
break;
|
||||
case MM_RF_PROTO_CX10:
|
||||
case MM_RF_PROTO_HONTAI:
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, 0, 7);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
@@ -898,34 +892,32 @@ bool menuModelSetup(event_t event)
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (IS_MODULE_MULTIMODULE(moduleIdx)) {
|
||||
switch (g_model.moduleData[moduleIdx].multi.rfProtocol)
|
||||
switch (g_model.moduleData[moduleIdx].getMultiProtocol(true))
|
||||
{
|
||||
case MM_RF_PROTO_FRSKY:
|
||||
case MM_RF_PROTO_SFHSS:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_RFTUNE);
|
||||
break;
|
||||
case MM_RF_PROTO_HUBSAN:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_VIDFREQ);
|
||||
break;
|
||||
case MM_RF_PROTO_DSM2:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSMFRAME);
|
||||
g_model.moduleData[moduleIdx].multi.optionValue = editChoice(MODEL_SETUP_2ND_COLUMN, y, STR_OPTIONS_DSM, g_model.moduleData[moduleIdx].multi.optionValue, 0, 12, attr, event);
|
||||
break;
|
||||
default:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_OPTION);
|
||||
break;
|
||||
}
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MM_RF_PROTO_DSM2) {
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr)
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, g_model.moduleData[moduleIdx].multi.optionValue, LEFT | attr);
|
||||
if (attr)
|
||||
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].multi.optionValue, -128, 127);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_AUTOBIND:
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND);
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_DSM_AUTODTECT);
|
||||
else
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_MULTI_AUTOBIND);
|
||||
g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode = editCheckBox(g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode, MODEL_SETUP_2ND_COLUMN, y, attr, event);
|
||||
break;
|
||||
case ITEM_MODEL_EXTERNAL_MODULE_LOWPOWER:
|
||||
|
||||
@@ -109,4 +109,29 @@ void drawFatalErrorScreen(const char * message);
|
||||
void runFatalErrorScreen(const char * message);
|
||||
#endif
|
||||
|
||||
// model_setup Defines that are used in all uis in the same way
|
||||
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_CROSSFIRE(EXTERNAL_MODULE) || (IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MM_RF_PROTO_DSM2)) ? (uint8_t)0 : (uint8_t)1)
|
||||
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define MULTIMODULE_MODULE_ROWS IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW, IS_MODULE_MULTIMODULE(EXTERNAL_MODULE) ? (uint8_t) 0 : HIDDEN_ROW,
|
||||
#define MULTIMODULE_MODE_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 3 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t)2 : (uint8_t)1
|
||||
#define MULTIMODULE_RFPROTO_ROWS(x) (g_model.moduleData[x].multi.customProto) ? (uint8_t) 1 :MULTIMODULE_HAS_SUBTYPE(g_model.moduleData[x].getMultiProtocol(true)) ? (uint8_t) 0 : HIDDEN_ROW
|
||||
#define MULTIMODULE_SUBTYPE_ROWS(x) IS_MODULE_MULTIMODULE(x) ? MULTIMODULE_RFPROTO_ROWS(x) : HIDDEN_ROW,
|
||||
#define MULTIMODULE_HAS_SUBTYPE(x) (x == MM_RF_PROTO_FLYSKY || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_HISKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_YD717 || x == MM_RF_PROTO_KN || x == MM_RF_PROTO_SYMAX || x == MM_RF_PROTO_CX10 || x == MM_RF_PROTO_CG023 || x == MM_RF_PROTO_MT99XX || x == MM_RF_PROTO_MJXQ || x == MM_RF_PROTO_HONTAI || x == MM_RF_CUSTOM_SELECTED)
|
||||
#define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_SFHSS || x == MM_RF_CUSTOM_SELECTED)
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].getMultiProtocol(true)))) ? (uint8_t) 0: HIDDEN_ROW
|
||||
|
||||
#else
|
||||
#define MULTIMODULE_MODULE_ROWS
|
||||
#define MULTIMODULE_FAILSAFEROWS(x) HIDDEN_ROW
|
||||
#define MULTIMODULE_SUBTYPE_ROWS(x)
|
||||
#define MULTIMODULE_MODE_ROWS(x) (uint8_t)0
|
||||
#endif
|
||||
|
||||
#define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8)
|
||||
#define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
|
||||
#define FAILSAFE_ROWS(x) (IS_MODULE_XJT(x) && HAS_RF_PROTOCOL_FAILSAFE(g_model.moduleData[x].rfProtocol) ? (g_model.moduleData[x].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : MULTIMODULE_FAILSAFEROWS(x))
|
||||
|
||||
#endif // _GUI_COMMON_H_
|
||||
|
||||
+11
-4
@@ -498,8 +498,9 @@ enum RFProtocols {
|
||||
};
|
||||
|
||||
enum MultiModuleRFProtocols {
|
||||
MM_RF_PROTO_CUSTOM = -1,
|
||||
MM_RF_PROTO_FIRST = MM_RF_PROTO_CUSTOM,
|
||||
MM_RF_PROTO_FLYSKY=0,
|
||||
MM_RF_PROTO_FIRST=MM_RF_PROTO_FLYSKY,
|
||||
MM_RF_PROTO_HUBSAN,
|
||||
MM_RF_PROTO_FRSKY,
|
||||
MM_RF_PROTO_HISKY,
|
||||
@@ -522,11 +523,17 @@ enum MultiModuleRFProtocols {
|
||||
MM_RF_PROTO_J6PRO,
|
||||
MM_RF_PROTO_FQ777,
|
||||
MM_RF_PROTO_ASSAN,
|
||||
MM_RF_PROTO_CUSTOM,
|
||||
MM_RF_PROTO_LAST= MM_RF_PROTO_CUSTOM
|
||||
MM_RF_PROTO_HONTAI,
|
||||
MM_RF_PROTO_OLRS,
|
||||
MM_RF_PROTO_LAST= MM_RF_PROTO_OLRS
|
||||
};
|
||||
|
||||
#define MM_RF_DSM2_22MS_6CH_OPTION 2
|
||||
#define MM_RF_DSM2_SUBTYPE_DSM2_22 0
|
||||
#define MM_RF_DSM2_SUBTYPE_DSM2_11 1
|
||||
#define MM_RF_DSM2_SUBTYPE_DSMX_22 2
|
||||
#define MM_RF_DSM2_SUBTYPE_DSMX_11 3
|
||||
#define MM_RF_DSM2_SUBTYPE_AUTO 4
|
||||
|
||||
|
||||
#define MM_RF_FRSKY_SUBTYPE_D16 0
|
||||
#define MM_RF_FRSKY_SUBTYPE_D8 1
|
||||
|
||||
+9
-2
@@ -387,7 +387,7 @@ void memswap(void * a, void * b, uint8_t size);
|
||||
|
||||
#if defined(CPUARM)
|
||||
// Order is the same as in enum Protocols in myeeprom.h (none, ppm, xjt, dsm, crossfire, multi)
|
||||
static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 8 }; // relative to 8!
|
||||
static const int8_t maxChannelsModules[] = { 0, 8, 8, -2, 8, 4 }; // relative to 8!
|
||||
static const int8_t maxChannelsXJT[] = { 0, 8, 0, 4 }; // relative to 8!
|
||||
#define MAX_TRAINER_CHANNELS_M8() (MAX_TRAINER_CHANNELS-8)
|
||||
#endif
|
||||
@@ -423,7 +423,7 @@ void memswap(void * a, void * b, uint8_t size);
|
||||
#endif
|
||||
#define MAX_EXTERNAL_MODULE_CHANNELS() ((g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_XJT) ? maxChannelsXJT[1+g_model.moduleData[1].rfProtocol] : maxChannelsModules[g_model.moduleData[EXTERNAL_MODULE].type])
|
||||
#define MAX_CHANNELS(idx) (idx==INTERNAL_MODULE ? MAX_INTERNAL_MODULE_CHANNELS() : (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8()))
|
||||
#define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || IS_MODULE_MULTIMODULE(idx)) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount))
|
||||
#define NUM_CHANNELS(idx) ((IS_MODULE_CROSSFIRE(idx) || (IS_MODULE_MULTIMODULE(idx) && (g_model.moduleData[idx].getMultiProtocol(true) != MM_RF_PROTO_DSM2))) ? CROSSFIRE_CHANNELS_COUNT : (8+g_model.moduleData[idx].channelsCount))
|
||||
#elif defined(PCBSKY9X) && !defined(REVA)
|
||||
#define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || idx==EXTRA_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM))
|
||||
#define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT)
|
||||
@@ -432,6 +432,7 @@ void memswap(void * a, void * b, uint8_t size);
|
||||
#define MAX_EXTRA_MODULE_CHANNELS() (8) // Only PPM (16ch PPM)
|
||||
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : (idx==EXTRA_MODULE ? MAX_EXTRA_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8()))
|
||||
#define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount)
|
||||
#define IS_MODULE_CROSSFIRE(idx) (false)
|
||||
#else
|
||||
#define IS_MODULE_PPM(idx) (idx==TRAINER_MODULE || (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_PPM))
|
||||
#define IS_MODULE_XJT(idx) (idx==EXTERNAL_MODULE && g_model.moduleData[EXTERNAL_MODULE].type==MODULE_TYPE_XJT)
|
||||
@@ -440,7 +441,13 @@ void memswap(void * a, void * b, uint8_t size);
|
||||
#define MAX_CHANNELS(idx) (idx==EXTERNAL_MODULE ? MAX_EXTERNAL_MODULE_CHANNELS() : MAX_TRAINER_CHANNELS_M8())
|
||||
#define NUM_CHANNELS(idx) (8+g_model.moduleData[idx].channelsCount)
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
#define IS_MULTIMODULE_DSM(idx) (IS_MODULE_MULTIMODULE(idx) && g_model.moduleData[idx].getMultiProtocol(true) == MM_RF_PROTO_DSM2)
|
||||
#define DEFAULT_CHANNELS(idx) (IS_MODULE_PPM(idx) ? 0 : IS_MULTIMODULE_DSM(idx) ? -1 : MAX_CHANNELS(idx))
|
||||
#else
|
||||
#define DEFAULT_CHANNELS(idx) (IS_MODULE_PPM(idx) ? 0 : MAX_CHANNELS(idx))
|
||||
#endif
|
||||
|
||||
#if defined(CPUARM)
|
||||
#define MASK_CFN_TYPE uint64_t // current max = 64 function switches
|
||||
|
||||
@@ -111,13 +111,13 @@ void setupPulsesMultimodule(uint8_t port)
|
||||
|
||||
modulePulsesData[EXTERNAL_MODULE].dsm2.ptr = modulePulsesData[EXTERNAL_MODULE].dsm2.pulses;
|
||||
|
||||
// header, byte 0, always 0x55
|
||||
sendByteMulti(0x55);
|
||||
|
||||
// byte 1+2, protocol information
|
||||
|
||||
int type = g_model.moduleData[port].multi.rfProtocol + 1;
|
||||
// Our enumeration starts at 0
|
||||
int type = g_model.moduleData[port].getMultiProtocol(false) + 1;
|
||||
int subtype = g_model.moduleData[port].subType;
|
||||
int8_t optionValue = g_model.moduleData[port].multi.optionValue;
|
||||
|
||||
uint8_t protoByte = 0;
|
||||
if (moduleFlag[port] == MODULE_BIND)
|
||||
@@ -126,6 +126,17 @@ void setupPulsesMultimodule(uint8_t port)
|
||||
protoByte |= MULTI_SEND_RANGECHECK;
|
||||
|
||||
// rfProtocol
|
||||
if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_DSM2){
|
||||
|
||||
// Autobinding should always be done in DSMX 11ms
|
||||
if(g_model.moduleData[port].multi.autoBindMode && moduleFlag[port] == MODULE_BIND)
|
||||
subtype = MM_RF_DSM2_SUBTYPE_AUTO;
|
||||
|
||||
// Multi module in DSM mode wants the number of channels to be used as option value
|
||||
optionValue = NUM_CHANNELS(EXTERNAL_MODULE);
|
||||
|
||||
}
|
||||
|
||||
// 15 for Multimodule is FrskyX or D16 which we map as a subprotocol of 3 (FrSky)
|
||||
// all protos > frskyx are therefore also off by one
|
||||
if (type >= 15)
|
||||
@@ -135,7 +146,7 @@ void setupPulsesMultimodule(uint8_t port)
|
||||
if (type >= 23)
|
||||
type = type + 1;
|
||||
|
||||
if (g_model.moduleData[port].multi.rfProtocol == MM_RF_PROTO_FRSKY) {
|
||||
if (g_model.moduleData[port].getMultiProtocol(true) == MM_RF_PROTO_FRSKY) {
|
||||
if(subtype == MM_RF_FRSKY_SUBTYPE_D8) {
|
||||
//D8
|
||||
type = 3;
|
||||
@@ -153,24 +164,28 @@ void setupPulsesMultimodule(uint8_t port)
|
||||
}
|
||||
}
|
||||
|
||||
if (g_model.moduleData[port].multi.rfProtocol >= MM_RF_PROTO_CUSTOM)
|
||||
type = g_model.moduleData[port].multi.rfProtocol & 0x1f;
|
||||
// header, byte 0, 0x55 for proto 0-31 0x54 for 32-63
|
||||
if (type <= 31)
|
||||
sendByteMulti(0x55);
|
||||
else
|
||||
sendByteMulti(0x54);
|
||||
|
||||
|
||||
// protocol byte
|
||||
protoByte |= (type & 0x1f);
|
||||
if(g_model.moduleData[port].getMultiProtocol(true) != MM_RF_PROTO_DSM2)
|
||||
protoByte |= (g_model.moduleData[port].multi.autoBindMode << 6);
|
||||
|
||||
protoByte |= (type & 0x1f) | (g_model.moduleData[port].multi.autoBindMode << 6);
|
||||
sendByteMulti(protoByte);
|
||||
|
||||
|
||||
// power always set to high (0 << 7)
|
||||
// byte 2, subtype, powermode, model id
|
||||
sendByteMulti((g_model.header.modelId[port] & 0x0f)
|
||||
| ((subtype & 0x7) << 4)
|
||||
| (g_model.moduleData[port].multi.lowPowerMode << 7)
|
||||
);
|
||||
|
||||
|
||||
|
||||
//TODO: option_protocol, use same default as multi module
|
||||
// byte 3
|
||||
sendByteMulti(g_model.moduleData[port].multi.optionValue);
|
||||
sendByteMulti(optionValue);
|
||||
|
||||
uint32_t bits = 0;
|
||||
uint8_t bitsavailable = 0;
|
||||
|
||||
@@ -40,7 +40,9 @@
|
||||
*/
|
||||
|
||||
#define I2C_PSEUDO_TX 0xf0
|
||||
|
||||
#define SPEKTRUM_TELEMETRY_LENGTH 18
|
||||
#define DSM_BIND_PACKET_LENGTH 12
|
||||
|
||||
#define I2C_HIGH_CURRENT 0x03
|
||||
#define I2C_GPS 0x17
|
||||
@@ -190,6 +192,7 @@ const SpektrumSensor spektrumSensors[] = {
|
||||
{I2C_QOS, 12, uint16, ZSTR_A2, UNIT_VOLTS, 2},
|
||||
|
||||
{I2C_PSEUDO_TX, 0, uint8, ZSTR_TX_RSSI, UNIT_RAW, 0},
|
||||
{I2C_PSEUDO_TX, 4, uint32, ZSTR_BIND, UNIT_RAW, 0},
|
||||
{0, 0, int16, NULL, UNIT_RAW, 0} //sentinel
|
||||
};
|
||||
|
||||
@@ -211,9 +214,9 @@ static int32_t bcdToInt32(uint32_t bcd)
|
||||
}
|
||||
|
||||
// Spektrum uses Big Endian data types
|
||||
static int32_t spektrumGetValue(uint8_t *packet, int startByte, SpektrumDataType type)
|
||||
static int32_t spektrumGetValue(const uint8_t *packet, int startByte, SpektrumDataType type)
|
||||
{
|
||||
uint8_t * data = packet + startByte;
|
||||
const uint8_t * data = packet + startByte;
|
||||
switch (type) {
|
||||
case uint8:
|
||||
return *((uint8_t *) (data));
|
||||
@@ -254,9 +257,10 @@ bool isSpektrumValidValue(int32_t value, const SpektrumDataType type)
|
||||
}
|
||||
}
|
||||
|
||||
void processSpektrumPacket(uint8_t *packet)
|
||||
bool spektrumBindFinished = 0;
|
||||
void processSpektrumPacket(const uint8_t *packet)
|
||||
{
|
||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 1, 0, 0, packet[1], UNIT_RAW, 0);
|
||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0);
|
||||
// highest bit indicates that TM1100 is in use, ignore it
|
||||
uint8_t i2cAddress = (packet[2] & 0x7f);
|
||||
uint8_t instance = packet[3];
|
||||
@@ -318,6 +322,65 @@ void processSpektrumPacket(uint8_t *packet)
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the DSM2 bind reponse, Fields are as per http://www.rcgroups.com/forums/showpost.php?p=35692146&postcount=5191
|
||||
// "I" here means the multi module
|
||||
|
||||
/*
|
||||
0 0xAA -> telemetry start
|
||||
1 0x80 -> bind packet
|
||||
2-5 4 bytes -> Cyrf ID of the TX xor 0xFF but you don't care as I've checked it already...
|
||||
6 1 byte -> RX version but you don't care...
|
||||
7 1 byte -> number of channels, example 0x06=6 channels
|
||||
8 1 byte -> max DSM type allowed:
|
||||
0x01 => 22ms 1024 DSM2 1 packet => number of channels is <8 and no telemetry
|
||||
0x02 => 22ms 1024 DSM2 2 packets => either a number of channel >7 or telemetry enable RX
|
||||
0x12 => 11ms 2048 DSM2 2 packets => can be any number of channels with/without telemetry -> this mode might be supported following Mike's trials, note the channels should be duplicated between the packets which is not the case today
|
||||
0xa2 => 22ms 2048 DSMX 1 packet => number of channels is <8 and no telemetry
|
||||
0xb2 => 11ms 2048 DSMX => can be any number of channels with/without telemetry -> this mode is only half supported since the channels should be duplicated between the packets which is not the case but might be supported following Mike's trials
|
||||
9 0x00: not sure of the use of this byte since I've always seen it at 0...
|
||||
10 2 bytes CRC but you don't care as I've checked it already...
|
||||
|
||||
Examples: DSM #Chan RXver
|
||||
Inductrix 0xa2 07 1
|
||||
LemonRX+Sat+tele 0xb2 07 1
|
||||
|
||||
*/
|
||||
void processDSMBindPacket(const uint8_t *packet)
|
||||
{
|
||||
uint32_t debugval;
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2
|
||||
&& g_model.moduleData[EXTERNAL_MODULE].multi.autoBindMode) {
|
||||
|
||||
int channels = packet[7];
|
||||
// Only sets channel etc when in DSM multi mode
|
||||
g_model.moduleData[EXTERNAL_MODULE].channelsCount = channels - 8;
|
||||
|
||||
// bool use11ms = (packet[8] & 0x10) ;
|
||||
if (packet[8] >= 0xb2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX_11;
|
||||
else if (packet[8] >= 0xa2)
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSMX_22;
|
||||
else if (packet[8] >= 0x12)
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2_11;
|
||||
else
|
||||
g_model.moduleData[EXTERNAL_MODULE].subType = MM_RF_DSM2_SUBTYPE_DSM2_22;
|
||||
|
||||
storageDirty(EE_MODEL);
|
||||
|
||||
}
|
||||
|
||||
debugval = packet[9] << 24 | packet[8] << 16 | packet[7] << 8 | packet[6];
|
||||
|
||||
/* log the bind packet as telemetry for quick debugging */
|
||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0);
|
||||
|
||||
/* Finally stop binding as the rx just told us that it is bound */
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MM_RF_PROTO_DSM2
|
||||
&& moduleFlag[EXTERNAL_MODULE] == MODULE_BIND) {
|
||||
spektrumBindFinished=true;
|
||||
}
|
||||
}
|
||||
|
||||
void processSpektrumTelemetryData(uint8_t data)
|
||||
{
|
||||
if (telemetryRxBufferCount == 0 && data != 0xAA) {
|
||||
@@ -333,6 +396,13 @@ void processSpektrumTelemetryData(uint8_t data)
|
||||
telemetryRxBufferCount = 0;
|
||||
}
|
||||
|
||||
if (telemetryRxBuffer[1] == 0x80 && telemetryRxBufferCount >= DSM_BIND_PACKET_LENGTH) {
|
||||
processDSMBindPacket(telemetryRxBuffer);
|
||||
telemetryRxBufferCount = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (telemetryRxBufferCount >= SPEKTRUM_TELEMETRY_LENGTH) {
|
||||
debugPrintf("[SPK] Packet 0x%02X rssi 0x%02X: ic2 0x%02x, %02x: ",
|
||||
telemetryRxBuffer[0], telemetryRxBuffer[1], telemetryRxBuffer[2], telemetryRxBuffer[3]);
|
||||
|
||||
@@ -24,4 +24,5 @@
|
||||
void processSpektrumTelemetryData(uint8_t data);
|
||||
void spektrumSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance);
|
||||
|
||||
extern bool spektrumBindFinished;
|
||||
#endif
|
||||
|
||||
@@ -147,9 +147,9 @@ inline uint8_t modelTelemetryProtocol()
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
if (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) {
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_DSM2)
|
||||
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_DSM2)
|
||||
return PROTOCOL_SPEKTRUM;
|
||||
else if ((g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MM_RF_PROTO_FRSKY) &&
|
||||
else if ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FRSKY) &&
|
||||
(g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH))
|
||||
return PROTOCOL_FRSKY_SPORT;
|
||||
else
|
||||
|
||||
@@ -115,6 +115,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
|
||||
ISTR(SUBTYPE_FLYSKY)
|
||||
ISTR(SUBTYPE_FRSKY)
|
||||
ISTR(SUBTYPE_HISKY)
|
||||
ISTR(SUBTYPE_DSM)
|
||||
ISTR(SUBTYPE_YD717)
|
||||
ISTR(SUBTYPE_SYMAX)
|
||||
ISTR(SUBTYPE_CX10)
|
||||
@@ -122,6 +123,7 @@ const pm_char STR_OPEN9X[] PROGMEM =
|
||||
ISTR(SUBTYPE_KN)
|
||||
ISTR(SUBTYPE_MT99)
|
||||
ISTR(SUBTYPE_MJXQ)
|
||||
ISTR(SUBTYPE_HONTAI)
|
||||
ISTR(OPTIONS_DSM)
|
||||
#endif
|
||||
ISTR(VOLTSRC)
|
||||
@@ -463,12 +465,13 @@ const pm_char STR_MONITOR_SCREENS[] PROGMEM = TR_MONITOR_SCREENS;
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
const pm_char STR_MULTI_CUSTOM[] PROGMEM = TR_MULTI_CUSTOM;
|
||||
const pm_char STR_MULTI_RFTUNE[] PROGMEM = TR_MULTI_RFTUNE;
|
||||
const pm_char STR_MULTI_VIDFREQ[] PROGMEM = TR_MULTI_VIDFREQ;
|
||||
const pm_char STR_MULTI_OPTION[] PROGMEM = TR_MULTI_OPTION;
|
||||
const pm_char STR_MULTI_AUTOBIND[] PROGMEM = TR_MULTI_AUTOBIND;
|
||||
const pm_char STR_MULTI_DSM_AUTODTECT[] PROGMEM = TR_MULTI_DSM_AUTODTECT;
|
||||
const pm_char STR_MULTI_LOWPOWER[] PROGMEM = TR_MULTI_LOWPOWER;
|
||||
const pm_char STR_MULTI_DSMFRAME[] PROGMEM = TR_MULTI_DSMFRAME;
|
||||
#if LCD_W < 212
|
||||
const pm_char STR_SUBTYPE[] PROGMEM = TR_SUBTYPE;
|
||||
#endif
|
||||
|
||||
@@ -216,14 +216,16 @@ extern const pm_char STR_OPEN9X[];
|
||||
#define OFS_SUBTYPE_FLYSKY (OFS_MULTI_PROTOCOLS + sizeof(TR_MULTI_PROTOCOLS))
|
||||
#define OFS_SUBTYPE_FRSKY (OFS_SUBTYPE_FLYSKY + sizeof(TR_SUBTYPE_FLYSKY))
|
||||
#define OFS_SUBTYPE_HISKY (OFS_SUBTYPE_FRSKY + sizeof(TR_SUBTYPE_FRSKY))
|
||||
#define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY))
|
||||
#define OFS_SUBTYPE_DSM (OFS_SUBTYPE_HISKY + sizeof(TR_SUBTYPE_HISKY))
|
||||
#define OFS_SUBTYPE_YD717 (OFS_SUBTYPE_DSM + sizeof(TR_SUBTYPE_DSM))
|
||||
#define OFS_SUBTYPE_SYMAX (OFS_SUBTYPE_YD717 + sizeof(TR_SUBTYPE_YD717))
|
||||
#define OFS_SUBTYPE_CX10 (OFS_SUBTYPE_SYMAX + sizeof(TR_SUBTYPE_SYMAX))
|
||||
#define OFS_SUBTYPE_CG023 (OFS_SUBTYPE_CX10 + sizeof(TR_SUBTYPE_CX10))
|
||||
#define OFS_SUBTYPE_KN (OFS_SUBTYPE_CG023 + sizeof(TR_SUBTYPE_CG023))
|
||||
#define OFS_SUBTYPE_MT99 (OFS_SUBTYPE_KN + sizeof(TR_SUBTYPE_KN))
|
||||
#define OFS_SUBTYPE_MJXQ (OFS_SUBTYPE_MT99 + sizeof(TR_SUBTYPE_MT99))
|
||||
#define OFS_OPTIONS_DSM (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ))
|
||||
#define OFS_SUBTYPE_HONTAI (OFS_SUBTYPE_MJXQ + sizeof(TR_SUBTYPE_MJXQ))
|
||||
#define OFS_OPTIONS_DSM (OFS_SUBTYPE_HONTAI + sizeof(TR_SUBTYPE_HONTAI))
|
||||
#define OFS_VOLTSRC (OFS_OPTIONS_DSM + sizeof(TR_OPTIONS_DSM))
|
||||
#else
|
||||
#define OFS_VOLTSRC (OFS_DSM_PROTOCOLS + sizeof(TR_DSM_PROTOCOLS))
|
||||
@@ -349,6 +351,7 @@ extern const pm_char STR_OPEN9X[];
|
||||
#define STR_SUBTYPE_FLYSKY (STR_OPEN9X + OFS_SUBTYPE_FLYSKY)
|
||||
#define STR_SUBTYPE_FRSKY (STR_OPEN9X + OFS_SUBTYPE_FRSKY)
|
||||
#define STR_SUBTYPE_HISKY (STR_OPEN9X + OFS_SUBTYPE_HISKY)
|
||||
#define STR_SUBTYPE_DSM (STR_OPEN9X + OFS_SUBTYPE_DSM)
|
||||
#define STR_SUBTYPE_YD717 (STR_OPEN9X + OFS_SUBTYPE_YD717)
|
||||
#define STR_SUBTYPE_SYMAX (STR_OPEN9X + OFS_SUBTYPE_SYMAX)
|
||||
#define STR_SUBTYPE_CX10 (STR_OPEN9X + OFS_SUBTYPE_CX10)
|
||||
@@ -356,6 +359,7 @@ extern const pm_char STR_OPEN9X[];
|
||||
#define STR_SUBTYPE_KN (STR_OPEN9X + OFS_SUBTYPE_KN)
|
||||
#define STR_SUBTYPE_MT99 (STR_OPEN9X + OFS_SUBTYPE_MT99)
|
||||
#define STR_SUBTYPE_MJXQ (STR_OPEN9X + OFS_SUBTYPE_MJXQ)
|
||||
#define STR_SUBTYPE_HONTAI (STR_OPEN9X + OFS_SUBTYPE_HONTAI)
|
||||
#define STR_OPTIONS_DSM (STR_OPEN9X + OFS_OPTIONS_DSM)
|
||||
#endif
|
||||
#define STR_CURVE_TYPES (STR_OPEN9X + OFS_CURVE_TYPES)
|
||||
@@ -593,12 +597,13 @@ extern const pm_char STR_FAS_OFFSET[];
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
extern const pm_char STR_MULTI_CUSTOM[];
|
||||
extern const pm_char STR_MULTI_OPTION[];
|
||||
extern const pm_char STR_MULTI_VIDFREQ[];
|
||||
extern const pm_char STR_MULTI_RFTUNE[];
|
||||
extern const pm_char STR_MULTI_AUTOBIND[];
|
||||
extern const pm_char STR_MULTI_DSM_AUTODTECT[];
|
||||
extern const pm_char STR_MULTI_LOWPOWER[];
|
||||
extern const pm_char STR_MULTI_DSMFRAME[];
|
||||
#if LCD_W < 212
|
||||
extern const pm_char STR_SUBTYPE[];
|
||||
#endif
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -887,9 +893,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "[Sync]"
|
||||
#define TR_LIMIT INDENT"Limit"
|
||||
@@ -1353,3 +1359,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -111,7 +111,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX" //LP45 =Low Power 4 und 5 Kanal
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -122,7 +124,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""SYMAX2\0""XINXUN\0""NIHUI\0 "
|
||||
@@ -145,6 +148,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -890,9 +896,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM Frm", INDENT "DSM Rahmenformat")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "Sync [MENU]"
|
||||
#define TR_LIMIT INDENT "Grenzen"
|
||||
@@ -1353,3 +1359,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -111,7 +111,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -122,7 +124,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -145,6 +148,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -856,9 +862,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "[Sync]"
|
||||
#define TR_LIMIT INDENT "Limit"
|
||||
@@ -1324,3 +1330,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -835,9 +841,9 @@
|
||||
#define TR_RECEIVER INDENT "Receiver"
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "Sync " TR_ENTER
|
||||
#define TR_LIMIT INDENT"Limite"
|
||||
@@ -1294,3 +1300,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -835,9 +841,9 @@
|
||||
#define TR_RECEIVER INDENT "Receiver"
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "[Sync]"
|
||||
#define TR_LIMIT INDENT"Limit"
|
||||
@@ -1288,3 +1294,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Perso\0"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Perso"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -867,9 +873,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE INDENT "Ajustement fréq."
|
||||
#define TR_MULTI_VIDFREQ INDENT "Fréquence vidéo"
|
||||
#define TR_MULTI_DSMFRAME INDENT "Format trame DSM"
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option perso")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Bind automatique"
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR( INDENT "low power", INDENT "Mode basse puiss.")
|
||||
#define TR_SYNCMENU "Sync [MENU]"
|
||||
#define TR_LIMIT INDENT "Limite"
|
||||
@@ -1326,3 +1332,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -870,9 +876,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "[Sync]"
|
||||
#define TR_LIMIT INDENT "Limiti"
|
||||
@@ -1330,3 +1336,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -112,7 +112,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -123,7 +125,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -146,6 +149,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -864,9 +870,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "Sync [MENU]"
|
||||
#define TR_LIMIT INDENT "Grenzen"
|
||||
@@ -1334,3 +1340,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -108,7 +108,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -119,7 +121,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -142,6 +145,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -872,9 +878,9 @@
|
||||
#endif
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_SYNCMENU "[Synch]"
|
||||
#define TR_LIMIT INDENT "Limit"
|
||||
@@ -1332,3 +1338,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
@@ -119,7 +121,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -142,6 +145,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -831,9 +837,9 @@
|
||||
#define TR_SYNCMENU "Sync [MENU]"
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_LIMIT INDENT"Limite"
|
||||
#define TR_MINRSSI "Min Rssi"
|
||||
@@ -1289,3 +1295,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
@@ -107,7 +107,9 @@
|
||||
#define TR_DSM_PROTOCOLS "LP45""DSM2""DSMX"
|
||||
|
||||
#define LEN_MULTI_PROTOCOLS "\006"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM2\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Custom"
|
||||
#define TR_MULTI_PROTOCOLS "FlySky""Hubsan""FrSky\0""Hisky\0""V2x2\0 ""DSM\0 ""Devo\0 ""YD717\0""KN\0 ""SymaX\0""SLT\0 ""CX10\0 ""CG023\0""Bayang""ESky\0 ""MT99XX""MJXQ\0 ""Shenqi""FY326\0""SFHSS\0""J6 PRO""FQ777\0""Assan\0""Hontai""OLRS\0 "
|
||||
|
||||
#define TR_MULTI_CUSTOM "Custom"
|
||||
|
||||
#define LEN_SUBTYPE_FLYSKY "\004"
|
||||
#define TR_SUBTYPE_FLYSKY "Std\0""V9x9""V6x6""V912"
|
||||
@@ -118,7 +120,8 @@
|
||||
#define LEN_SUBTYPE_HISKY "\005"
|
||||
#define TR_SUBTYPE_HISKY "HiSky""HK310"
|
||||
|
||||
// SUBTYPE FOR DSMX use TR_DSM_PROTOCOLS with offset +1
|
||||
#define LEN_SUBTYPE_DSM "\006"
|
||||
#define TR_SUBTYPE_DSM "2 22ms""2 11ms""X 22ms""X 11ms"
|
||||
|
||||
#define LEN_SUBTYPE_YD717 "\007"
|
||||
#define TR_SUBTYPE_YD717 "YD717\0 ""SKYWLKR""Syma X2""XINXUN\0""NIHUI\0 "
|
||||
@@ -141,6 +144,9 @@
|
||||
#define LEN_SUBTYPE_MJXQ "\005"
|
||||
#define TR_SUBTYPE_MJXQ "WLH08""X600\0""X800\0""H26D\0""E010\0"
|
||||
|
||||
#define LEN_SUBTYPE_HONTAI "\007"
|
||||
#define TR_SUBTYPE_HONTAI "Std\0 ""JJRC X1""X5C1cln"
|
||||
|
||||
#define LEN_OPTIONS_DSM "\011"
|
||||
#define TR_OPTIONS_DSM "4ch 22ms\0""5ch 22ms\0""6ch 22ms\0""7ch 22ms\0""4ch 11ms\0""5ch 11ms\0""6ch 11ms\0""7ch 11ms\0""8ch 22ms\0""9ch 22ms\0""10ch 22ms""11ch 22ms""12ch 22ms"
|
||||
|
||||
@@ -884,9 +890,9 @@
|
||||
#define TR_SYNCMENU "Synk [MENU]"
|
||||
#define TR_MULTI_RFTUNE TR(INDENT "Freq tune",INDENT "RF Freq. fine tune")
|
||||
#define TR_MULTI_VIDFREQ TR(INDENT "Vid. freq.", INDENT "Video frequency")
|
||||
#define TR_MULTI_DSMFRAME TR(INDENT "DSM frame", INDENT "DSM frame format")
|
||||
#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Option value")
|
||||
#define TR_MULTI_AUTOBIND INDENT "Autobind"
|
||||
#define TR_MULTI_AUTOBIND TR(INDENT "Autobind",INDENT "Bind on powerup")
|
||||
#define TR_MULTI_DSM_AUTODTECT TR(INDENT "Autodetect", INDENT "Autodetect format")
|
||||
#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode")
|
||||
#define TR_LIMIT INDENT "Nivå"
|
||||
#define TR_MINRSSI "Min Rssi"
|
||||
@@ -1348,3 +1354,4 @@
|
||||
#define ZSTR_QOS_R "FdeR"
|
||||
#define ZSTR_QOS_F "FLss"
|
||||
#define ZSTR_QOS_H "Hold"
|
||||
#define ZSTR_BIND "BIND"
|
||||
|
||||
Reference in New Issue
Block a user