From 9ca470ed6bb9bf70ac7e742898fa22637acd8488 Mon Sep 17 00:00:00 2001 From: Xy2019 <46518305+Xy2019@users.noreply.github.com> Date: Wed, 22 Mar 2023 20:44:32 -0700 Subject: [PATCH] fix(AFHDS3): Rx configuration not updated when switching model, manual exit bind (#3385) --- radio/src/pulses/afhds3.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/radio/src/pulses/afhds3.cpp b/radio/src/pulses/afhds3.cpp index 5b57904bd..911ba5340 100644 --- a/radio/src/pulses/afhds3.cpp +++ b/radio/src/pulses/afhds3.cpp @@ -249,8 +249,8 @@ class ProtoState ModuleState state; bool modelIDSet; + bool modelcfgGet; uint8_t modelID; - /** * Command count used for counting actual number of commands sent in run mode */ @@ -405,9 +405,6 @@ void ProtoState::setupFrame() modelID = g_model.header.modelId[module_index]; trsp.sendFrame(COMMAND::MODEL_ID, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, &g_model.header.modelId[module_index], 1); - - // always fetch config after setting model ID - trsp.enqueue(COMMAND::MODULE_GET_CONFIG, FRAME_TYPE::REQUEST_GET_DATA); return; } } else if (modelID != g_model.header.modelId[module_index]) { @@ -426,12 +423,18 @@ void ProtoState::setupFrame() // exit bind if (this->state == STATE_BINDING) { TRACE("AFHDS3 [EXIT BIND]"); + modelcfgGet = true; auto mode = (uint8_t)MODULE_MODE_E::RUN; trsp.sendFrame(COMMAND::MODULE_MODE, FRAME_TYPE::REQUEST_SET_EXPECT_DATA, &mode, 1); return; } } + if (modelcfgGet){ + trsp.enqueue(COMMAND::MODULE_GET_CONFIG, FRAME_TYPE::REQUEST_GET_DATA); + return; + } + if (cmdCount++ >= 150) { cmdCount = 0; @@ -550,13 +553,12 @@ void ProtoState::parseData(uint8_t* rxBuffer, uint8_t rxBufferCount) } break; case COMMAND::MODULE_GET_CONFIG: { + modelcfgGet = false; size_t len = min(sizeof(cfg.buffer), rxBufferCount); std::memcpy((void*) cfg.buffer, &responseFrame->value, len); - // TRACE( - // "AFHDS3 [MODULE_GET_CONFIG] bind power %d run power %d mode %d " - // "pwm/ppm %d ibus/sbus %d", - // cfg.config.bindPower, cfg.config.runPower, cfg.config.telemetry, - // cfg.config.pulseMode, cfg.config.serialMode); + moduleData->afhds3.emi = cfg.v0.EMIStandard; + moduleData->afhds3.telemetry = cfg.v0.IsTwoWay; + moduleData->afhds3.phyMode = cfg.v0.PhyMode; } break; case COMMAND::MODULE_VERSION: std::memcpy((void*) &version, &responseFrame->value, sizeof(version)); @@ -580,6 +582,11 @@ void ProtoState::parseData(uint8_t* rxBuffer, uint8_t rxBufferCount) } TRACE("AFHDS3 [MODULE_SET_CONFIG], %02X", responseFrame->value); break; + case COMMAND::MODEL_ID: + if (responseFrame->value == CMD_RESULT::SUCCESS) { + modelcfgGet = true; + } + break; case COMMAND::TELEMETRY_DATA: { uint8_t* telemetry = &responseFrame->value;