sentry_gimbal_hzz/modules/message_center/message_center.h

116 lines
2.8 KiB
C
Raw Normal View History

/**
* @file message_center.h
* @author NeoZeng neozng1@hnu.edu.cn
* @brief pubsub机制,
* @todo -pubsub机制
* @version 0.1
* @date 2022-11-30
*
* @copyright Copyright (c) 2022
*
*/
#ifndef PUBSUB_H
#define PUBSUB_H
#include "stdint-gcc.h"
#define MAX_EVENT_NAME_LEN 32 //最大的事件名长度,每个事件都有字符串来命名
#define MAX_EVENT_COUNT 12 //最多支持的事件数量
#define QUEUE_SIZE 1
/**
* @brief ,app的"回调函数"
*
*/
void MessageInit();
/**
* @brief
*
* @param name ,MAX_EVENT_NAME_LEN
* @param data
*/
void PublisherRegister(char* name,void* data);
/**
* @brief ,
*
* @param name
* @param data ,,(&)
*/
void SubscribeEvent(char* name,void** data);
#endif // !PUBSUB_H
/* 以下是队列版的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+2];
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);