# DataRouter 轻量级 C 语言数据路由库。发送能力和接收能力分开声明,端口绑定 `send_type` + `recv_type` + handler 列表。发送时自动广播到所有匹配端口,接收时 `dr_port_dispatch()` 自动路由到对应回调。 ## 概念 | 术语 | 说明 | |------|------| | **发送能力** | 编译期声明的可发送报文类型,生成 `dr_send_(data, len)` | | **接收能力** | 编译期声明的可接收报文类型,生成 `dr_on_recv_(port, data, len)` | | **端口** | 运行期连接点,包含 `send_type` + `recv_type` + handler 列表 | | **Handler** | 用户实现的物理外设发送函数,一个端口可注册多个(默认上限 4) | | **Dispatch** | `dr_port_dispatch(port, data, len)` 根据端口的 `recv_type` 自动路由到回调 | ## 快速开始 ### 1. 声明能力 创建自己的 `datarouter_config.h`(可参考 `datarouter_config_template.h`): ```c #define DR_SEND_CAPABILITIES \ DR_SEND(sensor, "Sensor data report") \ DR_SEND(status, "Device status report") #define DR_RECV_CAPABILITIES \ DR_RECV(rtcm, "RTCM correction data") \ DR_RECV(command, "Remote control command") ``` ### 2. 实现 handler 和回调 ```c static void uart_write(uint32_t port_id, const void *data, size_t len) { HAL_UART_Transmit(&huart1, data, len, 1000); } void dr_on_recv_rtcm(uint32_t port_id, const void *data, size_t len) { apply_rtcm_correction(data, len); } ``` ### 3. 创建端口 ```c dr_init(); dr_port_t uart = dr_port_create(); dr_port_set_send_type(uart, DR_SEND_sensor); dr_port_set_recv_type(uart, DR_RECV_rtcm); dr_port_add_handler(uart, uart_write); dr_port_add_handler(uart, tcp_write); /* 发送:自动广播到所有 send_type=sensor 的端口 */ dr_send_sensor("temperature:25.3", 16); /* 接收:外设中断中一行 dispatch,自动调 dr_on_recv_rtcm() */ dr_port_dispatch(uart, data, len); ``` ## API 一览 ### 初始化 ```c void dr_init(void); void dr_reset(void); ``` ### 端口管理 ```c dr_port_t dr_port_create(void); void dr_port_delete(dr_port_t port); void dr_port_set_send_type(port, int cap_id); int dr_port_get_send_type(port); void dr_port_set_recv_type(port, int cap_id); int dr_port_get_recv_type(port); int dr_port_add_handler(port, handler); int dr_port_remove_handler(port, handler); void dr_port_clear_handlers(port); int dr_port_handler_count(port); void dr_port_dispatch(port, data, len); /* 自动路由接收 */ ``` ### 发送触发 ```c int dr_send_sensor(const void *data, size_t len); // 0 成功 int dr_send_status(const void *data, size_t len); // -1 未初始化 // -2 无匹配端口 ``` ### 接收回调 ```c void dr_on_recv_rtcm(uint32_t port_id, const void *data, size_t len); void dr_on_recv_command(uint32_t port_id, const void *data, size_t len); ``` ### 能力元数据 ```c int dr_send_cap_count(void); const char *dr_send_cap_name(int cap_id); const char *dr_send_cap_desc(int cap_id); int dr_recv_cap_count(void); const char *dr_recv_cap_name(int cap_id); const char *dr_recv_cap_desc(int cap_id); ``` ## 路由模型 ``` 发送:dr_send_sensor("temp:25.3", 9) │ ├─→ port A (send_type=sensor) handlers = [uart_write, tcp_write] └─→ port B (send_type=sensor) handlers = [can_write] 接收:dr_port_dispatch(uart1, data, len) │ └─→ uart1.recv_type = DR_RECV_rtcm └─→ dr_on_recv_rtcm(uart1, data, len) ← 查表调用 ``` ## 测试 ```bash cmake --build build ctest --test-dir build ./build/test_datarouter ``` 当前 24 个测试用例,覆盖端口管理、send_type/recv_type、handler、自动广播、dispatch、能力元数据。