canctrl.cpp 5.7 KB

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