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.

112 lines
4.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include <map>
  6. #include "basic.hpp"
  7. #include "sdk/os/zos.hpp"
  8. // #include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.hpp"
  9. #ifdef HAL_CAN_MODULE_ENABLED
  10. namespace iflytop {
  11. using namespace std;
  12. typedef function<void(CanPacketRxBuffer *report)> zcan_commnader_master_onpacket_t;
  13. class ZCanCommnaderMasterListener {
  14. public:
  15. zcan_commnader_master_onpacket_t on_ack;
  16. };
  17. typedef function<void(uint8_t *packet, size_t len)> rawpacket_t;
  18. class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
  19. public:
  20. class CFG {
  21. public:
  22. uint8_t deviceId = 0; //
  23. /*******************************************************************************
  24. * CANConfig *
  25. *******************************************************************************/
  26. CAN_HandleTypeDef *canHandle; // Ĭ��ʹ��CAN1
  27. int canFilterIndex0; // ������0 ���գ�������������Ϣ
  28. int maxFilterNum; // ʹ�õĹ���������������ֵ14��Ĭ��Ϊ7
  29. int rxfifoNum; // ʹ�õ�FIFO,Ĭ��ʹ��FIFO0
  30. int packetRxOvertime_ms; //
  31. };
  32. uint8_t txbuff[2100];
  33. public:
  34. class LoopJobContext {
  35. public:
  36. bool hasDoneSomething;
  37. };
  38. private:
  39. CFG *m_config = NULL; // ����
  40. bool m_canOnRxDataFlag = false; // �Ƿ������ݽ��գ����ڴ��ж�������ת�Ƶ�MainLoop������
  41. uint32_t m_lastPacketTicket = 0; // ��һ�ν��յ���Ϣ��ʱ�䣬�����ж��������Ƿ��Ͽ�����
  42. HAL_StatusTypeDef m_lastTransmitStatus; // �ϴε���can���ͷ����ķ���ֵ
  43. #define CAN_PACKET_RX_BUFFER_NUM 5
  44. CanPacketRxBuffer m_canPacketRxBuffer[CAN_PACKET_RX_BUFFER_NUM];
  45. int txPacketInterval_ms = 0;
  46. ZThread m_loopThread;
  47. map<uint16_t, ZCanCommnaderMasterListener> m_on_packet_map;
  48. zmutex m_on_packet_map_lock;
  49. uint16_t m_index_off = 0;
  50. onpacket_t m_on_event;
  51. rawpacket_t m_rawpacketcb = nullptr;
  52. zmutex txlock;
  53. public:
  54. ZCanCommnaderMaster() {}
  55. CFG *createCFG();
  56. void init(CFG *cfg);
  57. void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
  58. 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;
  59. 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;
  60. virtual void regEventPacketListener(onpacket_t on_event) override;
  61. void sendRawPacket(uint8_t *packet, size_t len);
  62. void regRawPacketListener(rawpacket_t rawpacketcb);
  63. public:
  64. virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
  65. virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
  66. private:
  67. void loop();
  68. uint8_t getDeviceId() { return m_config->deviceId; }
  69. void sendPacket(uint8_t *packet, size_t len);
  70. void regListener(uint16_t index, zcan_commnader_master_onpacket_t onack);
  71. void unregListener(uint16_t index);
  72. void callListener(CanPacketRxBuffer *report);
  73. bool isListenerReg(uint16_t index);
  74. int getListenerNum();
  75. uint16_t generateFreeIndex();
  76. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  77. HAL_StatusTypeDef initializeFilter();
  78. HAL_StatusTypeDef activateRxIT();
  79. HAL_StatusTypeDef deactivateRxIT();
  80. bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
  81. size_t safe_memcpy(void *dst, size_t dst_max_size, void *src, size_t src_len);
  82. void initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id);
  83. CanPacketRxBuffer *allocCanPacketRxBufferInIRQ(uint16_t id);
  84. CanPacketRxBuffer *findCanPacketRxBufferInIRQ(uint16_t id);
  85. void processReadyPacket(CanPacketRxBuffer *buf);
  86. };
  87. } // namespace iflytop
  88. #endif