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_ */