rs71_usb_receiver.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. ******************************************************************************
  3. * @file : rs71_usb_receiver.cpp
  4. * @author : wangyingjie
  5. * @brief : None
  6. * @attention : None
  7. * @date : 2025/6/20
  8. ******************************************************************************
  9. */
  10. #include "rs71_usb_receiver.h"
  11. #include <cstdio>
  12. #include <cstring>
  13. RS71UsbReceiver::RS71UsbReceiver(unsigned devType, unsigned devIdx, unsigned chMask, unsigned baud)
  14. : devType(devType), devIdx(devIdx), chMask(chMask), baud(baud)
  15. {
  16. memset(rxThreads, 0, sizeof(rxThreads));
  17. }
  18. RS71UsbReceiver::~RS71UsbReceiver()
  19. {
  20. Stop();
  21. Close();
  22. }
  23. bool RS71UsbReceiver::init(unsigned devType, unsigned devIdx, unsigned chMask, unsigned baud)
  24. {
  25. this->devType = devType;
  26. this->devIdx = devIdx;
  27. this->chMask = chMask;
  28. this->baud = baud;
  29. memset(rxThreads, 0, sizeof(rxThreads));
  30. return true;
  31. }
  32. bool RS71UsbReceiver::Open()
  33. {
  34. if (!VCI_OpenDevice(devType, devIdx, 0))
  35. {
  36. printf("VCI_OpenDevice failed\n");
  37. return false;
  38. }
  39. printf("VCI_OpenDevice succeeded\n");
  40. return true;
  41. }
  42. void RS71UsbReceiver::Close()
  43. {
  44. VCI_CloseDevice(devType, devIdx);
  45. printf("VCI_CloseDevice\n");
  46. }
  47. bool RS71UsbReceiver::Start()
  48. {
  49. VCI_INIT_CONFIG config = {
  50. 0,
  51. 0xFFFFFFFF,
  52. 1,
  53. 0,
  54. static_cast<UCHAR>(baud & 0xff),
  55. static_cast<UCHAR>(baud >> 8)
  56. };
  57. for (int i = 0; i < 4; i++)
  58. {
  59. if ((chMask & (1 << i)) == 0)
  60. continue;
  61. if (!VCI_InitCAN(devType, devIdx, i, &config))
  62. {
  63. printf("VCI_InitCAN(%d) failed\n", i);
  64. return false;
  65. }
  66. if (!VCI_StartCAN(devType, devIdx, i))
  67. {
  68. printf("VCI_StartCAN(%d) failed\n", i);
  69. return false;
  70. }
  71. // 启动接收线程
  72. rxContexts[i].channel = i;
  73. rxContexts[i].stop = false;
  74. #ifdef WIN32
  75. rxThreads[i] = (HANDLE)_beginthreadex(NULL, 0, RxThreadFunc, &rxContexts[i], 0, NULL);
  76. #else
  77. pthread_create(&rxThreads[i], nullptr, RxThreadFunc, &rxContexts[i]);
  78. #endif
  79. }
  80. return true;
  81. }
  82. void RS71UsbReceiver::Stop()
  83. {
  84. for (int i = 0; i < 4; i++)
  85. {
  86. if ((chMask & (1 << i)) == 0)
  87. continue;
  88. rxContexts[i].stop = true;
  89. #ifdef WIN32
  90. WaitForSingleObject(rxThreads[i], INFINITE);
  91. CloseHandle(rxThreads[i]);
  92. #else
  93. pthread_join(rxThreads[i], nullptr);
  94. #endif
  95. }
  96. }
  97. std::vector<RS71UsbReceiver::CanFrame> RS71UsbReceiver::GetReceivedData(unsigned channel)
  98. {
  99. if (channel >= 4)
  100. {
  101. return {};
  102. }
  103. std::lock_guard<std::mutex> lock(rxContexts[channel].mtx);
  104. return rxContexts[channel].buffer;
  105. }
  106. THREAD_RETURN RS71UsbReceiver::RxThreadFunc(void *param)
  107. {
  108. RX_CTX *ctx = static_cast<RX_CTX *>(param);
  109. VCI_CAN_OBJ can[RX_BUFF_SIZE];
  110. while (!ctx->stop)
  111. {
  112. int cnt = VCI_Receive(3, 0, ctx->channel, can, RX_BUFF_SIZE, RX_WAIT_TIME);
  113. if (cnt <= 0)
  114. continue;
  115. std::lock_guard<std::mutex> lock(ctx->mtx);
  116. for (int i = 0; i < cnt; ++i)
  117. {
  118. CanFrame frame;
  119. frame.id = can[i].ID;
  120. frame.timestamp = can[i].TimeStamp;
  121. frame.data.assign(can[i].Data, can[i].Data + can[i].DataLen);
  122. ctx->buffer.push_back(frame);
  123. }
  124. }
  125. #ifdef WIN32
  126. _endthreadex(0);
  127. return 0;
  128. #else
  129. pthread_exit(0);
  130. #endif
  131. }