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.

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