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.

91 lines
3.3 KiB

2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year 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 year ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include "basic.hpp"
  6. #include "sdk/os/zos.hpp"
  7. #include "a8000_protocol\protocol.hpp"
  8. #ifdef HAL_CAN_MODULE_ENABLED
  9. namespace iflytop {
  10. using namespace zcr;
  11. typedef function<void(CanPacketRxBuffer *rxcmd)> zcanreceiver_listener_t;
  12. class ZCanReceiver : public ZCanIRQListener, public IZCanReceiver {
  13. public:
  14. class CFG {
  15. public:
  16. uint8_t deviceId; //
  17. /*******************************************************************************
  18. * CANConfig *
  19. *******************************************************************************/
  20. CAN_HandleTypeDef *canHandle; // 默认使用CAN1
  21. int canFilterIndex0; // 过滤器0 接收,发给自身的消息
  22. int maxFilterNum; // 使用的过滤器数量,最大值14,默认为7
  23. int rxfifoNum; // 使用的FIFO,默认使用FIFO0
  24. int packetRxOvertime_ms; //
  25. };
  26. uint8_t txbuff[2100];
  27. public:
  28. class LoopJobContext {
  29. public:
  30. bool hasDoneSomething;
  31. };
  32. private:
  33. CFG *m_config = NULL; // 配置
  34. bool m_canOnRxDataFlag = false; // 是否有数据接收,用于从中断上下文转移到MainLoop上下文
  35. uint32_t m_lastPacketTicket = 0; // 上一次接收到消息的时间,用于判断与主机是否断开连接
  36. HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值
  37. list<IZCanReceiverListener *> m_listenerList;
  38. CanPacketRxBuffer m_canPacketRxBuffer[1];
  39. int txPacketInterval_ms = 0;
  40. zmutex m_lock;
  41. int32_t m_reportIndex = 0;
  42. public:
  43. ZCanReceiver() {}
  44. CFG *createCFG(uint8_t deviceId);
  45. void initialize(CFG *cfg);
  46. #if 0
  47. void sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  48. void sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  49. void sendAck(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  50. void sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode);
  51. #endif
  52. uint8_t getDeviceId() { return m_config->deviceId; }
  53. void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
  54. virtual void registerListener(IZCanReceiverListener *listener) override;
  55. virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override;
  56. virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) override;
  57. virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) override;
  58. virtual int32_t triggerEvent(zcr_cmd_header_t *cmd_header, uint8_t *data, int32_t len) override;
  59. void loop();
  60. public:
  61. virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
  62. virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
  63. private:
  64. void sendPacket(uint8_t *packet, size_t len);
  65. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  66. HAL_StatusTypeDef initializeFilter();
  67. HAL_StatusTypeDef activateRxIT();
  68. HAL_StatusTypeDef deactivateRxIT();
  69. bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
  70. };
  71. } // namespace iflytop
  72. #endif