Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/ctrlm.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -508,6 +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();
std::map<ctrlm_network_id_t, ctrlm_rcp_ipc_net_status_t> 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();
Expand Down
30 changes: 30 additions & 0 deletions src/ctrlm_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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->*handler)(data, size);
}
}
}

std::map<ctrlm_network_id_t, ctrlm_rcp_ipc_net_status_t> 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<ctrlm_network_all_ipc_reply_wrapper_t<ctrlm_rcp_ipc_net_status_t>> params = std::make_shared<ctrlm_network_all_ipc_reply_wrapper_t<ctrlm_rcp_ipc_net_status_t>>();
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);
}
Expand Down
40 changes: 38 additions & 2 deletions src/ipc/ctrlm_rcp_ipc_iarm_thunder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <uuid/uuid.h>
Expand Down Expand Up @@ -115,10 +116,45 @@ 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::map<ctrlm_network_id_t, ctrlm_rcp_ipc_net_status_t> status_map = ctrlm_main_network_rcu_status_map_get();
std::vector<ctrlm_rcp_ipc_controller_status_t> 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());
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);

if (err) {
XLOGD_ERROR("JSON object set error");
Expand Down
Loading