From 33489e7a91e0ccf40ac1a1fdb4cdbe060d610b7d Mon Sep 17 00:00:00 2001
From: Eric Duminil <eric.duminil@gmail.com>
Date: Sun, 9 May 2021 16:23:54 +0200
Subject: [PATCH] One effect while config, one while connect

---
 ampel-firmware/led_effects.cpp                     |  9 +++++++++
 ampel-firmware/led_effects.h                       |  1 +
 ampel-firmware/src/lib/WiFiManager/WiFiManager.cpp | 13 +++++++++++--
 ampel-firmware/src/lib/WiFiManager/WiFiManager.h   |  4 ++++
 ampel-firmware/wifi_util.cpp                       |  7 ++++++-
 5 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/ampel-firmware/led_effects.cpp b/ampel-firmware/led_effects.cpp
index f0b672c..136088d 100644
--- a/ampel-firmware/led_effects.cpp
+++ b/ampel-firmware/led_effects.cpp
@@ -210,6 +210,15 @@ namespace led_effects {
     }
   }
 
+  void greenAlert() {
+    static uint8_t i;
+    i = (i + 1) % 10;
+    pixels.setBrightness(static_cast<int>(config::max_brightness * (1 - i * 0.1)));
+    delay(50);
+    pixels.fill(color::green);
+    pixels.show();
+  }
+
   /**
    * Displays a complete blue circle, and starts removing LEDs one by one. Returns the number of remaining LEDs.
    * Can be used for calibration, e.g. when countdown is 0. Does not work in night mode.
diff --git a/ampel-firmware/led_effects.h b/ampel-firmware/led_effects.h
index a910d30..7ce310a 100644
--- a/ampel-firmware/led_effects.h
+++ b/ampel-firmware/led_effects.h
@@ -26,6 +26,7 @@ namespace led_effects {
 
   void setupRing();
   void redAlert();
+  void greenAlert();
   int countdownToZero();
   void showWaitingLED(uint32_t color);
   void showKITTWheel(uint32_t color, uint16_t duration_s = 2);
diff --git a/ampel-firmware/src/lib/WiFiManager/WiFiManager.cpp b/ampel-firmware/src/lib/WiFiManager/WiFiManager.cpp
index 8a42e3d..d258686 100644
--- a/ampel-firmware/src/lib/WiFiManager/WiFiManager.cpp
+++ b/ampel-firmware/src/lib/WiFiManager/WiFiManager.cpp
@@ -785,7 +785,7 @@ uint8_t WiFiManager::connectWifi(String ssid, String pass) {
     // connect using saved ssid if there is one
     if (WiFi_hasAutoConnect()) {
       wifiConnectDefault();
-      connRes = waitForConnectResult();
+      connRes = waitForConnectResult(_saveTimeout);
     }
     else {
       DEBUG_WM(F("No wifi save required, skipping"));
@@ -927,7 +927,11 @@ uint8_t WiFiManager::waitForConnectResult(uint16_t timeout) {
       return status;
     }
     DEBUG_WM (DEBUG_VERBOSE,F("."));
-    delay(100);
+    if ( _waiting_for_connection_callback == NULL){
+      delay(100);
+    } else {
+      _waiting_for_connection_callback();
+    }
   }
   return status;
 }
@@ -2207,6 +2211,11 @@ void WiFiManager::setWaitingForClientCallback( std::function<void()> func ) {
   _waiting_for_client_callback = func;
 }
 
+// CUSTOM for Ampel
+void WiFiManager::setWaitingForConnectionCallback( std::function<void()> func ) {
+  _waiting_for_connection_callback = func;
+}
+
 /**
  * set custom head html
  * custom element will be added to head, eg. new style tag etc.
diff --git a/ampel-firmware/src/lib/WiFiManager/WiFiManager.h b/ampel-firmware/src/lib/WiFiManager/WiFiManager.h
index f2fff25..30b8a33 100644
--- a/ampel-firmware/src/lib/WiFiManager/WiFiManager.h
+++ b/ampel-firmware/src/lib/WiFiManager/WiFiManager.h
@@ -219,6 +219,9 @@ class WiFiManager
     //called while waiting for client to connect to config. Used for LEDs
     void          setWaitingForClientCallback( std::function<void()> func );
 
+    //called while waiting for ESP to connect. Used for LEDs
+    void          setWaitingForConnectionCallback( std::function<void()> func );
+
 
     //sets timeout before AP,webserver loop ends and exits even if there has been no setup.
     //useful for devices that failed to connect at some point and got stuck in a webserver loop
@@ -604,6 +607,7 @@ class WiFiManager
     std::function<void()> _saveparamscallback;
     std::function<void()> _resetcallback;
     std::function<void()> _waiting_for_client_callback;
+    std::function<void()> _waiting_for_connection_callback;
 
     template <class T>
     auto optionalIPFromString(T *obj, const char *s) -> decltype(  obj->fromString(s)  ) {
diff --git a/ampel-firmware/wifi_util.cpp b/ampel-firmware/wifi_util.cpp
index be34e99..d38615d 100644
--- a/ampel-firmware/wifi_util.cpp
+++ b/ampel-firmware/wifi_util.cpp
@@ -55,7 +55,7 @@ namespace wifi {
 //    });
 //
     wifiManager.setWaitingForClientCallback([](){
-      led_effects::showRainbowWheel(50); // Shouldn't last too long, web server needs to be able to answer.
+      led_effects::greenAlert();
     });
 //
 //    wifiManager.setWebServerCallback([]() {
@@ -69,7 +69,12 @@ namespace wifi {
 //    wifiManager.setSaveConfigCallback([]() {
 //      led_effects::showKITTWheel(color::magenta);
 //    });
+
+    wifiManager.setWaitingForConnectionCallback([](){
+      led_effects::showRainbowWheel(100);
+    });
 //
+    wifiManager.setSaveConnectTimeout(WIFI_TIMEOUT);
     wifiManager.autoConnect(hostname);
   }
 }
-- 
GitLab