vcican.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #include "vcican.h"
  2. #include <QTime>
  3. #include <iostream>
  4. #define VCI_ACCCODE_DEFAULT 0x00000000
  5. #define VCI_ACCMASK_DEFAULT 0xFFFFFFFF
  6. #define VCI_TIMER0_DEFAULT 0x00
  7. #define VCI_TIMER1_DEFAULT 0x1C
  8. #define VCI_FILTER_DEFAULT 1
  9. #define VCI_MODE_DEFAULT 0
  10. //unsigned char gbaudtiming0[] = {0xBF,0x31,0x18,0x87,0x09,0x83,0x04,0x03,0x81,0x01,0x80,0x00,0x80,0x00,0x00};
  11. //unsigned char gbaudtiming1[] = {0xFF,0x1C,0x1C,0xFF,0x1C,0xFF,0x1C,0x1C,0xFA,0x1C,0xFA,0x1C,0xB6,0x16,0x14};
  12. unsigned char gbaudtiming0[] = {0x31,0x09,0x04,0x03,0x01,0x00,0x00};
  13. unsigned char gbaudtiming1[] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x14};
  14. extern iv::Ivfault *mfault;
  15. extern iv::Ivlog *mivlog;
  16. #define BUF_SIZE 1000
  17. #include <QDateTime>
  18. vcican::vcican(int devnum,int nbaudindex,int nch2baudindex )
  19. {
  20. #ifdef IV_WIN
  21. LoadVCILibrary();
  22. #endif
  23. mnDevNum = devnum;
  24. unsigned char timing0,timing1;
  25. mfault = new iv::Ivfault("can_vci");
  26. mivlog = new iv::Ivlog("can_vci");
  27. timing0 = 0x00;
  28. timing1 = 0x1C;
  29. if((nbaudindex>=0)&&(nbaudindex<=6))
  30. {
  31. timing0 = gbaudtiming0[nbaudindex];
  32. timing1 = gbaudtiming1[nbaudindex];
  33. }
  34. initconfig.AccCode = VCI_ACCCODE_DEFAULT;
  35. initconfig.AccMask = VCI_ACCMASK_DEFAULT;
  36. initconfig.Timing0 = timing0;
  37. initconfig.Timing1 = timing1;
  38. initconfig.Filter = VCI_FILTER_DEFAULT;
  39. initconfig.Mode = VCI_MODE_DEFAULT;
  40. if((nch2baudindex>=0)&&(nch2baudindex<=6))
  41. {
  42. timing0 = gbaudtiming0[nch2baudindex];
  43. timing1 = gbaudtiming1[nch2baudindex];
  44. }
  45. initconfig2.AccCode = VCI_ACCCODE_DEFAULT;
  46. initconfig2.AccMask = VCI_ACCMASK_DEFAULT;
  47. initconfig2.Timing0 = timing0;
  48. initconfig2.Timing1 = timing1;
  49. initconfig2.Filter = VCI_FILTER_DEFAULT;
  50. initconfig2.Mode = VCI_MODE_DEFAULT;
  51. }
  52. void vcican::run()
  53. {
  54. mbRunning = true;
  55. int init;
  56. int nch;
  57. int i;
  58. VCI_CAN_OBJ receivedata[2500];
  59. int nRecFail = 0;
  60. int nsend = 0;
  61. int res;
  62. int status = VCI_OpenDevice(4,mnDevNum, 0); //打开设备0
  63. if(status != 1)
  64. {
  65. mivlog->error("open can card fail");
  66. std::cout<<"open can card fail"<<std::endl;
  67. mfault->SetFaultState(1, 0, "Open can card fail");
  68. VCI_CloseDevice(4,mnDevNum);
  69. emit SIG_CANOPENSTATE(false,-1,"open can card fail");
  70. goto VCIEND;
  71. }
  72. init = VCI_InitCAN(4,mnDevNum,0, &initconfig); //初始化设备
  73. if (init == 1)
  74. {
  75. if (VCI_StartCAN(4,mnDevNum,0) == 1) {
  76. }
  77. else
  78. {
  79. VCI_CloseDevice(4,mnDevNum);
  80. emit SIG_CANOPENSTATE(false,-2,"start ch0 error");
  81. goto VCIEND;
  82. }
  83. }
  84. else
  85. {
  86. VCI_CloseDevice(4,mnDevNum);
  87. emit SIG_CANOPENSTATE(false,-3,"init ch0 error");
  88. goto VCIEND;
  89. }
  90. init = VCI_InitCAN(4,mnDevNum,1, &initconfig2); //初始化设备
  91. if (init == 1)
  92. {
  93. if (VCI_StartCAN(4,mnDevNum,1) == 1) {
  94. }
  95. else
  96. {
  97. VCI_CloseDevice(4,mnDevNum);
  98. emit SIG_CANOPENSTATE(false,-4,"start ch1 error");
  99. goto VCIEND;
  100. }
  101. }
  102. else
  103. {
  104. VCI_CloseDevice(4,mnDevNum);
  105. emit SIG_CANOPENSTATE(false,-6,"init ch1 error");
  106. goto VCIEND;
  107. }
  108. VCI_BOARD_INFO xbi;
  109. VCI_ReadBoardInfo(4,mnDevNum,&xbi);
  110. strncpy(mstrsn,xbi.str_Serial_Num,100);
  111. // mivlog->verbose("sn is %s",mstrsn);
  112. mbCANOpen = true; //01910000837 01910000829
  113. emit SIG_CANOPENSTATE(true,0,"open can card successfully");
  114. std::cout<<"open vci can card successfully."<<std::endl;
  115. // VCI_BOARD_INFO xinfo;
  116. // VCI_ReadBoardInfo(4,mnDevNum,&xinfo);
  117. // if(strcmp(xinfo.str_Serial_Num,"019100007B2") == 0)
  118. // {
  119. // std::cout<<"card is ok."<<std::endl;
  120. // }
  121. // else
  122. // {
  123. // std::cout<<"not this card."<<std::endl;
  124. // }
  125. while((!QThread::isInterruptionRequested())&&(mbCANOpen))
  126. {
  127. for(nch=0;nch < 2;nch++)
  128. {
  129. res = VCI_Receive(4, mnDevNum, nch, receivedata, 2500, 5);
  130. if(res > 0)
  131. {
  132. mivlog->verbose("vci","has data");
  133. nRecFail = 0;
  134. mMutex.lock();
  135. for(i=0;i<res;i++)
  136. {
  137. basecan_msg msg;
  138. msg.id = receivedata[i].ID;
  139. mivlog->verbose("vci","id %x",msg.id);
  140. msg.isExtern = receivedata[i].ExternFlag;
  141. msg.isRemote = receivedata[i].RemoteFlag;
  142. msg.nLen = receivedata[i].DataLen;
  143. memcpy(msg.data,receivedata[i].Data,8);
  144. if(mMsgRecvBuf[nch].size()<BUF_SIZE)
  145. {
  146. mMsgRecvBuf[nch].push_back(msg);
  147. }
  148. }
  149. mMutex.unlock();
  150. }
  151. else
  152. {
  153. if(res < 0)nRecFail++;
  154. }
  155. }
  156. for(nch =0;nch<2;nch++)
  157. {
  158. nsend = 0;
  159. mMutex.lock();
  160. // qDebug("size is %d time is %ld",mMsgSendBuf[nch].size(),QDateTime::currentMSecsSinceEpoch());
  161. for(i=0;i<mMsgSendBuf[nch].size();i++)
  162. {
  163. if(i>=2500)break;
  164. memcpy(receivedata[i].Data,mMsgSendBuf[nch].at(i).data,8);
  165. receivedata[i].ID = mMsgSendBuf[nch].at(i).id;
  166. receivedata[i].ExternFlag = mMsgSendBuf[nch].at(i).isExtern;
  167. receivedata[i].RemoteFlag = mMsgSendBuf[nch].at(i).isRemote;
  168. receivedata[i].DataLen = mMsgSendBuf[nch].at(i).nLen;
  169. nsend++;
  170. }
  171. mMsgSendBuf[nch].clear();
  172. // qDebug("nsend is %d ",nsend);
  173. // qDebug("size is %d ",mMsgSendBuf[nch].size());
  174. mMutex.unlock();
  175. if(nsend > 0)
  176. {
  177. res = VCI_Transmit(4,mnDevNum,nch,receivedata,nsend);
  178. }
  179. }
  180. std::this_thread::sleep_for(std::chrono::milliseconds(1));
  181. }
  182. VCI_CloseDevice(4,mnDevNum);
  183. emit SIG_CANOPENSTATE(false,0,"close can card successfully");
  184. VCIEND:
  185. mbRunning = false;
  186. }
  187. void vcican::startdev()
  188. {
  189. start();
  190. }
  191. void vcican::stopdev()
  192. {
  193. requestInterruption();
  194. QTime xTime;
  195. xTime.start();
  196. while(xTime.elapsed()<100)
  197. {
  198. if(mbRunning == false)
  199. {
  200. // mivlog->warn("can is closed at %d",xTime.elapsed());
  201. break;
  202. }
  203. }
  204. }
  205. char * vcican::GetSerialNum()
  206. {
  207. return mstrsn;
  208. }
  209. int vcican::GetMessage(const int nch,basecan_msg *pMsg, const int nCap)
  210. {
  211. if((nch>1)||(nch < 0))return -1;
  212. if(mMsgRecvBuf[nch].size() == 0)return 0;
  213. int nRtn;
  214. nRtn = nCap;
  215. mMutex.lock();
  216. if(nRtn > mMsgRecvBuf[nch].size())nRtn = mMsgRecvBuf[nch].size();
  217. int i;
  218. for(i=0;i<nRtn;i++)
  219. {
  220. memcpy(&pMsg[i],&(mMsgRecvBuf[nch].at(i)),sizeof(basecan_msg));
  221. }
  222. std::vector<basecan_msg>::iterator iter;
  223. iter = mMsgRecvBuf[nch].begin();
  224. for(i=0;i<nRtn;i++)
  225. {
  226. iter = mMsgRecvBuf[nch].erase(iter);
  227. }
  228. mMutex.unlock();
  229. return nRtn;
  230. }
  231. int vcican::SetMessage(const int nch, basecan_msg *pMsg)
  232. {
  233. if((nch>1)||(nch < 0))return -1;
  234. // qDebug("send.");
  235. if(mMsgSendBuf[nch].size() > BUF_SIZE)return -2;
  236. mMutex.lock();
  237. mMsgSendBuf[nch].push_back(*pMsg);
  238. mMutex.unlock();
  239. return 0;
  240. }