99 lines
2.9 KiB
C
99 lines
2.9 KiB
C
/**
|
|
* @file can_xml_parser.h
|
|
* @brief XML 配置解析 — 电力二次设备 CAN 协议栈 (v2.0)
|
|
*
|
|
* v2.0 变更:
|
|
* - 遥测值改为 float (IEEE 754)
|
|
* - 定值 default_val / min_val / max_val 改为 float
|
|
* - 新增 canfd_enable 配置项
|
|
*/
|
|
|
|
#ifndef CAN_XML_PARSER_H
|
|
#define CAN_XML_PARSER_H
|
|
|
|
#include <stdint.h>
|
|
#include "can_id.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* ---- 信号定义 ---- */
|
|
typedef struct {
|
|
uint16_t addr;
|
|
char name[32];
|
|
uint32_t period_ms;
|
|
uint8_t cos_en; /* 变位主动上送使能 */
|
|
} can_signal_yx_t;
|
|
|
|
typedef struct {
|
|
uint16_t addr;
|
|
char name[32];
|
|
uint32_t period_ms;
|
|
float deadband; /* 死区 (变化超过此值触发突发) */
|
|
} can_signal_yc_t;
|
|
|
|
typedef struct {
|
|
uint8_t point;
|
|
char name[32];
|
|
uint16_t select_timeout_ms;
|
|
} can_signal_yk_t;
|
|
|
|
typedef struct {
|
|
uint16_t addr;
|
|
char name[32];
|
|
float min_val; /* 浮点范围 */
|
|
float max_val;
|
|
float default_val;
|
|
} can_signal_dz_t;
|
|
|
|
/* ---- 对端设备 ---- */
|
|
typedef struct {
|
|
uint8_t dev_id;
|
|
char name[32];
|
|
} can_peer_t;
|
|
|
|
/* ---- 回调类型 ---- */
|
|
typedef int (*can_yk_callback_t)(uint8_t point, uint8_t op, void *arg);
|
|
typedef int (*can_dz_callback_t)(uint16_t addr, float value, void *arg);
|
|
typedef int (*can_yc_read_callback_t)(uint16_t addr, float *value, void *arg);
|
|
typedef int (*can_yx_read_callback_t)(uint16_t addr, uint8_t *bitmap, int max_bytes, void *arg);
|
|
typedef int (*can_ft_recv_callback_t)(uint16_t fid, const char *fname, uint32_t size, void *arg);
|
|
|
|
/* ---- 配置上下文 ---- */
|
|
typedef struct {
|
|
uint8_t my_addr;
|
|
char my_name[32];
|
|
|
|
can_signal_yx_t *yx_signals; int yx_count;
|
|
can_signal_yc_t *yc_signals; int yc_count;
|
|
can_signal_yk_t *yk_signals; int yk_count;
|
|
can_signal_dz_t *dz_signals; int dz_count;
|
|
|
|
can_peer_t *peers; int peer_count;
|
|
|
|
/* 回调 */
|
|
can_yk_callback_t yk_cb; void *yk_cb_arg;
|
|
can_dz_callback_t dz_cb; void *dz_cb_arg;
|
|
can_yc_read_callback_t yc_read_cb; void *yc_read_cb_arg;
|
|
can_yx_read_callback_t yx_read_cb; void *yx_read_cb_arg;
|
|
can_ft_recv_callback_t ft_recv_cb; void *ft_recv_cb_arg;
|
|
|
|
int canfd_enable;
|
|
} can_config_ctx_t;
|
|
|
|
/* ---- API ---- */
|
|
int can_xml_parse(const char *xml_path, can_config_ctx_t *ctx);
|
|
void can_xml_free(can_config_ctx_t *ctx);
|
|
|
|
const can_signal_yx_t* can_xml_find_yx(const can_config_ctx_t *ctx, uint16_t addr);
|
|
const can_signal_yc_t* can_xml_find_yc(const can_config_ctx_t *ctx, uint16_t addr);
|
|
const can_signal_yk_t* can_xml_find_yk(const can_config_ctx_t *ctx, uint8_t point);
|
|
const can_signal_dz_t* can_xml_find_dz(const can_config_ctx_t *ctx, uint16_t addr);
|
|
const can_peer_t* can_xml_find_peer(const can_config_ctx_t *ctx, uint8_t dev_id);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif /* CAN_XML_PARSER_H */
|