From 2d6567b1b2db7e56ec2b91770f5643ec5c5b9c31 Mon Sep 17 00:00:00 2001 From: abody Date: Fri, 8 Nov 2019 09:04:35 +0100 Subject: [PATCH] Console handler in C++ --- .cproject | 16 ++++++++-- Src/stm32f4xx_it.c | 3 +- app/ll_testbed.cpp | 45 +++++---------------------- lib/ll_consolehandler.cpp | 65 +++++++++++++++++++++++++++++++++++++++ lib/ll_consolehandler.h | 43 ++++++++++++++++++++++++++ 5 files changed, 131 insertions(+), 41 deletions(-) create mode 100644 lib/ll_consolehandler.cpp create mode 100644 lib/ll_consolehandler.h diff --git a/.cproject b/.cproject index e84cad0..eda91e4 100644 --- a/.cproject +++ b/.cproject @@ -138,10 +138,13 @@ + + + - + @@ -283,10 +286,13 @@ + + + - + @@ -325,6 +331,12 @@ + + + + + + diff --git a/Src/stm32f4xx_it.c b/Src/stm32f4xx_it.c index 9d33022..5e4b280 100644 --- a/Src/stm32f4xx_it.c +++ b/Src/stm32f4xx_it.c @@ -36,6 +36,7 @@ extern "C" { #include "globals_cpp.h" #include "ll_memcpydma.h" +#include "ll_consolehandler.h" extern "C" { @@ -265,7 +266,7 @@ void DMA1_Stream3_IRQHandler(void) void DMA1_Stream4_IRQHandler(void) { /* USER CODE BEGIN DMA1_Stream4_IRQn 0 */ - HandleConsoleUsartTxDmaIrq(&g_ConsoleTxDmaInfo, UART4); + f4ll::LL_ConsoleHandler::HandleTxDmaIrq(&f4ll::LL_ConsoleHandler::Instance()); /* USER CODE END DMA1_Stream4_IRQn 0 */ /* USER CODE BEGIN DMA1_Stream4_IRQn 1 */ diff --git a/app/ll_testbed.cpp b/app/ll_testbed.cpp index c45be5d..2676216 100644 --- a/app/ll_testbed.cpp +++ b/app/ll_testbed.cpp @@ -9,6 +9,7 @@ #include "ll_hsusart.h" #include "ll_crchandler.h" #include "ll_memcpydma.h" +#include "ll_consolehandler.h" extern "C" { #include "main.h" #include "globals.h" @@ -25,37 +26,6 @@ extern "C" { b += strcpy_ex(b,s); \ b += uitodec(b,u); -void _PrintStats(char *buffer, uint8_t id, f4ll::LL_HsUsart &handler, USART_TypeDef *usart, DMAINFO* dmaInfo) -{ - char ids[] = " : "; - char *bs = buffer; - - f4ll::LL_HsUsart::Stats const & stats(handler.GetStats()); - - ids[0] = id + '0'; - buffer += strcpy_ex(buffer, ids); - ADDINFO(buffer, " s: ", stats.sent); - ADDINFO(buffer, " r: ", stats.rcvd); - ADDINFO(buffer, " sk: ", stats.skiped); - ADDINFO(buffer, " or: ", stats.overrun); - ADDINFO(buffer, " he: ", stats.hdrError); -// buffer += strcpy_ex(buffer,",0x"); -// buffer += uitohex(buffer, stats.lastErrHdr, 8); - ADDINFO(buffer, " pe: ", stats.payloadErrror); - buffer += strcpy_ex(buffer,",0x"); - buffer += uitohex(buffer, stats.pep1, 8); - buffer += strcpy_ex(buffer,",0x"); - buffer += uitohex(buffer, stats.pep2, 8); - ADDINFO(buffer, " rde: ", stats.rxDmaError); - ADDINFO(buffer, " tde: ", stats.txDmaError); - ADDINFO(buffer, " pmh: ", stats.premature_hdr); - ADDINFO(buffer, " pmp: ", stats.premature_payload); - buffer += strcpy_ex(buffer, "\r\n"); - - SetupTransmit(usart, dmaInfo->dma, dmaInfo->stream, bs, buffer - bs + 1); -} - - extern "C" void MainLoop() { uint8_t const text2Send[] __attribute__((aligned(4))) = @@ -64,6 +34,7 @@ extern "C" void MainLoop() f4ll::LL_MemcpyDma::Init(MEMCPY_DMA_ENGINE, MEMCPY_DMA_STREAM); f4ll::LL_CrcHandler::Init(DMA2, LL_DMA_STREAM_4); + f4ll::LL_ConsoleHandler::Init(UART4, CONSOLE_DMA_ENGINE, 0u, CONSOLE_TX_DMA_STREAM); f4ll::LL_HsUsart u1{ USART1, DMA2, LL_DMA_STREAM_2, LL_DMA_STREAM_7 }; f4ll::LL_HsUsart u2{ USART2, DMA1, LL_DMA_STREAM_5, LL_DMA_STREAM_6 }; @@ -80,14 +51,12 @@ extern "C" void MainLoop() uint32_t tmp = sizeof(text2Send) - 1; uint32_t randmask = 0x80000000; - do + + do { if(randmask & tmp) break; - while((randmask = randmask >> 1)); - randmask -= 1; - - InitDmaInfo(&g_ConsoleTxDmaInfo, CONSOLE_DMA_ENGINE, CONSOLE_TX_DMA_STREAM); - LL_DMA_EnableIT_TC(g_ConsoleTxDmaInfo.dma, g_ConsoleTxDmaInfo.stream); + } while((randmask = randmask >> 1)); + --randmask; lastStatsTick = HAL_GetTick(); @@ -114,7 +83,7 @@ extern "C" void MainLoop() u->RxProcessed((bool)rIdx); } if(tick - lastStatsTick > STATS_DELAY_MS) { - _PrintStats((char*)g_statsBuf, statId, *usarts[statId], UART4, &g_ConsoleTxDmaInfo); + f4ll::LL_ConsoleHandler::Instance().PrintStats(statId, *usarts[statId]); lastStatsTick += STATS_DELAY_MS; ++statId; if(statId >= sizeof(usarts) / sizeof(usarts[0])) diff --git a/lib/ll_consolehandler.cpp b/lib/ll_consolehandler.cpp new file mode 100644 index 0000000..d82c78f --- /dev/null +++ b/lib/ll_consolehandler.cpp @@ -0,0 +1,65 @@ +/* + * ll_consolehandler.cpp + * + * Created on: Nov 7, 2019 + * Author: abody + */ + +#include +#include + +namespace f4ll { + +LL_ConsoleHandler::LL_ConsoleHandler(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t streamRx, uint32_t streamTx) +: LL_UsartCore(usart, dma, streamRx, streamTx) +{ +} + +void LL_ConsoleHandler::ReceiverIdle(void) {} +void LL_ConsoleHandler::TransmissionComplete(void) {} +void LL_ConsoleHandler::RxDmaTransferComplete(void) {} +void LL_ConsoleHandler::RxDmaHalfTransfer(void) {} +void LL_ConsoleHandler::RxDmaError(LL_DmaHelper::DmaErrorType reason) {} +void LL_ConsoleHandler::TxDmaTransferComplete(void) +{ + LL_USART_EnableIT_TC(m_usart); + LL_DMA_DisableStream(m_txDma.GetDma(), m_txDma.GetStream()); +} +void LL_ConsoleHandler::TxDmaHalfTransfer(void) {} +void LL_ConsoleHandler::TxDmaError(LL_DmaHelper::DmaErrorType reason) {} + + +#define ADDINFO(b,s,u) \ + b += strcpy_ex(b,s); \ + b += uitodec(b,u); + +void LL_ConsoleHandler::PrintStats(uint8_t id, LL_HsUsart &usart) +{ + char ids[] = " : "; + char *buffer = m_buffer; + LL_HsUsart::Stats const &stats(usart.GetStats()); + + ids[0] = id + '0'; + buffer += strcpy_ex(buffer, ids); + ADDINFO(buffer, " s: ", stats.sent); + ADDINFO(buffer, " r: ", stats.rcvd); + ADDINFO(buffer, " sk: ", stats.skiped); + ADDINFO(buffer, " or: ", stats.overrun); + ADDINFO(buffer, " he: ", stats.hdrError); + ADDINFO(buffer, " pe: ", stats.payloadErrror); + buffer += strcpy_ex(buffer,",0x"); + buffer += uitohex(buffer, stats.pep1, 8); + buffer += strcpy_ex(buffer,",0x"); + buffer += uitohex(buffer, stats.pep2, 8); + ADDINFO(buffer, " rde: ", stats.rxDmaError); + ADDINFO(buffer, " tde: ", stats.txDmaError); + ADDINFO(buffer, " pmh: ", stats.premature_hdr); + ADDINFO(buffer, " pmp: ", stats.premature_payload); + buffer += strcpy_ex(buffer, "\r\n"); + + SetupTransmit(m_buffer, buffer - m_buffer + 1); +} + + +} /* namespace f4ll */ + diff --git a/lib/ll_consolehandler.h b/lib/ll_consolehandler.h new file mode 100644 index 0000000..6ff3aa3 --- /dev/null +++ b/lib/ll_consolehandler.h @@ -0,0 +1,43 @@ +/* + * ll_consolehandler.h + * + * Created on: Nov 7, 2019 + * Author: abody + */ + +#ifndef LL_CONSOLEHANDLER_H_ +#define LL_CONSOLEHANDLER_H_ + +#include "ll_hsusart.h" +#include "singleton.h" + + +namespace f4ll { + +class LL_ConsoleHandler: public LL_UsartCore, public Singleton +{ + friend class Singleton; + +public: + // 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 PrintStats(uint8_t id, LL_HsUsart &usart); + +private: + LL_ConsoleHandler(USART_TypeDef *usart, DMA_TypeDef *dma, uint32_t streamRx, uint32_t streamTx); + + char m_buffer[128]; + uint16_t m_used = 0; +}; + +} /* namespace f4ll */ + +#endif /* LL_CONSOLEHANDLER_H_ */