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.

105 lines
3.4 KiB

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