Merge pull request #705 from EdgeTX/mpm-proto-list2

[color] Dynamic MPM proto list
This commit is contained in:
Raphael Coeffic
2021-09-13 08:35:47 +02:00
committed by GitHub
17 changed files with 812 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++) {
+10
View File
@@ -125,6 +125,13 @@ struct MultiModuleStatus {
inline bool protocolValid() const { return (bool) (flags & 0x04); }
inline bool serialMode() const { return (bool) (flags & 0x02); }
inline bool inputDetected() const { return (bool) (flags & 0x01); }
inline void invalidate() {
lastUpdate = get_tmr10ms() - 500;
protocolSubNbr = 0;
protocolName[0] = '\0';
protocolSubName[0] = '\0';
}
};
MultiModuleStatus& getMultiModuleStatus(uint8_t module);
@@ -138,6 +145,9 @@ enum MultiBindStatus : uint8_t {
uint8_t getMultiBindStatus(uint8_t module);
void setMultiBindStatus(uint8_t module, uint8_t bindStatus);
bool isMultiModeScanning(uint8_t module);
bool isMultiTelemReceiving(uint8_t module);
void checkFailsafeMulti();
#endif //OPENTX_MULTI_H
+14
View File
@@ -22,6 +22,7 @@
#include "multi.h"
#include "pulses/afhds3.h"
#include "mixer_scheduler.h"
#include "io/multi_protolist.h"
#if defined(LIBOPENUI)
#include "libopenui.h"
@@ -137,6 +138,11 @@ void telemetryWakeup()
LOG_TELEMETRY_WRITE_BYTE(data);
} while (intmoduleFifo.pop(data));
}
#if defined(MULTI_PROTOLIST)
if (MultiRfProtocols::instance(INTERNAL_MODULE)->isScanning()) {
MultiRfProtocols::instance(INTERNAL_MODULE)->scanReply();
}
#endif
#endif
#if defined(STM32)
@@ -147,6 +153,14 @@ void telemetryWakeup()
LOG_TELEMETRY_WRITE_BYTE(data);
} while (telemetryGetByte(&data));
}
#if defined(MULTI_PROTOLIST)
if (isModuleMultimodule(EXTERNAL_MODULE) &&
MultiRfProtocols::instance(EXTERNAL_MODULE)->isScanning()) {
MultiRfProtocols::instance(EXTERNAL_MODULE)->scanReply();
}
#endif
#elif defined(PCBSKY9X)
if (telemetryProtocol == PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY) {
while (telemetrySecondPortReceive(data)) {