scara_engineering/modules/message_center/message_center.h

85 lines
2.5 KiB
C
Raw Normal View History

2024-12-22 16:15:37 +08:00
/**
* @file message_center.h
* @author NeoZeng neozng1@hnu.edu.cn
* @brief pubsub机制,
* @version 0.1
* @date 2022-11-30
*
* @copyright Copyright (c) 2022
*
*/
#ifndef PUBSUB_H
#define PUBSUB_H
#include "stdint.h"
#define MAX_TOPIC_NAME_LEN 32 // 最大的话题名长度,每个话题都有字符串来命名
#define MAX_TOPIC_COUNT 12 // 最多支持的话题数量
#define QUEUE_SIZE 1
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 topic_name[MAX_TOPIC_NAME_LEN + 1]; // 1个字节用于存放字符串结束符 '\0'
uint8_t data_len; // 该话题的数据长度
/* 指向第一个订阅了该话题的订阅者,通过链表访问所有订阅者 */
Subscriber_t *first_subs;
/* 指向下一个Publisher的指针 */
struct ent *next_topic_node;
uint8_t pub_registered_flag; // 用于标记该发布者是否已经注册
} 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
* @return uint8_t
*/
uint8_t PubPushMessage(Publisher_t *pub, void *data_ptr);
#endif // !PUBSUB_H