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.
84 lines
2.1 KiB
84 lines
2.1 KiB
//
|
|
// Created by zwsd
|
|
//
|
|
|
|
#pragma once
|
|
#include <mutex>
|
|
|
|
#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<SocketCanFrame> 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<ZCanReceiverCMD> txcmdcache;
|
|
shared_ptr<ZCanReceiverCMD> rx;
|
|
bool isReady;
|
|
};
|
|
|
|
typedef function<void(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len)> onpacket_t;
|
|
|
|
public:
|
|
uint8_t m_sendbuf[1000];
|
|
CanPacketRxBuffer m_canPacketRxBuffer[255];
|
|
onpacket_t m_onpacket;
|
|
uint8_t m_deviceId = 1;
|
|
|
|
shared_ptr<SocketCan> 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<ZCanReceiverCMD> sendcmdblock(shared_ptr<ZCanReceiverCMD> cmd, int overtime_ms);
|
|
|
|
private:
|
|
void processRx(shared_ptr<SocketCanFrame> 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
|