暂存
This commit is contained in:
@@ -1,19 +1,23 @@
|
||||
#include "database.h"
|
||||
#include "language.h"
|
||||
|
||||
// 内部 IAP 命令寄存器指令定义
|
||||
#define IAP_CMD_READ 1 // IAP 字节读指令
|
||||
#define IAP_CMD_WRITE 2 // IAP 字节写指令
|
||||
#define IAP_CMD_ERASE 3 // IAP 扇区擦除指令
|
||||
|
||||
// 定义法语传感器默认名称常量数组,分别对应类型 0~4
|
||||
char *code sensor_names_fr[5] = {
|
||||
"PORTE", // 0: 门磁 (法语: 门)
|
||||
"PIR", // 1: 红外探测器
|
||||
"FUMEE", // 2: 烟雾传感器 (法语: 烟雾)
|
||||
"GAZ", // 3: 燃气泄漏传感器 (法语: 燃气)
|
||||
"EAU" // 4: 漏水/水浸传感器 (法语: 水)
|
||||
// 传感器类型简称的字符串 ID,分别对应类型 0~4,实际文案由 Lang_Get() 按当前语言取出
|
||||
const StringID sensor_type_name_ids[5] = {
|
||||
STR_NAME_PORTE, // 0: 门磁
|
||||
STR_NAME_PIR, // 1: 红外探测器
|
||||
STR_NAME_FUMEE, // 2: 烟雾传感器
|
||||
STR_NAME_GAZ, // 3: 燃气泄漏传感器
|
||||
STR_NAME_EAU // 4: 漏水/水浸传感器
|
||||
};
|
||||
|
||||
// 紧随 sensor_list 之后存放的 1 字节界面语言设置在 Flash 扇区内的偏移地址
|
||||
#define LANGUAGE_FLASH_ADDR ((u16)sizeof(sensor_list))
|
||||
|
||||
/**
|
||||
* @brief 关闭 IAP 寄存器控制并清理地址
|
||||
* @details 每次 IAP 闪存操作后调用,确保安全,防止意外指针写入损坏 EEPROM 中的关键配置数据。
|
||||
@@ -87,7 +91,8 @@ void IAP_EraseSector(u16 addr)
|
||||
|
||||
/**
|
||||
* @brief 从 EEPROM 的扇区 254 中加载数据库
|
||||
* @details 逐字节读取 Flash 物理数据,并直接通过指针拷贝装入 RAM 中的全局 `sensor_list` 数组。
|
||||
* @details 逐字节读取 Flash 物理数据,并直接通过指针拷贝装入 RAM 中的全局 `sensor_list` 数组;
|
||||
* 随后读取紧随其后的 1 字节界面语言设置,恢复上次保存的语言选择。
|
||||
*/
|
||||
void Load_Database(void)
|
||||
{
|
||||
@@ -95,15 +100,20 @@ void Load_Database(void)
|
||||
u8 *ptr = (u8 *)&sensor_list; // 获取传感器 RAM 数组的首地址指针
|
||||
u16 size = sizeof(sensor_list); // 获取结构体数组的全部占用尺寸
|
||||
u16 i;
|
||||
u8 lang_byte;
|
||||
for (i = 0; i < size; i++) {
|
||||
ptr[i] = IAP_ReadByte(addr++); // 循环读取字节并还原到 RAM
|
||||
}
|
||||
|
||||
// 读取语言设置字节 (首次开机、从未保存过时 Flash 为擦除态 0xFF,Lang_Init 会自动回退为 LANG_FR)
|
||||
lang_byte = IAP_ReadByte(LANGUAGE_FLASH_ADDR);
|
||||
Lang_Init((Language)lang_byte);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 将 RAM 中的最新传感器列表数据持久化保存到 EEPROM
|
||||
* @details 因为 Flash 写操作不能把 0 写回 1,所以必须先调用 `IAP_EraseSector` 擦除整个扇区,
|
||||
* 接着遍历整个数据结构,逐字节写入最新的 RAM 内容。
|
||||
* 接着遍历整个数据结构,逐字节写入最新的 RAM 内容,最后追加写入当前界面语言设置字节。
|
||||
*/
|
||||
void Save_Database(void)
|
||||
{
|
||||
@@ -115,6 +125,9 @@ void Save_Database(void)
|
||||
for (i = 0; i < size; i++) {
|
||||
IAP_WriteByte(addr++, ptr[i]); // 循环写入字节数据
|
||||
}
|
||||
|
||||
// 紧随传感器数据之后追加写入当前界面语言设置
|
||||
IAP_WriteByte(LANGUAGE_FLASH_ADDR, (u8)Lang_Current());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,11 +168,14 @@ void Add_Sensor_With_Zone(u32 addr, u8 type, u8 zone)
|
||||
sensor_list[slot_to_use].type = type; // 记录传感器硬件类型
|
||||
sensor_list[slot_to_use].zone = zone; // 记录对应的防区号
|
||||
|
||||
// 生成该槽位传感器的法语名称
|
||||
for (i = 0; i < 15; i++) {
|
||||
// 从默认名称常量数组中复制对应名字的字符
|
||||
sensor_list[slot_to_use].name_gbk[i] = sensor_names_fr[type][i];
|
||||
if (sensor_names_fr[type][i] == '\0') break; // 遇零终止
|
||||
// 生成该槽位传感器的名称 (取当前界面语言下的简称)
|
||||
{
|
||||
const char *type_name = Lang_Get(sensor_type_name_ids[type]);
|
||||
for (i = 0; i < 15; i++) {
|
||||
// 从当前语言名称字符串中复制对应名字的字符
|
||||
sensor_list[slot_to_use].name_gbk[i] = type_name[i];
|
||||
if (type_name[i] == '\0') break; // 遇零终止
|
||||
}
|
||||
}
|
||||
sensor_list[slot_to_use].name_gbk[15] = '\0'; // 尾部安全截断,防止字符越界
|
||||
|
||||
|
||||
Reference in New Issue
Block a user