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.

59 lines
1.5 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include <mutex>
  6. #include "socket_can/socket_can.hpp"
  7. //
  8. #include "a8000_protocol/protocol.hpp"
  9. #include "thirdlib/spdlogfactory/logger_factory.hpp"
  10. namespace iflytop {
  11. using namespace std;
  12. using namespace zcr;
  13. using namespace core;
  14. class ZCanReceiverHost {
  15. ENABLE_LOGGER(ZCanReceiverHost);
  16. public:
  17. class CanPacketRxBuffer {
  18. public:
  19. uint16_t id;
  20. shared_ptr<SocketCanFrame> m_canPacket[256]; // 用于接收can消息
  21. uint8_t m_rxdata[255 * 8];
  22. uint8_t m_canPacketNum = 0;
  23. uint8_t m_rxdataLen = 0;
  24. };
  25. typedef function<void(uint8_t fromboardid, uint8_t *packet, size_t len)> onpacket_t;
  26. public:
  27. uint8_t m_hostId = 0;
  28. CanPacketRxBuffer m_canPacketRxBuffer[255];
  29. onpacket_t m_onpacket;
  30. shared_ptr<SocketCan> m_socketCan;
  31. string m_can_if_name;
  32. int m_baudrate;
  33. bool m_enablLoopback;
  34. public:
  35. ZCanReceiverHost();
  36. void initialize(string can_if_name, int baudrate);
  37. void sendPacket(uint8_t *packet, size_t len);
  38. void registerListener(onpacket_t onpacket);
  39. void restartCanInterface();
  40. private:
  41. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  42. void processRx(shared_ptr<SocketCanFrame> frame);
  43. void processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len);
  44. void sendcmd(uint16_t packetindex, uint16_t cmdid, uint8_t subcmdid, uint8_t *data, size_t len);
  45. };
  46. } // namespace iflytop