update modbus

This commit is contained in:
2026-02-09 17:55:33 +08:00
parent 270141591e
commit fb4e311fbe
22 changed files with 4279 additions and 2075 deletions

View File

@@ -8,7 +8,10 @@
#include "bsp_Led.h"
#include "bsp_74HC4067.h"
#include "bsp_Flash.h"
#include "bsp_W5500.h"
#include "bsp_w25q.h"
#include "bsp_DS1302.h"
#include "app_leakage.h"
#include "proto_modbus_master_tdlas.h"
#include "proto_modbus_slave_ex.h"
@@ -60,7 +63,10 @@ void app_init(void)
UartCH_Config.init();
app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); /*<2A><>ʱ<EFBFBD><CAB1><EFBFBD>ã<EFBFBD>ʱ<EFBFBD><CAB1>Ƭ<EFBFBD><C6AC>ѯ*/
W5500.Init();
tjc_hmi.init();
DS1302.Init();
tdlas.init();
led.init();
//Wdg.Init();
@@ -77,6 +83,7 @@ void app_task(void)
{
app_timer.task();
task_idle();
W5500.Task();
}
/*<2A><><EFBFBD><EFBFBD>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD>*/
void task_idle(void)
@@ -108,12 +115,14 @@ void task_200ms(void)
void task_500ms(void)
{
led.task();
tdlas.tx_task();
}
void task_1s(void)
{
p_leakage->task();
DS1302.Task();
}
void task_2s(void)

View File

