diff --git a/ampel-firmware/ampel-firmware.h b/ampel-firmware/ampel-firmware.h index e477735e63c1ad71e03a855eee7c5e69821184b8..5f8a41fd768ea78dfc3a89a9b51d25174386f873 100644 --- a/ampel-firmware/ampel-firmware.h +++ b/ampel-firmware/ampel-firmware.h @@ -21,8 +21,11 @@ #include "co2_sensor.h" #include "led_effects.h" +void wifiConnecting(); void wifiConnected(); void wifiFailed(); +void apModeStarts(); + void keepServicesAlive(); void checkFlashButton(); diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino index 2270f517ebcac2295397571682f2421b6b3026ec..ba505c9cdfb47422b327d24eec6b3fbb3da72d6b 100644 --- a/ampel-firmware/ampel-firmware.ino +++ b/ampel-firmware/ampel-firmware.ino @@ -67,9 +67,10 @@ void setup() { web_config::initialize(); + web_config::setWifiConnectingCallback(wifiConnecting); web_config::setWifiConnectionCallback(wifiConnected); - web_config::setWifiFailCallback(wifiFailed); + web_config::setApModeCallback(apModeStarts); pinMode(0, INPUT); // Flash button (used for forced calibration) @@ -160,8 +161,16 @@ void loop() { /***************************************************************** * Callbacks * *****************************************************************/ +void wifiConnecting() { + Serial.print(F("WiFi - Trying to connect to ")); + Serial.print(config::selected_ssid()); + Serial.print(F(" for ")); + Serial.print(config::wifi_timeout); + Serial.println(F("s.")); + led_effects::showRainbowWheel(); +} + void wifiConnected() { - led_effects::showKITTWheel(color::green); Serial.println(); Serial.print(F("WiFi - Connected to ")); Serial.print(WiFi.SSID()); @@ -169,6 +178,7 @@ void wifiConnected() { IPAddress address = WiFi.localIP(); snprintf(wifi::local_ip, sizeof(wifi::local_ip), "%d.%d.%d.%d", address[0], address[1], address[2], address[3]); Serial.println(wifi::local_ip); + led_effects::showKITTWheel(color::green); ntp::connect(); @@ -184,11 +194,19 @@ void wifiConnected() { void wifiFailed() { // Ampel will go back to Access Point mode for AP_TIMEOUT seconds, and try connection again after + Serial.println(); Serial.print(F("WiFi - Could not connect to ")); Serial.println(config::selected_ssid()); led_effects::showKITTWheel(color::red); } +void apModeStarts() { + Serial.print(F("WiFi - Starting Access Point mode (")); + Serial.print(config::ampel_name()); + Serial.println(F(").")); + led_effects::alert(color::turquoise); +} + /***************************************************************** * Helper functions * *****************************************************************/ diff --git a/ampel-firmware/led_effects.h b/ampel-firmware/led_effects.h index d37cb5c3bd569ab1a19d273df6c2bbbb5ae5fe37..21be765d9f2b2c54efb2db3193b8081beaf01cab 100644 --- a/ampel-firmware/led_effects.h +++ b/ampel-firmware/led_effects.h @@ -9,6 +9,7 @@ namespace color { const uint32_t blue = 0x0000FF; const uint32_t black = 0x000000; const uint32_t magenta = 0xFF00FF; + const uint32_t turquoise = 0x1CFF68; } namespace led_effects { diff --git a/ampel-firmware/web_config.cpp b/ampel-firmware/web_config.cpp index f96b38ad3510eeab2c6627da6c401241133a63a1..e5db28b68483512aa885f8a1b96dcdab65f64347 100644 --- a/ampel-firmware/web_config.cpp +++ b/ampel-firmware/web_config.cpp @@ -19,7 +19,6 @@ #include "src/lib/IotWebConf/src/IotWebConfOptionalGroup.h" //TODO: Convert all strings to F-strings -//TODO: Add callbacks for states, e.g. AP mode or connecting? namespace web_config { #if defined(ESP8266) @@ -34,6 +33,8 @@ namespace web_config { const char config_version[IOTWEBCONF_CONFIG_VERSION_LENGTH] = AMPEL_CONFIG_VERSION; // -- Configuration specific key. The value should be modified if config structure was changed. using namespace iotwebconf; + std::function<void()> _wifiConnectingCallback = nullptr; + std::function<void()> _apModeCallback= nullptr; /** * WiFi params @@ -160,6 +161,14 @@ namespace web_config { iotWebConf->setWifiConnectionCallback(success_function); } + void setWifiConnectingCallback(void (*fn)()) { + _wifiConnectingCallback = fn; + } + + void setApModeCallback(void (*fn)()) { + _apModeCallback = fn; + } + void setWifiFailCallback(void (*fail_function)()) { std::function<WifiAuthInfo* ()> fail_and_return_null = [fail_function]() { fail_function(); @@ -277,7 +286,6 @@ namespace web_config { //NOTE: Can only work if wifi is on. sensor_console::defineIntCommand("ap", [](int onOff) { - //TODO: Add On-board LED effects to show the changes? if (onOff) { Serial.print(F("Enable ")); } else { @@ -287,6 +295,15 @@ namespace web_config { iotWebConf->forceApMode(onOff); }, F("0/1 (Enables/disables access point)")); + iotWebConf->setStateChangedCallback([](NetworkState in, NetworkState out){ + if (out == NetworkState::Connecting && _wifiConnectingCallback != nullptr){ + _wifiConnectingCallback(); + } else if (out == NetworkState::ApMode && _apModeCallback != nullptr){ + _apModeCallback(); + } + }); + + iotWebConf->setWifiConnectionTimeoutMs(1000UL * config::wifi_timeout); iotWebConf->skipApStartup(); diff --git a/ampel-firmware/web_config.h b/ampel-firmware/web_config.h index f0ab8d92be12dee72be7bc994d12595b8c1f289f..820b46bc33d7d08d3b17803cddabeb598599129e 100644 --- a/ampel-firmware/web_config.h +++ b/ampel-firmware/web_config.h @@ -69,6 +69,8 @@ namespace web_config { void initialize(); void setWifiConnectionCallback(void (*success_function)()); void setWifiFailCallback(void (*fail_function)()); + void setWifiConnectingCallback(void (*connecting_function)()); + void setApModeCallback(void (*ap_mode_function)()); void update(); #if defined(ESP8266) diff --git a/ampel-firmware/wifi_util.cpp b/ampel-firmware/wifi_util.cpp index 795eeeb9a826f1745e2df9268ce4c5ddc54625ca..4e50ec52e219afac95f0710e6a3bd250ecf9e309 100644 --- a/ampel-firmware/wifi_util.cpp +++ b/ampel-firmware/wifi_util.cpp @@ -37,7 +37,7 @@ namespace wifi { web_config::update(); sensor_console::checkSerialInput(); // To allow reset or ssid ... during startup if (isAccessPoint()) { - led_effects::alert(0x1cff68); + led_effects::alert(color::turquoise); } else if (connected()) { break; } else {