update:
设备屏蔽功能 适配新版界面
This commit is contained in:
@@ -11,5 +11,11 @@
|
|||||||
#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 */
|
||||||
|
|||||||
@@ -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>5060960::V5.06 update 7 (build 960)::.\ARMCC</pCCUsed>
|
<pCCUsed>5060750::V5.06 update 6 (build 750)::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.3.0.0</PackID>
|
<PackID>Keil.STM32F4xx_DFP.2.15.0</PackID>
|
||||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
<PackURL>http://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,7 +185,6 @@
|
|||||||
<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>
|
||||||
@@ -352,7 +351,7 @@
|
|||||||
<NoWarn>0</NoWarn>
|
<NoWarn>0</NoWarn>
|
||||||
<uSurpInc>0</uSurpInc>
|
<uSurpInc>0</uSurpInc>
|
||||||
<useXO>0</useXO>
|
<useXO>0</useXO>
|
||||||
<ClangAsOpt>4</ClangAsOpt>
|
<uClangAs>0</uClangAs>
|
||||||
<VariousControls>
|
<VariousControls>
|
||||||
<MiscControls></MiscControls>
|
<MiscControls></MiscControls>
|
||||||
<Define></Define>
|
<Define></Define>
|
||||||
@@ -787,13 +786,4 @@
|
|||||||
<files/>
|
<files/>
|
||||||
</RTE>
|
</RTE>
|
||||||
|
|
||||||
<LayerInfo>
|
|
||||||
<Layers>
|
|
||||||
<Layer>
|
|
||||||
<LayName>leakage_system</LayName>
|
|
||||||
<LayPrjMark>1</LayPrjMark>
|
|
||||||
</Layer>
|
|
||||||
</Layers>
|
|
||||||
</LayerInfo>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -60,6 +60,8 @@ void app_init(void)
|
|||||||
/*flash*/
|
/*flash*/
|
||||||
w25q32.init();
|
w25q32.init();
|
||||||
|
|
||||||
|
// HAL_Delay(5000);
|
||||||
|
|
||||||
/*串口初始化*/
|
/*串口初始化*/
|
||||||
com_uart1.init(&com_uart1);
|
com_uart1.init(&com_uart1);
|
||||||
com_uart2.init(&com_uart2);
|
com_uart2.init(&com_uart2);
|
||||||
@@ -148,7 +150,7 @@ void task_500ms(void)
|
|||||||
modbus_leakage[APP_COM1].tx_task(&modbus_leakage[APP_COM1]);
|
modbus_leakage[APP_COM1].tx_task(&modbus_leakage[APP_COM1]);
|
||||||
modbus_leakage[APP_COM2].tx_task(&modbus_leakage[APP_COM2]);
|
modbus_leakage[APP_COM2].tx_task(&modbus_leakage[APP_COM2]);
|
||||||
modbus_leakage[APP_COM3].tx_task(&modbus_leakage[APP_COM3]);
|
modbus_leakage[APP_COM3].tx_task(&modbus_leakage[APP_COM3]);
|
||||||
// modbus_leakage[APP_COM4].tx_task(&modbus_leakage[APP_COM4]);
|
modbus_leakage[APP_COM4].tx_task(&modbus_leakage[APP_COM4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#include "app_com.h"
|
#include "app_com.h"
|
||||||
#include "app_leakage.h"
|
#include "app_leakage.h"
|
||||||
|
#include "bsp_w25q.h"
|
||||||
|
#include <string.h>
|
||||||
#include "proto_modbus_master_leakage.h"
|
#include "proto_modbus_master_leakage.h"
|
||||||
|
|
||||||
/*com口对应的串口*/
|
/*com口对应的串口*/
|
||||||
@@ -11,32 +13,91 @@ bsp_uart_t *com_to_uart[APP_COM_NUM] =
|
|||||||
&com_uart6,
|
&com_uart6,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void app_com_uart_class_rate_set(app_com_class_t * p_com,u16 baud_rate);
|
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum);
|
||||||
static void app_com_class_update(void );
|
static void app_com_class_update(void );
|
||||||
static void app_com_init(void);
|
static void app_com_init(void);
|
||||||
|
static void app_com_save_baudrate_to_flash(void);
|
||||||
|
static void app_com_load_baudrate_from_flash(void);
|
||||||
|
|
||||||
app_com_t app_com=
|
app_com_t app_com=
|
||||||
{
|
{
|
||||||
.init = app_com_init,
|
.init = app_com_init,
|
||||||
.class_update = app_com_class_update,
|
.class_update = app_com_class_update,
|
||||||
|
.save_flah = app_com_save_baudrate_to_flash,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static void app_com_init(void)
|
static void app_com_init(void)
|
||||||
{
|
{
|
||||||
u8 i;
|
u8 i;
|
||||||
for(i=0;i<APP_COM_NUM;i++)
|
for(i=0;i<APP_COM_NUM;i++)
|
||||||
{
|
{
|
||||||
app_com.com[i].com_uart = com_to_uart[i];
|
app_com.com[i].com_uart = com_to_uart[i];
|
||||||
|
app_com.com[i].set.baud_rate = app_com_class_baud_rate_set;
|
||||||
|
app_com.com[i].flash_data.baudrate = 4;
|
||||||
}
|
}
|
||||||
app_com_class_update();
|
app_com_class_update();
|
||||||
|
app_com_load_baudrate_from_flash();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 波特率枚举值到实际数值的转换并设置串口 */
|
||||||
|
static void app_com_class_baud_rate_set(app_com_class_t *p_com, u32 baud_enum)
|
||||||
/*串口配置*/
|
|
||||||
static void app_com_class_baud_rate_set(app_com_class_t * p_com,u16 baud_rate)
|
|
||||||
{
|
{
|
||||||
p_com->com_uart->set.baud_rate(p_com->com_uart,baud_rate);
|
u32 baud_value;
|
||||||
|
switch (baud_enum) {
|
||||||
|
case 0: baud_value = 4800; break;
|
||||||
|
case 1: baud_value = 9600; break;
|
||||||
|
case 2: baud_value = 19200; break;
|
||||||
|
case 3: baud_value = 57600; break;
|
||||||
|
case 4: baud_value = 115200; break;
|
||||||
|
default: baud_value = 115200; break;
|
||||||
|
}
|
||||||
|
if (p_com->com_uart && p_com->com_uart->set.baud_rate) {
|
||||||
|
p_com->com_uart->set.baud_rate(p_com->com_uart, baud_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 从Flash加载波特率到内存并应用 */
|
||||||
|
static void app_com_load_baudrate_from_flash(void)
|
||||||
|
{
|
||||||
|
u8 baud_vals[APP_COM_NUM];
|
||||||
|
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, baud_vals, APP_COM_NUM);
|
||||||
|
|
||||||
|
for (u8 i = 0; i < APP_COM_NUM; i++) {
|
||||||
|
if (baud_vals[i] == 0xFF) { // 未初始化,设为默认115200
|
||||||
|
app_com.com[i].flash_data.baudrate = 4;
|
||||||
|
} else {
|
||||||
|
app_com.com[i].flash_data.baudrate = baud_vals[i];
|
||||||
|
}
|
||||||
|
// 应用波特率到串口硬件
|
||||||
|
app_com_class_baud_rate_set(&app_com.com[i], app_com.com[i].flash_data.baudrate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 将当前波特率保存到Flash */
|
||||||
|
static void app_com_save_baudrate_to_flash(void)
|
||||||
|
{
|
||||||
|
u8 current_vals[APP_COM_NUM];
|
||||||
|
u8 flash_vals[APP_COM_NUM];
|
||||||
|
|
||||||
|
/*当前内存中的波特率枚举值*/
|
||||||
|
for (u8 i = 0; i < APP_COM_NUM; i++) {
|
||||||
|
current_vals[i] = app_com.com[i].flash_data.baudrate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*从 Flash 读取已存储的值*/
|
||||||
|
w25q32.read(W25Q32_COM_BAUDRATE_ADDR, flash_vals, APP_COM_NUM);
|
||||||
|
|
||||||
|
// 比较是否完全相同
|
||||||
|
if (memcmp(current_vals, flash_vals, APP_COM_NUM) == 0) {
|
||||||
|
// 没有变化,无需写入
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 擦除包含该地址的扇区(4K对齐)
|
||||||
|
uint32_t erase_addr = W25Q32_COM_BAUDRATE_ADDR & ~(W25Q32_SECTOR_SIZE - 1);
|
||||||
|
w25q32_sector_erase(erase_addr);
|
||||||
|
w25q32.write(W25Q32_COM_BAUDRATE_ADDR, current_vals, APP_COM_NUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -61,10 +122,18 @@ static void app_com_class_update(void )
|
|||||||
/********************************************COM口划分******************************************************/
|
/********************************************COM口划分******************************************************/
|
||||||
com_index = leakage.sub_device_data[i].flash_data.com;
|
com_index = leakage.sub_device_data[i].flash_data.com;
|
||||||
id = leakage.sub_device_data[i].flash_data.modbus_id;
|
id = leakage.sub_device_data[i].flash_data.modbus_id;
|
||||||
|
|
||||||
|
proto_sensor_class_t *p_sensor = &modbus_leakage[com_index].sensor[modbus_leakage[com_index].sensor_num];
|
||||||
|
|
||||||
|
/* ★ 清空整个传感器结构体 */
|
||||||
|
memset(p_sensor, 0, sizeof(proto_sensor_class_t));
|
||||||
|
|
||||||
/*绑定modbus id*/
|
/*绑定modbus id*/
|
||||||
modbus_leakage[com_index].sensor[modbus_leakage[com_index].sensor_num].comm.id = id;
|
p_sensor->comm.id = id;
|
||||||
/*绑定子设备索引索引*/
|
/*绑定子设备索引索引*/
|
||||||
modbus_leakage[com_index].sensor[modbus_leakage[com_index].sensor_num].comm.leakage_data_index = i;
|
p_sensor->comm.leakage_data_index = i;
|
||||||
|
/* ★ 设置初始状态为默认(发送请求) */
|
||||||
|
p_sensor->comm.state = PROTO_LEAKAGE_COMM_STATE_DEFAULT;
|
||||||
/*comm口设备总数++*/
|
/*comm口设备总数++*/
|
||||||
modbus_leakage[com_index].sensor_num++;
|
modbus_leakage[com_index].sensor_num++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ struct app_com_class_t
|
|||||||
bsp_uart_t *com_uart; /*绑定的实际物理串口*/
|
bsp_uart_t *com_uart; /*绑定的实际物理串口*/
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void (*baud_rate)(app_com_class_t *,u16); /*设置波特率*/
|
void (*baud_rate)(app_com_class_t *,u32); /*设置波特率*/
|
||||||
}set;
|
}set;
|
||||||
//void (*init)(app_com_class_t *); /*初始化*/
|
//void (*init)(app_com_class_t *); /*初始化*/
|
||||||
};
|
};
|
||||||
@@ -36,6 +36,7 @@ typedef struct
|
|||||||
app_com_class_t com[APP_COM_NUM];
|
app_com_class_t com[APP_COM_NUM];
|
||||||
void (*init)(void); /*初始化*/
|
void (*init)(void); /*初始化*/
|
||||||
void (*class_update)(void ); /*com区域分类*/
|
void (*class_update)(void ); /*com区域分类*/
|
||||||
|
void (*save_flah)(void);
|
||||||
}app_com_t;
|
}app_com_t;
|
||||||
|
|
||||||
extern app_com_t app_com;
|
extern app_com_t app_com;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include "bsp_w25q.h"
|
#include "bsp_w25q.h"
|
||||||
#include "bsp_buzzer.h"
|
#include "bsp_buzzer.h"
|
||||||
#include "bsp_relay.h"
|
#include "bsp_relay.h"
|
||||||
|
#include "bsp_DS1302.h"
|
||||||
|
|
||||||
static void history_clear_all(void);
|
static void history_clear_all(void);
|
||||||
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);
|
||||||
@@ -32,6 +33,11 @@ app_hitory_t history =
|
|||||||
|
|
||||||
static void app_leakage_init(void)
|
static void app_leakage_init(void)
|
||||||
{
|
{
|
||||||
|
// for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
|
||||||
|
// {
|
||||||
|
// memset(leakage.sub_device_data[i].ch_data, 0,
|
||||||
|
// sizeof(leakage.sub_device_data[i].ch_data));
|
||||||
|
// }
|
||||||
app_leakage_region_classify();
|
app_leakage_region_classify();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,7 +67,7 @@ void app_leakage_region_classify(void)
|
|||||||
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*名称相同*/
|
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*名称相同*/
|
||||||
{
|
{
|
||||||
/*添加子设备*/
|
/*添加子设备*/
|
||||||
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*绑定子设备索引*/
|
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].sub_device_num] = i;/*绑定子设备索引*/
|
||||||
p_leakage->region_data[j].sub_device_num++; /*区域中子系统数据++*/
|
p_leakage->region_data[j].sub_device_num++; /*区域中子系统数据++*/
|
||||||
add_region_flag = 0;/*不添加新区域*/
|
add_region_flag = 0;/*不添加新区域*/
|
||||||
break;
|
break;
|
||||||
@@ -72,10 +78,13 @@ void app_leakage_region_classify(void)
|
|||||||
if(add_region_flag)/*添加新区域*/
|
if(add_region_flag)/*添加新区域*/
|
||||||
{
|
{
|
||||||
/*复制名称*/
|
/*复制名称*/
|
||||||
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);
|
memcpy(p_leakage->region_data[p_leakage->region_num].name,
|
||||||
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*绑定子设备索引*/
|
p_leakage->sub_device_data[i].flash_data.region_name,
|
||||||
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/
|
APP_LEAKAGE_STRING_NANE_LEN);
|
||||||
p_leakage->region_num++; /*区域数量++*/
|
// 第一个设备索引为0
|
||||||
|
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_num++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -153,6 +162,12 @@ void app_leakage_task(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 检查设备是否屏蔽 */
|
||||||
|
if(p_leakage->sub_device_data[sub_device_index].flash_data.shield != UNBLOCKED)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*历史报警存储*/
|
/*历史报警存储*/
|
||||||
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
|
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
|
||||||
{
|
{
|
||||||
@@ -195,6 +210,7 @@ void app_leakage_task(void)
|
|||||||
{
|
{
|
||||||
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;
|
||||||
}
|
}
|
||||||
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
|
else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
|
||||||
{
|
{
|
||||||
@@ -204,7 +220,7 @@ void app_leakage_task(void)
|
|||||||
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_OPEN;
|
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,21 +233,15 @@ void app_leakage_task(void)
|
|||||||
/* 获取当前时间 */
|
/* 获取当前时间 */
|
||||||
static void get_current_time(u8 *time_buffer)
|
static void get_current_time(u8 *time_buffer)
|
||||||
{
|
{
|
||||||
// RTC_TimeTypeDef sTime;
|
/* 年: 2字节 (例如: 2024 -> 0x07 0xE8) */
|
||||||
// RTC_DateTypeDef sDate;
|
uint16_t year = 2000 + DS1302.Time.Year; /* RTC年份通常从2000开始 */
|
||||||
//
|
time_buffer[0] = (year >> 8) & 0xFF; /* 高字节 */
|
||||||
// /* 获取RTC时间 */
|
time_buffer[1] = year & 0xFF; /* 低字节 */
|
||||||
// HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
|
time_buffer[2] = DS1302.Time.Month; /* 月 */
|
||||||
// HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
|
time_buffer[3] = DS1302.Time.Day; /* 日 */
|
||||||
//
|
time_buffer[4] = DS1302.Time.Hour; /* 时 */
|
||||||
// /* 年: 2字节 (例如: 2024 -> 0x07 0xE8) */
|
time_buffer[5] = DS1302.Time.Minute; /* 分 */
|
||||||
// uint16_t year = 2000 + sDate.Year; /* RTC年份通常从2000开始 */
|
time_buffer[6] = DS1302.Time.Second; /* 秒 */
|
||||||
// time_buffer[0] = (year >> 8) & 0xFF; /* 高字节 */
|
|
||||||
// time_buffer[1] = year & 0xFF; /* 低字节 */
|
|
||||||
// time_buffer[2] = sDate.Month; /* 月 */
|
|
||||||
// time_buffer[3] = sDate.Date; /* 日 */
|
|
||||||
// time_buffer[4] = sTime.Hours; /* 时 */
|
|
||||||
// time_buffer[5] = sTime.Minutes; /* 分 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 从Flash读取历史报警元数据 */
|
/* 从Flash读取历史报警元数据 */
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
#define ENABLE (1)
|
#define ENABLE (1)
|
||||||
#define DISABLE (0)
|
#define DISABLE (0)
|
||||||
|
|
||||||
|
#define BLOCKED (1) /*屏蔽*/
|
||||||
|
#define UNBLOCKED (0)
|
||||||
|
|
||||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
|
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
|
||||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
|
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
|
||||||
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0x8000) /*通讯超时*/
|
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0x8000) /*通讯超时*/
|
||||||
@@ -24,6 +27,8 @@ typedef struct
|
|||||||
{
|
{
|
||||||
u8 state; /*状态 使能 非使能*/
|
u8 state; /*状态 使能 非使能*/
|
||||||
u8 com; /*端口*/
|
u8 com; /*端口*/
|
||||||
|
u8 baudrate; /*波特率*/
|
||||||
|
u8 shield; /*设备屏蔽状态*/
|
||||||
u8 modbus_id; /*modbus id*/
|
u8 modbus_id; /*modbus id*/
|
||||||
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
|
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
|
||||||
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
|
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
|
||||||
@@ -61,7 +66,7 @@ typedef struct
|
|||||||
u8 device_id; /* 设备ID */
|
u8 device_id; /* 设备ID */
|
||||||
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /* 设备名称 */
|
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /* 设备名称 */
|
||||||
u16 alarm_type; /* 报警类型 */
|
u16 alarm_type; /* 报警类型 */
|
||||||
u8 start_time[6]; /* 开始时间: 年(2字节)月日时分 */
|
u8 start_time[7]; /* 开始时间: 年(2字节)月日时分 */
|
||||||
u16 leak_distance; /* 漏液距离 (0表示非漏液报警) */
|
u16 leak_distance; /* 漏液距离 (0表示非漏液报警) */
|
||||||
u8 channel; /* 通道号 (0-3) */
|
u8 channel; /* 通道号 (0-3) */
|
||||||
} app_leakage_history_alarm_t;
|
} app_leakage_history_alarm_t;
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "bsp_buzzer.h"
|
#include "bsp_buzzer.h"
|
||||||
|
#include "bsp_w25q.h"
|
||||||
|
|
||||||
/*开关控制电平,使用同一的电平控制方式*/
|
/*开关控制电平,使用同一的电平控制方式*/
|
||||||
#define BUZZER_GPIO_ON GPIO_PIN_SET
|
#define BUZZER_GPIO_ON GPIO_PIN_SET
|
||||||
@@ -14,6 +15,7 @@ static void bsp_buzzer_on(void);
|
|||||||
static void bsp_buzzer_off(void);
|
static void bsp_buzzer_off(void);
|
||||||
static void bsp_buzzer_enable(void);
|
static void bsp_buzzer_enable(void);
|
||||||
static void bsp_buzzer_disable(void);
|
static void bsp_buzzer_disable(void);
|
||||||
|
static void bsp_buzzer_flash_data_load(void);
|
||||||
|
|
||||||
bsp_buzzer_t buzzer =
|
bsp_buzzer_t buzzer =
|
||||||
{
|
{
|
||||||
@@ -35,11 +37,40 @@ static void bsp_buzzer_init(void)
|
|||||||
{
|
{
|
||||||
BUZZER_OFF;
|
BUZZER_OFF;
|
||||||
p_buzzer->p_flash_data = &flash_data;
|
p_buzzer->p_flash_data = &flash_data;
|
||||||
|
bsp_buzzer_flash_data_load();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bsp_buzzer_flash_data_save(void)
|
static void bsp_buzzer_flash_data_save(void)
|
||||||
{
|
{
|
||||||
|
// 擦除整个扇区(地址是扇区起始)
|
||||||
|
w25q32_sector_erase(W25Q32_BUZZER_STATE_ADDR);
|
||||||
|
w25q32.write(W25Q32_BUZZER_STATE_ADDR, (uint8_t*)&flash_data, sizeof(bsp_buzzer_flash_data_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bsp_buzzer_flash_data_load(void)
|
||||||
|
{
|
||||||
|
w25q32.read(W25Q32_BUZZER_STATE_ADDR, (uint8_t*)&flash_data, sizeof(bsp_buzzer_flash_data_t));
|
||||||
|
|
||||||
|
// 检查是否全为0xFF(首次使用)
|
||||||
|
uint8_t *p = (uint8_t*)&flash_data;
|
||||||
|
u8 all_ff = 1;
|
||||||
|
for (u8 i = 0; i < sizeof(bsp_buzzer_flash_data_t); i++) {
|
||||||
|
if (p[i] != 0xFF) {
|
||||||
|
all_ff = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (all_ff) {
|
||||||
|
// 首次使用,默认关闭蜂鸣器
|
||||||
|
flash_data.sw = USR_DISABLE;
|
||||||
|
bsp_buzzer_flash_data_save();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据加载的状态设置蜂鸣器使能
|
||||||
|
if (flash_data.sw == USR_ENABLE) {
|
||||||
|
p_buzzer->p_flash_data->sw = flash_data.sw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bsp_buzzer_task(void)
|
static void bsp_buzzer_task(void)
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ static void bsp_uart_rx_task(bsp_uart_t *p_uart);
|
|||||||
static void bsp_uart_rx_time_start(bsp_uart_t *p_uart);
|
static void bsp_uart_rx_time_start(bsp_uart_t *p_uart);
|
||||||
static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart);
|
static void bsp_uart_tx_dma_tc_int(bsp_uart_t *p_uart);
|
||||||
static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
|
static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len);
|
||||||
static void bsp_uart_baud_rate_set(bsp_uart_t *p_uart,u16 baud_rate);
|
static void bsp_uart_baud_rate_set(bsp_uart_t *p_uart,u32 baud_rate);
|
||||||
|
|
||||||
/* 外部HAL句柄声明 */
|
/* 外部HAL句柄声明 */
|
||||||
extern UART_HandleTypeDef huart1;
|
extern UART_HandleTypeDef huart1;
|
||||||
@@ -269,7 +269,7 @@ static void bsp_uart_init(bsp_uart_t *p_uart)
|
|||||||
HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
|
HAL_UARTEx_ReceiveToIdle_DMA(p_uart->uart, p_uart->rx_addr, p_uart->rx_dma_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bsp_uart_baud_rate_set(bsp_uart_t *p_uart,u16 baud_rate)
|
static void bsp_uart_baud_rate_set(bsp_uart_t *p_uart,u32 baud_rate)
|
||||||
{
|
{
|
||||||
p_uart->uart->Init.BaudRate = baud_rate;
|
p_uart->uart->Init.BaudRate = baud_rate;
|
||||||
HAL_UART_Init(p_uart->uart);
|
HAL_UART_Init(p_uart->uart);
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ struct bsp_uart_t
|
|||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void (*baud_rate)(bsp_uart_t *,u16);
|
void (*baud_rate)(bsp_uart_t *,u32);
|
||||||
}set;
|
}set;
|
||||||
|
|
||||||
void (*init)(bsp_uart_t *); /* 初始化函数指针 */
|
void (*init)(bsp_uart_t *); /* 初始化函数指针 */
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ void w25q32_sector_erase(uint32_t sector_addr);
|
|||||||
#define MAX_HISTORY_ALARM_RECORDS (1000) /* 最大历史报警记录数 */
|
#define MAX_HISTORY_ALARM_RECORDS (1000) /* 最大历史报警记录数 */
|
||||||
#define HISTORY_ALARM_SECTORS_NEEDED ((MAX_HISTORY_ALARM_RECORDS * HISTORY_ALARM_RECORD_SIZE + W25Q32_SECTOR_SIZE - 1) / W25Q32_SECTOR_SIZE)
|
#define HISTORY_ALARM_SECTORS_NEEDED ((MAX_HISTORY_ALARM_RECORDS * HISTORY_ALARM_RECORD_SIZE + W25Q32_SECTOR_SIZE - 1) / W25Q32_SECTOR_SIZE)
|
||||||
|
|
||||||
|
/* COM口波特率存储地址 - 使用独立扇区(扇区13) */
|
||||||
|
#define W25Q32_COM_BAUDRATE_ADDR 0x00D000 /*存储4个COM口波特率枚举值(4字节)*/
|
||||||
|
|
||||||
|
/* 蜂鸣器状态存储地址 - 使用独立扇区(扇区14) */
|
||||||
|
#define W25Q32_BUZZER_STATE_ADDR 0x00E000 /*存储蜂鸣器状态(1字节)*/
|
||||||
|
|
||||||
/* w25q32 对象结构体 */
|
/* w25q32 对象结构体 */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*init)(void);
|
void (*init)(void);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -68,7 +68,7 @@ static void proto_leakage_init(proto_leakage_t *p_leakage)
|
|||||||
}
|
}
|
||||||
else if(p_leakage == &modbus_leakage[APP_COM4])
|
else if(p_leakage == &modbus_leakage[APP_COM4])
|
||||||
{
|
{
|
||||||
com_to_uart[APP_COM3]->rx_data_analysis = proto_leakage_rx_task;
|
com_to_uart[APP_COM4]->rx_data_analysis = proto_leakage_rx_task;
|
||||||
}
|
}
|
||||||
/*绑定modbus_id和对应的索引在app_com中完成*/
|
/*绑定modbus_id和对应的索引在app_com中完成*/
|
||||||
}
|
}
|
||||||
@@ -251,7 +251,8 @@ static void proto_leakage_rx_task(u8 *p_data,u16 len,void *other_data)
|
|||||||
{
|
{
|
||||||
/*计算当前设备索引*/
|
/*计算当前设备索引*/
|
||||||
u8 sensor_index = p_sensor->comm.leakage_data_index;
|
u8 sensor_index = p_sensor->comm.leakage_data_index;
|
||||||
u16 ch_addr_offset[4] = {0,4,8,11}; /*漏液待数据地址偏移*/
|
// u16 ch_addr_offset[4] = {0,4,8,11}; /*漏液待数据地址偏移*/
|
||||||
|
u16 ch_addr_offset[4] = {0,8,16,22}; /*漏液待数据地址偏移*/
|
||||||
u16 temp;
|
u16 temp;
|
||||||
|
|
||||||
if(sensor_index >= APP_LEAKAGE_SUB_DEVICE_NUM)
|
if(sensor_index >= APP_LEAKAGE_SUB_DEVICE_NUM)
|
||||||
|
|||||||
@@ -265,7 +265,16 @@ static u16 proto_modbus_data_read(u16 addr)
|
|||||||
{
|
{
|
||||||
case 0:/*端口&ID*/
|
case 0:/*端口&ID*/
|
||||||
{
|
{
|
||||||
data = (leakage.sub_device_data[sensor_index].flash_data.com + 1)<< 8 | leakage.sub_device_data[sensor_index].flash_data.modbus_id;
|
// data = (leakage.sub_device_data[sensor_index].flash_data.com + 1)<< 8 | leakage.sub_device_data[sensor_index].flash_data.modbus_id;
|
||||||
|
u16 value = (leakage.sub_device_data[sensor_index].flash_data.com + 1) << 8;
|
||||||
|
value |= leakage.sub_device_data[sensor_index].flash_data.modbus_id;
|
||||||
|
if (leakage.sub_device_data[sensor_index].flash_data.shield == BLOCKED) {
|
||||||
|
value |= 0x8000; /*最高位表示屏蔽*/
|
||||||
|
}
|
||||||
|
if (leakage.sub_device_data[sensor_index].flash_data.state == ENABLE) {
|
||||||
|
value |= 0x4000; /*次高位表示使能*/
|
||||||
|
}
|
||||||
|
data = value;
|
||||||
}break;
|
}break;
|
||||||
case 1 ... 5:/*区域名*/
|
case 1 ... 5:/*区域名*/
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user