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.

115 lines
3.4 KiB

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