#include "database.h" #define IAP_CMD_READ 1 #define IAP_CMD_WRITE 2 #define IAP_CMD_ERASE 3 // 定义全局常量数组 char *code sensor_names_fr[5] = { "PORTE", "PIR", "FUMEE", "GAZ", "EAU" }; void IAP_Disable(void) { IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0xff; IAP_ADDRL = 0xff; } u8 IAP_ReadByte(u16 addr) { IAP_CONTR = 0x80; IAP_TPS = (u8)(MAIN_Fosc / 1000000UL); IAP_CMD = IAP_CMD_READ; IAP_ADDRL = (u8)addr; IAP_ADDRH = (u8)(addr >> 8); IAP_ADDRE = 0; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); _nop_(); _nop_(); _nop_(); IAP_Disable(); return IAP_DATA; } void IAP_WriteByte(u16 addr, u8 dat) { IAP_CONTR = 0x80; IAP_TPS = (u8)(MAIN_Fosc / 1000000UL); IAP_CMD = IAP_CMD_WRITE; IAP_ADDRL = (u8)addr; IAP_ADDRH = (u8)(addr >> 8); IAP_ADDRE = 0; IAP_DATA = dat; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); _nop_(); _nop_(); _nop_(); IAP_Disable(); } void IAP_EraseSector(u16 addr) { IAP_CONTR = 0x80; IAP_TPS = (u8)(MAIN_Fosc / 1000000UL); IAP_CMD = IAP_CMD_ERASE; IAP_ADDRL = (u8)addr; IAP_ADDRH = (u8)(addr >> 8); IAP_ADDRE = 0; IAP_TRIG = 0x5a; IAP_TRIG = 0xa5; _nop_(); _nop_(); _nop_(); _nop_(); IAP_Disable(); } void Load_Database(void) { u16 addr = 0; u8 *ptr = (u8 *)&sensor_list; u16 size = sizeof(sensor_list); u16 i; for (i = 0; i < size; i++) { ptr[i] = IAP_ReadByte(addr++); } } void Save_Database(void) { u16 addr = 0; u8 *ptr = (u8 *)&sensor_list; u16 size = sizeof(sensor_list); u16 i; IAP_EraseSector(0); for (i = 0; i < size; i++) { IAP_WriteByte(addr++, ptr[i]); } } void Add_Sensor_With_Zone(u32 addr, u8 type, u8 zone) { u8 i; u8 slot_to_use = 15; for (i = 0; i < 16; i++) { if (sensor_list[i].is_used == 0x01) { u32 existing_addr = ((u32)sensor_list[i].addr[0] << 16) | ((u32)sensor_list[i].addr[1] << 8) | sensor_list[i].addr[2]; if (existing_addr == addr) { slot_to_use = i; break; } } else { slot_to_use = i; break; } } sensor_list[slot_to_use].is_used = 0x01; sensor_list[slot_to_use].addr[0] = (u8)(addr >> 16); sensor_list[slot_to_use].addr[1] = (u8)(addr >> 8); sensor_list[slot_to_use].addr[2] = (u8)addr; 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; } sensor_list[slot_to_use].name_gbk[15] = '\0'; Save_Database(); } bit Check_Sensor_ID(u32 addr, u8 *out_slot_index) { u8 i; for (i = 0; i < 16; i++) { if (sensor_list[i].is_used == 0x01) { u32 slot_addr = ((u32)sensor_list[i].addr[0] << 16) | ((u32)sensor_list[i].addr[1] << 8) | sensor_list[i].addr[2]; if (slot_addr == addr) { *out_slot_index = i; return 1; } } } return 0; }