用迴圈連結串列來獲取完整幀資料
現在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;
}