update:main V0.005.0、hmi V1.4

main
1、MODBUS_TCP增加3个port口,总计4个port口供主机读取数据;
2、修复历史报警记录靠前条数不是最新的报警信息BUG;
3、修复MODBUS_TCP写寄存器时解析数据的异常BUG;

hmi
1、MODBUS_TCP设置界面增加3个port口,总计4个port口进行设置;
This commit is contained in:
2026-06-05 17:48:48 +08:00
parent 786b29bb85
commit 118727b491
15 changed files with 3980 additions and 5461 deletions

View File

@@ -11,11 +11,5 @@
#define RTE_COMPONENTS_H #define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "stm32f4xx.h"
#endif /* RTE_COMPONENTS_H */ #endif /* RTE_COMPONENTS_H */

File diff suppressed because one or more lines are too long

View File

@@ -132,11 +132,6 @@
<Key>ARMDBGFLAGS</Key> <Key>ARMDBGFLAGS</Key>
<Name></Name> <Name></Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name>d</Name>
</SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>JL2CM3</Key> <Key>JL2CM3</Key>
@@ -148,24 +143,7 @@
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name> <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
</SetRegEntry> </SetRegEntry>
</TargetDriverDllRegistry> </TargetDriverDllRegistry>
<Breakpoint> <Breakpoint/>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>71</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134256418</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>D:\code\Git\Leakage-Control(鏈€鏂扮増)\Leakage-Control\leakage_system\usr\app\app.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\leakage_system\../usr/app/app.c\71</Expression>
</Bp>
</Breakpoint>
<WatchWindow1> <WatchWindow1>
<Ww> <Ww>
<count>0</count> <count>0</count>
@@ -257,6 +235,11 @@
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>W5500,0x0A</ItemText> <ItemText>W5500,0x0A</ItemText>
</Ww> </Ww>
<Ww>
<count>18</count>
<WinNumber>1</WinNumber>
<ItemText>W5500,0x0A</ItemText>
</Ww>
</WatchWindow1> </WatchWindow1>
<Tracepoint> <Tracepoint>
<THDelay>0</THDelay> <THDelay>0</THDelay>

View File

@@ -10,14 +10,14 @@
<TargetName>leakage_system</TargetName> <TargetName>leakage_system</TargetName>
<ToolsetNumber>0x4</ToolsetNumber> <ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName> <ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed> <pCCUsed>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
<uAC6>0</uAC6> <uAC6>0</uAC6>
<TargetOption> <TargetOption>
<TargetCommonOption> <TargetCommonOption>
<Device>STM32F407VGTx</Device> <Device>STM32F407VGTx</Device>
<Vendor>STMicroelectronics</Vendor> <Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.15.0</PackID> <PackID>Keil.STM32F4xx_DFP.3.0.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL> <PackURL>https://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu> <Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec> <FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile> <StartupFile></StartupFile>
@@ -185,6 +185,7 @@
<uocXRam>0</uocXRam> <uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP> <RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>1</hadIRAM2> <hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>
@@ -351,7 +352,7 @@
<NoWarn>0</NoWarn> <NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc> <uSurpInc>0</uSurpInc>
<useXO>0</useXO> <useXO>0</useXO>
<uClangAs>0</uClangAs> <ClangAsOpt>4</ClangAsOpt>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define></Define> <Define></Define>

View File

@@ -23,7 +23,7 @@
#include "gui_tjc_hmi.h" #include "gui_tjc_hmi.h"
const char *HwVersion = "V2.0"; const char *HwVersion = "V2.0";
char SwVersion[24] = "V0.004.0"; char SwVersion[24] = "V0.005.0";
void task_idle(void); void task_idle(void);
void task_10ms(void); void task_10ms(void);
void task_50ms(void); void task_50ms(void);
@@ -60,7 +60,7 @@ void app_init(void)
Wdg.Init(); Wdg.Init();
/*flash*/ /*flash*/
w25q32.init(); w25q32.init();
Wdg.Feed();
// HAL_Delay(5000); // HAL_Delay(5000);
/*<2A><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>*/ /*<2A><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>*/
@@ -69,10 +69,10 @@ void app_init(void)
com_uart3.init(&com_uart3); com_uart3.init(&com_uart3);
com_uart4.init(&com_uart4); com_uart4.init(&com_uart4);
com_uart6.init(&com_uart6); com_uart6.init(&com_uart6);
Wdg.Feed();
/*<2A><><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD>*/
W5500.Init(); W5500.Init();
Wdg.Feed();
/*<2A><>ĻͨѶ*/ /*<2A><>ĻͨѶ*/
tjc_hmi.init(); tjc_hmi.init();

