#pragma once #include #include "basic/base.hpp" #include "chip_tim_irq_shceduler.hpp" namespace iflytop { using namespace std; class ZUART { public: typedef struct { const char *name; UART_HandleTypeDef *huart; int32_t rxbuffersize = 128; int32_t rxovertime_ms = 3; } cfg_t; typedef function callback_t; private: const char *m_name; UART_HandleTypeDef *m_huart; uint8_t *m_rxBuffer; volatile int32_t m_rxBufferPos; int32_t m_rxBufferLen; volatile uint32_t m_lastRxTime; int32_t m_rxovertime_ms = 3; uint8_t onebyte; bool m_isRxing = false; volatile bool m_dataIsReady = false; callback_t m_cb; public: ZUART() {} void initialize(cfg_t *cfg, callback_t cb); void initialize(cfg_t *cfg); void setrxcb(callback_t cb) { m_cb = cb; } bool tx(const char *data); bool tx(uint8_t *data, size_t len); bool startRxIt(); void clearRxData(); public: void HAL_UART_TxCpltCallback(); void HAL_UART_TxHalfCpltCallback(); void HAL_UART_RxCpltCallback(); void HAL_UART_RxHalfCpltCallback(); void HAL_UART_ErrorCallback(); void HAL_UART_AbortCpltCallback(); void HAL_UART_AbortTransmitCpltCallback(); void HAL_UART_AbortReceiveCpltCallback(); UART_HandleTypeDef *getHuart() { return m_huart; } private: IRQn_Type getUartIRQType(); bool dataIsReady(); void periodicJob(); }; } // namespace iflytop