现在slam车的主控板和上位机一般都是通过串口来通信,接收到的数据直接进入ringbuffer队列里,主控需要从队列里提取每帧数据然后转发给执行部件,我这里采用单帧长度的循环链表来筛选指定帧数据再转发。
class ChainNode {
public:
ChainNode* m_next;
ChainNode* m_prev;
int data;
};
class ChainList {
public:
ChainList(int list_size);
~ChainList();
public:
ChainNode *ChainHead;
void ChainSetData(int mValue);
void ChainPrevious();
void ChainNext();
int ChainGetData();
};
ChainList::ChainList(int list_size)
{
ChainNode* ChainNodeHead = NULL;
ChainNode* ChainNodeTmp = NULL;
if(list_size > 0)
{
ChainNodeHead = new ChainNode;
ChainNodeHead->m_next = ChainNodeHead;
ChainNodeHead->m_prev = ChainNodeHead;
ChainNodeHead->data = 0;
for(int i=0; i < list_size - 1; i++)
{
ChainNodeTmp = new ChainNode;
ChainNodeTmp->m_next = ChainNodeHead->m_next;
ChainNodeTmp->m_prev = ChainNodeHead;
ChainNodeTmp->data = 0;
ChainNodeHead->m_next = ChainNodeTmp;
ChainNodeTmp->m_next->m_prev = ChainNodeHead->m_next;
ChainNodeTmp = NULL;
}
ChainHead = ChainNodeHead;
}
}
int ChainList::ChainGetData()
{
return ChainHead->data;
}
void ChainList::ChainNext()
{
ChainHead = ChainHead->m_next;
}
void ChainList::ChainPrevious()
{
ChainHead = ChainHead->m_prev;
}
void ChainList::ChainSetData(int mValue)
{
ChainHead->data = mValue;
}
ChainList::~ChainList()
{
ChainNode* q = ChainHead;
ChainNode* p = ChainHead->m_next;
ChainNode* t = NULL;
while(q != p)
{
t = p;
p = p->m_next;
delete t;
}
delete q;
}