feat: 新增路由功能
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
/**
|
||||
* @file example.c
|
||||
* @brief 数据路由库使用示例
|
||||
*
|
||||
* 展示:
|
||||
* 1. 编译期声明报文类型 → 自动生成发送触发函数和接收回调声明
|
||||
* 2. 创建端口、设置报文类型
|
||||
* 3. 为一个端口注册多个外设 handler(一对多广播路由)
|
||||
* 4. 运行时增删 handler,切换路由
|
||||
* 5. 实现接收回调处理外设收到的数据
|
||||
*/
|
||||
|
||||
#include "datarouter.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/* ---- 外设发送 handler 实现 ---- */
|
||||
|
||||
static void uart_send(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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
printf("[RX:sensor] 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)
|
||||
{
|
||||
printf("[RX:status] 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));
|
||||
|
||||
/*
|
||||
* 创建一个 sensor 端口,注册多个 handler。
|
||||
* 一次 send_sensor() 调用同时路由到 UART + TCP + CAN。
|
||||
*/
|
||||
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);
|
||||
|
||||
printf("\n--- send sensor (UART + TCP + CAN) ---\n");
|
||||
datarouter_send_sensor(sensor_port, "temperature:25.3", 16);
|
||||
|
||||
/*
|
||||
* 运行时移除 TCP handler,只剩 UART + CAN。
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
* 运行时再添加 FILE handler。
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
* 清除所有 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--- 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);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user