feat(mpm): support RadioLink / DumboRC special commands (#7441)
This commit is contained in:
@@ -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)},
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user