[color] use own protocol counter

Overloading the frame counter causes aa race condition with the UI thread (see SEND_FAILSAFE_1S()).
This commit is contained in:
Raphael Coeffic
2021-09-18 11:57:23 +10:00
committed by Peter Feerick
parent 514796fa51
commit f401cd4a12
4 changed files with 15 additions and 6 deletions
+3 -3
View File
@@ -211,8 +211,8 @@ bool MultiRfProtocols::triggerScan()
proto2idx.clear();
protoList.clear();
scanState = ScanBegin;
currentProto = MULTI_INVALID_PROTO;
moduleState[moduleIdx].mode = MODULE_MODE_GET_HARDWARE_INFO;
moduleState[moduleIdx].counter = MULTI_INVALID_PROTO;
scanStart = lastScan = RTOS_GET_MS();
return true;
}
@@ -232,7 +232,7 @@ bool MultiRfProtocols::scanReply(const uint8_t* packet, uint8_t len)
// new status received
if (replyProtoId != MULTI_INVALID_PROTO) {
if (moduleState[moduleIdx].counter == MULTI_INVALID_PROTO) {
if (currentProto == MULTI_INVALID_PROTO) {
//TRACE("# of protos: %d", totalProtos);
totalProtos = replyProtoId;
scanState = Scanning;
@@ -271,7 +271,7 @@ bool MultiRfProtocols::scanReply(const uint8_t* packet, uint8_t len)
}
}
moduleState[moduleIdx].counter++;
currentProto++;
lastScan = RTOS_GET_MS();
return true;
+2
View File
@@ -39,6 +39,7 @@ class MultiRfProtocols
uint32_t scanStart = 0;
uint32_t lastScan = 0;
uint8_t currentProto = 0;
uint8_t totalProtos = 0;
MultiRfProtocols(unsigned int moduleIdx) : moduleIdx(moduleIdx) {}
@@ -78,6 +79,7 @@ class MultiRfProtocols
std::string getLastProtoLabel() const;
bool triggerScan();
uint8_t getScanProto() { return currentProto; }
bool scanReply(const uint8_t * packet = nullptr, uint8_t len = 0);
void fillList(std::function<void(const RfProto&)> addProto) const;
+8 -3
View File
@@ -177,8 +177,11 @@ void setupPulsesMulti(uint8_t moduleIdx)
sendChannels(moduleIdx);
// Multi V1.3.X.X -> Send byte 26, Protocol (bits 7 & 6), RX_Num (bits 5 & 4), invert, not used, disable telemetry, disable mapping
if ((moduleState[moduleIdx].mode == MODULE_MODE_SPECTRUM_ANALYSER) ||
(moduleState[moduleIdx].mode == MODULE_MODE_GET_HARDWARE_INFO)) {
if ((moduleState[moduleIdx].mode == MODULE_MODE_SPECTRUM_ANALYSER)
#if defined(MULTI_PROTOLIST)
|| (moduleState[moduleIdx].mode == MODULE_MODE_GET_HARDWARE_INFO)
#endif
) {
sendMulti(moduleIdx, invert[moduleIdx] & 0x08);
}
else {
@@ -371,17 +374,19 @@ void sendFrameProtocolHeader(uint8_t moduleIdx, bool failsafe)
return;
}
#if defined(MULTI_PROTOLIST)
if (moduleMode == MODULE_MODE_GET_HARDWARE_INFO) {
sendMulti(moduleIdx, (uint8_t) 0x55); // Header byte
sendMulti(moduleIdx, (uint8_t) 0); // PROTOLIST custom protocol
sendMulti(moduleIdx, (uint8_t) 0);
// proto array item
uint8_t protoIdx = moduleState[moduleIdx].counter;
uint8_t protoIdx = MultiRfProtocols::instance(moduleIdx)->getScanProto();
TRACE("scan [%d]", protoIdx);
sendMulti(moduleIdx, protoIdx);
return;
}
#endif
if (moduleMode == MODULE_MODE_BIND)
protoByte |= MULTI_SEND_BIND;
+2
View File
@@ -473,7 +473,9 @@ static void enablePulsesInternalModule(uint8_t protocol)
getMultiModuleStatus(INTERNAL_MODULE).failsafeChecked = false;
getMultiModuleStatus(INTERNAL_MODULE).flags = 0;
#if defined(MULTI_PROTOLIST)
TRACE("enablePulsesInternalModule(): trigger scan");
MultiRfProtocols::instance(INTERNAL_MODULE)->triggerScan();
TRACE("counter = %d", moduleState[INTERNAL_MODULE].counter);
#endif
break;
#endif