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.

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