Reorganize module type/subType/rfProtocol

This commit is contained in:
Raphael Coeffic
2022-03-24 10:40:17 +01:00
committed by Raphael Coeffic
parent 049f337665
commit 86d1ca4364
38 changed files with 163 additions and 275 deletions
+5 -21
View File
@@ -444,15 +444,12 @@ PACK(struct TrainerModuleData {
#define MM_RF_CUSTOM_SELECTED 0xff
#define MULTI_MAX_PROTOCOLS 127 // rfProtocol:4 + rfProtocolExtra:3
PACK(struct ModuleData {
uint8_t type:4 ENUM(ModuleType);
// TODO some refactoring is needed, rfProtocol is only used by DSM2 and MULTI, it could be merged with subType
int8_t rfProtocol:4 SKIP;
uint8_t type ENUM(ModuleType);
CUST_ATTR(subType,r_modSubtype,w_modSubtype);
uint8_t channelsStart;
int8_t channelsCount CUST(r_channelsCount,w_channelsCount); // 0=8 channels
uint8_t failsafeMode:4 ENUM(FailsafeModes); // only 3 bits used
uint8_t subType:3 SKIP;
uint8_t invertedSerial:1 SKIP; // telemetry serial inverted from standard
uint8_t subType:4 SKIP;
union {
uint8_t raw[PXX2_MAX_RECEIVERS_PER_MODULE * PXX2_LEN_RX_NAME + 1];
@@ -463,16 +460,15 @@ PACK(struct ModuleData {
int8_t frameLength;
} ppm);
NOBACKUP(struct {
uint8_t rfProtocolExtra:3 SKIP;
uint8_t rfProtocol SKIP;
uint8_t disableTelemetry:1;
uint8_t disableMapping:1;
uint8_t customProto:1 SKIP;
uint8_t autoBindMode:1;
uint8_t lowPowerMode:1;
int8_t optionValue;
uint8_t receiverTelemetryOff:1;
uint8_t receiverHigherChannels:1;
uint8_t spare:6 SKIP;
uint8_t spare:2 SKIP;
int8_t optionValue;
} multi);
NOBACKUP(struct {
uint8_t power:2; // 0=10 mW, 1=100 mW, 2=500 mW, 3=1W
@@ -538,18 +534,6 @@ PACK(struct ModuleData {
} crsf);
} NAME(mod) FUNC(select_mod_type);
// Helper functions to set both of the rfProto protocol at the same time
NOBACKUP(inline uint8_t getMultiProtocol() const
{
return ((uint8_t) (rfProtocol & 0x0F)) + (multi.rfProtocolExtra << 4);
})
NOBACKUP(inline void setMultiProtocol(uint8_t proto)
{
rfProtocol = (uint8_t) (proto & 0x0F);
multi.rfProtocolExtra = (proto & 0x70) >> 4;
})
NOBACKUP(inline uint8_t getChannelsCount() const
{
return channelsCount + 8;
+7 -7
View File
@@ -972,7 +972,7 @@ void menuModelSetup(event_t event)
else if (isModuleISRM(moduleIdx))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_ISRM_RF_PROTOCOLS, g_model.moduleData[INTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleDSM2(moduleIdx))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[moduleIdx].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[moduleIdx].subType, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleR9MNonAccess(moduleIdx))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[moduleIdx].subType, (menuHorizontalPosition==1 ? attr : 0));
else if (moduleIdx == INTERNAL_MODULE && isModuleCrossfire(INTERNAL_MODULE))
@@ -1022,7 +1022,7 @@ void menuModelSetup(event_t event)
g_model.moduleData[moduleIdx].subType = checkIncDec(event, g_model.moduleData[moduleIdx].subType, 0, MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16, EE_MODEL, isRfProtocolAvailable);
}
else if (isModuleDSM2(moduleIdx)) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[moduleIdx].subType, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
}
else if (isModuleR9MNonAccess(moduleIdx)) {
g_model.moduleData[moduleIdx].subType = checkIncDec(event,
@@ -1129,10 +1129,10 @@ void menuModelSetup(event_t event)
#endif
{
lcdDrawTextAlignedLeft(y, TR_TYPE);
int multi_rfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
int multi_rfProto = g_model.moduleData[moduleIdx].multi.rfProtocol;
lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, moduleIdx, multi_rfProto, attr);
if (attr) {
int multiRfProto = g_model.moduleData[moduleIdx].getMultiProtocol();
int multiRfProto = g_model.moduleData[moduleIdx].multi.rfProtocol;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
@@ -1153,7 +1153,7 @@ void menuModelSetup(event_t event)
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[moduleIdx].setMultiProtocol(multiRfProto);
g_model.moduleData[moduleIdx].multi.rfProtocol = multiRfProto;
g_model.moduleData[moduleIdx].subType = 0;
resetMultiProtocolsOptions(moduleIdx);
storageDirty(EE_MODEL);
@@ -1670,7 +1670,7 @@ void menuModelSetup(event_t event)
}
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
const uint8_t multi_proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
int8_t min, max;
getMultiOptionValues(multi_proto, min, max);
@@ -1824,7 +1824,7 @@ void menuModelSetup(event_t event)
#if defined(HARDWARE_EXTERNAL_MODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND:
#endif
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) {
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) {
int8_t value = (g_model.moduleData[moduleIdx].multi.optionValue & 0x02) >> 1;
lcdDrawText(INDENT_WIDTH, y, STR_MULTI_SERVOFREQ);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, value ? 11 : 22, attr);
+9 -9
View File
@@ -940,7 +940,7 @@ void menuModelSetup(event_t event)
if (isModuleXJT(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_XJT_ACCST_RF_PROTOCOLS, 1+g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleDSM2(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, menuHorizontalPosition==1 ? attr : 0);
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_DSM_PROTOCOLS, g_model.moduleData[EXTERNAL_MODULE].subType, menuHorizontalPosition==1 ? attr : 0);
else if (isModuleR9MNonAccess(EXTERNAL_MODULE))
lcdDrawTextAtIndex(lcdNextPos + 3, y, STR_R9M_REGION, g_model.moduleData[EXTERNAL_MODULE].subType, (menuHorizontalPosition==1 ? attr : 0));
#if defined(AFHDS3)
@@ -970,14 +970,14 @@ void menuModelSetup(event_t event)
case 1:
if (isModuleDSM2(EXTERNAL_MODULE)) {
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].rfProtocol, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
CHECK_INCDEC_MODELVAR(event, g_model.moduleData[EXTERNAL_MODULE].subType, DSM2_PROTO_LP45, DSM2_PROTO_DSMX);
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(EXTERNAL_MODULE)) {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol;
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
if (checkIncDec_Ret) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = multiRfProto;
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
resetMultiProtocolsOptions(EXTERNAL_MODULE);
}
@@ -1087,7 +1087,7 @@ void menuModelSetup(event_t event)
{
lcdDrawTextAlignedLeft(y, TR_TYPE);
uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
uint8_t multi_rfProto = g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol;
lcdDrawMultiProtocolString(MODEL_SETUP_2ND_COLUMN, y, EXTERNAL_MODULE, multi_rfProto, menuHorizontalPosition == 0 ? attr : 0);
if (MULTIMODULE_HAS_SUBTYPE(EXTERNAL_MODULE))
lcdDrawMultiSubProtocolString(MODEL_SETUP_3RD_COLUMN + 15, y, EXTERNAL_MODULE, g_model.moduleData[EXTERNAL_MODULE].subType,
@@ -1095,7 +1095,7 @@ void menuModelSetup(event_t event)
if (attr) {
switch (menuHorizontalPosition) {
case 0: {
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol();
int multiRfProto = g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol;
MultiModuleStatus &status = getMultiModuleStatus(EXTERNAL_MODULE);
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
@@ -1116,7 +1116,7 @@ void menuModelSetup(event_t event)
CHECK_INCDEC_MODELVAR_CHECK(event, multiRfProto, MODULE_SUBTYPE_MULTI_FIRST, MULTI_MAX_PROTOCOLS, isMultiProtocolSelectable);
}
if (checkIncDec_Ret) {
g_model.moduleData[EXTERNAL_MODULE].setMultiProtocol(multiRfProto);
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol = multiRfProto;
g_model.moduleData[EXTERNAL_MODULE].subType = 0;
resetMultiProtocolsOptions(EXTERNAL_MODULE);
storageDirty(EE_MODEL);
@@ -1468,7 +1468,7 @@ void menuModelSetup(event_t event)
}
int optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
const uint8_t multi_proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
int8_t min, max;
getMultiOptionValues(multi_proto, min, max);
@@ -1568,7 +1568,7 @@ void menuModelSetup(event_t event)
#if defined (MULTIMODULE)
case ITEM_MODEL_SETUP_EXTERNAL_MODULE_AUTOBIND:
if (g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) {
if (g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) {
int8_t value = (g_model.moduleData[EXTERNAL_MODULE].multi.optionValue & 0x02) >> 1;
lcdDrawText(INDENT_WIDTH, y, STR_MULTI_SERVOFREQ);
lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, value ? 11 : 22, attr);
+5 -5
View File
@@ -655,7 +655,7 @@ class ModuleWindow : public FormGroup {
} else if (isModuleDSM2(moduleIdx)) {
new Choice(this, grid.getFieldSlot(2, 1), STR_DSM_PROTOCOLS,
DSM2_PROTO_LP45, DSM2_PROTO_DSMX,
GET_SET_DEFAULT(g_model.moduleData[moduleIdx].rfProtocol));
GET_SET_DEFAULT(g_model.moduleData[moduleIdx].subType));
} else if (isModuleR9M(moduleIdx)) {
rfChoice =
new Choice(this, grid.getFieldSlot(2, 1), STR_R9M_REGION,
@@ -839,13 +839,13 @@ class ModuleWindow : public FormGroup {
int count =
LCD_W < LCD_H
? 1
: (g_model.moduleData[moduleIdx].multi.customProto ? 3 : 2);
: (/*g_model.moduleData[moduleIdx].multi.customProto ? 3 :*/ 2);
rfChoice = new MultiProtoChoice(
this, grid.getFieldSlot(count, 0), moduleIdx,
[=](int32_t newValue) {
g_model.moduleData[moduleIdx].setMultiProtocol(newValue);
g_model.moduleData[moduleIdx].multi.rfProtocol = newValue;
g_model.moduleData[moduleIdx].subType = 0;
resetMultiProtocolsOptions(moduleIdx);
@@ -865,7 +865,7 @@ class ModuleWindow : public FormGroup {
auto *rfProto =
MultiRfProtocols::instance(moduleIdx)->getProto(
g_model.moduleData[moduleIdx].getMultiProtocol());
g_model.moduleData[moduleIdx].multi.rfProtocol);
if (rfProto && !rfProto->subProtos.empty()) {
// Subtype (D16, DSMX,...)
@@ -900,7 +900,7 @@ class ModuleWindow : public FormGroup {
return std::string(msg);
}, COLOR_THEME_PRIMARY1);
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
const uint8_t multi_proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
if (rfProto) {
// Multi optional feature row
const char *title = rfProto->getOptionStr();
+2 -2
View File
@@ -85,7 +85,7 @@ MultiProtoChoice::MultiProtoChoice(FormGroup* parent, const rect_t& rect,
std::function<void()> updateForm) :
Choice(
parent, rect, 0, 0,
[=] { return g_model.moduleData[moduleIdx].getMultiProtocol(); },
[=] { return g_model.moduleData[moduleIdx].multi.rfProtocol; },
setValue),
moduleIdx(moduleIdx)
{
@@ -118,7 +118,7 @@ void MultiProtoChoice::openMenu()
addProto(p.proto, p.label.c_str());
});
int idx = protos->getIndex(g_model.moduleData[moduleIdx].getMultiProtocol());
int idx = protos->getIndex(g_model.moduleData[moduleIdx].multi.rfProtocol);
if (idx >= 0) menu->select(idx);
}
@@ -40,7 +40,7 @@ void lcdDrawMultiProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t
void lcdDrawMultiSubProtocolString(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t subType, LcdFlags flags)
{
MultiModuleStatus & status = getMultiModuleStatus(moduleIdx);
const mm_protocol_definition * pdef = getMultiProtocolDefinition(g_model.moduleData[moduleIdx].getMultiProtocol());
const mm_protocol_definition * pdef = getMultiProtocolDefinition(g_model.moduleData[moduleIdx].multi.rfProtocol);
if (status.protocolName[0] && status.isValid()) {
lcdDrawText(x, y, status.protocolSubName, flags);
+1 -1
View File
@@ -1163,7 +1163,7 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol)
#if defined(MULTIMODULE)
const char * getMultiOptionTitleStatic(uint8_t moduleIdx)
{
const uint8_t multi_proto = g_model.moduleData[moduleIdx].getMultiProtocol();
const uint8_t multi_proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
const mm_protocol_definition * pdef = getMultiProtocolDefinition(multi_proto);
return pdef->optionsstr;
}
+5 -5
View File
@@ -179,7 +179,7 @@ inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
else if (isModuleMultimodule(moduleIdx)) {
if (IS_RX_MULTI(moduleIdx))
return HIDDEN_ROW;
else if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2)
else if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
return 1;
else
return 0;
@@ -226,7 +226,7 @@ inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx)
if (!isModuleMultimodule(moduleIdx))
return HIDDEN_ROW;
uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol();
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
if (protocol < MODULE_SUBTYPE_MULTI_LAST) {
const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol);
if (pdef->disable_ch_mapping)
@@ -260,7 +260,7 @@ inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx)
return false;
}
if (g_model.moduleData[moduleIdx].getMultiProtocol() < MODULE_SUBTYPE_MULTI_LAST) {
if (g_model.moduleData[moduleIdx].multi.rfProtocol < MODULE_SUBTYPE_MULTI_LAST) {
return true;
}
@@ -275,7 +275,7 @@ inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx)
inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx)
{
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
int proto = g_model.moduleData[moduleIdx].getMultiProtocol();
int proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
if (proto == MODULE_SUBTYPE_MULTI_FRSKY) {
return true;
@@ -311,7 +311,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
if (!isModuleMultimodule(moduleIdx))
return false;
uint8_t protocol = g_model.moduleData[moduleIdx].getMultiProtocol();
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
if (status.isValid())
+2 -2
View File
@@ -157,7 +157,7 @@ static int luaModelGetModule(lua_State *L)
lua_pushtableinteger(L, "Type", module.type);
#if defined(MULTIMODULE)
if (module.type == MODULE_TYPE_MULTIMODULE) {
int protocol = g_model.moduleData[idx].getMultiProtocol() + 1;
int protocol = g_model.moduleData[idx].multi.rfProtocol + 1;
int subprotocol = g_model.moduleData[idx].subType;
convertEtxProtocolToMulti(&protocol, &subprotocol); // Special treatment for the FrSky entry...
lua_pushtableinteger(L, "protocol", protocol);
@@ -234,7 +234,7 @@ static int luaModelSetModule(lua_State *L)
#if defined(MULTIMODULE)
if (protocol > 0 && subprotocol >= 0) { // Both are needed to compute etx protocol
convertMultiProtocolToEtx(&protocol, &subprotocol);
g_model.moduleData[idx].setMultiProtocol(protocol - 1);
g_model.moduleData[idx].multi.rfProtocol = protocol - 1;
g_model.moduleData[idx].subType = subprotocol;
}
#endif
+16 -16
View File
@@ -41,37 +41,37 @@ extern uint32_t NV14internalModuleFwVersion;
#if defined (MULTIMODULE)
#define IS_D16_MULTI(module) \
(((g_model.moduleData[module].getMultiProtocol() == \
(((g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_FRSKY) && \
(g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16 || \
g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH || \
g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT || \
g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_LBT_8CH || \
g_model.moduleData[module].subType == MM_RF_FRSKY_SUBTYPE_D16_CLONED)) || \
(g_model.moduleData[module].getMultiProtocol() == \
(g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_FRSKYX2))
#define IS_R9_MULTI(module) \
(g_model.moduleData[module].getMultiProtocol() == \
(g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_FRSKY_R9)
#define IS_HOTT_MULTI(module) \
(g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_HOTT)
(g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_HOTT)
#define IS_CONFIG_MULTI(module) \
(g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_CONFIG)
(g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_CONFIG)
#define IS_DSM_MULTI(module) \
(g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2)
(g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
#define IS_RX_MULTI(module) \
((g_model.moduleData[module].getMultiProtocol() == \
((g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || \
(g_model.moduleData[module].getMultiProtocol() == \
(g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_FRSKYX_RX) || \
(g_model.moduleData[module].getMultiProtocol() == \
(g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_BAYANG_RX) || \
(g_model.moduleData[module].getMultiProtocol() == \
(g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_DSM_RX))
#if defined(HARDWARE_INTERNAL_MODULE)
@@ -123,7 +123,7 @@ const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol);
inline uint8_t getMaxMultiSubtype(uint8_t moduleIdx)
{
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
auto proto = g_model.moduleData[moduleIdx].getMultiProtocol();
auto proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
if (proto == MODULE_SUBTYPE_MULTI_FRSKY) {
return 7;
}
@@ -148,7 +148,7 @@ inline bool isModuleMultimodule(uint8_t idx)
inline bool isModuleMultimoduleDSM2(uint8_t idx)
{
return isModuleMultimodule(idx) &&
g_model.moduleData[idx].getMultiProtocol() ==
g_model.moduleData[idx].multi.rfProtocol ==
MODULE_SUBTYPE_MULTI_DSM2;
}
#else
@@ -593,7 +593,7 @@ inline bool isModuleFailsafeAvailable(uint8_t moduleIdx)
return status.supportsFailsafe();
}
else {
auto proto = g_model.moduleData[moduleIdx].getMultiProtocol();
auto proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
const mm_protocol_definition * pdef = getMultiProtocolDefinition(proto);
if (pdef) return pdef->failsafe;
return false;
@@ -649,7 +649,7 @@ inline uint8_t getMaxRxNum(uint8_t idx)
#if defined(MULTIMODULE)
if (isModuleMultimodule(idx)) {
switch (g_model.moduleData[idx].getMultiProtocol()) {
switch (g_model.moduleData[idx].multi.rfProtocol) {
case MODULE_SUBTYPE_MULTI_OLRS:
return 4;
case MODULE_SUBTYPE_MULTI_BUGS:
@@ -776,7 +776,7 @@ inline void resetAccessAuthenticationCount()
inline void resetAfhds3Options(uint8_t moduleIdx)
{
auto & data = g_model.moduleData[moduleIdx];
data.rfProtocol = 0;
//data.rfProtocol = 0;
data.subType = 0;
#if defined(AFHDS3)
data.afhds3.bindPower = 0;
@@ -824,7 +824,7 @@ inline void resetMultiProtocolsOptions(uint8_t moduleIdx)
return;
// Sensible default for DSM2 (same as for ppm): 7ch@22ms + Autodetect settings enabled
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2) {
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2) {
g_model.moduleData[moduleIdx].multi.autoBindMode = 1;
}
else {
+6 -49
View File
@@ -65,49 +65,6 @@ etx_serial_init multiSerialInitParams = {
};
#endif
void multiPatchCustom(uint8_t moduleIdx)
{
if (g_model.moduleData[moduleIdx].multi.customProto) {
uint8_t type = g_model.moduleData[moduleIdx].getMultiProtocol() - 1; // custom where starting at 1, etx list at 0
int subtype = g_model.moduleData[moduleIdx].subType;
g_model.moduleData[moduleIdx].multi.customProto = 0;
if (type == 2) { // multi PROTO_FRSKYD
g_model.moduleData[moduleIdx].subType = 1; // D8
return;
}
else if (type == 14) { // multi PROTO_FRSKYX
g_model.moduleData[moduleIdx].setMultiProtocol(2);
switch (subtype) {
case 0: //D16-16
g_model.moduleData[moduleIdx].subType = 0;
break;
case 1: //D16-8
g_model.moduleData[moduleIdx].subType = 2;
break;
case 2: //EU-16
g_model.moduleData[moduleIdx].subType = 4;
break;
case 3: //EU-8
g_model.moduleData[moduleIdx].subType = 5;
break;
}
return;
}
else if (type == 24) { // multi PROTO_FRSKYV
g_model.moduleData[moduleIdx].setMultiProtocol(2);
g_model.moduleData[moduleIdx].subType = 3;
return;
}
if (type > 14)
type -= 1;
if (type > 24)
type -= 1;
g_model.moduleData[moduleIdx].setMultiProtocol(type);
}
}
static void sendMulti(uint8_t moduleIdx, uint8_t b)
{
#if defined(HARDWARE_INTERNAL_MODULE)
@@ -201,7 +158,7 @@ void setupPulsesMulti(uint8_t moduleIdx)
sendMulti(moduleIdx, invert[moduleIdx] & 0x08);
}
else {
sendMulti(moduleIdx, (uint8_t) (((g_model.moduleData[moduleIdx].getMultiProtocol() + 3) & 0xC0)
sendMulti(moduleIdx, (uint8_t) (((g_model.moduleData[moduleIdx].multi.rfProtocol + 3) & 0xC0)
| (g_model.header.modelId[moduleIdx] & 0x30)
| (invert[moduleIdx] & 0x08)
//| 0x04 // Future use
@@ -430,7 +387,7 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
{// byte 1+2, protocol information
// Our enumeration starts at 0
int type = g_model.moduleData[moduleIdx].getMultiProtocol() + 1;
int type = g_model.moduleData[moduleIdx].multi.rfProtocol + 1;
int subtype = g_model.moduleData[moduleIdx].subType;
int8_t optionValue = g_model.moduleData[moduleIdx].multi.optionValue;
@@ -481,12 +438,12 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
// Set the highest bit of option byte in AFHDS2A protocol to instruct MULTI to passthrough telemetry bytes instead
// of sending Frsky D telemetry
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
optionValue = optionValue | 0x80;
// For custom protocol send unmodified type byte
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MM_RF_CUSTOM_SELECTED)
type = g_model.moduleData[moduleIdx].getMultiProtocol();
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MM_RF_CUSTOM_SELECTED)
type = g_model.moduleData[moduleIdx].multi.rfProtocol;
uint8_t headerByte = 0x55;
// header, byte 0, 0x55 for proto 0-31, 0x54 for proto 32-63
@@ -500,7 +457,7 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
// protocol byte
protoByte |= (type & 0x1f);
if (g_model.moduleData[moduleIdx].getMultiProtocol() != MODULE_SUBTYPE_MULTI_DSM2)
if (g_model.moduleData[moduleIdx].multi.rfProtocol != MODULE_SUBTYPE_MULTI_DSM2)
protoByte |= (g_model.moduleData[moduleIdx].multi.autoBindMode << 6);
sendMulti(moduleIdx, protoByte);
-1
View File
@@ -26,7 +26,6 @@
#include "hal/serial_driver.h"
#include "hal/module_driver.h"
void multiPatchCustom(uint8_t moduleIdx);
void convertEtxProtocolToMulti(int *protocol, int *subprotocol);
void convertMultiProtocolToEtx(int *protocol, int *subprotocol);
+4 -1
View File
@@ -262,7 +262,10 @@ uint8_t getRequiredProtocol(uint8_t module)
#if defined(DSM2)
case MODULE_TYPE_DSM2:
protocol = limit<uint8_t>(PROTOCOL_CHANNELS_DSM2_LP45, PROTOCOL_CHANNELS_DSM2_LP45+g_model.moduleData[module].rfProtocol, PROTOCOL_CHANNELS_DSM2_DSMX);
protocol = limit<uint8_t>(
PROTOCOL_CHANNELS_DSM2_LP45,
PROTOCOL_CHANNELS_DSM2_LP45 + g_model.moduleData[module].subType,
PROTOCOL_CHANNELS_DSM2_DSMX);
// The module is set to OFF during one second before BIND start
{
static tmr10ms_t bindStartTime = 0;
+7 -7
View File
@@ -114,7 +114,7 @@ void ModelCell::setRfData(ModelData* model)
setRfModuleData(i, &(model->moduleData[i]));
TRACE("<%s/%i> : %X,%X,%X",
strlen(modelName) ? modelName : modelFilename,
i, moduleData[i].type, moduleData[i].rfProtocol, modelId[i]);
i, moduleData[i].type, moduleData[i].subType, modelId[i]);
}
valid_rfData = true;
}
@@ -123,11 +123,11 @@ void ModelCell::setRfModuleData(uint8_t moduleIdx, ModuleData* modData)
{
moduleData[moduleIdx].type = modData->type;
if (modData->type != MODULE_TYPE_MULTIMODULE) {
moduleData[moduleIdx].rfProtocol = (uint8_t)modData->rfProtocol;
moduleData[moduleIdx].subType = (uint8_t)modData->subType;
}
else {
// do we care here about MM_RF_CUSTOM_SELECTED? probably not...
moduleData[moduleIdx].rfProtocol = modData->getMultiProtocol();
moduleData[moduleIdx].subType = modData->multi.rfProtocol;
}
}
@@ -551,7 +551,7 @@ bool ModelsList::isModelIdUnique(uint8_t moduleIdx, char* warn_buf, size_t warn_
uint8_t modelId = modelCell->modelId[moduleIdx];
uint8_t type = modelCell->moduleData[moduleIdx].type;
uint8_t rfProtocol = modelCell->moduleData[moduleIdx].rfProtocol;
uint8_t subType = modelCell->moduleData[moduleIdx].subType;
uint8_t additionalOnes = 0;
char* curr = warn_buf;
@@ -570,7 +570,7 @@ bool ModelsList::isModelIdUnique(uint8_t moduleIdx, char* warn_buf, size_t warn_
if ((type != MODULE_TYPE_NONE) &&
(type == (*it)->moduleData[moduleIdx].type) &&
(rfProtocol == (*it)->moduleData[moduleIdx].rfProtocol) &&
(subType == (*it)->moduleData[moduleIdx].subType) &&
(modelId == (*it)->modelId[moduleIdx])) {
// Hit found!
@@ -614,7 +614,7 @@ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx)
}
uint8_t type = modelCell->moduleData[moduleIdx].type;
uint8_t rfProtocol = modelCell->moduleData[moduleIdx].rfProtocol;
uint8_t subType = modelCell->moduleData[moduleIdx].subType;
uint8_t usedModelIds[(MAX_RXNUM + 7) / 8];
memset(usedModelIds, 0, sizeof(usedModelIds));
@@ -631,7 +631,7 @@ uint8_t ModelsList::findNextUnusedModelId(uint8_t moduleIdx)
// match module type and RF protocol
if ((type != MODULE_TYPE_NONE) &&
(type == (*it)->moduleData[moduleIdx].type) &&
(rfProtocol == (*it)->moduleData[moduleIdx].rfProtocol)) {
(subType == (*it)->moduleData[moduleIdx].subType)) {
uint8_t id = (*it)->modelId[moduleIdx];
uint8_t mask = 1 << (id & 7u);
+1 -1
View File
@@ -44,7 +44,7 @@ struct ModuleData;
struct SimpleModuleData
{
uint8_t type;
uint8_t rfProtocol;
uint8_t subType;
};
class ModelCell
+1 -9
View File
@@ -165,21 +165,13 @@ void postModelLoad(bool alarms)
if (!isInternalModuleAvailable(g_model.moduleData[INTERNAL_MODULE].type)) {
memclear(&g_model.moduleData[INTERNAL_MODULE], sizeof(ModuleData));
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(INTERNAL_MODULE))
multiPatchCustom(INTERNAL_MODULE);
#endif
#endif
if (!isExternalModuleAvailable(g_model.moduleData[EXTERNAL_MODULE].type)) {
memclear(&g_model.moduleData[EXTERNAL_MODULE], sizeof(ModuleData));
}
#if defined(MULTIMODULE)
else if (isModuleMultimodule(EXTERNAL_MODULE))
multiPatchCustom(EXTERNAL_MODULE);
#if defined(MULTI_PROTOLIST)
#if defined(MULTIMODULE) && defined(MULTI_PROTOLIST)
MultiRfProtocols::removeInstance(EXTERNAL_MODULE);
#endif
#endif
AUDIO_FLUSH();
@@ -1719,12 +1719,12 @@ static void r_modSubtype(void* user, uint8_t* data, uint32_t bitoffs,
// convert to ETX format and write to vars
convertMultiProtocolToEtx(&type, &subtype);
if (type > 0) {
md->setMultiProtocol(type - 1);
md->multi.rfProtocol = type - 1;
md->subType = subtype;
}
#endif
} else if (md->type == MODULE_TYPE_DSM2) {
md->rfProtocol = yaml_parse_enum(yaml_conv_220::enum_DSM2_Subtypes, val, val_len);
md->subType = yaml_parse_enum(yaml_conv_220::enum_DSM2_Subtypes, val, val_len);
} else {
md->subType = yaml_str2uint(val, val_len);
}
@@ -606,16 +606,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -689,14 +688,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -580,16 +580,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -663,14 +662,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -627,16 +627,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -710,14 +709,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -625,16 +625,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -708,14 +707,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -582,16 +582,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -665,14 +664,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -621,16 +621,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -704,14 +703,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -559,16 +559,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -642,14 +641,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -569,16 +569,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -652,14 +651,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -566,16 +566,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -649,14 +648,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -570,16 +570,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -653,14 +652,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -574,16 +574,15 @@ static const struct YamlNode struct_anonymous_5[] = {
YAML_END
};
static const struct YamlNode struct_anonymous_6[] = {
YAML_PADDING( 3 ),
YAML_PADDING( 8 ),
YAML_UNSIGNED( "disableTelemetry", 1 ),
YAML_UNSIGNED( "disableMapping", 1 ),
YAML_PADDING( 1 ),
YAML_UNSIGNED( "autoBindMode", 1 ),
YAML_UNSIGNED( "lowPowerMode", 1 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_UNSIGNED( "receiverTelemetryOff", 1 ),
YAML_UNSIGNED( "receiverHigherChannels", 1 ),
YAML_PADDING( 6 ),
YAML_PADDING( 2 ),
YAML_SIGNED( "optionValue", 8 ),
YAML_END
};
static const struct YamlNode struct_anonymous_7[] = {
@@ -657,14 +656,12 @@ static const struct YamlNode union_anonymous_4_elmts[] = {
};
static const struct YamlNode struct_ModuleData[] = {
YAML_IDX,
YAML_ENUM("type", 4, enum_ModuleType),
YAML_PADDING( 4 ),
YAML_ENUM("type", 8, enum_ModuleType),
YAML_CUSTOM("subType",r_modSubtype,w_modSubtype),
YAML_UNSIGNED( "channelsStart", 8 ),
YAML_SIGNED_CUST( "channelsCount", 8, r_channelsCount, w_channelsCount ),
YAML_ENUM("failsafeMode", 4, enum_FailsafeModes),
YAML_PADDING( 3 ),
YAML_PADDING( 1 ),
YAML_PADDING( 4 ),
YAML_UNION("mod", 200, union_anonymous_4_elmts, select_mod_type),
YAML_END
};
@@ -107,7 +107,8 @@ void telemetryPortInvertedInit(uint32_t baudrate)
//TODO:
// - handle conflict with HEARTBEAT disabled for trainer input...
// - probably need to stop trainer input/output and restore after this is closed
#if !defined(TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER) && !defined(TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT)
#if !defined(TELEMETRY_EXTI_REUSE_INTERRUPT_ROTARY_ENCODER) && \
!defined(TELEMETRY_EXTI_REUSE_INTERRUPT_INTMODULE_HEARTBEAT)
NVIC_DisableIRQ(TELEMETRY_EXTI_IRQn);
#endif
NVIC_DisableIRQ(TELEMETRY_TIMER_IRQn);
+2 -2
View File
@@ -158,9 +158,9 @@ static MultiBufferState guessProtocol(uint8_t module)
}
#endif
if (g_model.moduleData[moduleIdx].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2)
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
return SpektrumTelemetryFallback;
else if (g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
else if (g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_FS_AFHDS2A)
return FlyskyTelemetryFallback;
else
return FrskyTelemetryFallback;
+2 -2
View File
@@ -504,7 +504,7 @@ void processSpektrumPacket(const uint8_t *packet)
void processDSMBindPacket(uint8_t module, const uint8_t *packet)
{
uint32_t debugval;
if (g_model.moduleData[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2 && g_model.moduleData[module].subType == MM_RF_DSM2_SUBTYPE_AUTO) {
if (g_model.moduleData[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2 && g_model.moduleData[module].subType == MM_RF_DSM2_SUBTYPE_AUTO) {
// Only sets channel etc when in DSM/AUTO mode
int channels = packet[5];
if (channels > 12) {
@@ -548,7 +548,7 @@ void processDSMBindPacket(uint8_t module, const uint8_t *packet)
setTelemetryValue(PROTOCOL_TELEMETRY_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[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].getMultiProtocol() == MODULE_SUBTYPE_MULTI_DSM2 && moduleState[module].mode == MODULE_MODE_BIND) {
if (g_model.moduleData[module].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2 && moduleState[module].mode == MODULE_MODE_BIND) {
setMultiBindStatus(module, MULTI_BIND_FINISHED);
}
}
+2 -2
View File
@@ -135,9 +135,9 @@ inline const char* getRssiLabel()
{
#if defined(MULTIMODULE)
if (telemetryProtocol == PROTOCOL_TELEMETRY_MULTIMODULE &&
(g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() ==
(g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol ==
MODULE_SUBTYPE_MULTI_FS_AFHDS2A ||
g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol() ==
g_model.moduleData[EXTERNAL_MODULE].multi.rfProtocol ==
MODULE_SUBTYPE_MULTI_HOTT)) {
return "RQly";
}
+1 -1
View File
@@ -453,7 +453,7 @@ TEST(Conversions, ConversionTX16SFrom25)
EXPECT_STRNEQ("Model", g_model.header.name);
EXPECT_EQ(MODULE_SUBTYPE_MULTI_FRSKY, g_model.moduleData[0].getMultiProtocol());
EXPECT_EQ(MODULE_SUBTYPE_MULTI_FRSKY, g_model.moduleData[0].multi.rfProtocol);
EXPECT_EQ(MM_RF_FRSKY_SUBTYPE_D8_CLONED, g_model.moduleData[0].subType);
EXPECT_EQ(-12, g_model.moduleData[0].multi.optionValue);