canctrl.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. proCanSt.set_b_canstate(true);
  53. int nsize = proCanSt.ByteSize();
  54. std::shared_ptr<char > strdata_ptr= std::shared_ptr<char>(new char[nsize]);
  55. if(proCanSt.SerializeToArray(strdata_ptr.get(),nsize))
  56. {
  57. iv::modulecomm::ModuleSendMsg(mpcanState,strdata_ptr.get(),nsize);
  58. }
  59. msleep(1);
  60. }
  61. else
  62. {
  63. proCanSt.set_b_canstate(false);
  64. int nsize = proCanSt.ByteSize();
  65. char * strdata = new char[proCanSt.ByteSize()];
  66. if(proCanSt.SerializeToArray(strdata,nsize))
  67. {
  68. iv::modulecomm::ModuleSendMsg(mpcanState,strdata,nsize);
  69. }
  70. delete strdata;
  71. msleep(1);
  72. mpcan->mivlog->error("%s open can card fail",__func__);
  73. if(xTime.elapsed()>1000)
  74. {
  75. qDebug("Not Open CANCARD exceed 1 second. so exit program.");
  76. exit(-1);
  77. }
  78. }
  79. // mpcan->mfault->SetFaultState(0, 0, "ok");
  80. }
  81. qDebug("thread canctrl complete.");
  82. }
  83. void canctrl::onCANState(bool bCAN, int nR, const char *strres)
  84. {
  85. mbCANOpen = bCAN;
  86. mpcan->mivlog->info("can","canstate is %s ",strres);
  87. }
  88. void canctrl::sendmsg(int index, iv::can::canmsg xmsg)
  89. {
  90. std::vector<basecan_msg> * psendmsgvector;
  91. QMutex * pMutex;
  92. pMutex = &mMutexcan1;
  93. psendmsgvector = &msendmsgvector1;
  94. if(psendmsgvector->size() > SENDMSGBUFSIZE)
  95. {
  96. mpcan->mivlog->warn("sendmsg buf full");
  97. return;
  98. }
  99. pMutex->lock();
  100. if(psendmsgvector->size() > 1000)psendmsgvector->clear();
  101. int i;
  102. for(i=0;i<xmsg.rawmsg_size();i++)
  103. {
  104. basecan_msg sendmsg;
  105. iv::can::canraw x;
  106. x.CopyFrom(xmsg.rawmsg(i));
  107. sendmsg.id = x.id();
  108. sendmsg.isExtern = x.bext();
  109. sendmsg.isRemote = x.bremote();
  110. int nlen = x.len();
  111. if((nlen < 0) || (nlen > 8))
  112. {
  113. nlen = 0;
  114. mpcan->mivlog->warn("sendmsg nlen err");
  115. continue;
  116. // mpcan->mfault->SetFaultState(1, 0, "sendmsg nlen err");
  117. }
  118. sendmsg.nLen = nlen;
  119. if(sendmsg.nLen > 0)
  120. {
  121. memcpy(sendmsg.data,x.data().data(),sendmsg.nLen);
  122. }
  123. psendmsgvector->push_back(sendmsg);
  124. }
  125. pMutex->unlock();
  126. if(mbCANOpen)
  127. {
  128. mMutexcan1.lock();
  129. for(i=0;i<msendmsgvector1.size();i++)
  130. {
  131. mpcan->SetMessage(0,&(msendmsgvector1.at(i)));
  132. }
  133. msendmsgvector1.clear();
  134. mMutexcan1.unlock();
  135. mpcan->CmdSend();
  136. }
  137. }
  138. void canctrl::sharecanmsg(void *xpa, basecan_msg * pxmsg,int ncount,int nch)
  139. {
  140. iv::can::canmsg xmsg;
  141. int i;
  142. for(i=0;i<ncount;i++)
  143. {
  144. iv::can::canraw * praw = xmsg.add_rawmsg();
  145. praw->set_id(pxmsg[i].id);
  146. praw->set_data(pxmsg[i].data,8);
  147. praw->set_bext(pxmsg[i].isExtern);
  148. praw->set_bremote(pxmsg[i].isRemote);
  149. praw->set_rectime(QDateTime::currentMSecsSinceEpoch());
  150. praw->set_len(pxmsg[i].nLen);
  151. }
  152. xmsg.set_channel(nch);
  153. xmsg.set_index(mindex[nch]);
  154. mindex[nch]++;
  155. int nsize = xmsg.ByteSize();
  156. char * strdata = new char[xmsg.ByteSize()];
  157. if(xmsg.SerializePartialToArray(strdata,nsize))
  158. {
  159. iv::modulecomm::ModuleSendMsg(xpa,strdata,nsize);
  160. }
  161. else
  162. {
  163. mpcan->mivlog->warn("canctrl::sharecanmsg serialize error");
  164. // mpcan->mfault->SetFaultState(1, 0, "sharecanmsg serialize error");
  165. }
  166. delete strdata;
  167. }