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.

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