Skip to content

Commit

Permalink
feat(mpm): remove FrSky special treatment madness (#3032)
Browse files Browse the repository at this point in the history
  • Loading branch information
raphaelcoeffic authored and pfeerick committed Feb 3, 2023
1 parent 13b49b1 commit 22ed36a
Show file tree
Hide file tree
Showing 12 changed files with 84 additions and 302 deletions.
13 changes: 3 additions & 10 deletions radio/src/gui/128x64/model_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1194,16 +1194,9 @@ void menuModelSetup(event_t event)
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
multiRfProto = status.protocolPrev;
} else if (direction == 1) {
multiRfProto = status.protocolNext;
}
}
else {
Expand Down
13 changes: 3 additions & 10 deletions radio/src/gui/212x64/model_setup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,16 +1127,9 @@ void menuModelSetup(event_t event)
if (status.isValid()) {
int8_t direction = checkIncDec(event, 0, -1, 1);
if (direction == -1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX_RX;
else
multiRfProto = convertMultiToOtx(status.protocolPrev);
}
if (direction == 1) {
if (multiRfProto == MODULE_SUBTYPE_MULTI_FRSKY)
multiRfProto = MODULE_SUBTYPE_MULTI_FRSKYX2;
else
multiRfProto = convertMultiToOtx(status.protocolNext);
multiRfProto = status.protocolPrev;
} else if (direction == 1) {
multiRfProto = status.protocolNext;
}
}
else {
Expand Down
63 changes: 8 additions & 55 deletions radio/src/gui/gui_common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1074,57 +1074,6 @@ int getFirstAvailable(int min, int max, IsValueAvailable isValueAvailable)
}
#if defined(MULTIMODULE)

// This maps OpenTX multi type with Pascal's Multi type
uint8_t multiConvertOtxToMulti(uint8_t moduleIdx, uint8_t type)
{

// 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)
type = type + 1;

// 25 is again a FrSky protocol (FrskyV) so shift again
if (type >= 25)
type = type + 1;

if (type == MODULE_SUBTYPE_MULTI_FRSKY) {
int subtype = g_model.moduleData[moduleIdx].subType;
if (subtype == MM_RF_FRSKY_SUBTYPE_D8 || subtype == MM_RF_FRSKY_SUBTYPE_D8_CLONED) {
//D8
type = 3;
}
else if (subtype == MM_RF_FRSKY_SUBTYPE_V8) {
//V8
type = 25;
}
else {
type = 15;
}
}
return type;
}

// This maps multi type to OpenTX number, type ONLY (no subtype)
int convertMultiToOtx(int type)
{
if (type == 3) //FrSkyD
return MODULE_SUBTYPE_MULTI_FRSKY;

if (type == 15) //FrSkyX
return MODULE_SUBTYPE_MULTI_FRSKY;

if (type == 25) //FrSkyV
return MODULE_SUBTYPE_MULTI_FRSKY;

if (type > 25)
type = type - 1;

if (type > 15)
type = type - 1;

return type - 1; //Multi list starts at 1
}

// Third row is number of subtypes -1 (max valid subtype)
#define NO_SUBTYPE nullptr

Expand All @@ -1138,7 +1087,8 @@ int convertMultiToOtx(int type)

const char* const STR_SUBTYPE_FLYSKY[] = {"Std","V9x9","V6x6","V912","CX20"};
const char* const STR_SUBTYPE_HUBSAN[] = {"H107","H301","H501"};
const char* const STR_SUBTYPE_FRSKY[] = {"D16","D8","D16 8ch","V8","LBT(EU)","LBT 8ch","D8Cloned","D16Cloned"};
const char* const STR_SUBTYPE_FRSKYD[] = {"D8","Cloned"};
const char* const STR_SUBTYPE_FRSKYX[] = {"D16","D16 8ch","LBT(EU)","LBT 8ch","Cloned", "Cloned 8ch"};
const char* const STR_SUBTYPE_HISKY[] = {"Std","HK310"};
const char* const STR_SUBTYPE_V2X2[] = {"Std","JXD506","MR101"};
const char* const STR_SUBTYPE_DSM[] = {"2 1F","2 2F","X 1F","X 2F","Auto","R 1F"};
Expand Down Expand Up @@ -1183,13 +1133,13 @@ const char* const STR_SUBTYPE_FX816[] = {"P38"};
const char* const STR_SUBTYPE_PELIKAN[] = {"Pro","Lite","SCX24"};
const char* const STR_SUBTYPE_XK[] = {"X450","X420"};
const char* const STR_SUBTYPE_XN297DUMP[] = {"250K","1M","2M","AUTO","NRF","CC2500"};
const char* const STR_SUBTYPE_FRSKYX2[] = {"D16","D16 8ch","LBT(EU)","LBT 8ch","Cloned","Clone8ch"};
const char* const STR_SUBTYPE_FRSKYR9[] = {"915MHz","868MHz","915 8ch","868 8ch","FCC","---","FCC 8ch"};
const char* const STR_SUBTYPE_PROPEL[] = {"74-Z"};
const char* const STR_SUBTYPE_FRSKYL[] = {"LR12","LR12 6ch"};
const char* const STR_SUBTYPE_ESKY150V2[] = {"150 V2"};
const char* const STR_SUBTYPE_JJRC345[] = {"Std","SkyTmbr"};
const char* const STR_SUBTYPE_KYOSHO[] = {"FHSS","Hype"};
const char* const STR_SUBTYPE_KYOSHO2[] = {"KT-17"};
const char* const STR_SUBTYPE_RLINK[] = {"Surface","Air","DumboRC"};
const char* const STR_SUBTYPE_ELRS[] = {"N/A WIP"};
const char* const STR_SUBTYPE_REALACC[] = {"R11"};
Expand Down Expand Up @@ -1220,7 +1170,7 @@ const mm_protocol_definition multi_protocols[] = {
// Protocol as defined in pulses\modules_constants.h, number of sub_protocols - 1, Failsafe supported, Disable channel mapping supported, Subtype string, Option type
{MODULE_SUBTYPE_MULTI_FLYSKY, 4, false, true, STR_SUBTYPE_FLYSKY, nullptr},
{MODULE_SUBTYPE_MULTI_HUBSAN, 2, false, false, STR_SUBTYPE_HUBSAN, STR_MULTI_VIDFREQ},
{MODULE_SUBTYPE_MULTI_FRSKY, 7, false, false, STR_SUBTYPE_FRSKY, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKYD, 2, false, false, STR_SUBTYPE_FRSKYD, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_HISKY, 1, true, true, STR_SUBTYPE_HISKY, nullptr},
{MODULE_SUBTYPE_MULTI_V2X2, 2, false, false, STR_SUBTYPE_V2X2, nullptr},
{MODULE_SUBTYPE_MULTI_DSM2, 5, false, true, STR_SUBTYPE_DSM, STR_MULTI_MAX_THROW},
Expand All @@ -1232,12 +1182,14 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_CX10, 6, false, false, STR_SUBTYPE_CX10, nullptr},
{MODULE_SUBTYPE_MULTI_CG023, 1, false, false, STR_SUBTYPE_CG023, nullptr},
{MODULE_SUBTYPE_MULTI_BAYANG, 5, false, false, STR_SUBTYPE_BAYANG, STR_MULTI_TELEMETRY},
{MODULE_SUBTYPE_MULTI_FRSKYX, 6, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_ESky, 1, false, true, STR_SUBTYPE_ESky, nullptr},
{MODULE_SUBTYPE_MULTI_MT99XX, 7, false, false, STR_SUBTYPE_MT99, nullptr},
{MODULE_SUBTYPE_MULTI_MJXQ, 6, false, false, STR_SUBTYPE_MJXQ, nullptr},
{MODULE_SUBTYPE_MULTI_FY326, 1, false, false, STR_SUBTYPE_FY326, nullptr},
{MODULE_SUBTYPE_MULTI_FUTABA, 0, true, true, STR_SUBTYPE_FUTABA, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_J6PRO, 0, false, true, NO_SUBTYPE, nullptr},
{MODULE_SUBTYPE_MULTI_FRSKYV, 0, false, false, NO_SUBTYPE, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_HONTAI, 3, false, false, STR_SUBTYPE_HONTAI, nullptr},
{MODULE_SUBTYPE_MULTI_OLRS, 0, false, false, NO_SUBTYPE, STR_RF_POWER},
{MODULE_SUBTYPE_MULTI_FS_AFHDS2A, 5, true, true, STR_SUBTYPE_AFHDS2A, STR_MULTI_SERVOFREQ},
Expand Down Expand Up @@ -1267,7 +1219,7 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_PELIKAN, 2, false, true, STR_SUBTYPE_PELIKAN, nullptr},
{MODULE_SUBTYPE_MULTI_XK, 1, false, false, STR_SUBTYPE_XK, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_XN297DUMP, 5, false, false, STR_SUBTYPE_XN297DUMP, STR_MULTI_RFCHAN},
{MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, false, STR_SUBTYPE_FRSKYX2, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKYX2, 5, true, false, STR_SUBTYPE_FRSKYX, STR_MULTI_RFTUNE},
{MODULE_SUBTYPE_MULTI_FRSKY_R9, 6, true, false, STR_SUBTYPE_FRSKYR9, nullptr},
{MODULE_SUBTYPE_MULTI_PROPEL, 0, false, false, STR_SUBTYPE_PROPEL, nullptr},
{MODULE_SUBTYPE_MULTI_FRSKYL, 1, false, false, STR_SUBTYPE_FRSKYL, STR_MULTI_RFTUNE},
Expand All @@ -1286,6 +1238,7 @@ const mm_protocol_definition multi_protocols[] = {
{MODULE_SUBTYPE_MULTI_LOLI, 0, true, false, NO_SUBTYPE, nullptr},
{MODULE_SUBTYPE_MULTI_MOULDKG, 1, false, false, STR_SUBTYPE_MOULDKG, STR_MULTI_OPTION},
{MODULE_SUBTYPE_MULTI_MT99XX2, 0, false, false, STR_SUBTYPE_MT992, nullptr},
{MODULE_SUBTYPE_MULTI_KYOSHO2, 0, false, false, STR_SUBTYPE_KYOSHO2, nullptr},
{MM_RF_CUSTOM_SELECTED, 7, true, true, NO_SUBTYPE, STR_MULTI_OPTION},

// Sentinel and default for protocols not listed above (MM_RF_CUSTOM is 0xff)
Expand Down
6 changes: 0 additions & 6 deletions radio/src/gui/gui_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,6 @@ void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value,
void drawSourceCustomValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags flags=0);
void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0);

