Divided USART communication into core and protocol classes
This commit is contained in:
parent
9ff4e76623
commit
f0c2ad69c9
7 changed files with 287 additions and 121 deletions
|
@ -8,13 +8,14 @@
|
|||
#ifndef LL_HSUSART_H_
|
||||
#define LL_HSUSART_H_
|
||||
#include <platform/usart_ll.h>
|
||||
#include <ll_usartcore.h>
|
||||
#include <ll_crchandler.h>
|
||||
|
||||
namespace f4ll {
|
||||
|
||||
struct DMAINFO;
|
||||
|
||||
class LL_HsUsart : public LL_CrcHandler::ICallback
|
||||
class LL_HsUsart : public LL_CrcHandler::ICallback, public LL_UsartCore
|
||||
{
|
||||
public:
|
||||
LL_HsUsart(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t stream_rx, uint32_t stream_tx);
|
||||
|
@ -32,55 +33,56 @@ public:
|
|||
} __attribute__((aligned));
|
||||
|
||||
struct Stats {
|
||||
uint32_t overrun;
|
||||
uint32_t hdrError;
|
||||
uint32_t payloadErrror;
|
||||
uint32_t pep1, pep2;
|
||||
uint32_t dmaError;
|
||||
uint32_t rcvd;
|
||||
uint32_t premature_hdr;
|
||||
uint32_t premature_payload;
|
||||
uint32_t sent;
|
||||
uint32_t skiped;
|
||||
uint32_t overrun = 0;
|
||||
uint32_t hdrError = 0;
|
||||
uint32_t payloadErrror = 0;
|
||||
uint32_t pep1 = 0;
|
||||
uint32_t pep2 = 0;
|
||||
uint32_t rxDmaError = 0;
|
||||
uint32_t txDmaError = 0;
|
||||
uint32_t rcvd = 0;
|
||||
uint32_t premature_hdr = 0;
|
||||
uint32_t premature_payload = 0;
|
||||
uint32_t sent = 0;
|
||||
uint32_t skiped = 0;
|
||||
};
|
||||
|
||||
struct IHsUsartCallback {
|
||||
virtual bool PacketReceived(LL_HsUsart *caller, uintptr_t userParam, Packet const &packet) = 0;
|
||||
};
|
||||
|
||||
//LL_CRCHandler::ICallback interface functions
|
||||
// LL_CRCHandler::ICallback interface functions
|
||||
virtual void CrcSucceeded(uintptr_t callbackParam, uint32_t crc, int prio);
|
||||
virtual void CrcFailed(uintptr_t callbackParam, uint32_t crc, int prio);
|
||||
|
||||
// LL_UsartCore pure virtual function implementations
|
||||
virtual void ReceiverIdle(void);
|
||||
virtual void TransmissionComplete(void);
|
||||
virtual void RxDmaTransferComplete(void);
|
||||
virtual void RxDmaHalfTransfer(void);
|
||||
virtual void RxDmaError(LL_DmaHelper::DmaErrorType reason);
|
||||
virtual void TxDmaTransferComplete(void);
|
||||
virtual void TxDmaHalfTransfer(void);
|
||||
virtual void TxDmaError(LL_DmaHelper::DmaErrorType reason);
|
||||
|
||||
void PostPacket(uint8_t const *payload, uint8_t length, bool waitForCrcQueue = true);
|
||||
void SetupReceive(void);
|
||||
|
||||
void RxProcessed(bool second);
|
||||
uint8_t* GetTxPacketBuffer(void);
|
||||
USART_TypeDef* GetUsart(void);
|
||||
Stats const & GetStats();
|
||||
bool IsTxBusy();
|
||||
bool IsTxFailed();
|
||||
Stats const & GetStats(void);
|
||||
bool IsTxBusy(void);
|
||||
bool IsTxFailed(void);
|
||||
bool IsRxBusy(bool second);
|
||||
bool IsRxFailed(bool second);
|
||||
|
||||
void SetCallback(IHsUsartCallback* callback, uintptr_t callbackParam);
|
||||
|
||||
static inline void HandleUsartIrq(LL_HsUsart *obj) {
|
||||
obj->UsartIrq();
|
||||
}
|
||||
static inline void HandleRxDmaIrq(LL_HsUsart *obj) {
|
||||
obj->RxDmaIrq();
|
||||
}
|
||||
static inline void HandleTxDmaIrq(LL_HsUsart *obj) {
|
||||
obj->TxDmaIrq();
|
||||
}
|
||||
private:
|
||||
void BuildHeader(Packet &packet, uint8_t serialNo, uint8_t length);
|
||||
bool CheckHeader(PacketHeader &header);
|
||||
void UsartIrq(void);
|
||||
void RxDmaIrq(void);
|
||||
void TxDmaIrq(void);
|
||||
void SwitchRxBuffers(void);
|
||||
|
||||
struct Buffer {
|
||||
Packet packet;
|
||||
|
@ -93,9 +95,6 @@ private:
|
|||
|
||||
static const uint8_t STARTMARKER = 0x95;
|
||||
|
||||
USART_TypeDef *m_usart;
|
||||
LL_DmaHelper m_rxDma;
|
||||
LL_DmaHelper m_txDma;
|
||||
uint8_t m_rxSerialNo = -1;
|
||||
uint8_t m_txSerialNo = -1;
|
||||
Stats m_stats;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue