update:V1.3

1.修复实时报警索引错误
2.修复历史报警消息跨扇区显示错误
3.修复历史报警满一千条后会误擦除其他有效数据
4.修复TCP写入解析错误
This commit is contained in:
2026-05-19 15:29:07 +08:00
parent a736476c17
commit 786b29bb85
10 changed files with 260 additions and 89 deletions

View File

@@ -73,8 +73,6 @@ void app_init(void)
/*<2A><><EFBFBD><EFBFBD>*/
W5500.Init();
/*<2A><>ĻͨѶ*/
tjc_hmi.init();

View File

@@ -13,6 +13,10 @@ static void history_save_metadata(void);
static void app_leakage_init(void);
/*<2A><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
uint8_t sector_buf[2][W25Q32_SECTOR_SIZE];
app_leakage_t leakage =
{
.region_num = 0,
@@ -316,22 +320,20 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
memset(&new_alarm, 0, sizeof(app_leakage_history_alarm_t));
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(region_idx < leakage.region_num)
{
if (region_idx < leakage.region_num) {
memcpy(new_alarm.region_name, leakage.region_data[region_idx].name,
APP_LEAKAGE_STRING_NANE_LEN);
}
/* <20>豸ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(device_idx < APP_LEAKAGE_SUB_DEVICE_NUM)
{
if (device_idx < APP_LEAKAGE_SUB_DEVICE_NUM) {
new_alarm.device_id = leakage.sub_device_data[device_idx].flash_data.modbus_id;
memcpy(new_alarm.device_name, leakage.sub_device_data[device_idx].flash_data.device_name,
APP_LEAKAGE_STRING_NANE_LEN);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>©Һ<C2A9><D2BA><EFBFBD><EFBFBD> */
new_alarm.alarm_type = alarm_type;
new_alarm.alarm_type = alarm_type;
new_alarm.channel = channel;
new_alarm.leak_distance = leak_distance;
@@ -341,35 +343,49 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ */
write_addr = history_calc_record_addr(leakage.history_metadata.write_index);
/* <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint32_t current_sector = history_calc_sector_addr(leakage.history_metadata.write_index);
uint32_t prev_sector = history_calc_sector_addr(
(leakage.history_metadata.write_index == 0) ?
leakage.history_metadata.max_records - 1 :
leakage.history_metadata.write_index - 1);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD>Խ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint32_t start_sector = write_addr & ~(W25Q32_SECTOR_SIZE - 1);
uint32_t end_addr = write_addr + HISTORY_ALARM_RECORD_SIZE - 1;
uint32_t end_sector = end_addr & ~(W25Q32_SECTOR_SIZE - 1);
uint32_t num_sectors = (end_sector - start_sector) / W25Q32_SECTOR_SIZE + 1;
/* <20><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(current_sector != prev_sector)
{
w25q32_sector_erase(current_sector);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4KB */
uint32_t sectors[2] = {start_sector, (num_sectors > 1) ? end_sector : 0};
/* 1. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BCB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RAM */
for (uint32_t i = 0; i < num_sectors; i++) {
w25q32.read(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE);
}
/* д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
w25q32.write(write_addr, (uint8_t*)&new_alarm, HISTORY_ALARM_RECORD_SIZE);
/* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD> */
for (uint32_t i = 0; i < num_sectors; i++) {
w25q32_sector_erase(sectors[i]);
}
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 3. <20><>RAM<41>и<EFBFBD><D0B8><EFBFBD><EFBFBD>¼<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint32_t offset_in_start = write_addr - start_sector;
uint32_t first_part_len = (num_sectors == 1) ? HISTORY_ALARM_RECORD_SIZE : (W25Q32_SECTOR_SIZE - offset_in_start);
memcpy(sector_buf[0] + offset_in_start, &new_alarm, first_part_len);
if (num_sectors > 1) {
uint32_t second_part_len = HISTORY_ALARM_RECORD_SIZE - first_part_len;
memcpy(sector_buf[1], (uint8_t*)&new_alarm + first_part_len, second_part_len);
}
/* 4. <20><><EFBFBD>޸ĺ<DEB8><C4BA>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Flash */
for (uint32_t i = 0; i < num_sectors; i++) {
w25q32.write(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE);
}
/* 5. <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>У<EFBFBD> */
leakage.history_metadata.write_index++;
if(leakage.history_metadata.write_index >= leakage.history_metadata.max_records)
{
if (leakage.history_metadata.write_index >= leakage.history_metadata.max_records) {
leakage.history_metadata.write_index = 0;
}
if(leakage.history_metadata.total_records < leakage.history_metadata.max_records)
{
if (leakage.history_metadata.total_records < leakage.history_metadata.max_records) {
leakage.history_metadata.total_records++;
}
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݵ<EFBFBD>Flash */
history_save_metadata();
}
@@ -383,21 +399,24 @@ static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *rec
/* <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʴ洢<CAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD> */
uint32_t actual_index;
if(leakage.history_metadata.total_records == leakage.history_metadata.max_records)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
actual_index = (leakage.history_metadata.write_index + record_index) %
leakage.history_metadata.max_records;
if(leakage.history_metadata.total_records == leakage.history_metadata.max_records) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>write_index ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>¼
actual_index = (leakage.history_metadata.write_index - 1 - record_index
+ leakage.history_metadata.max_records) % leakage.history_metadata.max_records;
} else {
// δ<><CEB4><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <20><><EFBFBD><EFBFBD><E7A3AC><EFBFBD><EFBFBD> total_records-1 <20><><EFBFBD><EFBFBD>
actual_index = leakage.history_metadata.total_records - 1 - record_index;
}
else
if(actual_index == 125)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӷ<EFBFBD>ȡ */
actual_index = record_index;
actual_index =125;
}
uint32_t read_addr = history_calc_record_addr(actual_index);
w25q32.read(read_addr, (uint8_t*)record, HISTORY_ALARM_RECORD_SIZE);
return 1;
}

View File

@@ -70,7 +70,7 @@ typedef struct {
}network_config_t;
/* <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ṹ */
typedef struct
typedef struct __attribute__((packed))
{
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
u8 device_id; /* <20>豸ID */