#include "cansend_consumer.h" #include "decode_cfg.h" extern setupConfig_t setupConfig; #include "iv_msgunit.h" extern iv::msgunit shmCANSend; CANSend_Consumer::CANSend_Consumer(CAN_Producer_Consumer *pBuf) { pBuffer = pBuf; } CANSend_Consumer::~CANSend_Consumer() { requestInterruption(); while(this->isFinished() == false); } void CANSend_Consumer::run() { QTime xTime; xTime.start(); int lastTime = xTime.elapsed(); uint64_t interval = 20; //interval time should more than 10 ms uint64_t CANPackageIndex = 0; uint8_t CANPackageChannel; iv::can::canmsg xmsg; if(setupConfig.strMemCANSend == "cansend0") CANPackageChannel = 0; else CANPackageChannel = 1; while (!QThread::isInterruptionRequested()) { pBuffer->Consume_Element_To_CANMsg(xmsg); //this function is block mode if(abs(xTime.elapsed() - lastTime)>=interval || xmsg.rawmsg_size() > 3500) { //update timer lastTime = xTime.elapsed(); if(xmsg.rawmsg_size()>0) //actrully, because the fucntion before this is block mode, this determine is allways true, just for safety { //pack xmsg.set_index(CANPackageIndex); xmsg.set_channel(CANPackageChannel); xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch()); //send int ndatasize = xmsg.ByteSize(); char * strser = new char[ndatasize]; std::shared_ptr pstrser; pstrser.reset(strser); if(xmsg.SerializePartialToArray(strser,ndatasize)) { iv::modulecomm::ModuleSendMsg(shmCANSend.mpa,strser,ndatasize); } else { std::cout<<"CANSend_Consumer serialize error."<