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
+45 -57
View File
@@ -3,18 +3,16 @@
* @brief 数据路由库使用示例
*
* 展示:
* 1. 编译期声明报文类型 → 自动生成发送触发函数和接收回调声明
* 2. 创建端口、设置报文类型
* 3. 为一个端口注册多个外设 handler(一对多广播路由)
* 4. 运行时增删 handler,切换路由
* 5. 实现接收回调处理外设收到的数据
* - 发送能力和接收能力分开声明(sensor 只发送,rtcm 只接收)
* - 端口独立设置 send_type 和 recv_type
* - 一个端口可同时拥有发送和接收能力
*/
#include "datarouter.h"
#include <stdio.h>
#include <string.h>
/* ---- 外设发送 handler 实现 ---- */
/* ---- 外设发送 handler ---- */
static void uart_send(uint32_t port_id, const void *data, size_t len)
{
@@ -26,80 +24,70 @@ static void tcp_send(uint32_t port_id, const void *data, size_t len)
printf("[TCP] port %u: %.*s\n", port_id, (int)len, (const char *)data);
}
static void file_send(uint32_t port_id, const void *data, size_t len)
{
printf("[FILE] port %u: %.*s\n", port_id, (int)len, (const char *)data);
}
static void can_send(uint32_t port_id, const void *data, size_t len)
{
printf("[CAN] port %u: %.*s\n", port_id, (int)len, (const char *)data);
}
/* ---- 接收回调实现 ---- */
void datarouter_on_recv_sensor(uint32_t port_id, const void *data, size_t len)
void datarouter_on_recv_rtcm(uint32_t port_id, const void *data, size_t len)
{
printf("[RX:sensor] port %u: %.*s\n", port_id, (int)len, (const char *)data);
printf("[RX:rtcm] port %u: %.*s\n", port_id, (int)len, (const char *)data);
}
void datarouter_on_recv_status(uint32_t port_id, const void *data, size_t len)
void datarouter_on_recv_command(uint32_t port_id, const void *data, size_t len)
{
printf("[RX:status] port %u: %.*s\n", port_id, (int)len, (const char *)data);
printf("[RX:cmd] port %u: %.*s\n", port_id, (int)len, (const char *)data);
}
/* ---- main ---- */
int main(void)
{
datarouter_init();
printf("Channels:\n");
for (int i = 0; i < datarouter_channel_count(); i++)
printf(" [%d] %s - %s\n", i,
datarouter_channel_name(i),
datarouter_channel_desc(i));
/* 查询能力 */
printf("Send capabilities: %d\n", datarouter_send_cap_count());
for (int i = 0; i < datarouter_send_cap_count(); i++)
printf(" SEND [%d] %s - %s\n", i,
datarouter_send_cap_name(i), datarouter_send_cap_desc(i));
printf("Recv capabilities: %d\n", datarouter_recv_cap_count());
for (int i = 0; i < datarouter_recv_cap_count(); i++)
printf(" RECV [%d] %s - %s\n", i,
datarouter_recv_cap_name(i), datarouter_recv_cap_desc(i));
/*
* 创建一个 sensor 端口,注册多个 handler。
* 一次 send_sensor() 调用同时路由到 UART + TCP + CAN。
* 端口 A:只有发送能力 —— 上报传感器数据
*/
datarouter_port_t sensor_port = datarouter_port_create();
datarouter_port_set_type(sensor_port, DATAROUTER_CHANNEL_sensor);
datarouter_port_add_handler(sensor_port, uart_send);
datarouter_port_add_handler(sensor_port, tcp_send);
datarouter_port_add_handler(sensor_port, can_send);
datarouter_port_t tx_port = datarouter_port_create();
datarouter_port_set_send_type(tx_port, DATAROUTER_SEND_sensor);
datarouter_port_add_handler(tx_port, uart_send);
datarouter_port_add_handler(tx_port, tcp_send);
printf("\n--- send sensor (UART + TCP + CAN) ---\n");
datarouter_send_sensor(sensor_port, "temperature:25.3", 16);
printf("\n--- send sensor (UART + TCP) ---\n");
datarouter_send_sensor(tx_port, "temperature:25.3", 16);
/* 该端口没有 recv_type,不能接收任何报文 */
/*
* 运行时移除 TCP handler,只剩 UART + CAN。
* 端口 B:只有接收能力 —— 接收 RTCM 修正
*/
printf("\n--- remove TCP, keep UART + CAN ---\n");
datarouter_port_remove_handler(sensor_port, tcp_send);
datarouter_send_sensor(sensor_port, "temperature:26.1", 16);
datarouter_port_t rtcm_port = datarouter_port_create();
datarouter_port_set_recv_type(rtcm_port, DATAROUTER_RECV_rtcm);
/* 没有 send_type,也没有 handler —— 不能发送 */
printf("\n--- simulate receive RTCM ---\n");
datarouter_on_recv_rtcm(rtcm_port, "rtcm_data_v3.2", 14);
/*
* 运行时再添加 FILE handler。
* 端口 C:同时有收发能力 —— 接收命令 + 上报状态
*/
printf("\n--- add FILE back, now UART + CAN + FILE ---\n");
datarouter_port_add_handler(sensor_port, file_send);
datarouter_send_sensor(sensor_port, "temperature:27.0", 16);
datarouter_port_t bi_port = datarouter_port_create();
datarouter_port_set_send_type(bi_port, DATAROUTER_SEND_status);
datarouter_port_set_recv_type(bi_port, DATAROUTER_RECV_command);
datarouter_port_add_handler(bi_port, uart_send);
/*
* 清除所有 handler,不再输出到任何外设。
*/
printf("\n--- clear all handlers, nothing sent ---\n");
datarouter_port_clear_handlers(sensor_port);
int ret = datarouter_send_sensor(sensor_port, "lost", 4);
printf("send_sensor after clear returned %d\n", ret);
printf("\n--- bidirectional port ---\n");
datarouter_send_status(bi_port, "status:OK", 9);
datarouter_on_recv_command(bi_port, "reboot", 6);
/* ---- 接收 ---- */
printf("\n--- simulate peripheral receive ---\n");
datarouter_on_recv_sensor(0, "temperature:24.8", 16);
datarouter_on_recv_status(1, "status:ERROR", 12);
datarouter_port_delete(sensor_port);
/* 清理 */
datarouter_port_delete(tx_port);
datarouter_port_delete(rtcm_port);
datarouter_port_delete(bi_port);
return 0;
}