用循环链表来获取完整帧数据

现在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;
}

猜你喜欢

转载自blog.csdn.net/xinaitui6823/article/details/86310843