This commit is contained in:
2026-01-30 17:04:39 +08:00
parent b94a28aacf
commit ef112855bf
30 changed files with 2786 additions and 4505 deletions
+54 -77
View File
@@ -1,5 +1,5 @@
#include "app.h"
#include "os_timer.h"
#include "app_timer.h"
#include "stdio.h"
#include "string.h"
@@ -8,21 +8,37 @@
#include "bsp_Led.h"
#include "bsp_74HC4067.h"
#include "bsp_Flash.h"
#include "tjc_usart_hmi.h"
#include "proto_modbus_master_tdlas.h"
#include "proto_modbus_slave_ex.h"
#include "gui_tjc_hmi.h"
const char *HwVersion = "V1.0";
char SwVersion[24] = "V0.001.0";
void TASK_Idle(void);
void Task_10ms(void);
void Task_50ms(void);
void Task_100ms(void);
void Task_200ms(void);
void Task_500ms(void);
void Task_1s(void);
void Task_2s(void);
void task_idle(void);
void task_10ms(void);
void task_50ms(void);
void task_100ms(void);
void task_200ms(void);
void task_500ms(void);
void task_1s(void);
void task_2s(void);
#define APP_TIMER_TASK_NUM (sizeof(app_timer_task) / sizeof(app_timer_class_t))
/*定义任务*/
app_timer_class_t app_timer_task[] =
{
{0, 1, 1, task_idle }, /*空闲任务一直执行*/
{0, 3, 10, task_10ms },
{0, 7, 50, task_50ms },
{0, 11, 100, task_100ms },
{0, 13, 200, task_200ms },
{0, 17, 500, task_500ms },
{0, 19, 1000, task_1s },
{0, 23, 2000, task_2s },
};
/******************************************
* 函数: AppInit
@@ -31,114 +47,75 @@ void Task_2s(void);
* 返回: 无
* 描述: 无
******************************************/
void App_Init(void)
void app_init(void)
{
Usr_Flash.Init();
COM_Uart1.Init(&COM_Uart1);
COM_Uart2.Init(&COM_Uart2);
COM_Uart4.Init(&COM_Uart4);
Led.Init();
UartCH_Config.init();
/*串口初始化*/
com_uart1.init(&com_uart1);
com_uart2.init(&com_uart2);
com_uart4.init(&com_uart4);
UartCH_Config.init();
tdlas.init();
modbus_slave_ex.init();
TJC_Init(&COM_Uart2);
initRingBuffer();
char init_msg[] = "系统初始化...\r\n";
HAL_UART_Transmit(COM_Uart2.Uart, (uint8_t*)init_msg, strlen(init_msg), 100);
app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); /*分时复用,时间片轮询*/
tjc_hmi.init();
led.init();
//Wdg.Init();
}
/******************************************
* 函数: App_Task
* 函数: App_task
* 功能: 分时复用
* 参数: 无
* 返回: 无
* 描述: 主循环中调用
******************************************/
void App_Task(void)
void app_task(void)
{
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10))
{
OsTimeTick_10ms = osTime_MSecTick;
Task_10ms();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_50ms, osTime_MSecTick, 50))
{
OsTimeTick_50ms = osTime_MSecTick;
Task_50ms();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_100ms, osTime_MSecTick, 100))
{
OsTimeTick_100ms = osTime_MSecTick;
Task_100ms();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_200ms, osTime_MSecTick, 200))
{
OsTimeTick_200ms = osTime_MSecTick;
Task_200ms();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_500ms, osTime_MSecTick, 500))
{
OsTimeTick_500ms = osTime_MSecTick;
Task_500ms();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_1s, osTime_MSecTick, 1000))
{
OsTimeTick_1s = osTime_MSecTick;
Task_1s();
}
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_2s, osTime_MSecTick, 2000))
{
OsTimeTick_2s = osTime_MSecTick;
Task_2s();
}
TASK_Idle();
app_timer.task();
task_idle();
}
/*空闲执行的函数*/
void TASK_Idle(void)
void task_idle(void)
{
COM_Uart1.Rx_Task(&COM_Uart1);
COM_Uart2.Rx_Task(&COM_Uart2);
COM_Uart4.Rx_Task(&COM_Uart4);
com_uart1.rx_task(&com_uart1);
com_uart2.rx_task(&com_uart2);
com_uart4.rx_task(&com_uart4);
}
void Task_10ms(void)
void task_10ms(void)
{
}
void Task_50ms(void)
void task_50ms(void)
{
// tdlas.tx_task();
}
void Task_100ms(void)
void task_100ms(void)
{
// tdlas.tx_task();
}
void Task_200ms(void)
void task_200ms(void)
{
}
void Task_500ms(void)
void task_500ms(void)
{
// UartCH_Config.ch_set(ch);
// tdlas.tx_task();
Led.Flash();
led.task();
}
void Task_1s(void)
void task_1s(void)
{
}
void Task_2s(void)
void task_2s(void)
{
}
+7 -2
View File
@@ -4,7 +4,12 @@
extern const char *HwVersion;
extern char SwVersion[24];
void App_Init(void);
void App_Task(void);
void app_init(void);
void app_task(void);
#endif
+7
View File
@@ -0,0 +1,7 @@
#include "app_com.h"
+28
View File
@@ -0,0 +1,28 @@
#ifndef _APP_COM_H_
#define _APP_COM_H_
#include "main.h"
#include "app_leakage.h"
#include "bsp_uart.h"
#define APP_COM_NUM (4)
typedef struct
{
u8 baudrate; /*波特率*/
}app_com_flash_data_t;
typedef struct
{
app_com_flash_data_t flash_data; /*flash数据*/
u16 device_num; /*绑定的设备数量*/
u8 device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
bsp_uart_t *uart; /*绑定的哪个串口*/
}app_com_class_t;
typedef struct
{
app_com_class_t com_class[APP_COM_NUM];
}app_com_t;
#endif
+100
View File
@@ -0,0 +1,100 @@
#include "app_leakage.h"
#include <string.h>
app_leakage_t leakage =
{
};
app_leakage_t *p_leakage = &leakage;
/*区域分类,将同一区域名的设备划分到一起*/
static void app_leakage_region_classify(void)
{
u16 i,j;
u8 add_region_flag;
/*数量及相关数据清零*/
p_leakage->region_num = 0;
p_leakage->sub_device_num = 0;
memset(p_leakage->region_data,0,sizeof(p_leakage->region_data));
/*遍历子系统*/
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
{
add_region_flag = 1; /*添加新区域*/
/*设备使能*/
if(ENABLE == p_leakage->sub_device_data[i].flash_data.state)
{
p_leakage->sub_device_num++;/*子系统总数量++*/
/*遍历区域*/
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))/*名称相同*/
{
/*添加子设备*/
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*绑定子设备索引*/
p_leakage->region_data[j].leakage_num++; /*区域中子系统数据++*/
add_region_flag = 0;/*不添加新区域*/
break;
}
}
/*没有找到相同名称*/
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);
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*绑定子设备索引*/
p_leakage->region_data[p_leakage->region_num].leakage_num++; /*区域中子系统数据++*/
p_leakage->region_num++; /*区域数量++*/
}
}
}
}
/*异常状态设备数量统计*/
void app_leakage_task(void)
{
u16 i,j,k,sub_device_index;
/*计算异常设备数量*/
/*遍历区域*/
for(i=0;i<p_leakage->region_num;i++)
{
/*清除设备*/
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;
/*遍历区域里面的设备*/
for(j=0;j<p_leakage->region_data[i].leakage_num;j++)
{
/*记录索引*/
sub_device_index = p_leakage->region_data[i].sub_device_index[j];
/*遍历通道*/
for(k=0;k<APP_LEAKAGE_SUB_DEVICE_CH_NUM;k++)
{
/*通讯超时*/
if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
p_leakage->region_data[i].time_out_num++;
break;
}
/*断带*/
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
p_leakage->region_data[i].open_num++;
break;
}
/*漏液*/
else if(p_leakage->sub_device_data[sub_device_index].ch_data[k].state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
p_leakage->region_data[i].leakage_num++;
break;
}
}
}
}
}
+62
View File
@@ -0,0 +1,62 @@
#ifndef _APP_LEAKAGE_H_
#define _APP_LEAKAGE_H_
#include "main.h"
#define ENABLE (1)
#define DISABLE (0)
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/
#define APP_LEAKAGE_STRING_NANE_LEN (10)
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
/*子设备存储的参数*/
typedef struct
{
u8 state; /*状态 使能 非使能*/
u8 com_port; /*端口*/
u8 modbus_id; /*modbus id*/
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
}app_leakage_sub_device_flash_data_t;
/*子设备信息*/
typedef struct
{
app_leakage_sub_device_flash_data_t flash_data; /*flash存储数据*/
struct
{
u16 state; /*状态*/
u16 distance; /*漏液距离*/
}ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*通道数据*/
}app_leakage_sub_device_class_t;
/*区域信息*/
typedef struct
{
u8 leakage_num; /*漏液数量*/
u8 open_num; /*断带数量*/
u8 time_out_num; /*通讯超时数量*/
u8 sub_device_num; /*设备总数量*/
u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名称*/
u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
}app_leakage_region_data_class_t;
typedef struct
{
u8 region_num;
u8 sub_device_num;
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];
void (*init)(void); /*初始化*/
void (*task)(void); /*执行任务*/
}app_leakage_t;
extern app_leakage_t leakage;
#endif
+195
View File
@@ -0,0 +1,195 @@
#include "app_timer.h"
#include "app.h"
/* 函数声明 */
static void app_timer_task(void);
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class);
static void app_timer_task_increment_int(u16 ms_tick);
/******************************************
* 结构体: app_timer
* 功能: 应用定时器实例
* 描述: 定时器控制结构体的具体实例
*******************************************/
app_timer_t app_timer =
{
.p_timer_class = NULL,
.init = app_timer_init,
.task = app_timer_task,
.increment_int = app_timer_task_increment_int,
};
/* 全局指针,指向定时器结构体 */
app_timer_t *p_app_timer = &app_timer;
/******************************************
* 函数: app_timer_init
* 功能: 定时器初始化
* 参数: task_num - 任务数量
* p_timer_class - 任务时间片数组指针
* 返回: 无
* 描述: 初始化定时器,设置任务数量和任务数组
*******************************************/
static void app_timer_init(u8 task_num, app_timer_class_t *p_timer_class)
{
p_app_timer->task_num = task_num;
p_app_timer->p_timer_class = p_timer_class;
}
/******************************************
* 函数: app_timer_task
* 功能: 定时器任务调度
* 参数: 无
* 返回: 无
* 描述: 执行所有已到时间的任务
*******************************************/
static void app_timer_task(void)
{
u16 i;
/* 检查任务数组是否有效 */
if(NULL == p_app_timer->p_timer_class)
{
return;
}
/* 遍历所有任务 */
for (i = 0; i < p_app_timer->task_num; i++)
{
/* 检查任务是否需要执行 */
if (p_app_timer->p_timer_class[i].run_flag)
{
p_app_timer->p_timer_class[i].run_flag = 0; /* 清除执行标志 */
/* 检查任务函数是否有效 */
if (p_app_timer->p_timer_class[i].task == NULL)
{
continue;
}
/* 执行任务函数 */
p_app_timer->p_timer_class[i].task();
}
}
}
/******************************************
* 函数: app_timer_task_increment_int
* 功能: 中断递增函数
* 参数: ms_tick - 毫秒增量
* 返回: 无
* 描述: 在中断中调用,更新定时器计数器和检查任务时间片
*******************************************/
static void app_timer_task_increment_int(u16 ms_tick)
{
u16 i;
/* 更新毫秒级计数器 */
p_app_timer->ms_tick++;
/* 更新秒级计数器 */
if(p_app_timer->ms_tick >= 1000)
{
p_app_timer->s_tick++;
}
/* 检查任务数组是否有效 */
if(NULL == p_app_timer->p_timer_class)
{
return;
}
/* 更新所有任务的时间片计数器 */
for (i = 0; i < p_app_timer->task_num; i++)
{
/* 检查任务计数器是否有效 */
if (p_app_timer->p_timer_class[i].timer_count)
{
p_app_timer->p_timer_class[i].timer_count--;
/* 检查是否到达任务执行时间 */
if (p_app_timer->p_timer_class[i].timer_count == 0)
{
p_app_timer->p_timer_class[i].run_flag = 1;
p_app_timer->p_timer_class[i].timer_count = p_app_timer->p_timer_class[i].timer_reload;
}
}
}
}
/******************************************
* 函数: app_timer_check_time_out
* 功能: 检查超时
* 参数: time_start - 计时开始时间
* time_now - 当前时间
* time_out - 超时时间
* 返回: TIME_TRUE - 已超时,TIME_FALSE - 未超时
* 描述: 检查从time_start开始经过time_out时间后是否超时,
* 考虑了计数器溢出的情况
*******************************************/
u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out)
{
u16 timer_activate_val;
/* 计算触发时间 */
timer_activate_val = time_out + time_start;
/* 考虑计数器溢出情况 */
if (timer_activate_val > time_start)
{
/* 未发生溢出 */
if ((time_now >= timer_activate_val) || (time_now < time_start))
{
return TIME_TRUE;
}
}
else if ((time_now >= timer_activate_val) && (time_now < time_start))
{
/* 发生溢出且当前时间在溢出后 */
return TIME_TRUE;
}
return TIME_FALSE;
}
/******************************************
* 函数: app_timer_check_run_time
* 功能: 计算剩余运行时间
* 参数: time_start - 计时开始时间
* time_now - 当前时间
* time_out - 超时时间
* 返回: 剩余时间(毫秒)
* 描述: 配合app_timer_check_time_out函数使用,
* 计算距离超时还有多少时间,考虑了计数器溢出
*******************************************/
u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out)
{
u16 timer_activate_val;
/* 计算触发时间 */
timer_activate_val = time_out + time_start;
/* 考虑计数器溢出情况 */
if (timer_activate_val > time_start)
{
/* 未发生溢出,直接计算剩余时间 */
return (timer_activate_val - time_now);
}
else
{
/* 发生溢出,计算溢出后的剩余时间 */
return (65535U - time_now + timer_activate_val);
}
}
/******************************************
* 函数: delay_ms
* 功能: 阻塞式延时
* 参数: delay - 延时时间(毫秒)
* 返回: 无
* 描述: 使用HAL库提供的延时函数实现阻塞式延时
*******************************************/
void delay_ms(u16 delay)
{
HAL_Delay(delay);
}
+48
View File
@@ -0,0 +1,48 @@
#ifndef _APP_TIMER_H_
#define _APP_TIMER_H_
#include "main.h"
/* 时间相关宏定义 */
#define TIME_TRUE 1U /* 时间已到 */
#define TIME_FALSE 0U /* 时间未到 */
/******************************************
* 结构体: app_timer_class_t
* 功能: 任务时间片结构体
* 描述: 定义单个任务的时间片调度参数
*******************************************/
typedef struct
{
u8 run_flag; /* 调度标志,1:调度,0:挂起 */
u16 timer_count; /* 时间片计数值 */
u16 timer_reload; /* 时间片重载值 */
void (*task)(void); /* 任务函数指针 */
} app_timer_class_t;
/******************************************
* 结构体: app_timer_t
* 功能: 应用定时器结构体
* 描述: 管理所有任务的定时调度
*******************************************/
typedef struct
{
u16 ms_tick; /* 滴答毫秒级计数器 */
u16 s_tick; /* 滴答秒级计数器 */
u16 task_num; /* 任务数量 */
app_timer_class_t *p_timer_class; /* 任务时间片数组指针 */
void (*init)(u8, app_timer_class_t *); /* 初始化函数指针 */
void (*task)(void); /* 定时器任务函数指针 */
void (*increment_int)(u16); /* 中断递增函数指针 */
} app_timer_t;
/* 函数声明 */
u8 app_timer_check_time_out(u16 time_start, u16 time_now, u16 time_out);
u16 app_timer_check_run_time(u16 time_start, u16 time_now, u16 time_out);
void delay_ms(u16 delay);
/* 声明外部变量 */
extern app_timer_t app_timer;
#endif
-121
View File
@@ -1,121 +0,0 @@
#include "os_timer.h"
unsigned short osTime_MSecTick = 0; /*滴答时钟*/
unsigned short osTime_SecTick = 0;
unsigned short osTime_10SecTick = 0; /*10s记一次 用于自动调零周期时间记录*/
static unsigned short osTimer_MSec1 = 0;
static unsigned short osTimer_MSec2 = 0;
unsigned short OsTimeTick_10ms;
unsigned short OsTimeTick_50ms;
unsigned short OsTimeTick_100ms;
unsigned short OsTimeTick_200ms;
unsigned short OsTimeTick_500ms;
unsigned short OsTimeTick_1s;
unsigned short OsTimeTick_2s;
/****************************************************************************
* NAME: OsTimer_Init
* CALLED BY: Application
* PRECONDITIONS:
* INPUT PARAMETERS: None
* RETURN VALUES: None
* DESCRIPTION: OsTimer initialization
*
****************************************************************************/
void OsTimer_Init(void)
{
osTimer_MSec1 = 0;
osTimer_MSec2 = 0;
osTime_SecTick = 0;
osTime_MSecTick = 0;
OsTimeTick_10ms = osTime_MSecTick;
OsTimeTick_50ms = osTime_MSecTick;
OsTimeTick_100ms = osTime_MSecTick;
OsTimeTick_200ms = osTime_MSecTick;
OsTimeTick_500ms = osTime_MSecTick;
OsTimeTick_1s = osTime_MSecTick;
}
/****************************************************************************
* NAME: OsTimer_Increment
* CALLED BY: ISR
* PRECONDITIONS:
* INPUT PARAMETERS: msec - millisecond to increase
* RETURN VALUES: None
* DESCRIPTION: Increase the Timer
*
****************************************************************************/
void OsTimer_Increment(unsigned short msec)
{
osTime_MSecTick += msec;
osTimer_MSec1 += msec;
osTimer_MSec2 += msec;
if (osTimer_MSec1 >= 1000U) /*1s*/
{
osTimer_MSec1 = 0U;
osTime_SecTick++;
}
if (osTimer_MSec2 >= 10000U) /*10s*/
{
osTimer_MSec2 = 0U;
osTime_10SecTick++;
}
}
/****************************************************************************
* NAME: OsTimer_CheckTimeOut
* CALLED BY: Application
* PRECONDITIONS:
* INPUT PARAMETERS: timeStart - start tick
* timeNow - current tick
* timeOut - expired tick
* RETURN VALUES: whether timer is expired
* DESCRIPTION: check if specified time is expired
*
****************************************************************************/
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
{
unsigned short timerActivateVal;
timerActivateVal = timeOut + timeStart;
if (timerActivateVal > timeStart)
{
if ((timeNow >= timerActivateVal) || (timeNow < timeStart))
{
return TIME_TRUE;
}
}
else if ((timeNow >= timerActivateVal) && (timeNow < timeStart))
{
return TIME_TRUE;
}
return TIME_FALSE;
}
/*
离结束运行还有多少时间 配合OsTimer_CheckTimeOut函数使用
*/
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
{
unsigned short timerActivateVal;
timerActivateVal = timeOut + timeStart;
if (timerActivateVal > timeStart)
{
return (timerActivateVal - timeNow);
}
else
{
return (65535U - timeNow + timerActivateVal);
}
}
/*阻塞式延时*/
void Delay_ms(unsigned short delay)
{
HAL_Delay(delay);
}
-29
View File
@@ -1,29 +0,0 @@
#ifndef _OSTIMER_H_
#define _OSTIMER_H_
#include "main.h"
#define TIME_TRUE 1U
#define TIME_FALSE 0U
extern unsigned short osTime_MSecTick;
extern unsigned short osTime_SecTick;
extern unsigned short osTime_10SecTick; // 10s记一次 用于自动调零周期时间记录
extern unsigned short OsTimeTick_10ms;
extern unsigned short OsTimeTick_50ms;
extern unsigned short OsTimeTick_100ms;
extern unsigned short OsTimeTick_200ms;
extern unsigned short OsTimeTick_500ms;
extern unsigned short OsTimeTick_1s;
extern unsigned short OsTimeTick_2s;
void OsTimer_Init(void);
void OsTimer_Increment(unsigned short msec);
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
void Delay_ms(unsigned short delay);
#endif