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/4] 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 02f9a1a75bebe61ef792cce09dd84b2366b00060 Mon Sep 17 00:00:00 2001 From: klu339 Date: Thu, 28 May 2026 17:22:42 -0400 Subject: [PATCH 2/4] Init commit --- include/ctrlm_hal_ble.h | 1 + src/ble/ctrlm_ble_controller.cpp | 30 ++++++++++- src/ble/ctrlm_ble_network.cpp | 29 ++++++++++ src/ble/ctrlm_ble_rcu_interface.cpp | 11 ++-- src/irdb/ctrlm_irdb_interface.cpp | 57 ++++++++++++++++++++ src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp | 22 ++++++++ src/telemetry/ctrlm_telemetry_markers.h | 31 +++++++++++ 7 files changed, 175 insertions(+), 6 deletions(-) diff --git a/include/ctrlm_hal_ble.h b/include/ctrlm_hal_ble.h index f9cb6a14..06bac3b9 100644 --- a/include/ctrlm_hal_ble.h +++ b/include/ctrlm_hal_ble.h @@ -128,6 +128,7 @@ typedef struct { typedef struct { ctrlm_rf_pair_state_t state; ctrlm_ir_state_t ir_state; + char ir_fail_reason[CTRLM_MAX_PARAM_STR_LEN]; bool is_pairing; int pairing_code; ctrlm_hal_ble_RcuProperty_t property_updated; diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index f1a87c22..b4a28ba2 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -31,6 +31,7 @@ #include "ctrlm_controller.h" #include "ctrlm_hal_ip.h" #include "blercu/bleservices/blercuupgradeservice.h" +#include "ctrlm_telemetry_event.h" #include #include @@ -534,28 +535,53 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas if (irdb == NULL) { XLOGD_ERROR("IRDB interface is NULL!!!"); +#ifdef TELEMETRY_SUPPORT + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "0,0x%02X,unknown,0x00,0", vendor_support_bitmask); + t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); +#endif return; } ctrlm_irdb_vendor_info_t rcu_vendor_info{}; rcu_vendor_info.rcu_support_bitmask = vendor_support_bitmask; - if (!irdb->set_vendor(rcu_vendor_info)) { + bool set_result = irdb->set_vendor(rcu_vendor_info); + if (!set_result) { XLOGD_ERROR("Failed to set IRDB vendor info for controller <%s> with bitmask <0x%X>.", ieee_address_get().to_string().c_str(), vendor_support_bitmask); } ctrlm_irdb_vendor_info_t vendor_info{}; if (irdb->get_vendor_info(vendor_info)) { - if (isSupportedIrdb(vendor_info)) { + bool supported = isSupportedIrdb(vendor_info); + if (supported) { XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which DOES support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, vendor_info.name.c_str()); } else { XLOGD_ERROR("Controller <%s> IRDBs supported bitmask = <0x%X>, which does NOT support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, vendor_info.name.c_str()); } +#ifdef TELEMETRY_SUPPORT + { + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "%d,0x%02X,%s,0x%02X,%d", + (int)set_result, vendor_support_bitmask, + vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, + (int)supported); + t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); + } +#endif } else { XLOGD_WARN("Controller <%s> IRDBs supported bitmask = <0x%X>, couldn't retrieve IRDB plugin vendor info.", ieee_address_get().to_string().c_str(), vendor_support_bitmask); +#ifdef TELEMETRY_SUPPORT + { + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "%d,0x%02X,unknown,0x00,0", + (int)set_result, vendor_support_bitmask); + t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); + } +#endif } } diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 57cdb6da..bc4cf227 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -47,6 +47,7 @@ #include #include #include "ctrlm_rcp_ipc_iarm_thunder.h" +#include "ctrlm_telemetry_event.h" using namespace std; @@ -775,6 +776,16 @@ void ctrlm_obj_network_ble_t::req_process_program_ir_codes(void *data, int size) XLOGD_ERROR("Controller doesn't exist!"); } else if (!controllers_[controller_id]->isSupportedIrdb(dqm->vendor_info)) { XLOGD_ERROR("Unsupported IRDB - not continuing with ir code download!"); +#ifdef TELEMETRY_SUPPORT + { + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "0x%02X,%s,0x%02X", + controllers_[controller_id]->getSupportedIrdbs(), + dqm->vendor_info.name.c_str(), + dqm->vendor_info.rcu_support_bitmask); + t2_event_s((char*)MARKER_IRDB_PROGRAM_UNSUPPORTED, t2_buf); + } +#endif } else { if(dqm->ir_codes) { @@ -1699,6 +1710,24 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) { case CTRLM_HAL_BLE_PROPERTY_IR_STATE: XLOGD_TELEMETRY("BLE remote IR programming state changed to <%s>", ctrlm_ir_state_str(dqm->ir_state)); ir_state_ = dqm->ir_state; +#ifdef TELEMETRY_SUPPORT + { + ctrlm_irdb_interface_t *irdb = ctrlm_main_irdb_get(); + ctrlm_irdb_vendor_info_t vendor_info{}; + if (irdb) { irdb->get_vendor_info(vendor_info); } + char t2_buf[256]; + if (dqm->ir_state == CTRLM_IR_STATE_COMPLETE) { + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", + vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); + t2_event_s((char*)MARKER_IRDB_PROGRAM_SUCCESS, t2_buf); + } else if (dqm->ir_state == CTRLM_IR_STATE_FAILED) { + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X,%s", + vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, + dqm->ir_fail_reason); + t2_event_s((char*)MARKER_IRDB_PROGRAM_FAIL, t2_buf); + } + } +#endif break; default: { diff --git a/src/ble/ctrlm_ble_rcu_interface.cpp b/src/ble/ctrlm_ble_rcu_interface.cpp index f90cdc67..cdb4e5f3 100644 --- a/src/ble/ctrlm_ble_rcu_interface.cpp +++ b/src/ble/ctrlm_ble_rcu_interface.cpp @@ -1173,9 +1173,12 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, success = true; } - ctrlm_hal_ble_RcuStatusData_t params; + ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_COMPLETE : CTRLM_IR_STATE_FAILED; + if (!success) { + snprintf(params.ir_fail_reason, CTRLM_MAX_PARAM_STR_LEN, "%s", reply->errorMessage().c_str()); + } m_rcuStatusChangedSlots.invoke(¶ms); }; @@ -1241,7 +1244,7 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, success = false; } - ctrlm_hal_ble_RcuStatusData_t params; + ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_WAITING : CTRLM_IR_STATE_FAILED; m_rcuStatusChangedSlots.invoke(¶ms); @@ -1265,7 +1268,7 @@ bool ctrlm_ble_rcu_interface_t::eraseIrSignals(uint64_t ieee_address) success = true; } - ctrlm_hal_ble_RcuStatusData_t params; + ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_COMPLETE : CTRLM_IR_STATE_FAILED; m_rcuStatusChangedSlots.invoke(¶ms); @@ -1289,7 +1292,7 @@ bool ctrlm_ble_rcu_interface_t::eraseIrSignals(uint64_t ieee_address) success = false; } - ctrlm_hal_ble_RcuStatusData_t params; + ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_WAITING : CTRLM_IR_STATE_FAILED; m_rcuStatusChangedSlots.invoke(¶ms); diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 01fa6588..1dc07be4 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -21,6 +21,7 @@ #include "ctrlm_network.h" #include "ctrlm_log.h" #include "ctrlm_irdb_stub.h" +#include "ctrlm_telemetry_event.h" #include "ctrlm_ipc_iarm.h" #include "ctrlm_irdb_ipc_iarm_thunder.h" @@ -421,6 +422,16 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ std::unique_lock guard(m_mutex); bool ret = false; + // Retrieve vendor info now while mutex is held (avoids recursive lock via get_vendor_info()) + ctrlm_irdb_vendor_info_t t2_vendor_info{}; + if (g_irdb.pluginGetVendorInfo) { + (*g_irdb.pluginGetVendorInfo)(t2_vendor_info); + } + bool t2_had_edid_data = false; + bool t2_had_cec_data = false; + bool t2_used_edid = false; + bool t2_used_cec = false; + #if defined(CTRLM_THUNDER) if(m_platform_tv == false) { // Check EDID data @@ -428,6 +439,7 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(g_irdb.display_settings) { g_irdb.display_settings->get_edid(edid); if(edid.size() > 0) { + t2_had_edid_data = true; ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -436,14 +448,21 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; + t2_used_edid = true; } else { XLOGD_ERROR("edid dev type invalid"); } } else { XLOGD_ERROR("no codes for edid data"); +#ifdef TELEMETRY_SUPPORT + t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_EDID_NO_CODES, 1); +#endif } } else { XLOGD_ERROR("Failed getting codes by edid"); +#ifdef TELEMETRY_SUPPORT + t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_EDID_ERROR, 1); +#endif } } else { XLOGD_ERROR("No EDID data"); @@ -456,6 +475,7 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ std::vector cec_devices; g_irdb.cec_source->get_cec_devices(cec_devices); if(cec_devices.size() > 0) { + t2_had_cec_data = true; for(auto &itr : cec_devices) { ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -465,14 +485,21 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; + t2_used_cec = true; } else { XLOGD_ERROR("cec dev type invalid"); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); +#ifdef TELEMETRY_SUPPORT + t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES, (char*)itr.osd.c_str()); +#endif } } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); +#ifdef TELEMETRY_SUPPORT + t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_ERROR, (char*)itr.osd.c_str()); +#endif } } } else { @@ -481,6 +508,11 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ } else { XLOGD_ERROR("cec is NULL"); } +#ifdef TELEMETRY_SUPPORT + if (!t2_had_edid_data && !t2_had_cec_data) { + t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_NO_DATA, 1); + } +#endif } else { if(g_irdb.av_input) { // Check Infoframe data @@ -495,6 +527,7 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; + t2_used_edid = true; } else { XLOGD_ERROR("port %d infoframe dev type invalid", itr.first); } @@ -516,6 +549,7 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ std::vector cec_devices; g_irdb.cec_sink->get_cec_devices(cec_devices); if(cec_devices.size() > 0) { + t2_had_cec_data = true; for(auto &itr : cec_devices) { ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -524,14 +558,21 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; + t2_used_cec = true; } else { XLOGD_ERROR("cec dev type invalid"); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); +#ifdef TELEMETRY_SUPPORT + t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES, (char*)itr.osd.c_str()); +#endif } } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); +#ifdef TELEMETRY_SUPPORT + t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_ERROR, (char*)itr.osd.c_str()); +#endif } } } else { @@ -557,6 +598,22 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ codes[CTRLM_IRDB_DEV_TYPE_AVR].erase( unique( codes[CTRLM_IRDB_DEV_TYPE_AVR].begin(), codes[CTRLM_IRDB_DEV_TYPE_AVR].end() ), codes[CTRLM_IRDB_DEV_TYPE_AVR].end() ); } +#ifdef TELEMETRY_SUPPORT + { + size_t tv_count = codes.count(CTRLM_IRDB_DEV_TYPE_TV) ? codes.at(CTRLM_IRDB_DEV_TYPE_TV).size() : 0; + size_t avr_count = codes.count(CTRLM_IRDB_DEV_TYPE_AVR) ? codes.at(CTRLM_IRDB_DEV_TYPE_AVR).size() : 0; + const char *sources = "none"; + if (t2_used_edid && t2_used_cec) sources = "edid+cec"; + else if (t2_used_edid) sources = "edid"; + else if (t2_used_cec) sources = "cec"; + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X,%s,%zu,%zu", + t2_vendor_info.name.c_str(), t2_vendor_info.rcu_support_bitmask, + sources, tv_count, avr_count); + t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_RESULT, t2_buf); + } +#endif + return(ret); } diff --git a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp index 48b7c29a..d2d78b9c 100644 --- a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp +++ b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp @@ -23,6 +23,7 @@ #include "ctrlm_log.h" #include "json_config.h" #include "ctrlm_utils.h" +#include "ctrlm_telemetry_event.h" namespace { constexpr char const* NET_TYPE = "netType"; @@ -145,6 +146,13 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_manufacturers(void *arg) { if(irdb->get_manufacturers(mans, dev_type, manufacturer) == false ) { XLOGD_ERROR("Failed getting manufacturers"); success = false; +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); + t2_event_s((char*)MARKER_IRDB_MANUAL_MFR_ERROR, t2_buf); +#endif } else { for(const auto &itr : mans) { json_array_append_new(manufacturers, json_string(itr.c_str())); @@ -219,6 +227,13 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_models(void *arg) { if(irdb->get_models(mods, dev_type, manufacturer, model) == false ) { XLOGD_ERROR("Failed getting models"); success = false; +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); + t2_event_s((char*)MARKER_IRDB_MANUAL_MODEL_ERROR, t2_buf); +#endif } else { for(const auto &itr : mods) { json_array_append_new(models, json_string(itr.c_str())); @@ -359,6 +374,13 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_irdb_entry_ids(void *arg) { if(irdb->get_irdb_entry_ids(cds, dev_type, manufacturer, model) == false) { XLOGD_ERROR("Failed getting codes"); success = false; +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); + t2_event_s((char*)MARKER_IRDB_MANUAL_CODES_ERROR, t2_buf); +#endif } else { for(const auto &itr : cds) { json_array_append_new(codes, json_string(itr.c_str())); diff --git a/src/telemetry/ctrlm_telemetry_markers.h b/src/telemetry/ctrlm_telemetry_markers.h index 23c0f775..4612400b 100644 --- a/src/telemetry/ctrlm_telemetry_markers.h +++ b/src/telemetry/ctrlm_telemetry_markers.h @@ -125,4 +125,35 @@ // End Voice Markers // +// +// IRDB Markers +// + +// Autolookup Markers +// All _accum markers are aggregated by the T2 platform within each reporting window. + +#define MARKER_IRDB_AUTOLOOKUP_RESULT "ctrlm.irdb.autolookup.result_accum" // format: ,,,,; sources: none|edid|cec|edid+cec +#define MARKER_IRDB_AUTOLOOKUP_NO_DATA "ctrlm.irdb.autolookup.no_data_accum" // value: 1 (count); fires when neither EDID nor CEC discovery data is available +#define MARKER_IRDB_AUTOLOOKUP_EDID_NO_CODES "ctrlm.irdb.autolookup.edid.no_codes_accum" // value: 1 (count); EDID present but plugin returned empty code list +#define MARKER_IRDB_AUTOLOOKUP_EDID_ERROR "ctrlm.irdb.autolookup.edid.error_accum" // value: 1 (count); pluginGetCodesByEdid returned false +#define MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES "ctrlm.irdb.autolookup.cec.no_codes_accum" // payload: OSD device name; plugin returned empty list for this CEC device +#define MARKER_IRDB_AUTOLOOKUP_CEC_ERROR "ctrlm.irdb.autolookup.cec.error_accum" // payload: OSD device name; pluginGetCodesByCec returned false for this CEC device + +// Manual Lookup Markers +#define MARKER_IRDB_MANUAL_MFR_ERROR "ctrlm.irdb.manual.mfr.error_accum" // format: ,; get_manufacturers plugin returned false +#define MARKER_IRDB_MANUAL_MODEL_ERROR "ctrlm.irdb.manual.model.error_accum" // format: ,; get_models plugin returned false +#define MARKER_IRDB_MANUAL_CODES_ERROR "ctrlm.irdb.manual.codes.error_accum" // format: ,; get_irdb_entry_ids plugin returned false + +// Programming Markers +#define MARKER_IRDB_PROGRAM_SUCCESS "ctrlm.irdb.program.success_accum" // format: , +#define MARKER_IRDB_PROGRAM_FAIL "ctrlm.irdb.program.fail_accum" // format: ,, +#define MARKER_IRDB_PROGRAM_UNSUPPORTED "ctrlm.irdb.program.unsupported_accum" // format: ,, + +// Vendor Set Marker +#define MARKER_IRDB_VENDOR_SET "ctrlm.irdb.vendor_set_accum" // format: ,,,, + +// +// End IRDB Markers +// + #endif From d774243eb30c5ae1d313ab4f844493e4a3781498 Mon Sep 17 00:00:00 2001 From: klu339 Date: Wed, 3 Jun 2026 21:22:07 +0000 Subject: [PATCH 3/4] RDKEMW-16966: T2 IRDB Programming --- include/ctrlm_hal_ble.h | 2 +- src/ble/ctrlm_ble_controller.cpp | 35 +++--- src/ble/ctrlm_ble_network.cpp | 49 +++++--- src/ble/ctrlm_ble_rcu_interface.cpp | 11 +- src/irdb/ctrlm_irdb_interface.cpp | 119 +++++++++++------- src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp | 48 +++---- src/telemetry/ctrlm_telemetry_markers.h | 25 +--- .../ctrlm_thunder_plugin_display_settings.cpp | 2 +- 8 files changed, 160 insertions(+), 131 deletions(-) diff --git a/include/ctrlm_hal_ble.h b/include/ctrlm_hal_ble.h index 06bac3b9..0f84fc64 100644 --- a/include/ctrlm_hal_ble.h +++ b/include/ctrlm_hal_ble.h @@ -128,11 +128,11 @@ typedef struct { typedef struct { ctrlm_rf_pair_state_t state; ctrlm_ir_state_t ir_state; - char ir_fail_reason[CTRLM_MAX_PARAM_STR_LEN]; bool is_pairing; int pairing_code; ctrlm_hal_ble_RcuProperty_t property_updated; ctrlm_hal_ble_rcu_data_t rcu_data; + char ir_fail_reason[CTRLM_MAX_PARAM_STR_LEN]; } ctrlm_hal_ble_RcuStatusData_t; typedef struct { diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index b4a28ba2..864d062c 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -537,8 +537,9 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas XLOGD_ERROR("IRDB interface is NULL!!!"); #ifdef TELEMETRY_SUPPORT char t2_buf[256]; - snprintf(t2_buf, sizeof(t2_buf), "0,0x%02X,unknown,0x00,0", vendor_support_bitmask); - t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); + snprintf(t2_buf, sizeof(t2_buf), "[0,0x%02X,\"unknown\",0x00,0]", vendor_support_bitmask); + ctrlm_telemetry_event_t ev(MARKER_IRDB_VENDOR_SET, t2_buf); + ev.event(); #endif return; } @@ -552,8 +553,11 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas } ctrlm_irdb_vendor_info_t vendor_info{}; + vendor_info.name = "unknown"; + vendor_info.rcu_support_bitmask = 0xFF; + bool supported = false; if (irdb->get_vendor_info(vendor_info)) { - bool supported = isSupportedIrdb(vendor_info); + supported = isSupportedIrdb(vendor_info); if (supported) { XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which DOES support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, vendor_info.name.c_str()); @@ -561,28 +565,19 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas XLOGD_ERROR("Controller <%s> IRDBs supported bitmask = <0x%X>, which does NOT support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, vendor_info.name.c_str()); } -#ifdef TELEMETRY_SUPPORT - { - char t2_buf[256]; - snprintf(t2_buf, sizeof(t2_buf), "%d,0x%02X,%s,0x%02X,%d", - (int)set_result, vendor_support_bitmask, - vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, - (int)supported); - t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); - } -#endif } else { XLOGD_WARN("Controller <%s> IRDBs supported bitmask = <0x%X>, couldn't retrieve IRDB plugin vendor info.", ieee_address_get().to_string().c_str(), vendor_support_bitmask); + } #ifdef TELEMETRY_SUPPORT - { - char t2_buf[256]; - snprintf(t2_buf, sizeof(t2_buf), "%d,0x%02X,unknown,0x00,0", - (int)set_result, vendor_support_bitmask); - t2_event_s((char*)MARKER_IRDB_VENDOR_SET, t2_buf); - } + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "[%d,0x%02X,\"%s\",0x%02X,%d]", + (int)set_result,vendor_support_bitmask, + vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, + (int)supported); + ctrlm_telemetry_event_t ev(MARKER_IRDB_VENDOR_SET, t2_buf); + ev.event(); #endif - } } uint8_t ctrlm_obj_controller_ble_t::getSupportedIrdbs() const { diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index bc4cf227..dbf738ca 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -777,14 +777,14 @@ void ctrlm_obj_network_ble_t::req_process_program_ir_codes(void *data, int size) } else if (!controllers_[controller_id]->isSupportedIrdb(dqm->vendor_info)) { XLOGD_ERROR("Unsupported IRDB - not continuing with ir code download!"); #ifdef TELEMETRY_SUPPORT - { - char t2_buf[256]; - snprintf(t2_buf, sizeof(t2_buf), "0x%02X,%s,0x%02X", - controllers_[controller_id]->getSupportedIrdbs(), - dqm->vendor_info.name.c_str(), - dqm->vendor_info.rcu_support_bitmask); - t2_event_s((char*)MARKER_IRDB_PROGRAM_UNSUPPORTED, t2_buf); - } + char t2_buf[256]; + snprintf(t2_buf, sizeof(t2_buf), "[%d,\"unsupported\",0x%02X,\"%s\",0x%02X]", + (int)CTRLM_IR_STATE_FAILED, + controllers_[controller_id]->getSupportedIrdbs(), + dqm->vendor_info.name.c_str(), + dqm->vendor_info.rcu_support_bitmask); + ctrlm_telemetry_event_t ev(MARKER_IRDB_PROGRAM_RESULT, t2_buf); + ev.event(); #endif } else { if(dqm->ir_codes) { @@ -1712,19 +1712,32 @@ void ctrlm_obj_network_ble_t::ind_process_rcu_status(void *data, int size) { ir_state_ = dqm->ir_state; #ifdef TELEMETRY_SUPPORT { - ctrlm_irdb_interface_t *irdb = ctrlm_main_irdb_get(); ctrlm_irdb_vendor_info_t vendor_info{}; + vendor_info.name = "unknown"; + vendor_info.rcu_support_bitmask = 0xFF; + + ctrlm_irdb_interface_t *irdb = ctrlm_main_irdb_get(); if (irdb) { irdb->get_vendor_info(vendor_info); } char t2_buf[256]; - if (dqm->ir_state == CTRLM_IR_STATE_COMPLETE) { - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", - vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); - t2_event_s((char*)MARKER_IRDB_PROGRAM_SUCCESS, t2_buf); - } else if (dqm->ir_state == CTRLM_IR_STATE_FAILED) { - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X,%s", - vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, - dqm->ir_fail_reason); - t2_event_s((char*)MARKER_IRDB_PROGRAM_FAIL, t2_buf); + if (dqm->ir_state == CTRLM_IR_STATE_COMPLETE || dqm->ir_state == CTRLM_IR_STATE_FAILED) { + ctrlm_controller_id_t controller_id; + uint8_t rcu_bitmask = 0xFF; + if (false == getControllerId(dqm->rcu_data.ieee_address, &controller_id)) { + XLOGD_ERROR("Controller <%s> NOT found in the network!!", + ctrlm_convert_mac_long_to_string(dqm->rcu_data.ieee_address).c_str()); + } else { + auto controller = controllers_[controller_id]; + rcu_bitmask = controller->getSupportedIrdbs(); + } + + snprintf(t2_buf, sizeof(t2_buf), "[%d,\"%s\",0x%02X,\"%s\",0x%02X]", + (int)dqm->ir_state, + dqm->ir_fail_reason, + rcu_bitmask, + vendor_info.name.c_str(), + vendor_info.rcu_support_bitmask); + ctrlm_telemetry_event_t ev(MARKER_IRDB_PROGRAM_RESULT, t2_buf); + ev.event(); } } #endif diff --git a/src/ble/ctrlm_ble_rcu_interface.cpp b/src/ble/ctrlm_ble_rcu_interface.cpp index cdb4e5f3..2af7e88d 100644 --- a/src/ble/ctrlm_ble_rcu_interface.cpp +++ b/src/ble/ctrlm_ble_rcu_interface.cpp @@ -1160,7 +1160,7 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, uint8_t vendor) { // lambda invoked when the request returns - auto replyHandler = [this](PendingReply<> *reply) mutable + auto replyHandler = [this, ieee_address](PendingReply<> *reply) mutable { bool success = false; @@ -1176,6 +1176,7 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_COMPLETE : CTRLM_IR_STATE_FAILED; + params.rcu_data.ieee_address = ieee_address; if (!success) { snprintf(params.ir_fail_reason, CTRLM_MAX_PARAM_STR_LEN, "%s", reply->errorMessage().c_str()); } @@ -1247,6 +1248,7 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_WAITING : CTRLM_IR_STATE_FAILED; + params.rcu_data.ieee_address = ieee_address; m_rcuStatusChangedSlots.invoke(¶ms); return success; @@ -1255,7 +1257,7 @@ bool ctrlm_ble_rcu_interface_t::programIrSignalWaveforms(uint64_t ieee_address, bool ctrlm_ble_rcu_interface_t::eraseIrSignals(uint64_t ieee_address) { // lambda invoked when the request returns - auto replyHandler = [this](PendingReply<> *reply) mutable + auto replyHandler = [this, ieee_address](PendingReply<> *reply) mutable { bool success = false; @@ -1271,6 +1273,10 @@ bool ctrlm_ble_rcu_interface_t::eraseIrSignals(uint64_t ieee_address) ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_COMPLETE : CTRLM_IR_STATE_FAILED; + params.rcu_data.ieee_address = ieee_address; + if (!success) { + snprintf(params.ir_fail_reason, CTRLM_MAX_PARAM_STR_LEN, "%s", reply->errorMessage().c_str()); + } m_rcuStatusChangedSlots.invoke(¶ms); }; @@ -1295,6 +1301,7 @@ bool ctrlm_ble_rcu_interface_t::eraseIrSignals(uint64_t ieee_address) ctrlm_hal_ble_RcuStatusData_t params = {}; params.property_updated = CTRLM_HAL_BLE_PROPERTY_IR_STATE; params.ir_state = success ? CTRLM_IR_STATE_WAITING : CTRLM_IR_STATE_FAILED; + params.rcu_data.ieee_address = ieee_address; m_rcuStatusChangedSlots.invoke(¶ms); return success; diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 1dc07be4..fd492f1a 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -42,10 +42,36 @@ #include #include +#include #include +#include using namespace std; +typedef enum { + CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID = 0, + CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, + CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, + CTRLM_IRDB_AUTOLOOKUP_SOURCE_UNKNOWN +} ctrlm_irdb_autolookup_source_t; + +typedef enum { + CTRLM_IRDB_AUTOLOOKUP_RESULT_SUCCESS = 0, + CTRLM_IRDB_AUTOLOOKUP_RESULT_NULL, + CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_SOURCE_DATA, + CTRLM_IRDB_AUTOLOOKUP_RESULT_FAILED, + CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_CODES_FOR_SOURCE, + CTRLM_IRDB_AUTOLOOKUP_RESULT_DEV_TYPE_INVALID, + CTRLM_IRDB_AUTOLOOKUP_RESULT_UNKNOWN, +} ctrlm_irdb_autolookup_result_t; + +class ctrlm_irdb_t2_autolookup_entry_t { +public: + ctrlm_irdb_t2_autolookup_entry_t(int p, ctrlm_irdb_autolookup_source_t s, ctrlm_irdb_autolookup_result_t r): port(p), source(s), result(r) {} + int port = -1; + ctrlm_irdb_autolookup_source_t source = CTRLM_IRDB_AUTOLOOKUP_SOURCE_UNKNOWN; + ctrlm_irdb_autolookup_result_t result = CTRLM_IRDB_AUTOLOOKUP_RESULT_UNKNOWN; +}; static ctrlm_irdb_interface_t *_instance = NULL; @@ -421,16 +447,13 @@ bool comp_autolookup_ranked_list (ctrlm_irdb_autolookup_entry_ranked_t i, ctrlm_ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_list_by_type_t &codes) { std::unique_lock guard(m_mutex); bool ret = false; + std::vector t2_info; // Retrieve vendor info now while mutex is held (avoids recursive lock via get_vendor_info()) ctrlm_irdb_vendor_info_t t2_vendor_info{}; if (g_irdb.pluginGetVendorInfo) { (*g_irdb.pluginGetVendorInfo)(t2_vendor_info); } - bool t2_had_edid_data = false; - bool t2_had_cec_data = false; - bool t2_used_edid = false; - bool t2_used_cec = false; #if defined(CTRLM_THUNDER) if(m_platform_tv == false) { @@ -439,7 +462,6 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(g_irdb.display_settings) { g_irdb.display_settings->get_edid(edid); if(edid.size() > 0) { - t2_had_edid_data = true; ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -448,34 +470,32 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; - t2_used_edid = true; + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_SUCCESS); } else { XLOGD_ERROR("edid dev type invalid"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_DEV_TYPE_INVALID); } } else { XLOGD_ERROR("no codes for edid data"); -#ifdef TELEMETRY_SUPPORT - t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_EDID_NO_CODES, 1); -#endif + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_CODES_FOR_SOURCE); } } else { XLOGD_ERROR("Failed getting codes by edid"); -#ifdef TELEMETRY_SUPPORT - t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_EDID_ERROR, 1); -#endif + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_FAILED); } } else { XLOGD_ERROR("No EDID data"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_SOURCE_DATA); } } else { XLOGD_ERROR("display_settings is NULL"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_EDID, CTRLM_IRDB_AUTOLOOKUP_RESULT_NULL); } if(g_irdb.cec_source) { // Check CEC data std::vector cec_devices; g_irdb.cec_source->get_cec_devices(cec_devices); if(cec_devices.size() > 0) { - t2_had_cec_data = true; for(auto &itr : cec_devices) { ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -485,34 +505,28 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; - t2_used_cec = true; + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_SUCCESS); } else { XLOGD_ERROR("cec dev type invalid"); + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_DEV_TYPE_INVALID); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); -#ifdef TELEMETRY_SUPPORT - t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES, (char*)itr.osd.c_str()); -#endif + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_CODES_FOR_SOURCE); } } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); -#ifdef TELEMETRY_SUPPORT - t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_ERROR, (char*)itr.osd.c_str()); -#endif + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_FAILED); } } } else { XLOGD_ERROR("No CEC device data"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_SOURCE_DATA); } } else { XLOGD_ERROR("cec is NULL"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NULL); } -#ifdef TELEMETRY_SUPPORT - if (!t2_had_edid_data && !t2_had_cec_data) { - t2_event_d((char*)MARKER_IRDB_AUTOLOOKUP_NO_DATA, 1); - } -#endif } else { if(g_irdb.av_input) { // Check Infoframe data @@ -527,29 +541,33 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; - t2_used_edid = true; + t2_info.emplace_back(itr.first, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_SUCCESS); } else { XLOGD_ERROR("port %d infoframe dev type invalid", itr.first); + t2_info.emplace_back(itr.first, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_DEV_TYPE_INVALID); } } else { XLOGD_WARN("no code for port %d infoframe", itr.first); + t2_info.emplace_back(itr.first, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_CODES_FOR_SOURCE); } } else { XLOGD_WARN("Failed to get codes for port %d infoframe", itr.first); + t2_info.emplace_back(itr.first, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_FAILED); } } else { XLOGD_WARN("no infoframe for port %d", itr.first); + t2_info.emplace_back(itr.first, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_SOURCE_DATA); } } } else { XLOGD_ERROR("hdmi is NULL"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_INFOFRAME, CTRLM_IRDB_AUTOLOOKUP_RESULT_NULL); } if(g_irdb.cec_sink) { // Check CEC data std::vector cec_devices; g_irdb.cec_sink->get_cec_devices(cec_devices); if(cec_devices.size() > 0) { - t2_had_cec_data = true; for(auto &itr : cec_devices) { ctrlm_irdb_dev_type_t type = CTRLM_IRDB_DEV_TYPE_INVALID; ctrlm_irdb_autolookup_ranked_list_t ir_codes; @@ -558,28 +576,27 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); ret = true; - t2_used_cec = true; + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_SUCCESS); } else { XLOGD_ERROR("cec dev type invalid"); + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_DEV_TYPE_INVALID); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); -#ifdef TELEMETRY_SUPPORT - t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES, (char*)itr.osd.c_str()); -#endif + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_CODES_FOR_SOURCE); } } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); -#ifdef TELEMETRY_SUPPORT - t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_CEC_ERROR, (char*)itr.osd.c_str()); -#endif + t2_info.emplace_back(itr.port, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_FAILED); } } } else { XLOGD_ERROR("No CEC device data"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NO_SOURCE_DATA); } } else { - XLOGD_ERROR("cec_sink is NULL"); + XLOGD_ERROR("cec is NULL"); + t2_info.emplace_back(-1, CTRLM_IRDB_AUTOLOOKUP_SOURCE_CEC, CTRLM_IRDB_AUTOLOOKUP_RESULT_NULL); } } #endif @@ -599,19 +616,27 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ } #ifdef TELEMETRY_SUPPORT - { - size_t tv_count = codes.count(CTRLM_IRDB_DEV_TYPE_TV) ? codes.at(CTRLM_IRDB_DEV_TYPE_TV).size() : 0; - size_t avr_count = codes.count(CTRLM_IRDB_DEV_TYPE_AVR) ? codes.at(CTRLM_IRDB_DEV_TYPE_AVR).size() : 0; - const char *sources = "none"; - if (t2_used_edid && t2_used_cec) sources = "edid+cec"; - else if (t2_used_edid) sources = "edid"; - else if (t2_used_cec) sources = "cec"; - char t2_buf[256]; - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X,%s,%zu,%zu", - t2_vendor_info.name.c_str(), t2_vendor_info.rcu_support_bitmask, - sources, tv_count, avr_count); - t2_event_s((char*)MARKER_IRDB_AUTOLOOKUP_RESULT, t2_buf); + size_t tv_count = codes.count(CTRLM_IRDB_DEV_TYPE_TV) ? codes.at(CTRLM_IRDB_DEV_TYPE_TV).size() : 0; + size_t avr_count = codes.count(CTRLM_IRDB_DEV_TYPE_AVR) ? codes.at(CTRLM_IRDB_DEV_TYPE_AVR).size() : 0; + std::stringstream ss; + bool first = true; + for (const auto &entry : t2_info) { + if (!first) { + ss << ","; + } + ss << entry.port << "," << static_cast(entry.source) << "," << static_cast(entry.result); + first = false; } + std::string results = ss.str(); + ss.str(""); + ss << "[\"" << t2_vendor_info.name << "\"" + << ",0x" << std::hex << std::setfill('0') << std::setw(2) << (int)t2_vendor_info.rcu_support_bitmask + << "," << std::dec << (int)m_platform_tv + << "," << tv_count + << "," << avr_count + << "," << results << "]"; + ctrlm_telemetry_event_t ev(MARKER_IRDB_AUTOLOOKUP_RESULT, ss.str()); + ev.event(); #endif return(ret); diff --git a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp index d2d78b9c..e4d0cd22 100644 --- a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp +++ b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp @@ -146,13 +146,6 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_manufacturers(void *arg) { if(irdb->get_manufacturers(mans, dev_type, manufacturer) == false ) { XLOGD_ERROR("Failed getting manufacturers"); success = false; -#ifdef TELEMETRY_SUPPORT - ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); - char t2_buf[128]; - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); - t2_event_s((char*)MARKER_IRDB_MANUAL_MFR_ERROR, t2_buf); -#endif } else { for(const auto &itr : mans) { json_array_append_new(manufacturers, json_string(itr.c_str())); @@ -160,6 +153,15 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_manufacturers(void *arg) { } } +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_MANUFACTURERS, (int)success); + ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf); + ev.event(); +#endif + // Assemble the return json_object_set_new(ret, SUCCESS, json_boolean(success)); if(success) { @@ -227,13 +229,6 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_models(void *arg) { if(irdb->get_models(mods, dev_type, manufacturer, model) == false ) { XLOGD_ERROR("Failed getting models"); success = false; -#ifdef TELEMETRY_SUPPORT - ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); - char t2_buf[128]; - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); - t2_event_s((char*)MARKER_IRDB_MANUAL_MODEL_ERROR, t2_buf); -#endif } else { for(const auto &itr : mods) { json_array_append_new(models, json_string(itr.c_str())); @@ -241,6 +236,15 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_models(void *arg) { } } +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_MODELS, (int)success); + ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf); + ev.event(); +#endif + // Assemble the return json_object_set_new(ret, SUCCESS, json_boolean(success)); if(success) { @@ -374,13 +378,6 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_irdb_entry_ids(void *arg) { if(irdb->get_irdb_entry_ids(cds, dev_type, manufacturer, model) == false) { XLOGD_ERROR("Failed getting codes"); success = false; -#ifdef TELEMETRY_SUPPORT - ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); - char t2_buf[128]; - snprintf(t2_buf, sizeof(t2_buf), "%s,0x%02X", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask); - t2_event_s((char*)MARKER_IRDB_MANUAL_CODES_ERROR, t2_buf); -#endif } else { for(const auto &itr : cds) { json_array_append_new(codes, json_string(itr.c_str())); @@ -388,6 +385,15 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_irdb_entry_ids(void *arg) { } } +#ifdef TELEMETRY_SUPPORT + ctrlm_irdb_vendor_info_t vendor_info{}; + irdb->get_vendor_info(vendor_info); + char t2_buf[128]; + snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_CODES, (int)success); + ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf); + ev.event(); +#endif + // Assemble the return json_object_set_new(ret, SUCCESS, json_boolean(success)); if(success) { diff --git a/src/telemetry/ctrlm_telemetry_markers.h b/src/telemetry/ctrlm_telemetry_markers.h index 4612400b..28e2595b 100644 --- a/src/telemetry/ctrlm_telemetry_markers.h +++ b/src/telemetry/ctrlm_telemetry_markers.h @@ -129,28 +129,11 @@ // IRDB Markers // -// Autolookup Markers // All _accum markers are aggregated by the T2 platform within each reporting window. - -#define MARKER_IRDB_AUTOLOOKUP_RESULT "ctrlm.irdb.autolookup.result_accum" // format: ,,,,; sources: none|edid|cec|edid+cec -#define MARKER_IRDB_AUTOLOOKUP_NO_DATA "ctrlm.irdb.autolookup.no_data_accum" // value: 1 (count); fires when neither EDID nor CEC discovery data is available -#define MARKER_IRDB_AUTOLOOKUP_EDID_NO_CODES "ctrlm.irdb.autolookup.edid.no_codes_accum" // value: 1 (count); EDID present but plugin returned empty code list -#define MARKER_IRDB_AUTOLOOKUP_EDID_ERROR "ctrlm.irdb.autolookup.edid.error_accum" // value: 1 (count); pluginGetCodesByEdid returned false -#define MARKER_IRDB_AUTOLOOKUP_CEC_NO_CODES "ctrlm.irdb.autolookup.cec.no_codes_accum" // payload: OSD device name; plugin returned empty list for this CEC device -#define MARKER_IRDB_AUTOLOOKUP_CEC_ERROR "ctrlm.irdb.autolookup.cec.error_accum" // payload: OSD device name; pluginGetCodesByCec returned false for this CEC device - -// Manual Lookup Markers -#define MARKER_IRDB_MANUAL_MFR_ERROR "ctrlm.irdb.manual.mfr.error_accum" // format: ,; get_manufacturers plugin returned false -#define MARKER_IRDB_MANUAL_MODEL_ERROR "ctrlm.irdb.manual.model.error_accum" // format: ,; get_models plugin returned false -#define MARKER_IRDB_MANUAL_CODES_ERROR "ctrlm.irdb.manual.codes.error_accum" // format: ,; get_irdb_entry_ids plugin returned false - -// Programming Markers -#define MARKER_IRDB_PROGRAM_SUCCESS "ctrlm.irdb.program.success_accum" // format: , -#define MARKER_IRDB_PROGRAM_FAIL "ctrlm.irdb.program.fail_accum" // format: ,, -#define MARKER_IRDB_PROGRAM_UNSUPPORTED "ctrlm.irdb.program.unsupported_accum" // format: ,, - -// Vendor Set Marker -#define MARKER_IRDB_VENDOR_SET "ctrlm.irdb.vendor_set_accum" // format: ,,,, +#define MARKER_IRDB_AUTOLOOKUP_RESULT "ctrlm.irdb.autolookup.result_accum" // format: ,,,,, +#define MARKER_IRDB_MANUAL_RESULT "ctrlm.irdb.manual.result_accum" // format: ,,, +#define MARKER_IRDB_PROGRAM_RESULT "ctrlm.irdb.program.result_accum" // format: ,,,, +#define MARKER_IRDB_VENDOR_SET "ctrlm.irdb.vendor_set_accum" // format: ,,,, // // End IRDB Markers diff --git a/src/thunder/plugins/ctrlm_thunder_plugin_display_settings.cpp b/src/thunder/plugins/ctrlm_thunder_plugin_display_settings.cpp index 662af928..b11001e6 100644 --- a/src/thunder/plugins/ctrlm_thunder_plugin_display_settings.cpp +++ b/src/thunder/plugins/ctrlm_thunder_plugin_display_settings.cpp @@ -118,7 +118,7 @@ bool ctrlm_thunder_plugin_display_settings_t::_get_edid() { } } ret = true; - XLOGD_DEBUG("EDID data <%d> bytes: \n<%s>", edid_size, ss.str().c_str()); + XLOGD_INFO("EDID data <%d> bytes: \n<%s>", edid_size, ss.str().c_str()); } else { XLOGD_ERROR("Failed to decode EDID base64!"); } From 5db958de08c845791cec3dec61ecea4f46f7bc52 Mon Sep 17 00:00:00 2001 From: klu339 Date: Thu, 4 Jun 2026 01:47:09 +0000 Subject: [PATCH 4/4] copilot comments --- src/irdb/ctrlm_irdb_interface.cpp | 2 +- src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index fd492f1a..bab8f9a6 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -634,7 +634,7 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ << "," << std::dec << (int)m_platform_tv << "," << tv_count << "," << avr_count - << "," << results << "]"; + << "," << (results.empty() ? "\"\"" : results) << "]"; ctrlm_telemetry_event_t ev(MARKER_IRDB_AUTOLOOKUP_RESULT, ss.str()); ev.event(); #endif diff --git a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp index e4d0cd22..e58f7a64 100644 --- a/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp +++ b/src/irdb/ipc/ctrlm_irdb_ipc_iarm_thunder.cpp @@ -155,7 +155,9 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_manufacturers(void *arg) { #ifdef TELEMETRY_SUPPORT ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); + if (irdb) { + irdb->get_vendor_info(vendor_info); + } char t2_buf[128]; snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_MANUFACTURERS, (int)success); ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf); @@ -238,7 +240,9 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_models(void *arg) { #ifdef TELEMETRY_SUPPORT ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); + if(irdb) { + irdb->get_vendor_info(vendor_info); + } char t2_buf[128]; snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_MODELS, (int)success); ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf); @@ -387,7 +391,9 @@ IARM_Result_t ctrlm_irdb_ipc_iarm_thunder_t::get_irdb_entry_ids(void *arg) { #ifdef TELEMETRY_SUPPORT ctrlm_irdb_vendor_info_t vendor_info{}; - irdb->get_vendor_info(vendor_info); + if (irdb) { + irdb->get_vendor_info(vendor_info); + } char t2_buf[128]; snprintf(t2_buf, sizeof(t2_buf), "[\"%s\",0x%02X,\"%s\",%d]", vendor_info.name.c_str(), vendor_info.rcu_support_bitmask, CTRLM_MAIN_IARM_CALL_IR_CODES, (int)success); ctrlm_telemetry_event_t ev(MARKER_IRDB_MANUAL_RESULT, t2_buf);