diff --git a/src/abfall.cpp b/src/abfall.cpp index a69218b..ef5bebe 100644 --- a/src/abfall.cpp +++ b/src/abfall.cpp @@ -32,7 +32,7 @@ int main() { #endif printf("Firmware version: %s\n", PROJECT_VERSION); - WS2812 led(WS2812_PIN); + // WS2812 led(WS2812_PIN); wifi_enable(); // Enable Wifi in order to set time and retrieve data @@ -96,22 +96,26 @@ int main() { while (currentTime < timestamp) { size_t index = count % wasteDate.wasteTypes.size(); - switch (wasteDate.wasteTypes.at(index)) { - case Waste::GelberSack: - led.switchColor(Color::YELLOW); - break; - case Waste::Restmuell: - led.switchColor(Color::RED); - break; - case Waste::Papiertonne: - led.switchColor(Color::BLUE); - break; - case Waste::Problemstoffmobil: - led.switchColor(Color::CYAN); - break; - case Waste::Biotonne: - led.switchColor(Color::GREEN); - break; + { + WS2812 led(WS2812_PIN); + + switch (wasteDate.wasteTypes.at(index)) { + case Waste::GelberSack: + led.switchColor(Color::YELLOW); + break; + case Waste::Restmuell: + led.switchColor(Color::RED); + break; + case Waste::Papiertonne: + led.switchColor(Color::BLUE); + break; + case Waste::Problemstoffmobil: + led.switchColor(Color::CYAN); + break; + case Waste::Biotonne: + led.switchColor(Color::GREEN); + break; + } } auto timeLeft = timestamp - currentTime; @@ -127,7 +131,10 @@ int main() { } } else { - led.blinkReady(); + { + WS2812 led(WS2812_PIN); + led.blinkReady(); + } sleep_until(static_cast(timestamp)); } } diff --git a/src/ws2812.cpp b/src/ws2812.cpp index c7ad5ac..12d2a34 100644 --- a/src/ws2812.cpp +++ b/src/ws2812.cpp @@ -1,11 +1,13 @@ #include "ws2812.h" WS2812::WS2812(uint gpio, PIO pio, uint sm) : m_pio{pio}, m_sm{sm} { - uint offset = pio_add_program(m_pio, &ws2812_program); - ws2812_program_init(m_pio, m_sm, offset, gpio, 800000, true); + m_offset = pio_add_program(m_pio, &ws2812_program); + ws2812_program_init(m_pio, m_sm, m_offset, gpio, 800000, true); switchColor(Color::OFF); } +WS2812::~WS2812() { pio_remove_program(m_pio, &ws2812_program, m_offset); } + void WS2812::switchColor(Color color) { putPixel(static_cast(color)); } void WS2812::blinkReady() { diff --git a/src/ws2812.h b/src/ws2812.h index 229fccf..2d0d05c 100644 --- a/src/ws2812.h +++ b/src/ws2812.h @@ -17,6 +17,7 @@ enum class Color : uint32_t { class WS2812 { public: WS2812(uint gpio, PIO pio = pio0, uint sm = 0); + virtual ~WS2812(); void switchColor(Color color); void blinkReady(); @@ -24,4 +25,5 @@ class WS2812 { void putPixel(uint32_t pixel_rgb); PIO m_pio; uint m_sm; + uint m_offset{0}; };