From cf41cd6af0acf692cc04bbbfae4421e4945c607d Mon Sep 17 00:00:00 2001 From: Attila BODY Date: Sun, 6 Dec 2020 00:30:53 +0100 Subject: [PATCH] Made WS28xxStrip hardware (DMA & SPI instance) independent --- App/App.cpp | 4 ++-- App/WS28xxStrip.h | 52 ++++++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/App/App.cpp b/App/App.cpp index 964e63e..3873dde 100644 --- a/App/App.cpp +++ b/App/App.cpp @@ -23,7 +23,7 @@ #include "WS28xxStrip.h" #include "Sparkle.h" -WS28xxStrip g_strip( { DEFAULT_COLOR } ); +WS28xxStrip g_strip( SPI1, DMA1, LL_DMA_CHANNEL_3, { DEFAULT_COLOR } ); Sparkle g_sparkles[NUMSPARKLES]; /* Definitions for StripFeeder */ @@ -68,7 +68,7 @@ void StartSparkle( Sparkle &s ) extern "C" void DMA1_Channel3_IRQHandler(void) { LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_0); - g_strip.SpiDmaIsr(); + g_strip.HandleSpiDmaIrq(); LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_0); } diff --git a/App/WS28xxStrip.h b/App/WS28xxStrip.h index 158cd32..e0677a2 100644 --- a/App/WS28xxStrip.h +++ b/App/WS28xxStrip.h @@ -17,31 +17,35 @@ #include #include +#include + struct pixel_t { uint8_t g; uint8_t r; uint8_t b; }; -extern "C" void DMA1_Channel3_IRQHandler(void); template class WS28xxStrip { public: - WS28xxStrip(pixel_t defcolor); + WS28xxStrip(SPI_TypeDef *spi, DMA_TypeDef *dma, uint32_t channel, pixel_t defcolor); pixel_t& operator[](int16_t index); - friend void DMA1_Channel3_IRQHandler(void); void Update(); static void RefillTaskEntry(void *param) { reinterpret_cast*>(param)->RefillTask(); } + void HandleSpiDmaIrq(); + private: - void SpiDmaIsr(); void RefillTask(); void Convert(uint8_t *src, uint8_t *dst, uint16_t src_size); template T Min(T a, T b) { return a < b ? a : b; } + SPI_TypeDef *m_spi; + f1ll::DmaHelper m_dma; + TaskHandle_t m_task_handle = nullptr; static constexpr const unsigned int SPI_PIXEL_SIZE = sizeof(pixel_t) * 4; @@ -62,8 +66,10 @@ private: ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -template WS28xxStrip::WS28xxStrip(pixel_t defcolor) -: m_main_mutex(xSemaphoreCreateBinaryStatic(&m_main_mutex_buffer)) +template WS28xxStrip::WS28xxStrip(SPI_TypeDef *spi, DMA_TypeDef *dma, uint32_t channel, pixel_t defcolor) +: m_spi(spi) +, m_dma(dma, channel) +, m_main_mutex(xSemaphoreCreateBinaryStatic(&m_main_mutex_buffer)) { for(uint16_t p=0; p < pixels; ++p) m_pixels[p] = defcolor; @@ -78,31 +84,31 @@ template pixel_t& WS28xxStrip void WS28xxStrip::SpiDmaIsr() +template void WS28xxStrip::HandleSpiDmaIrq() { LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_0); BaseType_t woken; - if(LL_DMA_IsActiveFlag_TE3(DMA1)) { - LL_DMA_ClearFlag_TE3(DMA1); + if(*m_dma.GetIsReg() & m_dma.GetTeMask()) { + *m_dma.GetIfcReg() = m_dma.GetTeMask(); } - else if(LL_DMA_IsActiveFlag_HT3(DMA1) || LL_DMA_IsActiveFlag_TC3(DMA1)) + else if(*m_dma.GetIsReg() & m_dma.GetHtMask() || *m_dma.GetIsReg() & m_dma.GetTcMask()) { - if(LL_DMA_IsActiveFlag_HT3(DMA1)) + if(*m_dma.GetIsReg() & m_dma.GetHtMask()) { - LL_DMA_ClearFlag_HT3(DMA1); + *m_dma.GetIfcReg() = m_dma.GetHtMask(); m_buffer_in_transmit = 1; if(m_endframe) - LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_NORMAL); + LL_DMA_SetMode(m_dma.GetDma(), m_dma.GetChannel(), LL_DMA_MODE_NORMAL); } - else if(LL_DMA_IsActiveFlag_TC3(DMA1)) + else if(*m_dma.GetIsReg() & m_dma.GetTcMask()) { - LL_DMA_ClearFlag_TC3(DMA1); + *m_dma.GetIfcReg() = m_dma.GetTcMask(); m_buffer_in_transmit = 0; if(m_endframe && m_endprev) { - LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_3); - LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_3, LL_DMA_MODE_CIRCULAR); + LL_DMA_DisableChannel(m_dma.GetDma(), m_dma.GetChannel()); + LL_DMA_SetMode(m_dma.GetDma(), m_dma.GetChannel(), LL_DMA_MODE_CIRCULAR); woken = pdFALSE; xSemaphoreGiveFromISR(m_main_mutex, &woken); portYIELD_FROM_ISR(woken); @@ -167,12 +173,12 @@ template void WS28xxStrip