Files
stc32g128k/App/config.h
edisondeng 2a83079007 refactor(event): replace global 60s inactivity timer with per-second tick event
Adds KEY_EVENT_SECOND_TICK, generated once per real second from
Clock_IncMS() via a new second_tick_flag and pushed through the normal
event queue, so every foreground App's onEvent() receives it and
decides independently whether to act. Removes the old global
inactivity_timer (60s sleep from anywhere) entirely. HomeApp now
accumulates its own idle-second counter and sleeps after 10s idle
specifically while on the home screen; MenuApp's existing 10s
auto-close is converted from onRun() polling to the same tick+reset
pattern for consistency. Any non-tick key event resets each app's own
counter to 0.
2026-07-31 18:49:03 +08:00

174 lines
8.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __CONFIG_H__
#define __CONFIG_H__
#include "stc32g.h"
#include "intrins.h"
// 重新定义基础数据类型,便于跨平台和简化代码书写
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
// STC32G 端口内部上拉控制寄存器地址定义 (属于扩展 XSFR 空间)
#ifndef P3PU
#define P3PU (*(unsigned char volatile xdata *)0xFE13)
#endif
/* ====== 硬件引脚定义 (sbit) ====== */
// 振动马达控制端 (推挽输出,与 SPI SCLK 物理共享引脚)
sbit MOTOR = P2^5;
// 侧边按键 ▲ (高阻输入 + 上拉),按下为低电平
sbit KEY_UP = P0^1;
// 侧边按键 ■ (高阻输入 + 上拉),按下为低电平
sbit KEY_CONFIRM = P0^2;
// 侧边按键 ▼ (高阻输入 + 上拉),按下为低电平
sbit KEY_DOWN = P0^3;
// 电源保持控制引脚 (1:锁存保持电源, 0:切断电源关机)
#define PWR_HOLD P00
// PCF8563 RTC 实时时钟芯片 I2C 通信引脚
#define RTC_SCL P32
#define RTC_SDA P33
// 物理 SOS 求救按键 (高阻输入 + 上拉),按下为低电平
sbit KEY_SOS = P2^6;
// FCOB 幻彩灯条 DIN 数据控制线
sbit RGB_DIN = P2^3;
// LR690L 射频芯片休眠/工作控制引脚 (0:开启工作, 1:关闭休眠)
sbit SHUT = P3^5;
// LHS114TC-IF03 屏幕 LEDA 白色背光开启引脚 (1点亮0熄灭)
sbit SGM_CTRL = P1^7;
// LHS114TC-IF03 屏幕复位脚 (RESET),低电平复位
sbit LCD_RST = P1^0;
// LHS114TC-IF03 屏幕数据/指令选择脚 (D/C1:数据, 0:命令)
sbit LCD_DCX = P1^1;
// LHS114TC-IF03 屏幕 SPI 数据脚 (MOSI/SDA)
sbit LCD_SDI = P1^4;
// LHS114TC-IF03 屏幕 SPI 时钟脚 (SCLK)
sbit LCD_SCL = P1^5;
// LHS114TC-IF03 屏幕 SPI 片选脚 (CS),低电平有效
sbit LCD_CS = P1^6;
// 充电检测引脚 (TP4054 CHRG 开漏输出,低电平=充电中)
// 硬件连接TP4054 CHRG → DET → MCU (根据原理图,需 PCB 确认实际引脚)
// 架构文档标注为 P5.4,原理图标注为 P1.7 附近,暂用 P5.4,可根据实测调整
sbit CHRG_DET = P5^4;
/* ====== 系统运行状态枚举 ====== */
typedef enum {
STATE_NORMAL, // 正常时钟待机状态
STATE_ARMED, // 布防状态 (监测传感器警报)
STATE_DISARMED, // 撤防状态 (忽略普通传感器警报)
STATE_PAIR_MENU, // 传感器对码/配置主菜单状态
STATE_PAIR_WAIT, // 等待传感器射频信号状态 (对码搜寻中)
STATE_PAIR_CONFIRM, // 捕获到信号,进入防区微调确认状态
STATE_PAIR_SUCCESS, // 对码成功反馈状态
STATE_PAIR_FAIL, // 对码失败 (超时等) 反馈状态
STATE_ALARM, // 传感器入侵报警状态
STATE_SOS_EMITTED, // 处于 SOS 紧急求救发射状态
STATE_SET_TIME, // 时间调整编辑状态 (修改小时、分钟)
STATE_IPC_BIND, // 摄像机/IPC 绑定发射信号状态
STATE_SLEEP // 低功耗休眠挂起状态
} SystemState;
/* ====== 按键事件类型枚举 ====== */
typedef enum {
KEY_EVENT_NONE, // 无按键事件
KEY_EVENT_UP_CLICK, // ▲ 键短按释放
KEY_EVENT_DOWN_CLICK, // ▼ 键短按释放
KEY_EVENT_SOS_CLICK, // SOS 键短按释放
KEY_EVENT_UP_LONG, // ▲ 键长按事件 (触发布撤防切换)
KEY_EVENT_DOWN_LONG, // ▼ 键长按事件 (菜单返回)
KEY_EVENT_SOS_LONG, // SOS 键长按事件
KEY_EVENT_UP_DOWN_COMB, // ▲ 与 ▼ 双键组合按下事件
KEY_EVENT_CONFIRM_CLICK, // ■ 确认键短按事件 (保存设置或进入子菜单)
KEY_EVENT_CONFIRM_LONG, // ■ 确认键长按事件 (打开主菜单)
KEY_EVENT_POWER_OFF, // 长按 KEY_DOWN 开关机触发事件
KEY_EVENT_SECOND_TICK // 整秒滴答事件,每秒派发一次,各 App 自行决定是否用它累计闲置时长
} KeyEvent;
/* ====== 事件优先级枚举 ====== */
typedef enum {
EVENT_PRIORITY_LOW, // 0: 低优先级:系统内部事件,如定时更新
EVENT_PRIORITY_NORMAL, // 1: 正常优先级:大部分用户交互事件
EVENT_PRIORITY_HIGH, // 2: 高优先级:报警相关事件,插队到队首
EVENT_PRIORITY_URGENT // 3: 紧急优先级SOS等插队到队首
} EventPriority;
/* ====== 系统事件结构体定义 ====== */
typedef struct {
KeyEvent key_event; // 关联的按键事件类型
EventPriority priority; // 事件优先级
u32 extra_data; // 随事件携带的额外数据 (如 24 位射频源地址等)
u8 extra_size; // 额外数据的有效字节大小 (0~4)
} SystemEvent;
/* ====== 事件分发处理结果枚举 ====== */
typedef enum {
EVENT_HANDLED, // 事件已成功处理,不再继续向后传递
EVENT_IGNORED // 事件未被处理,允许继续传递给后台应用或丢弃
} EventResult;
/* ====== 应用程序 ID 枚举 ====== */
typedef enum {
APP_ID_HOME, // 待机时钟主页应用程序 (开机默认首屏)
APP_ID_MENU, // 系统设置主菜单应用程序 (顶层 4 项列表)
APP_ID_SET_CLOCK, // 时间设置应用程序 (menu_app 子应用)
APP_ID_PAIR, // 无线传感器对码学习应用程序 (menu_app 子应用)
APP_ID_IPC_BIND, // 摄像头一键绑定应用程序 (menu_app 子应用)
APP_ID_ALARM, // 报警接收与波形反馈应用程序
APP_ID_SOS, // 紧急呼救与无线发射应用程序
APP_ID_MAX // 应用程序最大数量上限,用于数组大小
} AppID;
/* ====== 应用程序类型枚举 ====== */
typedef enum {
APP_TYPE_FOREGROUND, // 前台应用:独占 OLED 屏幕显示并优先接收按键/射频事件
APP_TYPE_BACKGROUND // 后台应用:无屏幕显示,静默监听前台未处理的系统事件
} AppType;
/* ====== 无线传感器 Flash 存储槽位结构体 ====== */
typedef struct {
unsigned char is_used; // 槽位是否已使用标志 (0x01:已启用, 其他:空闲)
unsigned char addr[3]; // 绑定的 24 位无线传感器 EV1527 硬件地址
unsigned char type; // 传感器设备类型 (0:门磁, 1:红外PIR, 2:烟感, 3:燃气, 4:水浸)
unsigned char zone; // 防区编号 (例如 1~990 代表 24小时紧急防区)
unsigned char name_gbk[16];// 传感器的自定义名称 (GBK 编码,用于屏幕显示)
} Sensor_Slot;
/* ====== 全局变量 extern 外部声明 ====== */
extern SystemState current_state; // 系统当前整体运行状态
extern u8 current_hour; // 当前系统时间:小时
extern u8 current_min; // 当前系统时间:分钟
extern u8 current_sec; // 当前系统时间:秒
extern volatile u8 clock_updated; // 时钟分钟更新标志 (1表示需要刷新待机页时间)
extern volatile bit second_tick_flag; // 整秒滴答标志位,每秒置 1由主循环转换为 KEY_EVENT_SECOND_TICK 事件
extern u8 menu_select; // 当前菜单高亮的选中项索引
extern u32 captured_addr; // 对码或报警时,当前捕获到的传感器 24 位射频地址
extern u8 captured_type; // 正在配对的传感器类型
extern u8 alarm_sensor_slot; // 当前触发警报的传感器在数据库列表中的槽位索引
extern Sensor_Slot xdata sensor_list[16];// 传感器数据库数组 (存储在 xdata 区,共 16 个槽位)
// 系统滴答与定时计数器 (均为 1ms 中断服务中更新)
extern volatile u16 ms_tick; // 毫秒滴答计数器 (0~999循环)
extern volatile u32 pair_timeout_ms; // 对码等待搜寻超时毫秒计数器
extern volatile u16 alarm_timer_ms; // 报警振动与闪烁定时计数器
extern volatile u16 motor_timer_ms; // 马达单次震动定时计时器
extern volatile bit alarm_flash_flag; // 报警屏幕红框闪烁的周期标志位 (0或1)
// 按键长按与消抖状态机计数器
extern volatile u16 key_scan_timer; // 按键扫描 10ms 分频计数器
extern volatile u16 key_up_hold; // ▲ 键持续按下计时器
extern volatile u16 key_down_hold; // ▼ 键持续按下计时器
extern volatile u16 key_confirm_hold; // ■ 确认键持续按下计时器
extern volatile u16 key_sos_hold; // SOS 键持续按下计时器
extern volatile u16 comb_hold; // 组合键持续按下计时器
// 常量定义
#define MAIN_Fosc 24000000UL // STC32G 主频工作频率定义 (24.0 MHz)
#define CLONED_ADDR 0x37A86UL // 手环自身克隆发射的默认 24 位射频出厂 ID 地址
#endif // __CONFIG_H__