// // Created by zwsd // #pragma once #include #include "socket_can/socket_can.hpp" // #include "a8000_protocol/protocol.hpp" #include "thirdlib/spdlogfactory/logger_factory.hpp" namespace iflytop { using namespace std; using namespace zcr; using namespace core; 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; }; typedef function onpacket_t; public: uint8_t m_hostId = 0; CanPacketRxBuffer m_canPacketRxBuffer[255]; onpacket_t m_onpacket; shared_ptr m_socketCan; string m_can_if_name; int m_baudrate; bool m_enablLoopback; public: ZCanReceiverHost(); void initialize(string can_if_name, int baudrate); void sendPacket(uint8_t *packet, size_t len); void registerListener(onpacket_t onpacket); void restartCanInterface(); private: bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems); void processRx(shared_ptr frame); void processOnePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len); void sendcmd(uint16_t packetindex, uint16_t cmdid, uint8_t subcmdid, uint8_t *data, size_t len); }; } // namespace iflytop