@@ -1,17 +1,31 @@
#include "app_leakage.h"
#include <string.h>
#include "bsp_w25q.h"
static void history_clear_all(void);
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record);
static void history_init(void);
static void history_save_metadata(void);
app_leakage_t leakage =
{
.region_num = 0,
.sub_device_num = 0,
.init = NULL,
.task = app_leakage_task
};
app_leakage_t *p_leakage = &leakage;
app_hitory_t history =
{
.read_history = history_read_record,
.clean_history = history_clear_all,
.init_history = history_init
};
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A3AC>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ֵ<EFBFBD>һ<EFBFBD><D2BB>*/
static void app_leakage_region_classify(void)
void app_leakage_region_classify(void)
{
u16 i,j;
u8 add_region_flag;
@@ -36,7 +50,7 @@ static void app_leakage_region_classify(void)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸*/
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
p_leakage->region_data[j].leakage_num++; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>++*/
p_leakage->region_data[j].sub_device_num++; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>++*/
add_region_flag = 0;/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
break;
}
@@ -48,7 +62,7 @@ static void app_leakage_region_classify(void)
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN);
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
p_leakage->region_data[p_leakage->region_num].leakage_num++; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>++*/
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>++*/
p_leakage->region_num++; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>++*/
}
}
@@ -58,43 +72,285 @@ static void app_leakage_region_classify(void)
/*<2A>쳣״̬<D7B4><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>*/
void app_leakage_task(void)
{
u16 i,j,k,sub_device_index;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for(i=0;i<p_leakage->region_num;i++)
static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0};
u16 i, j, k, sub_device_index;
static u8 initialized = 0;
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʷģ<CAB7><C4A3> */
if(!initialized)
{
history.init_history();
initialized = 1;
}
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣ͳ<ECB3A3><CDB3> */
for(i = 0; i < p_leakage->region_num; i++)
{
/*<2A><><EFBFBD><EFBFBD><EFBFBD>豸*/
p_leakage->region_data[i].leakage_num = 0;
p_leakage->region_data[i].open_num = 0;
p_leakage->region_data[i].time_out_num = 0;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸*/
for(j=0;j<p_leakage->region_data[i].leakage_num;j++)
}
/* <20><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E4BBAF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD> */
for(i = 0; i < p_leakage->region_num; i++)
{
for(j = 0; j < p_leakage->region_data[i].sub_device_num; j++)
{
/*<2A><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>*/
sub_device_index = p_leakage->region_data[i].sub_device_index[j];
/*<2A><><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>*/
for(k=0;k<APP_LEAKAGE_SUB_DEVICE_CH_NUM;k++)
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(p_leakage->sub_device_data[sub_device_index].flash_data.state != ENABLE)
{
/*ͨѶ<CDA8><D1B6>ʱ*/
if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
continue;
}
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
u16 prev_state = prev_ch_state[sub_device_index][k];
u16 leak_distance = p_leakage->sub_device_data[sub_device_index].ch_data[k].distance;
/* <20><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E4BBAF><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE))
{
p_leakage->region_data[i].time_out_num++;
break;
/* ©Һ<C2A9><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ - <20><>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */
history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE, leak_distance);
}
/*<2A>ϴ<EFBFBD>*/
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN))
{
p_leakage->region_data[i].open_num++;
break;
/* <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ - <20><>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */
history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_OPEN, 0);
}
/*©Һ*/
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT))
{
p_leakage->region_data[i].leakage_num++;
break;
}
/* ͨѶ<CDA8><D1B6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ - <20><>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */
history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT, 0);
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ״̬ */
prev_ch_state[sub_device_index][k] = current_state;
}
/* ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> - <20><><EFBFBD>豸ͳ<E8B1B8><CDB3> */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
p_leakage->region_data[i].time_out_num++;
continue; /* ͨѶ<CDA8><D1B6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣 */
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
p_leakage->region_data[i].open_num++;
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
p_leakage->region_data[i].leakage_num++;
}
}
}
}
}
}
/* <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1> */
static void get_current_time(u8 *time_buffer)
{
// RTC_TimeTypeDef sTime;
// RTC_DateTypeDef sDate;
//
// /* <20><>ȡRTCʱ<43><CAB1> */
// HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
//
// /* <20><>: 2<>ֽ<EFBFBD> (<28><><EFBFBD><EFBFBD>: 2024 -> 0x07 0xE8) */
// uint16_t year = 2000 + sDate.Year; /* RTC<54><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>2000<30><30>ʼ */
// time_buffer[0] = (year >> 8) & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */
// time_buffer[1] = year & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */
// time_buffer[2] = sDate.Month; /* <20><> */
// time_buffer[3] = sDate.Date; /* <20><> */
// time_buffer[4] = sTime.Hours; /* ʱ */
// time_buffer[5] = sTime.Minutes; /* <20><> */
}
/* <20><>Flash<73><68>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
static void history_read_metadata(void)
{
app_leakage_history_metadata_t temp_metadata;
w25q32.read(W25Q32_HISTORY_ALARM_METADATA_ADDR,
(uint8_t*)&temp_metadata,
sizeof(app_leakage_history_metadata_t));
if(temp_metadata.total_records <= temp_metadata.max_records &&
temp_metadata.write_index < temp_metadata.max_records)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD> */
memcpy(&leakage.history_metadata, &temp_metadata, sizeof(app_leakage_history_metadata_t));
}
else
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t));
leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS;
/* <20><><EFBFBD>浽Flash */
history_save_metadata();
}
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݵ<EFBFBD>Flash */
static void history_save_metadata(void)
{
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
w25q32_sector_erase(W25Q32_HISTORY_ALARM_METADATA_ADDR);
/* д<><D0B4>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
w25q32.write(W25Q32_HISTORY_ALARM_METADATA_ADDR,
(uint8_t*)&leakage.history_metadata,
sizeof(app_leakage_history_metadata_t));
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>Flash<73>еĵ<D0B5>ַ */
static uint32_t history_calc_record_addr(u32 record_index)
{
return W25Q32_HISTORY_ALARM_DATA_ADDR +
(record_index * HISTORY_ALARM_RECORD_SIZE);
}
/* <20><>ȡ<EFBFBD><C8A1>¼<EFBFBD><C2BC><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
static uint32_t history_calc_sector_addr(u32 record_index)
{
uint32_t record_addr = history_calc_record_addr(record_index);
return record_addr & ~(W25Q32_SECTOR_SIZE - 1); /* 4K<34><4B><EFBFBD><EFBFBD> */
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alarm_type, u16 leak_distance)
{
app_leakage_history_alarm_t new_alarm;
uint32_t write_addr;
/* <20><><EFBFBD><EFBFBD><E4B1A8><EFBFBD><EFBFBD>¼ */
memset(&new_alarm, 0, sizeof(app_leakage_history_alarm_t));
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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)
{
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.channel = channel;
new_alarm.leak_distance = leak_distance;
/* <20><>ʼʱ<CABC><CAB1> */
get_current_time(new_alarm.start_time);
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ */
write_addr = history_calc_record_addr(leakage.history_metadata.write_index);
/* <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><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><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD> */
if(current_sector != prev_sector)
{
w25q32_sector_erase(current_sector);
}
/* д<><D0B4><EFBFBD><EFBFBD>¼ */
w25q32.write(write_addr, (uint8_t*)&new_alarm, HISTORY_ALARM_RECORD_SIZE);
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
leakage.history_metadata.write_index++;
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)
{
leakage.history_metadata.total_records++;
}
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
history_save_metadata();
}
/* <20><>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record)
{
if(record_index >= leakage.history_metadata.total_records)
{
return 0; /* <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч */
}
/* <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;
}
else
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӷ<EFBFBD>ȡ */
actual_index = record_index;
}
uint32_t read_addr = history_calc_record_addr(actual_index);
w25q32.read(read_addr, (uint8_t*)record, HISTORY_ALARM_RECORD_SIZE);
return 1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
static void history_clear_all(void)
{
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t));
leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS;
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
history_save_metadata();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> */
for(uint32_t i = 0; i < HISTORY_ALARM_SECTORS_NEEDED; i++)
{
uint32_t sector_addr = W25Q32_HISTORY_ALARM_DATA_ADDR + i * W25Q32_SECTOR_SIZE;
w25q32_sector_erase(sector_addr);
}
}
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> */
static void history_init(void)
{
/* <20><>ȡԪ<C8A1><D4AA><EFBFBD><EFBFBD> */
history_read_metadata();
}

