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.
 
 

98 lines
3.1 KiB

//
// Created by zwsd
//
#pragma once
#include "cmd.hpp"
#include "sdk/hal/zhal.hpp"
namespace iflytop {
namespace zcr {
typedef enum {
kpacketHeader = 0,
kpacketData = 1,
kpacketTail = 2,
} packet_type_t;
class CANPacket {
public:
CAN_RxHeaderTypeDef pHeader;
uint8_t aData[8]; /*8byte table*/
};
class CanPacketRxBuffer {
public:
uint16_t id;
CANPacket m_canPacket[256]; // 用于接收can消息
uint8_t m_canPacketNum = 0;
bool dataIsReady;
};
}; // namespace zcr
using namespace zcr;
class ZCanRceiverListener {
public:
virtual void onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) = 0;
};
typedef function<void(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len)> CanPacketRxBufferCB_t;
class ZCanReceiver : public ZCanIRQListener {
public:
class CFG {
public:
uint8_t deviceId; //
/*******************************************************************************
* CANConfig *
*******************************************************************************/
CAN_HandleTypeDef *canHandle; // 默认使用CAN1
int canFilterIndex0; // 过滤器0 接收,发给自身的消息
int maxFilterNum; // 使用的过滤器数量,最大值14,默认为7
int rxfifoNum; // 使用的FIFO,默认使用FIFO0
int packetRxOvertime_ms; //
};
uint8_t rxdata[1000];
uint8_t txbuff[1000];
public:
class LoopJobContext {
public:
bool hasDoneSomething;
};
private:
CFG *m_config = NULL; // 配置
bool m_canOnRxDataFlag = false; // 是否有数据接收,用于从中断上下文转移到MainLoop上下文
uint32_t m_lastPacketTicket = 0; // 上一次接收到消息的时间,用于判断与主机是否断开连接
HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值
list<ZCanRceiverListener *> m_listenerList;
list<CanPacketRxBufferCB_t> m_listenerCBList;
CanPacketRxBuffer m_canPacketRxBuffer[1];
public:
ZCanReceiver() {}
CFG *createCFG(uint8_t deviceId);
void init(CFG *cfg);
void registerListener(ZCanRceiverListener *listener);
void registerListener(CanPacketRxBufferCB_t cb);
void sendPacket(uint8_t *packet, size_t len);
void sendAck(Cmdheader_t *cmdheader, uint8_t *data, size_t len);
void sendErrorAck(Cmdheader_t *cmdheader, int16_t errcode);
bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
uint8_t getDeviceId() { return m_config->deviceId; }
public:
virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
private:
void loop();
HAL_StatusTypeDef initializeFilter();
HAL_StatusTypeDef activateRxIT();
HAL_StatusTypeDef deactivateRxIT();
bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
};
} // namespace iflytop