|
|
//
// Created by zwsd
//
#pragma once
#include <map>
#include "basic.hpp"
#include "sdk/os/zos.hpp"
// #include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
namespace iflytop { using namespace std; typedef function<void(CanPacketRxBuffer *report)> zcan_commnader_master_onpacket_t;
class ZCanCommnaderMasterListener { public: zcan_commnader_master_onpacket_t on_ack; };
typedef function<void(uint8_t *packet, size_t len)> rawpacket_t;
class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster { public: class CFG { public: uint8_t deviceId = 0; //
/*******************************************************************************
* CANConfig * *******************************************************************************/ CAN_HandleTypeDef *canHandle; // Ĭ��ʹ��CAN1
int canFilterIndex0; // ������0 ���գ�������������Ϣ
int maxFilterNum; // ʹ�õĹ���������������ֵ14��Ĭ��Ϊ7
int rxfifoNum; // ʹ�õ�FIFO,Ĭ��ʹ��FIFO0
int packetRxOvertime_ms; //
};
uint8_t txbuff[2100];
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���ͷ����ķ���ֵ
#define CAN_PACKET_RX_BUFFER_NUM 5
CanPacketRxBuffer m_canPacketRxBuffer[CAN_PACKET_RX_BUFFER_NUM];
int txPacketInterval_ms = 0;
ZThread m_loopThread;
map<uint16_t, ZCanCommnaderMasterListener> m_on_packet_map; zmutex m_on_packet_map_lock; uint16_t m_index_off = 0; onpacket_t m_on_event;
rawpacket_t m_rawpacketcb = nullptr;
zmutex txlock;
public: ZCanCommnaderMaster() {} CFG *createCFG(); void init(CFG *cfg);
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } virtual int32_t sendCmd(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) override; virtual int32_t sendCmdAndReceiveBuf(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) override; virtual void regEventPacketListener(onpacket_t on_event) override;
void sendRawPacket(uint8_t *packet, size_t len); void regRawPacketListener(rawpacket_t rawpacketcb);
public: virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can); virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
private: void loop();
uint8_t getDeviceId() { return m_config->deviceId; } void sendPacket(uint8_t *packet, size_t len); void regListener(uint16_t index, zcan_commnader_master_onpacket_t onack); void unregListener(uint16_t index); void callListener(CanPacketRxBuffer *report); bool isListenerReg(uint16_t index); int getListenerNum(); uint16_t generateFreeIndex(); bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
HAL_StatusTypeDef initializeFilter(); HAL_StatusTypeDef activateRxIT(); HAL_StatusTypeDef deactivateRxIT(); bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
size_t safe_memcpy(void *dst, size_t dst_max_size, void *src, size_t src_len);
void initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id); CanPacketRxBuffer *allocCanPacketRxBufferInIRQ(uint16_t id); CanPacketRxBuffer *findCanPacketRxBufferInIRQ(uint16_t id); void processReadyPacket(CanPacketRxBuffer *buf); };
} // namespace iflytop
|