RTU/release/inc/mySystem.h

387 lines
11 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 MSG_NUM 8 // 消息队列消息个数
#define TIMER_NUM 3 // 定时器个数
// 通用定时器事件
#define EV_TIMER1 (0x01 << 0) // 定时器1
#define EV_TIMER2 (0x01 << 1) // 定时器2
#define EV_TIMER3 (0x01 << 2) // 定时器3
// 通讯线程事件
#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线程事件
// 消息队列枚举
typedef enum
{
ENUM_MQ_COM_TO_IEC, // 通讯线程到iec线程消息队列
ENUM_MQ_IEC_TO_COM, // iec线程到通讯线程消息队列
ENUM_MQ_COM_TO_SELF_PTL, // 通讯线程到icp67线程消息队列
ENUM_MQ_SELF_PTL_TO_COM, // icp67线程到通讯线程消息队列
ENUM_MQ_MAX
}enun_msg_queue;
// 应用枚举
typedef enum
{
ENUM_APP_CMD, // 命令行应用
ENUM_APP_DATACENTER, // 数据中心应用
ENUM_APP_COMM, // 通讯通道应用
ENUM_APP_COM_SCAN, // 通讯扫描应用
ENUM_APP_IEC, // iec101104应用
ENUM_APP_SELF_PTL, // icp67应用
ENUM_APP_WEB_SERVER, // web服务器应用
ENUM_APP_IEC61850M, // iec61850m应用
ENUM_APP_MAX
}enum_app;
// 通讯枚举
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);
// 命令行应用初始化与线程函数声明
extern int app_cmd_init1(void *arg);
extern int app_cmd_init2(void *arg);
extern void *app_cmd(void *arg);
// 数据中心应用初始化与线程函数声明
extern int app_datacenter_init1(void *arg);
extern int app_datacenter_init2(void *arg);
extern void *app_datacenter(void *arg);
// 通讯转发应用初始化与线程函数声明
extern int app_com_scan_init1(void *arg);
extern int app_com_scan_init2(void *arg);
extern void *app_com_scan(void *arg);
// iec101104应用初始化与线程函数声明
extern int app_iec_init1(void *arg);
extern int app_iec_init2(void *arg);
extern void *app_iec(void *arg);
// icp67应用初始化与线程函数声明
extern int app_self_ptl_init1(void *arg);
extern int app_self_ptl_init2(void *arg);
extern void *app_self_ptl(void *arg);
// 通讯通道应用初始化与线程函数声明
extern int app_com_channel_init1(void *arg);
extern int app_com_channel_init2(void *arg);
extern void *app_com_channel(void *arg);
// web服务器应用初始化与线程函数声明
extern int app_web_server_init1(void *arg);
extern int app_web_server_init2(void *arg);
extern void *app_web_server(void *arg);
// iec61850m应用初始化与线程函数声明
extern int app_iec61850m_init1(void *arg);
extern int app_iec61850m_init2(void *arg);
extern void *app_iec61850m(void *arg);
// icp67线程设置通道类型
void self_ptl_set_interface(uint32_t interface);
// 通讯通道获取接口类型通过通道ID获取
uint32_t com_channel_interface_get(uint32_t comm_id);
// 通讯转发线程收到协议待发送的数据
extern void com_recv_data(uint32_t itfs, const uint8_t *p_rx, uint16_t rx_len);
// 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;
std::string default_value;
std::string unit;
std::string min;
std::string max;
std::string step;
}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 param_md5[16];
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();
// 信号控制枚举
enum SIGNAL_CTRL_TYPE
{
NONE, // 无
DIRECT_NORMAL, // 直控
SBO_NORMAL, // 选控
};
// 信号控制步骤枚举
enum SIGNAL_CTRL_STEP
{
READY, // 准备
SELECT, // 选择
DIRECT, // 执行
CANCEL, // 取消
};
// 数据中心信号控制结构体
typedef struct
{
uint8_t step:2; // 控制步骤
uint8_t type:2; // 控制类型
uint8_t backup:4; // 备用字节
uint8_t data_type; // 数据类型
void *p_data; // 数据指针
}stru_signal_ctrl;
typedef struct
{
float min; // 最小值
float max; // 最大值
float step; // 步长
std::string unit; // 单位
std::string default_value; // 默认值字符串
// void *p_default; // 默认值
}stru_signal_param;
typedef void (*signal_change_cb)(std::string saddr, SIGNAL_CTRL_STEP step, uint8_t data_type, void *p_data);
// 数据中心out信号注册接口
int dc_signal_out(const std::string &saddr, const std::string &desc, uint8_t data_type, void *p_data);
// 数据中心in信号注册并链接out信号接口
int dc_signal_in(const std::string &saddr, const std::string &desc, const std::string &link_saddr, uint8_t data_type, void **p_data);
// 数据中心参数信号注册接口
int dc_signal_param(const std::string &saddr, const std::string &desc, uint8_t data_type, const stru_signal_param &param, uint8_t ctrl_type, void *p_data, signal_change_cb cb);
// 数据中心参数链接信号接口
int dc_signal_param_link_with_callback(const std::string &saddr, uint8_t data_type, void **p_data, signal_change_cb cb);
// 数据中心参数设置接口
int dc_signal_param_set_val(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
int dc_signal_param_set_val_without_check(const std::string &saddr, uint8_t data_type, void *p_data);
// 数据中心遥控信号注册接口
int dc_signal_yk(const std::string &saddr, const std::string &desc, uint8_t data_type, uint8_t ctrl_type, void *p_data, signal_change_cb cb);
// 数据中心遥控信号链接接口
int dc_signal_yk_link_with_callback(const std::string &saddr, uint8_t data_type, void **p_data, signal_change_cb cb);
// 数据中心遥控控制接口(校验前置,调用前需先调 dc_yk_ctrl_valid
int dc_signal_yk_set_status(const std::string &saddr, SIGNAL_CTRL_STEP step, stru_signal_ctrl &ctrl, void *p_data);
// 数据中心获取out信号信息接口
int dc_get_out_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data);
// 数据中心获取in信号信息接口
int dc_get_in_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, void **p_data);
// 数据中心获取参数信号信息接口
int dc_get_param_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, stru_signal_param &param, uint8_t &ctrl_type, void **p_data);
// 数据中心获取遥控信号信息接口
int dc_get_yk_signal_info(const std::string &saddr, std::string &desc, uint8_t &data_type, uint8_t &ctrl_type, void **p_data);
// 数据中心获取信号值字符串接口
std::string dc_get_signal_val(void *p_data, uint8_t data_type);
// 数据中心设置信号值字符串接口
int dc_set_out_signal_val(const std::string &saddr, void *set_data);
// 数据中心根据数据类型创建数据指针接口
void *dc_create_data_ptr_by_type(uint8_t data_type);
// 数据中心根据数据类型ID获取数据类型字符串接口
std::string dc_get_data_type_str_by_id(uint8_t data_type);
// 数据中心根据数据类型字符串获取数据类型ID接口
uint8_t dc_get_data_type_id_by_str(const std::string &data_type_str);
uint8_t dc_get_data_type_len(uint8_t data_type);