#pragma once #include #include #include #include #include #include #include #include #include #include #include #include // #include "app_protocols/zscanprotocol/zscanprotocol.hpp" #include "protocol/waveshare_can/waveshare_can.hpp" #include "zqui/zqui/zqui.hpp" namespace iflytop { using namespace std; namespace zscanprotocol { typedef function on_raw_data_t; typedef function ecode2str_t; class RxReceiptContext { public: bool waittingForReceipt; bool receiptIsReady; uint8_t waittingIndex; uint8_t receipt[1024]; size_t receiptLen; }; class Receipt { public: uint8_t receipt[1024]; size_t receiptLen; zcanbus_packet_t *getPacket() { return (zcanbus_packet_t *)receipt; } int32_t getContent(int index) { return getPacket()->params[index]; } uint8_t *getByte() { return (uint8_t *)getPacket()->params; } }; class CanPacketRxBuffer { public: int32_t id = 0; uint8_t from = 0; uint8_t to = 0; uint8_t rxdata[2048] = {0}; int rxdataSize = 0; int rxPacketNum = 0; }; class ZSCanProtocolCom { WaveshareCan *m_channel = nullptr; uint8_t m_rxcache[1024] = {0}; int32_t m_rxlen = 0; bool m_rxcache_is_full = false; mutex lock_; unique_ptr m_thread; RxReceiptContext m_rxReceiptContext; mutex m_rxReceiptContext_lock; /******************************************************************************* * TX CONTEXT * *******************************************************************************/ mutex m_tx_lock; uint8_t m_txbuf[1024] = {0}; int32_t m_rxsize = 0; uint8_t m_txindex = 0; CanPacketRxBuffer m_rxbuf[255]; on_raw_data_t on_rx_raw; uint8_t m_receipt_cache[1024]; zcanbus_packet_t *m_receipt_frame = (zcanbus_packet_t *)m_receipt_cache; size_t m_receipt_len = 0; public: ZSCanProtocolCom() {} public: void initialize(QTSerialChannel *ch); void regOnRawData(on_raw_data_t cb) { on_rx_raw = cb; } void updateChannelConfig(); shared_ptr callcmd(int32_t to, int32_t cmdid, uint8_t *param, int32_t paramLen, int32_t overtime = 100); shared_ptr callcmd0(int32_t to, int32_t cmdid, int32_t overtime = 100); shared_ptr callcmd1(int32_t to, int32_t cmdid, int32_t param0, int32_t overtime = 100); shared_ptr callcmd2(int32_t to, int32_t cmdid, int32_t param0, int32_t param1, int32_t overtime = 100); shared_ptr callcmd3(int32_t to, int32_t cmdid, int32_t param0, int32_t param1, int32_t param2, int32_t overtime = 100); shared_ptr callcmd4(int32_t to, int32_t cmdid, int32_t param0, int32_t param1, int32_t param2, int32_t param3, int32_t overtime = 100); shared_ptr callcmd5(int32_t to, int32_t cmdid, int32_t param0, int32_t param1, int32_t param2, int32_t param3, int32_t param4, int32_t overtime = 100); void sendraw(int32_t from, int32_t to, uint8_t *data, size_t len); private: void sendframe(int32_t from, int32_t to, uint8_t *frame, size_t len); void sendsubframe(int32_t from, int32_t to, int npacket, int packetIndex, uint8_t *packet, size_t len); void processRxPacket(int32_t from, int32_t to, uint8_t *data, size_t len); private: CanPacketRxBuffer *findRxBuff(int deviceId); string ecode2str(int ecode); }; } // namespace zscanprotocol } // namespace iflytop