From 8dc11493aa2eb04b97dfa0a7d7e024be8e9e9a67 Mon Sep 17 00:00:00 2001 From: admar Date: Sun, 1 Sep 2024 16:50:16 +0200 Subject: [PATCH] Use NeoPixel led for wifi status --- include/display.hpp | 3 ++- include/wifi_handler.hpp | 5 +---- src/display.cpp | 16 +++++++++++++++- src/main.cpp | 27 ++++++++++++++++++++++++--- src/wifi_handler.cpp | 25 ++++++++++--------------- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/include/display.hpp b/include/display.hpp index d0b5a03..eafc80c 100644 --- a/include/display.hpp +++ b/include/display.hpp @@ -17,7 +17,8 @@ class Display { void setPrecipitationForecastLeds(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_precipitation); void setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_uvi); void setLocalAirQualityLed(); - void setWifiStatusLed(bool p_enable); + void setWifiStatusLed(bool p_is_connected); + void setErrorLed(bool p_is_error); void setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white); void clear(); void show(); diff --git a/include/wifi_handler.hpp b/include/wifi_handler.hpp index b12f8a7..5141a46 100644 --- a/include/wifi_handler.hpp +++ b/include/wifi_handler.hpp @@ -3,12 +3,10 @@ #include // https://github.com/admarschoonen/WiFiManager -#include "display.hpp" - class WifiHandler { public: // Constructor - WifiHandler(uint8_t p_led_pin, Display p_display); + WifiHandler(std::function p_tickerCb); public: // Public static methods @@ -30,7 +28,6 @@ class WifiHandler { private: // Private objects WiFiManager m_wifiManager; - Display& m_display; }; #endif // __WIFIHANDLER_HPP__ \ No newline at end of file diff --git a/src/display.cpp b/src/display.cpp index 43faa25..c7d78e7 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -74,7 +74,21 @@ void Display::setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22:: void Display::setLocalAirQualityLed() {} -void Display::setWifiStatusLed(bool p_enable) {} +void Display::setWifiStatusLed(bool p_is_connected) { + if (p_is_connected) { + m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 255U, 255U)); + } else { + m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 0U, 0U)); + } +} + +void Display::setErrorLed(bool p_is_error) { + if (p_is_error) { + m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(255U, 0U, 0U, 0U)); + } else { + m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 0U, 0U)); + } +} void Display::setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white) { m_leds.setPixelColor(p_index, m_leds.Color(p_red, p_green, p_blue, p_white)); diff --git a/src/main.cpp b/src/main.cpp index 13a69a4..e9efc3d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,15 +15,34 @@ #define CONNECT_BUTTON BUTTON_BUILTIN +// Forward function declarations +void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status); + +// Global objects DESPatch dESPatch; Adafruit_NeoPixel leds = Adafruit_NeoPixel(29, 14, NEO_GRBW + NEO_KHZ800); Display display(leds); -WifiHandler wifi_handler(LED_BUILTIN, display); +WifiHandler wifi_handler(wifiHandlerFeedbackCb); BackendCommunication backend_communication(wifi_handler); +void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status) { + static bool state = false; + + if (p_wifi_status.mode == WiFiManager::Mode::CONNECTED) { + state = true; + } else if (p_wifi_status.mode == WiFiManager::Mode::DISCONNECTED) { + state = false; + } else { + state = !state; + } + + display.setWifiStatusLed(state); + display.show(); +} + void setup() { display.clear(); display.show(); @@ -64,7 +83,8 @@ void loop(void) { backend_communication.getConfig(); if (not backend_communication.m_is_config_valid) { - Serial.println(String("Uptime: " + String(millis())) + " Invalid config"); + display.setErrorLed(true); + Serial.println(String("Uptime: " + String(millis())) + ". Error: invalid config"); } else { backend_communication.getWeatherData(); @@ -79,9 +99,10 @@ void loop(void) { display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as()); - display.show(); + display.setWifiStatusLed(false); } + display.show(); dESPatch.checkForUpdate(true); uint32_t time_end = millis(); diff --git a/src/wifi_handler.cpp b/src/wifi_handler.cpp index 4cf9e70..11b9ff0 100644 --- a/src/wifi_handler.cpp +++ b/src/wifi_handler.cpp @@ -2,20 +2,18 @@ #include "../include/wifi_handler.hpp" -static uint8_t g_led_pin; static Ticker g_ticker; +static WiFiManager::Status g_wifi_status; +static std::function g_tickerCb = nullptr; -WifiHandler::WifiHandler(uint8_t p_led_pin, Display p_display) : m_display(p_display) { - g_led_pin = p_led_pin; +WifiHandler::WifiHandler(std::function p_tickerCb) { + g_tickerCb = p_tickerCb; return; } static void tick() { - int state = 0; - - if (g_led_pin >= 0) { - state = digitalRead(g_led_pin); - digitalWrite(g_led_pin, !state); + if (g_tickerCb != nullptr) { + g_tickerCb(g_wifi_status); } } @@ -30,6 +28,8 @@ void WifiHandler::setBlinkRate(float p_interval) { } void WifiHandler::wifiManagerCb(WiFiManager::Status p_status) { + g_wifi_status = p_status; + if (p_status.mode == WiFiManager::Mode::CONNECTING) { WifiHandler::setBlinkRate(WifiHandler::BLINK_RATE_CONNECTING); } else if (p_status.mode == WiFiManager::Mode::SCANNING) { @@ -40,10 +40,10 @@ void WifiHandler::wifiManagerCb(WiFiManager::Status p_status) { WifiHandler::setBlinkRate(WifiHandler::BLINK_RATE_ERASE); } else if (p_status.mode == WiFiManager::Mode::CONNECTED) { WifiHandler::setBlinkRate(0.0f); - digitalWrite(g_led_pin, HIGH); + g_tickerCb(g_wifi_status); } else if (p_status.mode == WiFiManager::Mode::DISCONNECTED) { WifiHandler::setBlinkRate(0.0f); - digitalWrite(g_led_pin, LOW); + g_tickerCb(g_wifi_status); } } @@ -65,9 +65,6 @@ void WifiHandler::connect() { // if you get here you have connected to the WiFi Serial.print(String(millis()) + " Connected with address: "); Serial.println(WiFi.localIP()); - - // keep LED on - digitalWrite(g_led_pin, HIGH); } void WifiHandler::resetSettings() { @@ -80,8 +77,6 @@ void WifiHandler::resetSettings() { delay(1000); status.mode = WiFiManager::Mode::DISCONNECTED; wifiManagerCb(status); - - return; } String WifiHandler::getMac(bool p_insertColons) {