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.

90 lines
2.7 KiB

2 years ago
2 years ago
2 years ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include "sdk/hal/zhal.hpp"
  6. namespace iflytop {
  7. namespace zcr {
  8. typedef enum {
  9. kpacketHeader = 0,
  10. kpacketData = 1,
  11. kpacketTail = 2,
  12. } packet_type_t;
  13. class CANPacket {
  14. public:
  15. CAN_RxHeaderTypeDef pHeader;
  16. uint8_t aData[8]; /*8byte table*/
  17. };
  18. class CanPacketRxBuffer {
  19. public:
  20. uint16_t id;
  21. CANPacket m_canPacket[256]; // 用于接收can消息
  22. uint8_t m_canPacketNum = 0;
  23. bool dataIsReady;
  24. };
  25. }; // namespace zcr
  26. using namespace zcr;
  27. class ZCanRceiverListener {
  28. public:
  29. virtual void onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) = 0;
  30. };
  31. class ZCanReceiver : public ZCanIRQListener {
  32. public:
  33. class CFG {
  34. public:
  35. uint8_t deviceId; //
  36. /*******************************************************************************
  37. * CANConfig *
  38. *******************************************************************************/
  39. CAN_HandleTypeDef *canHandle; // 默认使用CAN1
  40. int canFilterIndex0; // 过滤器0 接收,发给自身的消息
  41. int maxFilterNum; // 使用的过滤器数量,最大值14,默认为7
  42. int rxfifoNum; // 使用的FIFO,默认使用FIFO0
  43. int packetRxOvertime_ms; //
  44. };
  45. uint8_t rxdata[255 * 8];
  46. public:
  47. class LoopJobContext {
  48. public:
  49. bool hasDoneSomething;
  50. };
  51. private:
  52. CFG *m_config = NULL; // 配置
  53. bool m_canOnRxDataFlag = false; // 是否有数据接收,用于从中断上下文转移到MainLoop上下文
  54. uint32_t m_lastPacketTicket = 0; // 上一次接收到消息的时间,用于判断与主机是否断开连接
  55. HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值
  56. list<ZCanRceiverListener *> m_listenerList;
  57. CanPacketRxBuffer m_canPacketRxBuffer[1];
  58. public:
  59. ZCanReceiver() {}
  60. CFG *createCFG(uint8_t deviceId);
  61. void init(CFG *cfg);
  62. void registerListener(ZCanRceiverListener *listener);
  63. void sendPacket(uint8_t *packet, size_t len);
  64. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  65. public:
  66. virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
  67. virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
  68. private:
  69. void loop();
  70. HAL_StatusTypeDef initializeFilter();
  71. HAL_StatusTypeDef activateRxIT();
  72. HAL_StatusTypeDef deactivateRxIT();
  73. bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
  74. };
  75. } // namespace iflytop