feat: 拆分发送和接收功能声明,优化config配置方式

This commit is contained in:
2026-07-26 10:01:30 +08:00
parent c3af3ae4e2
commit 51e081118a
12 changed files with 815 additions and 871 deletions
+69 -105
View File
@@ -4,30 +4,20 @@
*
* ## 概念
*
* - **通道 (Channel)**:编译期声明的报文类型(如 sensor / status / control)
* - **端口 (Port)**:运行期创建的连接点,绑定一个报文类型和多个外设发送 handler
* - **路由**:将报文类型关联到一个或多个物理外设发送函数
* - **多外设**:一个端口可注册多个 handler,发送时逐一调用全部 handler
* - **发送能力 (Send Capability)**:编译期声明的可发送报文类型
* - **接收能力 (Recv Capability)**:编译期声明的可接收报文类型
* - **端口 (Port)**:运行期连接点,独立设置 send_type + recv_type + 外设 handler 列表
*
* ## 使用流程
*
* 1. 在 datarouter_config.h 中声明报文类型
* 2. 调用 datarouter_init() 初始化
* 3. 通过 datarouter_port_create() 创建端口
* 4. 调用 datarouter_port_set_type() 指定端口处理的报文类型
* 5. 调用 datarouter_port_add_handler() 注册一个或多个外设发送函数
* 6. 调用 datarouter_send_<id>() 触发发送(库逐一调用所有注册的 handler)
* 7. 实现 datarouter_on_recv_<id>() 处理从外设收到的报文
* 8. datarouter_port_delete() 移除端口
*
* ## 路由规则
*
* datarouter_send_<id>(port, data, len)
* → 校验端口类型
* → for each handler: handler(port, data, len)
* → return 0
*
* 接收:外设收到数据 → 用户识别报文类型 → 调 datarouter_on_recv_<id>(port, data, len)
* 1. 创建 datarouter_config.h 声明发送和接收能力(见 datarouter_config_template.h)
* 2. 编译时通过 -I 指向你的配置目录;若无,库使用内置默认配置
* 3. datarouter_init() 初始化
* 4. port_create() 创建端口
* 5. port_set_send_type() 设置发送类型 / port_set_recv_type() 设置接收类型
* 6. port_add_handler() 注册外设发送函数
* 7. 调 datarouter_send_<id>() 触发发送(库调用所有 handler)
* 8. 实现 datarouter_on_recv_<id>() 处理接收数据
*/
#ifndef DATAROUTER_H
@@ -36,74 +26,69 @@
#include <stdint.h>
#include <stddef.h>
#include "datarouter_config.h"
/*
* 配置加载策略:
* 1. 优先从 include path 搜索 <datarouter_config.h>(用户提供的版本)
* 2. 找不到则回退到库自带的 "datarouter_config.h"(默认配置)
*
* 用户只需将自己的 datarouter_config.h 放到项目目录,
* 编译时添加 -I /path/to/your/config 即可覆盖内置配置。
*/
#if defined(__has_include)
# if __has_include(<datarouter_config.h>)
# include <datarouter_config.h>
# else
# include "datarouter_config.h"
# endif
#else
# include "datarouter_config.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
/**
* @enum datarouter_channel
* @brief 报文类型枚举
*
* 由 DATAROUTER_CHANNELS 宏列表自动生成。
*/
enum datarouter_channel {
#define DATAROUTER_CHANNEL(id, desc) DATAROUTER_CHANNEL_##id,
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
DATAROUTER_CHANNEL_COUNT
/* ========== 发送能力枚举 ========== */
enum datarouter_send_cap {
#define DATAROUTER_SEND(id, desc) DATAROUTER_SEND_##id,
DATAROUTER_SEND_CAPABILITIES
#undef DATAROUTER_SEND
DATAROUTER_SEND_CAP_COUNT
};
/**
* @brief 外设发送 handler 类型
*
* @param[in] port_id 源端口 ID
* @param[in] data 数据缓冲区
* @param[in] len 数据长度
*/
/* ========== 接收能力枚举 ========== */
enum datarouter_recv_cap {
#define DATAROUTER_RECV(id, desc) DATAROUTER_RECV_##id,
DATAROUTER_RECV_CAPABILITIES
#undef DATAROUTER_RECV
DATAROUTER_RECV_CAP_COUNT
};
/* ========== 外设发送 handler 类型 ========== */
typedef void (*datarouter_send_handler_t)(uint32_t port_id, const void *data, size_t len);
#ifndef DATAROUTER_MAX_HANDLERS_PER_PORT
#define DATAROUTER_MAX_HANDLERS_PER_PORT 4
#endif
/**
* @defgroup send_functions 发送触发函数
*
* 每个报文类型生成一个发送触发函数。
* 内部校验端口后,逐一调用端口上注册的所有 handler。
* @{
*/
/* ========== 发送触发函数(每个发送能力生成一个) ========== */
#define DATAROUTER_CHANNEL(id, desc) \
#define DATAROUTER_SEND(id, desc) \
int datarouter_send_##id(uint32_t port_id, const void *data, size_t len);
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
DATAROUTER_SEND_CAPABILITIES
#undef DATAROUTER_SEND
/** @} */
/* ========== 接收回调声明(每个接收能力生成一个,用户实现) ========== */
/**
* @defgroup recv_callbacks 接收回调声明
*
* 每个报文类型生成一个接收回调声明。用户实现。
* @{
*/
#define DATAROUTER_CHANNEL(id, desc) \
#define DATAROUTER_RECV(id, desc) \
void datarouter_on_recv_##id(uint32_t port_id, const void *data, size_t len);
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
DATAROUTER_RECV_CAPABILITIES
#undef DATAROUTER_RECV
/** @} */
/**
* @defgroup port_api 端口管理 API
*
* 每个端口可注册 N 个外设发送 handler(上限 DATAROUTER_MAX_HANDLERS_PER_PORT)。
* 发送时逐一调用全部 handler,实现一对多广播路由。
* @{
*/
/* ========== 端口管理 API ========== */
typedef int32_t datarouter_port_t;
#define DATAROUTER_INVALID_PORT ((datarouter_port_t)-1)
@@ -114,46 +99,25 @@ void datarouter_reset(void);
datarouter_port_t datarouter_port_create(void);
void datarouter_port_delete(datarouter_port_t port);
void datarouter_port_set_type(datarouter_port_t port, int channel_id);
int datarouter_port_get_type(datarouter_port_t port);
void datarouter_port_set_send_type(datarouter_port_t port, int cap_id);
int datarouter_port_get_send_type(datarouter_port_t port);
void datarouter_port_set_recv_type(datarouter_port_t port, int cap_id);
int datarouter_port_get_recv_type(datarouter_port_t port);
/**
* @brief 为端口添加一个外设发送 handler
* @param[in] port 端口 ID
* @param[in] handler 发送函数指针(不可为 NULL)
* @retval 0 成功
* @retval -1 端口无效
* @retval -2 handler 列表已满
* @retval -3 handler 已存在(不重复添加)
*/
int datarouter_port_add_handler(datarouter_port_t port, datarouter_send_handler_t handler);
/**
* @brief 从端口移除一个外设发送 handler
* @param[in] port 端口 ID
* @param[in] handler 要移除的函数指针
* @retval 0 成功
* @retval -1 端口无效
* @retval -2 handler 未找到
*/
int datarouter_port_remove_handler(datarouter_port_t port, datarouter_send_handler_t handler);
/** @brief 清除端口所有 handler */
int datarouter_port_add_handler(datarouter_port_t port, datarouter_send_handler_t handler);
int datarouter_port_remove_handler(datarouter_port_t port, datarouter_send_handler_t handler);
void datarouter_port_clear_handlers(datarouter_port_t port);
int datarouter_port_handler_count(datarouter_port_t port);
/** @brief 获取端口当前 handler 数量 @return handler 数量,-1 表示端口无效 */
int datarouter_port_handler_count(datarouter_port_t port);
/* ========== 能力元数据查询 ========== */
/** @} */
int datarouter_send_cap_count(void);
const char *datarouter_send_cap_name(int cap_id);
const char *datarouter_send_cap_desc(int cap_id);
/**
* @defgroup introspection 报文类型元数据查询
* @{
*/
int datarouter_channel_count(void);
const char *datarouter_channel_name(int channel_id);
const char *datarouter_channel_desc(int channel_id);
/** @} */
int datarouter_recv_cap_count(void);
const char *datarouter_recv_cap_name(int cap_id);
const char *datarouter_recv_cap_desc(int cap_id);
#ifdef __cplusplus
}