Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions radio/src/pulses/modules_helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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) || \
Expand Down Expand Up @@ -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)
Expand Down
21 changes: 21 additions & 0 deletions radio/src/pulses/multi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}
}
Expand Down Expand Up @@ -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

18 changes: 17 additions & 1 deletion radio/src/telemetry/multi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ enum MultiPacketTypes : uint8_t
HottTelemetry,
MLinkTelemetry,
ConfigTelemetry,
MultiProtoDef
MultiProtoDef,
RLinkTelemetry = 18,
};

enum MultiBufferState : uint8_t
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions radio/src/telemetry/multi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 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);
Expand Down