kvasercan.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include "kvasercan.h"
  2. #include <QTime>
  3. #include <iostream>
  4. #define BUF_SIZE 1000
  5. long gbaudlist[] = {canBITRATE_10K,canBITRATE_50K,canBITRATE_100K,canBITRATE_125K,
  6. canBITRATE_250K,canBITRATE_500K,canBITRATE_1M};
  7. extern iv::Ivfault *gfault;
  8. extern iv::Ivlog *givlog;
  9. kvasercan::kvasercan(int ch1baudindex,int ch2baudindex)
  10. {
  11. mbaud1 = canBITRATE_500K;
  12. mbaud2 = canBITRATE_500K;
  13. if((ch1baudindex>=0)&&(ch1baudindex<=6))
  14. {
  15. mbaud1 = gbaudlist[ch1baudindex];
  16. }
  17. if((ch2baudindex>=0)&&(ch2baudindex<=6))
  18. {
  19. mbaud2 = gbaudlist[ch2baudindex];
  20. }
  21. }
  22. void kvasercan::run()
  23. {
  24. canStatus stat;
  25. mbRunning = false;
  26. mkvaserch1 = canOpenChannel(0, 0);
  27. if(mkvaserch1 < 0)
  28. {
  29. emit SIG_CANOPENSTATE(false,-1,"open ch1 fail");
  30. return;
  31. }
  32. mkvaserch2 = canOpenChannel(1,0);
  33. if(mkvaserch2 <0)
  34. {
  35. emit SIG_CANOPENSTATE(false,-2,"open ch2 fail");
  36. return;
  37. }
  38. stat = canSetBusParams(mkvaserch1, mbaud1, 0, 0, 0, 0, 0);
  39. if (stat != canOK) {
  40. emit SIG_CANOPENSTATE(false,-3,"ch1 SetBusParams fail");
  41. return;
  42. }
  43. stat = canBusOn(mkvaserch1);
  44. if (stat != canOK) {
  45. emit SIG_CANOPENSTATE(false,-4,"ch1 Buson fail");
  46. return;
  47. }
  48. stat = canSetBusParams(mkvaserch2, mbaud2, 0, 0, 0, 0, 0);
  49. if (stat != canOK) {
  50. emit SIG_CANOPENSTATE(false,-5,"ch2 SetBusParams fail");
  51. return;
  52. }
  53. stat = canBusOn(mkvaserch2);
  54. if (stat != canOK) {
  55. emit SIG_CANOPENSTATE(false,-6,"ch2 Buson fail");
  56. return;
  57. }
  58. mbCANOpen = true;
  59. emit SIG_CANOPENSTATE(true,0,"open can card successfully");
  60. mkvaserch[0] = mkvaserch1;
  61. mkvaserch[1] = mkvaserch2;
  62. int nch;
  63. int res;
  64. while((!QThread::isInterruptionRequested())&&(mbCANOpen))
  65. {
  66. for(nch=0;nch < 2;nch++)
  67. {
  68. // res = VCI_Receive(4, mnDevNum, nch, receivedata, 2500, 100);
  69. long id;
  70. char msgdata[8];
  71. unsigned int dlc;
  72. unsigned int flag;
  73. unsigned long time;
  74. stat = canRead(mkvaserch[nch],&id,msgdata,&dlc,&flag,&time);
  75. if(stat == canOK)
  76. {
  77. // qDebug("nch %d id is %x",nch,id);
  78. mMutex.lock();
  79. basecan_msg msg;
  80. msg.id = id;
  81. // msg.isExtern = receivedata[i].ExternFlag;
  82. msg.isRemote = false;
  83. msg.nLen = dlc;
  84. memcpy(msg.data,msgdata,8);
  85. if(mMsgRecvBuf[nch].size()<BUF_SIZE)
  86. {
  87. mMsgRecvBuf[nch].push_back(msg);
  88. }
  89. mMutex.unlock();
  90. }
  91. else
  92. {
  93. if(stat != canERR_NOMSG)
  94. {
  95. givlog->error("check CAN, CAN Have Error,Error code is %d",(int)stat);
  96. gfault->SetFaultState(1, 0, "canErr");
  97. }
  98. else
  99. {
  100. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  101. }
  102. }
  103. }
  104. for(nch =0;nch<2;nch++)
  105. {
  106. std::vector<basecan_msg> xMsgSendBuf;
  107. mMutex.lock();
  108. // xMsgSendBuf = mMsgSendBuf[nch];
  109. int j;
  110. for(j=0;j<mMsgSendBuf[nch].size();j++)
  111. {
  112. xMsgSendBuf.push_back(mMsgSendBuf[nch][j]);
  113. }
  114. mMsgSendBuf[nch].clear();
  115. mMutex.unlock();
  116. for(j=0;j<xMsgSendBuf.size();j++)
  117. {
  118. // qDebug("%ld ch is %d ",QDateTime::currentMSecsSinceEpoch(),nch);
  119. // qDebug("%02x %02x %02x %02x ",xMsgSendBuf[j].data[0],xMsgSendBuf[j].data[1],xMsgSendBuf[j].data[3],
  120. // xMsgSendBuf[j].data[4]);
  121. canWrite(mkvaserch[nch],xMsgSendBuf[j].id,(void *)xMsgSendBuf[j].data,xMsgSendBuf[j].nLen,canMSG_STD);
  122. // canFlushTransmitQueue(mkvaserch[nch]);
  123. // qDebug("time is %ld",QDateTime::currentMSecsSinceEpoch());
  124. }
  125. xMsgSendBuf.clear();
  126. }
  127. // std::this_thread::sleep_for(std::chrono::milliseconds(1));
  128. }
  129. }
  130. void kvasercan::startdev()
  131. {
  132. start();
  133. }
  134. void kvasercan::stopdev()
  135. {
  136. requestInterruption();
  137. QTime xTime;
  138. xTime.start();
  139. while(xTime.elapsed()<100)
  140. {
  141. if(mbRunning == false)
  142. {
  143. givlog->warn("can is closed at %d",xTime.elapsed());
  144. break;
  145. }
  146. }
  147. }
  148. int kvasercan::GetMessage(const int nch,basecan_msg *pMsg, const int nCap)
  149. {
  150. if((nch>1)||(nch < 0))return -1;
  151. if(mMsgRecvBuf[nch].size() == 0)return 0;
  152. int nRtn;
  153. nRtn = nCap;
  154. mMutex.lock();
  155. if(nRtn > mMsgRecvBuf[nch].size())nRtn = mMsgRecvBuf[nch].size();
  156. int i;
  157. for(i=0;i<nRtn;i++)
  158. {
  159. memcpy(&pMsg[i],&(mMsgRecvBuf[nch].at(i)),sizeof(basecan_msg));
  160. }
  161. std::vector<basecan_msg>::iterator iter;
  162. iter = mMsgRecvBuf[nch].begin();
  163. for(i=0;i<nRtn;i++)
  164. {
  165. iter = mMsgRecvBuf[nch].erase(iter);
  166. }
  167. mMutex.unlock();
  168. return nRtn;
  169. }
  170. int kvasercan::SetMessage(const int nch, basecan_msg *pMsg)
  171. {
  172. if((nch>1)||(nch < 0))return -1;
  173. if(mMsgSendBuf[nch].size() > BUF_SIZE)return -2;
  174. mMutex.lock();
  175. mMsgSendBuf[nch].push_back(*pMsg);
  176. mMutex.unlock();
  177. return 0;
  178. }