canctrl.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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. mptheadstate = new std::thread(&canctrl::threadstate,this);
  26. }
  27. canctrl::~canctrl()
  28. {
  29. mpcan->stopdev();
  30. delete mpcan;
  31. mbstaterun = false;
  32. mptheadstate->join();
  33. iv::modulecomm::Unregister(mpasend0);
  34. iv::modulecomm::Unregister(mpcanState);
  35. iv::modulecomm::Unregister(mparecv0);
  36. }
  37. void canctrl::threadstate()
  38. {
  39. int ncount = 0;
  40. while(mbstaterun)
  41. {
  42. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  43. ncount++;
  44. if(ncount>=10)
  45. {
  46. ncount = 0;
  47. proCanSt.set_b_canstate(true);
  48. int nsize = proCanSt.ByteSize();
  49. std::shared_ptr<char > strdata_ptr= std::shared_ptr<char>(new char[nsize]);
  50. if(proCanSt.SerializeToArray(strdata_ptr.get(),nsize))
  51. {
  52. iv::modulecomm::ModuleSendMsg(mpcanState,strdata_ptr.get(),nsize);
  53. }
  54. }
  55. }
  56. std::cout<<"threadstate exit."<<std::endl;
  57. }
  58. void canctrl::run()
  59. {
  60. QTime xTime;
  61. xTime.start();
  62. int nOldTime = xTime.elapsed();
  63. int i;
  64. while(!isInterruptionRequested())
  65. {
  66. if(mbCANOpen)
  67. {
  68. basecan_msg xmsg[2500];
  69. int nRec1,nRec2,nSend1,nSend2;
  70. if((nRec1 =mpcan->GetMessage(0,xmsg,2500))>0)
  71. {
  72. sharecanmsg(mparecv0,xmsg,nRec1,0);
  73. }
  74. nSend1 = 0;
  75. nSend2 = 0;
  76. msleep(1);
  77. }
  78. else
  79. {
  80. msleep(1);
  81. mpcan->mivlog->error("%s open can card fail",__func__);
  82. if(xTime.elapsed()>1000)
  83. {
  84. qDebug("Not Open CANCARD exceed 1 second. so exit program.");
  85. exit(-1);
  86. }
  87. }
  88. // mpcan->mfault->SetFaultState(0, 0, "ok");
  89. }
  90. qDebug("thread canctrl complete.");
  91. }
  92. void canctrl::onCANState(bool bCAN, int nR, const char *strres)
  93. {
  94. mbCANOpen = bCAN;
  95. mpcan->mivlog->info("can","canstate is %s ",strres);
  96. }
  97. void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
  98. {
  99. std::vector<basecan_msg> * psendmsgvector;
  100. QMutex * pMutex;
  101. pMutex = &mMutexcan1;
  102. psendmsgvector = &msendmsgvector1;
  103. if(psendmsgvector->size() > SENDMSGBUFSIZE)
  104. {
  105. mpcan->mivlog->warn("sendmsg buf full");
  106. return;
  107. }
  108. pMutex->lock();
  109. if(psendmsgvector->size() > 1000)psendmsgvector->clear();
  110. int i;
  111. for(i=0;i<xmsg.rawmsg_size();i++)
  112. {
  113. basecan_msg sendmsg;
  114. iv::can::canraw x;
  115. x.CopyFrom(xmsg.rawmsg(i));
  116. sendmsg.id = x.id();
  117. sendmsg.isExtern = x.bext();
  118. sendmsg.isRemote = x.bremote();
  119. #ifdef SEND_STAT
  120. sendmsg.mSetTime = QDateTime::currentMSecsSinceEpoch();
  121. #endif
  122. int nlen = x.len();
  123. if((nlen < 0) || (nlen > 8))
  124. {
  125. nlen = 0;
  126. mpcan->mivlog->warn("sendmsg nlen err");
  127. continue;
  128. // mpcan->mfault->SetFaultState(1, 0, "sendmsg nlen err");
  129. }
  130. sendmsg.nLen = nlen;
  131. if(sendmsg.nLen > 0)
  132. {
  133. memcpy(sendmsg.data,x.data().data(),sendmsg.nLen);
  134. }
  135. psendmsgvector->push_back(sendmsg);
  136. }
  137. pMutex->unlock();
  138. if(mbCANOpen)
  139. {
  140. mMutexcan1.lock();
  141. for(i=0;i<msendmsgvector1.size();i++)
  142. {
  143. mpcan->SetMessage(0,&(msendmsgvector1.at(i)));
  144. }
  145. msendmsgvector1.clear();
  146. mMutexcan1.unlock();
  147. mpcan->CmdSend();
  148. }
  149. }
  150. void canctrl::sharecanmsg(void *xpa, basecan_msg * pxmsg,int ncount,int nch)
  151. {
  152. iv::can::canmsg xmsg;
  153. int i;
  154. for(i=0;i<ncount;i++)
  155. {
  156. iv::can::canraw * praw = xmsg.add_rawmsg();
  157. praw->set_id(pxmsg[i].id);
  158. praw->set_data(pxmsg[i].data,8);
  159. praw->set_bext(pxmsg[i].isExtern);
  160. praw->set_bremote(pxmsg[i].isRemote);
  161. praw->set_rectime(QDateTime::currentMSecsSinceEpoch());
  162. praw->set_len(pxmsg[i].nLen);
  163. }
  164. xmsg.set_channel(nch);
  165. xmsg.set_index(mindex[nch]);
  166. mindex[nch]++;
  167. int nsize = xmsg.ByteSize();
  168. char * strdata = new char[xmsg.ByteSize()];
  169. if(xmsg.SerializePartialToArray(strdata,nsize))
  170. {
  171. iv::modulecomm::ModuleSendMsg(xpa,strdata,nsize);
  172. }
  173. else
  174. {
  175. mpcan->mivlog->warn("canctrl::sharecanmsg serialize error");
  176. // mpcan->mfault->SetFaultState(1, 0, "sharecanmsg serialize error");
  177. }
  178. delete strdata;
  179. }