Files
stc32g128k/App/app_sos.c

135 lines
3.9 KiB
C
Raw Normal View History

#include "app_manager.h"
#include "xtell.h"
#include "ui.h"
#include "rgb.h"
#include "event.h"
#include "system.h"
#include "../Drivers/rf.h"
#include "../Drivers/lcd.h"
// 外部全局变量引用
extern SystemState current_state;
extern volatile u16 ms_tick;
extern volatile bit alarm_flash_flag;
// 本地私有变量
static u8 sos_last_phase = 99; // 记录上一次发射的 500ms 半周期状态
static u32 sos_pulse_timer = 0; // SOS 马达震动波形计数器
static u16 last_run_tick = 0; // 记录上一次轮询的 ticks
// 声明本应用的生命周期回调函数
static void SOSApp_OnStart(void);
static void SOSApp_onRun(void);
static void SOSApp_onClose(void);
static EventResult SOSApp_onEvent(SystemEvent *evt);
// 实体化定义 SOS 呼救应用控制块
WristbandApp sos_app = {
APP_ID_SOS,
"SOS",
SOSApp_OnStart,
SOSApp_onRun,
SOSApp_onClose,
SOSApp_onEvent
};
/**
* @brief SOSApp
*/
static void SOSApp_OnStart(void)
{
current_state = STATE_SOS_EMITTED; // 进入 SOS 紧急求救状态
sos_last_phase = 99;
sos_pulse_timer = 0; // 马达震动计数器清零
last_run_tick = ms_tick;
UI_ShowSosPage(); // 初始化渲染 SOS 警示主页
// 立即点亮左侧灯为红色,右侧熄灭,准备开启双色红灯交替爆闪
RGB_Send(0, 200, 0, 0, 0, 0);
XTELL_LOG("[SOSApp] Started\r\n");
}
/**
* @brief SOSApp
* @details 500ms SOS
* (1000ms震动 / 200ms静音)
*/
static void SOSApp_onRun(void)
{
u16 tick_diff;
// ====== 1. 控制无线射频,每 500ms 发射一次 SOS 无线数据帧 (0x08) ======
u8 sec_phase = (u8)((ms_tick / 500) % 2);
if (sec_phase != sos_last_phase) {
sos_last_phase = sec_phase;
RF_SetMode(2); // 切换发射
EV1527_Transmit(CLONED_ADDR, 0x08); // 发射克隆 ID 及其 SOS (0x08) 命令字
RF_SetMode(0); // 释放接收
XTELL_LOG("[SOSApp] SOS Radio packet emitted\r\n");
}
// ====== 2. 控制 RGB 双灯珠以 50ms 频率进行高频左右交替红蓝爆闪 ======
{
u8 flash = (ms_tick / 50) % 2;
if (flash) {
RGB_Send(0, 200, 0, 0, 0, 200); // 灯 1 亮红 (GRB 中 R=200),灯 2 亮蓝 (B=200)
} else {
RGB_Send(0, 0, 200, 0, 200, 0); // 灯 1 亮蓝,灯 2 亮红
}
}
// ====== 3. 控制屏幕绘制多层爆闪红白框 ======
if (alarm_flash_flag) {
LCD_DrawRectBorder(4, 4, 112, 232, COLOR_RED);
LCD_DrawRectBorder(5, 5, 110, 230, COLOR_RED);
LCD_DrawRectBorder(8, 8, 104, 224, COLOR_WHITE);
} else {
LCD_DrawRectBorder(4, 4, 112, 232, COLOR_BLACK);
LCD_DrawRectBorder(5, 5, 110, 230, COLOR_BLACK);
LCD_DrawRectBorder(8, 8, 104, 224, COLOR_BLACK);
}
// ====== 4. 马达 SOS 震动节拍自处理 (1000ms 震动200ms 静音) ======
if (ms_tick >= last_run_tick) {
tick_diff = ms_tick - last_run_tick;
} else {
tick_diff = 1000 + ms_tick - last_run_tick;
}
last_run_tick = ms_tick;
sos_pulse_timer += tick_diff;
if (sos_pulse_timer >= 1200) {
sos_pulse_timer = 0;
}
if (sos_pulse_timer < 1000) {
MOTOR = 1;
} else {
MOTOR = 0;
}
}
/**
* @brief SOSApp 退
*/
static void SOSApp_onClose(void)
{
RGB_Send(0, 0, 0, 0, 0, 0); // 关闭 RGB
MOTOR = 0; // 停震
current_state = STATE_NORMAL;
XTELL_LOG("[SOSApp] Closed\r\n");
}
/**
* @brief SOSApp (退 SOS)
*/
static EventResult SOSApp_onEvent(SystemEvent *evt)
{
if (evt->key_event != KEY_EVENT_NONE) {
AppManager_SwitchToForeground(&clock_app); // 退出 SOS返回时钟
return EVENT_HANDLED;
}
return EVENT_IGNORED;
}