Files
WB55cgu/App/app_globals.c

151 lines
5.0 KiB
C

#include "app_config.h"
#include "app_types.h"
AppContext_t g_app =
{
.role = APP_ROLE_DEFAULT,
.zigbee_state = APP_ZB_DISCONNECTED,
.slave_inputs =
{
.buttons =
{
{ .pressed = false, .changed = false, .last_change_ms = 0U },
{ .pressed = false, .changed = false, .last_change_ms = 0U },
{ .pressed = false, .changed = false, .last_change_ms = 0U }
},
.analog = { .raw = 0U, .filtered = 0U, .percent = 0U },
.sequence = 0U
},
.master_node =
{
.online = false,
.last_report = { .sequence = 0U, .button_mask = 0U, .analog_raw = 0U, .analog_percent = 0U },
.last_seen_ms = 0U
},
.zigbee =
{
.pan_id = APP_ZIGBEE_PAN_ID,
.channel = APP_ZIGBEE_CHANNEL,
.endpoint = APP_ZIGBEE_ENDPOINT,
.cluster_id = APP_ZIGBEE_CLUSTER_INPUTS
},
.uptime_ms = 0U,
.last_report_ms = 0U
};
volatile uint32_t watch_role = APP_ROLE_DEFAULT;
volatile uint32_t watch_is_master = 0U;
volatile uint32_t watch_is_slave = 1U;
volatile uint32_t watch_role_pin_is_master = 0U;
volatile uint32_t watch_zigbee_state = APP_ZB_DISCONNECTED;
volatile uint32_t watch_master_online = 0U;
volatile uint32_t watch_master_last_seen_ms = 0U;
volatile uint32_t watch_master_last_sequence = 0U;
volatile uint32_t watch_master_button_mask = 0U;
volatile uint32_t watch_master_analog_raw = 0U;
volatile uint32_t watch_master_analog_percent = 0U;
volatile uint32_t watch_slave_sequence = 0U;
volatile uint32_t watch_slave_button_mask = 0U;
volatile uint32_t watch_slave_analog_raw = 0U;
volatile uint32_t watch_slave_analog_percent = 0U;
volatile uint32_t watch_report_tx_count = 0U;
volatile uint32_t watch_report_rx_count = 0U;
volatile uint32_t watch_report_tx_attempt_count = 0U;
volatile uint32_t watch_report_tx_ok_count = 0U;
volatile uint32_t watch_report_tx_busy_count = 0U;
volatile uint32_t watch_report_tx_confirm_count = 0U;
volatile uint32_t watch_report_tx_confirm_status = 0U;
volatile uint32_t watch_report_rx_ind_count = 0U;
volatile uint32_t watch_report_rx_decode_fail_count = 0U;
volatile uint32_t watch_report_rx_last_cluster = 0U;
volatile uint32_t watch_report_rx_last_length = 0U;
volatile uint32_t watch_zigbee_ready = 0U;
volatile uint32_t watch_rejoin_request_count = 0U;
volatile uint32_t watch_rejoin_success_count = 0U;
volatile uint32_t watch_rejoin_fail_count = 0U;
volatile uint32_t watch_rejoin_active = 0U;
volatile uint32_t watch_rejoin_last_status = 0U;
volatile uint32_t watch_report_tx_fail_streak = 0U;
volatile uint32_t watch_permit_join_count = 0U;
volatile uint32_t watch_permit_join_status = 0U;
volatile uint32_t watch_permit_join_duration = 0U;
volatile uint32_t watch_join_watchdog_count = 0U;
static void App_DebugCopyReportToMasterWatch(const AppSlaveReport_t *report)
{
watch_master_last_sequence = report->sequence;
watch_master_button_mask = report->button_mask;
watch_master_analog_raw = report->analog_raw;
watch_master_analog_percent = report->analog_percent;
}
static void App_DebugCopyReportToSlaveWatch(const AppSlaveReport_t *report)
{
watch_slave_sequence = report->sequence;
watch_slave_button_mask = report->button_mask;
watch_slave_analog_raw = report->analog_raw;
watch_slave_analog_percent = report->analog_percent;
}
const char *App_RoleName(AppRole_t role)
{
return (role == APP_ROLE_MASTER) ? "master" : "slave";
}
void App_SetRole(AppRole_t role)
{
g_app.role = role;
g_app.zigbee_state = APP_ZB_DISCONNECTED;
g_app.last_report_ms = 0U;
}
AppSlaveReport_t App_MakeSlaveReport(const AppSlaveInputs_t *inputs)
{
AppSlaveReport_t report;
uint8_t mask = 0U;
for (uint8_t i = 0U; i < APP_BUTTON_COUNT; i++)
{
if (inputs->buttons[i].pressed)
{
mask |= (uint8_t)(1U << i);
}
}
report.sequence = inputs->sequence;
report.button_mask = mask;
report.analog_raw = inputs->analog.raw;
report.analog_percent = inputs->analog.percent;
return report;
}
void App_MasterAcceptReport(const AppSlaveReport_t *report, uint32_t now_ms)
{
g_app.master_node.online = true;
g_app.master_node.last_report = *report;
g_app.master_node.last_seen_ms = now_ms;
watch_report_rx_count++;
App_DebugCopyReportToMasterWatch(report);
App_DebugRefresh(watch_role_pin_is_master);
}
void App_DebugRefresh(uint32_t role_pin_is_master)
{
watch_role = (uint32_t)g_app.role;
watch_is_master = (g_app.role == APP_ROLE_MASTER) ? 1U : 0U;
watch_is_slave = (g_app.role == APP_ROLE_SLAVE) ? 1U : 0U;
watch_role_pin_is_master = role_pin_is_master;
watch_zigbee_state = (uint32_t)g_app.zigbee_state;
watch_master_online = g_app.master_node.online ? 1U : 0U;
watch_master_last_seen_ms = g_app.master_node.last_seen_ms;
App_DebugCopyReportToMasterWatch(&g_app.master_node.last_report);
}
void App_DebugOnSlaveReportTx(const AppSlaveReport_t *report)
{
watch_report_tx_count++;
App_DebugCopyReportToSlaveWatch(report);
}