141 lines
3.2 KiB
C
141 lines
3.2 KiB
C
|
|
#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;
|
||
|
|
}
|