diff --git a/src/ctrlm.h b/src/ctrlm.h index 376608b3..1518f0e2 100644 --- a/src/ctrlm.h +++ b/src/ctrlm.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "ctrlm_hal.h" #include "ctrlm_hal_rf4ce.h" #include "ctrlm_hal_ble.h" @@ -34,6 +35,7 @@ #include "ctrlm_ipc_rcu.h" #include "ctrlm_ipc_voice.h" #include "ctrlm_ipc_device_update.h" +#include "ctrlm_rcp_ipc_event.h" #include "ctrlm_irdb_interface.h" #include "libIBus.h" #include "safec_lib.h" @@ -53,6 +55,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,6 +511,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(); +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 54ddb884..319acc4e 100644 --- a/src/ctrlm_main.cpp +++ b/src/ctrlm_main.cpp @@ -877,6 +877,36 @@ void ctrlm_main_ir_last_keypress_get(ctrlm_ir_last_keypress_t *last_key_info) { } } +static void ctrlm_main_network_handler_execute_for_all(ctrlm_msg_handler_network_t handler, void *data, int size) { + for (auto const &network_it : g_ctrlm.networks) { + if (network_it.second && network_it.second->is_ready()) { + (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 {}; + } + + 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(){ sem_wait(&g_ctrlm.ctrlm_utils_sem); } diff --git a/src/ipc/ctrlm_rcp_ipc_event.cpp b/src/ipc/ctrlm_rcp_ipc_event.cpp index 510be650..7ed3d43d 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.cpp +++ b/src/ipc/ctrlm_rcp_ipc_event.cpp @@ -135,17 +135,17 @@ void ctrlm_rcp_ipc_net_status_t::populate_status(const ctrlm_obj_network_t &netw } } -ctrlm_ir_state_t ctrlm_rcp_ipc_net_status_t::get_ir_prog_state(void) +ctrlm_ir_state_t ctrlm_rcp_ipc_net_status_t::get_ir_prog_state(void) const { return irdb_state_; } -ctrlm_rf_pair_state_t ctrlm_rcp_ipc_net_status_t::get_rf_pair_state(void) +ctrlm_rf_pair_state_t ctrlm_rcp_ipc_net_status_t::get_rf_pair_state(void) const { return pair_state_; } -void ctrlm_rcp_ipc_net_status_t::get_controller_status_list(std::vector &list) +void ctrlm_rcp_ipc_net_status_t::get_controller_status_list(std::vector &list) const { for (const auto &status : controller_status_list_) { list.push_back(status); diff --git a/src/ipc/ctrlm_rcp_ipc_event.h b/src/ipc/ctrlm_rcp_ipc_event.h index e2c36e7c..03b29da4 100644 --- a/src/ipc/ctrlm_rcp_ipc_event.h +++ b/src/ipc/ctrlm_rcp_ipc_event.h @@ -120,9 +120,9 @@ class ctrlm_rcp_ipc_net_status_t : public ctrlm_virtual_json_t ctrlm_network_type_t get_type() const { return net_type_; } void populate_status(const ctrlm_obj_network_t &network); - ctrlm_ir_state_t get_ir_prog_state(void); - ctrlm_rf_pair_state_t get_rf_pair_state(void); - void get_controller_status_list(std::vector &list); + ctrlm_ir_state_t get_ir_prog_state(void) const; + ctrlm_rf_pair_state_t get_rf_pair_state(void) const; + void get_controller_status_list(std::vector &list) const; private: uint8_t api_revision_ = 0; diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp index 5ed63e70..f2ffcfff 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 @@ -103,6 +104,42 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::is_thunder_device_update_enabled() const return (thunder_device_update_enabled_); } +json_t *ctrlm_rcp_ipc_iarm_thunder_t::build_rcu_status_json( + const std::map &status_map, + ctrlm_ir_state_t ir_prog_state, + ctrlm_rf_pair_state_t rf_pair_state, + ctrlm_network_type_t type) const +{ + json_t *status = json_object(); + json_t *net_type_supported = json_array(); + json_t *remote_array = json_array(); + std::vector remotes; + int err = 0; + + for (auto const &it : ctrlm_network_types_get()) { + err |= json_array_append_new(net_type_supported, json_integer(it)); + } + for (auto &it : status_map) { + it.second.get_controller_status_list(remotes); + } + for (const auto &remote : remotes) { + err |= json_array_append_new(remote_array, remote.to_json()); + } + + 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))); + + if (err) { + XLOGD_ERROR("JSON object set error"); + json_decref(status); + return nullptr; + } + return status; +} + bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &net_status) const { if (!is_running(atomic_running_)) { @@ -115,11 +152,15 @@ 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; + const std::map status_map = ctrlm_main_network_rcu_status_map_get(); - err |= json_object_set_new_nocheck(ret, STATUS, net_status.to_json()); + json_t *status = build_rcu_status_json(status_map, net_status.get_ir_prog_state(), net_status.get_rf_pair_state(), net_status.get_type()); + if (status == nullptr) { + return(false); + } + json_t *ret = json_object(); + int err = json_object_set_new_nocheck(ret, STATUS, status); if (err) { XLOGD_ERROR("JSON object set error"); json_decref(ret); @@ -129,6 +170,70 @@ bool ctrlm_rcp_ipc_iarm_thunder_t::on_status(const ctrlm_rcp_ipc_net_status_t &n return broadcast_iarm_event(CTRLM_MAIN_IARM_BUS_NAME, CTRLM_RCU_IARM_EVENT_RCU_STATUS, ret); } + +IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) +{ + XLOGD_INFO(""); + + if (!is_running(atomic_running_)) { + XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); + return(IARM_RESULT_INVALID_STATE); + } + + ctrlm_main_iarm_call_json_t *call_data = static_cast(arg); + + if (!call_data || call_data->api_revision != CTRLM_MAIN_IARM_BUS_API_REVISION) { + XLOGD_ERROR("NULL parameter"); + return(IARM_RESULT_INVALID_PARAM); + } + + std::shared_ptr> params = std::make_shared>(); + params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); + + sync_send_netw_handler_to_main_queue_new, + ctrlm_main_queue_msg_get_rcu_status_t> + (params, + (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status); + + + std::map status_map = params->get_reply(); + + + ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; + ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; + ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; + + // For now default to RF4CE network reporting if available + for (auto &it : status_map) { + ir_prog_state = it.second.get_ir_prog_state(); + rf_pair_state = it.second.get_rf_pair_state(); + type = it.second.get_type(); + + if (type == CTRLM_NETWORK_TYPE_RF4CE) { + break; + } + } + + json_t *status = build_rcu_status_json(status_map, ir_prog_state, rf_pair_state, type); + if (status == nullptr) { + return(IARM_RESULT_INVALID_STATE); + } + + json_t *ret = json_object(); + + int err = 0; + err |= json_object_set_new_nocheck(ret, STATUS, status); + err |= json_object_set_new_nocheck(ret, SUCCESS, json_boolean(params->get_result())); + + if (err || !ctrlm_json_to_iarm_call_data_result(ret, call_data)) { + XLOGD_ERROR("JSON object set error"); + json_decref(ret); + return(IARM_RESULT_INVALID_STATE); + } + + return(IARM_RESULT_SUCCESS); +} + bool ctrlm_rcp_ipc_iarm_thunder_t::on_validation_status(const ctrlm_rcp_ipc_validation_status_t &validation_status) const { if (!is_running(atomic_running_)) { @@ -223,6 +328,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_pairing(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -250,17 +356,20 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_pairing(void *arg) json_array_foreach(mac_addr_array, index, value) { if (!json_is_string(value)) { XLOGD_ERROR("An element of the %s array is not a string", MAC_ADDRESS_LIST); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } uint64_t mac_addr = ctrlm_convert_mac_string_to_long(json_string_value(value)); if (mac_addr == 0) { XLOGD_ERROR("An invalid mac address was provided <%s>", json_string_value(value)); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } mac_addr_list.push_back(mac_addr); } } + json_decref(payload); if(!scanEnable && mac_addr_list.size() > 0) { XLOGD_WARN("scanEnable is false but macAddressList is not empty. Ignoring macAddressList."); @@ -325,6 +434,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::stop_pairing(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -337,6 +447,8 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::stop_pairing(void *arg) if (!config.config_value_get(SCAN_DISABLE, scanDisable)) { XLOGD_INFO("Missing %s parameter - defaulting to %s", SCAN_DISABLE, scanDisable ? "true" : "false"); } + json_decref(payload); + bool result = true; if(!screenBindDisable && !scanDisable) { @@ -373,94 +485,6 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::stop_pairing(void *arg) return(IARM_RESULT_SUCCESS); } -IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_net_status(void *arg) -{ - XLOGD_INFO(""); - - if (!is_running(atomic_running_)) { - XLOGD_ERROR("IARM Call received when IARM component in stopped/terminated state"); - return(IARM_RESULT_INVALID_STATE); - } - - ctrlm_main_iarm_call_json_t *call_data = static_cast(arg); - - if (!call_data || call_data->api_revision != CTRLM_MAIN_IARM_BUS_API_REVISION) { - XLOGD_ERROR("NULL parameter"); - return(IARM_RESULT_INVALID_PARAM); - } - - json_t *payload = json_loads(call_data->payload, JSON_DECODE_ANY, NULL); - json_config config(payload); - - if (!payload || !config.current_object_get()) { - XLOGD_ERROR("Bad payload from call data"); - return(IARM_RESULT_INVALID_PARAM); - } - - - std::shared_ptr> params = std::make_shared>(); - params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); - - sync_send_netw_handler_to_main_queue_new, - ctrlm_main_queue_msg_get_rcu_status_t> - (params, - (ctrlm_msg_handler_network_t)&ctrlm_obj_network_t::req_process_get_rcu_status); - - json_t *ret = json_object(); - json_t *status = json_object(); - json_t *net_type_supported = json_array(); - json_t *remote_array = json_array(); - - std::map status_map = params->get_reply(); - std::vector remotes; - - ctrlm_network_type_t type = CTRLM_NETWORK_TYPE_INVALID; - ctrlm_ir_state_t ir_prog_state = CTRLM_IR_STATE_UNKNOWN; - ctrlm_rf_pair_state_t rf_pair_state = CTRLM_RF_PAIR_STATE_UNKNOWN; - int err = 0; - - for (auto const &it : ctrlm_network_types_get()) { - err |= json_array_append_new(net_type_supported, json_integer(it)); - } - for (auto &it : status_map) { - it.second.get_controller_status_list(remotes); - } - for (const auto &remote : remotes) { - err |= json_array_append_new(remote_array, remote.to_json()); - } - // For now default to RF4CE network reporting if available - for (auto &it : status_map) { - ir_prog_state = it.second.get_ir_prog_state(); - rf_pair_state = it.second.get_rf_pair_state(); - type = it.second.get_type(); - - if (type == CTRLM_NETWORK_TYPE_RF4CE) { - break; - } - } - - err |= json_object_set_new_nocheck(status, REMOTE_DATA, remote_array); - err |= json_object_set_new_nocheck(status, NET_TYPES_SUPPORTED, net_type_supported); - err |= json_object_set_new_nocheck(status, NET_TYPE, json_integer(type)); - err |= json_object_set_new_nocheck(status, IR_PROG_STATE, json_string(ctrlm_ir_state_str(ir_prog_state))); - err |= json_object_set_new_nocheck(status, PAIRING_STATE, json_string(ctrlm_rf_pair_state_str(rf_pair_state))); - - err |= json_object_set_new_nocheck(ret, STATUS, status); - err |= json_object_set_new_nocheck(ret, SUCCESS, json_boolean(params->get_result())); - - if (err) { - XLOGD_ERROR("JSON object set error"); - json_decref(ret); - return(IARM_RESULT_INVALID_STATE); - } - - if (!ctrlm_json_to_iarm_call_data_result(ret, call_data)) { - json_decref(ret); - return(IARM_RESULT_INVALID_STATE); - } - - return(IARM_RESULT_SUCCESS); -} IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_last_keypress(void *arg) { @@ -478,14 +502,6 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::get_last_keypress(void *arg) return(IARM_RESULT_INVALID_PARAM); } - json_t *payload = json_loads(call_data->payload, JSON_DECODE_ANY, NULL); - json_config config(payload); - - if (!payload || !config.current_object_get()) { - XLOGD_ERROR("Bad payload from call data"); - return(IARM_RESULT_INVALID_PARAM); - } - std::shared_ptr> params = std::make_shared>(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); @@ -554,14 +570,17 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::find_my_remote(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } std::string level; if(!config.config_value_get(LEVEL, level)) { XLOGD_ERROR("Missing %s parameter", LEVEL); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } + json_decref(payload); std::shared_ptr params = std::make_shared(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); @@ -650,6 +669,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::write_rcu_wakeup_config(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -657,6 +677,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::write_rcu_wakeup_config(void *arg) std::string wakeup_config; if(!config.config_value_get(WAKEUP_CONFIG, wakeup_config)) { XLOGD_ERROR("Missing %s parameter", WAKEUP_CONFIG); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -664,9 +685,11 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::write_rcu_wakeup_config(void *arg) if (ctrlm_utils_str_to_wakeup_config(wakeup_config) == CTRLM_RCU_WAKEUP_CONFIG_CUSTOM) { if(!config.config_value_get(CUSTOM_KEYS, custom_keys)) { XLOGD_ERROR("Missing %s parameter", CUSTOM_KEYS); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } } + json_decref(payload); ctrlm_iarm_call_WriteRcuWakeupConfig_params_t params = {}; params.network_id = CTRLM_MAIN_NETWORK_ID_ALL; @@ -716,6 +739,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::unpair(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -728,17 +752,20 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::unpair(void *arg) json_array_foreach(mac_addr_array, index, value) { if (!json_is_string(value)) { XLOGD_ERROR("An element of the %s array is not a string", MAC_ADDRESS_LIST); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } uint64_t mac_addr = ctrlm_convert_mac_string_to_long(json_string_value(value)); if (mac_addr == 0) { XLOGD_ERROR("An invalid mac address was provided <%s>", json_string_value(value)); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } mac_addr_list.push_back(mac_addr); } } + json_decref(payload); std::shared_ptr params = std::make_shared(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); @@ -794,6 +821,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_fw_update(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -808,6 +836,7 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_fw_update(void *arg) std::string filename; if (!config.config_value_get(FILENAME, filename)) { XLOGD_ERROR("Missing %s parameter", FILENAME); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } @@ -816,20 +845,22 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::start_fw_update(void *arg) XLOGD_INFO("%s parameter was omitted", FILETYPE); } - uint8_t percent_increment = 0; + int percent_increment = 0; if (!config.config_value_get(PERCENT_INCREMENT, percent_increment)) { XLOGD_INFO("%s parameter was omitted", PERCENT_INCREMENT); } else if (percent_increment < 0 || percent_increment > 100) { XLOGD_ERROR("%s parameter out of bounds", PERCENT_INCREMENT); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } + json_decref(payload); std::shared_ptr params = std::make_shared(); std::shared_ptr> upgrade_sessions = std::make_shared>(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); params->ieee_address = ieee_address; - params->percent_increment = percent_increment; + params->percent_increment = (uint8_t)percent_increment; params->filetype = filetype; params->filename = filename; params->upgrade_sessions = upgrade_sessions; @@ -890,14 +921,17 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::cancel_fw_update(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } std::string session_id; if (!config.config_value_get(SESSION_ID, session_id) || !ctrlm_utils_is_valid_uuid(session_id)) { XLOGD_ERROR("Missing or bad %s parameter", SESSION_ID); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } + json_decref(payload); std::shared_ptr params = std::make_shared(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); @@ -953,14 +987,17 @@ IARM_Result_t ctrlm_rcp_ipc_iarm_thunder_t::status_fw_update(void *arg) if (!payload || !config.current_object_get()) { XLOGD_ERROR("Bad payload from call data"); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } std::string session_id; if (!config.config_value_get(SESSION_ID, session_id) || !ctrlm_utils_is_valid_uuid(session_id)) { XLOGD_ERROR("Missing or bad %s parameter", SESSION_ID); + json_decref(payload); return(IARM_RESULT_INVALID_PARAM); } + json_decref(payload); std::shared_ptr params = std::make_shared(); params->set_net_id(CTRLM_MAIN_NETWORK_ID_ALL); diff --git a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h index 384df5ae..41afff26 100644 --- a/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h +++ b/src/ipc/ctrlm_rcp_ipc_iarm_thunder.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "ctrlm_ipc_iarm.h" #include "ctrlm_ipc.h" #include "ctrlm_utils.h" @@ -63,6 +64,10 @@ class ctrlm_rcp_ipc_iarm_thunder_t : public ctrlm_ipc_iarm_t static bool thunder_device_update_enabled_; void configure(void); + json_t *build_rcu_status_json(const std::map &status_map, + ctrlm_ir_state_t ir_prog_state, + ctrlm_rf_pair_state_t rf_pair_state, + ctrlm_network_type_t type) const; public: ~ctrlm_rcp_ipc_iarm_thunder_t();