feat: 拆分发送和接收功能声明,优化config配置方式
This commit is contained in:
+69
-105
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user