feat(mpm): support RadioLink / DumboRC special commands (#7441)

This commit is contained in:
Eduard
2026-08-23 11:38:23 +10:00
committed by GitHub
parent e2bcbd6c7f
commit 917c8ce654
5 changed files with 48 additions and 3 deletions
+2 -2
View File
@@ -146,7 +146,7 @@ STRLIST(STR_SUBTYPE_ESKY150V2, {"150V2"})
STRLIST(STR_SUBTYPE_JJRC345, {"JJRC345","SkyTmblr"})
STRLIST(STR_SUBTYPE_KYOSHO, {"FHSS","Hype"})
STRLIST(STR_SUBTYPE_KYOSHO2, {"KT-17"})
STRLIST(STR_SUBTYPE_RLINK, {"Surface","Air","DumboRC","RC4G"})
STRLIST(STR_SUBTYPE_RLINK, {"Surface","Air","DumboRC","RC4G","Dumbo_P"})
STRLIST(STR_SUBTYPE_ELRS, {"N/A WIP"})
STRLIST(STR_SUBTYPE_REALACC, {"R11"})
STRLIST(STR_SUBTYPE_WFLY2, {"RF20x"})
@@ -244,7 +244,7 @@ PROTODEF ({
{MODULE_SUBTYPE_MULTI_JJRC345, 1, false, false, STR_SUBTYPE_JJRC345, nullptr},
{MODULE_SUBTYPE_MULTI_Q90C, 0, false, false, NO_SUBTYPE, STR_DEF(STR_MULTI_RFTUNE)},
{MODULE_SUBTYPE_MULTI_KYOSHO, 1, false, true, STR_SUBTYPE_KYOSHO, nullptr},
{MODULE_SUBTYPE_MULTI_RLINK, 3, false, false, STR_SUBTYPE_RLINK, STR_DEF(STR_MULTI_RFTUNE)},
{MODULE_SUBTYPE_MULTI_RLINK, 4, false, false, STR_SUBTYPE_RLINK, STR_DEF(STR_MULTI_RFTUNE)},
// MODULE_SUBTYPE_MULTI_ELRS non selectable and masked out for selection
{MODULE_SUBTYPE_MULTI_REALACC, 0, false, false, STR_SUBTYPE_REALACC, nullptr},
{MODULE_SUBTYPE_MULTI_OMP, 0, false, false, NO_SUBTYPE, STR_DEF(STR_MULTI_RFTUNE)},
+4
View File
@@ -67,6 +67,9 @@ extern uint32_t NV14internalModuleFwVersion;
#define IS_DSM_MULTI(module) \
(g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
#define IS_RLINK_MULTI(module) \
(g_model.moduleData[module].multi.rfProtocol == MODULE_SUBTYPE_MULTI_RLINK)
#define IS_RX_MULTI(module) \
((g_model.moduleData[module].multi.rfProtocol == \
MODULE_SUBTYPE_MULTI_AFHDS2A_RX) || \
@@ -152,6 +155,7 @@ extern uint32_t NV14internalModuleFwVersion;
#define IS_HOTT_MULTI(module) false
#define IS_CONFIG_MULTI(module) false
#define IS_DSM_MULTI(module) false
#define IS_RLINK_MULTI(module) false
#define IS_RX_MULTI(module) false
inline bool isModuleMultimodule(uint8_t)
+21
View File
@@ -50,6 +50,7 @@ static void sendSport(uint8_t*& p_buf, uint8_t module);
static void sendHott(uint8_t*& p_buf, uint8_t module);
static void sendConfig(uint8_t*& p_buf, uint8_t module);
static void sendDSM(uint8_t*& p_buf, uint8_t module);
static void sendRlink(uint8_t*& p_buf, uint8_t module);
#endif
#include "hal/module_port.h"
@@ -193,6 +194,9 @@ static void setupPulsesMulti(uint8_t*& p_buf, uint8_t module)
else if (IS_DSM_MULTI(module)) {
sendDSM(p_buf, module); //7 bytes of additional data
}
else if (IS_RLINK_MULTI(module)) {
sendRlink(p_buf, module); //1..8 bytes of raw payload
}
#endif
}
}
@@ -470,5 +474,22 @@ void sendDSM(uint8_t*& p_buf, uint8_t module)
Multi_Buffer[3] = 0x00; // Data sent
}
}
void sendRlink(uint8_t*& p_buf, uint8_t module)
{
// Multi_Buffer[0..3] == "RLnk" / Lua script is running
// Multi_Buffer[4] == 1..8 -> payload ready to send
// Multi_Buffer[5..12] == payload to receiver
// Multi_Buffer[14] == 0 RX buffer can be written / >0 Lua has not consumed it
// Multi_Buffer[15..] == payload from receiver
if (Multi_Buffer && memcmp(Multi_Buffer, "RLnk", 4) == 0) {
uint8_t payloadLen = Multi_Buffer[4];
if (payloadLen < 1 || payloadLen > 8) return;
for (uint8_t i = 0; i < payloadLen; i++) {
sendMulti(p_buf, Multi_Buffer[5 + i]);
}
Multi_Buffer[4] = 0x00; // Data sent
}
}
#endif
+17 -1
View File
@@ -54,7 +54,8 @@ enum MultiPacketTypes : uint8_t
HottTelemetry,
MLinkTelemetry,
ConfigTelemetry,
MultiProtoDef
MultiProtoDef,
RLinkTelemetry = 18,
};
enum MultiBufferState : uint8_t
@@ -308,6 +309,17 @@ static void processConfigPacket(const uint8_t * packet, uint8_t len)
memcpy(&Multi_Buffer[13 + (packet[0] & 0x0F) * 20], &packet[1], 20); // Store the received page in the buffer
}
}
static void processRLinkPacket(const uint8_t * packet, uint8_t len)
{
// Multi_Buffer[0..3] == "RLnk" / Lua script is running
// Multi_Buffer[14] == 0 RX buffer can be written / >0 Lua has not consumed it
// Multi_Buffer[15..] == payload from receiver
if (Multi_Buffer && memcmp(Multi_Buffer, "RLnk", 4) == 0 && Multi_Buffer[14] == 0 && len < 32) {
memcpy(&Multi_Buffer[15], packet, len);
Multi_Buffer[14] = len;
}
}
#endif
#if defined(MULTI_PROTOLIST)
@@ -453,6 +465,10 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module)
else
TRACE("[MP] Received Config telemetry len %d < 20", len);
break;
case RLinkTelemetry:
processRLinkPacket(data, len);
break;
#endif
case FrSkyHubTelemetry:
+4
View File
@@ -90,6 +90,10 @@ Type 0x0B Spectrum Scanner telemetry data
data[0] = start channel (2400 + x*0.333 Mhz)
data[1-5] power levels
Type 0x12 RadioLink/DumboRC P raw command payload
length: variable
data[0..] = raw command payload, used to send failsafe and gyro settings
*/
void processMultiTelemetryData(uint8_t data, uint8_t module);