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.

93 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
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 "basic.hpp"
  6. #include "sdk/os/zos.hpp"
  7. #include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
  8. namespace iflytop {
  9. using namespace zcr;
  10. #if 0
  11. class ZCanCmderListener {
  12. public:
  13. virtual void onRceivePacket(CanPacketRxBuffer *rxcmd) = 0;
  14. };
  15. #endif
  16. typedef function<void(CanPacketRxBuffer *rxcmd)> zcan_cmder_listener_t;
  17. class ZCanCmder : public ZCanIRQListener, public IZCanCmder {
  18. public:
  19. class CFG {
  20. public:
  21. uint8_t deviceId; //
  22. /*******************************************************************************
  23. * CANConfig *
  24. *******************************************************************************/
  25. CAN_HandleTypeDef *canHandle; // Ĭ��ʹ��CAN1
  26. int canFilterIndex0; // ������0 ���գ�������������Ϣ
  27. int maxFilterNum; // ʹ�õĹ���������������ֵ14��Ĭ��Ϊ7
  28. int rxfifoNum; // ʹ�õ�FIFO,Ĭ��ʹ��FIFO0
  29. int packetRxOvertime_ms; //
  30. };
  31. uint8_t txbuff[2100];
  32. public:
  33. class LoopJobContext {
  34. public:
  35. bool hasDoneSomething;
  36. };
  37. private:
  38. CFG *m_config = NULL; // ����
  39. bool m_canOnRxDataFlag = false; // �Ƿ������ݽ��գ����ڴ��ж�������ת�Ƶ�MainLoop������
  40. uint32_t m_lastPacketTicket = 0; // ��һ�ν��յ���Ϣ��ʱ�䣬�����ж��������Ƿ��Ͽ�����
  41. HAL_StatusTypeDef m_lastTransmitStatus; // �ϴε���can���ͷ����ķ���ֵ
  42. list<IZcanCmderListener *> m_listenerList;
  43. CanPacketRxBuffer m_canPacketRxBuffer[1];
  44. int txPacketInterval_ms = 0;
  45. zmutex m_lock;
  46. public:
  47. ZCanCmder() {}
  48. CFG *createCFG(uint8_t deviceId);
  49. void init(CFG *cfg);
  50. #if 0
  51. void sendExecStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  52. void sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  53. void sendAck(zcr_cmd_header_t *rxcmdheader, uint8_t *data, size_t len);
  54. void sendErrorAck(zcr_cmd_header_t *cmdheader, uint16_t id, uint32_t errcode);
  55. #endif
  56. uint8_t getDeviceId() { return m_config->deviceId; }
  57. void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
  58. virtual void registerListener(IZcanCmderListener *listener) override;
  59. virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override;
  60. virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) override;
  61. virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) override;
  62. void loop();
  63. public:
  64. virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);
  65. virtual void STM32_HAL_onCAN_Error(CAN_HandleTypeDef *can);
  66. private:
  67. void sendPacket(uint8_t *packet, size_t len);
  68. bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems);
  69. HAL_StatusTypeDef initializeFilter();
  70. HAL_StatusTypeDef activateRxIT();
  71. HAL_StatusTypeDef deactivateRxIT();
  72. bool getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/);
  73. };
  74. } // namespace iflytop