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