From 924dad56b617b265d394a174bd7dd70ff74a854a Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 13 May 2025 12:50:33 -0400 Subject: [PATCH 1/6] Just getting started --- src/ble/ctrlm_ble_network.cpp | 46 ++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 201d5168..163f86b4 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -2403,7 +2403,51 @@ void ctrlm_obj_network_ble_t::power_state_change(gboolean waking_up) { } void ctrlm_obj_network_ble_t::rfc_retrieved_handler(const ctrlm_rfc_attr_t &attr) { - // TODO - No RFC parameters as of now + // Process timeout object + int timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_DISCOVERY, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("discovery timeout set to <%d>", timeout); + //setTimeoutDiscovery(timeout); + } + + timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_PAIR, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("pair timeout set to <%d>", timeout); + //setTimeoutPair(timeout); + } + + timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_SETUP, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("setup timeout set to <%d>", timeout); + //setTimeoutSetup(timeout); + } + + timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_UNPAIR, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("unpair timeout set to <%d>", timeout); + //setTimeoutUnpair(timeout); + } + + /* DO WE EVEN NEED THESE TIMEOUTS? + timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_HIDRAWPOLL, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("hidrawpoll timeout set to <%d>", timeout); + setTimeoutHidrawpoll(timeout); + } + + timeout = -1; + attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_HIDRAWLIMIT, timeout, 0, 600000); + if(timeout > 0) { + XLOGD_INFO("hidrawlimit timeout set to <%d>", timeout); + setTimeoutHidrawlimit(timeout); + }*/ + + //attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_MODELS,class_inc_line_of_sight_,0,15); } std::vector ctrlm_obj_network_ble_t::get_controller_obj_list() const { From 1c66af657ce0b4ac1d2516727cce34728c23a299 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 7 Jul 2026 20:57:50 -0400 Subject: [PATCH 2/6] update config settings object --- src/ble/ctrlm_ble_network.cpp | 60 ++++++------------- .../hal/blercu/blercupairingstatemachine.cpp | 21 +++---- .../hal/blercu/blercupairingstatemachine.h | 6 +- src/ble/hal/configsettings/configsettings.cpp | 33 ++++++++++ src/ble/hal/configsettings/configsettings.h | 6 +- 5 files changed, 66 insertions(+), 60 deletions(-) diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 98e505ec..6324347d 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -2798,51 +2798,29 @@ void ctrlm_obj_network_ble_t::power_state_change(gboolean waking_up) { } void ctrlm_obj_network_ble_t::rfc_retrieved_handler(const ctrlm_rfc_attr_t &attr) { - // Process timeout object - int timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_DISCOVERY, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("discovery timeout set to <%d>", timeout); - //setTimeoutDiscovery(timeout); - } - - timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_PAIR, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("pair timeout set to <%d>", timeout); - //setTimeoutPair(timeout); - } - - timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_SETUP, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("setup timeout set to <%d>", timeout); - //setTimeoutSetup(timeout); - } + XLOGD_INFO("process BLE RFC values"); - timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_UNPAIR, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("unpair timeout set to <%d>", timeout); - //setTimeoutUnpair(timeout); + auto config = getConfigSettings(); + if (config == nullptr) { + XLOGD_ERROR("config not available"); + return; } - - /* DO WE EVEN NEED THESE TIMEOUTS? - timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_HIDRAWPOLL, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("hidrawpoll timeout set to <%d>", timeout); - setTimeoutHidrawpoll(timeout); + + json_t *obj = nullptr; + if(!attr.get_rfc_json_value(&obj)) { + XLOGD_ERROR("failed to get RFC json object"); + return; } + + // Update config settings from RFC json object + config->updateFromJson(obj); - timeout = -1; - attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_TIMEOUTS_HIDRAWLIMIT, timeout, 0, 600000); - if(timeout > 0) { - XLOGD_INFO("hidrawlimit timeout set to <%d>", timeout); - setTimeoutHidrawlimit(timeout); - }*/ - - //attr.get_rfc_value(JSON_INT_NAME_NETWORK_BLE_MODELS,class_inc_line_of_sight_,0,15); + // Process options object + //bool disable_voice = false; + //if(attr.get_rfc_value(JSON_OBJ_NAME_NETWORK_BLE_OPTIONS JSON_PATH_SEPERATOR JSON_BOOL_NAME_NETWORK_BLE_OPTIONS_DISABLE_VOICE, disable_voice);) { + // XLOGD_INFO("disable voice set to <%s>", disable_voice ? "true" : "false"); + //setDisableVoice(disable_voice); + //} } std::vector ctrlm_obj_network_ble_t::get_controller_obj_list() const { diff --git a/src/ble/hal/blercu/blercupairingstatemachine.cpp b/src/ble/hal/blercu/blercupairingstatemachine.cpp index 0779fb69..0a00c353 100644 --- a/src/ble/hal/blercu/blercupairingstatemachine.cpp +++ b/src/ble/hal/blercu/blercupairingstatemachine.cpp @@ -44,11 +44,8 @@ BleRcuPairingStateMachine::BleRcuPairingStateMachine(const shared_ptrdiscoveryTimeout()) - , m_discoveryTimeoutDefault(config->discoveryTimeout()) - , m_pairingTimeout(config->pairingTimeout()) - , m_setupTimeout(config->setupTimeout()) - , m_unpairingTimeout(config->upairingTimeout()) , m_pairingAttempts(0) , m_pairingSuccesses(0) , m_pairingSucceeded(false) @@ -304,7 +301,7 @@ void BleRcuPairingStateMachine::startWithCode(uint8_t pairingCode) return; } - m_discoveryTimeout = m_discoveryTimeoutDefault; + m_discoveryTimeout = m_config->discoveryTimeout(); m_isAutoPairing = false; // clear the target device @@ -511,9 +508,9 @@ void BleRcuPairingStateMachine::onStateTransition(int oldState, int newState) } } else if (newState == UnpairingState) { if (oldState == EnablePairableState || oldState == PairingState) { - XLOGD_AUTOMATION_WARN("timed-out in pairing phase (rcu device didn't pair within %dms)", m_pairingTimeout); + XLOGD_AUTOMATION_WARN("timed-out in pairing phase (rcu device didn't pair within %dms)", m_config->pairingTimeout()); } else if (oldState == SetupState) { - XLOGD_AUTOMATION_WARN("timed-out in setup phase (rcu didn't response to all requests within %dms)", m_setupTimeout); + XLOGD_AUTOMATION_WARN("timed-out in setup phase (rcu didn't response to all requests within %dms)", m_config->setupTimeout()); } } @@ -643,7 +640,7 @@ void BleRcuPairingStateMachine::onExitedDiscoverySuperState() void BleRcuPairingStateMachine::onEnteredStoppingDiscoveryState() { // start the pairing timeout timer - m_stateMachine.postDelayedEvent(PairingTimeoutEvent, m_pairingTimeout); + m_stateMachine.postDelayedEvent(PairingTimeoutEvent, m_config->pairingTimeout()); // if we've got to this state it means we have a target device if (m_targetAddress.isNull()) { @@ -708,7 +705,7 @@ void BleRcuPairingStateMachine::onEnteredEnablePairableState() // in pairable mode because we don't know if the previous timeout is long enough for our purposes. // The timeout is set to 5 seconds past the overall time we've given the state machine // to pair with the rcu. - m_adapter->enablePairable(m_pairingTimeout + 5000); + m_adapter->enablePairable(m_config->pairingTimeout() + 5000); if (m_adapter->isPairable()) { // is already pairable so just post the 'enabled' event @@ -748,8 +745,8 @@ void BleRcuPairingStateMachine::onEnteredPairingState() void BleRcuPairingStateMachine::onEnteredSetupState() { // start the setup timeout timer - m_stateMachine.postDelayedEvent(SetupTimeoutEvent, m_setupTimeout); - XLOGD_DEBUG("starting setup timeout timer for %dms", m_setupTimeout); + m_stateMachine.postDelayedEvent(SetupTimeoutEvent, m_config->setupTimeout()); + XLOGD_DEBUG("starting setup timeout timer for %dms", m_config->setupTimeout()); } // ----------------------------------------------------------------------------- @@ -781,7 +778,7 @@ void BleRcuPairingStateMachine::onExitedPairingSuperState() void BleRcuPairingStateMachine::onEnteredUnpairingState() { // start the unpairing timeout timer - m_stateMachine.postDelayedEvent(UnpairingTimeoutEvent, m_unpairingTimeout); + m_stateMachine.postDelayedEvent(UnpairingTimeoutEvent, m_config->upairingTimeout()); // if we've got to this state it means we have a target device if (m_targetAddress.isNull()) { diff --git a/src/ble/hal/blercu/blercupairingstatemachine.h b/src/ble/hal/blercu/blercupairingstatemachine.h index f3d18178..2988f198 100644 --- a/src/ble/hal/blercu/blercupairingstatemachine.h +++ b/src/ble/hal/blercu/blercupairingstatemachine.h @@ -192,11 +192,9 @@ class BleRcuPairingStateMachine StateMachine m_stateMachine; + const std::shared_ptr m_config; + int m_discoveryTimeout; - int m_discoveryTimeoutDefault; - int m_pairingTimeout; - int m_setupTimeout; - int m_unpairingTimeout; int m_pairingAttempts; int m_pairingSuccesses; diff --git a/src/ble/hal/configsettings/configsettings.cpp b/src/ble/hal/configsettings/configsettings.cpp index ce8cc3a7..43ac268c 100644 --- a/src/ble/hal/configsettings/configsettings.cpp +++ b/src/ble/hal/configsettings/configsettings.cpp @@ -200,6 +200,31 @@ std::shared_ptr ConfigSettings::parseJson(json_t *jsonConfig) return std::make_shared(timeouts, std::move(models)); } +// ----------------------------------------------------------------------------- +/*! + Parses a json config file and updates the existing object. Any unrecognized fields are ignored. + + \see defaults() + */ +bool ConfigSettings::updateJson(json_t *jsonConfig) +{ + bool updated = false; + // find the timeout params + json_t *timeoutsObj = json_object_get(jsonConfig, "timeouts"); + if (timeoutsObj && json_is_object(timeoutsObj)) { + m_timeOuts = parseTimeouts(timeoutsObj); + updated = true; + } + + // find the model details array + json_t *modelArray = json_object_get(jsonConfig, "models"); + if (modelArray && json_is_array(modelArray)) { + XLOGD_WARN( "models cannot be updated"); + } + + return(updated); +} + // ----------------------------------------------------------------------------- /*! Parses a json config file and returns a \l{std::shared_ptr} to a @@ -378,3 +403,11 @@ int ConfigSettings::hidrawWaitLimitTimeout() const return m_timeOuts.hidrawWaitLimitMSecs; } +// ----------------------------------------------------------------------------- +/*! + Returns true if any of the config fields are updated. Otherwise, returns false. + */ +bool ConfigSettings::updateFromJson(json_t *jsonConfig) +{ + return updateJson(jsonConfig); +} diff --git a/src/ble/hal/configsettings/configsettings.h b/src/ble/hal/configsettings/configsettings.h index 5a4d5e9b..c51c9491 100644 --- a/src/ble/hal/configsettings/configsettings.h +++ b/src/ble/hal/configsettings/configsettings.h @@ -48,6 +48,7 @@ class ConfigSettings static std::shared_ptr fromJsonFile(const std::string &filePath); static std::shared_ptr fromJsonBuffer(const char *jsonBuffer); static std::shared_ptr parseJson(json_t *jsonConfig); + bool updateJson(json_t *jsonConfig); struct TimeOuts { int discoveryMSecs; @@ -65,6 +66,7 @@ class ConfigSettings std::vector &&modelDetails); public: + bool updateFromJson(json_t *jsonConfig); int discoveryTimeout() const; int pairingTimeout() const; int setupTimeout() const; @@ -80,11 +82,9 @@ class ConfigSettings static TimeOuts parseTimeouts(json_t *json); private: - const TimeOuts m_timeOuts; + TimeOuts m_timeOuts; const std::vector m_modelDetails; }; -// QDebug operator<<(QDebug dbg, const ConfigSettings &settings); - #endif // !defined(CONFIGSETTINGS_H) From 6b65ced533ff8a79f4b769c0b9aafbb4716638fb Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Tue, 7 Jul 2026 21:09:27 -0400 Subject: [PATCH 3/6] process options object --- src/ble/ctrlm_ble_network.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 6324347d..0dec0db8 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -2800,6 +2800,13 @@ void ctrlm_obj_network_ble_t::power_state_change(gboolean waking_up) { void ctrlm_obj_network_ble_t::rfc_retrieved_handler(const ctrlm_rfc_attr_t &attr) { XLOGD_INFO("process BLE RFC values"); + // Process options object + bool disable_voice = false; + if(attr.get_rfc_value(JSON_OBJ_NAME_NETWORK_BLE_OPTIONS JSON_PATH_SEPERATOR JSON_BOOL_NAME_NETWORK_BLE_OPTIONS_DISABLE_VOICE, disable_voice)) { + voice_disabled_ = disable_voice; + XLOGD_INFO("BLE voice support is %s by config", voice_disabled_ ? "disabled" : "enabled"); + } + auto config = getConfigSettings(); if (config == nullptr) { XLOGD_ERROR("config not available"); @@ -2814,13 +2821,6 @@ void ctrlm_obj_network_ble_t::rfc_retrieved_handler(const ctrlm_rfc_attr_t &attr // Update config settings from RFC json object config->updateFromJson(obj); - - // Process options object - //bool disable_voice = false; - //if(attr.get_rfc_value(JSON_OBJ_NAME_NETWORK_BLE_OPTIONS JSON_PATH_SEPERATOR JSON_BOOL_NAME_NETWORK_BLE_OPTIONS_DISABLE_VOICE, disable_voice);) { - // XLOGD_INFO("disable voice set to <%s>", disable_voice ? "true" : "false"); - //setDisableVoice(disable_voice); - //} } std::vector ctrlm_obj_network_ble_t::get_controller_obj_list() const { From 93e3b53cb358c3608288b9d0da226506008b1246 Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Wed, 8 Jul 2026 10:52:16 -0400 Subject: [PATCH 4/6] fix copilot concern --- src/ble/ctrlm_ble_network.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 0dec0db8..565af510 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -2820,7 +2820,11 @@ void ctrlm_obj_network_ble_t::rfc_retrieved_handler(const ctrlm_rfc_attr_t &attr } // Update config settings from RFC json object - config->updateFromJson(obj); + bool updated = config->updateFromJson(obj); + if(!updated) { + XLOGD_WARN("no BLE config updates found in RFC"); + } + json_decref(obj); } std::vector ctrlm_obj_network_ble_t::get_controller_obj_list() const { From d2abc66fed71829d189e83e23dcaaf03a31dfbcd Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Wed, 8 Jul 2026 11:01:42 -0400 Subject: [PATCH 5/6] use local for timeout value --- src/ble/hal/blercu/blercupairingstatemachine.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ble/hal/blercu/blercupairingstatemachine.cpp b/src/ble/hal/blercu/blercupairingstatemachine.cpp index 0a00c353..be6821eb 100644 --- a/src/ble/hal/blercu/blercupairingstatemachine.cpp +++ b/src/ble/hal/blercu/blercupairingstatemachine.cpp @@ -745,8 +745,9 @@ void BleRcuPairingStateMachine::onEnteredPairingState() void BleRcuPairingStateMachine::onEnteredSetupState() { // start the setup timeout timer - m_stateMachine.postDelayedEvent(SetupTimeoutEvent, m_config->setupTimeout()); - XLOGD_DEBUG("starting setup timeout timer for %dms", m_config->setupTimeout()); + int timeout = m_config->setupTimeout(); + m_stateMachine.postDelayedEvent(SetupTimeoutEvent, timeout); + XLOGD_DEBUG("starting setup timeout timer for %dms", timeout); } // ----------------------------------------------------------------------------- From 7911b6eeea284753a643150f392adbe847afaefb Mon Sep 17 00:00:00 2001 From: dwolav200 Date: Wed, 8 Jul 2026 11:30:03 -0400 Subject: [PATCH 6/6] add debug logs to allow QA to validate the changes --- src/ble/hal/blercu/blercupairingstatemachine.cpp | 8 ++++++-- src/ble/hal/configsettings/configsettings.cpp | 8 +++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/ble/hal/blercu/blercupairingstatemachine.cpp b/src/ble/hal/blercu/blercupairingstatemachine.cpp index be6821eb..8fa38aa5 100644 --- a/src/ble/hal/blercu/blercupairingstatemachine.cpp +++ b/src/ble/hal/blercu/blercupairingstatemachine.cpp @@ -284,6 +284,7 @@ void BleRcuPairingStateMachine::startAutoWithTimeout(int timeoutMs) m_pairingAttempts++; m_pairingSucceeded = false; XLOGD_INFO("Started auto pairing procedure"); + XLOGD_DEBUG("timeouts - discovery <%d ms> pairing <%d ms> setup <%d ms> unpairing <%d ms>", m_discoveryTimeout, m_config->pairingTimeout(), m_config->setupTimeout(), m_config->upairingTimeout()); } @@ -301,7 +302,7 @@ void BleRcuPairingStateMachine::startWithCode(uint8_t pairingCode) return; } - m_discoveryTimeout = m_config->discoveryTimeout(); + m_discoveryTimeout = m_config->discoveryTimeout(); // use the default discovery timeout for this pairing method m_isAutoPairing = false; // clear the target device @@ -342,6 +343,7 @@ void BleRcuPairingStateMachine::startWithCode(uint8_t pairingCode) m_pairingAttempts++; m_pairingSucceeded = false; XLOGD_INFO("started pairing, searching for device with prefix code %03d or MAC hash 0x%02X", m_pairingCode, m_pairingMacHash); + XLOGD_DEBUG("timeouts - discovery <%d ms> pairing <%d ms> setup <%d ms> unpairing <%d ms>", m_discoveryTimeout, m_config->pairingTimeout(), m_config->setupTimeout(), m_config->upairingTimeout()); } // ----------------------------------------------------------------------------- @@ -357,6 +359,8 @@ void BleRcuPairingStateMachine::startWithMacList(const std::vector & return; } + m_discoveryTimeout = m_config->discoveryTimeout(); // use the default discovery timeout for this pairing method + // clear the target device m_targetAddress.clear(); @@ -386,7 +390,7 @@ void BleRcuPairingStateMachine::startWithMacList(const std::vector & for (const auto &address : macList) { XLOGD_INFO("<%s>", address.toString().c_str()); } - + XLOGD_DEBUG("timeouts - discovery <%d ms> pairing <%d ms> setup <%d ms> unpairing <%d ms>", m_discoveryTimeout, m_config->pairingTimeout(), m_config->setupTimeout(), m_config->upairingTimeout()); } diff --git a/src/ble/hal/configsettings/configsettings.cpp b/src/ble/hal/configsettings/configsettings.cpp index 43ac268c..29539642 100644 --- a/src/ble/hal/configsettings/configsettings.cpp +++ b/src/ble/hal/configsettings/configsettings.cpp @@ -209,6 +209,12 @@ std::shared_ptr ConfigSettings::parseJson(json_t *jsonConfig) bool ConfigSettings::updateJson(json_t *jsonConfig) { bool updated = false; + + if (jsonConfig == nullptr || !json_is_object(jsonConfig)) { + XLOGD_WARN("invalid json config"); + return(updated); + } + // find the timeout params json_t *timeoutsObj = json_object_get(jsonConfig, "timeouts"); if (timeoutsObj && json_is_object(timeoutsObj)) { @@ -219,7 +225,7 @@ bool ConfigSettings::updateJson(json_t *jsonConfig) // find the model details array json_t *modelArray = json_object_get(jsonConfig, "models"); if (modelArray && json_is_array(modelArray)) { - XLOGD_WARN( "models cannot be updated"); + XLOGD_WARN("models cannot be updated"); } return(updated);