272 lines
6.5 KiB
C++
272 lines
6.5 KiB
C++
#pragma once
|
||
|
||
#include "myBase.h"
|
||
#include "myTask.h"
|
||
#include <vector>
|
||
#include <string>
|
||
#include <map>
|
||
|
||
|
||
#define MSG_SIZE 2048 // 消息队列消息大小
|
||
|
||
|
||
#define TIMER_NUM 3 // 定时器个数
|
||
// 通用定时器事件
|
||
#define EV_TIMER1 (0x01 << 0) // 定时器1 10ms
|
||
#define EV_TIMER2 (0x01 << 1) // 定时器2 100ms
|
||
#define EV_TIMER3 (0x01 << 2) // 定时器3 1000ms
|
||
|
||
// 通讯线程事件
|
||
#define EV_COM_RX_IEC (0x01 << 3) // 收到IEC消息事件
|
||
#define EV_COM_RX_SELF_PTL (0x01 << 4) // 收到ICP67消息事件
|
||
|
||
// iec线程事件
|
||
#define EV_IEC_RX_COM (0x01 << 3) // 收到i端口消息事件
|
||
|
||
|
||
// icp67线程事件
|
||
#define EV_SELF_PTL_RX_COM (0x01 << 3) // 收到端口消息事件
|
||
// #define EV_SELF_PTL_RX_IEC (0x01 << 4) // 收到iec消息事件
|
||
|
||
|
||
// webserver线程事件
|
||
|
||
|
||
// iec61850m线程事件
|
||
|
||
|
||
// datacenter线程事件
|
||
|
||
// 消息队列枚举 — 由 app_msg_queue.h X-macro 自动生成
|
||
#define APP_MQ(name, cfg_name, msg_size, msg_num) ENUM_MQ_##name,
|
||
typedef enum
|
||
{
|
||
#include "app_msg_queue.h"
|
||
ENUM_MQ_MAX
|
||
}enun_msg_queue;
|
||
#undef APP_MQ
|
||
|
||
|
||
// 应用枚举 — 由 app_modules.h X-macro 自动生成
|
||
#define APP_MODULE(name, cfg_name, init1, init2, func) ENUM_APP_##name,
|
||
typedef enum
|
||
{
|
||
#include "app_modules.h"
|
||
ENUM_APP_MAX
|
||
}enum_app;
|
||
#undef APP_MODULE
|
||
|
||
|
||
// 通讯枚举
|
||
typedef enum
|
||
{
|
||
ENUM_COMM_TCP_S_0, // 上位机TCP服务器
|
||
ENUM_COMM_TCP_C_0, // 连接FTU的TCP客户端
|
||
ENUM_COMM_UART_0, // 连接FTU的UART,接收FTU的数据
|
||
ENUM_COMM_TCP_S_1, // 对上的101104 TCP服务器
|
||
ENUM_COMM_MAX
|
||
}enum_comm;
|
||
|
||
// 网络枚举
|
||
typedef enum
|
||
{
|
||
ENUM_TCP_SERVER_0,
|
||
ENUM_TCP_CLIENT_0,
|
||
ENUM_TCP_SERVER_1, // 104s
|
||
ENUM_TCP_MAX
|
||
}enum_tcp;
|
||
|
||
// 串口枚举
|
||
typedef enum
|
||
{
|
||
ENUM_UART_0,
|
||
ENUM_UART_MAX
|
||
}enum_uart;
|
||
|
||
|
||
|
||
// 应用消息队列结构体
|
||
typedef struct
|
||
{
|
||
const char *name; // 消息队列名称
|
||
uint32_t msg_size; // 消息大小
|
||
uint32_t msg_num; // 消息个数
|
||
stru_task_msg_queue_t p_msg_queue; // 消息队列指针
|
||
}stru_app_msg_queue;
|
||
|
||
|
||
// 通讯收发数据结构体
|
||
typedef struct
|
||
{
|
||
uint16_t rx_len; // 接收数据长度
|
||
uint16_t tx_len; // 发送数据长度
|
||
uint8_t rx[MSG_SIZE]; // 接收数据
|
||
uint8_t tx[MSG_SIZE]; // 发送数据
|
||
}stru_rtx_data;
|
||
|
||
|
||
// 消息结构
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
uint32_t interface; // 接口类型
|
||
uint16_t len; // 数据长度
|
||
uint8_t backup[2]; // 备用字节
|
||
uint8_t data[0]; // 数据
|
||
}stru_msg_head;
|
||
#pragma pack()
|
||
|
||
|
||
|
||
// icp67协议头
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
uint8_t head1; // 0x67
|
||
uint16_t len; // 数据长度
|
||
uint8_t head2; // 0x67
|
||
uint8_t data[0]; // 数据
|
||
}stru_icp67_head;
|
||
#pragma pack()
|
||
|
||
// iec协议头
|
||
#pragma pack(1)
|
||
typedef struct
|
||
{
|
||
uint8_t head; // 0x68
|
||
uint8_t data[0]; // 数据
|
||
}stru_iec_head;
|
||
#pragma pack()
|
||
|
||
// 协议头联合体
|
||
typedef union
|
||
{
|
||
stru_icp67_head icp67;
|
||
stru_iec_head iec;
|
||
}stru_protocol_head;
|
||
|
||
|
||
// 应用初始化函数指针类型
|
||
typedef int (*app_init_cb)(void *arg);
|
||
|
||
// 应用线程函数指针类型
|
||
typedef void * (*app_func_cb)(void *arg);
|
||
|
||
// 应用结构体
|
||
typedef struct
|
||
{
|
||
const char *name; // 应用名称
|
||
uint32_t app_id; // 应用ID
|
||
app_init_cb app_init1; // 应用初始化函数1
|
||
app_init_cb app_init2; // 应用初始化函数2
|
||
app_func_cb fun_cb; // 应用线程函数
|
||
void *arg; // 应用线程函数参数
|
||
pthread_t thread; // 应用线程句柄
|
||
stru_task_event_t p_event; // 应用事件
|
||
stru_rtx_data rtx; // 应用收发数据结构体
|
||
uint32_t timer_arg[TIMER_NUM]; // 应用定时器参数
|
||
stru_task_timer_t p_timer[TIMER_NUM]; // 应用定时器指针
|
||
uint32_t run_cnt; // 应用运行计数
|
||
}stru_app;
|
||
|
||
|
||
// 消息队列指针获取函数,根据消息队列ID获取消息队列指针
|
||
stru_app_msg_queue *app_get_msg_queue_ptr(uint32_t mq_id);
|
||
|
||
// 应用指针获取函数,根据应用ID获取应用指针
|
||
stru_app *app_get_ptr(uint32_t app_id);
|
||
|
||
// MQ 目标映射 — MQ 发送完成后要通知的目标 app_id 和 event
|
||
typedef struct
|
||
{
|
||
uint32_t app_id; // 目标应用 ID
|
||
uint32_t event; // 通知事件
|
||
}stru_mq_target;
|
||
|
||
// 获取 MQ 对应的通知目标(app_id + event),解耦发送方对接收方 app_id 的硬编码
|
||
stru_mq_target app_get_mq_target(uint32_t mq_id);
|
||
|
||
// 应用初始化与线程函数声明 — 由 app_modules.h X-macro 自动生成
|
||
#define APP_MODULE(name, cfg_name, init1, init2, func) \
|
||
extern int init1(void *arg); \
|
||
extern int init2(void *arg); \
|
||
extern void *func(void *arg);
|
||
|
||
#include "app_modules.h"
|
||
#undef APP_MODULE
|
||
|
||
|
||
|
||
|
||
|
||
// 通讯通道获取接口类型,通过通道ID获取
|
||
uint32_t com_channel_interface_get(uint32_t comm_id);
|
||
|
||
|
||
|
||
// ======== 异步命令输出分发器(命令模块通用接口,不感知 WebSocket) ========
|
||
// 格式化输出到前端命令终端
|
||
void async_cmd_printf(const char *module, const char *fmt, ...);
|
||
// 命令完成通知(成功/失败 + 消息)
|
||
void async_cmd_complete(const char *module, bool success, const char *msg);
|
||
|
||
|
||
|
||
|
||
|
||
|
||
// ftu配置解析相关结构体和函数声明
|
||
// 基础信息
|
||
typedef struct
|
||
{
|
||
std::string saddr;
|
||
std::string desc;
|
||
uint16_t inf;
|
||
}stru_self_ptl_cfg_base;
|
||
|
||
// 参数信息
|
||
typedef struct
|
||
{
|
||
stru_self_ptl_cfg_base base;
|
||
uint8_t type;
|
||
// uint8_t dc_type;
|
||
uint8_t num;
|
||
std::string unit;
|
||
std::string min;
|
||
std::string max;
|
||
std::string step;
|
||
std::vector<std::string> val;
|
||
std::vector<std::string> default_value;
|
||
}stru_self_ptl_cfg_param;
|
||
|
||
// 所有配置信息
|
||
typedef struct
|
||
{
|
||
bool init;
|
||
std::vector<stru_self_ptl_cfg_base> st_vec;
|
||
std::vector<stru_self_ptl_cfg_base> mx_vec;
|
||
std::vector<stru_self_ptl_cfg_base> co_vec;
|
||
std::vector<stru_self_ptl_cfg_base> dd_vec;
|
||
|
||
uint8_t ao_md5[16];
|
||
uint8_t param_md5[16];
|
||
|
||
std::vector<stru_self_ptl_cfg_param> ao_vec;
|
||
std::vector<stru_self_ptl_cfg_param> param_vec;
|
||
}stru_self_ptl_cfg;
|
||
|
||
// 解析配置文件接口
|
||
int self_ptl_cfg_parse(const std::string &path);
|
||
|
||
// 获取配置结构体指针接口
|
||
stru_self_ptl_cfg* self_ptl_cfg_get();
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|