linux_learn/learn/CAN/include/can_xml_parser.h

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 */