From c81185a77832a04a9e0065d8d247468508294d2d Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Fri, 24 Oct 2025 00:43:12 +0000 Subject: [PATCH 01/16] preliminary interface changes --- src/irdb/ctrlm_irdb_interface.cpp | 13 +++++++++++++ src/irdb/ctrlm_irdb_plugin.h | 6 ++++++ src/irdb/ctrlm_irdb_stub.cpp | 10 ++++++++++ src/irdb/ctrlm_irdb_stub.h | 4 ++++ 4 files changed, 33 insertions(+) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 0ea0757..1b58f87 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -68,6 +68,7 @@ typedef struct { std::string (*pluginVersion)() = NULL; bool (*pluginInitialize)() = NULL; bool (*pluginGetVendorInfo)(ctrlm_irdb_vendor_info_t &info) = NULL; + bool (*pluginGetSupportedVendors)(std::vector &info) = NULL; bool (*pluginGetManufacturers)(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix) = NULL; bool (*pluginGetModels)(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix) = NULL; bool (*pluginGetEntryIds)(ctrlm_irdb_entry_id_list_t &codes, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &model) = NULL; @@ -132,6 +133,7 @@ ctrlm_irdb_interface_t::ctrlm_irdb_interface_t(bool platform_tv) { g_irdb.pluginVersion = STUB_irdb_version; g_irdb.pluginInitialize = STUB_ctrlm_irdb_initialize; g_irdb.pluginGetVendorInfo = STUB_ctrlm_irdb_get_vendor_info; + g_irdb.pluginGetSupportedVendors = STUB_ctrlm_irdb_get_supported_vendor_info; g_irdb.pluginGetManufacturers = STUB_ctrlm_irdb_get_manufacturers; g_irdb.pluginGetModels = STUB_ctrlm_irdb_get_models; g_irdb.pluginGetEntryIds = STUB_ctrlm_irdb_get_entry_ids; @@ -182,6 +184,17 @@ ctrlm_irdb_interface_t::ctrlm_irdb_interface_t(bool platform_tv) { } dlerror(); // Clear any existing error + *(void **) (&g_irdb.pluginGetSupportedVendors) = dlsym(m_irdbPluginHandle, "ctrlm_irdb_get_supported_vendor_info"); + if ((error = dlerror()) != NULL) { + XLOGD_ERROR("Failed to find plugin method (ctrlm_irdb_get_supported_vendor_info), error <%s>, Using STUB implementation", error); + g_irdb.pluginGetSupportedVendors = STUB_ctrlm_irdb_get_supported_vendor_info; + } else { + + XLOGD_WARN("EGPRINT: successfully loaded ctrlm_irdb_get_supported_vendor_info!!!!!!!!!!!!!!!!!"); + + } + dlerror(); // Clear any existing error + *(void **) (&g_irdb.pluginGetManufacturers) = dlsym(m_irdbPluginHandle, "ctrlm_irdb_get_manufacturers"); if ((error = dlerror()) != NULL) { XLOGD_ERROR("Failed to find plugin method (ctrlm_irdb_get_manufacturers), error <%s>, Using STUB implementation", error); diff --git a/src/irdb/ctrlm_irdb_plugin.h b/src/irdb/ctrlm_irdb_plugin.h index 7e1ced2..70e8cbf 100644 --- a/src/irdb/ctrlm_irdb_plugin.h +++ b/src/irdb/ctrlm_irdb_plugin.h @@ -88,6 +88,12 @@ bool ctrlm_irdb_close(); bool ctrlm_irdb_initialize(); +// Will return info on all the IRDB vendors currently installed, could be multiple vendors returned +bool ctrlm_irdb_get_supported_vendor_info(std::vector &info); + +// This will basically pass through the bitmask coming from the RCU, so it will be Ruwido ONLY, Quickset ONLY, or BOTH +bool ctrlm_irdb_set_preferred_vendor(ctrlm_irdb_vendor_info_t vendor); + bool ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info); bool ctrlm_irdb_get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix); diff --git a/src/irdb/ctrlm_irdb_stub.cpp b/src/irdb/ctrlm_irdb_stub.cpp index 898cb4f..4f0b5f0 100644 --- a/src/irdb/ctrlm_irdb_stub.cpp +++ b/src/irdb/ctrlm_irdb_stub.cpp @@ -46,6 +46,16 @@ bool STUB_ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info) XLOGD_ERROR("not implemented"); return(false); } +bool STUB_ctrlm_irdb_get_supported_vendor_info(std::vector &info) +{ + XLOGD_ERROR("not implemented"); + return(false); +} +bool STUB_ctrlm_irdb_set_preferred_vendor(ctrlm_irdb_vendor_info_t info) +{ + XLOGD_ERROR("not implemented"); + return(false); +} bool STUB_ctrlm_irdb_get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix) { XLOGD_ERROR("not implemented"); diff --git a/src/irdb/ctrlm_irdb_stub.h b/src/irdb/ctrlm_irdb_stub.h index 477ec9f..933e73c 100644 --- a/src/irdb/ctrlm_irdb_stub.h +++ b/src/irdb/ctrlm_irdb_stub.h @@ -32,6 +32,10 @@ bool STUB_ctrlm_irdb_initialize(); bool STUB_ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info); +bool STUB_ctrlm_irdb_get_supported_vendor_info(std::vector &info); + +bool STUB_ctrlm_irdb_set_preferred_vendor(ctrlm_irdb_vendor_info_t info); + bool STUB_ctrlm_irdb_get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix); bool STUB_ctrlm_irdb_get_models(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix); From d16c3262f3f78a77126a0bba3ce97e41656d3f2e Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 30 Oct 2025 18:26:01 +0000 Subject: [PATCH 02/16] add set preferred vendor --- src/ble/ctrlm_ble_controller.cpp | 13 +++++++++++-- src/irdb/ctrlm_irdb_interface.cpp | 28 +++++++++++++++++++++++++--- src/irdb/ctrlm_irdb_interface.h | 1 + 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index d888615..7f62733 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -531,13 +531,22 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas this->irdbs_supported_ = vendor_support_bitmask; ctrlm_irdb_interface_t *irdb = ctrlm_main_irdb_get(); + + if (irdb == NULL) { + XLOGD_ERROR("IRDB interface is NULL!!!"); + return; + } + ctrlm_irdb_vendor_info_t vendor_info; - if (irdb && irdb->get_vendor_info(vendor_info)) { + vendor_info.rcu_support_bitmask = vendor_support_bitmask; + irdb->set_vendor(vendor_info); + + if (irdb->get_vendor_info(vendor_info)) { XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which %s support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, isSupportedIrdb(vendor_info) ? "DOES" : "does NOT", vendor_info.name.c_str()); } else { - XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, couldn't retrieve IRDB plugin vendor info.", + 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); } } diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 1b58f87..1808b7a 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -69,6 +69,7 @@ typedef struct { bool (*pluginInitialize)() = NULL; bool (*pluginGetVendorInfo)(ctrlm_irdb_vendor_info_t &info) = NULL; bool (*pluginGetSupportedVendors)(std::vector &info) = NULL; + bool (*pluginSetPreferredVendor)(ctrlm_irdb_vendor_info_t vendor) = NULL; bool (*pluginGetManufacturers)(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix) = NULL; bool (*pluginGetModels)(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix) = NULL; bool (*pluginGetEntryIds)(ctrlm_irdb_entry_id_list_t &codes, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &model) = NULL; @@ -133,6 +134,7 @@ ctrlm_irdb_interface_t::ctrlm_irdb_interface_t(bool platform_tv) { g_irdb.pluginVersion = STUB_irdb_version; g_irdb.pluginInitialize = STUB_ctrlm_irdb_initialize; g_irdb.pluginGetVendorInfo = STUB_ctrlm_irdb_get_vendor_info; + g_irdb.pluginSetPreferredVendor = STUB_ctrlm_irdb_set_preferred_vendor; g_irdb.pluginGetSupportedVendors = STUB_ctrlm_irdb_get_supported_vendor_info; g_irdb.pluginGetManufacturers = STUB_ctrlm_irdb_get_manufacturers; g_irdb.pluginGetModels = STUB_ctrlm_irdb_get_models; @@ -188,10 +190,13 @@ ctrlm_irdb_interface_t::ctrlm_irdb_interface_t(bool platform_tv) { if ((error = dlerror()) != NULL) { XLOGD_ERROR("Failed to find plugin method (ctrlm_irdb_get_supported_vendor_info), error <%s>, Using STUB implementation", error); g_irdb.pluginGetSupportedVendors = STUB_ctrlm_irdb_get_supported_vendor_info; - } else { - - XLOGD_WARN("EGPRINT: successfully loaded ctrlm_irdb_get_supported_vendor_info!!!!!!!!!!!!!!!!!"); + } + dlerror(); // Clear any existing error + *(void **) (&g_irdb.pluginSetPreferredVendor) = dlsym(m_irdbPluginHandle, "ctrlm_irdb_set_preferred_vendor"); + if ((error = dlerror()) != NULL) { + XLOGD_ERROR("Failed to find plugin method (ctrlm_irdb_set_preferred_vendor), error <%s>, Using STUB implementation", error); + g_irdb.pluginSetPreferredVendor = STUB_ctrlm_irdb_set_preferred_vendor; } dlerror(); // Clear any existing error @@ -291,6 +296,15 @@ bool ctrlm_irdb_interface_t::open_plugin() { } } XLOGD_INFO("IRDB plugin opened, ret = <%s>", ret ? "SUCCESS" : "ERROR"); + + if (g_irdb.pluginGetSupportedVendors) { + std::vector supported_vendors; + if ((ret = (*g_irdb.pluginGetSupportedVendors)(supported_vendors)) == true) { + for (const auto &it : supported_vendors) { + XLOGD_INFO("Found supported IRDB Vendor <%s, 0x%X>", it.name.c_str(), it.rcu_support_bitmask); + } + } + } return ret; } @@ -312,6 +326,14 @@ bool ctrlm_irdb_interface_t::get_vendor_info(ctrlm_irdb_vendor_info_t &info) { return false; } +bool ctrlm_irdb_interface_t::set_vendor(ctrlm_irdb_vendor_info_t info) { + std::unique_lock guard(m_mutex); + if (g_irdb.pluginSetPreferredVendor) { + return (*g_irdb.pluginSetPreferredVendor)(info); + } + return false; +} + void ctrlm_irdb_interface_t::on_thunder_ready() { #if defined(CTRLM_THUNDER) diff --git a/src/irdb/ctrlm_irdb_interface.h b/src/irdb/ctrlm_irdb_interface.h index 9e7da14..1eb3148 100644 --- a/src/irdb/ctrlm_irdb_interface.h +++ b/src/irdb/ctrlm_irdb_interface.h @@ -70,6 +70,7 @@ class ctrlm_irdb_interface_t { virtual ~ctrlm_irdb_interface_t(); bool get_vendor_info(ctrlm_irdb_vendor_info_t &info); + bool set_vendor(ctrlm_irdb_vendor_info_t info); bool get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix = ""); bool get_models(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix = ""); bool get_irdb_entry_ids(ctrlm_irdb_entry_id_list_t &codes, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &model = ""); From 9a6021fe41e874f8dccde5f8a3b97f4b583a78f4 Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:08:26 -0400 Subject: [PATCH 03/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/irdb/ctrlm_irdb_interface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_interface.h b/src/irdb/ctrlm_irdb_interface.h index 1eb3148..3dbf94d 100644 --- a/src/irdb/ctrlm_irdb_interface.h +++ b/src/irdb/ctrlm_irdb_interface.h @@ -70,7 +70,7 @@ class ctrlm_irdb_interface_t { virtual ~ctrlm_irdb_interface_t(); bool get_vendor_info(ctrlm_irdb_vendor_info_t &info); - bool set_vendor(ctrlm_irdb_vendor_info_t info); + bool set_vendor(const ctrlm_irdb_vendor_info_t &info); bool get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix = ""); bool get_models(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix = ""); bool get_irdb_entry_ids(ctrlm_irdb_entry_id_list_t &codes, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &model = ""); From 2e55a74d623dc3b062782fb9d79c4a6db2289698 Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:08:37 -0400 Subject: [PATCH 04/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/irdb/ctrlm_irdb_stub.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_stub.h b/src/irdb/ctrlm_irdb_stub.h index 933e73c..a03f6f8 100644 --- a/src/irdb/ctrlm_irdb_stub.h +++ b/src/irdb/ctrlm_irdb_stub.h @@ -34,7 +34,7 @@ bool STUB_ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info); bool STUB_ctrlm_irdb_get_supported_vendor_info(std::vector &info); -bool STUB_ctrlm_irdb_set_preferred_vendor(ctrlm_irdb_vendor_info_t info); +bool STUB_ctrlm_irdb_set_preferred_vendor(const ctrlm_irdb_vendor_info_t &info); bool STUB_ctrlm_irdb_get_manufacturers(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix); From 01b4194cacb20f69055cb51f1fccee94db63680d Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:08:48 -0400 Subject: [PATCH 05/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/irdb/ctrlm_irdb_stub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_stub.cpp b/src/irdb/ctrlm_irdb_stub.cpp index 4f0b5f0..8161e45 100644 --- a/src/irdb/ctrlm_irdb_stub.cpp +++ b/src/irdb/ctrlm_irdb_stub.cpp @@ -51,7 +51,7 @@ bool STUB_ctrlm_irdb_get_supported_vendor_info(std::vector Date: Thu, 30 Oct 2025 15:08:59 -0400 Subject: [PATCH 06/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/irdb/ctrlm_irdb_plugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_plugin.h b/src/irdb/ctrlm_irdb_plugin.h index 70e8cbf..9aace30 100644 --- a/src/irdb/ctrlm_irdb_plugin.h +++ b/src/irdb/ctrlm_irdb_plugin.h @@ -92,7 +92,7 @@ bool ctrlm_irdb_initialize(); bool ctrlm_irdb_get_supported_vendor_info(std::vector &info); // This will basically pass through the bitmask coming from the RCU, so it will be Ruwido ONLY, Quickset ONLY, or BOTH -bool ctrlm_irdb_set_preferred_vendor(ctrlm_irdb_vendor_info_t vendor); +bool ctrlm_irdb_set_preferred_vendor(const ctrlm_irdb_vendor_info_t &vendor); bool ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info); From cb80e15bd9b077687f548ba363117ffdfc134c0c Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:09:09 -0400 Subject: [PATCH 07/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/irdb/ctrlm_irdb_interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 1808b7a..77796f9 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -326,7 +326,7 @@ bool ctrlm_irdb_interface_t::get_vendor_info(ctrlm_irdb_vendor_info_t &info) { return false; } -bool ctrlm_irdb_interface_t::set_vendor(ctrlm_irdb_vendor_info_t info) { +bool ctrlm_irdb_interface_t::set_vendor(const ctrlm_irdb_vendor_info_t &info) { std::unique_lock guard(m_mutex); if (g_irdb.pluginSetPreferredVendor) { return (*g_irdb.pluginSetPreferredVendor)(info); From 8af95884b2a3df0bfe8374cc836ea9398523c534 Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:09:37 -0400 Subject: [PATCH 08/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/ble/ctrlm_ble_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index 7f62733..45dd086 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -537,7 +537,7 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas return; } - ctrlm_irdb_vendor_info_t vendor_info; + ctrlm_irdb_vendor_info_t vendor_info{}; vendor_info.rcu_support_bitmask = vendor_support_bitmask; irdb->set_vendor(vendor_info); From 0bc040e2de438f635c976d034a29e97407c3ced2 Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 30 Oct 2025 19:13:02 +0000 Subject: [PATCH 09/16] fix error handling --- src/irdb/ctrlm_irdb_interface.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 77796f9..1be918f 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -299,10 +299,12 @@ bool ctrlm_irdb_interface_t::open_plugin() { if (g_irdb.pluginGetSupportedVendors) { std::vector supported_vendors; - if ((ret = (*g_irdb.pluginGetSupportedVendors)(supported_vendors)) == true) { + if ((*g_irdb.pluginGetSupportedVendors)(supported_vendors) == true) { for (const auto &it : supported_vendors) { XLOGD_INFO("Found supported IRDB Vendor <%s, 0x%X>", it.name.c_str(), it.rcu_support_bitmask); } + } else { + XLOGD_WARN("Unable to query IRDB plugin for list of supported vendors, check version of the plugin..."); } } return ret; From 276997ac52c21e87b4a40c8735e0f365c3f2e02b Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 30 Oct 2025 19:23:41 +0000 Subject: [PATCH 10/16] fix error --- src/irdb/ctrlm_irdb_interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index 1be918f..bcc7b37 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -69,7 +69,7 @@ typedef struct { bool (*pluginInitialize)() = NULL; bool (*pluginGetVendorInfo)(ctrlm_irdb_vendor_info_t &info) = NULL; bool (*pluginGetSupportedVendors)(std::vector &info) = NULL; - bool (*pluginSetPreferredVendor)(ctrlm_irdb_vendor_info_t vendor) = NULL; + bool (*pluginSetPreferredVendor)(const ctrlm_irdb_vendor_info_t &vendor) = NULL; bool (*pluginGetManufacturers)(ctrlm_irdb_manufacturer_list_t &manufacturers, ctrlm_irdb_dev_type_t type, const std::string &prefix) = NULL; bool (*pluginGetModels)(ctrlm_irdb_model_list_t &models, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &prefix) = NULL; bool (*pluginGetEntryIds)(ctrlm_irdb_entry_id_list_t &codes, ctrlm_irdb_dev_type_t type, const std::string &manufacturer, const std::string &model) = NULL; From 828ec71fc8a3a53c54829f3f5a446fc9c21fd3cd Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Thu, 30 Oct 2025 20:11:45 -0400 Subject: [PATCH 11/16] rebase (#138) * Deploy cla action * RDKEMW-7174 : update AMC APP key mapping (#98) * RDKEMW-3409 : move certselector logic into ctrlm-main repo (#102) * RDKEMW-6767: getNetStatus call time out due to SAT download retries (#97) Reason for change: During initial setup, the device is attempting to download the SAT token and timing out, which is holding up the ctrlm message queue processing, which allows BLE pairing to fail Test Procedure: boot and attempt to pair BLE remote, keeping an eye on ctrlm loggging. Look for "CTRLM : ERROR: call_plugin: Thunder call failed <11>, attempt 1 of 1" We expect BLE pairing to succeed rather than timeout. If the call_plugin log error occurs and BLE pairing succeed then the code change has been exercised and the issue is resolved. Risks: Low Priority: P1 Signed-off-by: Jason Thomson * RDKEMW-7333: remove device from bluez during factory reset (#100) When an RDK device is factory reset, controlMgr will send a message to the remote to also factory reset itself. Once controlMgr gets notified from the remote of a successful RCU factory reset, it needs to be requested to bluez to remove the device. This prevents a connection attempt from happening to the just factory-reset RCU before the RDK device reboots. This connection attempt will prevent the RCU from autopairing during the activation flow after the RDK factory reset. * RDKEMW-7573 : remove ctrlm compile flags (#104) * RDKEMW-7694 : remove ctrlm build flags - CPC, DUNFELL (#105) * RDKEMW-7834 : remove ctrlm build flags - RF4CE_PACKET_ANALYSIS (#107) * RDKEMW-7772 : remove ctrlm build flags - DISABLE_BLE_VOICE (#106) * RDKEMW-7122 : Missing Thunder cflags in ctrlm implemenation (#103) * RDKEMW-7979 : use version/branch from recipe (#109) * RDKEMW-8349 : ctrlm release v1.1.4 (#113) * RDKEMW-8133: Optional param name for voiceSessionRequest (#108) * RDKEMW-8133: Optional param name for voiceSessionRequest Reason for change: Adding optional name param for voiceSessionRequest which is needed to track metadata about voice sessions from various ipcontrol clients Test Procedure: Use VoiceControl voiceSessionRequest method with name param Risks: Low Signed-off-by: Kelvin Lu * RDKEMW-8133: Optional param name for voiceSessionRequest Reason for change: remove the required conditional of name Test Procedure: Risks: Signed-off-by: Kelvin Lu * RDKEMW-8133: Optional param name for voiceSessionRequest Reason for change: Clean up log messaging Test Procedure: Risks: Signed-off-by: Kelvin Lu * RDKEMW-8133: Optional param name for voiceSessionRequest Reason for change: Move obj != NULL block to prevent null dereference Test Procedure: Risks: Signed-off-by: Kelvin Lu --------- Signed-off-by: Kelvin Lu * RDKEMW-8354: ctrlm-main crash while holding standby during OTA (#115) * RDKEMW-8354: ctrlm-main crash while holding standby during OTA Reason for change: crash due to null reference on repeating timer event Test Procedure: see ticket Risks: low Signed-off-by: Kelvin Lu * RDKEMW-8354: ctrlm-main crash on timer Reason for change: add comment for clarity Test Procedure: Risks: Signed-off-by: Kelvin Lu --------- Signed-off-by: Kelvin Lu * Deploy cla action * Deploy fossid_integration_stateless_diffscan_target_repo action * RDKEMW-8815: only return SUCCESS for autolookup if it found at least 1 code. * Revert "RDKEMW-8815: only return SUCCESS for autolookup if it found at least 1 code." (#124) * RDKEMW-8815: only return SUCCESS for autolookup if it found at least 1 code. (#125) It can often happen that the IRDB returns success but no codes are returned, this leads to confusing UI screens. So even if the IR database returned successfully, only return success to the plugin API if there is at least 1 code is present * Update CODEOWNERS (#130) * RDKEMW-8929 (#129) * RDKEMW-8929: Refactor ctrlm_voice_ipc_t to inherit ctrlm_ipc_iarm_t Reason for change: Inherit ctrlm_ipc_iarm_t Test Procedure: Verify behavior of events before & after no diff Risks: Low Signed-off-by: Kelvin Lu * RDKEMW-7225: BLE pairing retries (#126) if BLE pairing fails, retry 3 times or up to the pairing timeout (currently configured at 20 seconds), whichever comes first. --------- Signed-off-by: Jason Thomson Signed-off-by: Kelvin Lu Co-authored-by: rdkcmf Co-authored-by: dwolaver <44593664+dwolaver@users.noreply.github.com> Co-authored-by: jthomp007c Co-authored-by: Kelvin Lu <119349872+klu339@users.noreply.github.com> Co-authored-by: Alan Ryan <20208488+Alan-Ryan@users.noreply.github.com> Co-authored-by: Stephen Barrett --- .github/CODEOWNERS | 2 +- .github/workflows/cla.yml | 20 ++ ...gration_stateless_diffscan_target_repo.yml | 13 +- CHANGELOG.md | 20 ++ CMakeLists.txt | 77 +++----- include/ctrlm_ipc_voice.h | 8 +- src/CMakeLists.txt | 13 +- src/auth/ctrlm_auth_certificate.cpp | 171 ++++++++++++++++++ ...certificate.h => ctrlm_auth_certificate.h} | 12 +- src/auth/ctrlm_thunder_plugin_authservice.cpp | 4 +- src/ble/ctrlm_ble_network.cpp | 81 +++++++-- src/ble/ctrlm_ble_network.h | 1 + .../bleservices/gatt/gatt_upgradeservice.cpp | 7 +- src/ble/hal/blercu/bluez/blercudevice.cpp | 16 +- src/ble/hal/blercu/bluez/blercudevice_p.h | 3 + src/ctrlm.h | 1 - src/ctrlm_config_default.json | 3 + src/ctrlm_device_update.cpp | 16 +- src/ctrlm_device_update.h | 6 - src/ctrlm_main.cpp | 21 +-- src/ctrlm_network.cpp | 9 + src/ctrlm_rf4ce_voice_packet_analysis.cpp | 110 ----------- src/ctrlm_utils.cpp | 1 + src/ctrlm_voice_packet_analysis.h | 51 ------ src/ipc/ctrlm_ipc_iarm.cpp | 44 +---- src/ipc/ctrlm_ipc_iarm.h | 23 ++- src/ipc/ctrlm_rcp_ipc_event.cpp | 17 +- src/ipc/ctrlm_rcp_ipc_event.h | 16 +- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 30 +-- src/irdb/ctrlm_irdb_interface.cpp | 22 +-- .../ctrlm_rf4ce_controller_attr_irdb.cpp | 4 +- src/rf4ce/ctrlm_rf4ce_controller.cpp | 17 +- src/rf4ce/ctrlm_rf4ce_controller.h | 9 +- src/rf4ce/ctrlm_rf4ce_device_update.cpp | 19 +- src/rf4ce/ctrlm_rf4ce_network.cpp | 2 - src/stubs/stubs_voice_packet_analysis.cpp | 64 ------- src/voice/ctrlm_voice_obj.h | 1 + src/voice/ipc/ctrlm_voice_ipc.h | 5 +- src/voice/ipc/ctrlm_voice_ipc_iarm_all.cpp | 2 + src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp | 25 +-- .../ipc/ctrlm_voice_ipc_iarm_thunder.cpp | 105 +++-------- 41 files changed, 482 insertions(+), 589 deletions(-) create mode 100644 .github/workflows/cla.yml create mode 100644 src/auth/ctrlm_auth_certificate.cpp rename src/auth/{ctrlm_hal_certificate.h => ctrlm_auth_certificate.h} (89%) delete mode 100644 src/ctrlm_rf4ce_voice_packet_analysis.cpp delete mode 100644 src/ctrlm_voice_packet_analysis.h delete mode 100644 src/stubs/stubs_voice_packet_analysis.cpp diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 577e405..2f37d81 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,4 +2,4 @@ # the repo. Unless a later match takes precedence, # @global-owner1 and @global-owner2 will be requested for # review when someone opens a pull request. -* @rdkcentral/rdke_ghec_control_maintainer @rdkcentral/rdke_ghec_control_admin +* @rdkcentral/control-maintainers diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml new file mode 100644 index 0000000..c58b1b0 --- /dev/null +++ b/.github/workflows/cla.yml @@ -0,0 +1,20 @@ +name: "CLA" + +permissions: + contents: read + pull-requests: write + actions: write + statuses: write + +on: + issue_comment: + types: [created] + pull_request_target: + types: [opened, closed, synchronize] + +jobs: + CLA-Lite: + name: "Signature" + uses: rdkcentral/cmf-actions/.github/workflows/cla.yml@v1 + secrets: + PERSONAL_ACCESS_TOKEN: ${{ secrets.CLA_ASSISTANT }} diff --git a/.github/workflows/fossid_integration_stateless_diffscan_target_repo.yml b/.github/workflows/fossid_integration_stateless_diffscan_target_repo.yml index da02b8b..7b8c1cb 100644 --- a/.github/workflows/fossid_integration_stateless_diffscan_target_repo.yml +++ b/.github/workflows/fossid_integration_stateless_diffscan_target_repo.yml @@ -1,11 +1,18 @@ name: Fossid Stateless Diff Scan -on: pull_request +on: + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: read + pull-requests: read jobs: call-fossid-workflow: - uses: rdkcentral/build_tools_workflows/.github/workflows/fossid_integration_stateless_diffscan.yml@develop - secrets: + if: ${{ ! github.event.pull_request.head.repo.fork }} + uses: rdkcentral/build_tools_workflows/.github/workflows/fossid_integration_stateless_diffscan.yml@1.0.0 + secrets: FOSSID_CONTAINER_USERNAME: ${{ secrets.FOSSID_CONTAINER_USERNAME }} FOSSID_CONTAINER_PASSWORD: ${{ secrets.FOSSID_CONTAINER_PASSWORD }} FOSSID_HOST_USERNAME: ${{ secrets.FOSSID_HOST_USERNAME }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 08c6b30..9eed8a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,26 @@ All notable changes to this project will be documented in this file. * In the future, generate this file by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +## [1.1.4] - 2025-09-17 + +### Changed +- move certselector logic into ctrlm-main repo (#102) +- use version/branch from recipe (#109) + +### Added +- update AMC APP key mapping (#98) + +### Fixed +- getNetStatus call time out due to SAT download retries (#97) +- remove device from bluez during factory reset (#100) +- Missing Thunder cflags in ctrlm implemenation (#103) + +### Removed +- remove ctrlm compile flags (#104) +- remove ctrlm build flags - CPC, DUNFELL (#105) +- remove ctrlm build flags - RF4CE_PACKET_ANALYSIS (#107) +- remove ctrlm build flags - DISABLE_BLE_VOICE (#106) + ## [1.1.3] - 2025-08-19 ### Changed diff --git a/CMakeLists.txt b/CMakeLists.txt index 90f4cfe..61dbb8e 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ set(CMAKE_BUILD_TYPE Release) set(CMAKE_NO_SYSTEM_FROM_IMPORTED ON) # PROJECT -project(ctrlm-main) +project(ctrlm-main VERSION ${CMAKE_PROJECT_VERSION}) # OPTIONS option(A5000_ENABLE "ES1 A5000 use libse051" OFF) @@ -42,15 +42,11 @@ option(BLE_ENABLED "Enable BLE" ON) option(BLE_SERVICES "Enable BLE Services" OFF) option(BREAKPAD "Enable BREAKPAD" OFF) option(BUILD_CTRLM_FACTORY "Build Control Factory Test" OFF) -option(CPC "Enable CPC" OFF) -option(DISABLE_BLE_VOICE "Disable BLE voice" OFF) option(DEEPSLEEP_CLOSE_DB "Deep Sleep Close DB" OFF) -option(DUNFELL_BUILD_SUPPORT "Enable DUNFELL_BUILD_SUPPORT" OFF) option(ENABLE_NETWORKED_STANDBY_MODE "Enable Networked Standby Mode)" OFF) option(FACTORY_AUDIO_PLAYBACK "Factory test audio playback" OFF) option(FACTORY_CUSTOM_AUDIO_ANALYSIS "Factory custom audio analysis" OFF) option(FDC_ENABLED "Enable FDC" OFF) -option(GIT_BRANCH, "Repository Branch" OFF) option(IP_ENABLED "Enable IP" OFF) option(LOCAL_MIC "Local Microphone" OFF) option(LOCAL_MIC_DISABLE_VIA_PRIVACY "Use Privacy to disable microphone" OFF) @@ -58,9 +54,8 @@ option(MEM_DEBUG "Enable memory debugging" OFF) option(MEMORY_LOCK "Memory Lock" OFF) option(MIC_TAP "Enable MIC_TAP" OFF) option(RF4CE_ENABLED "Enable RF4CE" ON) -option(RF4CE_PACKET_ANALYSIS "Enable RF4CE_PACKET_ANALYSIS" OFF) option(TELEMETRY_SUPPORT "Enable TELEMETRY_SUPPORT" OFF) -option(THUNDER "Enable THUNDER" OFF) +option(THUNDER "Enable THUNDER" ON) option(THUNDER_SECURITY "Enable THUNDER_SECURITY" OFF) option(USE_SAFEC "Use safec" OFF) option(USE_IARM_POWER_MANAGER "Use IARM Power Manager" OFF) @@ -84,7 +79,7 @@ set(BEEP_ON_KWD_FILE "NONE" CACHE STRING "Keyword Beep file name") set(CMAKE_ENABLE_EXPORTS ON) # EXECUTABLE(S) -add_executable(controlMgr src/ctrlm_config_default.json ctrlm_version_build.h ctrlm_config_default.h ${CMAKE_CURRENT_SOURCE_DIR}/src/ctrlm_config_default.c ${CMAKE_CURRENT_SOURCE_DIR}/src/voice/ipc/ctrlm_voice_ipc_request_type.c) +add_executable(controlMgr src/ctrlm_config_default.json ctrlm_version_build.h ctrlm_config_default.h ${CMAKE_CURRENT_SOURCE_DIR}/src/ctrlm_config_default.c) if(BUILD_CTRLM_FACTORY) add_library(ctrlm-fta) @@ -146,7 +141,7 @@ add_subdirectory(src) # COMPILER OPTIONS target_compile_options(controlMgr PUBLIC -fPIC -rdynamic -Wall -Werror) -add_compile_definitions(_REENTRANT _POSIX_C_SOURCE=200809L _GNU_SOURCE SYSTEMD_NOTIFY XR15_704 _REENTRANT) +add_compile_definitions(_REENTRANT _POSIX_C_SOURCE=200809L _GNU_SOURCE _REENTRANT) target_link_libraries( controlMgr @@ -199,25 +194,6 @@ if(ASSERT_ON_WRONG_THREAD) add_compile_definitions(ASSERT_ON_WRONG_THREAD) endif() -if(AUTH_ENABLED) - if(EXISTS ${CMAKE_SYSROOT}/usr/lib/libctrlm-hal-certificate.so) - add_compile_definitions(AUTH_ENABLED) - add_compile_definitions(AUTH_ACCOUNT_ID) - add_compile_definitions(AUTH_DEVICE_ID) - add_compile_definitions(AUTH_PARTNER_ID) - add_compile_definitions(AUTH_SAT_TOKEN) - 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 ctrlm-hal-certificate) - else() - message(WARNING "ctrlm-hal-certificate library is not provided, disabling authentication") - unset(AUTH_ENABLED) - endif() -endif() - if(BLE_ENABLED) target_link_libraries(controlMgr BTMgr) if(BLE_SERVICES) @@ -231,18 +207,10 @@ if(BREAKPAD) add_compile_definitions(BREAKPAD_SUPPORT) endif() -if(CPC_ENABLED) - target_link_libraries(controlMgr ${CTRLM_CPC_LIBRARY}) -endif() - if(DEEPSLEEP_CLOSE_DB) add_compile_definitions(DEEPSLEEP_CLOSE_DB) endif() -if(DISABLE_BLE_VOICE) - add_compile_definitions(DISABLE_BLE_VOICE) -endif() - if(ENABLE_ASYNC_SRVR_MSG) add_compile_definitions(SUPPORT_ASYNC_SRVR_MSG) endif() @@ -263,10 +231,6 @@ if(IP_ENABLED) add_compile_definitions(CTRLM_NETWORK_IP CTRLM_IP_HAL_LOG_ENABLED) endif() -if(THUNDER) - add_compile_definitions(CTRLM_THUNDER) -endif() - if(LOCAL_MIC) add_compile_definitions(CTRLM_LOCAL_MIC) if(MIC_TAP) @@ -306,11 +270,23 @@ if(THUNDER) if(WPE_FRAMEWORK_PROTO_TRACING) target_link_libraries(controlMgr WPEFrameworkProtocols WPEFrameworkTracing) endif() -endif() - -if(THUNDER_SECURITY) - add_compile_definitions(THUNDER_SECURITY) - target_link_libraries(controlMgr WPEFrameworkSecurityUtil) + if(THUNDER_SECURITY) + add_compile_definitions(THUNDER_SECURITY) + target_link_libraries(controlMgr WPEFrameworkSecurityUtil) + endif() + if(AUTH_ENABLED) + add_compile_definitions(AUTH_ENABLED) + add_compile_definitions(AUTH_ACCOUNT_ID) + add_compile_definitions(AUTH_DEVICE_ID) + add_compile_definitions(AUTH_PARTNER_ID) + add_compile_definitions(AUTH_SAT_TOKEN) + 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() if(USE_IARM_POWER_MANAGER) @@ -343,15 +319,14 @@ install(FILES ${CMAKE_BINARY_DIR}/ctrlm_config.json.template DESTINATION ${CMAKE # GENERATED FILES add_custom_command( OUTPUT ctrlm_version_build.h - COMMAND echo "#define CTRLM_MAIN_VER_MAJOR \"1\"" > ctrlm_version_build.h - COMMAND echo -n "#define CTRLM_MAIN_VER_MINOR \"" >> ctrlm_version_build.h - COMMAND bash -c "echo -n $(git -C ${CMAKE_CURRENT_SOURCE_DIR} rev-list --count 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD) >> ctrlm_version_build.h" - COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} diff --quiet || echo -n "++" >> ctrlm_version_build.h + COMMAND echo -n "#define CTRLM_MAIN_BRANCH \"" >> ctrlm_version_build.h + COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} branch --all --contains | sed -n -e "s/^\\s*remotes\\/origin\\///" -e "2p" | tr -d "\\n" >> ctrlm_version_build.h COMMAND echo "\"" >> ctrlm_version_build.h - COMMAND echo "#define CTRLM_MAIN_BRANCH \"${GIT_BRANCH}\"" >> ctrlm_version_build.h COMMAND echo -n "#define CTRLM_MAIN_COMMIT_ID " >> ctrlm_version_build.h COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} log --format=\"%H\" -n 1 >> ctrlm_version_build.h - COMMAND echo "#define CTRLM_MAIN_VERSION (CTRLM_MAIN_VER_MAJOR \".\" CTRLM_MAIN_VER_MINOR)" >> ctrlm_version_build.h + COMMAND echo -n "#define CTRLM_MAIN_VERSION \"${CMAKE_PROJECT_VERSION}" >> ctrlm_version_build.h + COMMAND git -C ${CMAKE_CURRENT_SOURCE_DIR} diff --quiet || echo -n "++" >> ctrlm_version_build.h + COMMAND echo "\"" >> ctrlm_version_build.h VERBATIM ) diff --git a/include/ctrlm_ipc_voice.h b/include/ctrlm_ipc_voice.h index d5a58bc..270b92d 100644 --- a/include/ctrlm_ipc_voice.h +++ b/include/ctrlm_ipc_voice.h @@ -304,11 +304,11 @@ typedef struct { // IARM Event JSON // This structure is used for the following calls: -// CTRLM_VOICE_IARM_EVENT_SESSION_BEGIN_JSON -// CTRLM_VOICE_IARM_EVENT_STREAM_BEGIN_JSON +// CTRLM_VOICE_IARM_EVENT_SESSION_BEGIN_JSON +// CTRLM_VOICE_IARM_EVENT_STREAM_BEGIN_JSON // CTRLM_VOICE_IARM_EVENT_SERVER_MESSAGE_JSON -// CTRLM_VOICE_IARM_EVENT_STREAM_END_JSON -// CTRLM_VOICE_IARM_EVENT_SESSION_END_JSON +// CTRLM_VOICE_IARM_EVENT_STREAM_END_JSON +// CTRLM_VOICE_IARM_EVENT_SESSION_END_JSON // // The payload MUST be a NULL terminated JSON String. typedef struct { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1959af7..ab20447 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -81,7 +81,6 @@ target_sources(controlMgr PRIVATE voice/endpoints/ctrlm_voice_endpoint_ws_nsp.cpp voice/ipc/ctrlm_voice_ipc_iarm_all.cpp voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp - voice/ipc/ctrlm_voice_ipc_request_type.c ) if(BLE_ENABLED) @@ -174,16 +173,6 @@ if(RF4CE_ENABLED) rf4ce/rib/ctrlm_rf4ce_rib.cpp rf4ce/rib/ctrlm_rf4ce_rib_attr.cpp ) - - if(RF4CE_PACKET_ANALYSIS) - target_sources(controlMgr PRIVATE - ctrlm_rf4ce_voice_packet_analysis.cpp - ) - else() - target_sources(controlMgr PRIVATE - stubs/stubs_voice_packet_analysis.cpp - ) - endif() endif() if(TELEMETRY_SUPPORT) @@ -209,12 +198,14 @@ if(THUNDER) thunder/plugins/ctrlm_thunder_plugin_system.cpp ipc/ctrlm_rcp_ipc_iarm_thunder.cpp voice/ipc/ctrlm_voice_ipc_iarm_thunder.cpp + voice/ipc/ctrlm_voice_ipc_request_type.c ) if(AUTH_ENABLED) target_sources(controlMgr PRIVATE auth/ctrlm_auth.cpp auth/ctrlm_auth_thunder.cpp + auth/ctrlm_auth_certificate.cpp auth/ctrlm_thunder_plugin_authservice.cpp ) endif() diff --git a/src/auth/ctrlm_auth_certificate.cpp b/src/auth/ctrlm_auth_certificate.cpp new file mode 100644 index 0000000..63ff900 --- /dev/null +++ b/src/auth/ctrlm_auth_certificate.cpp @@ -0,0 +1,171 @@ +/* + * If not stated otherwise in this file or this component's license file the + * following copyright and licenses apply: + * + * Copyright 2015 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ +#include +#include +#include +#include +#include +#include +#include +#include "rdkcertselector.h" +#include "ctrlm_auth_certificate.h" +#include "ctrlm_utils.h" +#include "ctrlm_log.h" + +#define CERT_FILENAME_PREFIX "file://" + +ctrlm_auth_certificate_t *ctrlm_auth_certificate_get() { + return(new(ctrlm_auth_certificate_t)); +} + +ctrlm_auth_certificate_t::ctrlm_auth_certificate_t() { + + this->device_cert.type = CTRLM_VOICE_CERT_TYPE_NONE; + this->ocsp_verify_stapling = false; + this->ocsp_verify_ca = false; + + char *cert_path = NULL; + char *cert_password = NULL; + rdkcertselector_h cert_selector = rdkcertselector_new( NULL, NULL, "MTLS" ); + + if(cert_selector == NULL){ + XLOGD_TELEMETRY("cert selector init failed"); + } else { + rdkcertselectorStatus_t cert_status = rdkcertselector_getCert(cert_selector, &cert_path, &cert_password); + + if(cert_status != certselectorOk) { + XLOGD_TELEMETRY("cert selector retrieval failed"); + } else { + if(cert_path == NULL || cert_password == NULL) { + XLOGD_TELEMETRY("cert selector get failed"); + } else { + + char *local_path = cert_path; + if(strncmp(local_path, CERT_FILENAME_PREFIX, strlen(CERT_FILENAME_PREFIX)) == 0) { + local_path += strlen(CERT_FILENAME_PREFIX); + } + if(!this->device_cert_p12_set(local_path, cert_password)) { + XLOGD_TELEMETRY("unable to set device certificate <%s>", local_path); + } else { + struct stat file_info; + // OCSP is a global setting that is enabled via RFC in systemd service ocsp-support + if(stat("/tmp/.EnableOCSPStapling", &file_info) == 0) { + XLOGD_TELEMETRY("OCSP verification enabled (stapling)"); + this->ocsp_verify_stapling = true; + } + if(stat("/tmp/.EnableOCSPCA", &file_info) == 0) { + XLOGD_TELEMETRY("OCSP verification enabled (CA)"); + this->ocsp_verify_ca = true; + } + if(!this->ocsp_verify_stapling && !this->ocsp_verify_ca) { + XLOGD_TELEMETRY("OCSP verification disabled"); + } + } + } + } + } + + if(cert_selector != NULL) { + rdkcertselector_free(&cert_selector); + } +} + +ctrlm_auth_certificate_t::~ctrlm_auth_certificate_t() { + if(this->device_cert.type == CTRLM_VOICE_CERT_TYPE_P12) { + if(this->device_cert.cert.p12.certificate != NULL) { + free((void *)this->device_cert.cert.p12.certificate); + } + if(this->device_cert.cert.p12.passphrase != NULL) { + free((void *)this->device_cert.cert.p12.passphrase); + } + } +} + +bool ctrlm_auth_certificate_t::device_cert_get(ctrlm_voice_cert_t &device_cert, bool &ocsp_verify_stapling, bool &ocsp_verify_ca) { + + device_cert = this->device_cert; + ocsp_verify_stapling = this->ocsp_verify_stapling; + ocsp_verify_ca = this->ocsp_verify_ca; + return(true); +} + +bool ctrlm_auth_certificate_t::device_cert_p12_set(const char *certificate, const char *passphrase) { + bool cert_valid = false; + + // Extract the certificate, private key and additional certificates + PKCS12 *p12_cert = NULL; + EVP_PKEY *pkey = NULL; + X509 *x509_cert = NULL; + STACK_OF(X509) *additional_certs = NULL; + + do { + FILE *fp = fopen(certificate, "rb"); + if(fp == NULL) { + XLOGD_ERROR("unable to open P12 certificate <%s>", certificate); + break; + } + + d2i_PKCS12_fp(fp, &p12_cert); + fclose(fp); + fp = NULL; + + if(p12_cert == NULL) { + XLOGD_ERROR("unable to read P12 certificate <%s>", certificate); + break; + } + + if(1 != PKCS12_parse(p12_cert, passphrase, &pkey, &x509_cert, &additional_certs)) { + XLOGD_ERROR("unable to parse P12 certificate <%s>", certificate); + break; + } + + this->device_cert.type = CTRLM_VOICE_CERT_TYPE_P12; + this->device_cert.cert.p12.certificate = strdup(certificate); + this->device_cert.cert.p12.passphrase = strdup(passphrase); + + // Ensure the strings were duplicated + if(this->device_cert.cert.p12.certificate == NULL || this->device_cert.cert.p12.passphrase == NULL) { + this->device_cert.type = CTRLM_VOICE_CERT_TYPE_NONE; + if(this->device_cert.cert.p12.certificate != NULL) { + free((void *)this->device_cert.cert.p12.certificate); + } + if(this->device_cert.cert.p12.passphrase != NULL) { + free((void *)this->device_cert.cert.p12.passphrase); + } + } else { + cert_valid = true; + } + + } while(0); + + if(p12_cert != NULL) { + PKCS12_free(p12_cert); + } + if(pkey != NULL) { + EVP_PKEY_free(pkey); + } + if(x509_cert != NULL) { + X509_free(x509_cert); + } + if(additional_certs != NULL) { + sk_X509_pop_free(additional_certs, X509_free); + } + + return(cert_valid); +} diff --git a/src/auth/ctrlm_hal_certificate.h b/src/auth/ctrlm_auth_certificate.h similarity index 89% rename from src/auth/ctrlm_hal_certificate.h rename to src/auth/ctrlm_auth_certificate.h index 93e6f03..cdf8719 100644 --- a/src/auth/ctrlm_hal_certificate.h +++ b/src/auth/ctrlm_auth_certificate.h @@ -17,8 +17,8 @@ * limitations under the License. */ -#ifndef __CTRLM_HAL_CERTIFICATE_H__ -#define __CTRLM_HAL_CERTIFICATE_H__ +#ifndef __CTRLM_AUTH_CERTIFICATE_H__ +#define __CTRLM_AUTH_CERTIFICATE_H__ #include #include @@ -62,10 +62,10 @@ typedef struct { } cert; } ctrlm_voice_cert_t; -class ctrlm_hal_certificate_t { +class ctrlm_auth_certificate_t { public: - ctrlm_hal_certificate_t(); - virtual ~ctrlm_hal_certificate_t(); + ctrlm_auth_certificate_t(); + virtual ~ctrlm_auth_certificate_t(); virtual bool device_cert_get(ctrlm_voice_cert_t &device_cert, bool &ocsp_verify_stapling, bool &ocsp_verify_ca); @@ -77,6 +77,6 @@ class ctrlm_hal_certificate_t { bool ocsp_verify_ca; }; -ctrlm_hal_certificate_t *ctrlm_hal_certificate_get(); +ctrlm_auth_certificate_t *ctrlm_auth_certificate_get(); #endif diff --git a/src/auth/ctrlm_thunder_plugin_authservice.cpp b/src/auth/ctrlm_thunder_plugin_authservice.cpp index aaaa4e1..60c57d7 100644 --- a/src/auth/ctrlm_thunder_plugin_authservice.cpp +++ b/src/auth/ctrlm_thunder_plugin_authservice.cpp @@ -22,8 +22,6 @@ #include #include -#define SAT_TIMEOUT_RETRIES (2) - using namespace Thunder; using namespace AuthService; using namespace WPEFramework; @@ -148,7 +146,7 @@ bool ctrlm_thunder_plugin_authservice_t::get_experience(std::string &experience) bool ctrlm_thunder_plugin_authservice_t::get_sat(std::string &sat, time_t &expiration) { bool ret = false; JsonObject params, response; - if(this->call_plugin("getServiceAccessToken", (void *)¶ms, (void *)&response, SAT_TIMEOUT_RETRIES)) { + if(this->call_plugin("getServiceAccessToken", (void *)¶ms, (void *)&response)) { if(response["success"].Boolean()) { // If success doesn't exist, it defaults to false which is fine. if(response["status"].Number() == 0) { std::string temp = response["token"].String(); diff --git a/src/ble/ctrlm_ble_network.cpp b/src/ble/ctrlm_ble_network.cpp index 3de8077..dca4c78 100644 --- a/src/ble/ctrlm_ble_network.cpp +++ b/src/ble/ctrlm_ble_network.cpp @@ -58,6 +58,7 @@ using namespace std; #define CTRLM_VENDOR_BLE_NETWORK_DISABLE_FILE "/etc/vendor/input/ble_network_disable" #define CTRLM_VENDOR_BLE_REMOTE_WHITELIST_FILE "/etc/vendor/input/ble_remote_whitelist.json" +#define CTRLM_VENDOR_BLE_NETWORK_OPTIONS_FILE "/etc/vendor/input/ble_network_options.json" #define CTRLM_VENDOR_BLE_NETWORK_TIMEOUTS_FILE "/etc/vendor/input/ble_network_timeouts.json" typedef struct { @@ -172,6 +173,46 @@ static int ctrlm_ble_network_factory(vendor_network_opts_t *opts, json_t *json_c } } + + // If the vendor supplied options are provided, use them. Otherwise use the default values. + const char *vendor_options_file = CTRLM_VENDOR_BLE_NETWORK_OPTIONS_FILE; + + if(ctrlm_file_exists(vendor_options_file)) { + XLOGD_INFO("Using vendor options file: %s", vendor_options_file); + + json_t *json_obj_vendor_options = json_load_file(vendor_options_file, JSON_REJECT_DUPLICATES, NULL); + + if(json_obj_vendor_options == NULL || !json_is_object(json_obj_vendor_options)) { + XLOGD_ERROR("invalid vendor options file format"); + } else { + // Make sure the json_obj_net_ble object is valid + if(json_obj_net_ble == NULL) { // Create a json object + json_obj_net_ble = json_object(); + } + if(json_obj_net_ble == NULL) { + XLOGD_ERROR("invalid BLE network json object"); + } else { // Update the "options" section in the json_obj_net_ble object + int rc = 0; + json_t *obj_options = json_object_get(json_obj_net_ble, JSON_OBJ_NAME_NETWORK_BLE_OPTIONS); + if(obj_options == NULL || !json_is_object(obj_options)) { + rc = json_object_set_new(json_obj_net_ble, JSON_OBJ_NAME_NETWORK_BLE_OPTIONS, json_obj_vendor_options); + } else { + rc = json_object_update(obj_options, json_obj_vendor_options); + } + if(rc != 0) { + XLOGD_ERROR("failed to update vendor options in BLE network json object"); + } else { + XLOGD_INFO("successfully updated vendor options in BLE network json object"); + json_obj_vendor_options = NULL; + } + } + } + if(json_obj_vendor_options != NULL) { + json_decref(json_obj_vendor_options); + json_obj_vendor_options = NULL; + } + } + // If the vendor supplied timeouts are provided, use them. Otherwise use the default timeouts. const char *vendor_timeouts_file = CTRLM_VENDOR_BLE_NETWORK_TIMEOUTS_FILE; @@ -246,10 +287,25 @@ ctrlm_obj_network_ble_t::ctrlm_obj_network_ble_t(ctrlm_network_type_t type, ctrl version_ = "unknown"; init_result_ = CTRLM_HAL_RESULT_ERROR; ready_ = false; + voice_disabled_ = false; g_ctrlm_ble_network.upgrade_controllers_timer_tag = 0; g_ctrlm_ble_network.upgrade_pause_timer_tag = 0; + if(json_obj_net_ble != NULL) { + // Process network options + json_t *obj_options = json_object_get(json_obj_net_ble, JSON_OBJ_NAME_NETWORK_BLE_OPTIONS); + if(obj_options != NULL && json_is_object(obj_options)) { + json_t *json_value = json_object_get(obj_options, JSON_BOOL_NAME_NETWORK_BLE_OPTIONS_DISABLE_VOICE); + if(json_value != NULL && json_is_boolean(json_value)) { + voice_disabled_ = json_boolean_value(json_value); + if(voice_disabled_) { + XLOGD_INFO("BLE voice support is disabled by config"); + } + } + } + } + ctrlm_rfc_t *rfc = ctrlm_rfc_t::get_instance(); if(rfc) { rfc->add_changed_listener(ctrlm_rfc_t::attrs::BLE, std::bind(&ctrlm_obj_network_ble_t::rfc_retrieved_handler, this, std::placeholders::_1)); @@ -451,12 +507,11 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si dqm->params->result = CTRLM_IARM_CALL_RESULT_ERROR; -#ifdef DISABLE_BLE_VOICE - XLOGD_WARN("BLE Voice is disabled in ControlMgr, so not starting a voice session."); - dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; -#else - if (!ready_) { + if(!ready_) { XLOGD_FATAL("Network is not ready!"); + } else if(voice_disabled_) { + XLOGD_WARN("BLE Voice is disabled in ControlMgr, so not starting a voice session."); + dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } else { ctrlm_controller_id_t controller_id; unsigned long long ieee_address = dqm->params->ieee_address; @@ -536,7 +591,6 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_begin(void *data, int si } } } -#endif //DISABLE_BLE_VOICE if(dqm->semaphore) { sem_post(dqm->semaphore); } @@ -577,11 +631,11 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_end(void *data, int size g_assert(size == sizeof(ctrlm_main_queue_msg_voice_session_t)); dqm->params->result = CTRLM_IARM_CALL_RESULT_ERROR; -#ifdef DISABLE_BLE_VOICE - dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; -#else + if (!ready_) { XLOGD_FATAL("Network is not ready!"); + } else if(voice_disabled_) { + dqm->params->result = CTRLM_IARM_CALL_RESULT_SUCCESS; } else { ctrlm_controller_id_t controller_id; unsigned long long ieee_address = dqm->params->ieee_address; @@ -595,7 +649,6 @@ void ctrlm_obj_network_ble_t::req_process_voice_session_end(void *data, int size } } } -#endif //DISABLE_BLE_VOICE if(dqm->semaphore) { sem_post(dqm->semaphore); } @@ -1126,9 +1179,11 @@ void ctrlm_obj_network_ble_t::factory_reset(void) { XLOGD_INFO("Sending RCU action unpair to all controllers."); - // Since we are factory resetting anyway, don't waste time unpairing the remote after the - // remote notifies us of unpair reason through RemoteControl service - this->unpair_on_remote_request_ = false; + // Need to unpair the remote on the target side as well even though a factory + // reset will clear out the entire pairing table. This is because a reconnection + // attempt could occur with the remote before factory reset completes which would + // prevent the remote from auto-pairing after the reset. + this->unpair_on_remote_request_ = true; for (auto const &controller : controllers_) { if (ble_rcu_interface_) { diff --git a/src/ble/ctrlm_ble_network.h b/src/ble/ctrlm_ble_network.h index cd80401..92868ca 100644 --- a/src/ble/ctrlm_ble_network.h +++ b/src/ble/ctrlm_ble_network.h @@ -204,6 +204,7 @@ class ctrlm_obj_network_ble_t : public ctrlm_obj_network_t { ctrlm_controller_id_t find_controller_from_upgrade_session_uuid(const std::string &uuid); json_t * json_config_ = NULL; + bool voice_disabled_ = false; bool upgrade_in_progress_ = false; bool unpair_on_remote_request_ = true; ctrlm_ble_unpair_metrics_t last_rcu_unpair_metrics_; diff --git a/src/ble/hal/blercu/bleservices/gatt/gatt_upgradeservice.cpp b/src/ble/hal/blercu/bleservices/gatt/gatt_upgradeservice.cpp index b49b762..1ac11a0 100644 --- a/src/ble/hal/blercu/bleservices/gatt/gatt_upgradeservice.cpp +++ b/src/ble/hal/blercu/bleservices/gatt/gatt_upgradeservice.cpp @@ -885,7 +885,12 @@ static gboolean timerEvent(gpointer user_data) result = us->m_ptr->onTimeout(); } - delete us; + /* GLib timeout repeats on true so it needs this data + * only delete when the timer is complete (e.g. returns false) + * */ + if (!result) { + delete us; + } return result; } diff --git a/src/ble/hal/blercu/bluez/blercudevice.cpp b/src/ble/hal/blercu/bluez/blercudevice.cpp index 8e6b5b1..8212a3a 100644 --- a/src/ble/hal/blercu/bluez/blercudevice.cpp +++ b/src/ble/hal/blercu/bluez/blercudevice.cpp @@ -97,6 +97,8 @@ BleRcuDeviceBluez::BleRcuDeviceBluez(const BleAddress &bdaddr, , m_lastPairedState(false) , m_lastServicesResolvedState(false) , m_isPairing(false) + , m_pairingRetryCnt(0) + , m_maxPairingRetries(3) , m_timeSinceReady(0) , m_recoveryAttempts(0) , m_maxRecoveryAttempts(100) @@ -261,11 +263,17 @@ void BleRcuDeviceBluez::onPairRequestReply(PendingReply<> *reply) if (reply->isError()) { m_isPairing = false; - // an error occurred so log it XLOGD_ERROR("%s pairing request failed with error: <%s>", - m_address.toString().c_str(), reply->errorMessage().c_str()); - - m_pairingErrorSlots.invoke(reply->errorMessage()); + m_address.toString().c_str(), reply->errorMessage().c_str()); + + if (m_pairingRetryCnt < m_maxPairingRetries) { + m_pairingRetryCnt++; + XLOGD_INFO("Retrying pairing, attempt %d out of %d ", m_pairingRetryCnt, m_maxPairingRetries); + pair(0); + } else { + m_pairingRetryCnt = 0; + m_pairingErrorSlots.invoke(reply->errorMessage()); + } } else { XLOGD_DEBUG("%s pairing request successful", m_address.toString().c_str()); } diff --git a/src/ble/hal/blercu/bluez/blercudevice_p.h b/src/ble/hal/blercu/bluez/blercudevice_p.h index 93cef7a..39ecd86 100644 --- a/src/ble/hal/blercu/bluez/blercudevice_p.h +++ b/src/ble/hal/blercu/bluez/blercudevice_p.h @@ -232,6 +232,9 @@ class BleRcuDeviceBluez : public BleRcuDevice bool m_lastServicesResolvedState; bool m_isPairing; + int m_pairingRetryCnt; + int m_maxPairingRetries; + GTimer* m_timeSinceReady; int m_recoveryAttempts; diff --git a/src/ctrlm.h b/src/ctrlm.h index 18d0f99..68fa181 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -29,7 +29,6 @@ #include "ctrlm_hal.h" #include "ctrlm_hal_rf4ce.h" #include "ctrlm_hal_ble.h" -#include "ctrlm_hal_certificate.h" #include "ctrlm_hal_ip.h" #include "ctrlm_ipc.h" #include "ctrlm_ipc_rcu.h" diff --git a/src/ctrlm_config_default.json b/src/ctrlm_config_default.json index e955041..a30bde8 100755 --- a/src/ctrlm_config_default.json +++ b/src/ctrlm_config_default.json @@ -219,6 +219,9 @@ } }, "network_ble" : { + "options": { + "disable_voice" : false + }, "timeouts": { "discovery": 15000, "pair": 20000, diff --git a/src/ctrlm_device_update.cpp b/src/ctrlm_device_update.cpp index 552cf71..92c21a1 100644 --- a/src/ctrlm_device_update.cpp +++ b/src/ctrlm_device_update.cpp @@ -197,9 +197,9 @@ typedef struct { guint32 rf4ce_session_active_count; guint32 rf4ce_session_count; map rf4ce_sessions; -#ifdef XR15_704 + gboolean xr15_crash_update; -#endif + vector *sessions; } ctrlm_device_update_t; @@ -276,10 +276,9 @@ void ctrlm_device_update_init(json_t *json_obj_device_update) { g_ctrlm_device_update.prefs.update_dirs.push_back(JSON_ARRAY_VAL_STR_DEVICE_UPDATE_DEVICE_UPDATE_DIRS_3); g_ctrlm_device_update.prefs.update_dirs.push_back(JSON_ARRAY_VAL_STR_DEVICE_UPDATE_DEVICE_UPDATE_DIRS_4); g_ctrlm_device_update.prefs.update_dirs.push_back(JSON_ARRAY_VAL_STR_DEVICE_UPDATE_DEVICE_UPDATE_DIRS_5); - -#ifdef XR15_704 + g_ctrlm_device_update.xr15_crash_update = false; -#endif + g_ctrlm_device_update.sessions = NULL; // Create an asynchronous queue to receive incoming messages from the networks @@ -859,15 +858,12 @@ void ctrlm_device_update_process_device_file(const std::string &file_path_archiv g_ctrlm_device_update.rf4ce_images->at(image_info.id) = image_info; } - // HACK FOR XR15-704 -#ifdef XR15_704 version_software_t version_bug = {XR15_DEVICE_UPDATE_BUG_FIRMWARE_MAJOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_MINOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_REVISION, XR15_DEVICE_UPDATE_BUG_FIRMWARE_PATCH}; if(RF4CE_CONTROLLER_TYPE_XR15 == controller_type && ctrlm_device_update_rf4ce_is_software_version_min_met(image_info.version_software, version_bug)) { XLOGD_INFO("XR15v1 image >= 2.0.0.0 available, enabling crash code for XR15v1s running < 2.0.0.0"); g_ctrlm_device_update.xr15_crash_update = true; } -#endif - // HACK FOR XR15-704 + if(ctrlm_is_rf4ce_enabled()) { // Firmware Notify message errno_t safec_rc = -1; @@ -2445,11 +2441,9 @@ string ctrlm_device_update_get_software_version(guint16 image_id){ return string(sw_version); } -#ifdef XR15_704 gboolean ctrlm_device_update_xr15_crash_update_get() { return g_ctrlm_device_update.xr15_crash_update; } -#endif void ctrlm_device_update_rf4ce_session_resume(vector *sessions) { // Store sessions vector diff --git a/src/ctrlm_device_update.h b/src/ctrlm_device_update.h index a46d746..0497308 100644 --- a/src/ctrlm_device_update.h +++ b/src/ctrlm_device_update.h @@ -28,14 +28,10 @@ #define CTRLM_DEVICE_UPDATE_EXTENDED_TIMEOUT_VALUE (45) #define CTRLM_DEVICE_UPDATE_USE_DEFAULT_TIMEOUT (0) -// HACK FOR XR15-704 -#ifdef XR15_704 #define XR15_DEVICE_UPDATE_BUG_FIRMWARE_MAJOR (2) #define XR15_DEVICE_UPDATE_BUG_FIRMWARE_MINOR (0) #define XR15_DEVICE_UPDATE_BUG_FIRMWARE_REVISION (0) #define XR15_DEVICE_UPDATE_BUG_FIRMWARE_PATCH (0) -#endif -// HACK FOR XR15-704 typedef enum { // locations to check for firmware and audio updates @@ -138,9 +134,7 @@ std::string ctrlm_device_update_get_software_version(guint16 image_id); void ctrlm_device_update_rf4ce_session_resume(std::vector *sessions); guint32 ctrlm_device_update_request_timeout_get(void); -#ifdef XR15_704 gboolean ctrlm_device_update_xr15_crash_update_get(); -#endif #ifdef __cplusplus } diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index f0be11e..e12749c 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -62,7 +62,7 @@ #endif #ifdef AUTH_ENABLED #include "ctrlm_auth.h" -#include "ctrlm_hal_certificate.h" +#include "ctrlm_auth_certificate.h" #endif #include "ctrlm_rfc.h" #include "ctrlm_telemetry.h" @@ -75,9 +75,7 @@ #include "dsMgr.h" #include "dsRpc.h" #include "dsDisplay.h" -#ifdef SYSTEMD_NOTIFY #include -#endif #include #include "xr_voice_sdk.h" #include "ctrlm_voice_obj.h" @@ -278,7 +276,7 @@ typedef struct { ctrlm_cs_values_t cs_values; #ifdef AUTH_ENABLED ctrlm_auth_t *authservice; - ctrlm_hal_certificate_t *hal_certificate; + ctrlm_auth_certificate_t *auth_certificate; #endif #ifdef CTRLM_THUNDER Thunder::DeviceInfo::ctrlm_thunder_plugin_device_info_t *thunder_device_info; @@ -448,7 +446,7 @@ int main(int argc, char *argv[]) { // Set stdout to be line buffered setvbuf(stdout, NULL, _IOLBF, 0); - XLOGD_INFO("name <%-24s> version <%-7s> branch <%-20s> commit <%s>", "ctrlm-main", CTRLM_MAIN_VERSION, CTRLM_MAIN_BRANCH, CTRLM_MAIN_COMMIT_ID); + XLOGD_INFO("name <%-24s> version <%-9s> branch <%-20s> commit <%s>", "ctrlm-main", CTRLM_MAIN_VERSION, CTRLM_MAIN_BRANCH, CTRLM_MAIN_COMMIT_ID); #ifdef MEMORY_LOCK clnl_init(); @@ -517,7 +515,7 @@ int main(int argc, char *argv[]) { for(uint32_t index = 0; index < qty_vsdk; index++) { vsdk_version_info_t *entry = &version_info[index]; if(entry->name != NULL) { - XLOGD_INFO("name <%-24s> version <%-7s> branch <%-20s> commit <%s>", entry->name ? entry->name : "NULL", entry->version ? entry->version : "NULL", entry->branch ? entry->branch : "NULL", entry->commit_id ? entry->commit_id : "NULL"); + XLOGD_INFO("name <%-24s> version <%-9s> branch <%-20s> commit <%s>", entry->name ? entry->name : "NULL", entry->version ? entry->version : "NULL", entry->branch ? entry->branch : "NULL", entry->commit_id ? entry->commit_id : "NULL"); } } vsdk_init(); @@ -694,14 +692,14 @@ int main(int argc, char *argv[]) { #ifdef AUTH_ENABLED XLOGD_INFO("ctrlm_auth init"); - g_ctrlm.authservice = ctrlm_auth_service_create(g_ctrlm.server_url_authservice); - g_ctrlm.hal_certificate = ctrlm_hal_certificate_get(); + g_ctrlm.authservice = ctrlm_auth_service_create(g_ctrlm.server_url_authservice); + g_ctrlm.auth_certificate = ctrlm_auth_certificate_get(); ctrlm_voice_cert_t device_cert; bool ocsp_verify_stapling = false; bool ocsp_verify_ca = false; - if(!g_ctrlm.hal_certificate->device_cert_get(device_cert, ocsp_verify_stapling, ocsp_verify_ca)) { + if(!g_ctrlm.auth_certificate->device_cert_get(device_cert, ocsp_verify_stapling, ocsp_verify_ca)) { XLOGD_ERROR("unable to get device certificate"); } else { if(!g_ctrlm.voice_session->voice_stb_data_device_certificate_set(device_cert, ocsp_verify_stapling, ocsp_verify_ca)) { @@ -809,10 +807,12 @@ int main(int argc, char *argv[]) { g_ctrlm.ir_controller->db_load(); g_ctrlm.ir_controller->print_status(); + #ifdef CTRLM_THUNDER ctrlm_rcp_ipc_iarm_thunder_t *rcp_ipc = ctrlm_rcp_ipc_iarm_thunder_t::get_instance(); if (rcp_ipc) { rcp_ipc->register_ipc(); } + #endif XLOGD_INFO("init voice"); g_ctrlm.voice_session->voice_configure_config_file_json(json_obj_voice, json_obj_vsdk, g_ctrlm.local_conf ); @@ -6058,10 +6058,9 @@ gboolean ctrlm_start_iarm(gpointer user_data) { ctrlm_main_iarm_init(); -#ifdef SYSTEMD_NOTIFY XLOGD_INFO("Notifying systemd of successful initialization"); sd_notifyf(0, "READY=1\nSTATUS=ctrlm-main has successfully initialized\nMAINPID=%lu", (unsigned long)getpid()); -#endif + return false; } diff --git a/src/ctrlm_network.cpp b/src/ctrlm_network.cpp index 31d04b7..74ff412 100644 --- a/src/ctrlm_network.cpp +++ b/src/ctrlm_network.cpp @@ -113,12 +113,14 @@ ctrlm_obj_network_t::~ctrlm_obj_network_t() { } } + #ifdef CTRLM_THUNDER ctrlm_rcp_ipc_iarm_thunder_t *rcp_ipc = ctrlm_rcp_ipc_iarm_thunder_t::get_instance(); if (rcp_ipc) { rcp_ipc->deregister_ipc(); } // No need to also destroy rcp_ipc instance here because its a singleton and will get // automatically destroyed at ctrlm-main shutdown. + #endif } ctrlm_network_id_t ctrlm_obj_network_t::network_id_get() const { @@ -1020,6 +1022,7 @@ ctrlm_rf_pair_state_t ctrlm_obj_network_t::get_rf_pair_state() const { void ctrlm_obj_network_t::iarm_event_rcu_status(void) { XLOGD_DEBUG("Enter..."); + #ifdef CTRLM_THUNDER ctrlm_rcp_ipc_net_status_t msg; msg.populate_status(*this); @@ -1030,11 +1033,13 @@ void ctrlm_obj_network_t::iarm_event_rcu_status(void) { if (!rcp_ipc->on_status(msg)) { XLOGD_ERROR("Error broadcasting IARM message"); } + #endif } void ctrlm_obj_network_t::iarm_event_rcu_validation_status(void) { XLOGD_DEBUG("Enter..."); + #ifdef CTRLM_THUNDER ctrlm_rcp_ipc_validation_status_t msg; msg.populate_status(*this); @@ -1045,10 +1050,13 @@ void ctrlm_obj_network_t::iarm_event_rcu_validation_status(void) { if (!rcp_ipc->on_validation_status(msg)) { XLOGD_ERROR("Error broadcasting IARM message"); } + #endif } void ctrlm_obj_network_t::iarm_event_rcu_firmware_status(const ctrlm_obj_controller_t &rcu) { XLOGD_DEBUG("Enter..."); + + #ifdef CTRLM_THUNDER ctrlm_rcp_ipc_iarm_thunder_t *rcp_ipc = ctrlm_rcp_ipc_iarm_thunder_t::get_instance(); if (!rcp_ipc->is_thunder_device_update_enabled()) { @@ -1064,4 +1072,5 @@ void ctrlm_obj_network_t::iarm_event_rcu_firmware_status(const ctrlm_obj_control if (!rcp_ipc->on_firmware_update_progress(msg)) { XLOGD_ERROR("Error broadcasting IARM message"); } + #endif } diff --git a/src/ctrlm_rf4ce_voice_packet_analysis.cpp b/src/ctrlm_rf4ce_voice_packet_analysis.cpp deleted file mode 100644 index cdb0f6c..0000000 --- a/src/ctrlm_rf4ce_voice_packet_analysis.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - * If not stated otherwise in this file or this component's LICENSE file - * the following copyright and licenses apply: - * - * Copyright 2023 RDK Management - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "ctrlm_voice_packet_analysis.h" -#include "ctrlm_log.h" - -#define SEQUENCE_NUM_INVALID (0xFF) - -class ctrlm_voice_packet_analysis_rf4ce_t : public ctrlm_voice_packet_analysis { - public: - ctrlm_voice_packet_analysis_rf4ce_t(); - virtual void reset(); - virtual ctrlm_voice_packet_analysis_result_t packet_check(const void* header, unsigned long header_len, const void* data, unsigned long data_len); - virtual void stats_get(ctrlm_voice_packet_analysis_stats_t& stats) const; - private: - uint8_t sequence_num_last; - uint32_t total_packets; - uint32_t duplicated_packets; - uint32_t lost_packets; - uint32_t sequence_error_count; -}; - - - -ctrlm_voice_packet_analysis_rf4ce_t::ctrlm_voice_packet_analysis_rf4ce_t() : - sequence_num_last(SEQUENCE_NUM_INVALID), - total_packets(0), - duplicated_packets(0), - lost_packets(0), - sequence_error_count(0) - { - } - -void ctrlm_voice_packet_analysis_rf4ce_t::reset() { - sequence_num_last = 0x20; - total_packets = 0; - duplicated_packets = 0; - lost_packets = 0; - sequence_error_count = 0; -} - -ctrlm_voice_packet_analysis_result_t ctrlm_voice_packet_analysis_rf4ce_t::packet_check(const void* header, unsigned long header_len, const void* data, unsigned long data_len) { - ctrlm_voice_packet_analysis_result_t result = CTRLM_VOICE_PACKET_ANALYSIS_GOOD; - // sanity check - if (header_len != sizeof(uint8_t)) { - XLOGD_INFO("header_len != 1"); - return (result = CTRLM_VOICE_PACKET_ANALYSIS_ERROR); - } - - uint8_t seqnum_act = *(uint8_t*)header; - uint8_t seqnum_exp = sequence_num_last+1 > 0x3F ? 0x20 : sequence_num_last+1; - - if(seqnum_act == sequence_num_last) { - XLOGD_INFO("Sequence duplicate: rec:%x exp:%x", (unsigned)seqnum_act, (unsigned)seqnum_exp); - ++total_packets; - ++duplicated_packets; - return (result = CTRLM_VOICE_PACKET_ANALYSIS_DUPLICATE); // don't propagate repeated voice packets - } - - if(seqnum_act != seqnum_exp) { - XLOGD_INFO("Sequence discontinuity: rec:%x exp:%x", (unsigned)seqnum_act, (unsigned)seqnum_exp); - ++sequence_error_count; - uint8_t missing_packets; - if(seqnum_act > seqnum_exp) { - missing_packets = seqnum_act - seqnum_exp; - } else { - missing_packets = 0x20 - seqnum_exp + seqnum_act; - } - lost_packets += missing_packets; - total_packets += missing_packets; - result = CTRLM_VOICE_PACKET_ANALYSIS_DISCONTINUITY; - } - - sequence_num_last = seqnum_act; - total_packets++; - return result; -} - -void ctrlm_voice_packet_analysis_rf4ce_t::stats_get(ctrlm_voice_packet_analysis_stats_t& stats) const { - stats.total_packets = total_packets; - stats.bad_packets = 0; - stats.duplicated_packets = duplicated_packets; - stats.lost_packets = lost_packets; - stats.sequence_error_count = sequence_error_count; -} - -ctrlm_voice_packet_analysis* ctrlm_voice_packet_analysis_factory() { - return new ctrlm_voice_packet_analysis_rf4ce_t; -} - - - - - diff --git a/src/ctrlm_utils.cpp b/src/ctrlm_utils.cpp index cc94fa0..7166aba 100644 --- a/src/ctrlm_utils.cpp +++ b/src/ctrlm_utils.cpp @@ -1317,6 +1317,7 @@ static const map> ctrlm_linux_key_name {KEY_F21, {"Guide", "Guide"}}, {KEY_EPG, {"Guide", "Guide"}}, {KEY_F22, {"Accessibility", "Accessibility"}}, + {KEY_F23, {"AMC App", "AMC App"}}, {KEY_F8, {"Voice", "Voice"}}, {KEY_ESC, {"Dismiss", "Dismiss"}}, {KEY_F9, {"Quick Access Menu", "Quick Access Menu"}}, diff --git a/src/ctrlm_voice_packet_analysis.h b/src/ctrlm_voice_packet_analysis.h deleted file mode 100644 index f75b4e9..0000000 --- a/src/ctrlm_voice_packet_analysis.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * If not stated otherwise in this file or this component's license file the - * following copyright and licenses apply: - * - * Copyright 2014 RDK Management - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ -#ifndef CTRLM_VOICE_PACKET_ANALYSIS_H_ -#define CTRLM_VOICE_PACKET_ANALYSIS_H_ - -#include - -enum ctrlm_voice_packet_analysis_result_t { - CTRLM_VOICE_PACKET_ANALYSIS_GOOD, - CTRLM_VOICE_PACKET_ANALYSIS_DUPLICATE, - CTRLM_VOICE_PACKET_ANALYSIS_DISCONTINUITY, - CTRLM_VOICE_PACKET_ANALYSIS_BAD, - CTRLM_VOICE_PACKET_ANALYSIS_ERROR -}; - -struct ctrlm_voice_packet_analysis_stats_t { - uint32_t total_packets; - uint32_t bad_packets; - uint32_t duplicated_packets; - uint32_t lost_packets; - uint32_t sequence_error_count; -}; - -class ctrlm_voice_packet_analysis { - public: - ctrlm_voice_packet_analysis(){}; - virtual ~ctrlm_voice_packet_analysis(){}; - virtual void reset()=0; - virtual ctrlm_voice_packet_analysis_result_t packet_check(const void* header, unsigned long header_len, const void* data, unsigned long data_len) =0; - virtual void stats_get(ctrlm_voice_packet_analysis_stats_t& stats) const=0; -}; - -ctrlm_voice_packet_analysis* ctrlm_voice_packet_analysis_factory(); - -#endif /* CTRLM_VOICE_PACKET_ANALYSIS_H_ */ diff --git a/src/ipc/ctrlm_ipc_iarm.cpp b/src/ipc/ctrlm_ipc_iarm.cpp index b8d1684..6d96019 100644 --- a/src/ipc/ctrlm_ipc_iarm.cpp +++ b/src/ipc/ctrlm_ipc_iarm.cpp @@ -35,44 +35,12 @@ bool ctrlm_ipc_iarm_t::register_iarm_call(const char *call, IARM_BusCall_t handl return(ret); } -bool ctrlm_ipc_iarm_t::broadcast_iarm_event(const char *bus_name, int event, json_t* event_data) const -{ - bool ret = false; - if(!event_data) { - return(ret); - } - - char *payload_str = json_dumps(event_data, JSON_COMPACT); - - if(payload_str != NULL) { - size_t str_size = strlen(payload_str) + 1; - size_t size = sizeof(ctrlm_main_iarm_event_json_t) + str_size; - - ctrlm_main_iarm_event_json_t *data = (ctrlm_main_iarm_event_json_t *)calloc(1, size); - if (data == NULL) { - XLOGD_ERROR("failed to allocate memory for the IARM event, so cannot broadcast...."); - } else { - - data->api_revision = CTRLM_MAIN_IARM_BUS_API_REVISION; - //Can't be replaced with safeC version of this, as safeC string functions doesn't allow string size more than 4K - snprintf(data->payload, str_size, "%s", payload_str); - - IARM_Result_t res = IARM_Bus_BroadcastEvent(bus_name, event, data, size); - if(res != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("IARM Bus Error %d", res); - } else { - ret = true; - } - - free(data); - } - - free(payload_str); - } - - if(event_data) { - json_decref(event_data); +bool ctrlm_ipc_iarm_t::broadcast_iarm_event_legacy(const char *bus_name, int event, void *data, size_t data_size) const { + bool ret = true; + IARM_Result_t result = IARM_Bus_BroadcastEvent(bus_name, event, data, data_size); + if(IARM_RESULT_SUCCESS != result) { + XLOGD_ERROR("IARM Bus Error!"); + ret = false; } - return(ret); } diff --git a/src/ipc/ctrlm_ipc_iarm.h b/src/ipc/ctrlm_ipc_iarm.h index c966c08..7856818 100644 --- a/src/ipc/ctrlm_ipc_iarm.h +++ b/src/ipc/ctrlm_ipc_iarm.h @@ -39,7 +39,28 @@ class ctrlm_ipc_iarm_t { static void turn_off(std::atomic_bool &abool) { abool.store(false); } bool register_iarm_call(const char *call, IARM_BusCall_t handler) const; - bool broadcast_iarm_event(const char *bus_name, int event, json_t* event_data) const; + bool broadcast_iarm_event_legacy(const char *bus_name, int event, void *data, size_t data_size) const; + + template + bool broadcast_iarm_event(const char *bus_name, unsigned char api_revision, int event, const char *str) const { + bool ret = false; + size_t str_size = strlen(str) + 1; + size_t size = sizeof(T) + str_size; + T *data = (T *)calloc(1, size); + data->api_revision = api_revision; + if(!data) { + return(ret); + } else { + snprintf(data->payload, str_size, "%s", str); + if(IARM_Bus_BroadcastEvent(bus_name, event, data, size)) { + ret = true; + } + if(data) { + free(data); + } + } + return(ret); + } }; #endif diff --git a/src/ipc/ctrlm_rcp_ipc_event.cpp b/src/ipc/ctrlm_rcp_ipc_event.cpp index 0ce44ba..5c24208 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.cpp +++ b/src/ipc/ctrlm_rcp_ipc_event.cpp @@ -135,9 +135,12 @@ void ctrlm_rcp_ipc_net_status_t::populate_status(const ctrlm_obj_network_t &netw } } -char *ctrlm_rcp_ipc_net_status_t::to_string() const +std::string ctrlm_base_event_json_t::to_string() const { - return json_dumps(to_json(), JSON_ENCODE_ANY); + char *json_str = json_dumps(to_json(), JSON_ENCODE_ANY); + std::string copy = json_str; + free(json_str); + return copy; } ctrlm_rcp_ipc_upgrade_status_t::~ctrlm_rcp_ipc_upgrade_status_t() @@ -170,11 +173,6 @@ json_t *ctrlm_rcp_ipc_upgrade_status_t::to_json() const return (err) ? NULL : status; } -char *ctrlm_rcp_ipc_upgrade_status_t::to_string() const -{ - return json_dumps(to_json(), JSON_ENCODE_ANY); -} - ctrlm_rcp_ipc_validation_status_t::~ctrlm_rcp_ipc_validation_status_t() { } @@ -216,8 +214,3 @@ json_t *ctrlm_rcp_ipc_validation_status_t::to_json() const return (err) ? NULL : status; } - -char *ctrlm_rcp_ipc_validation_status_t::to_string() const -{ - return json_dumps(to_json(), JSON_ENCODE_ANY); -} diff --git a/src/ipc/ctrlm_rcp_ipc_event.h b/src/ipc/ctrlm_rcp_ipc_event.h index ae257af..bf31a82 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.h +++ b/src/ipc/ctrlm_rcp_ipc_event.h @@ -63,17 +63,18 @@ namespace rcp_net_status_json_keys constexpr char const* ERROR_STRING = "errorString"; } -class ctrlm_virtual_json_t +class ctrlm_base_event_json_t { public: - virtual ~ctrlm_virtual_json_t() {}; + virtual ~ctrlm_base_event_json_t() {}; virtual json_t *to_json() const = 0; + virtual std::string to_string() const; }; class ctrlm_obj_controller_t; class ctrlm_obj_network_t; -class ctrlm_rcp_ipc_controller_status_t : public ctrlm_virtual_json_t +class ctrlm_rcp_ipc_controller_status_t : public ctrlm_base_event_json_t { public: ctrlm_rcp_ipc_controller_status_t() = default; @@ -103,7 +104,7 @@ class ctrlm_rcp_ipc_controller_status_t : public ctrlm_virtual_json_t std::string upgrade_session_id_ = ""; }; -class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t +class ctrlm_rcp_ipc_net_status_t : public ctrlm_base_event_json_t { public: ctrlm_rcp_ipc_net_status_t() = default; @@ -111,7 +112,6 @@ class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t virtual json_t *to_json() const; - char *to_string() const; uint8_t get_api_revision() const { return api_revision_; } bool get_result() const { return (result_ == CTRLM_IARM_CALL_RESULT_SUCCESS) ? true : false; } void set_result(ctrlm_iarm_call_result_t result) { result_ = result; } @@ -131,14 +131,13 @@ class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t std::vector controller_status_list_; }; -class ctrlm_rcp_ipc_upgrade_status_t : public ctrlm_virtual_json_t +class ctrlm_rcp_ipc_upgrade_status_t : public ctrlm_base_event_json_t { public: ctrlm_rcp_ipc_upgrade_status_t() = default; ~ctrlm_rcp_ipc_upgrade_status_t(); virtual json_t *to_json() const; - char *to_string() const; bool get_result() const { return (result_ == CTRLM_IARM_CALL_RESULT_SUCCESS) ? true : false; } void set_result(ctrlm_iarm_call_result_t result) { result_ = result; } ctrlm_network_id_t get_net_id() const { return net_id_; } @@ -156,14 +155,13 @@ class ctrlm_rcp_ipc_upgrade_status_t : public ctrlm_virtual_json_t ctrlm_iarm_call_result_t result_ = CTRLM_IARM_CALL_RESULT_INVALID; }; -class ctrlm_rcp_ipc_validation_status_t : public ctrlm_virtual_json_t +class ctrlm_rcp_ipc_validation_status_t : public ctrlm_base_event_json_t { public: ctrlm_rcp_ipc_validation_status_t() = default; ~ctrlm_rcp_ipc_validation_status_t(); virtual json_t *to_json() const; - char *to_string() const; uint8_t get_api_revision() const { return api_revision_; } bool get_result() const { return (result_ == CTRLM_IARM_CALL_RESULT_SUCCESS) ? true : false; } void set_result(ctrlm_iarm_call_result_t result) { result_ = result; } diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 02f4128..82a005b 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -114,18 +114,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n return(false); } - json_t *ret = json_object(); - int err = 0; - - err |= json_object_set_new_nocheck(ret, STATUS, net_status.to_json()); - - if (err) { - XLOGD_ERROR("JSON object set error"); - json_decref(ret); - return(false); - } - - return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_RCU_STATUS, ret); + return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_MAIN_IARM_BUS_API_REVISION, CTRLM_RCU_IARM_EVENT_RCU_STATUS, net_status.to_string().c_str()); } bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation_status(const ctrlm_rcp_ipc_validation_status_t &validation_status) const @@ -140,18 +129,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation_status(const ctrlm_rcp_ipc_vali return(false); } - json_t *ret = json_object(); - int err = 0; - - err |= json_object_set_new_nocheck(ret, STATUS, validation_status.to_json()); - - if (err) { - XLOGD_ERROR("JSON object set error"); - json_decref(ret); - return(false); - } - - return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_VALIDATION_STATUS, ret); + return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_MAIN_IARM_BUS_API_REVISION, CTRLM_RCU_IARM_EVENT_VALIDATION_STATUS, validation_status.to_string().c_str()); } bool ctrlm_rcp_ipc_iarm_thunder_t::on_firmware_update_progress(const ctrlm_rcp_ipc_upgrade_status_t &upgrade_status) const @@ -177,7 +155,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_firmware_update_progress(const ctrlm_rcp_i return(false); } - return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_FIRMWARE_UPDATE_PROGRESS, ret); + return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_MAIN_IARM_BUS_API_REVISION, CTRLM_RCU_IARM_EVENT_FIRMWARE_UPDATE_PROGRESS, upgrade_status.to_string().c_str()); } bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation(const ctrlm_rcp_ipc_validation_status_t &validation_status) const @@ -198,7 +176,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation(const ctrlm_rcp_ipc_validation_ return(false); } - return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_VALIDATION_STATUS, ret); + return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_MAIN_IARM_BUS_API_REVISION, CTRLM_RCU_IARM_EVENT_VALIDATION_STATUS, validation_status.to_string().c_str()); } IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_pairing(void *arg) diff --git a/src/irdb/ctrlm_irdb_interface.cpp b/src/irdb/ctrlm_irdb_interface.cpp index bcc7b37..5dd99c8 100644 --- a/src/irdb/ctrlm_irdb_interface.cpp +++ b/src/irdb/ctrlm_irdb_interface.cpp @@ -434,18 +434,18 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(ir_codes.size() > 0) { if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); + ret = true; } else { XLOGD_ERROR("edid dev type invalid"); } } else { - XLOGD_WARN("no codes for edid data"); + XLOGD_ERROR("no codes for edid data"); } - ret = true; } else { XLOGD_ERROR("Failed getting codes by edid"); } } else { - XLOGD_INFO("No EDID data"); + XLOGD_ERROR("No EDID data"); } } else { XLOGD_ERROR("display_settings is NULL"); @@ -463,19 +463,19 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(ir_codes.size() > 0) { if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); + ret = true; } else { XLOGD_ERROR("cec dev type invalid"); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); } - ret = true; } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); } } } else { - XLOGD_INFO("No CEC device data"); + XLOGD_ERROR("No CEC device data"); } } else { XLOGD_ERROR("cec is NULL"); @@ -493,18 +493,18 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(ir_codes.size() > 0) { if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); + ret = true; } else { - XLOGD_WARN("port %d infoframe dev type invalid", itr.first); + XLOGD_ERROR("port %d infoframe dev type invalid", itr.first); } } else { XLOGD_WARN("no code for port %d infoframe", itr.first); } - ret = true; } else { XLOGD_WARN("Failed to get codes for port %d infoframe", itr.first); } } else { - XLOGD_INFO("no infoframe for port %d", itr.first); + XLOGD_WARN("no infoframe for port %d", itr.first); } } } else { @@ -522,19 +522,19 @@ bool ctrlm_irdb_interface_t::get_ir_codes_by_autolookup(ctrlm_autolookup_ranked_ if(ir_codes.size() > 0) { if(type != CTRLM_IRDB_DEV_TYPE_INVALID) { codes[type].insert(codes[type].end(), ir_codes.begin(), ir_codes.end()); + ret = true; } else { - XLOGD_WARN("cec dev type invalid"); + XLOGD_ERROR("cec dev type invalid"); } } else { XLOGD_WARN("no code for cec device <%s>", itr.osd.c_str()); } - ret = true; } else { XLOGD_WARN("Failed to get codes for cec device <%s>", itr.osd.c_str()); } } } else { - XLOGD_INFO("No CEC device data"); + XLOGD_ERROR("No CEC device data"); } } else { XLOGD_ERROR("cec_sink is NULL"); diff --git a/src/rf4ce/controller/attributes/ctrlm_rf4ce_controller_attr_irdb.cpp b/src/rf4ce/controller/attributes/ctrlm_rf4ce_controller_attr_irdb.cpp index c4938b7..3d3238f 100644 --- a/src/rf4ce/controller/attributes/ctrlm_rf4ce_controller_attr_irdb.cpp +++ b/src/rf4ce/controller/attributes/ctrlm_rf4ce_controller_attr_irdb.cpp @@ -351,7 +351,7 @@ ctrlm_rf4ce_rib_attr_t::status ctrlm_rf4ce_controller_ir_rf_database_status_t::r } else { // Normal Read data[0] = this->ir_rf_status; *len = IR_RF_STATUS_LEN; -#ifdef XR15_704 + if(this->controller && this->controller->needs_reset() && !ctrlm_device_update_is_controller_updating(this->controller->network_id_get(), this->controller->controller_id_get(), true)) { if(ctrlm_device_update_xr15_crash_update_get()) { XLOGD_INFO("ENTERING XR15 CRASH CODE: XR15-10 running less then 2.0.0.0, need to force reboot for device update... Setting proper IR RF Status bits"); @@ -362,7 +362,7 @@ ctrlm_rf4ce_rib_attr_t::status ctrlm_rf4ce_controller_ir_rf_database_status_t::r (data[0] & ctrlm_rf4ce_ir_rf_database_status_t::flag::DOWNLOAD_AVR_5_DIGIT_CODE) ? "YES" : "NO",(data[0] & ctrlm_rf4ce_ir_rf_database_status_t::flag::CLEAR_ALL_5_DIGIT_CODES) ? "YES" : "NO"); } } -#endif + if(this->controller && this->ir_rf_status & ctrlm_rf4ce_ir_rf_database_status_t::flag::DB_DOWNLOAD_YES) { XLOGD_INFO("Creating timer for download flag reset"); ctrlm_timeout_create(200, ir_rf_database_status_download_timeout, (void *)this->controller); diff --git a/src/rf4ce/ctrlm_rf4ce_controller.cpp b/src/rf4ce/ctrlm_rf4ce_controller.cpp index c2babdb..6dd7387 100644 --- a/src/rf4ce/ctrlm_rf4ce_controller.cpp +++ b/src/rf4ce/ctrlm_rf4ce_controller.cpp @@ -135,10 +135,8 @@ ctrlm_obj_controller_rf4ce_t::ctrlm_obj_controller_rf4ce_t(ctrlm_controller_id_t rib_configuration_complete_status_(RF4CE_RIB_CONFIGURATION_COMPLETE_PAIRING_INCOMPLETE), asb_key_derivation_method_used_(ASB_KEY_DERIVATION_NONE), metrics_tag_ (0), -#ifdef XR15_704 needs_reset_(false), did_reset_(false), -#endif mfg_test_result_(1) { XLOGD_INFO("constructor - %u", controller_id); @@ -1037,12 +1035,9 @@ void ctrlm_obj_controller_rf4ce_t::validation_result_set(ctrlm_rcu_binding_type_ validation_type_ = validation_type; db_create(); db_store(); - // HACK for XR15-704, possible duplicate pairing -#ifdef XR15_704 + // possible duplicate pairing needs_reset_ = false; did_reset_ = false; -#endif - // HACK for XR15-704 // Telemetry needs to keep track of binding. log_binding_for_telemetry(); @@ -2049,8 +2044,7 @@ guchar ctrlm_obj_controller_rf4ce_t::property_read_ir_rf_database(guchar index, } } len = obj_network_rf4ce_->property_read_ir_rf_database(index, data, length); - // HACK for XR15-704 -#ifdef XR15_704 + if(needs_reset_) { if(!ctrlm_device_update_is_controller_updating(network_id_get(), controller_id_get(), true)) { if(len < 2) { @@ -2071,8 +2065,7 @@ guchar ctrlm_obj_controller_rf4ce_t::property_read_ir_rf_database(guchar index, needs_reset_ = false; XLOGD_INFO("EXITING XR15 CRASH CODE: XR15 was reset <%s>", (did_reset_ ? "TRUE" : "FALSE")); } -#endif - // HACK for XR15-704 + return(len); } @@ -2842,8 +2835,6 @@ void ctrlm_obj_controller_rf4ce_t::print_remote_firmware_debug_info(ctrlm_rf4ce_ } -// These functions are HACKS for XR15-704 -#ifdef XR15_704 void ctrlm_obj_controller_rf4ce_t::set_reset() { ctrlm_sw_version_t version_bug(XR15_DEVICE_UPDATE_BUG_FIRMWARE_MAJOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_MINOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_REVISION, XR15_DEVICE_UPDATE_BUG_FIRMWARE_PATCH); @@ -2857,8 +2848,6 @@ void ctrlm_obj_controller_rf4ce_t::set_reset() { bool ctrlm_obj_controller_rf4ce_t::needs_reset() { return(needs_reset_); } -#endif -// These functions are HACKS for XR15-704 // Polling Functions void ctrlm_obj_controller_rf4ce_t::polling_action_push(ctrlm_rf4ce_polling_action_msg_t *action) { diff --git a/src/rf4ce/ctrlm_rf4ce_controller.h b/src/rf4ce/ctrlm_rf4ce_controller.h index 8420f95..8fa7bd9 100644 --- a/src/rf4ce/ctrlm_rf4ce_controller.h +++ b/src/rf4ce/ctrlm_rf4ce_controller.h @@ -600,12 +600,8 @@ class ctrlm_obj_controller_rf4ce_t : public ctrlm_obj_controller_t bool init_uinput_writer(void); - // These functions are HACKS for XR15-704 -#ifdef XR15_704 void set_reset(); bool needs_reset(); -#endif - // These functions are HACKS for XR15-704 ctrlm_sw_version_t version_software_get(); ctrlm_sw_version_t version_audio_data_get(); @@ -769,12 +765,9 @@ class ctrlm_obj_controller_rf4ce_t : public ctrlm_obj_controller_t guint metrics_tag_; - // HACK for XR15-704 -#ifdef XR15_704 gboolean needs_reset_; gboolean did_reset_; -#endif - // HACK for XR15-704 + guint8 mfg_test_result_; ctrlm_timestamp_t checkin_time_; ///< OUT - Timestamp indicating the most recent poll indication of the controller diff --git a/src/rf4ce/ctrlm_rf4ce_device_update.cpp b/src/rf4ce/ctrlm_rf4ce_device_update.cpp index 29d8136..8139124 100644 --- a/src/rf4ce/ctrlm_rf4ce_device_update.cpp +++ b/src/rf4ce/ctrlm_rf4ce_device_update.cpp @@ -166,12 +166,10 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_check_request(ctrlm_times gboolean manual_poll = false; errno_t safec_rc = -1; -#ifdef XR15_704 if(did_reset_) { XLOGD_INFO("CHECK IMAGE REQUEST due to XR15 reset code!"); did_reset_ = false; } -#endif // is image type supported? switch(image_type) { @@ -233,10 +231,8 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_check_request(ctrlm_times download_in_progress_ = true; } -#ifdef XR15_704 - // HACK: We need to make XR15s running < 2.0.0.0 do not get an image pending flag to avoid bug on device. + // We need to make XR15s running < 2.0.0.0 do not get an image pending flag to avoid bug on device. ctrlm_sw_version_t version_bug(XR15_DEVICE_UPDATE_BUG_FIRMWARE_MAJOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_MINOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_REVISION, XR15_DEVICE_UPDATE_BUG_FIRMWARE_PATCH); -#endif if(!image_available || !ready_to_download) { guchar flags_check = IMAGE_CHECK_RESPONSE_FLAG_NO_IMAGE; @@ -249,10 +245,7 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_check_request(ctrlm_times if (is_controller_type_z()) { ota_failure_type_z_cnt_set(ota_failure_type_z_cnt_get() + 1); } - } -#ifdef XR15_704 - // HACK: We need to make XR15s running < 2.0.0.0 do not get an image pending flag to avoid bug on device. - else if(RF4CE_CONTROLLER_TYPE_XR15 == controller_type_ && *version_software_ < version_bug) { + } else if(RF4CE_CONTROLLER_TYPE_XR15 == controller_type_ && *version_software_ < version_bug) { XLOGD_INFO("Image Check response - Image is pending - XR15v1 running < 2.0.0.0, sending No image available"); print_remote_firmware_debug_info(RF4CE_PRINT_FIRMWARE_LOG_IMAGE_DOWNLOAD_PENDING, ctrlm_device_update_get_software_version(image_info.id)); if(begin_info.when == RF4CE_DEVICE_UPDATE_IMAGE_CHECK_POLL_TIME) { @@ -260,9 +253,7 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_check_request(ctrlm_times } else { next_check_time = update_polling_period_get() * 60 * 60; // Use update polling rib entry - convert to seconds } - } -#endif - else { + } else { flags_check = IMAGE_CHECK_RESPONSE_FLAG_IMAGE_PENDING; XLOGD_INFO("Image Check response - Image is pending"); print_remote_firmware_debug_info(RF4CE_PRINT_FIRMWARE_LOG_IMAGE_DOWNLOAD_PENDING, ctrlm_device_update_get_software_version(image_info.id)); @@ -423,8 +414,7 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_load_request(ctrlm_timest std::string log_string = ctrlm_device_update_get_software_version(image_id) + ". "; -#ifdef XR15_704 - // HACK: We need to make XR15s running < 2.0.0.0 load ASAP to avoid bug on device. + // We need to make XR15s running < 2.0.0.0 load ASAP to avoid bug on device. ctrlm_sw_version_t version_bug(XR15_DEVICE_UPDATE_BUG_FIRMWARE_MAJOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_MINOR, XR15_DEVICE_UPDATE_BUG_FIRMWARE_REVISION, XR15_DEVICE_UPDATE_BUG_FIRMWARE_PATCH); if(RF4CE_CONTROLLER_TYPE_XR15 == controller_type_ && *version_software_ < version_bug) { @@ -432,7 +422,6 @@ void ctrlm_obj_controller_rf4ce_t::device_update_image_load_request(ctrlm_timest load_info.when = RF4CE_DEVICE_UPDATE_IMAGE_LOAD_NOW; log_string += "Load scheduled: Immediately."; } -#endif if(load_info.when == RF4CE_DEVICE_UPDATE_IMAGE_LOAD_NOW) { load_response = RF4CE_DEVICE_UPDATE_IMAGE_LOAD_RSP_NOW; diff --git a/src/rf4ce/ctrlm_rf4ce_network.cpp b/src/rf4ce/ctrlm_rf4ce_network.cpp index e43fe6b..f01c52d 100644 --- a/src/rf4ce/ctrlm_rf4ce_network.cpp +++ b/src/rf4ce/ctrlm_rf4ce_network.cpp @@ -1205,9 +1205,7 @@ void ctrlm_obj_network_rf4ce_t::controller_insert(ctrlm_controller_id_t controll } else { controllers_[controller_id] = new ctrlm_obj_controller_rf4ce_t(controller_id, *this, ieee_address, CTRLM_RF4CE_RESULT_VALIDATION_SUCCESS, CTRLM_RCU_CONFIGURATION_RESULT_SUCCESS); controllers_[controller_id]->db_load(); -#ifdef XR15_704 controllers_[controller_id]->set_reset(); -#endif controllers_[controller_id]->update_polling_configurations(); } } diff --git a/src/stubs/stubs_voice_packet_analysis.cpp b/src/stubs/stubs_voice_packet_analysis.cpp deleted file mode 100644 index 59b1eb9..0000000 --- a/src/stubs/stubs_voice_packet_analysis.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - * If not stated otherwise in this file or this component's license file the - * following copyright and licenses apply: - * - * Copyright 2015 RDK Management - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. -*/ -#include "../ctrlm_voice_packet_analysis.h" -#include "../ctrlm_log.h" - - -class stubs_ctrlm_voice_packet_analysis : public ctrlm_voice_packet_analysis { - public: - stubs_ctrlm_voice_packet_analysis(); - virtual ~stubs_ctrlm_voice_packet_analysis(); - virtual void reset(); - virtual ctrlm_voice_packet_analysis_result_t packet_check(const void* header, unsigned long header_len, const void* data, unsigned long data_len); - virtual void stats_get(ctrlm_voice_packet_analysis_stats_t& stats) const; - private: - uint32_t total_packets; -}; - -stubs_ctrlm_voice_packet_analysis::stubs_ctrlm_voice_packet_analysis() : total_packets(0) { - XLOGD_INFO("STUB Constructor"); -} - -stubs_ctrlm_voice_packet_analysis::~stubs_ctrlm_voice_packet_analysis() { - XLOGD_INFO("STUB Destructor"); -} - -void stubs_ctrlm_voice_packet_analysis::reset() { - XLOGD_INFO("STUB"); - total_packets = 0; -} - -ctrlm_voice_packet_analysis_result_t stubs_ctrlm_voice_packet_analysis::packet_check(const void* header, unsigned long header_len, const void* data, unsigned long data_len) { - XLOGD_INFO("STUB"); - ++total_packets; - return CTRLM_VOICE_PACKET_ANALYSIS_GOOD; -} - -void stubs_ctrlm_voice_packet_analysis::stats_get(ctrlm_voice_packet_analysis_stats_t& stats) const { - XLOGD_INFO("STUB"); - stats.total_packets = total_packets; - stats.bad_packets = 0; - stats.duplicated_packets = 0; - stats.lost_packets = 0; - stats.sequence_error_count = 0; -} - -ctrlm_voice_packet_analysis* ctrlm_voice_packet_analysis_factory() { - return new stubs_ctrlm_voice_packet_analysis; -} diff --git a/src/voice/ctrlm_voice_obj.h b/src/voice/ctrlm_voice_obj.h index f20644f..70ddb4c 100644 --- a/src/voice/ctrlm_voice_obj.h +++ b/src/voice/ctrlm_voice_obj.h @@ -28,6 +28,7 @@ #include "ctrlm_ipc_voice.h" #include "ctrlm.h" #include "ctrlm_auth.h" +#include "ctrlm_auth_certificate.h" #include "jansson.h" #include "json_config.h" #include "xr_timestamp.h" diff --git a/src/voice/ipc/ctrlm_voice_ipc.h b/src/voice/ipc/ctrlm_voice_ipc.h index 25197ff..969a838 100644 --- a/src/voice/ipc/ctrlm_voice_ipc.h +++ b/src/voice/ipc/ctrlm_voice_ipc.h @@ -22,6 +22,7 @@ #include "ctrlm.h" #include "ctrlm_voice_types.h" #include "ctrlm_ipc_voice.h" +#include "ctrlm_ipc_iarm.h" // Classes for eventing @@ -171,7 +172,7 @@ class ctrlm_voice_ipc_event_session_statistics_t { }; // End classes for eventing -class ctrlm_voice_ipc_t { +class ctrlm_voice_ipc_t : public ctrlm_ipc_iarm_t { public: ctrlm_voice_ipc_t(ctrlm_voice_t *obj_voice) { this->obj_voice = obj_voice; @@ -179,7 +180,6 @@ class ctrlm_voice_ipc_t { virtual ~ctrlm_voice_ipc_t() {}; // Interface - virtual bool register_ipc() const = 0; virtual bool session_begin(const ctrlm_voice_ipc_event_session_begin_t &session_begin) = 0; virtual bool stream_begin(const ctrlm_voice_ipc_event_stream_begin_t &stream_begin) = 0; virtual bool stream_end(const ctrlm_voice_ipc_event_stream_end_t &stream_end) = 0; @@ -187,7 +187,6 @@ class ctrlm_voice_ipc_t { virtual bool server_message(const char *message, unsigned long size) = 0; // Pass a pointer to the message to avoid copying possible large chunks of data virtual bool keyword_verification(const ctrlm_voice_ipc_event_keyword_verification_t &keyword_verification) = 0; virtual bool session_statistics(const ctrlm_voice_ipc_event_session_statistics_t &session_stats) = 0; - virtual void deregister_ipc() const = 0; // End Interface protected: diff --git a/src/voice/ipc/ctrlm_voice_ipc_iarm_all.cpp b/src/voice/ipc/ctrlm_voice_ipc_iarm_all.cpp index 561c0ab..fc90e06 100644 --- a/src/voice/ipc/ctrlm_voice_ipc_iarm_all.cpp +++ b/src/voice/ipc/ctrlm_voice_ipc_iarm_all.cpp @@ -24,7 +24,9 @@ #include "jansson.h" ctrlm_voice_ipc_iarm_all_t::ctrlm_voice_ipc_iarm_all_t(ctrlm_voice_t *obj_voice): ctrlm_voice_ipc_t(obj_voice) { + #ifdef CTRLM_THUNDER this->ipc.push_back(new ctrlm_voice_ipc_iarm_thunder_t(obj_voice)); + #endif this->ipc.push_back(new ctrlm_voice_ipc_iarm_legacy_t(obj_voice)); } diff --git a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp index c07f22b..1121e79 100644 --- a/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp +++ b/src/voice/ipc/ctrlm_voice_ipc_iarm_legacy.cpp @@ -23,7 +23,6 @@ #include "ctrlm_voice_obj.h" static IARM_Result_t update_settings(void *arg); -static bool broadcast_event(const char *bus_name, int event, void *data, size_t data_size); ctrlm_voice_ipc_iarm_legacy_t::ctrlm_voice_ipc_iarm_legacy_t(ctrlm_voice_t *obj_voice) : ctrlm_voice_ipc_t(obj_voice) { this->state = EVENT_ALL; @@ -68,7 +67,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_begin(const ctrlm_voice_ipc_event_se safec_rc = strcpy_s((char *)event.language, sizeof(event.language), session_begin.language.c_str()); ERR_CHK(safec_rc); event.is_voice_assistant = session_begin.common.voice_assistant ? 1 : 0; - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_BEGIN, &event, sizeof(event)); + ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_BEGIN, &event, sizeof(event)); } return(ret); } @@ -90,7 +89,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::stream_end(const ctrlm_voice_ipc_event_strea event.session_id = stream_end.common.session_id_ctrlm; event.reason = (ctrlm_voice_session_end_reason_t)stream_end.reason; event.is_voice_assistant = stream_end.common.voice_assistant ? 1 : 0; - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_END, &event, sizeof(event)); + ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_END, &event, sizeof(event)); } return(ret); } @@ -133,7 +132,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_end(const ctrlm_voice_ipc_event_sess event.curl_request_dns_time = session_end.server_stats->dns_time; event.curl_request_connect_time = session_end.server_stats->connect_time; } - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_RESULT, &event, sizeof(event)); + ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_RESULT, &event, sizeof(event)); break; } case SESSION_END_ABORT: { @@ -144,7 +143,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_end(const ctrlm_voice_ipc_event_sess event.controller_id = session_end.common.controller_id; event.session_id = session_end.common.session_id_ctrlm; event.reason = (ctrlm_voice_session_abort_reason_t)session_end.reason; - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_ABORT, &event, sizeof(event)); + ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_ABORT, &event, sizeof(event)); break; } case SESSION_END_SHORT_UTTERANCE: { @@ -156,7 +155,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_end(const ctrlm_voice_ipc_event_sess event.session_id = session_end.common.session_id_ctrlm; event.reason = (ctrlm_voice_session_end_reason_t)session_end.reason; event.return_code_internal = session_end.return_code_internal; - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_SHORT, &event, sizeof(event)); + ret = broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_SHORT, &event, sizeof(event)); break; } } @@ -195,7 +194,7 @@ bool ctrlm_voice_ipc_iarm_legacy_t::session_statistics(const ctrlm_voice_ipc_eve event.session_id = session_stats.common.session_id_ctrlm; event.session = session_stats.session; event.reboot = session_stats.reboot; - return(broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_STATS, &event, sizeof(event))); + return(broadcast_iarm_event_legacy(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_SESSION_STATS, &event, sizeof(event))); } void ctrlm_voice_ipc_iarm_legacy_t::deregister_ipc() const { @@ -229,14 +228,4 @@ IARM_Result_t update_settings(void *arg) { } return(IARM_RESULT_SUCCESS); -} - -bool broadcast_event(const char *bus_name, int event, void *data, size_t data_size) { - bool ret = true; - IARM_Result_t result = IARM_Bus_BroadcastEvent(bus_name, event, data, data_size); - if(IARM_RESULT_SUCCESS != result) { - XLOGD_ERROR("IARM Bus Error!"); - ret = false; - } - return(ret); -} +} \ No newline at end of file diff --git a/src/voice/ipc/ctrlm_voice_ipc_iarm_thunder.cpp b/src/voice/ipc/ctrlm_voice_ipc_iarm_thunder.cpp index 7a80ad0..ad9cc5d 100644 --- a/src/voice/ipc/ctrlm_voice_ipc_iarm_thunder.cpp +++ b/src/voice/ipc/ctrlm_voice_ipc_iarm_thunder.cpp @@ -83,7 +83,6 @@ #define JSON_SESSION_END_SERVER_STATS_DNS_TIME "dnsTime" #define JSON_SESSION_END_SERVER_STATS_CONNECT_TIME "connectTime" -static bool broadcast_event(const char *bus_name, int event, const char *str); static const char *voice_device_str(ctrlm_voice_device_t device); static const char *voice_device_status_str(uint8_t status); @@ -93,63 +92,31 @@ ctrlm_voice_ipc_iarm_thunder_t::ctrlm_voice_ipc_iarm_thunder_t(ctrlm_voice_t *ob bool ctrlm_voice_ipc_iarm_thunder_t::register_ipc() const { bool ret = true; - IARM_Result_t rc; XLOGD_INFO("Thunder"); // NOTE: The IARM events are registered in ctrlm_main.cpp - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_STATUS); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_STATUS, &ctrlm_voice_ipc_iarm_thunder_t::status); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_STATUS, &ctrlm_voice_ipc_iarm_thunder_t::status)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_CONFIGURE_VOICE); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_CONFIGURE_VOICE, &ctrlm_voice_ipc_iarm_thunder_t::configure_voice); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_CONFIGURE_VOICE, &ctrlm_voice_ipc_iarm_thunder_t::configure_voice)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SET_VOICE_INIT); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SET_VOICE_INIT, &ctrlm_voice_ipc_iarm_thunder_t::set_voice_init); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SET_VOICE_INIT, &ctrlm_voice_ipc_iarm_thunder_t::set_voice_init)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SEND_VOICE_MESSAGE); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SEND_VOICE_MESSAGE, &ctrlm_voice_ipc_iarm_thunder_t::send_voice_message); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SEND_VOICE_MESSAGE, &ctrlm_voice_ipc_iarm_thunder_t::send_voice_message)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SESSION_TYPES); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SESSION_TYPES, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_types); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SESSION_TYPES, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_types)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SESSION_REQUEST); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SESSION_REQUEST, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_request); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SESSION_REQUEST, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_request)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SESSION_TERMINATE); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SESSION_TERMINATE, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_terminate); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SESSION_TERMINATE, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_terminate)) { ret = false; } - - XLOGD_INFO("Registering for %s IARM call", CTRLM_VOICE_IARM_CALL_SESSION_AUDIO_STREAM_START); - rc = IARM_Bus_RegisterCall(CTRLM_VOICE_IARM_CALL_SESSION_AUDIO_STREAM_START, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_audio_stream_start); - if(rc != IARM_RESULT_SUCCESS) { - XLOGD_ERROR("Failed to register %d", rc); + if(!register_iarm_call(CTRLM_VOICE_IARM_CALL_SESSION_AUDIO_STREAM_START, &ctrlm_voice_ipc_iarm_thunder_t::voice_session_audio_stream_start)) { ret = false; } @@ -175,7 +142,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::session_begin(const ctrlm_voice_ipc_event_s if(json_str) { //TODO: surface the event through IARM XLOGD_INFO("%s", json_str); - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_SESSION_BEGIN, json_str); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_SESSION_BEGIN, json_str); free(json_str); } else { XLOGD_ERROR("Failed to encode JSON string"); @@ -204,7 +171,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::stream_begin(const ctrlm_voice_ipc_event_st if(json_str) { //TODO: surface the event through IARM XLOGD_INFO("%s", json_str); - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_STREAM_BEGIN, json_str); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_STREAM_BEGIN, json_str); free(json_str); } else { XLOGD_ERROR("Failed to encode JSON string"); @@ -234,7 +201,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::stream_end(const ctrlm_voice_ipc_event_stre if(json_str) { //TODO: surface the event through IARM XLOGD_INFO("%s", json_str); - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_STREAM_END, json_str); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_STREAM_END, json_str); free(json_str); } else { XLOGD_ERROR("Failed to encode JSON string"); @@ -358,7 +325,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::session_end(const ctrlm_voice_ipc_event_ses if(json_str) { //TODO: surface the event through IARM XLOGD_INFO("<%s>", this->obj_voice->voice_stb_data_pii_mask_get() ? "***" : json_str); - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_SESSION_END, json_str); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_SESSION_END, json_str); free(json_str); } else { XLOGD_ERROR("Failed to encode JSON string"); @@ -374,7 +341,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::server_message(const char *message, unsigne bool ret = false; if(message) { XLOGD_INFO("%ul : <%s>", size, this->obj_voice->voice_stb_data_pii_mask_get() ? "***" : message); //CID -160950 - Printargs - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_SERVER_MESSAGE, message); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_SERVER_MESSAGE, message); } return(ret); } @@ -397,7 +364,7 @@ bool ctrlm_voice_ipc_iarm_thunder_t::keyword_verification(const ctrlm_voice_ipc_ if(json_str) { //TODO: surface the event through IARM XLOGD_INFO("%s", json_str); - ret = broadcast_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_EVENT_JSON_KEYWORD_VERIFICATION, json_str); + ret = broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_VOICE_IARM_BUS_API_REVISION, CTRLM_VOICE_IARM_EVENT_JSON_KEYWORD_VERIFICATION, json_str); free(json_str); } else { XLOGD_ERROR("Failed to encode JSON string"); @@ -653,8 +620,9 @@ IARM_Result_t ctrlm_voice_ipc_iarm_thunder_t::voice_session_request(void *data) json_t *obj_type = json_object_get(obj, "type"); std::string str_type = ""; - std::string str_transcription = ""; - std::string str_audio_file = ""; + std::string str_transcription = ""; + std::string str_audio_file = ""; + std::string str_name_of_source = "APPLICATION"; int fd = -1; if(obj_type == NULL || !json_is_string(obj_type)) { XLOGD_ERROR("request type parameter not present"); @@ -776,6 +744,14 @@ IARM_Result_t ctrlm_voice_ipc_iarm_thunder_t::voice_session_request(void *data) } } } + json_t *obj_name_of_source = json_object_get(obj, "name"); + if(obj_name_of_source != NULL) { + if(!json_is_string(obj_name_of_source)) { + XLOGD_WARN("name parameter is not a string - ignoring"); + } else { + str_name_of_source = std::string(json_string_value(obj_name_of_source)); + } + } } } } @@ -783,7 +759,7 @@ IARM_Result_t ctrlm_voice_ipc_iarm_thunder_t::voice_session_request(void *data) if (true == result) { ctrlm_voice_session_response_status_t voice_status = voice_obj->voice_session_req( CTRLM_MAIN_NETWORK_ID_INVALID, CTRLM_MAIN_CONTROLLER_ID_INVALID, - request_config.device, request_config.format, NULL, "APPLICATION", "0.0.0.0", "0.0.0.0", 0.0, + request_config.device, request_config.format, NULL, str_name_of_source.c_str(), "0.0.0.0", "0.0.0.0", 0.0, false, NULL, NULL, NULL, (fd >= 0) ? true : false, true, str_transcription.empty() ? NULL : str_transcription.c_str(), str_audio_file.empty() ? NULL : str_audio_file.c_str(), &request_uuid, request_config.low_latency, request_config.low_cpu_util, fd); if (voice_status != VOICE_SESSION_RESPONSE_AVAILABLE && voice_status != VOICE_SESSION_RESPONSE_AVAILABLE_PAR_VOICE) { @@ -975,35 +951,6 @@ const char *voice_device_status_str(uint8_t status) { return("invalid"); } -bool broadcast_event(const char *bus_name, int event, const char *str) { - bool ret = false; - size_t str_size = strlen(str) + 1; - size_t size = sizeof(ctrlm_voice_iarm_event_json_t) + str_size; - ctrlm_voice_iarm_event_json_t *data = (ctrlm_voice_iarm_event_json_t *)malloc(size); - if(data) { - IARM_Result_t result; - - //Can't be replaced with safeC version of this - memset(data, 0, size); - - data->api_revision = CTRLM_VOICE_IARM_BUS_API_REVISION; - //Can't be replaced with safeC version of this, as safeC string functions doesn't allow string size more than 4K - snprintf(data->payload, str_size, "%s", str); - result = IARM_Bus_BroadcastEvent(bus_name, event, data, size); - if(IARM_RESULT_SUCCESS != result) { - XLOGD_ERROR("IARM Bus Error!"); - } else { - ret = true; - } - if(data) { - free(data); - } - } else { - XLOGD_ERROR("Failed to allocate data for IARM event"); - } - return(ret); -} - bool ctrlm_voice_ipc_request_supported_ptt_transcription(ctrlm_voice_ipc_request_config_t *config) { config->requires_transcription = true; config->requires_audio_file = false; From 5203d2a1c689805ed41ed36bbc1206d47f06f383 Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Tue, 2 Dec 2025 17:37:52 +0000 Subject: [PATCH 12/16] fix warning --- src/ble/ctrlm_ble_controller.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index 45dd086..2202a4a 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -537,9 +537,11 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas return; } + ctrlm_irdb_vendor_info_t rcu_vendor_info{}; + rcu_vendor_info.rcu_support_bitmask = vendor_support_bitmask; + irdb->set_vendor(rcu_vendor_info); + ctrlm_irdb_vendor_info_t vendor_info{}; - vendor_info.rcu_support_bitmask = vendor_support_bitmask; - irdb->set_vendor(vendor_info); if (irdb->get_vendor_info(vendor_info)) { XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which %s support the loaded IRDB plugin vendor <%s>", From 082ba2e967efcf45f99eefdf6b7220941e3338dc Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Tue, 2 Dec 2025 18:16:26 +0000 Subject: [PATCH 13/16] apply copilot suggestion --- src/ble/ctrlm_ble_controller.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index 2202a4a..a7dc462 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -539,10 +539,13 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas ctrlm_irdb_vendor_info_t rcu_vendor_info{}; rcu_vendor_info.rcu_support_bitmask = vendor_support_bitmask; - irdb->set_vendor(rcu_vendor_info); + if (!irdb->set_vendor(rcu_vendor_info)) { + 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{}; + } + ctrlm_irdb_vendor_info_t vendor_info{}; if (irdb->get_vendor_info(vendor_info)) { XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which %s support the loaded IRDB plugin vendor <%s>", ieee_address_get().to_string().c_str(), vendor_support_bitmask, From aa022d8d052318f52e73f8857a262d7437b12c82 Mon Sep 17 00:00:00 2001 From: Gene Gallagher <129112619+egalla204@users.noreply.github.com> Date: Fri, 5 Dec 2025 12:56:01 -0500 Subject: [PATCH 14/16] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/ble/ctrlm_ble_controller.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index a7dc462..48ba23b 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -542,7 +542,6 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas if (!irdb->set_vendor(rcu_vendor_info)) { 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{}; From f4f47b99e2d7b9bf6817643ad93d0c893c50544a Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Fri, 5 Dec 2025 12:59:40 -0500 Subject: [PATCH 15/16] fix comment --- src/irdb/ctrlm_irdb_plugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/irdb/ctrlm_irdb_plugin.h b/src/irdb/ctrlm_irdb_plugin.h index 9aace30..b115773 100644 --- a/src/irdb/ctrlm_irdb_plugin.h +++ b/src/irdb/ctrlm_irdb_plugin.h @@ -91,7 +91,7 @@ bool ctrlm_irdb_initialize(); // Will return info on all the IRDB vendors currently installed, could be multiple vendors returned bool ctrlm_irdb_get_supported_vendor_info(std::vector &info); -// This will basically pass through the bitmask coming from the RCU, so it will be Ruwido ONLY, Quickset ONLY, or BOTH +// Tell the IRDB plugin which vendor(s) the RCU supports bool ctrlm_irdb_set_preferred_vendor(const ctrlm_irdb_vendor_info_t &vendor); bool ctrlm_irdb_get_vendor_info(ctrlm_irdb_vendor_info_t &info); From 79ec2a1505b753294ac899e34af5ee95ec51436d Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 15 Jan 2026 15:24:00 -0500 Subject: [PATCH 16/16] reset preferred IRDB to default for remotes that don't have IR support charac --- src/ble/ctrlm_ble_controller.cpp | 10 +++++++--- .../blercu/bleservices/gatt/gatt_infraredservice.cpp | 8 +++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/ble/ctrlm_ble_controller.cpp b/src/ble/ctrlm_ble_controller.cpp index 6588970..61e26ff 100644 --- a/src/ble/ctrlm_ble_controller.cpp +++ b/src/ble/ctrlm_ble_controller.cpp @@ -546,9 +546,13 @@ void ctrlm_obj_controller_ble_t::setSupportedIrdbs(uint8_t vendor_support_bitmas ctrlm_irdb_vendor_info_t vendor_info{}; if (irdb->get_vendor_info(vendor_info)) { - XLOGD_INFO("Controller <%s> IRDBs supported bitmask = <0x%X>, which %s support the loaded IRDB plugin vendor <%s>", - ieee_address_get().to_string().c_str(), vendor_support_bitmask, - isSupportedIrdb(vendor_info) ? "DOES" : "does NOT", vendor_info.name.c_str()); + if (isSupportedIrdb(vendor_info)) { + 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()); + } } 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); diff --git a/src/ble/hal/blercu/bleservices/gatt/gatt_infraredservice.cpp b/src/ble/hal/blercu/bleservices/gatt/gatt_infraredservice.cpp index 8d8061d..40dff3c 100644 --- a/src/ble/hal/blercu/bleservices/gatt/gatt_infraredservice.cpp +++ b/src/ble/hal/blercu/bleservices/gatt/gatt_infraredservice.cpp @@ -422,6 +422,11 @@ void GattInfraredService::requestIrSupport() // sanity check we actually have a ir support characteristic if (!m_irSupportCharacteristic || !m_irSupportCharacteristic->isValid()) { XLOGD_WARN("missing ir support characteristic"); + + // Set ir support back to invalid value and notify + m_irSupport = 0; + m_irSupportChangedSlots.invoke(m_irSupport); + return; } @@ -434,8 +439,9 @@ void GattInfraredService::requestIrSupport() XLOGD_ERROR("failed to get initial ir support code due to <%s>", reply->errorMessage().c_str()); + // Set ir support back to invalid value and notify m_irSupport = 0; - + m_irSupportChangedSlots.invoke(m_irSupport); } else { std::vector value;