完成了队列版本的pubsub机制,但尚未测试

This commit is contained in:
NeoZeng
2022-11-30 22:10:57 +08:00
parent 32ae8eaa7f
commit bcd7bf00e5
15 changed files with 369 additions and 193 deletions

View File

@@ -13,12 +13,12 @@
#ifndef PUBSUB_H
#define PUBSUB_H
#include "stdlib.h"
#include "stdint-gcc.h"
#define MAX_EVENT_NAME_LEN 32 //最大的事件名长度,每个事件都有字符串来命名
#define MAX_EVENT_COUNT 12 //最多支持的事件数量
#define QUEUE_SIZE 1
/**
@@ -47,5 +47,69 @@ void SubscribeEvent(char* name,void** data);
/* 以下是队列版的pubsub,TODO */
typedef struct mqt
{
/* 用数组模拟FIFO队列 */
void* queue[QUEUE_SIZE];
uint8_t data_len;
uint8_t front_idx;
uint8_t back_idx;
uint8_t temp_size; // 当前队列长度
/* 指向下一个订阅了相同的事件的订阅者的指针 */
struct mqt* next_subs_queue;
} Subscriber_t;
/**
* @brief 发布者类型.每个发布者拥有发布者实例,这个实例
*
*/
typedef struct ent
{
/* 事件名称 */
char event_name[MAX_EVENT_NAME_LEN];
uint8_t data_len;
/* 指向第一个订阅了该事件的订阅者,通过链表访问所有订阅者 */
Subscriber_t* first_subs;
/* 指向下一个Publisher的指针 */
struct ent* next_event_node;
} Publisher_t;
/**
* @brief 订阅name的事件消息
*
* @param name 事件名称
* @param data_len 消息长度,通过sizeof()获取
* @return Subscriber_t* 返回订阅者实例
*/
Subscriber_t* SubRegister(char* name,uint8_t data_len);
/**
* @brief 注册成为消息发布者
*
* @param name 发布者发布的话题名称(事件)
* @return Publisher_t* 返回发布者实例
*/
Publisher_t* PubRegister(char* name,uint8_t data_len);
/**
* @brief 获取消息
*
* @param sub 订阅者实例指针
* @param data_ptr 数据指针,接收的消息将会放到此处
* @return uint8_t 返回值为0说明没有新的消息(消息队列为空),为1说明获取到了新的消息
*/
uint8_t SubGetMessage(Subscriber_t* sub,void* data_ptr);
/**
* @brief 发布者给所有订阅了事件的订阅者推送消息
*
* @param pub 发布者实例指针
* @param data_ptr 指向要发布的数据的指针
*/
void PubPushMessage(Publisher_t* pub,void* data_ptr);