View File

@@ -16,129 +16,124 @@ static void app_leakage_init(void);
/*<2A><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
uint8_t sector_buf[2][W25Q32_SECTOR_SIZE]; uint8_t sector_buf[2][W25Q32_SECTOR_SIZE];
app_leakage_t leakage =
app_leakage_t leakage = {
{ .region_num = 0,
.region_num = 0, .sub_device_num = 0,
.sub_device_num = 0, .init = app_leakage_init,
.init = app_leakage_init, .task = app_leakage_task,
.task = app_leakage_task, .class_update = app_leakage_region_classify,
.class_update = app_leakage_region_classify,
}; };
app_leakage_t *p_leakage = &leakage; app_leakage_t *p_leakage = &leakage;
app_hitory_t history = app_hitory_t history =
{ {
.read_history = history_read_record, .read_history = history_read_record,
.clean_history = history_clear_all, .clean_history = history_clear_all,
.init_history = history_init .init_history = history_init};
};
static void app_leakage_init(void) static void app_leakage_init(void)
{ {
// for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++) // for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
// { // {
// memset(leakage.sub_device_data[i].ch_data, 0, // memset(leakage.sub_device_data[i].ch_data, 0,
// sizeof(leakage.sub_device_data[i].ch_data)); // sizeof(leakage.sub_device_data[i].ch_data));
// } // }
app_leakage_region_classify(); app_leakage_region_classify();
} }
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A3AC>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ֵ<EFBFBD>һ<EFBFBD><D2BB>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A3AC>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD>ֵ<EFBFBD>һ<EFBFBD><D2BB>*/
void app_leakage_region_classify(void) void app_leakage_region_classify(void)
{ {
u16 i,j; u16 i, j;
u8 add_region_flag; u8 add_region_flag;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
p_leakage->region_num = 0; p_leakage->region_num = 0;
p_leakage->sub_device_num = 0; p_leakage->sub_device_num = 0;
memset(p_leakage->region_data,0,sizeof(p_leakage->region_data)); memset(p_leakage->region_data, 0, sizeof(p_leakage->region_data));
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ*/
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++) for (i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{ {
add_region_flag = 1; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ add_region_flag = 1; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/*<2A>ʹ<E8B1B8><CAB9>*/ /*<2A>ʹ<E8B1B8><CAB9>*/
if(ENABLE == p_leakage->sub_device_data[i].flash_data.state) if (ENABLE == p_leakage->sub_device_data[i].flash_data.state)
{ {
p_leakage->sub_device_num++;/*<2A><>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>++*/ p_leakage->sub_device_num++; /*<2A><>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>++*/
/********************************************<2A><><EFBFBD>򻮷<EFBFBD>******************************************************/ /********************************************<2A><><EFBFBD>򻮷<EFBFBD>******************************************************/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for(j=0;j<APP_LEAKAGE_SUB_DEVICE_NUM;j++) for (j = 0; j < APP_LEAKAGE_SUB_DEVICE_NUM; j++)
{ {
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ*/ if (0 == memcmp(p_leakage->region_data[j].name, p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN)) /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ*/
{ {
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸*/
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].sub_device_num] = i;/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/ p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].sub_device_num] = i; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
p_leakage->region_data[j].sub_device_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>*/ add_region_flag = 0; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
break; break;
} }
} }
/*û<><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>*/ /*û<><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>*/
if(add_region_flag)/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ if (add_region_flag) /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
{ {
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
memcpy(p_leakage->region_data[p_leakage->region_num].name, memcpy(p_leakage->region_data[p_leakage->region_num].name,
p_leakage->sub_device_data[i].flash_data.region_name, p_leakage->sub_device_data[i].flash_data.region_name,
APP_LEAKAGE_STRING_NANE_LEN); APP_LEAKAGE_STRING_NANE_LEN);
// <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ϊ0 // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>Ϊ0
p_leakage->region_data[p_leakage->region_num].sub_device_index[0] = i; p_leakage->region_data[p_leakage->region_num].sub_device_index[0] = i;
p_leakage->region_data[p_leakage->region_num].sub_device_num = 1; p_leakage->region_data[p_leakage->region_num].sub_device_num = 1;
p_leakage->region_num++; p_leakage->region_num++;
} }
} }
} }
} }
/*<2A><><EFBFBD><EFBFBD> <20><> <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD> <20><> <20><> <20>̵<EFBFBD><CCB5><EFBFBD> <20><><EFBFBD><EFBFBD>*/
static void app_leakage_alarm_contorl(void) static void app_leakage_alarm_contorl(void)
{ {
if(0 != p_leakage->alarm_state) if (0 != p_leakage->alarm_state)
{ {
buzzer.set.on(); buzzer.set.on();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_ON); relay.set(BSP_RELAY_CH_ERROR_STATE, USR_ON);
} }
else else
{ {
buzzer.set.off(); buzzer.set.off();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_OFF); relay.set(BSP_RELAY_CH_ERROR_STATE, USR_OFF);
} }
/*©Һ״̬*/ /*©Һ״̬*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) if (p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{ {
relay.set(BSP_RELAY_CH_LEAKAGE,USR_ON); relay.set(BSP_RELAY_CH_LEAKAGE, USR_ON);
} }
else else
{ {
relay.set(BSP_RELAY_CH_LEAKAGE,USR_OFF); relay.set(BSP_RELAY_CH_LEAKAGE, USR_OFF);
} }
/*<2A>ϴ<EFBFBD>״̬*/ /*<2A>ϴ<EFBFBD>״̬*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) if (p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{ {
relay.set(BSP_RELAY_CH_OPEN,USR_ON); relay.set(BSP_RELAY_CH_OPEN, USR_ON);
} }
else else
{ {
relay.set(BSP_RELAY_CH_OPEN,USR_OFF); relay.set(BSP_RELAY_CH_OPEN, USR_OFF);
} }
/*ͨѶ<CDA8><D1B6>ʱ*/ /*ͨѶ<CDA8><D1B6>ʱ*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) if (p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{ {
relay.set(BSP_RELAY_CH_COMMINCAION,USR_ON); relay.set(BSP_RELAY_CH_COMMINCAION, USR_ON);
} }
else else
{ {
relay.set(BSP_RELAY_CH_COMMINCAION,USR_OFF); relay.set(BSP_RELAY_CH_COMMINCAION, USR_OFF);
} }
} }
/*<2A>쳣״̬<D7B4><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>*/ /*<2A>쳣״̬<D7B4><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>*/
void app_leakage_task(void) void app_leakage_task(void)
{ {
@@ -146,7 +141,7 @@ void app_leakage_task(void)
u16 i, j, k, sub_device_index; u16 i, j, k, sub_device_index;
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣ͳ<ECB3A3><CDB3> */ /* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣ͳ<ECB3A3><CDB3> */
for(i = 0; i < p_leakage->region_num; i++) for (i = 0; i < p_leakage->region_num; i++)
{ {
p_leakage->region_data[i].leakage_num = 0; p_leakage->region_data[i].leakage_num = 0;
p_leakage->region_data[i].open_num = 0; p_leakage->region_data[i].open_num = 0;
@@ -154,52 +149,50 @@ void app_leakage_task(void)
} }
p_leakage->alarm_state = 0; p_leakage->alarm_state = 0;
/* <20><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E4BBAF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E4BBAF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD> */
for(i = 0; i < p_leakage->region_num; i++) for (i = 0; i < p_leakage->region_num; i++)
{ {
for(j = 0; j < p_leakage->region_data[i].sub_device_num; j++) for (j = 0; j < p_leakage->region_data[i].sub_device_num; j++)
{ {
sub_device_index = p_leakage->region_data[i].sub_device_index[j]; sub_device_index = p_leakage->region_data[i].sub_device_index[j];
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */
if(p_leakage->sub_device_data[sub_device_index].flash_data.state != ENABLE) if (p_leakage->sub_device_data[sub_device_index].flash_data.state != ENABLE)
{ {
continue; continue;
} }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> */
if(p_leakage->sub_device_data[sub_device_index].shield != UNBLOCKED) if (p_leakage->sub_device_data[sub_device_index].shield != UNBLOCKED)
{ {
continue; continue;
} }
/*<2A><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD>洢*/ /*<2A><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD>洢*/
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM; k++) for (k = 0; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM; k++)
{ {
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state; 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 prev_state = prev_ch_state[sub_device_index][k];
u16 leak_distance = p_leakage->sub_device_data[sub_device_index].ch_data[k].distance; 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> */ /* <20><><EFBFBD><EFBFBD>״̬<D7B4><EFBFBD><E4BBAF><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) && if ((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)) !(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE))
{ {
/* ©Һ<C2A9><D2BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ - <20><>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */ /* ©Һ<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); history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE, leak_distance);
} }
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) && if ((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)) !(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN))
{ {
/* <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ - <20><>¼<EFBFBD><C2BC>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD> */ /* <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); history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_OPEN, 0);
} }
if ((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT))
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) &&
!(prev_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT))
{ {
if( k > 0 && (p_leakage->sub_device_data[sub_device_index].ch_data[0].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)) if (k > 0 && (p_leakage->sub_device_data[sub_device_index].ch_data[0].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT))
{ {
/*<2A><>һ<EFBFBD><D2BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʣ<EFBFBD><CAA3>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/ /*<2A><>һ<EFBFBD><D2BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʣ<EFBFBD><CAA3>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
} }
@@ -209,34 +202,33 @@ void app_leakage_task(void)
history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT, 0); history_add_alarm_record(i, sub_device_index, k, APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT, 0);
} }
} }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ״̬ */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ״̬ */
prev_ch_state[sub_device_index][k] = current_state; prev_ch_state[sub_device_index][k] = current_state;
} }
/* ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> - <20><><EFBFBD>豸ͳ<E8B1B8><CDB3> */ /* ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD> - <20><><EFBFBD>豸ͳ<E8B1B8><CDB3> */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM; k++) for (k = 0; k < APP_LEAKAGE_SUB_DEVICE_USE_CH_NUM; k++)
{ {
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state; 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) if (current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{ {
p_leakage->region_data[i].time_out_num++; p_leakage->region_data[i].time_out_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT; p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT;
break; break;
} }
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) else if (current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{ {
p_leakage->region_data[i].open_num++; p_leakage->region_data[i].open_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN; p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
} }
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) else if (current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{ {
p_leakage->region_data[i].leakage_num++; p_leakage->region_data[i].leakage_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE; p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
} }
} }
} }
} }
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2B1A8>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2B1A8>*/
@@ -246,29 +238,28 @@ void app_leakage_task(void)
/* <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1> */ /* <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1> */
static void get_current_time(u8 *time_buffer) static void get_current_time(u8 *time_buffer)
{ {
/* <20><>: 2<>ֽ<EFBFBD> (<28><><EFBFBD><EFBFBD>: 2024 -> 0x07 0xE8) */ /* <20><>: 2<>ֽ<EFBFBD> (<28><><EFBFBD><EFBFBD>: 2024 -> 0x07 0xE8) */
uint16_t year = 2000 + DS1302.Time.Year; /* RTC<54><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>2000<30><30>ʼ */ uint16_t year = 2000 + DS1302.Time.Year; /* RTC<54><43><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>2000<30><30>ʼ */
time_buffer[0] = (year >> 8) & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */ time_buffer[0] = (year >> 8) & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */
time_buffer[1] = year & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */ time_buffer[1] = year & 0xFF; /* <20><><EFBFBD>ֽ<EFBFBD> */
time_buffer[2] = DS1302.Time.Month; /* <20><> */ time_buffer[2] = DS1302.Time.Month; /* <20><> */
time_buffer[3] = DS1302.Time.Day; /* <20><> */ time_buffer[3] = DS1302.Time.Day; /* <20><> */
time_buffer[4] = DS1302.Time.Hour; /* ʱ */ time_buffer[4] = DS1302.Time.Hour; /* ʱ */
time_buffer[5] = DS1302.Time.Minute; /* <20><> */ time_buffer[5] = DS1302.Time.Minute; /* <20><> */
time_buffer[6] = DS1302.Time.Second; /* <20><> */ time_buffer[6] = DS1302.Time.Second; /* <20><> */
} }
/* <20><>Flash<73><68>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */ /* <20><>Flash<73><68>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
static void history_read_metadata(void) static void history_read_metadata(void)
{ {
app_leakage_history_metadata_t temp_metadata; app_leakage_history_metadata_t temp_metadata;
w25q32.read(W25Q32_HISTORY_ALARM_METADATA_ADDR, w25q32.read(W25Q32_HISTORY_ALARM_METADATA_ADDR,
(uint8_t*)&temp_metadata, (uint8_t *)&temp_metadata,
sizeof(app_leakage_history_metadata_t)); sizeof(app_leakage_history_metadata_t));
if (temp_metadata.total_records <= temp_metadata.max_records &&
if(temp_metadata.total_records <= temp_metadata.max_records && temp_metadata.write_index < 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> */ /* <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)); memcpy(&leakage.history_metadata, &temp_metadata, sizeof(app_leakage_history_metadata_t));
@@ -278,9 +269,9 @@ static void history_read_metadata(void)
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t)); memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t));
leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS; leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS;
/* <20><><EFBFBD>浽Flash */ /* <20><><EFBFBD>浽Flash */
history_save_metadata(); history_save_metadata();
} }
} }
@@ -289,17 +280,17 @@ static void history_save_metadata(void)
{ {
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
w25q32_sector_erase(W25Q32_HISTORY_ALARM_METADATA_ADDR); w25q32_sector_erase(W25Q32_HISTORY_ALARM_METADATA_ADDR);
/* д<><D0B4>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */ /* д<><D0B4>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
w25q32.write(W25Q32_HISTORY_ALARM_METADATA_ADDR, w25q32.write(W25Q32_HISTORY_ALARM_METADATA_ADDR,
(uint8_t*)&leakage.history_metadata, (uint8_t *)&leakage.history_metadata,
sizeof(app_leakage_history_metadata_t)); sizeof(app_leakage_history_metadata_t));
} }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>Flash<73>еĵ<D0B5>ַ */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>Flash<73>еĵ<D0B5>ַ */
static uint32_t history_calc_record_addr(u32 record_index) static uint32_t history_calc_record_addr(u32 record_index)
{ {
return W25Q32_HISTORY_ALARM_DATA_ADDR + return W25Q32_HISTORY_ALARM_DATA_ADDR +
(record_index * HISTORY_ALARM_RECORD_SIZE); (record_index * HISTORY_ALARM_RECORD_SIZE);
} }
@@ -307,7 +298,7 @@ static uint32_t history_calc_record_addr(u32 record_index)
static uint32_t history_calc_sector_addr(u32 record_index) static uint32_t history_calc_sector_addr(u32 record_index)
{ {
uint32_t record_addr = history_calc_record_addr(record_index); uint32_t record_addr = history_calc_record_addr(record_index);
return record_addr & ~(W25Q32_SECTOR_SIZE - 1); /* 4K<34><4B><EFBFBD><EFBFBD> */ return record_addr & ~(W25Q32_SECTOR_SIZE - 1); /* 4K<34><4B><EFBFBD><EFBFBD> */
} }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
@@ -315,76 +306,84 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
{ {
app_leakage_history_alarm_t new_alarm; app_leakage_history_alarm_t new_alarm;
uint32_t write_addr; uint32_t write_addr;
/* <20><><EFBFBD><EFBFBD><E4B1A8><EFBFBD><EFBFBD>¼ */ /* <20><><EFBFBD><EFBFBD><E4B1A8><EFBFBD><EFBFBD>¼ */
memset(&new_alarm, 0, sizeof(app_leakage_history_alarm_t)); memset(&new_alarm, 0, sizeof(app_leakage_history_alarm_t));
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* <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, {
memcpy(new_alarm.region_name, leakage.region_data[region_idx].name,
APP_LEAKAGE_STRING_NANE_LEN); APP_LEAKAGE_STRING_NANE_LEN);
} }
/* <20>豸ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* <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; 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, memcpy(new_alarm.device_name, leakage.sub_device_data[device_idx].flash_data.device_name,
APP_LEAKAGE_STRING_NANE_LEN); APP_LEAKAGE_STRING_NANE_LEN);
} }
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͡<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>©Һ<C2A9><D2BA><EFBFBD><EFBFBD> */ /* <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.channel = channel;
new_alarm.leak_distance = leak_distance; new_alarm.leak_distance = leak_distance;
/* <20><>ʼʱ<CABC><CAB1> */ /* <20><>ʼʱ<CABC><CAB1> */
get_current_time(new_alarm.start_time); get_current_time(new_alarm.start_time);
/* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ */ /* <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>ַ */
write_addr = history_calc_record_addr(leakage.history_metadata.write_index); write_addr = history_calc_record_addr(leakage.history_metadata.write_index);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ܿ<EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ܿ<EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint32_t start_sector = write_addr & ~(W25Q32_SECTOR_SIZE - 1); uint32_t start_sector = write_addr & ~(W25Q32_SECTOR_SIZE - 1);
uint32_t end_addr = write_addr + HISTORY_ALARM_RECORD_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 end_sector = end_addr & ~(W25Q32_SECTOR_SIZE - 1);
uint32_t num_sectors = (end_sector - start_sector) / 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>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4KB */ /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4KB */
uint32_t sectors[2] = {start_sector, (num_sectors > 1) ? end_sector : 0}; 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 */ /* 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++) { for (uint32_t i = 0; i < num_sectors; i++)
{
w25q32.read(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE); w25q32.read(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE);
} }
/* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD> */ /* 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD> */
for (uint32_t i = 0; i < num_sectors; i++) { for (uint32_t i = 0; i < num_sectors; i++)
{
w25q32_sector_erase(sectors[i]); w25q32_sector_erase(sectors[i]);
} }
/* 3. <20><>RAM<41>и<EFBFBD><D0B8><EFBFBD><EFBFBD>¼<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */ /* 3. <20><>RAM<41>и<EFBFBD><D0B8><EFBFBD><EFBFBD>¼<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint32_t offset_in_start = write_addr - start_sector; 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); 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); memcpy(sector_buf[0] + offset_in_start, &new_alarm, first_part_len);
if (num_sectors > 1) { if (num_sectors > 1)
{
uint32_t second_part_len = HISTORY_ALARM_RECORD_SIZE - first_part_len; 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); 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 */ /* 4. <20><><EFBFBD>޸ĺ<DEB8><C4BA>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>Flash */
for (uint32_t i = 0; i < num_sectors; i++) { for (uint32_t i = 0; i < num_sectors; i++)
{
w25q32.write(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE); w25q32.write(sectors[i], sector_buf[i], W25Q32_SECTOR_SIZE);
} }
/* 5. <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>У<EFBFBD> */ /* 5. <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6>У<EFBFBD> */
leakage.history_metadata.write_index++; 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; 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++; leakage.history_metadata.total_records++;
} }
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݵ<EFBFBD>Flash */ /* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD>ݵ<EFBFBD>Flash */
history_save_metadata(); history_save_metadata();
} }
@@ -392,31 +391,28 @@ void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alar
/* <20><>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */ /* <20><>ȡ<EFBFBD><C8A1>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ */
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record) static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record)
{ {
if(record_index >= leakage.history_metadata.total_records) if (record_index >= leakage.history_metadata.total_records)
{ {
return 0; /* <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч */ 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> */ /* <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʴ洢<CAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD> */
uint32_t actual_index; uint32_t actual_index;
if(leakage.history_metadata.total_records == 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;
}
if(actual_index == 125)
{ {
actual_index =125; /* <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);
uint32_t read_addr = history_calc_record_addr(actual_index);
w25q32.read(read_addr, (uint8_t *)record, HISTORY_ALARM_RECORD_SIZE);
return 1; return 1;
} }
@@ -426,19 +422,18 @@ static void history_clear_all(void)
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t)); memset(&leakage.history_metadata, 0, sizeof(app_leakage_history_metadata_t));
leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS; leakage.history_metadata.max_records = MAX_HISTORY_ALARM_RECORDS;
/* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */ /* <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD> */
history_save_metadata(); history_save_metadata();
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> */ /* <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++) for (uint32_t i = 0; i < HISTORY_ALARM_SECTORS_NEEDED; i++)
{ {
uint32_t sector_addr = W25Q32_HISTORY_ALARM_DATA_ADDR + i * W25Q32_SECTOR_SIZE; uint32_t sector_addr = W25Q32_HISTORY_ALARM_DATA_ADDR + i * W25Q32_SECTOR_SIZE;
w25q32_sector_erase(sector_addr); w25q32_sector_erase(sector_addr);
} }
} }
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> */ /* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> */
static void history_init(void) static void history_init(void)
{ {

View File

@@ -2,6 +2,7 @@
#define _APP_LEAKAGE_H_ #define _APP_LEAKAGE_H_
#include "main.h" #include "main.h"
#include "bsp_W5500.h"
#define ENABLE (1) #define ENABLE (1)
#define DISABLE (0) #define DISABLE (0)
@@ -24,6 +25,8 @@ 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); void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alarm_type, u16 leak_distance);
#define NETWORK_PORT_NUM BSP_W5500_PORT_NUM
/*<2A><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>*/
typedef struct typedef struct
{ {
@@ -66,7 +69,7 @@ typedef struct {
u8 ip[4]; u8 ip[4];
u8 mask[4]; u8 mask[4];
u8 gateway[4]; u8 gateway[4];
u16 port; u16 port[NETWORK_PORT_NUM];
}network_config_t; }network_config_t;
/* <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ṹ */ /* <20><>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ṹ */

View File

@@ -33,7 +33,7 @@ bsp_W5500_t W5500 =
{ {
.Gateway_IP = {192,168,100,1}, /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/ .Gateway_IP = {192,168,100,1}, /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/
.Sub_Mask = {255,255,255,0}, /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ .Sub_Mask = {255,255,255,0}, /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
.Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01}, /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ(MAC)*/ .Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01}, /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ(MAC) <20><><EFBFBD>ݵ<EFBFBD>Ƭ<EFBFBD><C6AC>UID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC*/
.IP_Addr = {192,168,100,201}, /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/ .IP_Addr = {192,168,100,201}, /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/
.Interrupt_Process = bsp_W5500_Interrupt_Process, .Interrupt_Process = bsp_W5500_Interrupt_Process,
@@ -49,6 +49,24 @@ bsp_W5500_t W5500 =
.ConfigData.Port = {0x01,0xF6}, .ConfigData.Port = {0x01,0xF6},
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER, .Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
}, },
.W5500_Class[1] =
{
.SocketPort = 1, /*ʹ<>ö˿<C3B6>1*/
.ConfigData.Port = {0x01,0xF7},
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
},
.W5500_Class[2] =
{
.SocketPort = 2, /*ʹ<>ö˿<C3B6>2*/
.ConfigData.Port = {0x01,0xF8},
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
},
.W5500_Class[3] =
{
.SocketPort = 3, /*ʹ<>ö˿<C3B6>3*/
.ConfigData.Port = {0x01,0xF9},
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
},
}; };
bsp_W5500_t *pW5500 = &W5500; bsp_W5500_t *pW5500 = &W5500;
@@ -822,7 +840,7 @@ static void bsp_W5500_Task(void)
if ((pW5500->W5500_Class[i].TR_Data_State & BSP_W5500_PORT_DATA_RECEIVE) == BSP_W5500_PORT_DATA_RECEIVE) // <20><><EFBFBD><EFBFBD>Socket0<74><30><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD> if ((pW5500->W5500_Class[i].TR_Data_State & BSP_W5500_PORT_DATA_RECEIVE) == BSP_W5500_PORT_DATA_RECEIVE) // <20><><EFBFBD><EFBFBD>Socket0<74><30><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
{ {
pW5500->W5500_Class[i].TR_Data_State &= ~BSP_W5500_PORT_DATA_RECEIVE; pW5500->W5500_Class[i].TR_Data_State &= ~BSP_W5500_PORT_DATA_RECEIVE;
u16 Len = Read_SOCK_Data_Buffer(0, pW5500->W5500_Class[i].Rx_Buffer); u16 Len = Read_SOCK_Data_Buffer(i, pW5500->W5500_Class[i].Rx_Buffer);
// Write_SOCK_Data_Buffer(&pW5500->W5500_Class[i], pW5500->W5500_Class[i].Rx_Buffer, Len); // Write_SOCK_Data_Buffer(&pW5500->W5500_Class[i], pW5500->W5500_Class[i].Rx_Buffer, Len);
// printf("RX"); // printf("RX");
// Debug_UartSend(pW5500->W5500_Class[i].Rx_Buffer, Len); // Debug_UartSend(pW5500->W5500_Class[i].Rx_Buffer, Len);

View File

@@ -215,7 +215,7 @@
#define W5500_INT_PORT W5500_INT_GPIO_Port #define W5500_INT_PORT W5500_INT_GPIO_Port
typedef u8 SOCKET; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>˿ں<CBBF><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> typedef u8 SOCKET; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>˿ں<CBBF><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BSP_W5500_PORT_NUM 1 #define BSP_W5500_PORT_NUM 4
#define BSP_W5500_TX_DATA_LEN 2048 #define BSP_W5500_TX_DATA_LEN 2048
#define BSP_W5500_RX_DATA_LEN 2048 #define BSP_W5500_RX_DATA_LEN 2048

View File

@@ -98,6 +98,7 @@ static void gui_tjc_hmi_read_device_info_from_w25q(void)
static void gui_tjc_hmi_read_network_config_from_w25q(void) static void gui_tjc_hmi_read_network_config_from_w25q(void)
{ {
u16 i;
network_config_t config; network_config_t config;
w25q32.read(W25Q32_NETWORK_CONFIG_ADDR, (uint8_t*)&config, sizeof(config)); w25q32.read(W25Q32_NETWORK_CONFIG_ADDR, (uint8_t*)&config, sizeof(config));
@@ -106,8 +107,12 @@ static void gui_tjc_hmi_read_network_config_from_w25q(void)
memcpy(W5500.IP_Addr, config.ip, 4); memcpy(W5500.IP_Addr, config.ip, 4);
memcpy(W5500.Sub_Mask, config.mask, 4); memcpy(W5500.Sub_Mask, config.mask, 4);
memcpy(W5500.Gateway_IP, config.gateway, 4); memcpy(W5500.Gateway_IP, config.gateway, 4);
W5500.W5500_Class[0].ConfigData.Port[0] = (config.port >> 8) & 0xFF;
W5500.W5500_Class[0].ConfigData.Port[1] = config.port & 0xFF; for(i=0;i<NETWORK_PORT_NUM;i++)
{
W5500.W5500_Class[i].ConfigData.Port[0] = (config.port[i] >> 8) & 0xFF;
W5500.W5500_Class[i].ConfigData.Port[1] = config.port[i] & 0xFF;
}
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -48,7 +48,12 @@ static void proto_modbus_communication_data_send(u8 *p_data, u16 len)
static void proto_modbus_init(void) static void proto_modbus_init(void)
{ {
W5500.W5500_Class[0].Rx_DataAnalysis = proto_modbus_communication_data_analysis; u16 i;
for(i=0;i<BSP_W5500_PORT_NUM;i++)
{
W5500.W5500_Class[i].Rx_DataAnalysis = proto_modbus_communication_data_analysis;
}
} }
static void proto_modbus_task(void) static void proto_modbus_task(void)
{ {
@@ -134,8 +139,8 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot
case 0x06: case 0x06:
{ {
modbus_analysis_data.write_data_addr[0] = pData[10]; modbus_analysis_data.write_data_addr = &pData[send_buff_index_offset + 4];
modbus_analysis_data.write_data_addr[1] = pData[11];
TempAddr = modbus_analysis_data.start_addr; TempAddr = modbus_analysis_data.start_addr;
TempData = (modbus_analysis_data.write_data_addr[0] << 8) | modbus_analysis_data.write_data_addr[1]; TempData = (modbus_analysis_data.write_data_addr[0] << 8) | modbus_analysis_data.write_data_addr[1];
error_code = proto_modbus_data_write(TempAddr, TempData); error_code = proto_modbus_data_write(TempAddr, TempData);
@@ -155,11 +160,8 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot
case 0x10: case 0x10:
{ {
u8 byte_count = pData[12]; // <20>ֽ<EFBFBD><D6BD><EFBFBD> modbus_analysis_data.write_data_addr = &pData[send_buff_index_offset + 7];
// <20><><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD> write_data_addr
for (u8 i = 0; i < byte_count; i++) {
modbus_analysis_data.write_data_addr[i] = pData[13 + i];
}
TempAddr = modbus_analysis_data.start_addr; TempAddr = modbus_analysis_data.start_addr;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++) for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{ {
@@ -173,12 +175,12 @@ static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *ot
} }
} }
send_struct.len = send_buff_index_offset + 6; send_struct.len = send_buff_index_offset + 6;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 0] = modbus_analysis_data.id; send_struct.send_buffer[send_buff_index_offset + 0] = modbus_analysis_data.id;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 1] = modbus_analysis_data.func; send_struct.send_buffer[send_buff_index_offset + 1] = modbus_analysis_data.func;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 2] = modbus_analysis_data.start_addr >> 8; send_struct.send_buffer[send_buff_index_offset + 2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 3] = modbus_analysis_data.start_addr & 0xff; send_struct.send_buffer[send_buff_index_offset + 3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 4] = modbus_analysis_data.reg_number >> 8; send_struct.send_buffer[send_buff_index_offset + 4] = modbus_analysis_data.reg_number >> 8;
send_struct.send_buffer[send_buff_index_offset + send_buff_index_offset + 5] = modbus_analysis_data.reg_number & 0xff; send_struct.send_buffer[send_buff_index_offset + 5] = modbus_analysis_data.reg_number & 0xff;
} }
break; break;
default: default:

File diff suppressed because it is too large Load Diff

Binary file not shown.