Merge pull request #705 from EdgeTX/mpm-proto-list2
[color] Dynamic MPM proto list
This commit is contained in:
@@ -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++) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user