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.

67 lines
1.5 KiB

2 years ago
  1. #pragma once
  2. #include <functional>
  3. #include "basic/base.hpp"
  4. #include "chip_tim_irq_shceduler.hpp"
  5. namespace iflytop {
  6. using namespace std;
  7. class ZUART {
  8. public:
  9. typedef struct {
  10. const char *name;
  11. UART_HandleTypeDef *huart;
  12. int32_t rxbuffersize = 128;
  13. int32_t rxovertime_ms = 3;
  14. } cfg_t;
  15. typedef function<void(uint8_t *data, size_t len)> callback_t;
  16. private:
  17. const char *m_name;
  18. UART_HandleTypeDef *m_huart;
  19. uint8_t *m_rxBuffer;
  20. volatile int32_t m_rxBufferPos;
  21. int32_t m_rxBufferLen;
  22. volatile uint32_t m_lastRxTime;
  23. int32_t m_rxovertime_ms = 3;
  24. uint8_t onebyte;
  25. bool m_isRxing = false;
  26. volatile bool m_dataIsReady = false;
  27. callback_t m_cb;
  28. public:
  29. ZUART() {}
  30. void initialize(cfg_t *cfg, callback_t cb);
  31. void initialize(cfg_t *cfg);
  32. void setrxcb(callback_t cb) { m_cb = cb; }
  33. bool tx(const char *data);
  34. bool tx(uint8_t *data, size_t len);
  35. bool startRxIt();
  36. void clearRxData();
  37. public:
  38. void HAL_UART_TxCpltCallback();
  39. void HAL_UART_TxHalfCpltCallback();
  40. void HAL_UART_RxCpltCallback();
  41. void HAL_UART_RxHalfCpltCallback();
  42. void HAL_UART_ErrorCallback();
  43. void HAL_UART_AbortCpltCallback();
  44. void HAL_UART_AbortTransmitCpltCallback();
  45. void HAL_UART_AbortReceiveCpltCallback();
  46. UART_HandleTypeDef *getHuart() { return m_huart; }
  47. private:
  48. IRQn_Type getUartIRQType();
  49. bool dataIsReady();
  50. void periodicJob();
  51. };
  52. } // namespace iflytop