From 35689605a233b8d2bd6f11d2aa3f3f646effb19f Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 21 May 2026 19:33:53 -0400 Subject: [PATCH 1/2] RDKEMW-18612: onStatus event to contain remote data from all networks --- src/ctrlm.h | 1 + src/ctrlm_main.cpp | 22 ++++++++++++ src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 47 ++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 376608b3..044b2cbf 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -508,6 +508,7 @@ void ctrlm_update_last_key_info(int controller_id, ctrlm_key_source_t sou ctrlm_irdb_interface_t* ctrlm_main_irdb_get(); ctrlm_auth_t* ctrlm_main_auth_get(); void ctrlm_main_auth_start_poll(); +void ctrlm_main_network_ready_list_get(std::vector *networks); std::string ctrlm_device_id_get(); std::string ctrlm_stb_name_get(); std::string ctrlm_device_mac_get(); diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index 902b4331..41378020 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -877,6 +877,28 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { } } +void ctrlm_main_network_ready_list_get(std::vector *networks) { + if (NULL == networks) { + XLOGD_ERROR("NULL parameter"); + return; + } + + if (g_ctrlm.main_thread != g_thread_self ()) { + XLOGD_ERROR("not called from ctrlm_main_thread!!!!!"); + if(!ctrlm_is_production_build()) { + g_assert(0); + } + return; + } + + networks->clear(); + for (auto const &network_it : g_ctrlm.networks) { + if (network_it.second && network_it.second->is_ready()) { + networks->push_back(network_it.second); + } + } +} + void ctrlm_utils_sem_wait(){ sem_wait(&g_ctrlm.ctrlm_utils_sem); } diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 5ed63e70..800c60f5 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -19,6 +19,7 @@ #include "algorithm" #include "ctrlm_rcp_ipc_iarm_thunder.h" +#include "ctrlm.h" #include "ctrlm_network.h" #include "ctrlm_log.h" #include @@ -115,10 +116,52 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n return(false); } - json_t *ret = json_object(); + json_t *ret = json_object(); + json_t *status = json_object(); + json_t *net_type_supported = json_array(); + json_t *remote_array = json_array(); + std::vector networks; + std::vector remotes; + + ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; + ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; + ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; int err = 0; - err |= json_object_set_new_nocheck(ret, STATUS, net_status.to_json()); + ctrlm_main_network_ready_list_get(&networks); + + for (auto const &it : ctrlm_network_types_get()) { + err |= json_array_append_new(net_type_supported, json_integer(it)); + } + for (auto *network : networks) { + ctrlm_rcp_ipc_net_status_t network_status; + network_status.populate_status(*network); + network_status.get_controller_status_list(remotes); + } + for (const auto &remote : remotes) { + err |= json_array_append_new(remote_array, remote.to_json()); + } + // For now default to RF4CE network reporting if available + for (auto *network : networks) { + ctrlm_rcp_ipc_net_status_t network_status; + network_status.populate_status(*network); + + ir_prog_state = network_status.get_ir_prog_state(); + rf_pair_state = network_status.get_rf_pair_state(); + type = network_status.get_type(); + + if (type == CTRLM_NETWORK_TYPE_RF4CE) { + break; + } + } + + err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); + err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); + err |= json_object_set_new_nocheck(status, NET_TYPE, json_integer(type)); + err |= json_object_set_new_nocheck(status, IR_PROG_STATE, json_string(ctrlm_ir_state_str(ir_prog_state))); + err |= json_object_set_new_nocheck(status, PAIRING_STATE, json_string(ctrlm_rf_pair_state_str(rf_pair_state))); + + err |= json_object_set_new_nocheck(ret, STATUS, status); if (err) { XLOGD_ERROR("JSON object set error"); From f22b57acadff041233cd1b8f741e94559c14a273 Mon Sep 17 00:00:00 2001 From: Gene Gallagher Date: Thu, 21 May 2026 19:59:20 -0400 Subject: [PATCH 2/2] add call to ctrlm_main to execute handler for all networks instead of giving iarm_thunder access to network pointers --- src/ctrlm.h | 3 ++- src/ctrlm_main.cpp | 30 ++++++++++++++++---------- src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp | 21 ++++++------------ 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/ctrlm.h b/src/ctrlm.h index 044b2cbf..72d2884e 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -53,6 +53,7 @@ class ctrlm_voice_endpoint_t; class ctrlm_irdb_interface_t; class ctrlm_auth_t; class ctrlm_telemetry_t; +class ctrlm_rcp_ipc_net_status_t; typedef enum { CTRLM_THREAD_MONITOR_RESPONSE_DEAD = 0, CTRLM_THREAD_MONITOR_RESPONSE_ALIVE = 1 @@ -508,7 +509,7 @@ void ctrlm_update_last_key_info(int controller_id, ctrlm_key_source_t sou ctrlm_irdb_interface_t* ctrlm_main_irdb_get(); ctrlm_auth_t* ctrlm_main_auth_get(); void ctrlm_main_auth_start_poll(); -void ctrlm_main_network_ready_list_get(std::vector *networks); +std::map ctrlm_main_network_rcu_status_map_get(); std::string ctrlm_device_id_get(); std::string ctrlm_stb_name_get(); std::string ctrlm_device_mac_get(); diff --git a/src/ctrlm_main.cpp b/src/ctrlm_main.cpp index 41378020..88d2bfe4 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -877,26 +877,34 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { } } -void ctrlm_main_network_ready_list_get(std::vector *networks) { - if (NULL == networks) { - XLOGD_ERROR("NULL parameter"); - return; +static void ctrlm_main_network_handler_execute_for_all(ctrlm_msg_handler_network_t handler, void *data, int size) { + for (auto const &network_it : g_ctrlm.networks) { + if (network_it.second) { + (network_it.second->*handler)(data, size); + } } +} +std::map ctrlm_main_network_rcu_status_map_get() { if (g_ctrlm.main_thread != g_thread_self ()) { XLOGD_ERROR("not called from ctrlm_main_thread!!!!!"); if(!ctrlm_is_production_build()) { g_assert(0); } - return; + return {}; } - networks->clear(); - for (auto const &network_it : g_ctrlm.networks) { - if (network_it.second && network_it.second->is_ready()) { - networks->push_back(network_it.second); - } - } + std::shared_ptr> params = std::make_shared>(); + params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); + + ctrlm_main_queue_msg_get_rcu_status_t msg = {}; + msg.params = params; + + ctrlm_main_network_handler_execute_for_all((ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status, + &msg, + sizeof(msg)); + + return params->get_reply(); } void ctrlm_utils_sem_wait(){ diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 800c60f5..49e73807 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp @@ -120,7 +120,7 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n json_t *status = json_object(); json_t *net_type_supported = json_array(); json_t *remote_array = json_array(); - std::vector networks; + std::map status_map = ctrlm_main_network_rcu_status_map_get(); std::vector remotes; ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; @@ -128,27 +128,20 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; int err = 0; - ctrlm_main_network_ready_list_get(&networks); - for (auto const &it : ctrlm_network_types_get()) { err |= json_array_append_new(net_type_supported, json_integer(it)); } - for (auto *network : networks) { - ctrlm_rcp_ipc_net_status_t network_status; - network_status.populate_status(*network); - network_status.get_controller_status_list(remotes); + for (auto &it : status_map) { + it.second.get_controller_status_list(remotes); } for (const auto &remote : remotes) { err |= json_array_append_new(remote_array, remote.to_json()); } // For now default to RF4CE network reporting if available - for (auto *network : networks) { - ctrlm_rcp_ipc_net_status_t network_status; - network_status.populate_status(*network); - - ir_prog_state = network_status.get_ir_prog_state(); - rf_pair_state = network_status.get_rf_pair_state(); - type = network_status.get_type(); + for (auto &it : status_map) { + ir_prog_state = it.second.get_ir_prog_state(); + rf_pair_state = it.second.get_rf_pair_state(); + type = it.second.get_type(); if (type == CTRLM_NETWORK_TYPE_RF4CE) { break;