77 lines
3.3 KiB
C
77 lines
3.3 KiB
C
#ifndef __DATABASE_H__
|
||
#define __DATABASE_H__
|
||
|
||
#include "config.h"
|
||
#include "strings.h"
|
||
|
||
// 传感器类型简称的字符串 ID 表 (索引 0~4 对应门磁/PIR/烟感/燃气/水浸),供 UI 层按当前语言取用
|
||
extern const StringID sensor_type_name_ids[5];
|
||
|
||
/* ====== 底层 IAP (在应用编程 Flash) 读写驱动接口 ====== */
|
||
|
||
/**
|
||
* @brief 禁用 IAP 模块,关闭 Flash 擦写控制器
|
||
* @details 每次完成 Flash 的读、写或擦除操作后,必须立即调用此函数,
|
||
* 清除寄存器状态以防止因外部强干扰触发 Flash 误擦写。
|
||
*/
|
||
void IAP_Disable(void);
|
||
|
||
/**
|
||
* @brief 从指定 IAP Flash 地址读取一个字节
|
||
* @param addr 16位目标 Flash 内部偏移物理地址 (对应扇区内偏移)
|
||
* @return u8 读取到的 8 位数据字节
|
||
*/
|
||
u8 IAP_ReadByte(u16 addr);
|
||
|
||
/**
|
||
* @brief 向指定 IAP Flash 地址写入一个字节数据
|
||
* @param addr 16位目标 Flash 内部偏移物理地址
|
||
* @param dat 要写入的 8 位数据字节
|
||
* @note STC32G 的 EEPROM/IAP 写入只能把 1 写为 0,若要把 0 改为 1,必须先执行扇区擦除操作。
|
||
*/
|
||
void IAP_WriteByte(u16 addr, u8 dat);
|
||
|
||
/**
|
||
* @brief 擦除指定的 Flash 物理扇区 (512字节)
|
||
* @param addr 目标扇区内的任意物理字节地址 (传入首地址即可)
|
||
* @note STC32G EEPROM 的擦除以扇区 (512 字节) 为基本单位。擦除后,该扇区内所有字节的数据均恢复为 0xFF。
|
||
*/
|
||
void IAP_EraseSector(u16 addr);
|
||
|
||
|
||
/* ====== 传感器数据库业务持久化接口 ====== */
|
||
|
||
/**
|
||
* @brief 从 Flash 扇区 254 (0xFE0000) 载入全部传感器槽位配置至 RAM 变量
|
||
* @details 系统初始化时调用,将 EEPROM 中的传感器绑定数据拷贝到 RAM 中的 `sensor_list` 数组,
|
||
* 并读取紧随其后存放的 1 字节界面语言设置,调用 `Lang_Init()` 恢复上次选择的语言。
|
||
*/
|
||
void Load_Database(void);
|
||
|
||
/**
|
||
* @brief 将 RAM 中的全部传感器配置保存/写入到 Flash 扇区中
|
||
* @details 在完成对码、添加新传感器、微调防区号或切换界面语言后调用,该函数会先擦除第 254 扇区,
|
||
* 然后逐字节写入当前最新的 `sensor_list` 数组,并在其后追加写入当前界面语言 (`Lang_Current()`)。
|
||
*/
|
||
void Save_Database(void);
|
||
|
||
/**
|
||
* @brief 添加一个新的传感器或更新已有的传感器防区、类型和名称
|
||
* @param addr 捕获到的 24 位无线传感器 EV1527 射频地址
|
||
* @param type 传感器类型 (0:门磁, 1:红外PIR, 2:烟感, 3:燃气, 4:水浸)
|
||
* @param zone 自定义分配的防区号 (1~99, 0代表24小时紧急防区)
|
||
* @details 如果检测到该地址已在列表,则覆盖更新防区号并保存;否则在首个空闲槽位插入该传感器,
|
||
* 自动生成其法语名称字符串,并调用 `Save_Database()` 写入 Flash 中。
|
||
*/
|
||
void Add_Sensor_With_Zone(u32 addr, u8 type, u8 zone);
|
||
|
||
/**
|
||
* @brief 检测特定射频地址是否已被绑定在传感器数据库中
|
||
* @param addr 接收到的 24 位无线传感器射频地址
|
||
* @param out_slot_index 输出参数指针:如果匹配成功,将写入该传感器在 `sensor_list` 数组中的索引槽位号 (0~15)
|
||
* @return bit 返回匹配结果。1 表示数据库中已存在该传感器;0 表示该传感器未登记 (未知设备)
|
||
*/
|
||
bit Check_Sensor_ID(u32 addr, u8 *out_slot_index);
|
||
|
||
#endif // __DATABASE_H__
|