canctrl.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "canctrl.h"
  2. #include <memory>
  3. canctrl * gc;
  4. static iv::canstate::canstate proCanSt;
  5. void Listencansend0(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  6. {
  7. iv::can::canmsg msg;
  8. if(false == msg.ParseFromArray(strdata,nSize))
  9. {
  10. std::cout<<"Listencansend Parse fail."<<std::endl;
  11. return;
  12. }
  13. gc->sendmsg(0,msg);
  14. }
  15. canctrl::canctrl(const char * strmemsend0,const char * strmemrecv0,const char * strcansend)
  16. {
  17. gc = this;
  18. mparecv0 = iv::modulecomm::RegisterSend(strmemrecv0,100000,3);
  19. mpcanState = iv::modulecomm::RegisterSend("canstate",18,3);
  20. mpasend0 = iv::modulecomm::RegisterRecv(strmemsend0,Listencansend0);
  21. mpcan = new nvcan(strcansend);
  22. mspcan.reset(mpcan);
  23. connect(mpcan,SIGNAL(SIG_CANOPENSTATE(bool,int,const char*)),this,SLOT(onCANState(bool,int,const char*)));
  24. mpcan->startdev();
  25. }
  26. canctrl::~canctrl()
  27. {
  28. mpcan->stopdev();
  29. delete mpcan;
  30. iv::modulecomm::Unregister(mpasend0);
  31. iv::modulecomm::Unregister(mpcanState);
  32. iv::modulecomm::Unregister(mparecv0);
  33. }
  34. void canctrl::run()
  35. {
  36. QTime xTime;
  37. xTime.start();
  38. int nOldTime = xTime.elapsed();
  39. int i;
  40. while(!isInterruptionRequested())
  41. {
  42. if(mbCANOpen)
  43. {
  44. basecan_msg xmsg[2500];
  45. int nRec1,nRec2,nSend1,nSend2;
  46. if((nRec1 =mpcan->GetMessage(0,xmsg,2500))>0)
  47. {
  48. sharecanmsg(mparecv0,xmsg,nRec1,0);
  49. }
  50. nSend1 = 0;
  51. nSend2 = 0;
  52. mMutexcan1.lock();
  53. for(i=0;i<msendmsgvector1.size();i++)
  54. {
  55. mpcan->SetMessage(0,&(msendmsgvector1.at(i)));
  56. }
  57. msendmsgvector1.clear();
  58. mMutexcan1.unlock();
  59. proCanSt.set_b_canstate(true);
  60. int nsize = proCanSt.ByteSize();
  61. std::shared_ptr<char > strdata_ptr= std::shared_ptr<char>(new char[nsize]);
  62. if(proCanSt.SerializeToArray(strdata_ptr.get(),nsize))
  63. {
  64. iv::modulecomm::ModuleSendMsg(mpcanState,strdata_ptr.get(),nsize);
  65. }
  66. msleep(1);
  67. }
  68. else
  69. {
  70. proCanSt.set_b_canstate(false);
  71. int nsize = proCanSt.ByteSize();
  72. char * strdata = new char[proCanSt.ByteSize()];
  73. if(proCanSt.SerializeToArray(strdata,nsize))
  74. {
  75. iv::modulecomm::ModuleSendMsg(mpcanState,strdata,nsize);
  76. }
  77. delete strdata;
  78. msleep(1);
  79. mpcan->mivlog->error("%s open can card fail",__func__);
  80. if(xTime.elapsed()>1000)
  81. {
  82. qDebug("Not Open CANCARD exceed 1 second. so exit program.");
  83. exit(-1);
  84. }
  85. }
  86. // mpcan->mfault->SetFaultState(0, 0, "ok");
  87. }
  88. qDebug("thread canctrl complete.");
  89. }
  90. void canctrl::onCANState(bool bCAN, int nR, const char *strres)
  91. {
  92. mbCANOpen = bCAN;
  93. mpcan->mivlog->info("can","canstate is %s ",strres);
  94. }
  95. void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
  96. {
  97. std::vector<basecan_msg> * psendmsgvector;
  98. QMutex * pMutex;
  99. pMutex = &mMutexcan1;
  100. psendmsgvector = &msendmsgvector1;
  101. if(psendmsgvector->size() > SENDMSGBUFSIZE)
  102. {
  103. mpcan->mivlog->warn("sendmsg buf full");
  104. return;
  105. }
  106. pMutex->lock();
  107. if(psendmsgvector->size() > 1000)psendmsgvector->clear();
  108. int i;
  109. for(i=0;i<xmsg.rawmsg_size();i++)
  110. {
  111. basecan_msg sendmsg;
  112. iv::can::canraw x;
  113. x.CopyFrom(xmsg.rawmsg(i));
  114. sendmsg.id = x.id();
  115. sendmsg.isExtern = x.bext();
  116. sendmsg.isRemote = x.bremote();
  117. int nlen = x.len();
  118. if((nlen < 0) || (nlen > 8))
  119. {
  120. nlen = 0;
  121. mpcan->mivlog->warn("sendmsg nlen err");
  122. continue;
  123. // mpcan->mfault->SetFaultState(1, 0, "sendmsg nlen err");
  124. }
  125. sendmsg.nLen = nlen;
  126. if(sendmsg.nLen > 0)
  127. {
  128. memcpy(sendmsg.data,x.data().data(),sendmsg.nLen);
  129. }
  130. psendmsgvector->push_back(sendmsg);
  131. }
  132. pMutex->unlock();
  133. }
  134. void canctrl::sharecanmsg(void *xpa, basecan_msg * pxmsg,int ncount,int nch)
  135. {
  136. iv::can::canmsg xmsg;
  137. int i;
  138. for(i=0;i<ncount;i++)
  139. {
  140. iv::can::canraw * praw = xmsg.add_rawmsg();
  141. praw->set_id(pxmsg[i].id);
  142. praw->set_data(pxmsg[i].data,8);
  143. praw->set_bext(pxmsg[i].isExtern);
  144. praw->set_bremote(pxmsg[i].isRemote);
  145. praw->set_rectime(QDateTime::currentMSecsSinceEpoch());
  146. praw->set_len(pxmsg[i].nLen);
  147. }
  148. xmsg.set_channel(nch);
  149. xmsg.set_index(mindex[nch]);
  150. mindex[nch]++;
  151. int nsize = xmsg.ByteSize();
  152. char * strdata = new char[xmsg.ByteSize()];
  153. if(xmsg.SerializePartialToArray(strdata,nsize))
  154. {
  155. iv::modulecomm::ModuleSendMsg(xpa,strdata,nsize);
  156. }
  157. else
  158. {
  159. mpcan->mivlog->warn("canctrl::sharecanmsg serialize error");
  160. // mpcan->mfault->SetFaultState(1, 0, "sharecanmsg serialize error");
  161. }
  162. delete strdata;
  163. }