123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #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<char> pstrser;
- pstrser.reset(strser);
- if(xmsg.SerializePartialToArray(strser,ndatasize))
- {
- iv::modulecomm::ModuleSendMsg(shmCANSend.mpa,strser,ndatasize);
- }
- else
- {
- std::cout<<"CANSend_Consumer serialize error."<<std::endl;
- }
- //clear and update index
- xmsg.clear_rawmsg();
- CANPackageIndex++;
- }
- else
- std::cout << "rawmsg size is zero, no data need to be send." << std::endl;
- }
- }
- }
|