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.
|
|
//
// Created by zwsd
//
#pragma once
#include <functional>
#include <list>
#include "project_configs.h"
#include "stm32basic/zbasic.h"
#ifdef ENABLE_OLD_CAN_PROTOCOL
#include "transmit_disinfection_protocol_v1/transmit_disinfection_protocol_v1.hpp"
namespace iflytop { namespace zcr { using namespace std; 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; uint8_t maxFrameId = 0; bool dataIsReady; }; }; // namespace zcr
using namespace zcr;
typedef void (*zcanbus_on_rx_t)(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len);
typedef function<void(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len)> CanPacketRxBufferCB_t;
class ZCanReceiver { 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发送方法的返回值
zcanbus_on_rx_t m_onRxData = NULL; list<CanPacketRxBufferCB_t> m_listenerCBList; CanPacketRxBuffer m_canPacketRxBuffer[1];
int report_index = 0;
public: ZCanReceiver() {}
static ZCanReceiver *ins();
CFG *createCFG(uint8_t deviceId); void init(CFG *cfg);
void registerListener(zcanbus_on_rx_t listener); void registerListener(CanPacketRxBufferCB_t cb); void sendPacket(uint8_t *packet, size_t len, int overtime); void sendAck(transmit_disinfection_protocol_header_t *cmdheader, uint8_t *data, size_t len); void sendErrorAck(transmit_disinfection_protocol_header_t *cmdheader, int16_t errcode); bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
void sendReport(uint16_t cmdid, uint8_t subcmdid, uint8_t *attachments, size_t len);
uint8_t getDeviceId() { return m_config->deviceId; }
void loop();
public: virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can); virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
private: HAL_StatusTypeDef initializeFilter(); HAL_StatusTypeDef activateRxIT(); HAL_StatusTypeDef deactivateRxIT(); bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/); };
} // namespace iflytop
#endif
|