Files
stc32g128k/App/app_rf_monitor.c

106 lines
3.6 KiB
C
Raw Permalink Normal View History

#include "app_manager.h"
#include "xtell.h"
#include "event.h"
#include "database.h"
#include "system.h"
#include "../Drivers/rf.h"
// 外部全局变量引用
extern SystemState current_state;
extern u32 captured_addr;
extern u8 alarm_sensor_slot;
extern Sensor_Slot xdata sensor_list[16];
// 声明本应用的生命周期回调函数
static void RfMonitorApp_OnStart(void);
static void RfMonitorApp_onRun(void);
static void RfMonitorApp_onClose(void);
static EventResult RfMonitorApp_onEvent(SystemEvent *evt);
// 实体化定义后台射频监控应用控制块
WristbandApp rf_monitor_app = {
0xFE, // 后台应用 ID 设为 0xFE
"RF_Monitor",
RfMonitorApp_OnStart,
RfMonitorApp_onRun,
RfMonitorApp_onClose,
RfMonitorApp_onEvent
};
/**
* @brief RfMonitorApp
*/
static void RfMonitorApp_OnStart(void)
{
RF_SetMode(1); // 开启天线并设为接收模式
XTELL_LOG("[RF_Monitor] Background RF monitor started.\r\n");
}
/**
* @brief RfMonitorApp
* @details EV1527
*
*
*/
static void RfMonitorApp_onRun(void)
{
u32 rx_addr;
u8 rx_data;
u8 slot;
// 常态对待机下的射频检测与触发过滤逻辑
if (EV1527_Decode(&rx_addr, &rx_data)) {
XTELL_LOG("[RF_Monitor] Decoded Addr=");
XTELL_LOG_HEX32(rx_addr);
XTELL_LOG(", Data=");
XTELL_LOG_HEX8(rx_data);
XTELL_LOG("\r\n");
// 比对收到的 24 位射频源地址是否合法注册在手环本地数据库中
if (Check_Sensor_ID(rx_addr, &slot)) {
u8 sensor_type = sensor_list[slot].type; // 获取注册的设备类型
if (sensor_type < 5) {
// 防区分类过滤与布撤防过滤逻辑:
// - zone == 0或者烟感(2)、气感(3)、水浸(4) 为 24小时紧急防区不受当前布防状态影响强制触发报警
// - 门磁(0)和红外(1)为普通边界入侵防区,只有当系统处于 STATE_ARMED (布防) 状态时,才触发警报。
if (sensor_list[slot].zone == 0 ||
sensor_type == 2 ||
sensor_type == 3 ||
sensor_type == 4 ||
current_state == STATE_ARMED)
{
// 只有在前台不为紧急 SOS 呼救且当前不处于报警状态时,才执行报警调起
if (AppManager_GetActiveAppID() != APP_ID_SOS &&
AppManager_GetActiveAppID() != APP_ID_ALARM)
{
captured_addr = rx_addr; // 缓存报警地址
alarm_sensor_slot = slot; // 缓存报警槽位号
XTELL_LOG("[RF_Monitor] Intruder ALERT! Waking up alarm app...\r\n");
AppManager_SwitchToForeground(&alarm_app); // 动态切入警报前台
}
} else {
XTELL_LOG("[RF_Monitor] Ignored due to DISARMED state.\r\n");
}
}
} else {
XTELL_LOG("[RF_Monitor] Unregistered sensor address.\r\n");
}
}
}
/**
* @brief RfMonitorApp 退
*/
static void RfMonitorApp_onClose(void)
{
XTELL_LOG("[RF_Monitor] Background RF monitor closed.\r\n");
}
/**
* @brief RfMonitorApp ()
*/
static EventResult RfMonitorApp_onEvent(SystemEvent *evt)
{
return EVENT_IGNORED;
}