mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-24 03:27:45 +08:00
修复PID堵转检测错误,修复LK电机位置环计算错误,更新文档,修改了消息中心的命名(不影响app层)
This commit is contained in:
@@ -5,17 +5,17 @@
|
||||
|
||||
/* message_center是fake head node,是方便链表编写的技巧,这样就不需要处理链表头的特殊情况 */
|
||||
static Publisher_t message_center = {
|
||||
.event_name = "Message_Manager",
|
||||
.topic_name = "Message_Manager",
|
||||
.first_subs = NULL,
|
||||
.next_event_node = NULL};
|
||||
.next_topic_node = NULL};
|
||||
|
||||
static void CheckName(char *name)
|
||||
{
|
||||
if (strnlen(name, MAX_EVENT_NAME_LEN + 1) >= MAX_EVENT_NAME_LEN)
|
||||
if (strnlen(name, MAX_TOPIC_NAME_LEN + 1) >= MAX_TOPIC_NAME_LEN)
|
||||
{
|
||||
LOGERROR("EVENT NAME TOO LONG:%s", name);
|
||||
while (1)
|
||||
; // 进入这里说明事件名超出长度限制
|
||||
; // 进入这里说明话题名超出长度限制
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ static void CheckLen(uint8_t len1, uint8_t len2)
|
||||
{
|
||||
LOGERROR("EVENT LEN NOT SAME:%d,%d", len1, len2);
|
||||
while (1)
|
||||
; // 进入这里说明相同事件的消息长度却不同
|
||||
; // 进入这里说明相同话题的消息长度却不同
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,28 +33,28 @@ Publisher_t *PubRegister(char *name, uint8_t data_len)
|
||||
{
|
||||
CheckName(name);
|
||||
Publisher_t *node = &message_center;
|
||||
while (node->next_event_node) // message_center会直接跳过,不需要特殊处理,这被称作dumb_head(编程技巧)
|
||||
while (node->next_topic_node) // message_center会直接跳过,不需要特殊处理,这被称作dumb_head(编程技巧)
|
||||
{
|
||||
node = node->next_event_node; // 切换到下一个发布者(事件)结点
|
||||
if (strcmp(node->event_name, name) == 0) // 如果已经注册了相同的事件,直接返回结点指针
|
||||
node = node->next_topic_node; // 切换到下一个发布者(话题)结点
|
||||
if (strcmp(node->topic_name, name) == 0) // 如果已经注册了相同的话题,直接返回结点指针
|
||||
{
|
||||
CheckLen(data_len, node->data_len);
|
||||
node->pub_registered_flag = 1;
|
||||
return node;
|
||||
}
|
||||
} // 遍历完发现尚未创建name对应的事件
|
||||
// 在链表尾部创建新的事件并初始化
|
||||
node->next_event_node = (Publisher_t *)malloc(sizeof(Publisher_t));
|
||||
memset(node->next_event_node, 0, sizeof(Publisher_t));
|
||||
node->next_event_node->data_len = data_len;
|
||||
strcpy(node->next_event_node->event_name, name);
|
||||
} // 遍历完发现尚未创建name对应的话题
|
||||
// 在链表尾部创建新的话题并初始化
|
||||
node->next_topic_node = (Publisher_t *)malloc(sizeof(Publisher_t));
|
||||
memset(node->next_topic_node, 0, sizeof(Publisher_t));
|
||||
node->next_topic_node->data_len = data_len;
|
||||
strcpy(node->next_topic_node->topic_name, name);
|
||||
node->pub_registered_flag = 1;
|
||||
return node->next_event_node;
|
||||
return node->next_topic_node;
|
||||
}
|
||||
|
||||
Subscriber_t *SubRegister(char *name, uint8_t data_len)
|
||||
{
|
||||
Publisher_t* pub = PubRegister(name, data_len); // 查找或创建该事件的发布者
|
||||
Publisher_t *pub = PubRegister(name, data_len); // 查找或创建该话题的发布者
|
||||
// 创建新的订阅者结点,申请内存,注意要memset因为新空间不一定是空的,可能有之前留存的垃圾值
|
||||
Subscriber_t *ret = (Subscriber_t *)malloc(sizeof(Subscriber_t));
|
||||
memset(ret, 0, sizeof(Subscriber_t));
|
||||
@@ -72,7 +72,7 @@ Subscriber_t *SubRegister(char *name, uint8_t data_len)
|
||||
}
|
||||
// 若该话题已经有订阅者, 遍历订阅者链表,直到到达尾部
|
||||
Subscriber_t *sub = pub->first_subs; // 作为iterator
|
||||
while (sub->next_subs_queue) // 遍历订阅了该事件的订阅者链表
|
||||
while (sub->next_subs_queue) // 遍历订阅了该话题的订阅者链表
|
||||
{
|
||||
sub = sub->next_subs_queue; // 移动到下一个订阅者,遇到空指针停下,说明到了链表尾部
|
||||
}
|
||||
@@ -96,8 +96,8 @@ uint8_t SubGetMessage(Subscriber_t *sub, void *data_ptr)
|
||||
uint8_t PubPushMessage(Publisher_t *pub, void *data_ptr)
|
||||
{
|
||||
static Subscriber_t *iter;
|
||||
iter = pub->first_subs; // iter作为订阅者指针,遍历订阅该事件的所有订阅者;如果为空说明遍历结束
|
||||
// 遍历订阅了当前事件的所有订阅者,依次填入最新消息
|
||||
iter = pub->first_subs; // iter作为订阅者指针,遍历订阅该话题的所有订阅者;如果为空说明遍历结束
|
||||
// 遍历订阅了当前话题的所有订阅者,依次填入最新消息
|
||||
while (iter)
|
||||
{
|
||||
if (iter->temp_size == QUEUE_SIZE) // 如果队列已满,则需要删除最老的数据(头部),再填入
|
||||
|
||||
Reference in New Issue
Block a user