cansend_consumer.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "cansend_consumer.h"
  2. #include "decode_cfg.h"
  3. extern setupConfig_t setupConfig;
  4. #include "iv_msgunit.h"
  5. extern iv::msgunit shmCANSend;
  6. CANSend_Consumer::CANSend_Consumer(CAN_Producer_Consumer *pBuf)
  7. {
  8. pBuffer = pBuf;
  9. }
  10. CANSend_Consumer::~CANSend_Consumer()
  11. {
  12. requestInterruption();
  13. while(this->isFinished() == false);
  14. }
  15. void CANSend_Consumer::run()
  16. {
  17. QTime xTime;
  18. xTime.start();
  19. int lastTime = xTime.elapsed();
  20. uint64_t interval = 20; //interval time should more than 10 ms
  21. uint64_t CANPackageIndex = 0;
  22. uint8_t CANPackageChannel;
  23. iv::can::canmsg xmsg;
  24. if(setupConfig.strMemCANSend == "cansend0")
  25. CANPackageChannel = 0;
  26. else
  27. CANPackageChannel = 1;
  28. while (!QThread::isInterruptionRequested())
  29. {
  30. pBuffer->Consume_Element_To_CANMsg(xmsg); //this function is block mode
  31. if(abs(xTime.elapsed() - lastTime)>=interval || xmsg.rawmsg_size() > 3500)
  32. {
  33. //update timer
  34. lastTime = xTime.elapsed();
  35. if(xmsg.rawmsg_size()>0) //actrully, because the fucntion before this is block mode, this determine is allways true, just for safety
  36. {
  37. //pack
  38. xmsg.set_index(CANPackageIndex);
  39. xmsg.set_channel(CANPackageChannel);
  40. xmsg.set_mstime(QDateTime::currentMSecsSinceEpoch());
  41. //send
  42. int ndatasize = xmsg.ByteSize();
  43. char * strser = new char[ndatasize];
  44. std::shared_ptr<char> pstrser;
  45. pstrser.reset(strser);
  46. if(xmsg.SerializePartialToArray(strser,ndatasize))
  47. {
  48. iv::modulecomm::ModuleSendMsg(shmCANSend.mpa,strser,ndatasize);
  49. }
  50. else
  51. {
  52. std::cout<<"CANSend_Consumer serialize error."<<std::endl;
  53. }
  54. //clear and update index
  55. xmsg.clear_rawmsg();
  56. CANPackageIndex++;
  57. }
  58. else
  59. std::cout << "rawmsg size is zero, no data need to be send." << std::endl;
  60. }
  61. }
  62. }