feat: 新增接收dispatch反向路由
This commit is contained in:
@@ -1,73 +1,76 @@
|
||||
/**
|
||||
* @file example.c
|
||||
*
|
||||
* 调用 dr_send_sensor(data, len) 无需指定端口,
|
||||
* 库自动广播到所有 send_type=sensor 的端口。
|
||||
* 展示:
|
||||
* 1. send_type + 多 handler 发送广播
|
||||
* 2. recv_type + dr_port_dispatch 自动路由接收
|
||||
* 3. 外设中断中只需一行 dr_port_dispatch()
|
||||
*/
|
||||
|
||||
#include "datarouter.h"
|
||||
#include <stdio.h>
|
||||
|
||||
static void uart_send(uint32_t port_id, const void *data, size_t len)
|
||||
/* ---- 发送 handler ---- */
|
||||
|
||||
static void uart_write(uint32_t port_id, const void *data, size_t len)
|
||||
{
|
||||
printf("[UART port %u] %.*s\n", port_id, (int)len, (const char *)data);
|
||||
}
|
||||
|
||||
static void tcp_send(uint32_t port_id, const void *data, size_t len)
|
||||
static void tcp_write(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 can_send(uint32_t port_id, const void *data, size_t len)
|
||||
/* ---- 接收回调 ---- */
|
||||
|
||||
void dr_on_recv_rtcm(uint32_t port_id, const void *data, size_t len)
|
||||
{
|
||||
printf("[CAN 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 dr_on_recv_command(uint32_t port_id, const void *data, size_t len)
|
||||
{
|
||||
printf("[RX:cmd 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)
|
||||
{
|
||||
dr_init();
|
||||
|
||||
printf("Capabilities:\n");
|
||||
for (int i = 0; i < dr_send_cap_count(); i++)
|
||||
printf(" SEND [%d] %s - %s\n", i,
|
||||
dr_send_cap_name(i), dr_send_cap_desc(i));
|
||||
|
||||
/*
|
||||
* 创建两个端口,都设 send_type=sensor,各绑不同外设。
|
||||
* 调用 dr_send_sensor() 时两个端口同时触发。
|
||||
* 创建端口,配置发送和接收能力。
|
||||
* 一个端口可以同时有 send_type 和 recv_type。
|
||||
*/
|
||||
dr_port_t p1 = dr_port_create();
|
||||
dr_port_set_send_type(p1, DR_SEND_sensor);
|
||||
dr_port_add_handler(p1, uart_send);
|
||||
dr_port_add_handler(p1, tcp_send);
|
||||
dr_port_t uart1 = dr_port_create();
|
||||
dr_port_set_send_type(uart1, DR_SEND_sensor);
|
||||
dr_port_set_recv_type(uart1, DR_RECV_rtcm);
|
||||
dr_port_add_handler(uart1, uart_write);
|
||||
dr_port_add_handler(uart1, tcp_write);
|
||||
|
||||
dr_port_t p2 = dr_port_create();
|
||||
dr_port_set_send_type(p2, DR_SEND_sensor);
|
||||
dr_port_add_handler(p2, can_send);
|
||||
dr_port_t uart2 = dr_port_create();
|
||||
dr_port_set_send_type(uart2, DR_SEND_status);
|
||||
dr_port_set_recv_type(uart2, DR_RECV_command);
|
||||
dr_port_add_handler(uart2, uart_write);
|
||||
|
||||
/* 不指定端口,自动广播到所有 sensor 端口 */
|
||||
printf("\n--- send_sensor (auto-route to ALL sensor ports) ---\n");
|
||||
/* ---- 发送 ---- */
|
||||
printf("--- send sensor (auto-route to uart1) ---\n");
|
||||
dr_send_sensor("temperature:25.3", 16);
|
||||
|
||||
/* 运行时移除一个 handler,下次发送不再触发它 */
|
||||
printf("\n--- remove TCP handler from p1, resend ---\n");
|
||||
dr_port_remove_handler(p1, tcp_send);
|
||||
dr_send_sensor("temperature:26.1", 16);
|
||||
printf("\n--- send status (auto-route to uart2) ---\n");
|
||||
dr_send_status("status:OK", 9);
|
||||
|
||||
/* 接收侧:用户自行调用回调 */
|
||||
printf("\n--- recv command ---\n");
|
||||
dr_on_recv_command(0, "reboot", 6);
|
||||
/* ---- 接收(模拟外设中断) ---- */
|
||||
printf("\n--- UART1 received data → dispatch to rtcm ---\n");
|
||||
dr_port_dispatch(uart1, "rtcm_data_v3.2", 14);
|
||||
|
||||
/* 删除一个端口,触发时不再走它 */
|
||||
printf("\n--- delete p2 (CAN), resend ---\n");
|
||||
dr_port_delete(p2);
|
||||
dr_send_sensor("temperature:27.0", 16);
|
||||
printf("\n--- UART2 received data → dispatch to command ---\n");
|
||||
dr_port_dispatch(uart2, "reboot", 6);
|
||||
|
||||
dr_port_delete(p1);
|
||||
/* 清理 */
|
||||
dr_port_delete(uart1);
|
||||
dr_port_delete(uart2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user