docs: 按照开发规范重构项目,完成七个环节文档整理与.xagent流程搭建
This commit is contained in:
39
Docs/50_module-breakdown/mod-key.md
Normal file
39
Docs/50_module-breakdown/mod-key.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# 模块拆分 - 按键扫描与事件判定 (docs/50_module-breakdown/mod-key.md)
|
||||
|
||||
本模块描述按键状态消抖、长按计时判定以及组合按键识别。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. 在 1ms 定时器中断中建立 10ms 扫描计时周期。
|
||||
2. 对三个物理按键(KEY_UP SW1, KEY_SOS SW3, KEY_DOWN SW2)进行状态扫描。
|
||||
3. 实现消抖检测(连续 20ms 检测到电平稳定才认定按键动作)。
|
||||
4. 对按住不放的行为进行计时累加,判定长按(如长按 SOS 达 5 秒触发对码;长按 ▲+▼ 达 3 秒触发配对模式)。
|
||||
5. 将按键判定结果转换为 `KeyEvent` 枚举,并注入按键事件缓冲区 `key_event_buf` 供主循环异步读取。
|
||||
|
||||
## 2. 数据结构定义
|
||||
|
||||
### 按键事件枚举 (KeyEvent)
|
||||
```c
|
||||
typedef enum {
|
||||
KEY_EVENT_NONE,
|
||||
KEY_UP_SHORT,
|
||||
KEY_UP_LONG,
|
||||
KEY_DOWN_SHORT,
|
||||
KEY_DOWN_LONG,
|
||||
KEY_SOS_SHORT,
|
||||
KEY_SOS_LONG,
|
||||
KEY_COMB_LONG // ▲ + ▼ 组合长按事件
|
||||
} KeyEvent;
|
||||
```
|
||||
|
||||
## 3. 接口与函数说明
|
||||
|
||||
* `void Key_Scan_Process(void)`:
|
||||
在 Timer 1 ISR 中每 10ms 调度一次。
|
||||
* 读取 `KEY_UP`, `KEY_DOWN`, `KEY_SOS` 的 GPIO 逻辑电平。
|
||||
* 如果发现按键电平状态改变,进行计数消抖。
|
||||
* 如果按住不放,累加计时计数器(`key_up_hold`, `key_down_hold`, `key_sos_hold`)。
|
||||
* 检测到 `key_up_hold >= 300` 且 `key_down_hold >= 300` 达 3 秒时,注入 `KEY_COMB_LONG` 事件。
|
||||
* 检测到 `key_sos_hold >= 500` 达 5 秒时,注入 `KEY_SOS_LONG` 事件;若释放时未达 5 秒但大于 20ms,注入 `KEY_SOS_SHORT`。
|
||||
* 事件解析完毕后存入 `key_event_buf`。
|
||||
29
Docs/50_module-breakdown/mod-lcd.md
Normal file
29
Docs/50_module-breakdown/mod-lcd.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# 模块拆分 - LCD 显示与字模驱动 (docs/50_module-breakdown/mod-lcd.md)
|
||||
|
||||
本模块管理 AMOLED 屏幕引脚、SGM3833 电源使能、SPI 传输和界面图文渲染。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. 提供底层的 SPI 单向命令/数据通道。
|
||||
2. 控制 SGM_CTRL 供电管脚。
|
||||
3. 支持屏幕窗口配置,实现底层清屏与局部像素写入。
|
||||
4. 读取 `lcd_font.h` 库,在指定坐标绘制 8x16 字符与自定义大小位图。
|
||||
5. 实现各业务状态屏幕画面绘制。
|
||||
|
||||
## 2. 底层显示接口
|
||||
|
||||
* `void LCD_Init(void)`:初始化 LCD 引脚,置 `SGM_CTRL = 1` 使能正负高压供电,并发送 RM69310 的初始化 SPI 寄存器序列。
|
||||
* `void LCD_WriteCmd(u8 cmd)`:拉低 `LCD_RS` 发送 SPI 命令。
|
||||
* `void LCD_WriteData(u8 dat)`:拉高 `LCD_RS` 发送 SPI 数据。
|
||||
* `void LCD_SetWindow(u16 x1, u16 y1, u16 x2, u16 y2)`:设置局部像素绘制范围(强制处理 X 轴偏量 `+4`)。
|
||||
* `void LCD_Clear(u16 color)`:将整块屏幕刷写为特定背景色。
|
||||
|
||||
## 3. 图文绘制与 UI 渲染
|
||||
|
||||
* `void LCD_ShowChar(u16 x, u16 y, char c, u16 fc, u16 bc)`:在 (x, y) 坐标处绘制 ASCII 字符 `c`。
|
||||
* `void LCD_ShowString(u16 x, u16 y, char *s, u16 fc, u16 bc)`:循环打印字符串。
|
||||
* `void LCD_ShowImage(u16 x, u16 y, u16 w, u16 h, const u8 *img, u16 fc, u16 bc)`:在指定区域绘制单色位图。
|
||||
* `void UI_ShowClockPage(SystemState state, u8 hour, u8 min)`:渲染时钟待机页面,并根据布撤防状态在状态栏绘制相应锁状态图标。
|
||||
* `void UI_ShowAlarmPage(char *sensor_name, u8 zone)`:渲染防区告警页面,显示对应的传感器位图和法语名称。
|
||||
* `void UI_ShowPairMenuPage(u8 selected_index)`:渲染对码选择菜单。
|
||||
23
Docs/50_module-breakdown/mod-power.md
Normal file
23
Docs/50_module-breakdown/mod-power.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# 模块拆分 - 低功耗电源管理 (docs/50_module-breakdown/mod-power.md)
|
||||
|
||||
本模块描述手环待机情况下的屏幕休眠与单片机停机唤醒机制,用于降低日常静态电流消耗。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. 在系统无物理按键按下且无射频信号输入达 **10 秒** 后,触发低功耗睡眠动作。
|
||||
2. 向 RM69310 屏幕控制器发送 Sleep In(命令 `0x10`)使 AMOLED 内部关闭。
|
||||
3. 拉低 `SGM_CTRL = 0` 彻底切断 SGM3833 的正负压与 VAVDD 供电,将屏幕静态电流降至微安级。
|
||||
4. 将按键引脚(KEY_UP P0.1, KEY_SOS P0.2, KEY_DOWN P0.3)配置为外部中断源。
|
||||
5. 调用单片机 PD 停机控制寄存器,关闭主时钟进入 Power-Down 停机状态。
|
||||
6. 在用户按压任意键时通过引脚电平下降沿产生外部中断,瞬时唤醒主控时钟并恢复供电。
|
||||
|
||||
## 2. 接口与函数设计
|
||||
|
||||
* `void Enter_Deep_Sleep(void)`:
|
||||
1. 通过 SPI 通道写指令 `0x10`。
|
||||
2. 设置 `SGM_CTRL = 0`。
|
||||
3. 清除外部中断标志,使能 P0 口外部中断输入。
|
||||
4. 设置单片机的 `PCON` 寄存器使 `PD = 1`。主时钟停止。
|
||||
* `void Key_Wakeup_Isr(void)`:
|
||||
按键外部中断服务函数,唤醒后拉高 `SGM_CTRL = 1` 恢复屏幕高压供电,并发送 Wake Up 指令 `0x11` 重建屏幕显示。
|
||||
26
Docs/50_module-breakdown/mod-rf.md
Normal file
26
Docs/50_module-breakdown/mod-rf.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# 模块拆分 - 自适应 RF 解码与发射 (docs/50_module-breakdown/mod-rf.md)
|
||||
|
||||
本模块管理射频芯片 GPIO 初始化、433MHz EV1527 解调接收(宽限时序比值算法)与射频打包主动发射。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. 初始化射频接收和发射控制引脚。
|
||||
2. 对射频输入引脚进行高低电平时序轮询解码,计算其高低电平比值,实现自适应 EV1527 24位数据解码。
|
||||
3. 在特定系统请求下(例如发送 SOS 呼救或与 IPC 对码绑定),主动通过发射引脚发出 EV1527 编码帧。
|
||||
* **自适应比值解调机制**:
|
||||
不依赖死宽度的微秒延迟。检测同步头低电平(时间在 1500~60000us 之间)与高电平时间(时间在 50~2500us 之间),算出两者的时序比例。
|
||||
* 以 `31` 作为低电平对高电平的时钟倍率基准(高低比值支持在 `15` 到 `48` 倍范围)。
|
||||
* 计算出每 bit 的标准时钟周期 `T = low_time / 31`,根据此动态 `T` 进行后续 24 个数据位(高/低电平宽度)的比值反解。
|
||||
|
||||
## 2. 接口与函数说明
|
||||
|
||||
* `void RF_Init(void)`:配置射频芯片引脚方向,初始化控制端口电平。
|
||||
* `bit EV1527_Decode(u32 *out_addr, u8 *out_type)`:
|
||||
进行射频接收包解码尝试。
|
||||
* 首先通过计数检测大于 `1500us` 的同步低电平前导信号。
|
||||
* 自适应计算时钟基准 `T`。
|
||||
* 连续接收 24 位宽数据:如果某个数据位的高电平比低电平长,则认为该位为 `1`;反之为 `0`。
|
||||
* 解码成功将 20 位地址存入 `out_addr`,后 4 位数据存入 `out_type` 并返回 `1`;否则返回 `0`。
|
||||
* `void EV1527_Transmit(u32 addr, u8 data_code)`:
|
||||
主动发射一帧数据。生成同步头,并按 `1` 码(高电平 3T, 低电平 1T)或 `0` 码(高电平 1T, 低电平 3T)依次驱动发射引脚电平,持续多帧以确保接收方捕获。
|
||||
55
Docs/50_module-breakdown/mod-sys.md
Normal file
55
Docs/50_module-breakdown/mod-sys.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# 模块拆分 - 系统核心控制与存储 (docs/50_module-breakdown/mod-sys.md)
|
||||
|
||||
本模块定义手环系统的生命周期、时间计数器、定时中断调度器以及断电保存数据库模块。
|
||||
|
||||
## 1. 模块职责说明
|
||||
|
||||
* **职责范围**:
|
||||
1. 驱动系统主状态机运转(`current_state`)。
|
||||
2. 提供 RTC 软时钟维护(`current_hour`, `current_min`, `current_sec`)。
|
||||
3. 利用 Timer 1 产生 1ms 定时器中断,维护毫秒滴答计数器并作为其他外设时效的基础。
|
||||
4. 实现 IAP 读写底层函数,对防区数据库进行存取与读取。
|
||||
* **模块依赖**:
|
||||
* 依赖 `mod-lcd.md` 进行 UI 状态重绘。
|
||||
* 依赖 `mod-rf.md` 提供 RF 解码信号与数据包注入。
|
||||
* 依赖 `mod-key.md` 响应按键动作。
|
||||
|
||||
## 2. 数据结构定义
|
||||
|
||||
### 2.1 传感器插槽结构体 (Sensor_Slot)
|
||||
```c
|
||||
typedef struct {
|
||||
u32 addr; // 24位 EV1527 地址
|
||||
u8 type; // 传感器类型
|
||||
u8 zone; // 防区类别 (0: 永久防区, 1: 可撤布防区)
|
||||
char name[16]; // 法语自定义名称
|
||||
} Sensor_Slot;
|
||||
```
|
||||
|
||||
### 2.2 系统状态枚举 (SystemState)
|
||||
```c
|
||||
typedef enum {
|
||||
STATE_NORMAL,
|
||||
STATE_ARMED,
|
||||
STATE_DISARMED,
|
||||
STATE_PAIR_MENU,
|
||||
STATE_PAIR_WAIT,
|
||||
STATE_PAIR_CONFIRM,
|
||||
STATE_PAIR_SUCCESS,
|
||||
STATE_PAIR_FAIL,
|
||||
STATE_ALARMING,
|
||||
STATE_SOS_EMITTED
|
||||
} SystemState;
|
||||
```
|
||||
|
||||
## 3. 模块接口说明
|
||||
|
||||
### 3.1 定时与时钟函数
|
||||
* `void Timer1_Init(void)`:配置 Timer 1 作为 1ms 中断源,并使能全局中断。
|
||||
* `void Timer1_Isr(void) interrupt 3`:ISR 中断处理,自增时间滴答、维护 LED 闪烁周期、马达振动波形定时,以及维护软件 RTC(自增 `current_sec` 并在满 60 秒时触发主界面分钟刷新)。
|
||||
|
||||
### 3.2 IAP 数据库存储接口
|
||||
* `void Load_Database(void)`:从 Flash 扇区 `0xFE0000` 读取 16 组传感器配置载入内存的 `sensor_list`。
|
||||
* `void Save_Database(void)`:擦除 Flash 扇区并将内存中的 `sensor_list` 写入 Flash。
|
||||
* `void Add_Sensor(u32 addr, u8 type)`:向 `sensor_list` 添加传感器信息并自动调用 `Save_Database()`。
|
||||
* `bit Check_Sensor_ID(u32 addr, u8 *out_slot_index)`:在数据库中检索该地址码,若存在则返回它的槽位索引。
|
||||
Reference in New Issue
Block a user