From 414b13084060d0f0b6246be111d45fbd337e6214 Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:07:48 -0400 Subject: [PATCH 1/7] Release/1.1.12 (#200) https://ccp.sys.comcast.net/browse/RDKEMW-16915 --- CHANGELOG.md | 26 +++++++++- CMakeLists.txt | 2 - include/ctrlm_ipc_voice.h | 2 +- src/auth/ctrlm_auth.h | 1 - src/auth/ctrlm_auth_thunder.cpp | 5 -- src/auth/ctrlm_auth_thunder.h | 1 - src/auth/ctrlm_thunder_plugin_authservice.cpp | 18 ------- src/auth/ctrlm_thunder_plugin_authservice.h | 7 --- src/ctrlm.h | 1 - src/ctrlm_controller.cpp | 4 -- src/ctrlm_controller.h | 1 - src/ctrlm_main.cpp | 46 ------------------ src/ctrlm_network.cpp | 10 ---- src/ctrlm_network.h | 3 -- src/thunder/ctrlm_thunder_plugin.cpp | 47 +++++++++++++++++++ src/thunder/ctrlm_thunder_plugin.h | 29 +++++++++--- .../ctrlm_thunder_plugin_powermanager.cpp | 21 +++++---- src/voice/ctrlm_voice_obj.cpp | 18 ------- src/voice/ctrlm_voice_obj.h | 3 -- src/voice/endpoints/ctrlm_voice_endpoint.cpp | 1 - src/voice/endpoints/ctrlm_voice_endpoint.h | 1 - .../endpoints/ctrlm_voice_endpoint_http.cpp | 8 ---- .../endpoints/ctrlm_voice_endpoint_http.h | 1 - .../ctrlm_voice_endpoint_ws_nextgen.cpp | 8 ---- .../ctrlm_voice_endpoint_ws_nextgen.h | 1 - 25 files changed, 107 insertions(+), 158 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52e8cb2d..8121aa80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,32 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). + + +#### [1.1.12](https://github.com/rdkcentral/control/compare/1.1.11...1.1.12) + +> 9 April 2026 + +- RDKEMW-16333: Update Thunder plugin to use _string and _boolean [`#197`](https://github.com/rdkcentral/control/pull/197) +- RDKEMW-5849 : remove deprecated "experience" code [`#185`](https://github.com/rdkcentral/control/pull/185) + +#### [1.1.11.2](https://github.com/rdkcentral/control/compare/1.1.11.1...1.1.11.2) + +> 7 April 2026 + +- RDKEMW-16711: CHANGELOG for ctrlm hotfix release 1.1.11.2 [`#196`](https://github.com/rdkcentral/control/pull/196) +- RDKEMW-16711 : Add wakeup reason string, on support/1.1.11 [`#195`](https://github.com/rdkcentral/control/pull/195) + +#### [1.1.11.1](https://github.com/rdkcentral/control/compare/1.1.11...1.1.11.1) + +> 1 April 2026 + +- RDKEMW-16330: Update Control Manager to use bool for NSM [`#188`](https://github.com/rdkcentral/control/pull/188) +- RDKEMW-16330: update CHANGELOG for release 1.1.11p1 [`98ea5f5`](https://github.com/rdkcentral/control/commit/98ea5f51f8da9ef6ded7038d760baa3b41cc4a90) + #### [1.1.11](https://github.com/rdkcentral/control/compare/1.1.10...1.1.11) -> 5 March 2026 +> 6 March 2026 - RDKEMW-14589: No UI action with "Info" keypress from rf4ce remote in RF mode [`#181`](https://github.com/rdkcentral/control/pull/181) - RDKEMW-14445 : Add session end and protocol return to telemetry [`#182`](https://github.com/rdkcentral/control/pull/182) @@ -15,7 +38,6 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - RDKEMW-12930: RF4CE network export XCONF on pair/unpair/etc. [`#177`](https://github.com/rdkcentral/control/pull/177) - RDKEMW-13833: Remove duplicate RFC fetch attempts in listeners [`#179`](https://github.com/rdkcentral/control/pull/179) - #### [1.1.10](https://github.com/rdkcentral/control/compare/1.1.9...1.1.10) diff --git a/CMakeLists.txt b/CMakeLists.txt index 565ab874..112b3c00 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,8 +234,6 @@ if(THUNDER) if(AUTH_ACTIVATION_STATUS) add_compile_definitions(AUTH_ACTIVATION_STATUS) endif() - #By default disabled but can be enabled - #add_compile_definitions(AUTH_EXPERIENCE) target_link_libraries(controlMgr RdkCertSelector) endif() endif() diff --git a/include/ctrlm_ipc_voice.h b/include/ctrlm_ipc_voice.h index 665ffaa5..ed96c951 100644 --- a/include/ctrlm_ipc_voice.h +++ b/include/ctrlm_ipc_voice.h @@ -64,7 +64,7 @@ #define CTRLM_VOICE_SESSION_TEXT_MAX_LENGTH (512) ///< Session text string maximum length #define CTRLM_VOICE_SESSION_MSG_MAX_LENGTH (128) ///< Session message string maximum length #define CTRLM_VOICE_QUERY_STRING_MAX_LENGTH (128) ///< Query string maximum name or value length -#define CTRLM_VOICE_QUERY_STRING_MAX_PAIRS (16) ///< Query string maximum number of name/value pairs +#define CTRLM_VOICE_QUERY_STRING_MAX_PAIRS (24) ///< Query string maximum number of name/value pairs #define CTRLM_VOICE_REQUEST_IP_MAX_LENGTH (48) ///< cURL request primary IP address string maximum length (big enough for IPv6) #define CTRLM_VOICE_MIN_UTTERANCE_DURATION_MAXIMUM (600) ///< Maximum value of the utterance duration minimum setting (in milliseconds) diff --git a/src/auth/ctrlm_auth.h b/src/auth/ctrlm_auth.h index 0964335f..bda34998 100644 --- a/src/auth/ctrlm_auth.h +++ b/src/auth/ctrlm_auth.h @@ -34,7 +34,6 @@ class ctrlm_auth_t { virtual bool get_device_id(std::string &device_id) = 0; virtual bool get_account_id(std::string &account_id) = 0; virtual bool get_partner_id(std::string &partner_id) = 0; - virtual bool get_experience(std::string &experience) = 0; virtual bool get_sat(std::string &sat, time_t &expiration) = 0; virtual bool supports_sat_expiration() const = 0; diff --git a/src/auth/ctrlm_auth_thunder.cpp b/src/auth/ctrlm_auth_thunder.cpp index 2f954df3..7e37f8b4 100644 --- a/src/auth/ctrlm_auth_thunder.cpp +++ b/src/auth/ctrlm_auth_thunder.cpp @@ -48,11 +48,6 @@ bool ctrlm_auth_thunder_t::get_partner_id(std::string &partner_id) { return(ret); } -bool ctrlm_auth_thunder_t::get_experience(std::string &experience) { - bool ret = this->plugin->get_experience(experience); - return(ret); -} - bool ctrlm_auth_thunder_t::get_sat(std::string &sat, time_t &expiration) { bool ret = this->plugin->get_sat(sat, expiration); return(ret); diff --git a/src/auth/ctrlm_auth_thunder.h b/src/auth/ctrlm_auth_thunder.h index 3a476e67..67a385db 100644 --- a/src/auth/ctrlm_auth_thunder.h +++ b/src/auth/ctrlm_auth_thunder.h @@ -13,7 +13,6 @@ class ctrlm_auth_thunder_t : public ctrlm_auth_t { virtual bool get_device_id(std::string &device_id); virtual bool get_account_id(std::string &account_id); virtual bool get_partner_id(std::string &partner_id); - virtual bool get_experience(std::string &experience); virtual bool get_sat(std::string &sat, time_t &expiration); virtual bool supports_sat_expiration() const; diff --git a/src/auth/ctrlm_thunder_plugin_authservice.cpp b/src/auth/ctrlm_thunder_plugin_authservice.cpp index 60c57d7a..e5913d07 100644 --- a/src/auth/ctrlm_thunder_plugin_authservice.cpp +++ b/src/auth/ctrlm_thunder_plugin_authservice.cpp @@ -125,24 +125,6 @@ bool ctrlm_thunder_plugin_authservice_t::get_account_id(std::string &account_id) return(ret); } -bool ctrlm_thunder_plugin_authservice_t::get_experience(std::string &experience) { - bool ret = false; - JsonObject params, response; - if(this->call_plugin("getExperience", (void *)¶ms, (void *)&response)) { - if(response["success"].Boolean()) { // If success doesn't exist, it defaults to false which is fine. - experience = response["experience"].String(); - if(!experience.empty()) { - ret = true; - } - } else { - XLOGD_WARN("Success for getExperience was false"); - } - } else { - XLOGD_WARN("Call for getExperience failed"); - } - return(ret); -} - bool ctrlm_thunder_plugin_authservice_t::get_sat(std::string &sat, time_t &expiration) { bool ret = false; JsonObject params, response; diff --git a/src/auth/ctrlm_thunder_plugin_authservice.h b/src/auth/ctrlm_thunder_plugin_authservice.h index c39de41d..169cee88 100644 --- a/src/auth/ctrlm_thunder_plugin_authservice.h +++ b/src/auth/ctrlm_thunder_plugin_authservice.h @@ -75,13 +75,6 @@ class ctrlm_thunder_plugin_authservice_t : public Thunder::Plugin::ctrlm_thunder */ bool get_account_id(std::string &account_id); - /** - * Function that retrieves the Experience String from Authservice. - * @param experience The reference to a string which will contain the Experience String. - * @return True on success otherwise False. - */ - bool get_experience(std::string &experience); - /** * Function that retrieves the SAT Token from Authservice. * @param sat The reference to a string which will contain the SAT Token. diff --git a/src/ctrlm.h b/src/ctrlm.h index 905803d1..376608b3 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -458,7 +458,6 @@ gboolean ctrlm_main_has_device_id_get(void); gboolean ctrlm_main_has_device_type_get(void); gboolean ctrlm_main_has_service_account_id_get(void); gboolean ctrlm_main_has_partner_id_get(void); -gboolean ctrlm_main_has_experience_get(void); gboolean ctrlm_main_needs_service_access_token_get(void); void ctrlm_main_invalidate_service_access_token(void); void ctrlm_main_sat_enabled_set(gboolean sat_enabled); diff --git a/src/ctrlm_controller.cpp b/src/ctrlm_controller.cpp index 15496dd3..60173d47 100644 --- a/src/ctrlm_controller.cpp +++ b/src/ctrlm_controller.cpp @@ -118,10 +118,6 @@ string ctrlm_obj_controller_t::partner_id_get() const { return(obj_network_->partner_id_get()); } -string ctrlm_obj_controller_t::experience_get() const { - return(obj_network_->experience_get()); -} - string ctrlm_obj_controller_t::stb_name_get() const { return(obj_network_->stb_name_get()); } diff --git a/src/ctrlm_controller.h b/src/ctrlm_controller.h index 66749062..ae9b800b 100644 --- a/src/ctrlm_controller.h +++ b/src/ctrlm_controller.h @@ -63,7 +63,6 @@ class ctrlm_obj_controller_t std::string device_id_get() const; std::string service_account_id_get() const; std::string partner_id_get() const; - std::string experience_get() const; std::string stb_name_get() const; void set_device_minor_id(int device_minor_id); int get_device_minor_id() const; diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index f76c3682..c3da8d6d 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -302,10 +302,6 @@ static void ctrlm_main_has_service_account_id_set(gboolean has_id); static gboolean ctrlm_load_partner_id(void); static void ctrlm_main_has_partner_id_set(gboolean has_id); #endif -#ifdef AUTH_EXPERIENCE -static gboolean ctrlm_load_experience(void); -static void ctrlm_main_has_experience_set(gboolean has_experience); -#endif #ifdef AUTH_SAT_TOKEN static gboolean ctrlm_load_service_access_token(void); static void ctrlm_main_has_service_access_token_set(gboolean has_token); @@ -1421,30 +1417,6 @@ gboolean ctrlm_load_partner_id(void) { } #endif -#ifdef AUTH_EXPERIENCE -gboolean ctrlm_main_has_experience_get(void) { - return(g_ctrlm.has_experience); -} - -void ctrlm_main_has_experience_set(gboolean has_experience) { - g_ctrlm.has_experience = has_experience; -} - -gboolean ctrlm_load_experience(void) { - if(!g_ctrlm.authservice->get_experience(g_ctrlm.experience)) { - ctrlm_main_has_experience_set(false); - return(false); - } - g_ctrlm.voice_session->voice_stb_data_experience_set(g_ctrlm.experience); - - for(auto const &itr : g_ctrlm.networks) { - itr.second->experience_set(g_ctrlm.experience); - } - ctrlm_main_has_experience_set(true); - return(true); -} -#endif - #ifdef AUTH_SAT_TOKEN gboolean ctrlm_main_needs_service_access_token_get(void) { gboolean ret = false; @@ -1510,12 +1482,6 @@ gboolean ctrlm_has_authservice_data(void) { } #endif -#ifdef AUTH_EXPERIENCE - if(!ctrlm_main_has_experience_get()) { - ret = FALSE; - } -#endif - #ifdef AUTH_SAT_TOKEN if(ctrlm_main_needs_service_access_token_get()) { ret = FALSE; @@ -1566,18 +1532,6 @@ gboolean ctrlm_load_authservice_data(void) { } #endif -#ifdef AUTH_EXPERIENCE - if(!ctrlm_main_has_experience_get()) { - XLOGD_INFO("load experience"); - if(!ctrlm_load_experience()) { - XLOGD_TELEMETRY("failed to load experience"); - ret = FALSE; - } else { - XLOGD_INFO("load experience successfully <%s>", ctrlm_is_pii_mask_enabled() ? "***" : g_ctrlm.experience.c_str()); - } - } -#endif - #ifdef AUTH_SAT_TOKEN if(ctrlm_main_needs_service_access_token_get()) { XLOGD_INFO("load sat token"); diff --git a/src/ctrlm_network.cpp b/src/ctrlm_network.cpp index e8f591c3..26201231 100644 --- a/src/ctrlm_network.cpp +++ b/src/ctrlm_network.cpp @@ -187,16 +187,6 @@ string ctrlm_obj_network_t::partner_id_get() const { return(partner_id_); } -void ctrlm_obj_network_t::experience_set(const string& experience) { - THREAD_ID_VALIDATE(); - experience_ = experience; -} - -string ctrlm_obj_network_t::experience_get() const { - THREAD_ID_VALIDATE(); - return(experience_); -} - void ctrlm_obj_network_t::stb_name_set(const string& stb_name) { THREAD_ID_VALIDATE(); XLOGD_INFO("STB Name <%s>", stb_name.c_str()); diff --git a/src/ctrlm_network.h b/src/ctrlm_network.h index 90ea909f..ca6ad547 100644 --- a/src/ctrlm_network.h +++ b/src/ctrlm_network.h @@ -192,8 +192,6 @@ class ctrlm_obj_network_t std::string service_account_id_get() const; void partner_id_set(const std::string& partner_id); std::string partner_id_get() const; - void experience_set(const std::string& experience); - std::string experience_get() const; void mask_key_codes_set(gboolean mask_key_codes); gboolean mask_key_codes_get() const; void stb_name_set(const std::string& stb_name); @@ -325,7 +323,6 @@ class ctrlm_obj_network_t std::string device_id_; std::string service_account_id_; std::string partner_id_; - std::string experience_; std::string stb_name_; ctrlm_rcu_validation_result_t validation_result_ = CTRLM_RCU_VALIDATION_RESULT_MAX; ctrlm_key_code_t validation_key_ = CTRLM_KEY_CODE_INVALID; diff --git a/src/thunder/ctrlm_thunder_plugin.cpp b/src/thunder/ctrlm_thunder_plugin.cpp index 3040fae5..ca6afffc 100644 --- a/src/thunder/ctrlm_thunder_plugin.cpp +++ b/src/thunder/ctrlm_thunder_plugin.cpp @@ -261,6 +261,53 @@ bool ctrlm_thunder_plugin_t::call_plugin(std::string method, void *params, void return(ret); } +bool ctrlm_thunder_plugin_t::call_plugin_boolean(std::string method, void *params, bool *response) { + bool ret = false; + auto clientObject = (JSONRPC::LinkType*)this->plugin_client; + JsonObject *jsonParams = (JsonObject *)params; + if(clientObject) { + if(!method.empty() && jsonParams && response) { + Core::JSON::Boolean jsonResponse; + uint32_t thunderRet = clientObject->Invoke(CALL_TIMEOUT, _T(method), *jsonParams, jsonResponse); + if(thunderRet != Core::ERROR_NONE) { + XLOGD_ERROR("Thunder call failed <%s> <%u>", method.c_str(), thunderRet); + } else { + *response = jsonResponse.Value(); + ret = true; + } + } else { + XLOGD_ERROR("Invalid parameters"); + } + } else { + XLOGD_ERROR("Client is NULL"); + } + return(ret); +} + +bool ctrlm_thunder_plugin_t::call_plugin_string(std::string method, void *params, std::string *response) { + bool ret = false; + auto clientObject = (JSONRPC::LinkType*)this->plugin_client; + JsonObject *jsonParams = (JsonObject *)params; + if(clientObject) { + if(!method.empty() && jsonParams && response) { + Core::JSON::String jsonString; + uint32_t thunderRet = clientObject->Invoke(CALL_TIMEOUT, _T(method), *jsonParams, jsonString); + if(thunderRet != Core::ERROR_NONE) { + XLOGD_ERROR("Thunder call failed <%s> <%u>", method.c_str(), thunderRet); + } else { + *response = jsonString.Value(); + ret = true; + } + } else { + XLOGD_ERROR("Invalid parameters"); + } + } else { + XLOGD_ERROR("Client is NULL"); + } + return(ret); +} + + bool ctrlm_thunder_plugin_t::call_controller(std::string method, void *params, void *response) { bool ret = false; if(this->controller) { diff --git a/src/thunder/ctrlm_thunder_plugin.h b/src/thunder/ctrlm_thunder_plugin.h index f1a3944a..9bf6d780 100644 --- a/src/thunder/ctrlm_thunder_plugin.h +++ b/src/thunder/ctrlm_thunder_plugin.h @@ -105,9 +105,8 @@ class ctrlm_thunder_plugin_t { std::string callsign_with_api(); /** - * This functions is used to get a Thunder Plugin property. - * @param method The method in which the user wants to call. - * @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) + * This function is used to get a Thunder Plugin property. + * @param property The name of the property that the user wants to get * @param response The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) * @param retries The number of retries if the call times out. * @return True if the call succeeded, otherwise False. @@ -115,7 +114,7 @@ class ctrlm_thunder_plugin_t { bool property_get(std::string property, void *response, unsigned int retries = 0); /** - * This functions is used to call a Thunder Plugin method. + * This function is used to call a Thunder Plugin method. * @param method The method in which the user wants to call. * @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) * @param response The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) @@ -125,7 +124,25 @@ class ctrlm_thunder_plugin_t { bool call_plugin(std::string method, void *params, void *response, unsigned int retries = 0); /** - * This functions is used to call a Thunder Controller method. + * This function is used to call a Thunder Plugin method. + * @param method The method in which the user wants to call. + * @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) + * @param response The boolean pointer which will be assigned the response from the call + * @return True if the call succeeded, otherwise False. + */ + bool call_plugin_boolean(std::string method, void *params, bool *response); + + /** + * This function is used to call a Thunder Plugin method. + * @param method The method in which the user wants to call. + * @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) + * @param response The string pointer which will be assigned containing the response from the call. + * @return True if the call succeeded, otherwise False. + */ + bool call_plugin_string(std::string method, void *params, std::string *response); + + /** + * This function is used to call a Thunder Controller method. * @param method The method in which the user wants to call. * @param params The WPEFramework JsonObject containing the parameters for the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) * @param params The WPEFramework JsonObject containing the response from the call. (We can't include WPEFramework headers in controlMgr .h files as their logging macros clash) @@ -164,4 +181,4 @@ class ctrlm_thunder_plugin_t { }; }; -#endif \ No newline at end of file +#endif diff --git a/src/thunder/ctrlm_thunder_plugin_powermanager.cpp b/src/thunder/ctrlm_thunder_plugin_powermanager.cpp index 6e0c83b0..e84fa983 100755 --- a/src/thunder/ctrlm_thunder_plugin_powermanager.cpp +++ b/src/thunder/ctrlm_thunder_plugin_powermanager.cpp @@ -89,16 +89,15 @@ ctrlm_power_state_t ctrlm_thunder_plugin_powermanager_t::get_power_state() { /* root@pioneer-uhd:~# curl --request POST --url http://127.0.0.1:9998/jsonrpc --header 'Content-Type: application/json' --data '{ "jsonrpc": "2.0", "id": 1234567890, "method": "org.rdk.PowerManager.1.getNetworkStandbyMode", "params": {} }' {"jsonrpc":"2.0","id":1234567890,"result":true} */ bool ctrlm_thunder_plugin_powermanager_t::get_networked_standby_mode() { - JsonObject params, response; + JsonObject params; params = {}; bool networked_standby_mode = false; - sem_wait(&this->semaphore); - if(this->call_plugin("getNetworkStandbyMode", (void *)¶ms, (void *)&response)) { - networked_standby_mode = response["result"].Boolean(); + sem_wait(&this->semaphore); + if(this->call_plugin_boolean("getNetworkStandbyMode", (void *)¶ms, &networked_standby_mode)) { XLOGD_DEBUG("networked_standby_mode is %s", networked_standby_mode?"TRUE":"FALSE"); } else { - XLOGD_ERROR("getNetworkedStandbyMode call failed"); + XLOGD_ERROR("getNetworkStandbyMode call failed"); } sem_post(&this->semaphore); @@ -108,19 +107,23 @@ bool ctrlm_thunder_plugin_powermanager_t::get_networked_standby_mode() { /* root@pioneer-uhd:~# curl --request POST --url http://127.0.0.1:9998/jsonrpc --header 'Content-Type: application/json' --data '{ "jsonrpc": "2.0", "id": 1234567890, "method": "org.rdk.PowerManager.1.getLastWakeupReason", "params": {} }' {"jsonrpc":"2.0","id":1234567890,"result":"COLDBOOT"} */ bool ctrlm_thunder_plugin_powermanager_t::get_wakeup_reason_voice() { - JsonObject params, response; + JsonObject params; + std::string response; params = {}; bool wakeup_reason_voice = false; sem_wait(&this->semaphore); - if(this->call_plugin("getLastWakeupReason", (void *)¶ms, (void *)&response)) { - wakeup_reason_voice = (0 == strncmp(response["result"].String().c_str(), "VOICE", 5)); - XLOGD_DEBUG("voice_wakeup is %s", wakeup_reason_voice?"TRUE":"FALSE"); + if(this->call_plugin_string("getLastWakeupReason", (void *)¶ms, &response)) { + if(response == "VOICE") { + wakeup_reason_voice = true; + } } else { XLOGD_ERROR("getLastWakeupReason call failed"); } sem_post(&this->semaphore); + XLOGD_DEBUG("voice_wakeup is %s", wakeup_reason_voice?"TRUE":"FALSE"); + return wakeup_reason_voice; } diff --git a/src/voice/ctrlm_voice_obj.cpp b/src/voice/ctrlm_voice_obj.cpp index 6e4b354f..a6787b1e 100644 --- a/src/voice/ctrlm_voice_obj.cpp +++ b/src/voice/ctrlm_voice_obj.cpp @@ -2252,18 +2252,6 @@ std::string ctrlm_voice_t::voice_stb_data_partner_id_get() const { return(this->partner_id); } -void ctrlm_voice_t::voice_stb_data_experience_set(std::string &experience) { - XLOGD_DEBUG("Experience Tag set to %s", experience.c_str()); - this->experience = experience; - for(const auto &itr : this->endpoints) { - itr->voice_stb_data_experience_set(experience); - } -} - -std::string ctrlm_voice_t::voice_stb_data_experience_get() const { - return(this->experience); -} - std::string ctrlm_voice_t::voice_stb_data_app_id_http_get() const { return(this->prefs.app_id_http); } @@ -2427,12 +2415,6 @@ bool ctrlm_voice_t::voice_session_has_stb_data() { return(false); } #endif -#ifdef AUTH_EXPERIENCE - if(this->experience == "") { - XLOGD_INFO("No experience tag"); - return(false); - } -#endif #ifdef AUTH_SAT_TOKEN if(this->sat_token_required && this->sat_token[0] == '\0') { XLOGD_INFO("No SAT token"); diff --git a/src/voice/ctrlm_voice_obj.h b/src/voice/ctrlm_voice_obj.h index 38699a6b..3ec217b2 100644 --- a/src/voice/ctrlm_voice_obj.h +++ b/src/voice/ctrlm_voice_obj.h @@ -525,8 +525,6 @@ class ctrlm_voice_t { ctrlm_device_type_t voice_stb_data_device_type_get() const; virtual void voice_stb_data_partner_id_set(std::string &partner_id); std::string voice_stb_data_partner_id_get() const; - virtual void voice_stb_data_experience_set(std::string &experience); - std::string voice_stb_data_experience_get() const; std::string voice_stb_data_app_id_http_get() const; std::string voice_stb_data_app_id_ws_get() const; virtual void voice_stb_data_guide_language_set(const char *language); @@ -662,7 +660,6 @@ class ctrlm_voice_t { std::string device_id; ctrlm_device_type_t device_type; std::string partner_id; - std::string experience; char sat_token[XRSR_SAT_TOKEN_LEN_MAX]; bool sat_token_required; bool mtls_required; diff --git a/src/voice/endpoints/ctrlm_voice_endpoint.cpp b/src/voice/endpoints/ctrlm_voice_endpoint.cpp index 7815cd27..1aed8d46 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint.cpp @@ -63,7 +63,6 @@ void ctrlm_voice_endpoint_t::voice_stb_data_account_number_set(std::string &acco void ctrlm_voice_endpoint_t::voice_stb_data_device_id_set(std::string &device_id) {} void ctrlm_voice_endpoint_t::voice_stb_data_device_type_set(ctrlm_device_type_t device_type) {} void ctrlm_voice_endpoint_t::voice_stb_data_partner_id_set(std::string &partner_id) {} -void ctrlm_voice_endpoint_t::voice_stb_data_experience_set(std::string &experience) {} void ctrlm_voice_endpoint_t::voice_stb_data_guide_language_set(const char *language) {} void ctrlm_voice_endpoint_t::voice_stb_data_mask_pii_set(bool enable) {} diff --git a/src/voice/endpoints/ctrlm_voice_endpoint.h b/src/voice/endpoints/ctrlm_voice_endpoint.h index ac881880..3298348f 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint.h +++ b/src/voice/endpoints/ctrlm_voice_endpoint.h @@ -50,7 +50,6 @@ class ctrlm_voice_endpoint_t { virtual void voice_stb_data_device_id_set(std::string &device_id); virtual void voice_stb_data_device_type_set(ctrlm_device_type_t device_type); virtual void voice_stb_data_partner_id_set(std::string &partner_id); - virtual void voice_stb_data_experience_set(std::string &experience); virtual void voice_stb_data_guide_language_set(const char *language); virtual void voice_stb_data_mask_pii_set(bool enable); // End Data Setters diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp b/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp index 1ec3e647..c119ee43 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint_http.cpp @@ -72,14 +72,12 @@ bool ctrlm_voice_endpoint_http_t::open() { std::string device_id = this->voice_obj->voice_stb_data_device_id_get(); std::string partner_id = this->voice_obj->voice_stb_data_partner_id_get(); - std::string experience = this->voice_obj->voice_stb_data_experience_get(); std::string app_id = this->voice_obj->voice_stb_data_app_id_http_get(); std::string language = this->voice_obj->voice_stb_data_guide_language_get().c_str(); xrsv_http_params_t params_http = { .device_id = device_id.c_str(), .partner_id = partner_id.c_str(), - .experience = experience.c_str(), .app_id = app_id.c_str(), .language = language.c_str(), .test_flag = this->voice_obj->voice_stb_data_test_get(), @@ -138,12 +136,6 @@ void ctrlm_voice_endpoint_http_t::voice_stb_data_partner_id_set(std::string &par } } -void ctrlm_voice_endpoint_http_t::voice_stb_data_experience_set(std::string &experience) { - if(this->xrsv_obj_http) { - xrsv_http_update_experience(this->xrsv_obj_http, experience.c_str()); - } -} - void ctrlm_voice_endpoint_http_t::voice_stb_data_guide_language_set(const char *language) { if(this->xrsv_obj_http) { xrsv_http_update_language(this->xrsv_obj_http, language); diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_http.h b/src/voice/endpoints/ctrlm_voice_endpoint_http.h index 9338e20d..79a0d50d 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_http.h +++ b/src/voice/endpoints/ctrlm_voice_endpoint_http.h @@ -32,7 +32,6 @@ class ctrlm_voice_endpoint_http_t : public ctrlm_voice_endpoint_t { public: void voice_stb_data_device_id_set(std::string &device_id); void voice_stb_data_partner_id_set(std::string &partner_id); - void voice_stb_data_experience_set(std::string &experience); void voice_stb_data_guide_language_set(const char *language); void voice_stb_data_pii_mask_set(bool enable); diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp index e5165cd7..9abc27db 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp +++ b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.cpp @@ -86,7 +86,6 @@ bool ctrlm_voice_endpoint_ws_nextgen_t::open() { } std::string device_id = this->voice_obj->voice_stb_data_device_id_get(); std::string partner_id = this->voice_obj->voice_stb_data_partner_id_get(); - std::string experience = this->voice_obj->voice_stb_data_experience_get(); std::string language = this->voice_obj->voice_stb_data_guide_language_get().c_str(); std::string account_number = this->voice_obj->voice_stb_data_account_number_get(); std::string device_mac = ctrlm_device_mac_get(); @@ -96,7 +95,6 @@ bool ctrlm_voice_endpoint_ws_nextgen_t::open() { .device_id = (device_id.empty() == false ? device_id.c_str() : NULL), .account_id = (account_number.empty() == false ? account_number.c_str() : NULL), .partner_id = (partner_id.empty() == false ? partner_id.c_str() : NULL), - .experience = (experience.empty() == false ? experience.c_str() : NULL), .audio_profile = controller_name_to_audio_profile(""), .audio_model = controller_name_to_audio_model(""), .language = language.c_str(), @@ -235,12 +233,6 @@ void ctrlm_voice_endpoint_ws_nextgen_t::voice_stb_data_partner_id_set(std::strin } } -void ctrlm_voice_endpoint_ws_nextgen_t::voice_stb_data_experience_set(std::string &experience) { - if(this->xrsv_obj_ws_nextgen) { - xrsv_ws_nextgen_update_experience(this->xrsv_obj_ws_nextgen, experience.c_str()); - } -} - void ctrlm_voice_endpoint_ws_nextgen_t::voice_stb_data_guide_language_set(const char *language) { if(this->xrsv_obj_ws_nextgen) { xrsv_ws_nextgen_update_language(this->xrsv_obj_ws_nextgen, language); diff --git a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.h b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.h index 16667f2f..218e1d39 100644 --- a/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.h +++ b/src/voice/endpoints/ctrlm_voice_endpoint_ws_nextgen.h @@ -37,7 +37,6 @@ class ctrlm_voice_endpoint_ws_nextgen_t : public ctrlm_voice_endpoint_t { void voice_stb_data_device_id_set(std::string &device_id); void voice_stb_data_device_type_set(ctrlm_device_type_t device_type); void voice_stb_data_partner_id_set(std::string &partner_id); - void voice_stb_data_experience_set(std::string &experience); void voice_stb_data_guide_language_set(const char *language); void voice_stb_data_mask_pii_set(bool enable); From e80abece57248bec09de4da1c4f3a58ad0f4a8dc Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 21 May 2026 19:33:53 -0400 Subject: [PATCH 2/7] RDKEMW-18612: onStatus event to contain remote data from all networks --- src/ctrlm.h | 1 + src/ctrlm_main.cpp | 22 ++++++++++++ src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 47 ++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 376608b3..044b2cbf 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -508,6 +508,7 @@ void ctrlm_update_last_key_info(int controller_id, ctrlm_key_source_t sou ctrlm_irdb_interface_t* ctrlm_main_irdb_get(); ctrlm_auth_t* ctrlm_main_auth_get(); void ctrlm_main_auth_start_poll(); +void ctrlm_main_network_ready_list_get(std::vector *networks); std::string ctrlm_device_id_get(); std::string ctrlm_stb_name_get(); std::string ctrlm_device_mac_get(); diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index 54ddb884..e136f163 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -877,6 +877,28 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { } } +void ctrlm_main_network_ready_list_get(std::vector *networks) { + if (NULL == networks) { + XLOGD_ERROR("NULL parameter"); + return; + } + + if (g_ctrlm.main_thread != g_thread_self ()) { + XLOGD_ERROR("not called from ctrlm_main_thread!!!!!"); + if(!ctrlm_is_production_build()) { + g_assert(0); + } + return; + } + + networks->clear(); + for (auto const &network_it : g_ctrlm.networks) { + if (network_it.second && network_it.second->is_ready()) { + networks->push_back(network_it.second); + } + } +} + void ctrlm_utils_sem_wait(){ sem_wait(&g_ctrlm.ctrlm_utils_sem); } diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 5ed63e70..800c60f5 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -19,6 +19,7 @@ #include "algorithm" #include "ctrlm_rcp_ipc_iarm_thunder.h" +#include "ctrlm.h" #include "ctrlm_network.h" #include "ctrlm_log.h" #include @@ -115,10 +116,52 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n return(false); } - json_t *ret = json_object(); + json_t *ret = json_object(); + json_t *status = json_object(); + json_t *net_type_supported = json_array(); + json_t *remote_array = json_array(); + std::vector networks; + std::vector remotes; + + ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; + ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; + ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; int err = 0; - err |= json_object_set_new_nocheck(ret, STATUS, net_status.to_json()); + ctrlm_main_network_ready_list_get(&networks); + + for (auto const &it : ctrlm_network_types_get()) { + err |= json_array_append_new(net_type_supported, json_integer(it)); + } + for (auto *network : networks) { + ctrlm_rcp_ipc_net_status_t network_status; + network_status.populate_status(*network); + network_status.get_controller_status_list(remotes); + } + for (const auto &remote : remotes) { + err |= json_array_append_new(remote_array, remote.to_json()); + } + // For now default to RF4CE network reporting if available + for (auto *network : networks) { + ctrlm_rcp_ipc_net_status_t network_status; + network_status.populate_status(*network); + + ir_prog_state = network_status.get_ir_prog_state(); + rf_pair_state = network_status.get_rf_pair_state(); + type = network_status.get_type(); + + if (type == CTRLM_NETWORK_TYPE_RF4CE) { + break; + } + } + + err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); + err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); + err |= json_object_set_new_nocheck(status, NET_TYPE, json_integer(type)); + err |= json_object_set_new_nocheck(status, IR_PROG_STATE, json_string(ctrlm_ir_state_str(ir_prog_state))); + err |= json_object_set_new_nocheck(status, PAIRING_STATE, json_string(ctrlm_rf_pair_state_str(rf_pair_state))); + + err |= json_object_set_new_nocheck(ret, STATUS, status); if (err) { XLOGD_ERROR("JSON object set error"); From 0719f7f6276c24b7bc5f8e3906c34a30b9ea0a4c Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 21 May 2026 19:59:20 -0400 Subject: [PATCH 3/7] add call to ctrlm_main to execute handler for all networks instead of giving iarm_thunder access to network pointers --- src/ctrlm.h | 3 ++- src/ctrlm_main.cpp | 30 ++++++++++++++++---------- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 21 ++++++------------ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 044b2cbf..72d2884e 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -53,6 +53,7 @@ class ctrlm_voice_endpoint_t; class ctrlm_irdb_interface_t; class ctrlm_auth_t; class ctrlm_telemetry_t; +class ctrlm_rcp_ipc_net_status_t; typedef enum { CTRLM_THREAD_MONITOR_RESPONSE_DEAD = 0, CTRLM_THREAD_MONITOR_RESPONSE_ALIVE = 1 @@ -508,7 +509,7 @@ void ctrlm_update_last_key_info(int controller_id, ctrlm_key_source_t sou ctrlm_irdb_interface_t* ctrlm_main_irdb_get(); ctrlm_auth_t* ctrlm_main_auth_get(); void ctrlm_main_auth_start_poll(); -void ctrlm_main_network_ready_list_get(std::vector *networks); +std::map ctrlm_main_network_rcu_status_map_get(); std::string ctrlm_device_id_get(); std::string ctrlm_stb_name_get(); std::string ctrlm_device_mac_get(); diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index e136f163..e2682942 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -877,26 +877,34 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { } } -void ctrlm_main_network_ready_list_get(std::vector *networks) { - if (NULL == networks) { - XLOGD_ERROR("NULL parameter"); - return; +static void ctrlm_main_network_handler_execute_for_all(ctrlm_msg_handler_network_t handler, void *data, int size) { + for (auto const &network_it : g_ctrlm.networks) { + if (network_it.second) { + (network_it.second->*handler)(data, size); + } } +} +std::map ctrlm_main_network_rcu_status_map_get() { if (g_ctrlm.main_thread != g_thread_self ()) { XLOGD_ERROR("not called from ctrlm_main_thread!!!!!"); if(!ctrlm_is_production_build()) { g_assert(0); } - return; + return {}; } - networks->clear(); - for (auto const &network_it : g_ctrlm.networks) { - if (network_it.second && network_it.second->is_ready()) { - networks->push_back(network_it.second); - } - } + std::shared_ptr> params = std::make_shared>(); + params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); + + ctrlm_main_queue_msg_get_rcu_status_t msg = {}; + msg.params = params; + + ctrlm_main_network_handler_execute_for_all((ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status, + &msg, + sizeof(msg)); + + return params->get_reply(); } void ctrlm_utils_sem_wait(){ diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 800c60f5..49e73807 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -120,7 +120,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n json_t *status = json_object(); json_t *net_type_supported = json_array(); json_t *remote_array = json_array(); - std::vector networks; + std::map status_map = ctrlm_main_network_rcu_status_map_get(); std::vector remotes; ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; @@ -128,27 +128,20 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; int err = 0; - ctrlm_main_network_ready_list_get(&networks); - for (auto const &it : ctrlm_network_types_get()) { err |= json_array_append_new(net_type_supported, json_integer(it)); } - for (auto *network : networks) { - ctrlm_rcp_ipc_net_status_t network_status; - network_status.populate_status(*network); - network_status.get_controller_status_list(remotes); + for (auto &it : status_map) { + it.second.get_controller_status_list(remotes); } for (const auto &remote : remotes) { err |= json_array_append_new(remote_array, remote.to_json()); } // For now default to RF4CE network reporting if available - for (auto *network : networks) { - ctrlm_rcp_ipc_net_status_t network_status; - network_status.populate_status(*network); - - ir_prog_state = network_status.get_ir_prog_state(); - rf_pair_state = network_status.get_rf_pair_state(); - type = network_status.get_type(); + for (auto &it : status_map) { + ir_prog_state = it.second.get_ir_prog_state(); + rf_pair_state = it.second.get_rf_pair_state(); + type = it.second.get_type(); if (type == CTRLM_NETWORK_TYPE_RF4CE) { break; From 669af4df9787e06a00959da94ae32241f1f56ec5 Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Fri, 22 May 2026 16:35:48 +0000 Subject: [PATCH 4/7] irProgState, pairingState, and netType set from the network triggering the event --- src/ipc/ctrlm_rcp_ipc_event.cpp | 4 ++-- src/ipc/ctrlm_rcp_ipc_event.h | 4 ++-- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 14 ++++---------- 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/ipc/ctrlm_rcp_ipc_event.cpp b/src/ipc/ctrlm_rcp_ipc_event.cpp index 510be650..43324919 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.cpp +++ b/src/ipc/ctrlm_rcp_ipc_event.cpp @@ -135,12 +135,12 @@ void ctrlm_rcp_ipc_net_status_t::populate_status(const ctrlm_obj_network_t &netw } } -ctrlm_ir_state_t ctrlm_rcp_ipc_net_status_t::get_ir_prog_state(void) +ctrlm_ir_state_t ctrlm_rcp_ipc_net_status_t::get_ir_prog_state(void) const { return irdb_state_; } -ctrlm_rf_pair_state_t ctrlm_rcp_ipc_net_status_t::get_rf_pair_state(void) +ctrlm_rf_pair_state_t ctrlm_rcp_ipc_net_status_t::get_rf_pair_state(void) const { return pair_state_; } diff --git a/src/ipc/ctrlm_rcp_ipc_event.h b/src/ipc/ctrlm_rcp_ipc_event.h index e2c36e7c..d848294d 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.h +++ b/src/ipc/ctrlm_rcp_ipc_event.h @@ -120,8 +120,8 @@ class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t ctrlm_network_type_t get_type() const { return net_type_; } void populate_status(const ctrlm_obj_network_t &network); - ctrlm_ir_state_t get_ir_prog_state(void); - ctrlm_rf_pair_state_t get_rf_pair_state(void); + ctrlm_ir_state_t get_ir_prog_state(void) const; + ctrlm_rf_pair_state_t get_rf_pair_state(void) const; void get_controller_status_list(std::vector &list); private: diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 49e73807..e81a770f 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -137,16 +137,10 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n for (const auto &remote : remotes) { err |= json_array_append_new(remote_array, remote.to_json()); } - // For now default to RF4CE network reporting if available - for (auto &it : status_map) { - ir_prog_state = it.second.get_ir_prog_state(); - rf_pair_state = it.second.get_rf_pair_state(); - type = it.second.get_type(); - - if (type == CTRLM_NETWORK_TYPE_RF4CE) { - break; - } - } + + ir_prog_state = net_status.get_ir_prog_state(); + rf_pair_state = net_status.get_rf_pair_state(); + type = net_status.get_type(); err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); From f920202bf5d00ab866271d287d40ec61e1e41d8b Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 28 May 2026 11:09:15 -0400 Subject: [PATCH 5/7] add json builder helper function so that onStatus and getNetStatus can share code --- src/ctrlm.h | 1 + src/ctrlm_main.cpp | 2 +- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 221 +++++++++++++------------ src/ipc/ctrlm_rcp_ipc_iarm_thunder.h | 4 + 4 files changed, 117 insertions(+), 111 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 72d2884e..62687452 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "ctrlm_hal.h" #include "ctrlm_hal_rf4ce.h" #include "ctrlm_hal_ble.h" diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index e2682942..319acc4e 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -879,7 +879,7 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { static void ctrlm_main_network_handler_execute_for_all(ctrlm_msg_handler_network_t handler, void *data, int size) { for (auto const &network_it : g_ctrlm.networks) { - if (network_it.second) { + if (network_it.second && network_it.second->is_ready()) { (network_it.second->*handler)(data, size); } } diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index e81a770f..75a743bd 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -104,28 +104,16 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::is_thunder_device_update_enabled() const return (thunder_device_update_enabled_); } -bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &net_status) const +json_t *ctrlm_rcp_ipc_iarm_thunder_t::build_rcu_status_json( + const std::map &status_map, + ctrlm_ir_state_t ir_prog_state, + ctrlm_rf_pair_state_t rf_pair_state, + ctrlm_network_type_t type) const { - if (!is_running(atomic_running_)) { - XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); - return(false); - } - - if (net_status.get_api_revision() != CTRLM_MAIN_IARM_BUS_API_REVISION) { - XLOGD_ERROR("Wrong ctrlm API revision - should be %d, event is %d", CTRLM_MAIN_IARM_BUS_API_REVISION, net_status.get_api_revision()); - return(false); - } - - json_t *ret = json_object(); json_t *status = json_object(); json_t *net_type_supported = json_array(); json_t *remote_array = json_array(); - std::map status_map = ctrlm_main_network_rcu_status_map_get(); std::vector remotes; - - ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; - ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; - ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; int err = 0; for (auto const &it : ctrlm_network_types_get()) { @@ -137,10 +125,6 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n for (const auto &remote : remotes) { err |= json_array_append_new(remote_array, remote.to_json()); } - - ir_prog_state = net_status.get_ir_prog_state(); - rf_pair_state = net_status.get_rf_pair_state(); - type = net_status.get_type(); err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); @@ -148,8 +132,35 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n err |= json_object_set_new_nocheck(status, IR_PROG_STATE, json_string(ctrlm_ir_state_str(ir_prog_state))); err |= json_object_set_new_nocheck(status, PAIRING_STATE, json_string(ctrlm_rf_pair_state_str(rf_pair_state))); - err |= json_object_set_new_nocheck(ret, STATUS, status); + if (err) { + XLOGD_ERROR("JSON object set error"); + json_decref(status); + return nullptr; + } + return status; +} +bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &net_status) const +{ + if (!is_running(atomic_running_)) { + XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); + return(false); + } + + if (net_status.get_api_revision() != CTRLM_MAIN_IARM_BUS_API_REVISION) { + XLOGD_ERROR("Wrong ctrlm API revision - should be %d, event is %d", CTRLM_MAIN_IARM_BUS_API_REVISION, net_status.get_api_revision()); + return(false); + } + + const std::map status_map = ctrlm_main_network_rcu_status_map_get(); + + json_t *status = build_rcu_status_json(status_map, net_status.get_ir_prog_state(), net_status.get_rf_pair_state(), net_status.get_type()); + if (status == nullptr) { + return(false); + } + + json_t *ret = json_object(); + int err = json_object_set_new_nocheck(ret, STATUS, status); if (err) { XLOGD_ERROR("JSON object set error"); json_decref(ret); @@ -159,6 +170,84 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_RCU_STATUS, ret); } + +IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) +{ + XLOGD_INFO(""); + + if (!is_running(atomic_running_)) { + XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); + return(IARM_RESULT_INVALID_STATE); + } + + ctrlm_main_iarm_call_json_t *call_data = static_cast(arg); + + if (!call_data || call_data->api_revision != CTRLM_MAIN_IARM_BUS_API_REVISION) { + XLOGD_ERROR("NULL parameter"); + return(IARM_RESULT_INVALID_PARAM); + } + + json_t *payload = json_loads(call_data->payload, JSON_DECODE_ANY, NULL); + json_config config(payload); + + if (!payload || !config.current_object_get()) { + XLOGD_ERROR("Bad payload from call data"); + return(IARM_RESULT_INVALID_PARAM); + } + + + std::shared_ptr> params = std::make_shared>(); + params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); + + sync_send_netw_handler_to_main_queue_new, + ctrlm_main_queue_msg_get_rcu_status_t> + (params, + (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status); + + + std::map status_map = params->get_reply(); + + + ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; + ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; + ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; + + // For now default to RF4CE network reporting if available + for (auto &it : status_map) { + ir_prog_state = it.second.get_ir_prog_state(); + rf_pair_state = it.second.get_rf_pair_state(); + type = it.second.get_type(); + + if (type == CTRLM_NETWORK_TYPE_RF4CE) { + break; + } + } + + json_t *status = build_rcu_status_json(status_map, ir_prog_state, rf_pair_state, type); + if (status == nullptr) { + return(IARM_RESULT_INVALID_STATE); + } + + json_t *ret = json_object(); + + int err = 0; + err |= json_object_set_new_nocheck(ret, STATUS, status); + err |= json_object_set_new_nocheck(ret, SUCCESS, json_boolean(params->get_result())); + + if (err) { + XLOGD_ERROR("JSON object set error"); + json_decref(ret); + return(IARM_RESULT_INVALID_STATE); + } + + if (!ctrlm_json_to_iarm_call_data_result(ret, call_data)) { + json_decref(ret); + return(IARM_RESULT_INVALID_STATE); + } + + return(IARM_RESULT_SUCCESS); +} + bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation_status(const ctrlm_rcp_ipc_validation_status_t &validation_status) const { if (!is_running(atomic_running_)) { @@ -403,94 +492,6 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::stop_pairing(void *arg) return(IARM_RESULT_SUCCESS); } -IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) -{ - XLOGD_INFO(""); - - if (!is_running(atomic_running_)) { - XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); - return(IARM_RESULT_INVALID_STATE); - } - - ctrlm_main_iarm_call_json_t *call_data = static_cast(arg); - - if (!call_data || call_data->api_revision != CTRLM_MAIN_IARM_BUS_API_REVISION) { - XLOGD_ERROR("NULL parameter"); - return(IARM_RESULT_INVALID_PARAM); - } - - json_t *payload = json_loads(call_data->payload, JSON_DECODE_ANY, NULL); - json_config config(payload); - - if (!payload || !config.current_object_get()) { - XLOGD_ERROR("Bad payload from call data"); - return(IARM_RESULT_INVALID_PARAM); - } - - - std::shared_ptr> params = std::make_shared>(); - params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); - - sync_send_netw_handler_to_main_queue_new, - ctrlm_main_queue_msg_get_rcu_status_t> - (params, - (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status); - - json_t *ret = json_object(); - json_t *status = json_object(); - json_t *net_type_supported = json_array(); - json_t *remote_array = json_array(); - - std::map status_map = params->get_reply(); - std::vector remotes; - - ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; - ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; - ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; - int err = 0; - - for (auto const &it : ctrlm_network_types_get()) { - err |= json_array_append_new(net_type_supported, json_integer(it)); - } - for (auto &it : status_map) { - it.second.get_controller_status_list(remotes); - } - for (const auto &remote : remotes) { - err |= json_array_append_new(remote_array, remote.to_json()); - } - // For now default to RF4CE network reporting if available - for (auto &it : status_map) { - ir_prog_state = it.second.get_ir_prog_state(); - rf_pair_state = it.second.get_rf_pair_state(); - type = it.second.get_type(); - - if (type == CTRLM_NETWORK_TYPE_RF4CE) { - break; - } - } - - err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); - err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); - err |= json_object_set_new_nocheck(status, NET_TYPE, json_integer(type)); - err |= json_object_set_new_nocheck(status, IR_PROG_STATE, json_string(ctrlm_ir_state_str(ir_prog_state))); - err |= json_object_set_new_nocheck(status, PAIRING_STATE, json_string(ctrlm_rf_pair_state_str(rf_pair_state))); - - err |= json_object_set_new_nocheck(ret, STATUS, status); - err |= json_object_set_new_nocheck(ret, SUCCESS, json_boolean(params->get_result())); - - if (err) { - XLOGD_ERROR("JSON object set error"); - json_decref(ret); - return(IARM_RESULT_INVALID_STATE); - } - - if (!ctrlm_json_to_iarm_call_data_result(ret, call_data)) { - json_decref(ret); - return(IARM_RESULT_INVALID_STATE); - } - - return(IARM_RESULT_SUCCESS); -} IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_last_keypress(void *arg) { diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h index 384df5ae..b3ef5899 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h @@ -63,6 +63,10 @@ class ctrlm_rcp_ipc_iarm_thunder_t : public ctrlm_ipc_iarm_t static bool thunder_device_update_enabled_; void configure(void); + json_t *build_rcu_status_json(const std::map &status_map, + ctrlm_ir_state_t ir_prog_state, + ctrlm_rf_pair_state_t rf_pair_state, + ctrlm_network_type_t type) const; public: ~ctrlm_rcp_ipc_iarm_thunder_t(); From d1d5fe323c1c74ceda750d8446a008167dcf52bd Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 28 May 2026 11:42:46 -0400 Subject: [PATCH 6/7] apply some copilot suggestions --- src/ctrlm.h | 1 + src/ipc/ctrlm_rcp_ipc_event.cpp | 2 +- src/ipc/ctrlm_rcp_ipc_event.h | 2 +- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 6 +++++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 62687452..1518f0e2 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -35,6 +35,7 @@ #include "ctrlm_ipc_rcu.h" #include "ctrlm_ipc_voice.h" #include "ctrlm_ipc_device_update.h" +#include "ctrlm_rcp_ipc_event.h" #include "ctrlm_irdb_interface.h" #include "libIBus.h" #include "safec_lib.h" diff --git a/src/ipc/ctrlm_rcp_ipc_event.cpp b/src/ipc/ctrlm_rcp_ipc_event.cpp index 43324919..7ed3d43d 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.cpp +++ b/src/ipc/ctrlm_rcp_ipc_event.cpp @@ -145,7 +145,7 @@ ctrlm_rf_pair_state_t ctrlm_rcp_ipc_net_status_t::get_rf_pair_state(void) const return pair_state_; } -void ctrlm_rcp_ipc_net_status_t::get_controller_status_list(std::vector &list) +void ctrlm_rcp_ipc_net_status_t::get_controller_status_list(std::vector &list) const { for (const auto &status : controller_status_list_) { list.push_back(status); diff --git a/src/ipc/ctrlm_rcp_ipc_event.h b/src/ipc/ctrlm_rcp_ipc_event.h index d848294d..03b29da4 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.h +++ b/src/ipc/ctrlm_rcp_ipc_event.h @@ -122,7 +122,7 @@ class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t void populate_status(const ctrlm_obj_network_t &network); ctrlm_ir_state_t get_ir_prog_state(void) const; ctrlm_rf_pair_state_t get_rf_pair_state(void) const; - void get_controller_status_list(std::vector &list); + void get_controller_status_list(std::vector &list) const; private: uint8_t api_revision_ = 0; diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 75a743bd..d075b52d 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -190,8 +190,12 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) json_t *payload = json_loads(call_data->payload, JSON_DECODE_ANY, NULL); json_config config(payload); - if (!payload || !config.current_object_get()) { + if (!payload) { + XLOGD_ERROR("payload NULL"); + return(IARM_RESULT_INVALID_PARAM); + } else if (!config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } From 6930cec0d9bc1607bac4f4a7ab58a64c3a747c30 Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Fri, 29 May 2026 16:21:49 -0400 Subject: [PATCH 7/7] some more copilot review comments --- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 7 +------ src/ipc/ctrlm_rcp_ipc_iarm_thunder.h | 1 + 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index d075b52d..0385e7e7 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -238,17 +238,12 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) err |= json_object_set_new_nocheck(ret, STATUS, status); err |= json_object_set_new_nocheck(ret, SUCCESS, json_boolean(params->get_result())); - if (err) { + if (err || !ctrlm_json_to_iarm_call_data_result(ret, call_data)) { XLOGD_ERROR("JSON object set error"); json_decref(ret); return(IARM_RESULT_INVALID_STATE); } - if (!ctrlm_json_to_iarm_call_data_result(ret, call_data)) { - json_decref(ret); - return(IARM_RESULT_INVALID_STATE); - } - return(IARM_RESULT_SUCCESS); } diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h index b3ef5899..41afff26 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "ctrlm_ipc_iarm.h" #include "ctrlm_ipc.h" #include "ctrlm_utils.h"