[color] Dynamic MPM proto list

This commit is contained in:
Raphael Coeffic
2021-09-11 11:10:00 +02:00
parent 3778ed26dd
commit ba906e1d5d
15 changed files with 795 additions and 165 deletions
+45 -3
View File
@@ -20,8 +20,9 @@
#include "opentx.h"
#include "telemetry.h"
#include "multi.h"
#include "io/multi_protolist.h"
constexpr int32_t MULTI_DESIRED_VERSION = (1 << 24) | (3 << 16) | (1 << 8) | 69;
constexpr int32_t MULTI_DESIRED_VERSION = (1 << 24) | (3 << 16) | (3 << 8) | 0;
#define MULTI_CHAN_BITS 11
extern uint8_t g_moduleIdx;
@@ -43,7 +44,8 @@ enum MultiPacketTypes : uint8_t
MultiRxChannels,
HottTelemetry,
MLinkTelemetry,
ConfigTelemetry
ConfigTelemetry,
MultiProtoDef
};
enum MultiBufferState : uint8_t
@@ -144,6 +146,10 @@ uint16_t& getMultiTelemetryLastRxTS(uint8_t module)
#endif // INTERNAL_MODULE_MULTI
bool isMultiModeScanning(uint8_t module)
{
return getModuleMode(module) == MODULE_MODE_GET_HARDWARE_INFO;
}
static MultiBufferState guessProtocol(uint8_t module)
{
@@ -207,7 +213,6 @@ static void processMultiStatusPacket(const uint8_t * data, uint8_t module, uint8
// At least two status packets without bind flag
bool wasBinding = status.isBinding();
status.lastUpdate = get_tmr10ms();
status.flags = data[0];
status.major = data[1];
status.minor = data[2];
@@ -240,6 +245,9 @@ static void processMultiStatusPacket(const uint8_t * data, uint8_t module, uint8
if (wasBinding && !status.isBinding() && getMultiBindStatus(module) == MULTI_BIND_INITIATED)
setMultiBindStatus(module, MULTI_BIND_FINISHED);
// update timestamp last to avoid race conditions
status.lastUpdate = get_tmr10ms();
}
static void processMultiSyncPacket(const uint8_t * data, uint8_t module)
@@ -317,6 +325,28 @@ static void processConfigPacket(const uint8_t * packet, uint8_t len)
}
#endif
#if defined(MULTI_PROTOLIST)
static void processMultiProtoDef(uint8_t module, const uint8_t * packet, uint8_t len)
{
/*
data[0] = protocol number, 0xFF is an invalid list entry
(Option value too large) and nothing sent after
data[1..n] = protocol name null terminated
data[n+1] = flags
flags>>4 Option text number to be displayed
(check multi status for description)
flags&0x01 failsafe supported
flags&0x02 Channel Map Disabled supported
data[n+2] = number of sub protocols
data[n+3] = sub protocols text length, only sent if nbr_sub != 0
data[n+4..] = sub protocol names, only sent if nbr_sub != 0
*/
MultiRfProtocols::instance(module)->scanReply(packet, len);
}
#endif
static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module)
{
uint8_t type = packet[0];
@@ -450,6 +480,13 @@ static void processMultiTelemetryPaket(const uint8_t * packet, uint8_t module)
break;
#endif
#if defined(MULTI_PROTOLIST)
case MultiProtoDef:
if (len >= 1)
processMultiProtoDef(module, data, len);
break;
#endif
default:
TRACE("[MP] Unkown multi packet type 0x%02X, len %d", type, len);
break;
@@ -692,6 +729,11 @@ void processMultiTelemetryData(uint8_t data, uint8_t module)
}
}
bool isMultiTelemReceiving(uint8_t module)
{
return getMultiTelemetryBufferState(module) != NoProtocolDetected;
}
void checkFailsafeMulti()
{
for (int i=0; i<NUM_MODULES; i++) {