View File

@@ -14,6 +14,11 @@
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
void app_leakage_task(void);
void app_leakage_region_classify(void);
void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alarm_type, u16 leak_distance);
/*<2A><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>*/
typedef struct
{
@@ -33,6 +38,8 @@ typedef struct
u16 state; /*״̬*/
u16 distance; /*©Һ<C2A9><D2BA><EFBFBD><EFBFBD>*/
}ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
u8 heartbeat; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-59ѭ<39><D1AD>*/
u8 test_mode; /*<2A><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>0=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1-4=<3D><><EFBFBD>Զ<EFBFBD>Ӧͨ<D3A6><CDA8>*/
}app_leakage_sub_device_class_t;
@@ -47,6 +54,27 @@ typedef struct
u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*<2A><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
}app_leakage_region_data_class_t;
/* <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ṹ */
typedef struct
{
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
u8 device_id; /* <20>豸ID */
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /* <20><EFBFBD><E8B1B8><EFBFBD><EFBFBD> */
u16 alarm_type; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
u8 start_time[6]; /* <20><>ʼʱ<CABC><CAB1>: <20><>(2<>ֽ<EFBFBD>)<29><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
u16 leak_distance; /* ©Һ<C2A9><D2BA><EFBFBD><EFBFBD> (0<><30>ʾ<EFBFBD><CABE>©Һ<C2A9><D2BA><EFBFBD><EFBFBD>) */
u8 channel; /* ͨ<><CDA8><EFBFBD><EFBFBD> (0-3) */
} app_leakage_history_alarm_t;
/* <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ */
typedef struct
{
u32 total_records; /* <20>ܼ<EFBFBD>¼<EFBFBD><C2BC> */
u32 write_index; /* дָ<D0B4><D6B8> */
u32 read_index; /* <20><>ָ<EFBFBD><D6B8> */
u32 max_records; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC> */
} app_leakage_history_metadata_t;
typedef struct
{
u8 region_num;
@@ -54,9 +82,20 @@ typedef struct
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_history_metadata_t history_metadata;
void (*init)(void); /*<2A><>ʼ<EFBFBD><CABC>*/
void (*task)(void); /*ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
}app_leakage_t;
typedef struct
{
u8 (*read_history)(u32, app_leakage_history_alarm_t *);
void (*clean_history)(void);
void (*init_history)(void);
}app_hitory_t;
extern app_leakage_t leakage;
#endif
extern app_leakage_t *p_leakage;
extern app_hitory_t history;
#endif