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
+81 -47
View File
@@ -1,14 +1,10 @@
/**
* @file datarouter.c
* @brief 数据路由库 —— 实现
*
* 端口表:固定大小数组,每个端口存储报文类型 + handler 列表。
* 发送触发函数逐一调用端口上注册的全部 handler,实现一对多广播。
*/
#include "datarouter.h"
#include <string.h>
#include <stdio.h>
#if defined(__GNUC__) || defined(__clang__)
#define DATAROUTER_WEAK __attribute__((weak))
@@ -20,17 +16,9 @@
#define DATAROUTER_MAX_PORTS 64
#endif
/**
* @struct port_entry_t
* @brief 端口表条目
*
* @var type 报文类型(DATAROUTER_CHANNEL_xxx / -1)
* @var handlers 外设发送 handler 数组
* @var count 当前注册的 handler 数量
* @var in_use 1=已分配,0=空闲
*/
typedef struct {
int type;
int send_type;
int recv_type;
datarouter_send_handler_t handlers[DATAROUTER_MAX_HANDLERS_PER_PORT];
int count;
uint8_t in_use;
@@ -39,48 +27,62 @@ typedef struct {
static port_entry_t ports[DATAROUTER_MAX_PORTS];
static uint8_t initialized;
/* ---- 通道元数据(X-macro 展开) ---- */
/* ---- 发送能力元数据 ---- */
static const char *channel_names[] = {
#define DATAROUTER_CHANNEL(id, desc) #id,
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
static const char *send_names[] = {
#define DATAROUTER_SEND(id, desc) #id,
DATAROUTER_SEND_CAPABILITIES
#undef DATAROUTER_SEND
};
static const char *channel_descs[] = {
#define DATAROUTER_CHANNEL(id, desc) desc,
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
static const char *send_descs[] = {
#define DATAROUTER_SEND(id, desc) desc,
DATAROUTER_SEND_CAPABILITIES
#undef DATAROUTER_SEND
};
/* ---- 接收能力元数据 ---- */
static const char *recv_names[] = {
#define DATAROUTER_RECV(id, desc) #id,
DATAROUTER_RECV_CAPABILITIES
#undef DATAROUTER_RECV
};
static const char *recv_descs[] = {
#define DATAROUTER_RECV(id, desc) desc,
DATAROUTER_RECV_CAPABILITIES
#undef DATAROUTER_RECV
};
/* ---- 弱符号接收回调默认实现 ---- */
#define DATAROUTER_CHANNEL(id, desc) \
#define DATAROUTER_RECV(id, desc) \
DATAROUTER_WEAK void datarouter_on_recv_##id( \
uint32_t port_id, const void *data, size_t len) \
{ \
(void)port_id; (void)data; (void)len; \
}
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
DATAROUTER_RECV_CAPABILITIES
#undef DATAROUTER_RECV
/* ---- 发送触发函数实现 ---- */
#define DATAROUTER_CHANNEL(id, desc) \
#define DATAROUTER_SEND(id, desc) \
int datarouter_send_##id(uint32_t port_id, const void *data, size_t len) \
{ \
if (!initialized) return -1; \
if (port_id >= DATAROUTER_MAX_PORTS || !ports[port_id].in_use) return -2; \
if (ports[port_id].type != DATAROUTER_CHANNEL_##id) return -3; \
if (ports[port_id].send_type != DATAROUTER_SEND_##id) return -3; \
if (ports[port_id].count == 0) return -4; \
for (int _i = 0; _i < ports[port_id].count; _i++) \
ports[port_id].handlers[_i](port_id, data, len); \
return 0; \
}
DATAROUTER_CHANNELS
#undef DATAROUTER_CHANNEL
DATAROUTER_SEND_CAPABILITIES
#undef DATAROUTER_SEND
/* ---- 端口管理 API ---- */
/* ---- 端口管理 ---- */
void datarouter_init(void)
{
@@ -100,9 +102,10 @@ datarouter_port_t datarouter_port_create(void)
if (!initialized) return DATAROUTER_INVALID_PORT;
for (int i = 0; i < DATAROUTER_MAX_PORTS; i++) {
if (!ports[i].in_use) {
ports[i].in_use = 1;
ports[i].type = -1;
ports[i].count = 0;
ports[i].in_use = 1;
ports[i].send_type = -1;
ports[i].recv_type = -1;
ports[i].count = 0;
return (datarouter_port_t)i;
}
}
@@ -116,18 +119,32 @@ void datarouter_port_delete(datarouter_port_t port)
ports[port].in_use = 0;
}
void datarouter_port_set_type(datarouter_port_t port, int channel_id)
void datarouter_port_set_send_type(datarouter_port_t port, int cap_id)
{
if (!initialized) return;
if (port < 0 || port >= DATAROUTER_MAX_PORTS || !ports[port].in_use) return;
ports[port].type = channel_id;
ports[port].send_type = cap_id;
}
int datarouter_port_get_type(datarouter_port_t port)
int datarouter_port_get_send_type(datarouter_port_t port)
{
if (!initialized) return -1;
if (port < 0 || port >= DATAROUTER_MAX_PORTS || !ports[port].in_use) return -1;
return ports[port].type;
return ports[port].send_type;
}
void datarouter_port_set_recv_type(datarouter_port_t port, int cap_id)
{
if (!initialized) return;
if (port < 0 || port >= DATAROUTER_MAX_PORTS || !ports[port].in_use) return;
ports[port].recv_type = cap_id;
}
int datarouter_port_get_recv_type(datarouter_port_t port)
{
if (!initialized) return -1;
if (port < 0 || port >= DATAROUTER_MAX_PORTS || !ports[port].in_use) return -1;
return ports[port].recv_type;
}
int datarouter_port_add_handler(datarouter_port_t port, datarouter_send_handler_t handler)
@@ -168,21 +185,38 @@ int datarouter_port_handler_count(datarouter_port_t port)
return ports[port].count;
}
/* ---- 通道元数据查询 ---- */
/* ---- 元数据查询 ---- */
int datarouter_channel_count(void)
int datarouter_send_cap_count(void)
{
return DATAROUTER_CHANNEL_COUNT;
return DATAROUTER_SEND_CAP_COUNT;
}
const char *datarouter_channel_name(int channel_id)
const char *datarouter_send_cap_name(int cap_id)
{
if (channel_id < 0 || channel_id >= DATAROUTER_CHANNEL_COUNT) return NULL;
return channel_names[channel_id];
if (cap_id < 0 || cap_id >= DATAROUTER_SEND_CAP_COUNT) return NULL;
return send_names[cap_id];
}
const char *datarouter_channel_desc(int channel_id)
const char *datarouter_send_cap_desc(int cap_id)
{
if (channel_id < 0 || channel_id >= DATAROUTER_CHANNEL_COUNT) return NULL;
return channel_descs[channel_id];
if (cap_id < 0 || cap_id >= DATAROUTER_SEND_CAP_COUNT) return NULL;
return send_descs[cap_id];
}
int datarouter_recv_cap_count(void)
{
return DATAROUTER_RECV_CAP_COUNT;
}
const char *datarouter_recv_cap_name(int cap_id)
{
if (cap_id < 0 || cap_id >= DATAROUTER_RECV_CAP_COUNT) return NULL;
return recv_names[cap_id];
}
const char *datarouter_recv_cap_desc(int cap_id)
{
if (cap_id < 0 || cap_id >= DATAROUTER_RECV_CAP_COUNT) return NULL;
return recv_descs[cap_id];
}