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.

125 lines
3.6 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
2 years ago
  1. //
  2. // Created by zwsd
  3. //
  4. #pragma once
  5. #include "sdk/os/zos.hpp"
  6. #include "sdk\components\zprotocols\zcancmder\zcancmder_protocol.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. }; // namespace zcr
  20. using namespace zcr;
  21. class CanPacketRxBuffer {
  22. public:
  23. uint16_t id = 0;
  24. CANPacket m_canPacket[256] = {0}; // ���ڽ���can��Ϣ
  25. uint8_t m_canPacketNum = 0;
  26. bool dataIsReady = false;
  27. uint8_t rxdata[2000] = {0};
  28. int rxdataSize = 0;
  29. public:
  30. uint16_t get_packetindex();
  31. uint16_t get_cmdid();
  32. uint8_t get_subcmdid();
  33. uint8_t get_packetType();
  34. uint8_t *get_data();
  35. uint16_t get_datalen();
  36. Cmdheader_t *get_cmdheader();
  37. bool iscmd(CmdID_t id);
  38. template <typename T>
  39. T *get_data_as() {
  40. return (T *)get_data();
  41. }
  42. };
  43. class ZCanCmderListener {
  44. public:
  45. virtual void onRceivePacket(CanPacketRxBuffer *rxcmd) = 0;
  46. };
  47. typedef function<void(CanPacketRxBuffer *rxcmd)> zcan_cmder_listener_t;
  48. class ZCanCmder : public ZCanIRQListener {
  49. public:
  50. class CFG {
  51. public:
  52. uint8_t deviceId; //
  53. /*******************************************************************************
  54. * CANConfig *
  55. *******************************************************************************/
  56. CAN_HandleTypeDef *canHandle; // Ĭ��ʹ��CAN1
  57. int canFilterIndex0; // ������0 ���գ�������������Ϣ
  58. int maxFilterNum; // ʹ�õĹ���������������ֵ14��Ĭ��Ϊ7
  59. int rxfifoNum; // ʹ�õ�FIFO,Ĭ��ʹ��FIFO0
  60. int packetRxOvertime_ms; //
  61. };
  62. uint8_t txbuff[2100];
  63. public:
  64. class LoopJobContext {
  65. public:
  66. bool hasDoneSomething;
  67. };
  68. private:
  69. CFG *m_config = NULL; // ����
  70. bool m_canOnRxDataFlag = false; // �Ƿ������ݽ��գ����ڴ��ж�������ת�Ƶ�MainLoop������
  71. uint32_t m_lastPacketTicket = 0; // ��һ�ν��յ���Ϣ��ʱ�䣬�����ж��������Ƿ��Ͽ�����
  72. HAL_StatusTypeDef m_lastTransmitStatus; // �ϴε���can���ͷ����ķ���ֵ
  73. list<ZCanCmderListener *> m_listenerList;
  74. list<zcan_cmder_listener_t> m_listenerList2;
  75. CanPacketRxBuffer m_canPacketRxBuffer[1];
  76. int txPacketInterval_ms = 0;
  77. public:
  78. ZCanCmder() {}
  79. CFG *createCFG(uint8_t deviceId);
  80. void init(CFG *cfg);
  81. void registerListener(ZCanCmderListener *listener);
  82. void regListener(zcan_cmder_listener_t listener);
  83. void sendPacket(uint8_t *packet, size_t len);
  84. void sendExecStatusReport(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len);
  85. void sendAck(Cmdheader_t *rxcmdheader, uint8_t *data, size_t len);
  86. void sendErrorAck(Cmdheader_t *cmdheader, uint16_t id, uint32_t errcode);
  87. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  88. uint8_t getDeviceId() { return m_config->deviceId; }
  89. void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
  90. void loop();
  91. public:
  92. virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
  93. virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
  94. private:
  95. HAL_StatusTypeDef initializeFilter();
  96. HAL_StatusTypeDef activateRxIT();
  97. HAL_StatusTypeDef deactivateRxIT();
  98. bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
  99. };
  100. } // namespace iflytop