// // Created by zwsd // #pragma once #include #include "cmd.hpp" #include "iflytop/core/basic/nlohmann/json.hpp" #include "iflytop/core/core.hpp" #include "iflytop/core/driver/socketcan/socket_can.hpp" #include "iflytop/core/spdlogfactory/logger.hpp" #include "zservice_container/zservice_container.hpp" namespace iflytop { using namespace std; using namespace zcr; class ZCanReceiverCMD { public: uint16_t packetindex; uint16_t cmdid; uint8_t subcmdid; uint8_t data[255 * 8]; size_t len; }; class ZCanReceiverHost { ENABLE_LOGGER(ZCanReceiverHost); public: class CanPacketRxBuffer { public: uint16_t id; shared_ptr m_canPacket[256]; // 用于接收can消息 uint8_t m_rxdata[255 * 8]; uint8_t m_canPacketNum = 0; uint8_t m_rxdataLen = 0; }; class TxContext { public: shared_ptr txcmdcache; shared_ptr rx; bool isReady; }; typedef function onpacket_t; public: uint8_t m_sendbuf[1000]; CanPacketRxBuffer m_canPacketRxBuffer[255]; onpacket_t m_onpacket; uint8_t m_deviceId = 1; shared_ptr m_socketCan; mutex m_txblocklock; mutex m_txContextLock; TxContext m_txContext; string m_can_if_name; int m_baudrate; bool m_enablLoopback; public: ZCanReceiverHost(); void initialize(string can_if_name, int baudrate, bool enablLoopback); void registerListener(onpacket_t onpacket); shared_ptr sendcmdblock(shared_ptr cmd, int overtime_ms); private: void processRx(shared_ptr frame); void processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len); void resetSocketCan(); void sendcmd(uint16_t packetindex, uint16_t cmdid, uint8_t subcmdid, uint8_t *data, size_t len); void sendPacket(uint8_t *packet, size_t len); bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems); }; } // namespace iflytop