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.

83 lines
2.1 KiB

2 years ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include <mutex>
  6. #include "cmd.hpp"
  7. #include "iflytop/core/basic/nlohmann/json.hpp"
  8. #include "iflytop/core/core.hpp"
  9. #include "iflytop/core/driver/socketcan/socket_can.hpp"
  10. #include "iflytop/core/spdlogfactory/logger.hpp"
  11. #include "zservice_container/zservice_container.hpp"
  12. namespace iflytop {
  13. using namespace std;
  14. using namespace zcr;
  15. class ZCanReceiverCMD {
  16. public:
  17. uint16_t packetindex;
  18. uint16_t cmdid;
  19. uint8_t subcmdid;
  20. uint8_t data[255 * 8];
  21. size_t len;
  22. };
  23. class ZCanReceiverHost {
  24. ENABLE_LOGGER(ZCanReceiverHost);
  25. public:
  26. class CanPacketRxBuffer {
  27. public:
  28. uint16_t id;
  29. shared_ptr<SocketCanFrame> m_canPacket[256]; // 用于接收can消息
  30. uint8_t m_rxdata[255 * 8];
  31. uint8_t m_canPacketNum = 0;
  32. uint8_t m_rxdataLen = 0;
  33. };
  34. class TxContext {
  35. public:
  36. shared_ptr<ZCanReceiverCMD> txcmdcache;
  37. shared_ptr<ZCanReceiverCMD> rx;
  38. bool isReady;
  39. };
  40. typedef function<void(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len)> onpacket_t;
  41. public:
  42. uint8_t m_sendbuf[1000];
  43. CanPacketRxBuffer m_canPacketRxBuffer[255];
  44. onpacket_t m_onpacket;
  45. uint8_t m_deviceId = 1;
  46. shared_ptr<SocketCan> m_socketCan;
  47. mutex m_txblocklock;
  48. mutex m_txContextLock;
  49. TxContext m_txContext;
  50. string m_can_if_name;
  51. int m_baudrate;
  52. bool m_enablLoopback;
  53. public:
  54. ZCanReceiverHost();
  55. void initialize(string can_if_name, int baudrate, bool enablLoopback);
  56. void registerListener(onpacket_t onpacket);
  57. shared_ptr<ZCanReceiverCMD> sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms);
  58. private:
  59. void processRx(shared_ptr<SocketCanFrame> frame);
  60. void processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len);
  61. void resetSocketCan();
  62. void sendcmd(uint16_t packetindex, uint16_t cmdid, uint8_t subcmdid, uint8_t *data, size_t len);
  63. void sendPacket(uint8_t *packet, size_t len);
  64. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  65. };
  66. } // namespace iflytop