298 lines
14 KiB
C
298 lines
14 KiB
C
#pragma once
|
|
|
|
#include "myBase.h"
|
|
|
|
#define ICP67_DEV_ADDR 1
|
|
#define ICP67_TX_MAX_LEN 2048
|
|
|
|
struct _icp67;
|
|
typedef struct _icp67 stru_icp67;
|
|
|
|
#define ICP67_RX_FLAG 0x01
|
|
#define ICP67_TX_FLAG 0x02
|
|
#define ICP67_RESEND_MAX 5
|
|
|
|
|
|
#define DEV_MAINTENANCE_ADDR 0 // 维护软件设备地址
|
|
#define DEV_RK3562_ADDR 1 // RK3562设备地址
|
|
|
|
#define MX_INFO_ADDR (100) // 自定义组合编码参数 遥测 信息体地址
|
|
#define ST_INFO_ADDR (101) // 自定义组合编码参数 遥信 信息体地址
|
|
#define CO_INFO_ADDR (102) // 自定义组合编码参数 遥控 信息体地址
|
|
#define AO_INFO_ADDR (103) // 自定义组合编码参数 定值参数 信息体地址
|
|
#define DD_INFO_ADDR (104) // 自定义组合编码参数 电能量 信息体地址
|
|
|
|
#define MX_OPER_INFO_ADDR (200) // 自定义组合编码参数 遥测一体化运维 信息体地址
|
|
#define ST_OPER_INFO_ADDR (201) // 自定义组合编码参数 遥信一体化运维 信息体地址
|
|
|
|
/**************************************************/
|
|
// 升级
|
|
#define UP_CMD (1) // 执行升级命令
|
|
#define UP_RESULT_1 (1) // 升级成功
|
|
#define UP_RESULT_2 (2) // 无升级文件
|
|
#define UP_RESULT_3 (3) // MD5不匹配
|
|
#define UP_RESULT_4 (4) // 固件信息不对
|
|
|
|
#define FILE_TRANS_FRMAE_LEN (800) // 文件传输帧长度
|
|
|
|
#define FILE_WRITE_ACT_0 (0) // 写文件激活 成功
|
|
#define FILE_WRITE_ACT_1 (1) // 写文件激活 未知错误
|
|
#define FILE_WRITE_ACT_2 (2) // 写文件激活 文件名不支持
|
|
#define FILE_WRITE_ACT_3 (3) // 写文件激活 长度超范围
|
|
|
|
#define FILE_WRITE_CONT_0 (0) // 写文件内容 文件成功(最后一帧)
|
|
#define FILE_WRITE_CONT_1 (1) // 写文件内容 段成功(中间帧)
|
|
#define FILE_WRITE_CONT_2 (2) // 写文件内容 未知错误
|
|
#define FILE_WRITE_CONT_3 (3) // 写文件内容 校验和不匹配
|
|
#define FILE_WRITE_CONT_4 (4) // 写文件内容 文件长度不对应
|
|
#define FILE_WRITE_CONT_5 (5) // 写文件内容 文件ID不对应
|
|
|
|
// 帧结构定义
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint8_t head1; // 协议头
|
|
uint16_t len; // 报文长度
|
|
uint8_t head2; // 协议头
|
|
uint8_t src; // 源设备
|
|
uint8_t dst; // 目标设备
|
|
uint8_t dir; // 方向
|
|
uint8_t ti; // 类型标识
|
|
uint8_t cot; // 传输原因
|
|
uint16_t info_addr; // 信息地址
|
|
uint32_t dev_addr; // 终端地址
|
|
uint8_t data[0]; // 数据区
|
|
}stru_head;
|
|
#pragma pack()
|
|
|
|
// 无数据
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t data_addr; // 数据地址
|
|
uint8_t data_type; // 数据类型
|
|
uint8_t data_len; // 数据长度
|
|
}stru_ti_1_2_data;
|
|
#pragma pack()
|
|
|
|
|
|
// 有数据
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t data_addr; // 数据地址
|
|
uint8_t data_type; // 数据类型
|
|
uint8_t data_len; // 数据长度
|
|
uint8_t data[0]; // 数据
|
|
}stru_ti_1_2_data_info;
|
|
#pragma pack()
|
|
|
|
|
|
/**************************************************/
|
|
// 终端时间
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t ms; // 毫秒
|
|
uint8_t min; // 分钟
|
|
uint8_t hour; // 小时
|
|
uint8_t day; // 日期
|
|
uint8_t month; // 月份
|
|
uint8_t year; // 年份
|
|
}stru_ti_5;
|
|
#pragma pack()
|
|
|
|
// 有数据
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint8_t data_type; // 数据类型
|
|
uint8_t data_len; // 数据长度
|
|
uint8_t data[0]; // 数据
|
|
}stru_data_info;
|
|
#pragma pack()
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t id;
|
|
uint8_t len;
|
|
uint8_t name[256];
|
|
uint32_t size;
|
|
}stru_zip_file_info;
|
|
|
|
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t t1;
|
|
uint32_t t2;
|
|
}stru_tm_6bit;
|
|
#pragma pack()
|
|
|
|
// 单个遥信数据
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t addr; // soe地址
|
|
uint8_t status; // soe状态
|
|
uint8_t attr; // soe属性
|
|
stru_tm_6bit tm; // soe时间
|
|
}stru_st_info;
|
|
#pragma pack()
|
|
|
|
|
|
// 单个遥测数据
|
|
#pragma pack(1)
|
|
typedef struct
|
|
{
|
|
uint16_t addr; // 遥测地址
|
|
int data; // 遥测数据 float -> int
|
|
}stru_mx_info;
|
|
#pragma pack()
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t st_num;
|
|
stru_st_info *p_st_info;
|
|
uint8_t mx_num;
|
|
stru_mx_info *p_mx_info;
|
|
}stru_fault_info;
|
|
|
|
typedef void (*icp67_send_cb)(uint8_t *p_tx, uint16_t tx_len, void *arg);
|
|
typedef int (*icp67_search_frame_cb)(uint8_t *p_data, uint16_t len, uint16_t *p_pos, uint16_t *p_valid_len);
|
|
typedef int (*icp67_decode_cb)(stru_icp67 *p_icp67, uint8_t *p_rx, uint16_t rx_len);
|
|
typedef void (*icp67_timer_handler_cb)(stru_icp67 *p_icp67);
|
|
|
|
typedef void (*icp67_ao_get_cb)(stru_icp67 *p_icp67, stru_ti_1_2_data *p_data, uint16_t num);
|
|
typedef void (*icp67_ao_pop_out_cb)(stru_icp67 *p_icp67, uint16_t addr, uint8_t type, uint8_t len, uint8_t *p_data);
|
|
typedef void (*icp67_ao_set_cb)(stru_icp67 *p_icp67, uint8_t *p_data, uint16_t num);
|
|
typedef void (*icp67_iec_point_tbl_get_cb)(stru_icp67 *p_icp67, uint16_t info_addr);
|
|
typedef void (*icp67_iec_point_tbl_pop_out_cb)(stru_icp67 *p_icp67, uint16_t info_addr, uint16_t num, uint8_t *p_data);
|
|
typedef void (*icp67_time_set_cb)(stru_icp67 *p_icp67, stru_ti_5 *p_time);
|
|
typedef void (*icp67_self_check_get_cb)(stru_icp67 *p_icp67);
|
|
typedef void (*icp67_self_check_pop_out_cb)(stru_icp67 *p_icp67, stru_data_info *p_data, uint16_t addr);
|
|
typedef void (*icp67_upgrade_start_cb)(stru_icp67 *p_icp67, uint8_t dst);
|
|
|
|
typedef void (*icp67_dir_read_cb)(stru_icp67 *p_icp67, uint8_t *p_dir, uint8_t len, uint8_t *tm_start, uint8_t *tm_end);
|
|
typedef void (*icp67_dir_pop_out_cb)(stru_icp67 *p_icp67, uint8_t *p_name, uint8_t len, uint32_t attr, uint32_t size, uint8_t follow);
|
|
typedef void (*icp67_file_read_act_cb)(stru_icp67 *p_icp67, uint8_t *p_name, uint8_t len);
|
|
typedef void (*icp67_file_read_act_confirm_cb)(stru_icp67 *p_icp67, uint8_t *p_name, uint8_t len, uint32_t id, uint32_t size, uint16_t crc);
|
|
typedef void (*icp67_file_read_cb)(stru_icp67 *p_icp67, uint32_t id, uint32_t offset, uint32_t follow, uint8_t *p_data, uint16_t len);
|
|
typedef void (*icp67_file_read_confirm_cb)(stru_icp67 *p_icp67, uint8_t result, uint32_t id, uint32_t offset);
|
|
typedef void (*icp67_file_write_act_cb)(stru_icp67 *p_icp67, uint8_t *p_name, uint8_t len, uint32_t id, uint32_t size, uint16_t crc);
|
|
typedef void (*icp67_file_write_act_confirm_cb)(stru_icp67 *p_icp67, uint8_t result, uint8_t *p_name, uint8_t len, uint32_t id, uint32_t size);
|
|
typedef void (*icp67_file_write_cb)(stru_icp67 *p_icp67, uint32_t id, uint32_t offset, uint8_t follow, uint8_t *p_data, uint16_t len);
|
|
typedef void (*icp67_file_write_confirm_cb)(stru_icp67 *p_icp67, uint8_t result, uint32_t id, uint32_t offset);
|
|
typedef void (*icp67_file_write_end_cb)(stru_icp67 *p_icp67, uint8_t result, uint32_t id, uint32_t offset, uint8_t *md5);
|
|
typedef void (*icp67_file_write_end_confirm_cb)(stru_icp67 *p_icp67, uint8_t result, uint32_t id, uint8_t *md5);
|
|
|
|
typedef void (*icp67_zip_dir_pop_out_cb)(stru_icp67 *p_icp67, uint8_t zip_type, uint8_t *zip_name, uint8_t len, uint8_t file_num, stru_zip_file_info *p_file_info);
|
|
typedef void (*icp67_zip_file_pop_out_cb)(stru_icp67 *p_icp67, uint8_t id, uint32_t offset, uint8_t *p_data, uint16_t len);
|
|
|
|
typedef void (*icp67_mx_trans_cb)(stru_icp67 *p_icp67, uint16_t info_addr, float p_data);
|
|
typedef void (*icp67_st_trans_cb)(stru_icp67 *p_icp67, uint16_t info_addr, uint8_t p_data);
|
|
typedef void (*icp67_dd_trans_cb)(stru_icp67 *p_icp67, uint16_t info_addr, float p_data);
|
|
typedef void (*icp67_soe_trans_cb)(stru_icp67 *p_icp67, stru_st_info *p_data);
|
|
typedef void (*icp67_fault_trans_cb)(stru_icp67 *p_icp67, uint16_t num, stru_fault_info *p_data);
|
|
typedef void (*icp67_mx_change_cb)(stru_icp67 *p_icp67, stru_mx_info *p_data);
|
|
|
|
typedef struct
|
|
{
|
|
icp67_ao_get_cb ao_get_cb; // 内部参数读取回调函数
|
|
icp67_ao_pop_out_cb ao_pop_out_cb; // 内部参数读取出回调函数
|
|
icp67_ao_set_cb ao_set_cb; // 外部修改参数设置的回调函数
|
|
icp67_iec_point_tbl_get_cb iec_point_tbl_get_cb; // 内部IEC表读取回调函数
|
|
icp67_iec_point_tbl_pop_out_cb iec_point_tbl_pop_out_cb; // 内部IEC表读取出回调函数
|
|
icp67_time_set_cb time_set_cb; // 时间设置回调函数
|
|
icp67_self_check_get_cb self_check_get_cb; // 自检读取回调函数
|
|
icp67_self_check_pop_out_cb self_check_pop_out_cb; // 自检读取出回调函数
|
|
icp67_upgrade_start_cb upgrade_start_cb; // 升级开始回调函数
|
|
|
|
icp67_dir_read_cb dir_read_cb; // 目录读取回调函数
|
|
icp67_dir_pop_out_cb dir_pop_out_cb; // 目录读取出回调函数
|
|
icp67_file_read_act_cb file_read_act_cb; // 文件读取回调函数
|
|
icp67_file_read_act_confirm_cb file_read_act_confirm_cb; // 文件读取确认回调函数
|
|
icp67_file_read_cb file_read_cb; // 文件读取回调函数
|
|
icp67_file_read_confirm_cb file_read_confirm_cb; // 文件读取确认回调函数
|
|
icp67_file_write_act_cb file_write_act_cb; // 文件写入回调函数
|
|
icp67_file_write_act_confirm_cb file_write_act_confirm_cb; // 文件写入确认回调函数
|
|
icp67_file_write_cb file_write_cb; // 文件写入回调函数
|
|
icp67_file_write_confirm_cb file_write_confirm_cb; // 文件写入确认回调函数
|
|
icp67_file_write_end_cb file_write_end_cb; // 文件写入结束回调函数
|
|
icp67_file_write_end_confirm_cb file_write_end_confirm_cb; // 文件写入结束确认回调函数
|
|
|
|
icp67_zip_dir_pop_out_cb zip_dir_pop_out_cb; // 压缩目录读取出回调函数
|
|
icp67_zip_file_pop_out_cb zip_file_pop_out_cb; // 压缩文件读取出回调函数
|
|
|
|
icp67_mx_trans_cb mx_trans_cb; // MX通讯回调函数
|
|
icp67_st_trans_cb st_trans_cb; // ST通讯回调函数
|
|
icp67_dd_trans_cb dd_trans_cb; // DD通讯回调函数
|
|
icp67_soe_trans_cb soe_trans_cb; // SOE通讯回调函数
|
|
icp67_fault_trans_cb fault_trans_cb; // 故障通讯回调函数
|
|
icp67_mx_change_cb mx_change_cb; // MX变更回调函数
|
|
|
|
}stru_genneral_method;
|
|
|
|
extern void icp67_set_ao_get_cb(icp67_ao_get_cb *p_cb); // 设置参数获取回调函数
|
|
extern void icp67_set_ao_pop_out_cb(icp67_ao_pop_out_cb cb); // 设置参数数据返回回调函数
|
|
extern void icp67_set_ao_set_cb(icp67_ao_set_cb *p_cb); // 设置参数设置回调函数
|
|
extern void icp67_set_iec_point_tbl_get_cb(icp67_iec_point_tbl_get_cb *p_cb); // 设置iec点表获取回调函数
|
|
extern void icp67_set_iec_point_tbl_pop_out_cb(icp67_iec_point_tbl_pop_out_cb cb); // 设置iec点表数据返回回调函数
|
|
extern void icp67_set_time_set_cb(icp67_time_set_cb *p_cb); // 设置时间设置回调函数
|
|
extern void icp67_set_self_check_get_cb(icp67_self_check_get_cb *p_cb); // 设置自检获取回调函数
|
|
extern void icp67_set_self_check_pop_out_cb(icp67_self_check_pop_out_cb cb); // 设置自检数据返回回调函数
|
|
extern void icp67_set_upgrade_start_cb(icp67_upgrade_start_cb *p_cb); // 设置升级开始回调函数
|
|
|
|
extern void icp67_set_dir_read_cb(icp67_dir_read_cb *p_cb); // 设置目录读取回调函数
|
|
extern void icp67_set_dir_pop_out_cb(icp67_dir_pop_out_cb cb); // 设置目录数据返回回调函数
|
|
extern void icp67_set_file_read_act_cb(icp67_file_read_act_cb *p_cb); // 设置读文件激活回调函数
|
|
extern void icp67_set_file_read_act_confirm_cb(icp67_file_read_act_confirm_cb cb); // 设置读文件激活确认回调函数
|
|
extern void icp67_set_file_read_cb(icp67_file_read_cb cb); // 设置读文件回调函数
|
|
extern void icp67_set_file_read_confirm_cb(icp67_file_read_confirm_cb *p_cb); // 设置读文件确认回调函数
|
|
extern void icp67_set_file_write_act_cb(icp67_file_write_act_cb *p_cb); // 设置写文件激活回调函数
|
|
extern void icp67_set_file_write_act_confirm_cb(icp67_file_write_act_confirm_cb cb); // 设置写文件激活确认回调函数
|
|
extern void icp67_set_file_write_cb(icp67_file_write_cb *p_cb); // 设置写文件回调函数
|
|
extern void icp67_set_file_write_confirm_cb(icp67_file_write_confirm_cb cb); // 设置写文件确认回调函数
|
|
extern void icp67_set_file_write_end_cb(icp67_file_write_end_cb cb); // 设置写文件结束回调函数
|
|
extern void icp67_set_file_write_end_confirm_cb(icp67_file_write_end_confirm_cb *p_cb); // 设置写文件结束确认回调函数
|
|
|
|
extern void icp67_set_zip_dir_pop_out_cb(icp67_zip_dir_pop_out_cb cb); // 设置压缩目录数据返回回调函数
|
|
extern void icp67_set_zip_file_pop_out_cb(icp67_zip_file_pop_out_cb cb); // 设置压缩文件数据返回回调函数
|
|
|
|
extern void icp67_set_mx_trans_cb(icp67_mx_trans_cb cb);
|
|
extern void icp67_set_st_trans_cb(icp67_st_trans_cb cb);
|
|
extern void icp67_set_dd_trans_cb(icp67_dd_trans_cb cb);
|
|
extern void icp67_set_soe_trans_cb(icp67_soe_trans_cb cb);
|
|
extern void icp67_set_fault_trans_cb(icp67_fault_trans_cb cb);
|
|
extern void icp67_set_mx_change_cb(icp67_mx_change_cb cb);
|
|
|
|
|
|
typedef struct _icp67
|
|
{
|
|
void *arg;
|
|
icp67_send_cb send_cb;
|
|
icp67_search_frame_cb search_frame_cb;
|
|
icp67_decode_cb decode_cb;
|
|
icp67_timer_handler_cb timer_handler_cb;
|
|
|
|
|
|
uint8_t md5[16];
|
|
uint8_t tx[ICP67_TX_MAX_LEN];
|
|
uint16_t tx_len;
|
|
uint8_t resend_tx[ICP67_TX_MAX_LEN];
|
|
uint16_t resend_tx_len;
|
|
uint8_t rtx_flag;
|
|
sem_t rtx_sem;
|
|
uint8_t resend_cnt;
|
|
uint32_t tm_out;
|
|
uint32_t tm_cnt;
|
|
|
|
bool test;
|
|
}icp67;
|
|
|
|
|
|
void icp67_init(stru_icp67 *p_icp67, icp67_send_cb send_cb, void *arg);
|
|
int icp67_set_ao_cfg_md5(stru_icp67 *p_icp67, uint8_t *p_md5);
|
|
|
|
|