You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
4.1 KiB

4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
  1. #include "zcanreceiverhost.hpp"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "utils/stringutils.hpp"
  6. using namespace iflytop;
  7. #define TAG "ZCanReceiver"
  8. #define OVER_TIME_MS 20
  9. using namespace iflytop;
  10. ZCanReceiverHost::ZCanReceiverHost() {}
  11. void ZCanReceiverHost::initialize(string can_if_name, int baudrate) {
  12. // m_iflytopCanProtocolStack.reset(new IflytopCanProtocolStack());
  13. m_can_if_name = can_if_name;
  14. m_baudrate = baudrate;
  15. m_enablLoopback = false;
  16. auto socketCanConfig = make_shared<SocketCanConfig>();
  17. socketCanConfig->enablLoopback = m_enablLoopback; // 根据 SocketCan::dumpCanDriverInfo() 的输出,确定该标志位是false还是true
  18. socketCanConfig->m_canName = m_can_if_name;
  19. socketCanConfig->m_canBaudrate = m_baudrate;
  20. socketCanConfig->m_canfilters = {};
  21. logger->debug("initialize() m_canName:{} {}", socketCanConfig->m_canName, socketCanConfig->m_canBaudrate);
  22. m_socketCan.reset(new SocketCan());
  23. m_socketCan->initialize(socketCanConfig);
  24. m_socketCan->onSocketCanFrame.connect([this](shared_ptr<SocketCanFrame> canframe) { //
  25. if (canframe->getId() == m_hostId) {
  26. logger->debug("TX RAW: {} SUC", canframe->toString());
  27. return;
  28. }
  29. logger->debug("RX RAW: {}", canframe->toString());
  30. processRx(canframe);
  31. });
  32. }
  33. void ZCanReceiverHost::registerListener(onpacket_t onpacket) { m_onpacket = onpacket; }
  34. void ZCanReceiverHost::sendPacket(uint8_t *packet, size_t len) {
  35. logger->debug("TX: {}", StringUtils().bytesToString(packet, len));
  36. int npacket = len / 7 + (len % 7 == 0 ? 0 : 1);
  37. if (npacket > 255) {
  38. return;
  39. }
  40. int finalpacketlen = len % 7 == 0 ? 7 : len % 7;
  41. for (uint8_t i = 0; i < npacket; i++) {
  42. bool suc = false;
  43. if (i == npacket - 1) {
  44. suc = sendPacketSub(npacket, i, packet + i * 7, finalpacketlen, OVER_TIME_MS);
  45. } else {
  46. suc = sendPacketSub(npacket, i, packet + i * 7, 7, OVER_TIME_MS);
  47. }
  48. if (!suc) {
  49. logger->warn("sendPacket fail, packet(%d:%d)\n", npacket, i);
  50. return;
  51. }
  52. }
  53. }
  54. bool ZCanReceiverHost::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems) {
  55. uint32_t id = m_hostId;
  56. uint8_t txdata[8] = {0};
  57. txdata[0] = npacket << 4 | packetIndex;
  58. memcpy(txdata + 1, packet, len);
  59. // m_comcan.sendframe(CANUSB_FRAME_EXTENDED, id, packet, len);
  60. // printf("sendPacketSub(%d:%d) ", npacket, packetIndex);
  61. // for (size_t i = 0; i < len; i++) {
  62. // printf("%02x ", packet[i]);
  63. // }
  64. // printf("\n");
  65. shared_ptr<SocketCanFrame> frame = SocketCanFrame::createStdDataFrame(id, txdata, len + 1);
  66. logger->debug("TX RAW :{}", frame->toString());
  67. m_socketCan->sendFrame(frame, overtimems);
  68. return true;
  69. }
  70. void ZCanReceiverHost::processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { //
  71. if (m_onpacket) m_onpacket(rxbuf->id, packet, len);
  72. }
  73. void ZCanReceiverHost::processRx(shared_ptr<SocketCanFrame> frame) {
  74. // uint8_t from = (frame->getId() >> 16 & 0xFF);
  75. // uint8_t nframe = (frame->getId() & 0xFF00) >> 8;
  76. // uint8_t frameId = (frame->getId() & 0x00FF);
  77. uint8_t from = (frame->getId() & 0xFF);
  78. uint8_t nframe = ((frame->getData()[0] >> 4) & 0x0F);
  79. uint8_t frameId = (frame->getData()[0] & 0x0F);
  80. CanPacketRxBuffer *rxbuf = &m_canPacketRxBuffer[from];
  81. rxbuf->id = from;
  82. if (frameId == 0) {
  83. rxbuf->m_canPacketNum = 0;
  84. rxbuf->m_rxdataLen = 0;
  85. }
  86. if (frameId != rxbuf->m_canPacketNum) {
  87. rxbuf->m_canPacketNum = 0;
  88. rxbuf->m_rxdataLen = 0;
  89. return;
  90. }
  91. if (rxbuf->m_canPacketNum < 255) {
  92. rxbuf->m_canPacket[rxbuf->m_canPacketNum] = frame;
  93. rxbuf->m_canPacketNum++;
  94. memcpy(rxbuf->m_rxdata + rxbuf->m_rxdataLen, frame->getData() + 1, frame->getDlc() - 1);
  95. rxbuf->m_rxdataLen += frame->getDlc() - 1;
  96. }
  97. if (nframe == frameId + 1) {
  98. /**
  99. * @brief
  100. */
  101. logger->debug("RX: {}", StringUtils().bytesToString(rxbuf->m_rxdata, rxbuf->m_rxdataLen));
  102. processOnePacket(rxbuf, rxbuf->m_rxdata, rxbuf->m_rxdataLen);
  103. }
  104. }
  105. void ZCanReceiverHost::restartCanInterface() { m_socketCan->reStartCanInterface(); }