RTU/release/inc/mySystem.h

272 lines
6.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();