int convertMultiToOtx(int type);

// model_setup Defines that are used in all uis in the same way
#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW)
#define IF_MODULE_ON(moduleIndex, x) (IS_MODULE_ENABLED(moduleIndex) ? (uint8_t)(x) : HIDDEN_ROW)
Expand Down Expand Up @@ -286,10 +284,6 @@ inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx)
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
int proto = g_model.moduleData[moduleIdx].multi.rfProtocol;

if (proto == MODULE_SUBTYPE_MULTI_FRSKY) {
return true;
}

if (status.isValid()) {
TRACE("(%d) status.protocolSubNbr = %d", proto, status.protocolSubNbr);
return status.protocolSubNbr > 0;
Expand Down
75 changes: 24 additions & 51 deletions radio/src/io/multi_protolist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,39 +89,26 @@ bool MultiRfProtocols::RfProto::parse(const uint8_t* data, uint8_t len)
uint8_t subProtoNr = 0;
uint8_t subProtoLen = 0;

// special case handling for Frsky protos
if (proto == MODULE_SUBTYPE_MULTI_FRSKY) {
const mm_protocol_definition* def = getMultiProtocolDefinition(proto);
if (!def) return false;
// proto label string
while (*s && len--) s++;
if (*s || !len) return false;
label = (const char*)data;
s++;
len--;

label = "Frsky";
flags = 0x20;
// flags, subProtoNr, subProto label max length
if (len < 2) return false;
flags = (uint8_t) * (s++);
//TRACE("flags: 0x%02X", flags);

fillSubProtoList(def->subTypeString, def->maxSubtype + 1);
return true;
subProtoNr = (uint8_t) * (s++);
len -= 2;

} else {
// proto label string
while (*s && len--) s++;
if (*s || !len) return false;
label = (const char*)data;
s++;
len--;

// flags, subProtoNr, subProto label max length
if (len < 2) return false;
flags = (uint8_t) * (s++);
//TRACE("flags: 0x%02X", flags);

subProtoNr = (uint8_t) * (s++);
len -= 2;

if (!len) return true;
subProtoLen = (uint8_t) * (s++);
len--;

if (len < subProtoNr * subProtoLen) return false;
}
if (!len) return true;
subProtoLen = (uint8_t) * (s++);
len--;

if (len < subProtoNr * subProtoLen) return false;

fillSubProtoList(s, subProtoNr, subProtoLen);
return true;
Expand Down Expand Up @@ -296,29 +283,15 @@ bool MultiRfProtocols::scanReply(const uint8_t* packet, uint8_t len)
//TRACE("Proto = %d; label = '%s'", replyProtoId,
// (const char*)packet);

int proto = convertMultiToOtx(replyProtoId);
int proto = replyProtoId - 1;
if (proto != MODULE_SUBTYPE_MULTI_CONFIG &&
proto != MODULE_SUBTYPE_MULTI_SCANNER) {
bool insertProto = true;
if (proto == MODULE_SUBTYPE_MULTI_FRSKY) {
auto it = std::find_if(protoList.begin(), protoList.end(),
[=](const RfProto& p) {
return p.proto == (const int)proto;
});
if (it != protoList.end()) {
// FRSKY proto already added
insertProto = false;
}
}

if (insertProto) {
RfProto rfProto(proto);
if (rfProto.parse(packet, len)) {
proto2idx[proto] = protoList.size();
protoList.emplace_back(rfProto);
} else {
TRACE("Error parsing proto [%d]", proto);
}
RfProto rfProto(proto);
if (rfProto.parse(packet, len)) {
proto2idx[proto] = protoList.size();
protoList.emplace_back(rfProto);
} else {
TRACE("Error parsing proto [%d]", proto);
}
} else {
// do not count excluded protocols
Expand Down
4 changes: 1 addition & 3 deletions radio/src/lua/api_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,6 @@ static int luaModelGetModule(lua_State *L)
if (module.type == MODULE_TYPE_MULTIMODULE) {
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);
lua_pushtableinteger(L, "subProtocol", subprotocol);
if (getMultiModuleStatus(idx).isValid()) {
Expand Down Expand Up @@ -246,8 +245,7 @@ static int luaModelSetModule(lua_State *L)
#endif
}
#if defined(MULTIMODULE)
if (protocol > 0 && subprotocol >= 0) { // Both are needed to compute etx protocol
convertMultiProtocolToEtx(&protocol, &subprotocol);
if (protocol > 0 && subprotocol >= 0) {
g_model.moduleData[idx].multi.rfProtocol = protocol - 1;
g_model.moduleData[idx].subType = subprotocol;
}
Expand Down
Loading

0 comments on commit 22ed36a

Please sign in to comment.