#include "can_producer_consumer.h" #include CAN_Producer_Consumer::CAN_Producer_Consumer(const int bufSize) { bufferSize = bufSize; buffer.resize(bufferSize); freeSpace.release(bufferSize); } uint64_t CAN_Producer_Consumer::Produce_Element(const iv::can::canraw &xraw) //return the position of first element int this storage { uint64_t tempPtr = producerPtr % bufferSize; freeSpace.acquire(); producerLock.lock(); buffer[producerPtr++ % bufferSize] = xraw; producerLock.unlock(); usedSpace.release(); return tempPtr; } uint64_t CAN_Producer_Consumer::Produce_Elements(const iv::can::canmsg &xmsg,const int &size) { uint64_t tempPtr = producerPtr % bufferSize; if(size < xmsg.rawmsg_size()) { std::cout<<"Warning! the input size is less than the number of message element."< xmsg.rawmsg_size()) std::cout<<"Warning! the input size is more than the number of message element."<CopyFrom(buffer.at(consumerPtr++ % bufferSize)); } consumerLock.unlock(); freeSpace.release(size); return xmsg; } uint64_t CAN_Producer_Consumer::Consume_Element_To_CANMsg(iv::can::canmsg &xmsg) { uint64_t tempPtr = consumerPtr % bufferSize; usedSpace.acquire(); //this function is block mode iv::can::canraw *praw = xmsg.add_rawmsg(); consumerLock.lock(); praw->CopyFrom(buffer.at(consumerPtr++ % bufferSize)); consumerLock.unlock(); freeSpace.release(); return tempPtr; } uint64_t CAN_Producer_Consumer::Consume_Element_To_CANMsg(iv::can::canmsg &xmsg,int timeout) { uint64_t tempPtr = consumerPtr % bufferSize; bool tempResult = usedSpace.tryAcquire(1,timeout); //this function is block mode if(tempResult) { iv::can::canraw *praw = xmsg.add_rawmsg(); consumerLock.lock(); praw->CopyFrom(buffer.at(consumerPtr++ % bufferSize)); consumerLock.unlock(); freeSpace.release(); } return tempPtr; }