From 9d2273ccb98184230626addf3910344246526469 Mon Sep 17 00:00:00 2001 From: wile1411 Date: Tue, 5 Mar 2024 13:36:58 +1100 Subject: [PATCH 01/11] Update leds.h Clarify comments of color changed --- src/leds.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/leds.h b/src/leds.h index c935d45..1cc9827 100644 --- a/src/leds.h +++ b/src/leds.h @@ -209,7 +209,7 @@ void updateleds(){ //GREEN if ((millis() - printerVariables.finishstartms) <= 300000 && printerVariables.gcodeState == "FINISH" && printerConfig.finishindication == true){ - tweenToColor(0,255,0,0,0,500); //ON + tweenToColor(0,255,0,0,0,500); //GREEN if (printerConfig.debuging){ Serial.println(F("Finished print, Turning Leds green")); Serial.println(F("Leds should stay on for: ")); @@ -222,7 +222,7 @@ void updateleds(){ //BLUE if (printerVariables.stage == 2 && printerVariables.gcodeState == "PAUSE"){// Pause - tweenToColor(0,0,255,0,0,500); //Blue + tweenToColor(0,0,255,0,0,500); //BLUE if (printerConfig.debuging){ Serial.println(F("Pause, Turning Leds blue")); }; @@ -232,7 +232,7 @@ void updateleds(){ //ON if (printerVariables.stage == 0 || printerVariables.stage == 2 && printerVariables.gcodeState == "RUNNING"){ //Printing or Resume after Pausing - tweenToColor(0,0,0,255,255,500); //ON + tweenToColor(0,0,0,255,255,500); //WHITE if (printerConfig.debuging){ Serial.println(F("Printing, Turning Leds On")); }; @@ -240,7 +240,7 @@ void updateleds(){ } if (printerVariables.stage == -1){ // Idle - tweenToColor(0,0,0,255,255,500); //ON + tweenToColor(0,0,0,255,255,500); //WHITE if (printerConfig.debuging){ Serial.println(F("Idle, Turning Leds On")); }; @@ -248,7 +248,7 @@ void updateleds(){ } if (printerVariables.stage == -2){ //Offline - tweenToColor(0,0,0,255,255,500); //ON + tweenToColor(0,0,0,255,255,500); //WHITE if (printerConfig.debuging){ Serial.println(F("Stage -2, Turning Leds On")); }; From d687b25f12b7692cbc8d989554b6ecd9ffd3ef11 Mon Sep 17 00:00:00 2001 From: wile1411 Date: Tue, 5 Mar 2024 13:39:15 +1100 Subject: [PATCH 02/11] Update main.cpp Added Comments for Color Changes --- src/main.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4b02d71..8ce54e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,18 +13,18 @@ void setup(){ Serial.println(F("Initializing")); Serial.println(ESP.getFreeHeap()); setupLeds(); - tweenToColor(255,255,255,255,255,500); + tweenToColor(255,255,255,255,255,500); //ALL LEDS ON delay(2000); - tweenToColor(255,0,0,0,0,500); + tweenToColor(255,0,0,0,0,500); //RED setupFileSystem(); loadFileSystem(); delay(2000); - tweenToColor(255,165,0,0,0,500); + tweenToColor(255,165,0,0,0,500); //ORANGE setupSerial(); if (strlen(globalVariables.SSID) == 0 || strlen(globalVariables.APPW) == 0) { Serial.println(F("SSID or password is missing. Please configure both by going to: https://dutchdevelop.com/blled-configuration-setup/")); - tweenToColor(255,0,255,0,0,500); + tweenToColor(255,0,255,0,0,500); //PINK return; } @@ -32,12 +32,12 @@ void setup(){ return; }; delay(2000); - tweenToColor(0,0,255,0,0,500); + tweenToColor(0,0,255,0,0,500); //BLUE setupWebserver(); delay(2000); - tweenToColor(0,0,0,0,0,500); + tweenToColor(0,0,0,0,0,500); //OFF setupMqtt(); Serial.println(F("BLLED Controller started")); @@ -57,4 +57,4 @@ void loop(){ WiFi.reconnect(); } } -} \ No newline at end of file +} From 172bd5b77b1c4f91e06f499cd7e6b6b7ee2b3f9c Mon Sep 17 00:00:00 2001 From: wile1411 Date: Sat, 9 Mar 2024 15:40:35 +1100 Subject: [PATCH 03/11] Adding test LED buttons --- src/leds.h | 56 +++++++++------ src/main.cpp | 12 +++- src/types.h | 8 +++ src/web-server.h | 10 +++ src/www/setuppage.html | 153 ++++++++++++++++++++++++++++++----------- 5 files changed, 173 insertions(+), 66 deletions(-) diff --git a/src/leds.h b/src/leds.h index 1cc9827..7729d5d 100644 --- a/src/leds.h +++ b/src/leds.h @@ -27,9 +27,9 @@ void tweenToColor(int targetRed, int targetGreen, int targetBlue, int targetWarm int brightenedCold = round(targetCold * brightness); if (brightenedRed == currentRed && brightenedGreen == currentGreen && brightenedBlue == currentBlue && brightenedWarm == currentWarm && brightenedCold == currentCold){ - if (printerConfig.debuging){ - Serial.println(F("LEDS Trying to change to the same color.")); - }; + //if (printerConfig.debuging){ + // Serial.println(F("LEDS Trying to change to the same color.")); + //}; return; // already at that color } float stepTime = (float)duration / 255.0; @@ -108,16 +108,24 @@ void RGBCycle() { void updateleds(){ if (printerConfig.debuging){ - Serial.println(F("Updating leds")); + //Serial.println(F("Updating leds")); - Serial.println(printerVariables.stage); - Serial.println(printerVariables.gcodeState); - Serial.println(printerVariables.ledstate); - Serial.println(printerVariables.hmsstate); - Serial.println(printerVariables.parsedHMS); + //Serial.println(printerVariables.stage); + //Serial.println(printerVariables.gcodeState); + //Serial.println(printerVariables.ledstate); + //Serial.println(printerVariables.hmsstate); + //Serial.println(printerVariables.parsedHMS); } - //OFF + + if (printerVariables.overrideLEDstate == true){ //Force LED ON regardless of state (via webpage) + tweenToColor(0,0,0,255,255,500); //WHITE + if (printerConfig.debuging){ + Serial.println(F("LED Override ON, Turning Leds On")); + }; + return; + } + //OFF if (printerConfig.turbo == true){ return; } @@ -138,15 +146,17 @@ void updateleds(){ return; } - if (printerVariables.stage == 14){ //Cleaning nozzle + if (printerVariables.stage == 14 && printerVariables.previous_stage != printerVariables.stage){ //Cleaning nozzle tweenToColor(0,0,0,0,0,500); //OFF + printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging){ Serial.println(F("Cleaning nozzle, Turning Leds off")); }; return; } - if (printerVariables.stage == 9){ //Scaning surface + if (printerVariables.stage == 9 && printerVariables.previous_stage != printerVariables.stage){ //Scaning surface + printerVariables.previous_stage = printerVariables.stage; tweenToColor(0,0,0,0,0,500); //OFF if (printerConfig.debuging){ Serial.println(F("Scanning Surface, Turning Leds off")); @@ -173,15 +183,16 @@ void updateleds(){ return; } - if (printerVariables.stage == 6){ //Fillament runout + if (printerVariables.stage == 6 && printerVariables.previous_stage != printerVariables.stage){ //Fillament runout tweenToColor(255,0,0,0,0,500); //RED + printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging){ Serial.println(F("Fillament runout, Turning Leds red")); }; return; } - if (printerVariables.stage == 17){ //Front Cover Removed + if (printerVariables.stage == 17 && printerVariables.previous_stage != printerVariables.stage){ //Front Cover Removed tweenToColor(255,0,0,0,0,500); //RED if (printerConfig.debuging){ Serial.println(F("Front Cover Removed, Turning Leds red")); @@ -189,7 +200,7 @@ void updateleds(){ return; } - if (printerVariables.stage == 20){ //Nozzle Temp fail + if (printerVariables.stage == 20 && printerVariables.previous_stage != printerVariables.stage){ //Nozzle Temp fail tweenToColor(255,0,0,0,0,500); //RED if (printerConfig.debuging){ Serial.println(F("Nozzle Temp fail, Turning Leds red")); @@ -197,7 +208,7 @@ void updateleds(){ return; } - if (printerVariables.stage == 21){ //Bed Temp Fail + if (printerVariables.stage == 21 && printerVariables.previous_stage != printerVariables.stage){ //Bed Temp Fail tweenToColor(255,0,0,0,0,500); //RED if (printerConfig.debuging){ Serial.println(F("Bed Temp fail, Turning Leds red")); @@ -208,8 +219,9 @@ void updateleds(){ //GREEN - if ((millis() - printerVariables.finishstartms) <= 300000 && printerVariables.gcodeState == "FINISH" && printerConfig.finishindication == true){ + if ((millis() - printerVariables.finishstartms) <= 300000 && printerVariables.gcodeState == "FINISH" && printerVariables.previous_gcodeState != printerVariables.gcodeState && printerConfig.finishindication == true){ tweenToColor(0,255,0,0,0,500); //GREEN + printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging){ Serial.println(F("Finished print, Turning Leds green")); Serial.println(F("Leds should stay on for: ")); @@ -221,8 +233,9 @@ void updateleds(){ //BLUE - if (printerVariables.stage == 2 && printerVariables.gcodeState == "PAUSE"){// Pause + if (printerVariables.stage == 2 && printerVariables.gcodeState == "PAUSE" && printerVariables.previous_gcodeState != printerVariables.gcodeState){// Pause tweenToColor(0,0,255,0,0,500); //BLUE + printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging){ Serial.println(F("Pause, Turning Leds blue")); }; @@ -231,8 +244,9 @@ void updateleds(){ //ON - if (printerVariables.stage == 0 || printerVariables.stage == 2 && printerVariables.gcodeState == "RUNNING"){ //Printing or Resume after Pausing + if (printerVariables.stage == 0 || printerVariables.stage == 2 && printerVariables.gcodeState == "RUNNING" && printerVariables.previous_gcodeState != printerVariables.gcodeState){ //Printing or Resume after Pausing tweenToColor(0,0,0,255,255,500); //WHITE + printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging){ Serial.println(F("Printing, Turning Leds On")); }; @@ -257,21 +271,21 @@ void updateleds(){ } void setupLeds() { + Serial.println(F("Updating from setupleds")); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); pinMode(coldPin, OUTPUT); pinMode(warmPin, OUTPUT); - Serial.println(F("Updating from setupleds")); updateleds(); } void ledsloop(){ RGBCycle(); if((printerVariables.finishstartms > 0 && millis() - printerVariables.finishstartms) >= 300000 && printerVariables.gcodeState == "FINISH"){ + Serial.println(F("Updating from finishloop")); printerVariables.finishstartms = 0; printerVariables.gcodeState = "IDLE"; - Serial.println(F("Updating from finishloop")); updateleds(); } delay(10); diff --git a/src/main.cpp b/src/main.cpp index 8ce54e5..24d82a2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,11 +15,13 @@ void setup(){ setupLeds(); tweenToColor(255,255,255,255,255,500); //ALL LEDS ON delay(2000); + tweenToColor(255,0,0,0,0,500); //RED setupFileSystem(); loadFileSystem(); delay(2000); - tweenToColor(255,165,0,0,0,500); //ORANGE + + tweenToColor(255,165,0,0,0,500); //YELLOW setupSerial(); if (strlen(globalVariables.SSID) == 0 || strlen(globalVariables.APPW) == 0) { @@ -37,7 +39,7 @@ void setup(){ delay(2000); - tweenToColor(0,0,0,0,0,500); //OFF + tweenToColor(34,224,238,0,0,500); //CYAN setupMqtt(); Serial.println(F("BLLED Controller started")); @@ -47,7 +49,11 @@ void setup(){ void loop(){ serialLoop(); - if (globalVariables.started == true){ + if (printerVariables.overrideLEDstate == true){ + webserverloop(); + ledsloop(); + } + else if (globalVariables.started == true){ mqttloop(); webserverloop(); ledsloop(); diff --git a/src/types.h b/src/types.h index 6b599d3..85616de 100644 --- a/src/types.h +++ b/src/types.h @@ -9,7 +9,10 @@ extern "C" typedef struct PrinterVaraiblesStruct{ String parsedHMS = ""; String gcodeState = "IDLE"; + String previous_gcodeState = "IDLE"; int stage = 0; + int previous_stage = 0; + bool overrideLEDstate = false; bool ledstate = true; bool hmsstate = false; bool online = false; @@ -34,6 +37,11 @@ extern "C" { int brightness = 100; bool replicatestate = true; + bool overrideRed = false; + bool overrideGreen = false; + bool overrideBlue = false; + bool overrideWarmWhite = false; + bool overrideColdWhite = false; bool errordetection = true; bool finishindication = true; bool debuging = true; diff --git a/src/web-server.h b/src/web-server.h index e15e0ab..9fa74cb 100644 --- a/src/web-server.h +++ b/src/web-server.h @@ -40,6 +40,11 @@ void submitSetup(){ printerConfig.finishindication = webServer.arg("finishIndication") == "on"; printerConfig.debuging = webServer.arg("debuging") == "on"; printerConfig.mqttdebug = webServer.arg("mqttdebug") == "on"; + printerConfig.overrideRed = webServer.arg("overrideRed") == "on"; + printerConfig.overrideGreen = webServer.arg("overrideGreen") == "on"; + printerConfig.overrideBlue = webServer.arg("overrideBlue") == "on"; + printerConfig.overrideWarmWhite = webServer.arg("overrideWarmWhite") == "on"; + printerConfig.overrideColdWhite = webServer.arg("overrideColdWhite") == "on"; printerConfig.brightness = webServer.arg("brightnessslider").toInt(); saveFileSystem(); @@ -67,6 +72,11 @@ void handleGetConfig(){ doc["finishindication"] = printerConfig.finishindication; doc["debuging"] = printerConfig.debuging; doc["mqttdebug"] = printerConfig.mqttdebug; + doc["overrideRed"] = printerConfig.overrideRed; + doc["overrideGreen"] = printerConfig.overrideGreen; + doc["overrideBlue"] = printerConfig.overrideBlue; + doc["overrideWarmWhite"] = printerConfig.overrideWarmWhite; + doc["overrideColdWhite"] = printerConfig.overrideColdWhite; const char* firmwareVersionChar = globalVariables.FWVersion.c_str(); doc["firmwareversion"] = firmwareVersionChar; diff --git a/src/www/setuppage.html b/src/www/setuppage.html index d258569..de340b2 100644 --- a/src/www/setuppage.html +++ b/src/www/setuppage.html @@ -134,6 +134,19 @@ } - - - - - diff --git a/src/www/wifiSetup.html b/src/www/wifiSetup.html deleted file mode 100644 index b79697f..0000000 --- a/src/www/wifiSetup.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - -
-
- - BLLEDController -
- - -
- - - - - - \ No newline at end of file From 199ebf4f56b7e9ce829667d5d7a6f3c871919986 Mon Sep 17 00:00:00 2001 From: Adam Douglas Date: Mon, 11 Mar 2024 22:04:26 +1100 Subject: [PATCH 05/11] readded removed files - added more green --- esphome.html | 7 ++ src/filesystem.h | 6 +- src/leds.h | 260 +++++++++++++++++++++++++++++---------- src/main.cpp | 5 +- src/mqttmanager.h | 97 ++++++++------- src/mqttparsingutility.h | 36 ++++++ src/types.h | 13 +- src/wifi-manager.h | 3 +- src/www/updatePage.h | 113 +++++++++++++++++ src/www/updatepage.html | 175 ++++++++++++++++++++++++++ src/www/wifiSetup.html | 224 +++++++++++++++++++++++++++++++++ 11 files changed, 821 insertions(+), 118 deletions(-) create mode 100644 esphome.html create mode 100644 src/www/updatePage.h create mode 100644 src/www/updatepage.html create mode 100644 src/www/wifiSetup.html diff --git a/esphome.html b/esphome.html new file mode 100644 index 0000000..9445843 --- /dev/null +++ b/esphome.html @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/src/filesystem.h b/src/filesystem.h index 566569f..f5525e7 100644 --- a/src/filesystem.h +++ b/src/filesystem.h @@ -52,7 +52,7 @@ void saveFileSystem(){ serializeJson(json, configFile); configFile.close(); - Serial.println(F("Config Saved")); + if (printerConfig.debuging) Serial.println(F("Config Saved")); } void loadFileSystem(){ @@ -104,7 +104,7 @@ void loadFileSystem(){ printerConfig.mqttdebug = json["mqttdebug"]; strcpy(printerConfig.BSSID, json["bssi"]); - Serial.println(F("Loaded config")); + if (printerConfig.debuging) Serial.println(F("Loaded config")); } else { Serial.println(F("Failed loading config")); Serial.println(F("Clearing config")); @@ -133,6 +133,8 @@ void setupFileSystem(){ Serial.println(F("Failed to mount LittleFS")); LittleFS.format(); Serial.println(F("Formatting LittleFS")); + Serial.println(F("Restarting Device")); + Serial.println(""); ESP.restart(); } Serial.println(F("Mounted LittleFS")); diff --git a/src/leds.h b/src/leds.h index 3524637..952399a 100644 --- a/src/leds.h +++ b/src/leds.h @@ -107,8 +107,26 @@ void RGBCycle() { analogWrite(coldPin, currentCold); } +void debugState(){ + Serial.print(printerVariables.stage); + Serial.print(F(" ")); + Serial.print(printerVariables.previous_stage); + Serial.print(F(" ")); + Serial.print(printerVariables.gcodeState); + Serial.print(F(" ")); + Serial.print(printerVariables.previous_gcodeState); + Serial.print(F(" ")); + Serial.print(printerVariables.finishstartms); + Serial.print(F(" ")); + Serial.print(printerVariables.idleStartms); + Serial.print(F(" ")); + Serial.println(printerVariables.finished); +} + void updateleds(){ - if (printerConfig.debuging){ + int LEDTranistion_Duration = 500; + + if (printerConfig.debuging == true){ Serial.println(F("Updating leds")); Serial.println(printerVariables.stage); @@ -122,12 +140,12 @@ void updateleds(){ //<=-50 dBm Green, <= -60 dBm LightGreen, <= -70 dBm Yellow, <= -80 dBm Orange, >80 Red if (WiFi.status() == WL_CONNECTED){ long wifiNow = WiFi.RSSI(); - if (wifiNow >= -50) tweenToColor(0,255,0,0,0,500); //GREEN - else if (wifiNow >= -60) tweenToColor(128,255,0,0,0,500); //LIGHTGREEN - else if (wifiNow >= -70) tweenToColor(255,255,0,0,0,500); //YELLOW - else if (wifiNow >= -80) tweenToColor(255,128,0,0,0,500); //ORANGE - else if (wifiNow < -80) tweenToColor(255,0,0,0,0,500); //RED - else tweenToColor(0,0,255,0,0,500); //BLUE + if (wifiNow >= -50) tweenToColor(0,255,0,0,0,LEDTranistion_Duration); //GREEN + else if (wifiNow >= -60) tweenToColor(128,255,0,0,0,LEDTranistion_Duration); //LIGHTGREEN + else if (wifiNow >= -70) tweenToColor(255,255,0,0,0,LEDTranistion_Duration); //YELLOW + else if (wifiNow >= -80) tweenToColor(255,128,0,0,0,LEDTranistion_Duration); //ORANGE + else if (wifiNow < -80) tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED + else tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE return; } } @@ -144,160 +162,268 @@ void updateleds(){ if(printerConfig.overrideColdWhite == true){ cw_LED = 255;} if(printerConfig.overrideWarmWhite == true){ ww_LED = 255;} - tweenToColor(r_LED,g_LED,b_LED,cw_LED,ww_LED,500); //Variable Test Color + tweenToColor(r_LED,g_LED,b_LED,cw_LED,ww_LED,LEDTranistion_Duration); //Variable Test Color if (printerConfig.debuging){ - Serial.println(F("LED Override ON, Turning Leds On")); + Serial.println(F("LED Test Override ON, Turning Leds On")); }; return; } + + //TOGGLE LIGHTS + //If door is closed twice in 6 seconds, it will flip the state of the lights + if (printerVariables.doorSwitchenabled == true){ + if (printerConfig.debugingchange){ + Serial.print(F("Door closed twice within 6 seconds - Toggling lights to ")); + } + if(currentWarm == 0 && currentCold == 0) + { + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + //if (printerConfig.debuging || printerConfig.debugingchange) + Serial.println(F("ON")); + } + else + { + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + //if (printerConfig.debuging || printerConfig.debugingchange) + Serial.println(F("OFF")); + } + printerVariables.doorSwitchenabled = false; + } + //OFF if (printerConfig.discoMode == true){ - //Skip setting specific colors if RGB Mode is on - done in RGBCycle() + //Skip all the following code that sets specific colors if RGB Mode is on - done in RGBCycle() return; } if (printerVariables.online == false && (millis() - printerVariables.disconnectMQTTms) >= 5000){ //printer offline and MQTT disconnect more than 5 seconds. - tweenToColor(0,0,0,0,0,500); //OFF - if (printerConfig.debuging){ - Serial.println(F("Printer offline, Turning Leds off")); + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Printer offline, Turning Leds OFF")); }; return; } if (printerVariables.ledstate == false && printerConfig.replicatestate == true){ // replicate printer behaviour - tweenToColor(0,0,0,0,0,500); //OFF + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Chamber light off, Turning Leds off")); + Serial.println(F("LED Replication, Turning Leds OFF")); }; return; } if (printerVariables.stage == 14 && printerVariables.previous_stage != printerVariables.stage){ //Cleaning nozzle - tweenToColor(0,0,0,0,0,500); //OFF + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Cleaning nozzle, Turning Leds off")); + Serial.println(F("Stage 14, CLEANING NOZZLE, Turning Leds OFF")); + }; + return; + } + + if (printerVariables.stage == 1 && printerVariables.previous_stage != printerVariables.stage){ //Auto Bed Leveling + printerVariables.previous_stage = printerVariables.stage; + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 1, BED LEVELING, Turning Leds OFF")); + }; + return; + } + + if (printerVariables.stage == 8 && printerVariables.previous_stage != printerVariables.stage){ //Calibrating Extrusion + printerVariables.previous_stage = printerVariables.stage; + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 8, CALIBRATING EXTRUSION, Turning Leds OFF")); }; return; } if (printerVariables.stage == 9 && printerVariables.previous_stage != printerVariables.stage){ //Scaning surface printerVariables.previous_stage = printerVariables.stage; - tweenToColor(0,0,0,0,0,500); //OFF + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Scanning Surface, Turning Leds off")); + Serial.println(F("Stage 9, SCANNING BED SURFACE, Turning Leds OFF")); + }; + return; + } + + if (printerVariables.stage == 10 && printerVariables.previous_stage != printerVariables.stage){ //Inspecting First Layer + printerVariables.previous_stage = printerVariables.stage; + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 10, FIRST LAYER INSPECTION, Turning Leds OFF")); }; return; } - - //RED + if (printerVariables.stage == 12 && printerVariables.previous_stage != printerVariables.stage){ //Calibrating MicroLidar + printerVariables.previous_stage = printerVariables.stage; + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 12, CALIBRATING MICRO LIDAR, Turning Leds OFF")); + }; + return; + } + + if ((printerVariables.stage == -1 || printerVariables.stage == 255) && printerVariables.finishstartms == 0 + && (millis() - printerVariables.idleStartms) > 1800000 && printerVariables.previous_gcodeState == "TIMEOUT"){ // 30 min Idle Timeout + printerVariables.previous_gcodeState = printerVariables.gcodeState; + tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Idle Timeout over 30min, Turning Leds OFF")); + }; + return; + } + + //RED if (printerConfig.errordetection == true){ // allow errordetection to turn ledstrip red if (printerVariables.parsedHMS == "Serious"){ - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Serious problem, Turning Leds red")); + Serial.println(F("HMS Severity, SERIOUS PROBLEM, Turning Leds RED")); }; return; - } + }; if (printerVariables.parsedHMS == "Fatal"){ - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Fatal problem, Turning Leds red")); + Serial.println(F("HMS Severity, FATAL PROBLEM, Turning Leds RED")); }; return; - } + }; if (printerVariables.stage == 6 && printerVariables.previous_stage != printerVariables.stage){ //Fillament runout - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Fillament runout, Turning Leds red")); + Serial.println(F("Stage 17, FILAMENT RUNOUT, Turning Leds RED")); }; return; - } + }; if (printerVariables.stage == 17 && printerVariables.previous_stage != printerVariables.stage){ //Front Cover Removed - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Front Cover Removed, Turning Leds red")); + Serial.println(F("Stage 17, FRONT COVER REMOVED, Turning Leds RED")); }; return; - } + }; if (printerVariables.stage == 20 && printerVariables.previous_stage != printerVariables.stage){ //Nozzle Temp fail - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Nozzle Temp fail, Turning Leds red")); + Serial.println(F("Stage 20, NOZZLE TEMP FAIL, Turning Leds RED")); }; return; - } + }; if (printerVariables.stage == 21 && printerVariables.previous_stage != printerVariables.stage){ //Bed Temp Fail - tweenToColor(255,0,0,0,0,500); //RED + tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Bed Temp fail, Turning Leds red")); + Serial.println(F("Stage 21, BED TEMP FAIL, Turning Leds RED")); }; return; - } + }; }; //GREEN //Sets to green when print finishes //Stays green until 5mins has passed AND door is opened - if ((printerVariables.doorOpen == false || (millis() - printerVariables.finishstartms) <= 300000) && printerVariables.gcodeState == "FINISH" && printerVariables.previous_gcodeState != printerVariables.gcodeState && printerConfig.finishindication == true){ - tweenToColor(0,255,0,0,0,500); //GREEN + if (printerVariables.gcodeState == "FINISH" && printerVariables.previous_gcodeState != printerVariables.gcodeState + && printerConfig.finishindication == true && printerVariables.previous_gcodeState != "TIMEOUT"){ + tweenToColor(0,255,0,0,0,LEDTranistion_Duration); //GREEN printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Finished print, Turning Leds green")); - Serial.println(F("Leds should stay on for: ")); - Serial.print((millis() - printerVariables.finishstartms)); - Serial.print(F(" MS")); + Serial.println(F("Finished print, Turning Leds GREEN")); }; return; } //BLUE - - if (printerVariables.stage == 2 && printerVariables.gcodeState == "PAUSE" && printerVariables.previous_gcodeState != printerVariables.gcodeState){// Pause - tweenToColor(0,0,255,0,0,500); //BLUE + if ((printerVariables.stage == 6 || printerVariables.stage == 30) || printerVariables.gcodeState == "PAUSE" + && printerVariables.previous_gcodeState != printerVariables.gcodeState){// Pause + tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Pause, Turning Leds blue")); + Serial.print(F("Stage ")); + Serial.print(printerVariables.stage); + Serial.println(F(", gcodeState PAUSE, Turning Leds BLUE")); + }; + return; + } + if (printerVariables.stage == 34 && printerVariables.previous_stage != printerVariables.stage){ //First Layer Error PAUSED + tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 34, FIRST LAYER ERROR, PAUSED Turning Leds BLUE")); + }; + return; + } + if (printerVariables.stage == 35 && printerVariables.previous_stage != printerVariables.stage){ //Nozzle Clog PAUSED + tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 35, NOZZLE CLOG, PAUSED Turning Leds BLUE")); }; return; } //ON + if (printerVariables.stage == 2 && printerVariables.previous_stage != printerVariables.stage){ //Offline + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + printerVariables.previous_stage = printerVariables.stage; + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Stage 2, PREHEATING BED, Turning Leds WHITE")); + }; + return; + } - if (printerVariables.stage == 0 || printerVariables.stage == 2 && printerVariables.gcodeState == "RUNNING" && printerVariables.previous_gcodeState != printerVariables.gcodeState){ //Printing or Resume after Pausing - tweenToColor(0,0,0,255,255,500); //WHITE + if (printerVariables.stage == 0 && printerVariables.gcodeState == "RUNNING" && printerVariables.previous_stage != printerVariables.stage ){ //Printing or Resume after Pausing + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE printerVariables.previous_gcodeState = printerVariables.gcodeState; + printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Printing, Turning Leds On")); + Serial.print(F("Stage 0, PRINTING - gcodeState RUNNING, Turning Leds WHITE")); }; return; } - if (printerVariables.stage == -1){ // Idle - tweenToColor(0,0,0,255,255,500); //WHITE + + if ((printerVariables.stage == -1 || printerVariables.stage == 255) && printerVariables.finishstartms == 0 + && (millis() - printerVariables.idleStartms < 1800000) && printerVariables.previous_stage != printerVariables.stage + && printerVariables.previous_gcodeState != "TIMEOUT"){ // Idle + //for IDLE - P1 uses 255, X1 uses -1 + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + printerVariables.previous_gcodeState = "TIMEOUT"; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Idle, Turning Leds On")); + Serial.print(F("Stage ")); + Serial.print(printerVariables.stage); + Serial.println(F(", IDLE Turning Leds WHITE")); }; return; } - if (printerVariables.stage == -2){ //Offline - tweenToColor(0,0,0,255,255,500); //WHITE + if (printerVariables.stage == -2 && printerVariables.previous_stage != printerVariables.stage){ //Offline + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Stage -2, Turning Leds On")); + Serial.println(F("Stage -2, Turning Leds WHITE")); }; return; } + + if (printerVariables.initalisedLEDs == false) { //Initial Boot + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + printerVariables.initalisedLEDs = true; + printerVariables.idleStartms = millis(); + printerVariables.finishstartms = 0; + Serial.println(F("Initial BLLED bootup - Turning Leds WHITE")); + return; + } } + void setupLeds() { Serial.println(F("Updating from setupleds")); pinMode(redPin, OUTPUT); @@ -305,15 +431,25 @@ void setupLeds() { pinMode(bluePin, OUTPUT); pinMode(coldPin, OUTPUT); pinMode(warmPin, OUTPUT); - updateleds(); } void ledsloop(){ RGBCycle(); - if((printerVariables.finishstartms > 0 && millis() - printerVariables.finishstartms) >= 300000 && printerVariables.gcodeState == "FINISH" && printerVariables.doorOpen == true){ - Serial.println(F("Updating from finishloop")); + + // Turn off GREEN if... HAS a finished and Door OPENED or CLOSED in last 5 secs + // Can't use Boolean finished as printer defaults back to IDLE via MQTT + if((printerVariables.finishstartms > 0 && ((millis() - printerVariables.lastdoorClosems) < 6000 || (millis() - printerVariables.lastdoorOpenms) < 6000))){ + tweenToColor(0,0,0,255,255,500); //WHITE + Serial.println(F("Updating from finishloop after Door interaction - Starting IDLE timer")); printerVariables.finishstartms = 0; - printerVariables.gcodeState = "IDLE"; + printerVariables.previous_gcodeState = "TIMEOUT"; + printerVariables.idleStartms = millis(); + updateleds(); + } + if((millis() - printerVariables.idleStartms) > 1800000) + { + //30mins idle timer kicks in and will turn off the LEDS. + //Opening or Closing the Door will turn it back on and restart the timer. updateleds(); } delay(10); diff --git a/src/main.cpp b/src/main.cpp index 736fa7d..5957d80 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,6 +44,7 @@ void setup(){ delay(1000); Serial.println(F("BLLED Controller started")); + Serial.println(F("")); globalVariables.started = true; } @@ -68,9 +69,9 @@ void loop(){ else{ //Monitor Wifi Strength long wifiNow = WiFi.RSSI(); - if (wifiNow > (printerVariables.lastRSSI + 5) || wifiNow < (printerVariables.lastRSSI - 5)) + if (wifiNow > (printerVariables.lastRSSI + 9) || wifiNow < (printerVariables.lastRSSI - 9)) { - //Wifi strength changed by +/- 4dBm + //Wifi strength changed by +/- 10dBm if (printerConfig.debugingchange){ Serial.print(F("Wifi Strength now ")); Serial.println(wifiNow); diff --git a/src/mqttmanager.h b/src/mqttmanager.h index 15963ae..b4ed691 100644 --- a/src/mqttmanager.h +++ b/src/mqttmanager.h @@ -30,43 +30,21 @@ void connectMqtt(){ if (!mqttClient.connected() && (millis() - mqttattempt) >= 3000){ Serial.println(F("Connecting to mqtt")); if (mqttClient.connect(clientId.c_str(),"bblp",printerConfig.accessCode)){ - Serial.println(F("MWTT connected, subscribing to topic:")); + Serial.println(F("MQTT connected, subscribing to topic:")); Serial.println(report_topic); mqttClient.subscribe(report_topic.c_str()); printerVariables.online = true; - Serial.println(F("Updating from mqtt connnection")); + printerVariables.disconnectMQTTms = 0; + Serial.println(F("updating from MQTT connect")); updateleds(); }else{ Serial.println(F("Failed to connect with error code: ")); Serial.println(mqttClient.state()); - switch (mqttClient.state()) - { - case -4: // MQTT_CONNECTION_TIMEOUT - Serial.println(F("MQTT TIMEOUT")); - break; - case -2: // MQTT_CONNECT_FAILED - Serial.println(F("MQTT CONNECT_FAILED")); - break; - case -3: // MQTT_CONNECTION_LOST - Serial.println(F("MQTT CONNECTION_LOST")); - break; - case -1: // MQTT_DISCONNECTED - Serial.println(F("MQTT DISCONNECTED")); - break; - case 1: - break; - case 2: - break; - case 3: - break; - case 4: - break; - case 5: // MQTT UNAUTHORIZED - Serial.println(F("MQTT UNAUTHORIZED")); + ParseMQTTState(mqttClient.state()); + if(mqttClient.state() == 5){ Serial.println(F("Restarting Device")); Serial.println(""); - ESP.restart(); - break; + ESP.restart(); } } } @@ -97,10 +75,26 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ } bool Changed = false; + + //Ideally, we should only monitor MQTT meessages with command = "push_status" + //stg_cur & lights_report will be missing from other command types + if (messageobject["print"].containsKey("command")){ + //gcode_line used a lot during print initialisations + if (messageobject["print"]["command"].as() != "push_status"){ + if (printerConfig.debuging) Serial.println(F("unknown MQTT message - Ignored")); + return; + } + } + else{ + if (printerConfig.debuging) Serial.println(F("missing command Key - Ignored")); + return; + } + + //Check BBLP Stage if (messageobject["print"].containsKey("stg_cur")){ - if (printerVariables.stage != messageobject["print"]["stg_cur"]){ + if (printerVariables.stage != messageobject["print"]["stg_cur"].as() ){ printerVariables.stage = messageobject["print"]["stg_cur"]; - if (printerConfig.debugingchange){ + if (printerConfig.debuging){ Serial.print(F("MQTT stg_cur now: ")); Serial.println(printerVariables.stage); } @@ -112,10 +106,10 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ } } + //Check BBLP GCode State if (messageobject["print"].containsKey("gcode_state")){ if(printerVariables.gcodeState != messageobject["print"]["gcode_state"].as()){ - printerVariables.gcodeState = messageobject["print"]["gcode_state"].as(); - if (printerVariables.gcodeState == "FINISH"){ + if (messageobject["print"]["gcode_state"].as() == "FINISH"){ if (printerVariables.finished == false){ printerVariables.finished = true; printerVariables.finishstartms = millis(); @@ -123,7 +117,8 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ }else{ printerVariables.finished = false; } - if (printerConfig.debugingchange){ + printerVariables.gcodeState = messageobject["print"]["gcode_state"].as(); + if (printerConfig.debuging){ Serial.print(F("MQTT gcode_state now: ")); Serial.println(printerVariables.gcodeState); } @@ -131,6 +126,7 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ } } + if (messageobject["print"].containsKey("lights_report")) { JsonArray lightsReport = messageobject["print"]["lights_report"]; @@ -165,8 +161,10 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ } } if(oldHMS != printerVariables.parsedHMS){ - Serial.print(F("MQTT parsedHMS now: ")); - Serial.println(printerVariables.parsedHMS); + if (printerConfig.debuging){ + Serial.print(F("MQTT parsedHMS now: ")); + Serial.println(printerVariables.parsedHMS); + } Changed = true; } } @@ -182,16 +180,22 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ if (printerVariables.doorOpen != doorState){ printerVariables.doorOpen = doorState; - if (printerConfig.debugingchange){ - Serial.print(F("MQTT Door")); - if(doorState){ - Serial.println(F("Open")); - } - else{ - Serial.println(F("Closed")); + + if (printerConfig.debugingchange)Serial.print(F("MQTT Door ")); + if(doorState){ + if (printerConfig.debugingchange) Serial.println(F("Opened")); + printerVariables.lastdoorOpenms = millis(); + printerVariables.idleStartms = millis(); + } + else{ + if (printerConfig.debugingchange) Serial.println(F("Closed")); + if ((millis() - printerVariables.lastdoorClosems) < 6000){ + printerVariables.doorSwitchenabled = true; } + printerVariables.lastdoorClosems = millis(); + printerVariables.idleStartms = millis(); } - Changed == true; + Changed = true; } } @@ -234,11 +238,12 @@ void setupMqtt(){ void mqttloop(){ if (!mqttClient.connected()){ printerVariables.online = false; - if(printerVariables.disconnectMQTTms !=0) { + //Only sent the timer from the first instance of a MQTT disconnect + if(printerVariables.disconnectMQTTms == 0) { printerVariables.disconnectMQTTms = millis(); //Record last time MQTT dropped connection - Serial.print(F("MQTT dropped connection state: ")); - Serial.println(mqttClient.state()); + Serial.println(F("MQTT dropped during mqttloop")); + ParseMQTTState(mqttClient.state()); } delay(500); connectMqtt(); diff --git a/src/mqttparsingutility.h b/src/mqttparsingutility.h index 8a906a4..1040314 100644 --- a/src/mqttparsingutility.h +++ b/src/mqttparsingutility.h @@ -19,5 +19,41 @@ String ParseHMSSeverity(int code){ // Provided by WolfWithSword return ""; } +void ParseMQTTState(int code){ + switch (code) + { + case -4: // MQTT_CONNECTION_TIMEOUT + Serial.println(F("MQTT TIMEOUT")); + break; + case -3: // MQTT_CONNECTION_LOST + Serial.println(F("MQTT CONNECTION_LOST")); + break; + case -2: // MQTT_CONNECT_FAILED + Serial.println(F("MQTT CONNECT_FAILED")); + break; + case -1: // MQTT_DISCONNECTED + Serial.println(F("MQTT DISCONNECTED")); + break; + case 0: // MQTT_CONNECTED + Serial.println(F("MQTT CONNECTED")); + break; + case 1: // MQTT_CONNECT_BAD_PROTOCOL + Serial.println(F("MQTT BAD PROTOCOL")); + break; + case 2: // MQTT_CONNECT_BAD_CLIENT_ID + Serial.println(F("MQTT BAD CLIENT ID")); + break; + case 3: // MQTT_CONNECT_UNAVAILABLE + Serial.println(F("MQTT UNAVAILABLE")); + break; + case 4: // MQTT_CONNECT_BAD_CREDENTIALS + Serial.println(F("MQTT BAD CREDENTIALS")); + break; + case 5: // MQTT UNAUTHORIZED + Serial.println(F("MQTT UNAUTHORIZED")); + break; + } +} + #endif \ No newline at end of file diff --git a/src/types.h b/src/types.h index 1b24ce1..a80fd51 100644 --- a/src/types.h +++ b/src/types.h @@ -8,8 +8,8 @@ extern "C" typedef struct PrinterVaraiblesStruct{ String parsedHMS = ""; - String gcodeState = "IDLE"; - String previous_gcodeState = "IDLE"; + String gcodeState = "FINISH"; + String previous_gcodeState = "FINISH"; int stage = 0; int previous_stage = 0; long lastRSSI = 0; @@ -19,8 +19,13 @@ extern "C" bool online = false; bool finished = false; bool doorOpen = false; - unsigned long finishstartms; - unsigned long disconnectMQTTms; + unsigned long finishstartms = 0; + unsigned long idleStartms = 0; + unsigned long disconnectMQTTms = 0; + unsigned long lastdoorClosems = 0; + unsigned long lastdoorOpenms = 0; + bool doorSwitchenabled = false; + bool initalisedLEDs = false; } PrinterVariables; diff --git a/src/wifi-manager.h b/src/wifi-manager.h index fa58684..2f4e08b 100644 --- a/src/wifi-manager.h +++ b/src/wifi-manager.h @@ -39,6 +39,7 @@ bool connectToWifi(){ WiFi.begin(globalVariables.SSID, globalVariables.APPW); } else{ + // Reference https://stackoverflow.com/questions/70415075/esp32-select-one-from-multiple-wifi-ap-with-same-name-ssid uint8_t bssid[6] = {0}; //Convert to Text (Debugging code to check contacts of array) @@ -65,8 +66,6 @@ bool connectToWifi(){ } - - // Reference https://stackoverflow.com/questions/70415075/esp32-select-one-from-multiple-wifi-ap-with-same-name-ssid delay(1000); wl_status_t status = WiFi.status(); diff --git a/src/www/updatePage.h b/src/www/updatePage.h new file mode 100644 index 0000000..5cfd9ea --- /dev/null +++ b/src/www/updatePage.h @@ -0,0 +1,113 @@ +//https://mischianti.org/online-converter-file-to-cpp-gzip-byte-array-3/ +#define updatePage_html_gz_len 1739 +const uint8_t updatepPage_html_gz[] PROGMEM = { +0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAD, 0x58, 0x6D, 0x73, 0xD3, 0x38, +0x10, 0xFE, 0xDE, 0x5F, 0x21, 0xCC, 0x80, 0x53, 0x5A, 0xDB, 0x49, 0x73, 0x2D, 0xBD, 0x34, 0xE9, +0x4C, 0xE9, 0xCB, 0x41, 0xAF, 0x0C, 0xBD, 0x52, 0x18, 0x0E, 0x86, 0xE9, 0x28, 0xB6, 0x62, 0xAB, +0xC8, 0x96, 0x91, 0xE4, 0xBC, 0x70, 0xC3, 0x7F, 0xBF, 0x95, 0xEC, 0x04, 0xC7, 0xB1, 0xD3, 0x16, +0x70, 0x3B, 0xB5, 0x2D, 0xAD, 0x76, 0x9F, 0x7D, 0xD1, 0xA3, 0x75, 0xFB, 0x8F, 0x4E, 0xDE, 0x1C, +0x5F, 0xFF, 0x7B, 0x79, 0x8A, 0x22, 0x15, 0xB3, 0xC3, 0x8D, 0x7E, 0x7E, 0x83, 0x3B, 0xC1, 0xC1, +0xE1, 0x06, 0x82, 0xAB, 0xCF, 0x68, 0xF2, 0x05, 0x09, 0xC2, 0x06, 0xB6, 0x54, 0x33, 0x46, 0x64, +0x44, 0x88, 0xB2, 0x51, 0x24, 0xC8, 0x68, 0x60, 0x47, 0x4A, 0xA5, 0xB2, 0xE7, 0x79, 0x7E, 0x90, +0xDC, 0x4A, 0xD7, 0x67, 0x3C, 0x0B, 0x46, 0x0C, 0x0B, 0xE2, 0xFA, 0x3C, 0xF6, 0xF0, 0x2D, 0x9E, +0x7A, 0x8C, 0x0E, 0xA5, 0x37, 0xE2, 0x89, 0x72, 0xF0, 0x84, 0x48, 0x1E, 0x13, 0x6F, 0xD7, 0xED, +0xEC, 0xBA, 0x5D, 0xCF, 0x97, 0xD2, 0xC3, 0x8C, 0xB9, 0x31, 0x4D, 0x5C, 0x78, 0xB6, 0x11, 0x4D, +0x14, 0x09, 0x05, 0x55, 0x33, 0x30, 0x14, 0xE1, 0xDD, 0xCE, 0x8E, 0x43, 0xA7, 0xEC, 0xCD, 0xC7, +0xF3, 0x29, 0xDB, 0xC7, 0xB7, 0x9D, 0xE3, 0x6F, 0xED, 0xF8, 0xEF, 0xDB, 0xD9, 0xD9, 0xF5, 0xF9, +0x3F, 0x53, 0x4F, 0x6E, 0xBD, 0xDB, 0x9B, 0xF0, 0x36, 0xDF, 0xBB, 0xDC, 0x3A, 0xFE, 0x78, 0x79, +0x75, 0xFE, 0x61, 0x2B, 0xFC, 0x46, 0xBA, 0xE7, 0xD1, 0xFE, 0x99, 0xE0, 0x5E, 0x7C, 0x3D, 0xBB, +0x10, 0xBB, 0xC2, 0x7B, 0x3F, 0xDD, 0xCA, 0xDE, 0x3F, 0x3F, 0xDF, 0xBF, 0x1A, 0x5F, 0x8D, 0x3E, +0xA6, 0xBB, 0x5B, 0x1F, 0xFE, 0x1C, 0xD1, 0xF1, 0x5F, 0xCF, 0x8F, 0x06, 0x03, 0x1B, 0xF9, 0x82, +0x4B, 0xC9, 0x05, 0x0D, 0x69, 0x32, 0xB0, 0x71, 0xC2, 0x93, 0x59, 0xCC, 0x33, 0xC0, 0x00, 0x4E, +0x11, 0x21, 0x88, 0x48, 0x39, 0xA3, 0x3E, 0x00, 0x49, 0xB8, 0x33, 0x1F, 0xB2, 0x91, 0x57, 0x04, +0xC4, 0x84, 0x21, 0x7F, 0xD6, 0xD7, 0x90, 0x07, 0x33, 0xF4, 0xDF, 0xE2, 0xD5, 0x0C, 0x61, 0xFF, +0x4B, 0x28, 0x78, 0x96, 0x04, 0x8E, 0xCF, 0x19, 0x17, 0x3D, 0xF4, 0x78, 0xD4, 0xD1, 0x3F, 0x07, +0x4B, 0x62, 0x26, 0x2C, 0x23, 0x1C, 0x53, 0x36, 0xEB, 0xA1, 0x23, 0x41, 0x31, 0xDB, 0x46, 0x12, +0x27, 0xD2, 0x91, 0x44, 0xD0, 0xD1, 0x0F, 0xD9, 0xEF, 0x1B, 0x8B, 0x47, 0x08, 0x6C, 0xA2, 0x30, +0x4D, 0x88, 0xA8, 0x98, 0x0C, 0xA8, 0x4C, 0x19, 0x06, 0x3D, 0x23, 0x46, 0xA6, 0x15, 0x33, 0x30, +0xE2, 0x04, 0x54, 0x10, 0x5F, 0x51, 0x9E, 0xF4, 0x10, 0x40, 0xCA, 0xE2, 0x64, 0x59, 0x06, 0x33, +0x1A, 0x26, 0x0E, 0x55, 0x24, 0x96, 0x20, 0x40, 0x20, 0x15, 0x62, 0x59, 0xE0, 0x36, 0x93, 0x8A, +0x8E, 0x66, 0x8E, 0xB6, 0x0F, 0xD3, 0xF5, 0x42, 0x90, 0x4B, 0x27, 0x22, 0x34, 0x8C, 0x60, 0xBE, +0xD3, 0x6E, 0x8F, 0xA3, 0xCA, 0x34, 0x16, 0x10, 0xF0, 0x1E, 0x6A, 0x23, 0x9C, 0x29, 0x5E, 0xEF, +0x1F, 0xE3, 0x21, 0x77, 0x7E, 0xC2, 0xC9, 0x3B, 0x1D, 0xC8, 0x8D, 0x3B, 0x43, 0xAE, 0x14, 0x8F, +0x7B, 0x68, 0xA7, 0x9D, 0x4E, 0x9B, 0x11, 0x54, 0xEC, 0x4E, 0x68, 0xA0, 0x22, 0xE3, 0x52, 0x5A, +0x31, 0x5B, 0xF2, 0xB6, 0x3A, 0x55, 0x18, 0x14, 0xB9, 0xC0, 0x7A, 0x7B, 0x8E, 0x22, 0x53, 0x55, +0x31, 0x6A, 0xAA, 0x43, 0xD2, 0x6F, 0xA4, 0x87, 0xBA, 0x7B, 0x55, 0xE5, 0x66, 0x72, 0x52, 0x18, +0x1F, 0x72, 0x16, 0xD4, 0xEB, 0x1E, 0x71, 0x11, 0x37, 0x46, 0x73, 0xB5, 0x4A, 0x27, 0x11, 0x04, +0x70, 0xD9, 0x50, 0x8A, 0x83, 0x80, 0x26, 0x61, 0xD5, 0x01, 0xB3, 0x9E, 0x8B, 0x80, 0x08, 0x47, +0xE0, 0x80, 0x66, 0x52, 0x87, 0x60, 0x55, 0x60, 0xEA, 0xC0, 0x56, 0x0E, 0xF8, 0x44, 0xE7, 0xBC, +0x6D, 0x24, 0x90, 0x08, 0x87, 0xB8, 0xD5, 0xDE, 0x46, 0xC5, 0xAF, 0xDB, 0xDD, 0x3C, 0xA8, 0x8B, +0xF5, 0x5E, 0xFB, 0x49, 0x6D, 0x38, 0x15, 0x4F, 0xD7, 0x04, 0x93, 0xE1, 0x21, 0x61, 0x4D, 0x45, +0x33, 0x64, 0xDC, 0xFF, 0x72, 0xEF, 0x30, 0x56, 0x52, 0xD0, 0x59, 0x49, 0xC1, 0x7C, 0x67, 0x77, +0xBB, 0xDD, 0xB5, 0x95, 0xB6, 0xDB, 0x80, 0x95, 0x26, 0x69, 0xA6, 0x3E, 0xA9, 0x59, 0x4A, 0x06, +0xF6, 0x88, 0x32, 0x62, 0x7F, 0x6E, 0xAC, 0xBA, 0x27, 0x0D, 0x39, 0x59, 0x0D, 0xF9, 0x5A, 0xC4, +0x79, 0xC2, 0x60, 0x06, 0xD2, 0x20, 0x81, 0xE1, 0x02, 0xF4, 0xD8, 0xF7, 0xFD, 0xB5, 0x49, 0xDD, +0x6D, 0xA8, 0xEA, 0x3B, 0xB7, 0x51, 0xD9, 0x3B, 0x99, 0x0D, 0x63, 0xAA, 0x56, 0xFC, 0xAB, 0x61, +0xC9, 0x3F, 0x8E, 0x8F, 0xCE, 0x76, 0xDB, 0xB5, 0x71, 0x5E, 0x57, 0x9B, 0x0F, 0x8C, 0xC3, 0x1D, +0x59, 0x9F, 0x87, 0x09, 0x8E, 0x05, 0xF2, 0xB0, 0xE0, 0xF8, 0x99, 0x90, 0x1A, 0x6B, 0xCA, 0x69, +0x23, 0x01, 0xAD, 0x2F, 0xE0, 0x54, 0xF0, 0x50, 0x10, 0x29, 0xEF, 0x5B, 0x0A, 0x0B, 0xFE, 0x59, +0xC1, 0xF2, 0xF3, 0x5E, 0x54, 0x52, 0xDC, 0x69, 0x64, 0x2E, 0xA9, 0xB0, 0xCA, 0x64, 0x23, 0x77, +0x35, 0x47, 0x78, 0x5D, 0xBA, 0xCB, 0x61, 0xAA, 0x35, 0xDD, 0xF7, 0x8A, 0x03, 0xB8, 0xEF, 0xE5, +0x5D, 0xCA, 0x46, 0x5F, 0x1F, 0xC1, 0xC5, 0xE1, 0x1C, 0xD0, 0x31, 0xF2, 0x19, 0x96, 0x72, 0x60, +0x2F, 0x78, 0xCF, 0xFE, 0x71, 0x58, 0x97, 0xE7, 0x97, 0x8F, 0x9A, 0x92, 0x90, 0x11, 0xA4, 0x71, +0x58, 0x16, 0xB4, 0x91, 0x14, 0xFE, 0x8F, 0x86, 0x27, 0xC8, 0x94, 0x1F, 0x05, 0x64, 0x4C, 0x18, +0x4F, 0x4D, 0xB3, 0x33, 0x49, 0xE7, 0x47, 0xA3, 0x97, 0xA5, 0x8C, 0xE3, 0x40, 0x7A, 0x3B, 0xED, +0x9D, 0xAE, 0xD7, 0xDE, 0xF7, 0x5E, 0xC1, 0x84, 0x23, 0xBF, 0x66, 0xBA, 0x2F, 0x4A, 0x93, 0xD0, +0x86, 0xB3, 0x4A, 0x0D, 0xEC, 0x0B, 0xAD, 0xB4, 0x62, 0x53, 0xA6, 0x38, 0x59, 0x42, 0xA7, 0x43, +0x6B, 0x1F, 0xBE, 0xB8, 0xB8, 0x38, 0x3D, 0x39, 0x06, 0xED, 0x82, 0x33, 0x46, 0x04, 0x04, 0x00, +0xE4, 0x4A, 0x3E, 0x79, 0xE0, 0x54, 0xBD, 0x8B, 0xCB, 0xFC, 0x5F, 0x35, 0x17, 0x75, 0xAA, 0xAA, +0xD1, 0xBB, 0x34, 0xC0, 0x8A, 0xA0, 0x4B, 0x1C, 0x12, 0x08, 0x6F, 0xA7, 0xB2, 0x20, 0x5D, 0x7E, +0xD7, 0xD7, 0x75, 0x44, 0x25, 0x6C, 0xC4, 0x90, 0x80, 0x57, 0x8C, 0x4F, 0x24, 0x9A, 0xF1, 0x0C, +0x29, 0x8E, 0xB2, 0x5C, 0x11, 0xBC, 0x09, 0x04, 0x71, 0xA2, 0x3E, 0x71, 0x97, 0x75, 0x79, 0x15, +0x65, 0x7D, 0x8D, 0x15, 0x91, 0xC4, 0x37, 0x9C, 0x61, 0xC5, 0x19, 0x53, 0x34, 0xC5, 0x42, 0x79, +0xC6, 0x07, 0x50, 0x86, 0x2D, 0x44, 0x83, 0x81, 0x95, 0x47, 0xF7, 0x46, 0x8F, 0x5A, 0x28, 0x26, +0x2A, 0xE2, 0x30, 0x98, 0x72, 0xA9, 0xAC, 0x55, 0x70, 0x7D, 0x73, 0x1E, 0x1C, 0x0E, 0x69, 0x82, +0x34, 0xC3, 0xF6, 0xFA, 0x5E, 0x3E, 0xB0, 0x2A, 0x68, 0xE8, 0x0A, 0x61, 0xDF, 0x27, 0x29, 0xE4, +0xC6, 0x85, 0x15, 0xDB, 0xFA, 0x8F, 0x1B, 0x7E, 0xB3, 0x8B, 0x58, 0x5A, 0x46, 0xC4, 0xD1, 0x7A, +0x72, 0x20, 0xFA, 0xA9, 0x63, 0xA1, 0x04, 0xC7, 0x86, 0xC0, 0x45, 0x3C, 0x81, 0x04, 0xDB, 0x28, +0x87, 0x6F, 0xC4, 0x0E, 0xFB, 0x43, 0x51, 0x63, 0x6B, 0xB1, 0xC7, 0xB5, 0x96, 0xF9, 0xCB, 0x0B, +0x2C, 0xC0, 0x1D, 0x3C, 0x1D, 0x58, 0xB0, 0xC9, 0x2D, 0x34, 0xC6, 0x2C, 0x03, 0x35, 0x6D, 0xD0, +0xE1, 0xCD, 0x45, 0x1A, 0xD4, 0x0D, 0x33, 0xD8, 0xA7, 0x89, 0x51, 0x96, 0x3F, 0x42, 0xFB, 0x98, +0x04, 0xD6, 0x1C, 0xF6, 0xD2, 0x58, 0x0E, 0x2E, 0xE7, 0x63, 0x4B, 0x9F, 0x8C, 0x78, 0xC8, 0x48, +0x70, 0x98, 0x67, 0xBD, 0xEF, 0xE5, 0xB2, 0x95, 0xBC, 0x98, 0x04, 0x54, 0x0B, 0x61, 0xAE, 0xBD, +0x44, 0x01, 0x79, 0x54, 0xF2, 0x01, 0xEB, 0xF0, 0xAD, 0xB9, 0xF7, 0xD0, 0x15, 0x6C, 0xD1, 0xD9, +0x6A, 0xB2, 0xA5, 0x2F, 0x68, 0xAA, 0x0A, 0x3C, 0x38, 0x4D, 0xA1, 0xDD, 0xC6, 0xBA, 0x3B, 0xF5, +0x6E, 0xF1, 0x18, 0xE7, 0x93, 0x35, 0xF9, 0x1C, 0x65, 0x89, 0xE9, 0x61, 0xD1, 0x4D, 0x8B, 0xB0, +0xCD, 0x0A, 0xE7, 0xCC, 0x2F, 0x41, 0x54, 0x26, 0x12, 0x14, 0x70, 0x3F, 0x8B, 0x61, 0x3B, 0xBA, +0x21, 0x51, 0xA7, 0x8C, 0xE8, 0xC7, 0x17, 0xB3, 0x57, 0x81, 0x5E, 0x78, 0xB0, 0xB2, 0xAE, 0xC4, +0x6A, 0x2B, 0xB6, 0xF2, 0x82, 0x3B, 0x83, 0x84, 0xB6, 0x9A, 0x4C, 0x8E, 0xB1, 0x30, 0x05, 0x86, +0x06, 0x80, 0xAC, 0x28, 0x8C, 0x4D, 0x57, 0xDF, 0xE5, 0xA7, 0xF6, 0xE7, 0x55, 0x73, 0x8B, 0x35, +0x10, 0x59, 0x5D, 0xD9, 0xB0, 0x2E, 0x21, 0x13, 0x74, 0x06, 0xAF, 0x27, 0xF0, 0xDA, 0xAA, 0x41, +0x68, 0x20, 0x15, 0xE2, 0x2E, 0x04, 0x0C, 0xD2, 0xD9, 0x2A, 0xD9, 0xD2, 0x55, 0xB8, 0x6D, 0x30, +0xE4, 0x7F, 0xCD, 0x40, 0x83, 0x1A, 0x6D, 0x59, 0x7F, 0x9B, 0x15, 0x56, 0x3F, 0xBC, 0xBE, 0x78, +0x09, 0xAC, 0x76, 0x45, 0xBE, 0x66, 0x44, 0xAA, 0x26, 0xDB, 0x7A, 0x81, 0x9B, 0x87, 0xC2, 0x85, +0x63, 0xF7, 0x74, 0x0C, 0xF1, 0xBC, 0xA0, 0x12, 0x08, 0x8F, 0x88, 0xD6, 0xA2, 0x8A, 0xAD, 0xED, +0xC5, 0x09, 0xF6, 0x12, 0x27, 0x01, 0x30, 0x0A, 0xC0, 0xC1, 0x4C, 0x36, 0x41, 0x31, 0x5A, 0x57, +0xD5, 0x69, 0x2B, 0xA0, 0x0A, 0x78, 0x35, 0x65, 0x44, 0x91, 0x5F, 0x55, 0x05, 0x35, 0x29, 0x14, +0xE8, 0x33, 0xF7, 0x5F, 0x51, 0x06, 0x1F, 0x82, 0x5C, 0x80, 0x22, 0x73, 0xFF, 0x15, 0x45, 0x18, +0xCE, 0x60, 0x8D, 0xC8, 0xDC, 0xEF, 0xAF, 0x88, 0x43, 0xDA, 0x5B, 0xD6, 0xE5, 0x9B, 0xB7, 0xD7, +0xB0, 0xD6, 0xF2, 0x72, 0x8E, 0xB5, 0x36, 0x0F, 0x50, 0xF3, 0x12, 0x49, 0x54, 0x91, 0xD9, 0x97, +0xB0, 0x13, 0xC1, 0xB6, 0x7D, 0x04, 0x24, 0x27, 0xA5, 0x53, 0x90, 0xBE, 0x73, 0xA4, 0x69, 0xDB, +0xC9, 0x27, 0xA5, 0xBD, 0x8D, 0xEC, 0x67, 0xF6, 0x3A, 0x08, 0xF7, 0xD4, 0xF7, 0xC6, 0x7C, 0x5B, +0x2F, 0xD4, 0xAD, 0xD3, 0x07, 0x85, 0x3C, 0x2F, 0xEC, 0xDA, 0x9D, 0x59, 0x1D, 0x59, 0x6C, 0xCC, +0x4A, 0xA5, 0xB5, 0x88, 0x8E, 0xF1, 0xBA, 0x2D, 0x9A, 0x12, 0xA1, 0xBF, 0x0C, 0xA1, 0xEE, 0x5F, +0x63, 0x15, 0xB9, 0xA6, 0xF5, 0x6C, 0xE5, 0xCB, 0x5C, 0x5D, 0x27, 0x24, 0x40, 0x1E, 0xCA, 0x5F, +0x15, 0x57, 0x18, 0x18, 0xE6, 0x99, 0x6E, 0xB9, 0x1A, 0xC2, 0x71, 0xD3, 0x5A, 0x22, 0xEF, 0x4D, +0xD7, 0x70, 0x36, 0x28, 0x2F, 0xCC, 0x3C, 0x8C, 0x65, 0x2A, 0xB5, 0xBE, 0xDE, 0x99, 0x46, 0xD3, +0xED, 0x86, 0x52, 0x80, 0x05, 0x05, 0x31, 0x6F, 0xBA, 0x9A, 0xAB, 0x8F, 0xF3, 0x56, 0x05, 0x56, +0x58, 0x73, 0xA2, 0x2E, 0x4E, 0xFE, 0x39, 0x8E, 0x47, 0xD6, 0xC3, 0xF0, 0x97, 0xF7, 0xD6, 0x9D, +0xE0, 0xEF, 0xC6, 0xA2, 0xD3, 0x01, 0xAD, 0xBD, 0xEB, 0xBA, 0x0F, 0xC4, 0x51, 0xDE, 0x9A, 0xBF, +0x8C, 0xE3, 0x54, 0x2B, 0x43, 0x41, 0x26, 0x00, 0x4A, 0xD1, 0xD1, 0x3C, 0x14, 0x4F, 0x79, 0x87, +0xFF, 0x86, 0xB8, 0x98, 0x1C, 0x19, 0x9D, 0x24, 0xB8, 0x27, 0x94, 0x9B, 0x96, 0x5D, 0xEA, 0x99, +0xEC, 0xCD, 0x55, 0x3A, 0x9A, 0x7F, 0xA0, 0x6D, 0xA3, 0x16, 0xD9, 0x44, 0x83, 0xC3, 0x06, 0x80, +0xD0, 0xBD, 0x0A, 0xE3, 0xC1, 0x09, 0x19, 0x61, 0x68, 0xCF, 0x9A, 0x8E, 0x8A, 0xF2, 0x81, 0x59, +0x83, 0xB0, 0x8E, 0x0E, 0x00, 0xA3, 0x39, 0xC9, 0x6A, 0xD1, 0xF9, 0x11, 0x4E, 0x42, 0x02, 0xE8, +0xE6, 0x41, 0x05, 0x94, 0xBF, 0xEF, 0x1C, 0xA6, 0x23, 0xD4, 0x32, 0x6B, 0x9E, 0x3E, 0x2D, 0x9D, +0x9C, 0xF5, 0xFA, 0x0B, 0xA8, 0xA5, 0x96, 0x0A, 0x00, 0xCF, 0xBB, 0x28, 0x30, 0x6A, 0x08, 0xBC, +0xDE, 0x4C, 0xBE, 0xB4, 0x71, 0xDB, 0xD6, 0xAE, 0xF9, 0x4E, 0x40, 0xDD, 0xCF, 0x21, 0x51, 0x22, +0x6B, 0x00, 0xB2, 0x4A, 0xA8, 0x85, 0xAE, 0xBC, 0xF8, 0x40, 0x0D, 0x4D, 0x20, 0xEC, 0x2F, 0xAF, +0x5F, 0x5F, 0xE8, 0xD2, 0x3B, 0x2B, 0x1A, 0xDB, 0x62, 0x4F, 0xD6, 0xD1, 0x42, 0xE1, 0x5A, 0xCE, +0xA0, 0x37, 0xC9, 0x8D, 0xE1, 0x4E, 0xAB, 0xA2, 0xA7, 0xAE, 0x56, 0x2B, 0xD5, 0x01, 0xDF, 0x35, +0xA6, 0xF1, 0xAB, 0xFD, 0xB2, 0x29, 0x1E, 0xA1, 0x47, 0x35, 0xDF, 0x7A, 0xFA, 0xE3, 0xCF, 0xFC, +0xAB, 0xFA, 0x7F, 0xF6, 0x70, 0x0B, 0xB7, 0xC2, 0x16, 0x00, 0x00 +}; \ No newline at end of file diff --git a/src/www/updatepage.html b/src/www/updatepage.html new file mode 100644 index 0000000..637d8a3 --- /dev/null +++ b/src/www/updatepage.html @@ -0,0 +1,175 @@ + + + + + + + + + +
+
+ + BLLEDController +
+
+

BLLEDController Update Page

+

+ This page allows you to update your device. +

+
+ +
+
+ +
+

Status: Ready

+ +
+
+ + + \ No newline at end of file diff --git a/src/www/wifiSetup.html b/src/www/wifiSetup.html new file mode 100644 index 0000000..b79697f --- /dev/null +++ b/src/www/wifiSetup.html @@ -0,0 +1,224 @@ + + + + + + + +
+
+ + BLLEDController +
+ + +
+ + + + + + \ No newline at end of file From f2e400ae64b2c002948f26db72430adb57926065 Mon Sep 17 00:00:00 2001 From: Adam Douglas Date: Tue, 12 Mar 2024 20:09:55 +1100 Subject: [PATCH 06/11] smashing bugs and closing doors --- firmware/manifestexpirimental.json | 4 +- src/AutoGrowBufferStream.h | 2 +- src/filesystem.h | 1 - src/leds.h | 220 +++++++++------- src/mqttmanager.h | 18 +- src/serialmanager.h | 5 +- src/types.h | 5 +- src/web-server.h | 1 - src/wifi-manager.h | 24 +- src/www/setupPage.h | 403 +++++++++++++++-------------- src/www/setuppage.html | 44 ++-- 11 files changed, 377 insertions(+), 350 deletions(-) diff --git a/firmware/manifestexpirimental.json b/firmware/manifestexpirimental.json index 371854b..444f0e6 100644 --- a/firmware/manifestexpirimental.json +++ b/firmware/manifestexpirimental.json @@ -1,12 +1,12 @@ { "name": "BLLEDCONTROLLER", - "version": "Experimental 10 3 24", + "version": "Experimental 12 3 24", "new_install_prompt_erase": true, "builds": [ { "chipFamily": "ESP32", "parts": [ - { "path": "esp32dev/BLLC_Experimental_10.3.24.bin", "offset": 0 } + { "path": "esp32dev/BLLC_Experimental_12.3.24.bin", "offset": 0 } ] } ] diff --git a/src/AutoGrowBufferStream.h b/src/AutoGrowBufferStream.h index 66547f9..95c2fd0 100644 --- a/src/AutoGrowBufferStream.h +++ b/src/AutoGrowBufferStream.h @@ -29,7 +29,7 @@ class AutoGrowBufferStream : public Stream if (this->_len + 1 > this->buffer_size) { auto tmp = (char*)realloc(this->_buffer, this->buffer_size + BUFFER_INCREMENTS); if (tmp == NULL) { - Serial.println("Failed to grow buffer"); + Serial.println(F("Failed to grow buffer")); return 0; } this->_buffer = tmp; diff --git a/src/filesystem.h b/src/filesystem.h index f5525e7..e10a2ba 100644 --- a/src/filesystem.h +++ b/src/filesystem.h @@ -134,7 +134,6 @@ void setupFileSystem(){ LittleFS.format(); Serial.println(F("Formatting LittleFS")); Serial.println(F("Restarting Device")); - Serial.println(""); ESP.restart(); } Serial.println(F("Mounted LittleFS")); diff --git a/src/leds.h b/src/leds.h index 952399a..1c71079 100644 --- a/src/leds.h +++ b/src/leds.h @@ -107,24 +107,10 @@ void RGBCycle() { analogWrite(coldPin, currentCold); } -void debugState(){ - Serial.print(printerVariables.stage); - Serial.print(F(" ")); - Serial.print(printerVariables.previous_stage); - Serial.print(F(" ")); - Serial.print(printerVariables.gcodeState); - Serial.print(F(" ")); - Serial.print(printerVariables.previous_gcodeState); - Serial.print(F(" ")); - Serial.print(printerVariables.finishstartms); - Serial.print(F(" ")); - Serial.print(printerVariables.idleStartms); - Serial.print(F(" ")); - Serial.println(printerVariables.finished); -} - void updateleds(){ - int LEDTranistion_Duration = 500; + + // Adding to top so it can be changed in one location + int LEDTranistion_Duration = 500; if (printerConfig.debuging == true){ Serial.println(F("Updating leds")); @@ -136,10 +122,15 @@ void updateleds(){ Serial.println(printerVariables.parsedHMS); } - if (printerConfig.debugwifi == true){ //Force LED to show WIFI Strength (enabled via Webpage) + //Use LED to show WIFI Strength (enabled via Setup Webpage) + if (printerConfig.debugwifi == true){ //<=-50 dBm Green, <= -60 dBm LightGreen, <= -70 dBm Yellow, <= -80 dBm Orange, >80 Red if (WiFi.status() == WL_CONNECTED){ long wifiNow = WiFi.RSSI(); + if (printerConfig.debugingchange){ + Serial.print(F("WiFi Stregth Visialisation, turning LEDs On: ")); + Serial.println(wifiNow); + } if (wifiNow >= -50) tweenToColor(0,255,0,0,0,LEDTranistion_Duration); //GREEN else if (wifiNow >= -60) tweenToColor(128,255,0,0,0,LEDTranistion_Duration); //LIGHTGREEN else if (wifiNow >= -70) tweenToColor(255,255,0,0,0,LEDTranistion_Duration); //YELLOW @@ -150,7 +141,8 @@ void updateleds(){ } } - if (printerVariables.overrideLEDstate == true){ //Force LED ON regardless of state (via webpage) + //Override Selected LED ON regardless of state (via webpage) + if (printerVariables.overrideLEDstate == true){ int r_LED = 0; int g_LED = 0; int b_LED = 0; @@ -163,14 +155,25 @@ void updateleds(){ if(printerConfig.overrideWarmWhite == true){ ww_LED = 255;} tweenToColor(r_LED,g_LED,b_LED,cw_LED,ww_LED,LEDTranistion_Duration); //Variable Test Color - if (printerConfig.debuging){ - Serial.println(F("LED Test Override ON, Turning Leds On")); + if (printerConfig.debugingchange){ + Serial.print(F("LED Test Override ON, Turning Leds Custom On: ")); + Serial.print(r_LED); + Serial.print(F(" ")); + Serial.print(g_LED); + Serial.print(F(" ")); + Serial.print(b_LED); + Serial.print(F(" ")); + Serial.print(cw_LED); + Serial.print(F(" ")); + Serial.print(ww_LED); + Serial.print(F(" Brightness: ")); + Serial.println(printerConfig.brightness); }; return; } - //TOGGLE LIGHTS + //TOGGLE LIGHTS via DOOR //If door is closed twice in 6 seconds, it will flip the state of the lights if (printerVariables.doorSwitchenabled == true){ if (printerConfig.debugingchange){ @@ -179,25 +182,32 @@ void updateleds(){ if(currentWarm == 0 && currentCold == 0) { tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - //if (printerConfig.debuging || printerConfig.debugingchange) - Serial.println(F("ON")); + if (printerConfig.debuging || printerConfig.debugingchange) { + Serial.println(F("ON")); + } } else { tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF - //if (printerConfig.debuging || printerConfig.debugingchange) - Serial.println(F("OFF")); + //Force into idle state - note will change back immediately if there is an update of any sort + printerVariables.idleLightsOff = true; + printerVariables.idleStartms = -1800000; + if (printerConfig.debuging || printerConfig.debugingchange) { + Serial.println(F("OFF")); + } } printerVariables.doorSwitchenabled = false; } - //OFF + //OFF -- OFF -- OFF -- OFF + if (printerConfig.discoMode == true){ //Skip all the following code that sets specific colors if RGB Mode is on - done in RGBCycle() return; } - if (printerVariables.online == false && (millis() - printerVariables.disconnectMQTTms) >= 5000){ //printer offline and MQTT disconnect more than 5 seconds. + //printer offline and MQTT disconnect more than 5 seconds. + if (printerVariables.online == false && (millis() - printerVariables.disconnectMQTTms) >= 5000){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Printer offline, Turning Leds OFF")); @@ -205,7 +215,8 @@ void updateleds(){ return; } - if (printerVariables.ledstate == false && printerConfig.replicatestate == true){ // replicate printer behaviour + // replicate printer behaviour + if (printerVariables.ledstate == false && printerConfig.replicatestate == true){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("LED Replication, Turning Leds OFF")); @@ -213,17 +224,17 @@ void updateleds(){ return; } - if (printerVariables.stage == 14 && printerVariables.previous_stage != printerVariables.stage){ //Cleaning nozzle + //Cleaning nozzle + if (printerVariables.stage == 14){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF - printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 14, CLEANING NOZZLE, Turning Leds OFF")); }; return; } - if (printerVariables.stage == 1 && printerVariables.previous_stage != printerVariables.stage){ //Auto Bed Leveling - printerVariables.previous_stage = printerVariables.stage; + //Auto Bed Leveling + if (printerVariables.stage == 1){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 1, BED LEVELING, Turning Leds OFF")); @@ -231,8 +242,8 @@ void updateleds(){ return; } - if (printerVariables.stage == 8 && printerVariables.previous_stage != printerVariables.stage){ //Calibrating Extrusion - printerVariables.previous_stage = printerVariables.stage; + //Calibrating Extrusion + if (printerVariables.stage == 8){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 8, CALIBRATING EXTRUSION, Turning Leds OFF")); @@ -240,8 +251,8 @@ void updateleds(){ return; } - if (printerVariables.stage == 9 && printerVariables.previous_stage != printerVariables.stage){ //Scaning surface - printerVariables.previous_stage = printerVariables.stage; + //Scaning surface + if (printerVariables.stage == 9){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 9, SCANNING BED SURFACE, Turning Leds OFF")); @@ -249,8 +260,8 @@ void updateleds(){ return; } - if (printerVariables.stage == 10 && printerVariables.previous_stage != printerVariables.stage){ //Inspecting First Layer - printerVariables.previous_stage = printerVariables.stage; + //Inspecting First Layer + if (printerVariables.stage == 10){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 10, FIRST LAYER INSPECTION, Turning Leds OFF")); @@ -258,8 +269,8 @@ void updateleds(){ return; } - if (printerVariables.stage == 12 && printerVariables.previous_stage != printerVariables.stage){ //Calibrating MicroLidar - printerVariables.previous_stage = printerVariables.stage; + //Calibrating MicroLidar + if (printerVariables.stage == 12){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 12, CALIBRATING MICRO LIDAR, Turning Leds OFF")); @@ -267,18 +278,23 @@ void updateleds(){ return; } - if ((printerVariables.stage == -1 || printerVariables.stage == 255) && printerVariables.finishstartms == 0 - && (millis() - printerVariables.idleStartms) > 1800000 && printerVariables.previous_gcodeState == "TIMEOUT"){ // 30 min Idle Timeout - printerVariables.previous_gcodeState = printerVariables.gcodeState; + // 30 min Idle Timeout + if ((printerVariables.stage == -1 || printerVariables.stage == 255) + && printerVariables.finishstartms == 0 && (millis() - printerVariables.idleStartms) > 1800000 && printerVariables.idleLightsOff == false){ tweenToColor(0,0,0,0,0,LEDTranistion_Duration); //OFF + printerVariables.idleLightsOff = true; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Idle Timeout over 30min, Turning Leds OFF")); }; return; } - //RED - if (printerConfig.errordetection == true){ // allow errordetection to turn ledstrip red + //RED -- RED -- RED -- RED + + // allow errordetection to turn ledstrip red + if (printerConfig.errordetection == true){ + + //SERIOUS HMS state if (printerVariables.parsedHMS == "Serious"){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ @@ -287,6 +303,7 @@ void updateleds(){ return; }; + //FATAL HMS state if (printerVariables.parsedHMS == "Fatal"){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ @@ -295,16 +312,17 @@ void updateleds(){ return; }; - if (printerVariables.stage == 6 && printerVariables.previous_stage != printerVariables.stage){ //Fillament runout + //Fillament runout + if (printerVariables.stage == 6){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED - printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 17, FILAMENT RUNOUT, Turning Leds RED")); }; return; }; - if (printerVariables.stage == 17 && printerVariables.previous_stage != printerVariables.stage){ //Front Cover Removed + //Front Cover Removed + if (printerVariables.stage == 17){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 17, FRONT COVER REMOVED, Turning Leds RED")); @@ -312,7 +330,8 @@ void updateleds(){ return; }; - if (printerVariables.stage == 20 && printerVariables.previous_stage != printerVariables.stage){ //Nozzle Temp fail + //Nozzle Temp fail + if (printerVariables.stage == 20){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 20, NOZZLE TEMP FAIL, Turning Leds RED")); @@ -320,7 +339,8 @@ void updateleds(){ return; }; - if (printerVariables.stage == 21 && printerVariables.previous_stage != printerVariables.stage){ //Bed Temp Fail + //Bed Temp Fail + if (printerVariables.stage == 21){ tweenToColor(255,0,0,0,0,LEDTranistion_Duration); //RED if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 21, BED TEMP FAIL, Turning Leds RED")); @@ -329,24 +349,11 @@ void updateleds(){ }; }; - //GREEN - //Sets to green when print finishes - //Stays green until 5mins has passed AND door is opened - if (printerVariables.gcodeState == "FINISH" && printerVariables.previous_gcodeState != printerVariables.gcodeState - && printerConfig.finishindication == true && printerVariables.previous_gcodeState != "TIMEOUT"){ - tweenToColor(0,255,0,0,0,LEDTranistion_Duration); //GREEN - printerVariables.previous_gcodeState = printerVariables.gcodeState; - if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.println(F("Finished print, Turning Leds GREEN")); - }; - return; - } - - //BLUE - if ((printerVariables.stage == 6 || printerVariables.stage == 30) || printerVariables.gcodeState == "PAUSE" - && printerVariables.previous_gcodeState != printerVariables.gcodeState){// Pause + //BLUE -- BLUE -- BLUE -- BLUE + + // Pause (by user or via Gcode) + if ((printerVariables.stage == 6 || printerVariables.stage == 30) || printerVariables.gcodeState == "PAUSE"){ tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE - printerVariables.previous_gcodeState = printerVariables.gcodeState; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.print(F("Stage ")); Serial.print(printerVariables.stage); @@ -354,14 +361,18 @@ void updateleds(){ }; return; } - if (printerVariables.stage == 34 && printerVariables.previous_stage != printerVariables.stage){ //First Layer Error PAUSED + + //First Layer Error PAUSED + if (printerVariables.stage == 34){ tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 34, FIRST LAYER ERROR, PAUSED Turning Leds BLUE")); }; return; } - if (printerVariables.stage == 35 && printerVariables.previous_stage != printerVariables.stage){ //Nozzle Clog PAUSED + + //Nozzle Clog PAUSED + if (printerVariables.stage == 35){ tweenToColor(0,0,255,0,0,LEDTranistion_Duration); //BLUE if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 35, NOZZLE CLOG, PAUSED Turning Leds BLUE")); @@ -369,56 +380,67 @@ void updateleds(){ return; } - //ON - if (printerVariables.stage == 2 && printerVariables.previous_stage != printerVariables.stage){ //Offline + //ON -- ON -- ON -- ON + + //Initial Boot + if (printerVariables.initalisedLEDs == false) { + tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE + printerVariables.initalisedLEDs = true; + printerVariables.idleStartms = millis(); + printerVariables.finishstartms = 0; + printerVariables.lastdoorClosems = millis(); + Serial.println(F("Initial BLLED bootup - Turning Leds WHITE")); + return; + } + + //Preheating Bed + if (printerVariables.stage == 2){ tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage 2, PREHEATING BED, Turning Leds WHITE")); }; return; } - if (printerVariables.stage == 0 && printerVariables.gcodeState == "RUNNING" && printerVariables.previous_stage != printerVariables.stage ){ //Printing or Resume after Pausing + //Printing or Resume after Pausing + if (printerVariables.stage == 0 && printerVariables.gcodeState == "RUNNING"){ tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - printerVariables.previous_gcodeState = printerVariables.gcodeState; - printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.print(F("Stage 0, PRINTING - gcodeState RUNNING, Turning Leds WHITE")); }; return; } - - if ((printerVariables.stage == -1 || printerVariables.stage == 255) && printerVariables.finishstartms == 0 - && (millis() - printerVariables.idleStartms < 1800000) && printerVariables.previous_stage != printerVariables.stage - && printerVariables.previous_gcodeState != "TIMEOUT"){ // Idle - //for IDLE - P1 uses 255, X1 uses -1 + //for IDLE - P1 uses 255, X1 uses -1 + if ((printerVariables.stage == -1 || printerVariables.stage == 255) + && printerVariables.finishstartms == 0 && (millis() - printerVariables.idleStartms < 1800000)){ // Idle tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - printerVariables.previous_gcodeState = "TIMEOUT"; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.print(F("Stage ")); Serial.print(printerVariables.stage); - Serial.println(F(", IDLE Turning Leds WHITE")); + Serial.print(F(", IDLE Turning Leds WHITE. Brightness: ")); + Serial.println(printerConfig.brightness); }; return; } - if (printerVariables.stage == -2 && printerVariables.previous_stage != printerVariables.stage){ //Offline + //Offline (not sure what gives this value) + if (printerVariables.stage == -2){ tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - printerVariables.previous_stage = printerVariables.stage; if (printerConfig.debuging || printerConfig.debugingchange){ Serial.println(F("Stage -2, Turning Leds WHITE")); }; return; } - if (printerVariables.initalisedLEDs == false) { //Initial Boot - tweenToColor(0,0,0,255,255,LEDTranistion_Duration); //WHITE - printerVariables.initalisedLEDs = true; - printerVariables.idleStartms = millis(); - printerVariables.finishstartms = 0; - Serial.println(F("Initial BLLED bootup - Turning Leds WHITE")); + //GREEN -- GREEN -- GREEN -- GREEN + + //Sets to green when print finishes + if (printerVariables.finishstartms > 0 && printerVariables.gcodeState == "FINISH" && printerConfig.finishindication == true){ + tweenToColor(0,255,0,0,0,LEDTranistion_Duration); //GREEN + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Finished print, Turning Leds GREEN")); + }; return; } } @@ -436,20 +458,22 @@ void setupLeds() { void ledsloop(){ RGBCycle(); - // Turn off GREEN if... HAS a finished and Door OPENED or CLOSED in last 5 secs + // Turn off GREEN if... finished and Door OPENED or CLOSED in last 5 secs // Can't use Boolean finished as printer defaults back to IDLE via MQTT if((printerVariables.finishstartms > 0 && ((millis() - printerVariables.lastdoorClosems) < 6000 || (millis() - printerVariables.lastdoorOpenms) < 6000))){ - tweenToColor(0,0,0,255,255,500); //WHITE - Serial.println(F("Updating from finishloop after Door interaction - Starting IDLE timer")); + if (printerConfig.debuging || printerConfig.debugingchange){ + Serial.println(F("Updating from finishloop after Door interaction - Starting IDLE timer")); + }; printerVariables.finishstartms = 0; - printerVariables.previous_gcodeState = "TIMEOUT"; printerVariables.idleStartms = millis(); updateleds(); } - if((millis() - printerVariables.idleStartms) > 1800000) + + //Need an trigger action to run updateleds() so lights turn off + //There is no change in the printer STATE, monitoring the timer and triggering when over a threshhold + if((millis() - printerVariables.idleStartms) > 1800000 && printerVariables.idleLightsOff == false) { - //30mins idle timer kicks in and will turn off the LEDS. - //Opening or Closing the Door will turn it back on and restart the timer. + //Opening or Closing the Door will turn LEDs back on and restart the timer. updateleds(); } delay(10); diff --git a/src/mqttmanager.h b/src/mqttmanager.h index b4ed691..b37e00f 100644 --- a/src/mqttmanager.h +++ b/src/mqttmanager.h @@ -43,7 +43,6 @@ void connectMqtt(){ ParseMQTTState(mqttClient.state()); if(mqttClient.state() == 5){ Serial.println(F("Restarting Device")); - Serial.println(""); ESP.restart(); } } @@ -86,7 +85,9 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ } } else{ - if (printerConfig.debuging) Serial.println(F("missing command Key - Ignored")); + if (printerConfig.debuging){ + Serial.println(F("Missing command Key - Ignored")); + } return; } @@ -109,6 +110,7 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ //Check BBLP GCode State if (messageobject["print"].containsKey("gcode_state")){ if(printerVariables.gcodeState != messageobject["print"]["gcode_state"].as()){ + printerVariables.gcodeState = messageobject["print"]["gcode_state"].as(); if (messageobject["print"]["gcode_state"].as() == "FINISH"){ if (printerVariables.finished == false){ printerVariables.finished = true; @@ -117,7 +119,7 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ }else{ printerVariables.finished = false; } - printerVariables.gcodeState = messageobject["print"]["gcode_state"].as(); + if (printerConfig.debuging){ Serial.print(F("MQTT gcode_state now: ")); Serial.println(printerVariables.gcodeState); @@ -180,20 +182,20 @@ void ParseCallback(char *topic, byte *payload, unsigned int length){ if (printerVariables.doorOpen != doorState){ printerVariables.doorOpen = doorState; + printerVariables.idleLightsOff = false; + printerVariables.idleStartms = millis(); if (printerConfig.debugingchange)Serial.print(F("MQTT Door ")); - if(doorState){ - if (printerConfig.debugingchange) Serial.println(F("Opened")); + if (printerVariables.doorOpen){ printerVariables.lastdoorOpenms = millis(); - printerVariables.idleStartms = millis(); + if (printerConfig.debugingchange) Serial.println(F("Opened")); } else{ - if (printerConfig.debugingchange) Serial.println(F("Closed")); if ((millis() - printerVariables.lastdoorClosems) < 6000){ printerVariables.doorSwitchenabled = true; } printerVariables.lastdoorClosems = millis(); - printerVariables.idleStartms = millis(); + if (printerConfig.debugingchange) Serial.println(F("Closed")); } Changed = true; } diff --git a/src/serialmanager.h b/src/serialmanager.h index 1b10f88..44dc1bc 100644 --- a/src/serialmanager.h +++ b/src/serialmanager.h @@ -17,9 +17,9 @@ void serialLoop(){ DynamicJsonDocument doc(256); deserializeJson(doc, input); if (doc.containsKey("ssid") && doc.containsKey("pass")) { - Serial.print("SSID "); + Serial.print(F("SSID ")); Serial.println(doc["ssid"].as()); - Serial.print("PASS "); + Serial.print(F("PASS ")); Serial.println(doc["pass"].as()); Serial.println(doc["printerip"].as()); @@ -37,7 +37,6 @@ void serialLoop(){ saveFileSystem(); Serial.println(F("Restarting Device")); - Serial.println(""); ESP.restart(); } diff --git a/src/types.h b/src/types.h index a80fd51..fd69a06 100644 --- a/src/types.h +++ b/src/types.h @@ -9,9 +9,7 @@ extern "C" typedef struct PrinterVaraiblesStruct{ String parsedHMS = ""; String gcodeState = "FINISH"; - String previous_gcodeState = "FINISH"; int stage = 0; - int previous_stage = 0; long lastRSSI = 0; bool overrideLEDstate = false; bool ledstate = true; @@ -19,6 +17,7 @@ extern "C" bool online = false; bool finished = false; bool doorOpen = false; + bool idleLightsOff = false; unsigned long finishstartms = 0; unsigned long idleStartms = 0; unsigned long disconnectMQTTms = 0; @@ -34,7 +33,7 @@ extern "C" typedef struct GlobalVariablesStruct{ char SSID[32]; char APPW[32]; - String FWVersion = "EXPERIMENTAL 10.3.24"; + String FWVersion = "EXPERIMENTAL 12.3.24"; String Host = "BLLED"; bool started = false; } GlobalVariables; diff --git a/src/web-server.h b/src/web-server.h index 1c12c5e..6e256e7 100644 --- a/src/web-server.h +++ b/src/web-server.h @@ -118,7 +118,6 @@ void setupWebserver(){ webServer.sendHeader("Connection", "close"); webServer.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); Serial.println(F("Restarting Device")); - Serial.println(""); ESP.restart(); }, []() { HTTPUpload& upload = webServer.upload(); diff --git a/src/wifi-manager.h b/src/wifi-manager.h index 2f4e08b..ee631ab 100644 --- a/src/wifi-manager.h +++ b/src/wifi-manager.h @@ -12,8 +12,8 @@ bool shouldSaveConfig = true; int connectionAttempts = 0; void configModeCallback() { - Serial.println("Entered config mode"); - Serial.print("AP IP address: "); + Serial.println(F("Entered config mode")); + Serial.print(F("AP IP address: ")); Serial.println(WiFi.softAPIP()); } @@ -30,10 +30,10 @@ bool connectToWifi(){ WiFi.mode(WIFI_STA); delay(10); while (WiFi.status() != WL_CONNECTED) { - //If optional MAC address for AP not set, connect to first available AP with SSID Name if(strlen(printerConfig.BSSID) == 0){ + //If optional MAC address for AP not set, connect to first available AP with SSID Name if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.print(F("Plain Wifi connection attempt to ")); + Serial.print(F("Wifi connection attempt to ")); Serial.println(globalVariables.SSID); } WiFi.begin(globalVariables.SSID, globalVariables.APPW); @@ -42,7 +42,7 @@ bool connectToWifi(){ // Reference https://stackoverflow.com/questions/70415075/esp32-select-one-from-multiple-wifi-ap-with-same-name-ssid uint8_t bssid[6] = {0}; - //Convert to Text (Debugging code to check contacts of array) + //Convert to Text (Debugging code to check contents of array) //char tempBSSID[18]; //snprintf(tempBSSID, sizeof(tempBSSID), "%02x:%02x:%02x:%02x:%02x:%02x", bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]); //Serial.print(F("Ary to STR: ")); @@ -51,22 +51,20 @@ bool connectToWifi(){ //Function to convert string MAC address to 6 byte array if(str2mac(printerConfig.BSSID,bssid)){ if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.print(F("Alternate Wifi connection attempt to MAC: ")); + Serial.print(F("Wifi connection attempt to MAC: ")); Serial.println(printerConfig.BSSID); } WiFi.begin(globalVariables.SSID, globalVariables.APPW, 0, bssid); } else{ if (printerConfig.debuging || printerConfig.debugingchange){ - Serial.print(F("Alternate MAC converion Failed, reverting to ")); + Serial.print(F("Parsing MAC Address Failed, reverting to ")); Serial.println(globalVariables.SSID); } WiFi.begin(globalVariables.SSID, globalVariables.APPW); } - - } - delay(1000); + delay(100); wl_status_t status = WiFi.status(); switch (status) @@ -90,8 +88,8 @@ bool connectToWifi(){ default: break; } - Serial.println(F("Waiting 10sec")); - delay(10000); // Giving enough time to connect + Serial.println(F(" Waiting 10 secs")); + delay(10000); // Giving time to connect connectionAttempts++; } @@ -112,7 +110,7 @@ bool connectToWifi(){ Serial.print(F("' with Signal Strength: ")); Serial.println(signalStrength); delay(10); - Serial.print("IP_ADDRESS:"); // Unique identifier for the IP address + Serial.print(F("IP_ADDRESS:")); // Unique identifier for the IP address Serial.println(WiFi.localIP()); return true; diff --git a/src/www/setupPage.h b/src/www/setupPage.h index 998062c..9ba5649 100644 --- a/src/www/setupPage.h +++ b/src/www/setupPage.h @@ -1,204 +1,205 @@ //https://mischianti.org/online-converter-file-to-cpp-gzip-byte-array-3/ -//File: setuppage.html.gz, Size: 3176 -#define setupPage_html_gz_len 3176 +//File: setuppage.html.gz, Size: 3197 +#define setupPage_html_gz_len 3197 const uint8_t setupPage_html_gz[] PROGMEM = { -0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xED, 0x1C, 0x6B, 0x53, 0x1B, 0x39, -0xF2, 0xFB, 0x55, 0xDD, 0x7F, 0x50, 0xBC, 0x97, 0x8C, 0x29, 0xB0, 0xC7, 0x40, 0x20, 0x59, 0xC7, -0x76, 0x55, 0x78, 0x65, 0xC9, 0x91, 0x83, 0x05, 0xF2, 0xD8, 0xDD, 0xDA, 0x0F, 0xF2, 0x8C, 0xEC, -0x51, 0x98, 0x19, 0x4D, 0x24, 0x8D, 0x8D, 0x73, 0x9B, 0xFF, 0x7E, 0x2D, 0x69, 0xC6, 0x1E, 0xCF, -0xC3, 0xD8, 0x26, 0xB9, 0x62, 0xAB, 0x18, 0x12, 0x18, 0x4B, 0xAD, 0xEE, 0x56, 0xBF, 0xD4, 0x2D, -0x09, 0x3A, 0x4F, 0x8E, 0xCE, 0x0F, 0xAF, 0x7F, 0xBB, 0x38, 0x46, 0x9E, 0x0C, 0xFC, 0xDE, 0x3F, -0xFF, 0xD1, 0x49, 0x7E, 0xAA, 0x37, 0x82, 0x5D, 0x78, 0x43, 0xF0, 0x74, 0x7C, 0x1A, 0xDE, 0x20, -0x4E, 0xFC, 0xAE, 0x25, 0xE4, 0xC4, 0x27, 0xC2, 0x23, 0x44, 0x5A, 0xC8, 0xE3, 0x64, 0xD0, 0xB5, -0x3C, 0x29, 0x23, 0xD1, 0xB6, 0x6D, 0xC7, 0x0D, 0x3F, 0x8B, 0xA6, 0xE3, 0xB3, 0xD8, 0x1D, 0xF8, -0x98, 0x93, 0xA6, 0xC3, 0x02, 0x1B, 0x7F, 0xC6, 0xB7, 0xB6, 0x4F, 0xFB, 0xC2, 0x1E, 0xB0, 0x50, -0x36, 0xF0, 0x98, 0x08, 0x16, 0x10, 0x7B, 0xAF, 0xB9, 0xBD, 0xD7, 0xDC, 0xB5, 0x1D, 0x21, 0x6C, -0xEC, 0xFB, 0xCD, 0x80, 0x86, 0x4D, 0x78, 0xB7, 0x10, 0x0D, 0x25, 0x19, 0x72, 0x2A, 0x27, 0x40, -0xC8, 0xC3, 0x7B, 0xDB, 0x3B, 0x0D, 0x7A, 0xEB, 0x9F, 0xFF, 0xFE, 0xF6, 0xD6, 0x7F, 0x89, 0x3F, -0x6F, 0x1F, 0x7E, 0x6D, 0x05, 0xFF, 0xFE, 0x3C, 0x39, 0xB9, 0x7E, 0xFB, 0xEB, 0xAD, 0x2D, 0x36, -0xDF, 0xEF, 0x8F, 0x59, 0x8B, 0xED, 0x5F, 0x6C, 0x1E, 0xFE, 0x7E, 0x71, 0xF9, 0xF6, 0xD3, 0xE6, -0xF0, 0x2B, 0xD9, 0x7D, 0xEB, 0xBD, 0x3C, 0xE1, 0xCC, 0x0E, 0xAE, 0x27, 0x67, 0x7C, 0x8F, 0xDB, -0x1F, 0x6E, 0x37, 0xE3, 0x0F, 0x2F, 0xDE, 0xBE, 0xBC, 0x1C, 0x5D, 0x0E, 0x7E, 0x8F, 0xF6, 0x36, -0x3F, 0xFD, 0x3C, 0xA0, 0xA3, 0x37, 0x2F, 0x5E, 0x77, 0xBB, 0x16, 0x72, 0x38, 0x13, 0x82, 0x71, -0x3A, 0xA4, 0x61, 0xD7, 0xC2, 0x21, 0x0B, 0x27, 0x01, 0x8B, 0x81, 0x07, 0x98, 0x14, 0xE1, 0x9C, -0xF0, 0x88, 0xF9, 0xD4, 0x01, 0x46, 0x42, 0xD6, 0x48, 0x9B, 0x2C, 0x64, 0xA7, 0x12, 0xD1, 0x72, -0x48, 0x3E, 0xA8, 0xA7, 0xCF, 0xDC, 0x09, 0xFA, 0xEF, 0xEC, 0xB3, 0x6E, 0xC3, 0xCE, 0xCD, 0x90, -0xB3, 0x38, 0x74, 0x1B, 0x0E, 0xF3, 0x19, 0x6F, 0xA3, 0x9F, 0x06, 0xDB, 0xEA, 0xEB, 0xD5, 0x3C, -0x9C, 0x16, 0xCD, 0x00, 0x07, 0xD4, 0x9F, 0xB4, 0xD1, 0x6B, 0x4E, 0xB1, 0xBF, 0x85, 0x04, 0x0E, -0x45, 0x43, 0x10, 0x4E, 0x07, 0x19, 0xE0, 0x6F, 0xB3, 0x57, 0x90, 0x6E, 0x28, 0x31, 0x0D, 0x09, -0xCF, 0x53, 0x75, 0xA9, 0x88, 0x7C, 0x0C, 0x98, 0x06, 0x3E, 0xB9, 0xCD, 0x53, 0x82, 0xA6, 0x86, -0x4B, 0x39, 0x71, 0x24, 0x65, 0x61, 0x1B, 0x01, 0x5B, 0x71, 0x10, 0xE6, 0x80, 0x3E, 0xC7, 0x42, -0xD2, 0xC1, 0xA4, 0xA1, 0x28, 0x90, 0x50, 0x02, 0x14, 0x7C, 0x27, 0x3C, 0x07, 0x85, 0x7D, 0x3A, -0x0C, 0x1B, 0x54, 0x92, 0x40, 0x54, 0x40, 0x78, 0x84, 0x0E, 0x3D, 0x18, 0xBE, 0xDD, 0x6A, 0x8D, -0xBC, 0x8A, 0x59, 0xF8, 0x6C, 0xC8, 0x1A, 0x6B, 0x4D, 0x65, 0x31, 0xFD, 0x3C, 0x8D, 0x3C, 0xE6, -0x31, 0x75, 0xA5, 0xA7, 0x59, 0x8B, 0xF2, 0x88, 0x33, 0x6C, 0x17, 0xFA, 0x02, 0xCC, 0xC1, 0x5C, -0x1A, 0xDC, 0x40, 0xEC, 0xCC, 0x03, 0x14, 0xE6, 0x25, 0xC9, 0xAD, 0xCC, 0x13, 0xD6, 0xBA, 0x16, -0xF4, 0x2B, 0x69, 0xA3, 0xDD, 0xFD, 0x02, 0x7E, 0xDD, 0x3B, 0x4E, 0x18, 0xE8, 0x33, 0xDF, 0xAD, -0x40, 0x3F, 0x60, 0x3C, 0xA8, 0x16, 0x5B, 0xD1, 0xEE, 0xC6, 0x1E, 0x08, 0x2A, 0x47, 0x2B, 0xC2, -0xAE, 0x4B, 0xC3, 0x61, 0x61, 0x1A, 0x1A, 0x03, 0xE3, 0x2E, 0xE1, 0x0D, 0x8E, 0x5D, 0x1A, 0x0B, -0x25, 0x8A, 0x12, 0x88, 0xDB, 0x06, 0xB8, 0xA8, 0xCB, 0xC6, 0x6D, 0xD4, 0x82, 0x2F, 0x05, 0x82, -0xF8, 0xB0, 0x8F, 0xEB, 0xAD, 0x2D, 0x94, 0xFC, 0x6B, 0xEE, 0x6E, 0xBC, 0x2A, 0x15, 0xFB, 0x7E, -0xEB, 0x69, 0xB9, 0x60, 0x25, 0x8B, 0x16, 0x89, 0xD5, 0xC7, 0x7D, 0xE2, 0x57, 0x1A, 0x49, 0xDF, -0x67, 0xCE, 0x4D, 0x39, 0x41, 0xD0, 0x65, 0x05, 0xC5, 0x3E, 0x93, 0x92, 0x05, 0x6D, 0xB4, 0xB7, -0x92, 0x2E, 0xA6, 0xFD, 0x46, 0x93, 0xDB, 0x45, 0x4D, 0xA6, 0x0E, 0xBF, 0xBB, 0xBB, 0x5B, 0x3E, -0x17, 0x1A, 0x46, 0xB1, 0xFC, 0x43, 0x4E, 0x22, 0xD2, 0xB5, 0x94, 0xA1, 0x58, 0x7F, 0x56, 0xDB, -0x68, 0x9E, 0xF7, 0xA9, 0xEA, 0x4A, 0x15, 0x33, 0xA7, 0xBA, 0xE2, 0xBC, 0x0C, 0x00, 0x8C, 0x05, -0x85, 0x09, 0x88, 0x71, 0x2E, 0xFA, 0xC9, 0x71, 0x9C, 0xC5, 0xD2, 0x29, 0x31, 0x91, 0xEA, 0xE9, -0x57, 0x4C, 0x52, 0xC4, 0xFD, 0x80, 0x96, 0x4C, 0xB3, 0x24, 0x4A, 0x3E, 0x3F, 0x7C, 0x7D, 0xB2, -0xD7, 0x2A, 0x97, 0xE8, 0x42, 0x53, 0xBE, 0x8F, 0x3C, 0x60, 0x05, 0xC8, 0xE3, 0x75, 0x62, 0x2E, -0x14, 0xCD, 0x88, 0xD1, 0x92, 0xF8, 0xB6, 0xC0, 0x66, 0x17, 0x0B, 0x68, 0xDA, 0x7B, 0xB7, 0xA7, -0xF7, 0x63, 0x50, 0x40, 0xF8, 0x28, 0xB2, 0x15, 0x44, 0xD6, 0x94, 0x6C, 0x38, 0xF4, 0xC9, 0x8F, -0x58, 0x55, 0x32, 0x53, 0x48, 0x3D, 0x63, 0xBB, 0x7A, 0x0D, 0x48, 0xF8, 0x28, 0x0D, 0x5A, 0xF3, -0x0B, 0xC9, 0xDD, 0x48, 0xC4, 0x98, 0x4A, 0xC7, 0xCB, 0x63, 0x89, 0x98, 0xA0, 0x66, 0x21, 0x87, -0xDC, 0x0C, 0x4B, 0x3A, 0xCA, 0x6B, 0x63, 0x3A, 0x55, 0x1A, 0x42, 0x0A, 0x47, 0x1A, 0x0B, 0x42, -0xE4, 0x7E, 0xF5, 0x4A, 0xB8, 0xFB, 0x7C, 0x49, 0xF6, 0xB4, 0xBB, 0xE7, 0x99, 0x64, 0x11, 0x76, -0x20, 0xA3, 0x83, 0x65, 0xA2, 0x9C, 0x70, 0xBE, 0x39, 0xA5, 0xDA, 0xAA, 0x20, 0x29, 0x20, 0x64, -0x15, 0x95, 0x3A, 0x13, 0x05, 0xEE, 0x43, 0x54, 0x8B, 0x0B, 0x06, 0xBF, 0xD8, 0x30, 0xB5, 0x45, -0xE6, 0x39, 0xF1, 0xC9, 0x40, 0x16, 0x5B, 0x79, 0x91, 0x3D, 0xF5, 0xA4, 0x06, 0x51, 0x68, 0x2F, -0xFA, 0x6A, 0x31, 0xDC, 0x82, 0x59, 0xF7, 0x6F, 0xA8, 0x6C, 0x48, 0x0E, 0x69, 0x5F, 0x32, 0x8F, -0xE6, 0x73, 0x91, 0x67, 0x72, 0x61, 0x6F, 0xCE, 0x6B, 0x17, 0x28, 0xCD, 0x48, 0xB0, 0xDD, 0x27, -0x90, 0x46, 0x90, 0xD5, 0x05, 0x99, 0xA6, 0x85, 0x96, 0x55, 0xA1, 0xB9, 0x9D, 0xA2, 0xEF, 0x26, -0xBA, 0x2E, 0xE9, 0x31, 0x42, 0x7E, 0x5E, 0x12, 0x63, 0x8C, 0x3C, 0x4B, 0x7A, 0x96, 0x4A, 0x6F, -0x7E, 0x80, 0x48, 0xF7, 0xE6, 0x16, 0xE2, 0xFC, 0x32, 0xD7, 0x76, 0x3C, 0xE2, 0xDC, 0x10, 0x17, -0x6D, 0x56, 0xD9, 0x68, 0x89, 0x29, 0xEC, 0x6C, 0xFF, 0xBC, 0x7F, 0xB2, 0x28, 0x43, 0x68, 0x0F, -0x98, 0x13, 0x8B, 0x05, 0x38, 0xF3, 0x79, 0x18, 0xAC, 0xEA, 0x4B, 0x60, 0x2D, 0xF0, 0x5A, 0x61, -0x0D, 0x73, 0x52, 0x54, 0x59, 0x67, 0xDB, 0x88, 0x0C, 0xA2, 0x0D, 0xF9, 0x54, 0x57, 0xEA, 0xCC, -0xA7, 0x78, 0x8D, 0x40, 0xAC, 0x00, 0xBD, 0x1C, 0x64, 0x45, 0x46, 0x01, 0x03, 0x86, 0x64, 0x95, -0xBC, 0x69, 0x71, 0x56, 0x93, 0x50, 0xE9, 0xD8, 0xD9, 0xDA, 0xAE, 0x23, 0x1C, 0x4E, 0x23, 0x99, -0xA9, 0xF4, 0x5C, 0x50, 0x48, 0x00, 0x0E, 0xD0, 0xFC, 0x12, 0x13, 0x3E, 0xB9, 0x22, 0x3E, 0x14, -0x53, 0x8C, 0xBF, 0xF6, 0xFD, 0xBA, 0x95, 0x61, 0x4E, 0x0B, 0x18, 0x94, 0xF3, 0xA7, 0xB5, 0xA1, -0xB2, 0xF5, 0x63, 0xEC, 0x78, 0x75, 0x00, 0x55, 0x03, 0x51, 0xB7, 0x87, 0x92, 0xD7, 0x26, 0xAC, -0xC2, 0xC7, 0x23, 0x78, 0x39, 0xA3, 0x02, 0x9C, 0x8A, 0xF0, 0xBA, 0xE5, 0x40, 0xD5, 0x79, 0x63, -0x6D, 0x21, 0x8D, 0xE0, 0x7C, 0x04, 0x75, 0x27, 0xA8, 0x67, 0x63, 0x63, 0x46, 0x7F, 0x10, 0x87, -0xBA, 0x7A, 0x9B, 0x87, 0xA8, 0x13, 0x85, 0x66, 0x23, 0x2F, 0x0B, 0x3A, 0x40, 0xF5, 0x29, 0xC3, -0x43, 0x22, 0x8F, 0x0D, 0xDD, 0x83, 0xC9, 0xA9, 0x5B, 0xB7, 0x38, 0x89, 0x80, 0x18, 0x48, 0xFC, -0x8C, 0xB8, 0x57, 0x12, 0x7E, 0x02, 0xAF, 0x89, 0x61, 0x14, 0x10, 0xCD, 0xCD, 0x3C, 0x8F, 0x88, -0x25, 0x4C, 0x5C, 0x12, 0x17, 0x50, 0x44, 0x9C, 0x45, 0xF5, 0x5A, 0x82, 0xA8, 0xB6, 0x85, 0x06, -0xD8, 0x17, 0x24, 0xAF, 0xF8, 0xA5, 0xF0, 0xBD, 0xE1, 0x84, 0x84, 0xDF, 0x15, 0xE3, 0x81, 0x1F, -0x93, 0xEF, 0x8A, 0xF0, 0x23, 0xE6, 0xC1, 0x47, 0x15, 0x7E, 0xBE, 0x2B, 0xD6, 0x43, 0xC8, 0x6E, -0x56, 0xC6, 0xFA, 0xAF, 0x7A, 0xED, 0xA7, 0xD4, 0x1C, 0x3E, 0x60, 0x98, 0xA8, 0xA8, 0x6D, 0x34, -0x3D, 0x65, 0x1B, 0x79, 0xE8, 0x6F, 0x60, 0x7F, 0xA2, 0xE0, 0xEB, 0x95, 0x38, 0x84, 0xC7, 0xC6, -0x45, 0x1C, 0xA5, 0xEE, 0x39, 0x35, 0xCE, 0x38, 0x72, 0xC1, 0xA0, 0x0E, 0x59, 0x38, 0xA0, 0xC3, -0x7A, 0xC1, 0x9A, 0x46, 0x98, 0xA3, 0x5B, 0x8F, 0xA3, 0x2E, 0x0A, 0xC9, 0x18, 0x7D, 0x7A, 0x77, -0xF6, 0x8B, 0x94, 0xD1, 0x25, 0x01, 0x8F, 0x12, 0xB2, 0x40, 0x09, 0x00, 0x9B, 0x2C, 0xE4, 0x04, -0xBB, 0x13, 0xA1, 0xAC, 0xD4, 0xF1, 0x94, 0xDF, 0xC3, 0xD8, 0x94, 0x58, 0x11, 0xBF, 0x7A, 0x94, -0xE9, 0xAB, 0xA1, 0x7A, 0xA0, 0x36, 0x6F, 0xD4, 0xED, 0x76, 0xD1, 0x73, 0xF4, 0xEC, 0x99, 0x46, -0xA9, 0x70, 0x41, 0x64, 0x55, 0x6D, 0x3B, 0xAD, 0x56, 0x29, 0x8A, 0x94, 0x55, 0x47, 0x4F, 0xE3, -0x08, 0x4B, 0x0C, 0x54, 0xDF, 0x5E, 0x9D, 0xFF, 0xA7, 0x19, 0x61, 0x2E, 0x48, 0x82, 0x5E, 0x44, -0x2C, 0x14, 0xE4, 0x1A, 0x6A, 0xB8, 0x32, 0xAD, 0xA8, 0xA7, 0x52, 0xDF, 0x34, 0x02, 0x05, 0x8F, -0x94, 0x9C, 0x01, 0xF1, 0x8C, 0x4A, 0x93, 0x46, 0xE8, 0xAF, 0xBF, 0x8A, 0x0B, 0xEC, 0x9D, 0xF8, -0x1C, 0xE6, 0x92, 0x72, 0x8C, 0xAA, 0x67, 0x3D, 0x9C, 0xD4, 0xAD, 0xE0, 0xD1, 0x5D, 0x0F, 0xDF, -0x82, 0xA8, 0x33, 0x4F, 0x60, 0x0A, 0xE8, 0x13, 0x4D, 0x4A, 0x1B, 0xFE, 0xAA, 0xD4, 0xC0, 0x94, -0x19, 0x3F, 0x22, 0xD2, 0xEC, 0x78, 0x55, 0x91, 0xD2, 0x50, 0x6E, 0x0A, 0xB5, 0x36, 0xB1, 0x01, -0x0D, 0xA9, 0xF0, 0x4E, 0x43, 0x57, 0xB1, 0xBD, 0x80, 0x9C, 0x81, 0xA3, 0x53, 0xB8, 0xB5, 0x09, -0xBA, 0xA4, 0x1F, 0xC3, 0x8A, 0x36, 0xAC, 0x22, 0x94, 0xF6, 0xDF, 0x9B, 0x80, 0xF1, 0xB9, 0xBB, -0xC8, 0x24, 0x9E, 0xB9, 0x2E, 0xB1, 0xE0, 0x8B, 0x94, 0x1A, 0x55, 0x15, 0x9D, 0x29, 0xC0, 0xFA, -0xF3, 0xA1, 0xC2, 0x61, 0xEF, 0x8C, 0x97, 0x94, 0x4F, 0x25, 0x05, 0x58, 0x9B, 0xC4, 0xFC, 0x62, -0x58, 0x4A, 0x24, 0x03, 0x72, 0x6F, 0x32, 0xE9, 0x1A, 0xB9, 0x90, 0x90, 0x06, 0xBA, 0x37, 0xA9, -0x64, 0xF1, 0x5C, 0x48, 0x49, 0xC1, 0xDC, 0x9B, 0x50, 0x76, 0x51, 0x5D, 0x48, 0x6D, 0x0A, 0x78, -0x6F, 0x92, 0xD9, 0x15, 0x77, 0x21, 0xC9, 0x29, 0xE0, 0xFD, 0x7C, 0x6A, 0x4C, 0x07, 0x74, 0xA1, -0x3B, 0x29, 0x80, 0xB5, 0x49, 0xE0, 0xE8, 0xDD, 0xEB, 0xC3, 0xF2, 0xB0, 0xAD, 0xBB, 0xD6, 0x8B, -0xDC, 0x7D, 0x5D, 0xFA, 0x86, 0x44, 0x08, 0x53, 0x33, 0x94, 0x13, 0x98, 0x41, 0x29, 0x2A, 0x90, -0x85, 0xAF, 0x48, 0xA6, 0x96, 0x27, 0x73, 0x64, 0x36, 0x31, 0x20, 0x11, 0x51, 0xFB, 0xA4, 0x87, -0xA6, 0xFC, 0x04, 0x9A, 0xB5, 0x83, 0x29, 0x60, 0x1B, 0xD5, 0x36, 0x51, 0x7D, 0x11, 0x13, 0x1B, -0x50, 0xEA, 0xD4, 0x9E, 0xD6, 0x56, 0xE5, 0x65, 0x40, 0x79, 0x30, 0xC6, 0x1C, 0x92, 0x6B, 0x2E, -0x20, 0x50, 0x17, 0x79, 0x38, 0x49, 0x00, 0xD0, 0x07, 0x03, 0xD1, 0xAE, 0x6D, 0xD6, 0xE7, 0x22, -0xFD, 0xDC, 0x78, 0xA4, 0xB8, 0xA9, 0xBD, 0x0F, 0x6F, 0x42, 0x36, 0x0E, 0xD1, 0x14, 0x69, 0x09, -0x57, 0xDF, 0x72, 0xD9, 0x56, 0x59, 0x4E, 0x14, 0x91, 0xB0, 0x6E, 0xBD, 0x39, 0xBE, 0x86, 0x6A, -0xC1, 0xB2, 0x81, 0x73, 0x93, 0x6D, 0xC1, 0x27, 0xC9, 0xE3, 0x42, 0x86, 0xA8, 0x53, 0x1E, 0x12, -0xBA, 0xF5, 0x8A, 0xC2, 0x6A, 0x0C, 0xCB, 0x11, 0x1B, 0x43, 0xA2, 0xE5, 0x33, 0xEC, 0x2E, 0x4C, -0xAE, 0x96, 0x56, 0x1C, 0x48, 0xAB, 0x50, 0xDF, 0xD4, 0x74, 0x8D, 0xA4, 0xD2, 0xD8, 0x14, 0x3F, -0x59, 0xA9, 0xD6, 0x58, 0xDB, 0x3A, 0x48, 0x53, 0x42, 0xF5, 0x47, 0x64, 0x62, 0xB2, 0x65, 0xD6, -0xF0, 0x2D, 0x2F, 0xB3, 0xF9, 0x24, 0x36, 0x2B, 0xB7, 0xCC, 0x7B, 0x49, 0xF2, 0x6B, 0xB6, 0xBA, -0x4F, 0xA0, 0xAC, 0x2D, 0x4A, 0x4F, 0xD7, 0x69, 0x90, 0xD4, 0xEB, 0x9F, 0x47, 0x64, 0x80, 0x63, -0xDF, 0xA4, 0xBC, 0xF7, 0xCD, 0x90, 0xB5, 0x35, 0x5C, 0x9C, 0x5F, 0x19, 0x73, 0x30, 0x2C, 0x5C, -0x11, 0x19, 0x47, 0x0B, 0x0D, 0x42, 0x26, 0x38, 0x7F, 0x81, 0x2C, 0x59, 0x95, 0x9F, 0x89, 0x00, -0x1B, 0xD7, 0x50, 0xC4, 0x2A, 0x44, 0x38, 0x32, 0x49, 0x18, 0x4C, 0xCB, 0xBE, 0x6D, 0x8C, 0xC7, -0xE3, 0x86, 0x3E, 0x7B, 0x8A, 0xB9, 0x4F, 0x42, 0x95, 0x53, 0xC2, 0x1A, 0x57, 0xE0, 0xFD, 0x7B, -0x26, 0xEC, 0x25, 0xF9, 0x7A, 0x26, 0x5D, 0x2F, 0xF7, 0x66, 0xEC, 0x13, 0x2E, 0xEB, 0x16, 0x4C, -0x5E, 0x42, 0x52, 0x22, 0x90, 0xC0, 0x23, 0x08, 0xB1, 0x22, 0x76, 0x1C, 0x30, 0x86, 0x41, 0xEC, -0xFB, 0x93, 0x27, 0xD6, 0x92, 0x3E, 0x57, 0x54, 0x8A, 0x9A, 0x7E, 0x52, 0x09, 0x28, 0xCD, 0x9C, -0x24, 0x1F, 0xEB, 0xE5, 0xDB, 0x02, 0x90, 0x13, 0x02, 0x80, 0xB5, 0x91, 0x27, 0xA7, 0x30, 0x41, -0x0D, 0x81, 0x03, 0xC8, 0x39, 0x39, 0x4C, 0x0A, 0xFD, 0xF1, 0x67, 0x61, 0xB7, 0xDB, 0x20, 0x9E, -0xEE, 0x1E, 0x4C, 0x85, 0xA7, 0x0D, 0x78, 0x0B, 0xDD, 0x90, 0x49, 0xA9, 0x18, 0x67, 0x68, 0x9B, -0x51, 0x2C, 0xBC, 0xBA, 0xD1, 0xD3, 0xFB, 0xCB, 0xD3, 0x43, 0x16, 0x40, 0xA5, 0x02, 0x2C, 0xD6, -0xF5, 0xD0, 0x4D, 0x64, 0x75, 0x2D, 0xF8, 0x5E, 0xD2, 0xAF, 0x29, 0x14, 0x78, 0x2E, 0xB8, 0x87, -0x9A, 0x84, 0x3E, 0xF7, 0xEE, 0x66, 0x89, 0x7E, 0x66, 0x14, 0x0C, 0xF1, 0x59, 0x85, 0x5D, 0xE8, -0x10, 0xA4, 0x06, 0x15, 0xBB, 0x39, 0x18, 0x2B, 0x0F, 0x0B, 0x0B, 0xDE, 0x6C, 0x5B, 0x26, 0xDD, -0x89, 0xE9, 0xD8, 0xC9, 0xDD, 0x04, 0x78, 0x55, 0xA8, 0xD2, 0xAD, 0x1A, 0x97, 0x8E, 0x90, 0xE3, -0x63, 0x21, 0xBA, 0xD6, 0x74, 0xF3, 0xDF, 0xCA, 0xEC, 0xDC, 0x64, 0x01, 0xE6, 0x0F, 0x9E, 0xB3, -0x50, 0x1A, 0x92, 0x06, 0xC3, 0x2C, 0xA4, 0x85, 0x04, 0x77, 0x66, 0x57, 0x1D, 0x38, 0x1E, 0x37, -0x87, 0x54, 0x7A, 0x71, 0x3F, 0x16, 0x84, 0x27, 0x1B, 0xA2, 0xFA, 0xBE, 0xC3, 0x51, 0x2C, 0x1D, -0xEF, 0x08, 0x7C, 0xDB, 0x67, 0x91, 0x7D, 0x70, 0x76, 0x76, 0x7C, 0xA4, 0x1C, 0x8A, 0x33, 0x1F, -0x4C, 0xD2, 0x0E, 0x80, 0x96, 0x0D, 0x88, 0x6C, 0x70, 0x23, 0xFB, 0x14, 0x86, 0x3D, 0xDD, 0x69, -0x89, 0x2F, 0xB1, 0xBA, 0x2B, 0x11, 0x41, 0x0E, 0x0F, 0x76, 0x2B, 0xBB, 0xD6, 0x99, 0x22, 0x97, -0x67, 0x47, 0x44, 0x38, 0x9C, 0xE3, 0x5C, 0x9F, 0x18, 0xF6, 0x72, 0x04, 0x40, 0x44, 0x00, 0x97, -0x9D, 0xB0, 0x0D, 0x33, 0xAE, 0x10, 0xC0, 0xFC, 0x11, 0x72, 0x81, 0xA2, 0xB7, 0x0D, 0xD8, 0x11, -0xA0, 0x47, 0x33, 0xFC, 0x68, 0xEA, 0x51, 0x17, 0x78, 0x48, 0x40, 0x0B, 0xDB, 0x85, 0x51, 0xBB, -0x88, 0xBA, 0xDD, 0xC2, 0xAA, 0xD9, 0x9B, 0xAE, 0x92, 0x49, 0x4B, 0x1B, 0x1D, 0xDF, 0x46, 0x94, -0x53, 0xE5, 0x30, 0xD8, 0x87, 0xF5, 0xB9, 0xB9, 0xDB, 0xDC, 0x79, 0x0E, 0x18, 0x77, 0xF3, 0x18, -0xA3, 0x5E, 0xD1, 0xC2, 0xAF, 0x3D, 0x2A, 0xC0, 0xE2, 0x20, 0xA4, 0x60, 0xDF, 0x67, 0x63, 0x81, -0x26, 0x2C, 0x46, 0x92, 0xA1, 0x24, 0xCE, 0x48, 0x8F, 0xA0, 0x77, 0xBF, 0x5E, 0x5F, 0xA3, 0x3E, -0x67, 0x37, 0xC0, 0x35, 0x0D, 0x07, 0x0C, 0xE1, 0xD0, 0x85, 0xFF, 0x13, 0xA4, 0x8E, 0xBD, 0x94, -0x17, 0x01, 0x55, 0x91, 0xCC, 0xA6, 0x99, 0x23, 0x69, 0xE7, 0x69, 0x76, 0x94, 0xAC, 0x10, 0x98, -0xB7, 0xC7, 0xDC, 0xAE, 0x09, 0xB1, 0x08, 0x6B, 0x5F, 0xEC, 0xCE, 0x07, 0x5A, 0xC4, 0x42, 0xF3, -0xB1, 0x6B, 0x25, 0xC6, 0x9C, 0x5D, 0x09, 0x5E, 0xE5, 0x85, 0xAC, 0x71, 0xEB, 0xE3, 0xA1, 0xDE, -0xE9, 0x45, 0xBB, 0x63, 0x9B, 0xD7, 0x12, 0x18, 0x73, 0xAE, 0x92, 0x39, 0x2B, 0x56, 0x52, 0x56, -0x9B, 0x07, 0x28, 0x04, 0xAF, 0x33, 0x6F, 0x92, 0x4A, 0x1F, 0x5E, 0x8F, 0xD5, 0xE1, 0x86, 0x16, -0xC1, 0xE9, 0x85, 0x9A, 0x2C, 0x57, 0x29, 0x10, 0x1B, 0x28, 0x11, 0xF1, 0xAC, 0x54, 0x2C, 0xA4, -0x9D, 0xBC, 0x6B, 0x59, 0xBD, 0x4E, 0x9F, 0x57, 0x33, 0xF6, 0x5A, 0x07, 0x4D, 0x30, 0x02, 0x97, -0xAC, 0xCE, 0xA1, 0xDE, 0x8E, 0x48, 0x78, 0x34, 0xEF, 0x05, 0x2E, 0xB1, 0xC1, 0xAF, 0xB7, 0x27, -0x40, 0xCC, 0x6B, 0xF3, 0x79, 0x45, 0xD4, 0xBD, 0x19, 0x74, 0x7A, 0xB4, 0x86, 0x1C, 0xDD, 0xA9, -0x1C, 0xDD, 0x12, 0x0E, 0x45, 0x8A, 0x79, 0xC6, 0x9F, 0x4B, 0x46, 0xD4, 0x21, 0xCB, 0xB2, 0x56, -0x3F, 0x8F, 0x8C, 0xC5, 0x6D, 0xA0, 0x44, 0x9A, 0x17, 0xEA, 0x0C, 0x0A, 0x41, 0x1E, 0xBE, 0x3A, -0xB3, 0x26, 0xB3, 0x4F, 0xF8, 0x4D, 0x3E, 0x14, 0x58, 0x56, 0x19, 0x7E, 0x5E, 0xF7, 0x22, 0x22, -0x0E, 0x94, 0x14, 0xCE, 0x1C, 0x0F, 0x77, 0x4F, 0x41, 0xE2, 0xBE, 0x4F, 0xCC, 0x96, 0x7A, 0xB7, -0xA6, 0xB6, 0xD4, 0x6B, 0x25, 0x50, 0x1A, 0xF2, 0xFA, 0xB2, 0xA2, 0xC7, 0xF4, 0x1E, 0x29, 0x52, -0x74, 0x18, 0x76, 0x6B, 0x92, 0x45, 0xB5, 0x14, 0xE3, 0x5E, 0x35, 0xC2, 0xE9, 0xD0, 0x24, 0xA8, -0xBC, 0x51, 0xF9, 0x23, 0xF6, 0xD3, 0x18, 0x54, 0xEB, 0x25, 0x0D, 0xD3, 0xA8, 0x54, 0x12, 0x3E, -0xF2, 0xCF, 0x71, 0xA8, 0xA7, 0x63, 0x23, 0xC8, 0x1A, 0xF5, 0x1B, 0xC8, 0x9E, 0x8D, 0x8D, 0x10, -0xC4, 0x2C, 0x84, 0x74, 0x0E, 0x16, 0xCD, 0x45, 0x3D, 0x4A, 0xCA, 0x3A, 0xFA, 0xA2, 0x74, 0xFF, -0x4F, 0x8D, 0xD6, 0x76, 0x1B, 0x80, 0x74, 0x21, 0x36, 0x89, 0xBB, 0x91, 0x64, 0xC3, 0x71, 0xFE, -0xD0, 0xBA, 0x2C, 0x56, 0x14, 0xC6, 0x67, 0x97, 0x85, 0xEC, 0x69, 0xB3, 0xD5, 0xBB, 0x4C, 0xF7, -0xCE, 0x74, 0x08, 0xD7, 0xC9, 0x54, 0xBB, 0xB0, 0x3C, 0x54, 0xE2, 0x35, 0x47, 0xD6, 0xF3, 0x88, -0xCD, 0x11, 0xEF, 0x32, 0x6C, 0x69, 0x14, 0x59, 0xEB, 0x4D, 0xCF, 0x42, 0x8C, 0x05, 0x17, 0xF7, -0xFF, 0x12, 0x6B, 0x2E, 0x76, 0x2C, 0x4B, 0x2C, 0x2B, 0x87, 0xA4, 0x34, 0xED, 0x2D, 0x3F, 0xDB, -0x4A, 0x17, 0x9C, 0x87, 0x9A, 0x5F, 0x4A, 0x4B, 0x61, 0x7E, 0x9C, 0x3E, 0x8F, 0xD5, 0x06, 0x25, -0x9A, 0xEE, 0x63, 0x3E, 0x14, 0x5D, 0xE6, 0x76, 0x57, 0x13, 0x45, 0xE6, 0x5A, 0x1F, 0xB5, 0x98, -0x6A, 0xF1, 0x44, 0xEF, 0xFB, 0xA2, 0xD9, 0x06, 0xF1, 0x43, 0xD1, 0x63, 0x61, 0xE3, 0x3A, 0xD1, -0x64, 0xA1, 0xFD, 0x51, 0x97, 0xD3, 0x08, 0xFB, 0xE6, 0x00, 0xBD, 0x33, 0x59, 0xD1, 0x83, 0x50, -0xE1, 0x6C, 0x67, 0x3B, 0xD1, 0xDD, 0xAC, 0xE1, 0x51, 0x69, 0xA9, 0xD2, 0x8E, 0x92, 0x83, 0x8A, -0x07, 0xA3, 0xB4, 0xF4, 0xFC, 0x26, 0xD5, 0x59, 0xFA, 0xF9, 0x51, 0x65, 0x79, 0x95, 0xA1, 0x43, -0x9D, 0x9A, 0x89, 0x87, 0xA6, 0xBA, 0xE4, 0x64, 0x2C, 0xA7, 0xC0, 0xA4, 0xF5, 0x51, 0x8D, 0xA9, -0x1A, 0x75, 0x6A, 0x7C, 0x06, 0x4D, 0x0F, 0xC8, 0xFB, 0x66, 0xE7, 0x8D, 0x89, 0xF6, 0x66, 0x0D, -0x7F, 0x23, 0xC5, 0x75, 0xEC, 0xEB, 0xA3, 0x1F, 0x54, 0x79, 0x29, 0x73, 0x50, 0xA5, 0x57, 0xEE, -0x46, 0xC8, 0x32, 0x53, 0x4B, 0x8A, 0xB6, 0x6B, 0x22, 0xE4, 0xA1, 0xBA, 0xEB, 0x06, 0xA3, 0xD4, -0xBB, 0x2E, 0x47, 0xF4, 0xE5, 0xB7, 0x65, 0xCA, 0x35, 0xF5, 0x24, 0x25, 0x9B, 0x29, 0xD4, 0xCC, -0x48, 0x55, 0x6A, 0xC9, 0x04, 0xD9, 0x12, 0x65, 0x96, 0x7A, 0x4E, 0x07, 0x66, 0xF7, 0x87, 0x13, -0xBD, 0x73, 0x33, 0x22, 0xA8, 0x81, 0x3E, 0x42, 0x39, 0xBC, 0x65, 0x6A, 0xB6, 0x67, 0x28, 0xE2, -0xFA, 0x5A, 0x28, 0xD2, 0x1B, 0xD6, 0x06, 0xCE, 0xF7, 0x11, 0x48, 0x8D, 0x71, 0xE2, 0x2E, 0x47, -0xE3, 0xBE, 0xDE, 0xA3, 0x71, 0x54, 0x7B, 0x50, 0xAA, 0x04, 0x74, 0x49, 0xDC, 0xE5, 0x3D, 0x48, -0x23, 0xBD, 0xBF, 0x17, 0x69, 0x34, 0xD5, 0x9E, 0x94, 0x3D, 0xF3, 0x4E, 0x7C, 0x29, 0xDB, 0xB4, -0x0A, 0x91, 0x7B, 0x79, 0x94, 0xC6, 0xB0, 0x94, 0x57, 0x19, 0xC8, 0xBB, 0x43, 0xA2, 0x86, 0xFB, -0x3F, 0x29, 0x56, 0x9F, 0xD2, 0x3F, 0x54, 0xD5, 0x9A, 0x7B, 0x06, 0x39, 0xE5, 0x9A, 0xC6, 0x47, -0xF5, 0x2E, 0xA5, 0x5E, 0x75, 0x35, 0xE2, 0xA1, 0x6A, 0x57, 0x5F, 0xED, 0xC8, 0x29, 0x57, 0xB7, -0x3D, 0xEA, 0x76, 0x29, 0xDD, 0xAA, 0x8B, 0x28, 0x48, 0x5F, 0x0B, 0x79, 0xA8, 0x1A, 0x9E, 0xDD, -0xA9, 0xC9, 0xA9, 0x79, 0xD6, 0xF1, 0xA8, 0xEB, 0xA5, 0x74, 0xAD, 0x6E, 0x00, 0x3D, 0x6C, 0x5D, -0xCF, 0x2E, 0x33, 0xE5, 0x74, 0x3D, 0xEB, 0xF8, 0xBB, 0xEB, 0xBA, 0x24, 0xBF, 0xBC, 0xF2, 0x20, -0x43, 0x54, 0x49, 0x1D, 0xBA, 0x92, 0x9C, 0x84, 0x43, 0xE9, 0x2D, 0x99, 0x62, 0x3E, 0x1B, 0xCA, -0x57, 0xDD, 0xC6, 0x5E, 0x0B, 0xB9, 0x07, 0x81, 0x59, 0x84, 0xB7, 0x4C, 0x1B, 0x6A, 0xEC, 0x9B, -0xC6, 0x33, 0x75, 0x95, 0x44, 0xF7, 0xA8, 0x54, 0x30, 0xE9, 0x7B, 0x61, 0xFA, 0x7E, 0x23, 0xEA, -0x10, 0x72, 0x3A, 0xE2, 0xA5, 0x69, 0x3D, 0xE7, 0xE9, 0x41, 0xC2, 0x33, 0x5F, 0xBE, 0x82, 0xC6, -0xCB, 0x07, 0x92, 0x46, 0xEA, 0x7A, 0x5A, 0x8B, 0xE9, 0xA1, 0x59, 0xEF, 0xEC, 0x5E, 0x5C, 0xB6, -0x98, 0xD6, 0x0D, 0x7F, 0x63, 0x6B, 0xBD, 0x47, 0xF9, 0x06, 0x5D, 0x65, 0x06, 0xD3, 0xB1, 0xF5, -0xA1, 0x5C, 0xE5, 0x81, 0xA3, 0x76, 0x8C, 0xAA, 0x6B, 0x52, 0xBD, 0xEC, 0xB5, 0x28, 0xA8, 0x01, -0x97, 0x3B, 0x80, 0xAC, 0x69, 0x6B, 0xAE, 0x95, 0x62, 0xAE, 0x19, 0x6D, 0x95, 0xB4, 0x07, 0x14, -0x6A, 0xCE, 0x16, 0xFC, 0xC4, 0xB7, 0xFA, 0xEC, 0xB0, 0x96, 0x9C, 0x36, 0xEA, 0xF7, 0x1E, 0x32, -0x27, 0x8E, 0x77, 0x9C, 0x7C, 0x26, 0xBF, 0x35, 0x9C, 0x9E, 0x53, 0x5E, 0xE1, 0x91, 0x0A, 0xC0, -0xEA, 0x42, 0x56, 0xCC, 0x4B, 0xB7, 0xA4, 0x3B, 0xB6, 0x3A, 0xAD, 0xCF, 0x37, 0x3E, 0x69, 0x34, -0x3A, 0xC9, 0xEF, 0xD2, 0x1A, 0xBC, 0xE6, 0x83, 0x3A, 0xB1, 0xD7, 0xBF, 0x70, 0xD3, 0xB5, 0x92, -0xFB, 0x6F, 0x3E, 0x33, 0x3B, 0xDD, 0x4D, 0xFD, 0xC7, 0x2D, 0x6A, 0xB6, 0xB9, 0x02, 0x56, 0x7B, -0x65, 0xF5, 0xDE, 0xEB, 0x37, 0x94, 0xBD, 0x6E, 0x61, 0x90, 0xF4, 0x1A, 0x8D, 0xEC, 0x1D, 0x8B, -0x8C, 0xBE, 0xD3, 0x77, 0x80, 0x34, 0xD7, 0x54, 0xF4, 0xDD, 0x15, 0xF3, 0x17, 0x36, 0xFE, 0x07, -0x14, 0xFD, 0xEB, 0x2F, 0x7B, 0x43, 0x00, 0x00 +0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xED, 0x1C, 0x6B, 0x73, 0xDB, 0x36, +0xF2, 0xFB, 0xCD, 0xDC, 0x7F, 0x40, 0xD5, 0x69, 0x28, 0x8F, 0x2D, 0x51, 0xB6, 0x63, 0x37, 0x55, +0x24, 0xCF, 0xC4, 0x96, 0x9D, 0x3A, 0x75, 0xCE, 0xAE, 0xED, 0xB4, 0x69, 0x3B, 0xFD, 0x00, 0x91, +0x90, 0x88, 0x98, 0x22, 0x58, 0x00, 0xD4, 0xA3, 0xD7, 0xFE, 0xF7, 0x5B, 0x00, 0xA4, 0x44, 0x91, +0xA0, 0x2C, 0xCB, 0xC9, 0x8D, 0x3B, 0x63, 0x25, 0x13, 0x53, 0xC0, 0x72, 0x77, 0xB1, 0x2F, 0xEC, +0x62, 0xE1, 0x74, 0xBE, 0xEA, 0x5D, 0x9E, 0xDC, 0xFE, 0x72, 0x75, 0x8A, 0x02, 0x39, 0x0A, 0x8F, +0xFE, 0xFD, 0xAF, 0x4E, 0xFA, 0x53, 0x3D, 0x11, 0xEC, 0xC3, 0x13, 0x82, 0x4F, 0x27, 0xA4, 0xD1, +0x1D, 0xE2, 0x24, 0xEC, 0x3A, 0x42, 0xCE, 0x42, 0x22, 0x02, 0x42, 0xA4, 0x83, 0x02, 0x4E, 0x06, +0x5D, 0x27, 0x90, 0x32, 0x16, 0x6D, 0xD7, 0xF5, 0xFC, 0xE8, 0x93, 0x68, 0x7A, 0x21, 0x4B, 0xFC, +0x41, 0x88, 0x39, 0x69, 0x7A, 0x6C, 0xE4, 0xE2, 0x4F, 0x78, 0xEA, 0x86, 0xB4, 0x2F, 0xDC, 0x01, +0x8B, 0x64, 0x03, 0x4F, 0x88, 0x60, 0x23, 0xE2, 0x1E, 0x34, 0x77, 0x0F, 0x9A, 0xFB, 0xAE, 0x27, +0x84, 0x8B, 0xC3, 0xB0, 0x39, 0xA2, 0x51, 0x13, 0x9E, 0x1D, 0x44, 0x23, 0x49, 0x86, 0x9C, 0xCA, +0x19, 0x10, 0x0A, 0xF0, 0xC1, 0xEE, 0x5E, 0x83, 0x4E, 0xC3, 0xCB, 0x5F, 0xDF, 0x4D, 0xC3, 0x57, +0xF8, 0xD3, 0xEE, 0xC9, 0x9F, 0xAD, 0xD1, 0x0F, 0x9F, 0x66, 0x67, 0xB7, 0xEF, 0x7E, 0x9C, 0xBA, +0x62, 0xFB, 0xC3, 0xE1, 0x84, 0xB5, 0xD8, 0xE1, 0xD5, 0xF6, 0xC9, 0xAF, 0x57, 0xD7, 0xEF, 0x3E, +0x6E, 0x0F, 0xFF, 0x24, 0xFB, 0xEF, 0x82, 0x57, 0x67, 0x9C, 0xB9, 0xA3, 0xDB, 0xD9, 0x05, 0x3F, +0xE0, 0xEE, 0x4F, 0xD3, 0xED, 0xE4, 0xA7, 0x6F, 0xDF, 0xBD, 0xBA, 0x1E, 0x5F, 0x0F, 0x7E, 0x8D, +0x0F, 0xB6, 0x3F, 0x7E, 0x37, 0xA0, 0xE3, 0xB7, 0xDF, 0xBE, 0xE9, 0x76, 0x1D, 0xE4, 0x71, 0x26, +0x04, 0xE3, 0x74, 0x48, 0xA3, 0xAE, 0x83, 0x23, 0x16, 0xCD, 0x46, 0x2C, 0x01, 0x1E, 0x60, 0x51, +0x84, 0x73, 0xC2, 0x63, 0x16, 0x52, 0x0F, 0x18, 0x89, 0x58, 0x23, 0x1B, 0x72, 0x90, 0x9B, 0x49, +0x44, 0xCB, 0x21, 0xFD, 0xA2, 0x3E, 0x7D, 0xE6, 0xCF, 0xD0, 0x7F, 0x17, 0xDF, 0xF5, 0x18, 0xF6, +0xEE, 0x86, 0x9C, 0x25, 0x91, 0xDF, 0xF0, 0x58, 0xC8, 0x78, 0x1B, 0x7D, 0x3D, 0xD8, 0x55, 0x7F, +0x5E, 0x2F, 0xC3, 0x69, 0xD1, 0x0C, 0xF0, 0x88, 0x86, 0xB3, 0x36, 0x7A, 0xC3, 0x29, 0x0E, 0x77, +0x90, 0xC0, 0x91, 0x68, 0x08, 0xC2, 0xE9, 0x20, 0x07, 0xFC, 0xF7, 0xE2, 0x11, 0xA4, 0x1B, 0x49, +0x4C, 0x23, 0xC2, 0x8B, 0x54, 0x7D, 0x2A, 0xE2, 0x10, 0x03, 0xA6, 0x41, 0x48, 0xA6, 0x45, 0x4A, +0x30, 0xD4, 0xF0, 0x29, 0x27, 0x9E, 0xA4, 0x2C, 0x6A, 0x23, 0x60, 0x2B, 0x19, 0x45, 0x05, 0xA0, +0x4F, 0x89, 0x90, 0x74, 0x30, 0x6B, 0x28, 0x0A, 0x24, 0x92, 0x00, 0x05, 0xFF, 0x12, 0x5E, 0x80, +0xC2, 0x21, 0x1D, 0x46, 0x0D, 0x2A, 0xC9, 0x48, 0x54, 0x40, 0x04, 0x84, 0x0E, 0x03, 0x78, 0x7D, +0xB7, 0xD5, 0x1A, 0x07, 0x15, 0xAB, 0x08, 0xD9, 0x90, 0x35, 0x36, 0x5A, 0xCA, 0x6A, 0xFA, 0x45, +0x1A, 0x45, 0xCC, 0x13, 0xEA, 0xCB, 0x40, 0xB3, 0x16, 0x17, 0x11, 0xE7, 0xD8, 0x2E, 0xCD, 0x8D, +0x30, 0x07, 0x73, 0x69, 0x70, 0x03, 0xB1, 0xB7, 0x0C, 0x50, 0x5A, 0x97, 0x24, 0x53, 0x59, 0x24, +0xAC, 0x75, 0x2D, 0xE8, 0x9F, 0xA4, 0x8D, 0xF6, 0x0F, 0x4B, 0xF8, 0xF5, 0xEC, 0x24, 0x65, 0xA0, +0xCF, 0x42, 0xBF, 0x02, 0xFD, 0x80, 0xF1, 0x51, 0xB5, 0xD8, 0xCA, 0x76, 0x37, 0x09, 0x40, 0x50, +0x05, 0x5A, 0x31, 0xF6, 0x7D, 0x1A, 0x0D, 0x4B, 0xCB, 0xD0, 0x18, 0x18, 0xF7, 0x09, 0x6F, 0x70, +0xEC, 0xD3, 0x44, 0x28, 0x51, 0x58, 0x20, 0xA6, 0x0D, 0x70, 0x51, 0x9F, 0x4D, 0xDA, 0xA8, 0x05, +0x7F, 0x14, 0x08, 0xE2, 0xC3, 0x3E, 0xAE, 0xB7, 0x76, 0x50, 0xFA, 0xB7, 0xB9, 0xBF, 0xF5, 0xDA, +0x2A, 0xF6, 0xC3, 0xD6, 0x37, 0x76, 0xC1, 0x4A, 0x16, 0xAF, 0x12, 0x6B, 0x88, 0xFB, 0x24, 0xAC, +0x34, 0x92, 0x7E, 0xC8, 0xBC, 0x3B, 0x3B, 0x41, 0xD0, 0x65, 0x05, 0xC5, 0x3E, 0x93, 0x92, 0x8D, +0xDA, 0xE8, 0xE0, 0x41, 0xBA, 0x98, 0xCF, 0x1B, 0x4D, 0xEE, 0x96, 0x35, 0x99, 0x39, 0xFC, 0xFE, +0xFE, 0xBE, 0x7D, 0x2D, 0x34, 0x8A, 0x13, 0xF9, 0x9B, 0x9C, 0xC5, 0xA4, 0xEB, 0x28, 0x43, 0x71, +0x7E, 0xAF, 0xB6, 0xD1, 0x22, 0xEF, 0x73, 0xD5, 0x59, 0x15, 0xB3, 0xA4, 0xBA, 0xF2, 0xBA, 0x0C, +0x00, 0xBC, 0x0B, 0x0A, 0x13, 0x10, 0xE3, 0x7C, 0xF4, 0xB5, 0xE7, 0x79, 0xAB, 0xA5, 0x63, 0x31, +0x91, 0xEA, 0xE5, 0x57, 0x2C, 0x52, 0x24, 0xFD, 0x11, 0xB5, 0x2C, 0xD3, 0x12, 0x25, 0x5F, 0x9E, +0xBC, 0x39, 0x3B, 0x68, 0xD9, 0x25, 0xBA, 0xD2, 0x94, 0x1F, 0x23, 0x0F, 0xD8, 0x01, 0x8A, 0x78, +0xBD, 0x84, 0x0B, 0x45, 0x33, 0x66, 0xD4, 0x12, 0xDF, 0x56, 0xD8, 0xEC, 0x6A, 0x01, 0xCD, 0x67, +0xEF, 0xF7, 0xF4, 0x7E, 0x02, 0x0A, 0x88, 0x9E, 0x45, 0xF6, 0x00, 0x91, 0x35, 0x25, 0x1B, 0x0E, +0x43, 0xF2, 0x25, 0x76, 0x95, 0xDC, 0x12, 0x32, 0xCF, 0xD8, 0xAD, 0xDE, 0x03, 0x52, 0x3E, 0xAC, +0x41, 0x6B, 0x79, 0x23, 0xB9, 0x1F, 0x89, 0x98, 0x50, 0xE9, 0x05, 0x45, 0x2C, 0x31, 0x13, 0xD4, +0x6C, 0xE4, 0x90, 0x9B, 0x61, 0x49, 0xC7, 0x45, 0x6D, 0xCC, 0x97, 0x4A, 0x23, 0x48, 0xE1, 0x48, +0x63, 0x45, 0x88, 0x3C, 0xAC, 0xDE, 0x09, 0xF7, 0x5F, 0xAE, 0xC9, 0x9E, 0x76, 0xF7, 0x22, 0x93, +0x2C, 0xC6, 0x1E, 0x64, 0x74, 0xB0, 0x4D, 0xD8, 0x09, 0x17, 0x87, 0x33, 0xAA, 0xAD, 0x0A, 0x92, +0x02, 0x42, 0x56, 0x59, 0xA9, 0x0B, 0x51, 0xE0, 0x3E, 0x44, 0xB5, 0xA4, 0x64, 0xF0, 0xAB, 0x0D, +0x53, 0x5B, 0x64, 0x91, 0x93, 0x90, 0x0C, 0x64, 0x79, 0x94, 0x97, 0xD9, 0x53, 0x9F, 0xCC, 0x20, +0x4A, 0xE3, 0x65, 0x5F, 0x2D, 0x87, 0x5B, 0x30, 0xEB, 0xFE, 0x1D, 0x95, 0x0D, 0xC9, 0x21, 0xED, +0x4B, 0xD7, 0xD1, 0x7C, 0x29, 0x8A, 0x4C, 0xAE, 0x9C, 0x2D, 0x78, 0xED, 0x0A, 0xA5, 0x19, 0x09, +0xB6, 0xFB, 0x04, 0xD2, 0x08, 0xF2, 0x70, 0x41, 0x66, 0x69, 0xA1, 0xE3, 0x54, 0x68, 0x6E, 0xAF, +0xEC, 0xBB, 0xA9, 0xAE, 0x2D, 0x33, 0x46, 0xC8, 0x2F, 0x2D, 0x31, 0xC6, 0xC8, 0xD3, 0x32, 0xB3, +0x56, 0x7A, 0xF3, 0x05, 0x44, 0x7A, 0xB0, 0xB4, 0x11, 0x17, 0xB7, 0xB9, 0xB6, 0x17, 0x10, 0xEF, +0x8E, 0xF8, 0x68, 0xBB, 0xCA, 0x46, 0x2D, 0xA6, 0xB0, 0xB7, 0xFB, 0xDD, 0xE1, 0xD9, 0xAA, 0x0C, +0xA1, 0x3D, 0x60, 0x5E, 0x22, 0x56, 0xE0, 0x2C, 0xE6, 0x61, 0xB0, 0xAB, 0xAF, 0x81, 0xB5, 0xC4, +0x6B, 0x85, 0x35, 0x2C, 0x49, 0x51, 0x65, 0x9D, 0x6D, 0x23, 0x32, 0x88, 0x36, 0xE4, 0x63, 0x5D, +0xA9, 0xB3, 0x98, 0xE2, 0x35, 0x46, 0xE2, 0x01, 0xD0, 0xEB, 0x41, 0x56, 0x64, 0x14, 0xF0, 0xC2, +0x90, 0x3C, 0x24, 0x6F, 0x5A, 0x9D, 0xD5, 0xA4, 0x54, 0x3A, 0x6E, 0xBE, 0xB6, 0xEB, 0x08, 0x8F, +0xD3, 0x58, 0xE6, 0x2A, 0xBD, 0x41, 0x12, 0xE9, 0xEA, 0x09, 0x89, 0x80, 0x4D, 0x6E, 0x89, 0x90, +0x97, 0xB1, 0xFA, 0x2A, 0xEA, 0x5B, 0x45, 0x46, 0xC6, 0x98, 0xA3, 0x29, 0xEA, 0x22, 0x1F, 0x54, +0x38, 0x02, 0x97, 0x69, 0x0E, 0x89, 0x3C, 0x0D, 0x89, 0x7A, 0x3C, 0x9E, 0x9D, 0xFB, 0xF5, 0xDA, +0xC5, 0x69, 0x4F, 0x21, 0xB8, 0x21, 0x52, 0xC2, 0x5E, 0x2C, 0x6A, 0x45, 0xE9, 0xD0, 0x01, 0xAA, +0x57, 0xBD, 0xEC, 0x70, 0x12, 0x43, 0x81, 0x0A, 0xF2, 0xBA, 0x20, 0xFE, 0x8D, 0x84, 0x9F, 0xCE, +0x56, 0x33, 0x55, 0x6B, 0x89, 0x13, 0xF5, 0xA9, 0x44, 0xC4, 0xC6, 0x50, 0xDC, 0x82, 0x0D, 0x5C, +0x13, 0x7F, 0x81, 0x02, 0xD8, 0x1E, 0xE0, 0x50, 0x14, 0xBD, 0x6A, 0x2D, 0x44, 0x6F, 0x39, 0x21, +0xD1, 0xE7, 0x41, 0x75, 0x1C, 0x26, 0xE4, 0xF3, 0x60, 0xFA, 0x19, 0xF3, 0xD1, 0xCF, 0x2A, 0x4E, +0x7C, 0x1E, 0x74, 0x27, 0x90, 0x7F, 0x7C, 0x06, 0x74, 0x3E, 0xE9, 0x27, 0xC3, 0x09, 0x1D, 0xD0, +0xB5, 0xD0, 0x4C, 0x9B, 0xDA, 0x34, 0x9B, 0xE9, 0xB6, 0x0E, 0x90, 0x35, 0x95, 0x82, 0xD5, 0x2C, +0xA0, 0xAE, 0xFB, 0x3D, 0x70, 0x89, 0x84, 0xA9, 0xF4, 0x21, 0x77, 0xE2, 0x28, 0x63, 0x5D, 0x20, +0x1C, 0xF9, 0x48, 0x11, 0x45, 0x12, 0xAC, 0x6F, 0xF9, 0xDD, 0xBF, 0x11, 0x01, 0xDA, 0x36, 0xFB, +0x51, 0xC6, 0x58, 0x62, 0xA0, 0x9B, 0xB1, 0x60, 0x35, 0xB9, 0x0A, 0x9E, 0x75, 0x16, 0x62, 0x63, +0xDA, 0x30, 0x7E, 0x03, 0x7E, 0xF5, 0x70, 0xC6, 0x35, 0xF3, 0xC5, 0xB5, 0xAC, 0xFB, 0xB1, 0x86, +0x9A, 0xB9, 0xA3, 0x27, 0xB1, 0x0F, 0xEE, 0x75, 0xC2, 0xA2, 0x01, 0x1D, 0x56, 0x78, 0x79, 0xC0, +0x61, 0x61, 0x11, 0x99, 0xA0, 0x8F, 0xEF, 0x2F, 0xBE, 0x97, 0x32, 0xBE, 0x26, 0x7F, 0x24, 0xC0, +0x62, 0xBD, 0xE8, 0xD1, 0x00, 0xD8, 0x64, 0x11, 0x27, 0xD8, 0x9F, 0x09, 0xE5, 0xB3, 0x5E, 0xA0, +0x62, 0x98, 0x52, 0x79, 0x4A, 0xAC, 0x8C, 0x5F, 0x7D, 0xB4, 0xEC, 0xE1, 0x55, 0xFD, 0xA2, 0x76, +0x76, 0x2D, 0xFA, 0x97, 0xE8, 0xC5, 0x0B, 0x8D, 0x52, 0xE1, 0x82, 0x5D, 0x42, 0x8D, 0xED, 0xB5, +0x5A, 0x95, 0xBA, 0x50, 0xAC, 0x7A, 0x7A, 0x19, 0x3D, 0x2C, 0x31, 0x50, 0x7D, 0x77, 0x73, 0xF9, +0x9F, 0x66, 0x8C, 0xB9, 0x20, 0x29, 0x7A, 0x11, 0x43, 0x24, 0x23, 0xB7, 0x50, 0x8F, 0x16, 0x39, +0xCF, 0x3E, 0x95, 0xA6, 0x4C, 0x63, 0xB0, 0xE1, 0x31, 0x06, 0x87, 0x05, 0xC4, 0x0B, 0x2A, 0x4D, +0x1A, 0xA3, 0xBF, 0xFE, 0x2A, 0x27, 0x0B, 0xF7, 0xE2, 0xF3, 0x98, 0x4F, 0xEC, 0x18, 0xD5, 0xCC, +0x66, 0x38, 0xA9, 0x5F, 0xC1, 0xA3, 0xBF, 0x19, 0xBE, 0x15, 0x31, 0x78, 0x99, 0xC0, 0x1C, 0x30, +0x24, 0x9A, 0x54, 0x95, 0x87, 0xAF, 0xA4, 0x06, 0x5E, 0xC0, 0x78, 0x8F, 0x48, 0xE3, 0x1A, 0x55, +0xA4, 0x34, 0x94, 0x9F, 0x41, 0x6D, 0x4C, 0x6C, 0x40, 0x23, 0x2A, 0x82, 0xF3, 0xC8, 0x57, 0x6C, +0xAF, 0x20, 0x67, 0xE0, 0xE8, 0x1C, 0x6E, 0x63, 0x82, 0x3A, 0x14, 0xC2, 0x36, 0x58, 0x45, 0x28, +0x9B, 0x7F, 0x34, 0x01, 0xE3, 0x73, 0xF7, 0x91, 0x49, 0x3D, 0x73, 0x53, 0x62, 0xA3, 0x3F, 0xA4, +0xD4, 0xA8, 0xAA, 0xE8, 0xCC, 0x01, 0x36, 0x5F, 0x0F, 0x15, 0x1E, 0x7B, 0x6F, 0xBC, 0xC4, 0xBE, +0x94, 0x0C, 0x60, 0x63, 0x12, 0x55, 0xA9, 0x41, 0x8E, 0x48, 0x0E, 0xE4, 0xD1, 0x64, 0xCA, 0x89, +0x83, 0x85, 0x90, 0x06, 0x7A, 0x34, 0xA9, 0x52, 0x62, 0x61, 0xA1, 0xA4, 0x60, 0x1E, 0x4D, 0xC8, +0x9E, 0x77, 0x58, 0xA8, 0xCD, 0x01, 0x1F, 0x4D, 0xD2, 0x9E, 0x9B, 0x58, 0x48, 0xCE, 0x01, 0x1F, +0xE7, 0x53, 0xA5, 0xFC, 0xA5, 0xE8, 0x4E, 0x7A, 0xCB, 0xDE, 0x94, 0x04, 0x8E, 0xDF, 0xBF, 0x39, +0xB1, 0x87, 0x6D, 0x3D, 0xB5, 0x59, 0xE4, 0xEE, 0xEB, 0x32, 0x3E, 0x22, 0x42, 0x98, 0xFA, 0xC7, +0x4E, 0x60, 0x01, 0xA5, 0xA8, 0x40, 0x45, 0xF1, 0x40, 0x32, 0xB5, 0x22, 0x99, 0x9E, 0xC9, 0x82, +0x6A, 0x5B, 0x4D, 0x75, 0xE6, 0x7B, 0x62, 0x4A, 0x69, 0x95, 0x13, 0x1D, 0xCF, 0x01, 0xDB, 0xA8, +0xB6, 0x8D, 0xEA, 0xAB, 0x98, 0xD8, 0x82, 0xB2, 0xAD, 0xF6, 0x4D, 0x55, 0x02, 0x55, 0xC9, 0xCB, +0x80, 0xF2, 0xD1, 0x04, 0x73, 0x02, 0xCA, 0x17, 0x10, 0xA8, 0xCB, 0x3C, 0x9C, 0xA5, 0x00, 0xE8, +0x27, 0x03, 0xD1, 0xAE, 0x6D, 0xD7, 0x97, 0x22, 0xFD, 0xD2, 0xFB, 0x48, 0x71, 0x53, 0xFB, 0x10, +0xDD, 0x45, 0x6C, 0x12, 0xA1, 0x39, 0x52, 0x0B, 0x57, 0xC5, 0xB4, 0xCC, 0x96, 0x13, 0xC5, 0x24, +0xAA, 0x3B, 0x6F, 0x4F, 0x6F, 0x9D, 0x1D, 0xE4, 0xB8, 0xC0, 0xB9, 0xC9, 0xB6, 0xE0, 0x9B, 0xE4, +0x09, 0xB1, 0x65, 0x51, 0x82, 0x44, 0x7E, 0xBD, 0xA2, 0x48, 0x9C, 0xC0, 0x76, 0xC4, 0x26, 0x90, +0x68, 0x85, 0x0C, 0xFB, 0x2B, 0x93, 0xAB, 0xB5, 0x15, 0x07, 0xD2, 0xC2, 0xBE, 0x7F, 0x3A, 0x06, +0x80, 0x0B, 0x2A, 0x40, 0x62, 0x84, 0xD7, 0x6B, 0xBA, 0x18, 0xAD, 0xED, 0x2C, 0xF0, 0x93, 0x07, +0x55, 0x5E, 0x1B, 0x5B, 0x07, 0x69, 0x4A, 0xA8, 0x64, 0x89, 0x4C, 0x4D, 0xD6, 0x66, 0x0D, 0x7F, +0x17, 0x65, 0xB6, 0x9C, 0xC4, 0x16, 0x26, 0x4B, 0xA5, 0x6C, 0x5E, 0xAE, 0xB9, 0x67, 0x5B, 0x15, +0xAC, 0x8F, 0xF5, 0xCF, 0xA0, 0x84, 0x2F, 0x4B, 0x97, 0x28, 0x71, 0x35, 0x63, 0xAE, 0x7F, 0xF6, +0xC8, 0x00, 0x27, 0xA1, 0x49, 0x89, 0x1F, 0x9B, 0x41, 0x6B, 0x6B, 0xB9, 0xBA, 0xBC, 0x31, 0xE6, +0x62, 0x58, 0x80, 0x2A, 0x3A, 0x89, 0x57, 0x1A, 0x8C, 0x4C, 0x71, 0x7E, 0x0F, 0x59, 0x34, 0xA8, +0xCF, 0x49, 0x05, 0xDC, 0xB8, 0x9D, 0xC5, 0x44, 0x21, 0xC2, 0xB1, 0x49, 0xD2, 0x60, 0x59, 0xEE, +0xB4, 0x31, 0x99, 0x4C, 0x1A, 0xBA, 0xCF, 0x96, 0xF0, 0x90, 0x44, 0x2A, 0xE7, 0x84, 0x3D, 0xB0, +0xC4, 0xFB, 0xE7, 0x4C, 0xE8, 0x2D, 0xF9, 0x7C, 0x2E, 0x9D, 0xB7, 0x7B, 0x3B, 0x0E, 0x09, 0x97, +0x75, 0x27, 0x3B, 0x42, 0x40, 0x02, 0x8F, 0x21, 0x04, 0x8B, 0xC4, 0xF3, 0xC0, 0x58, 0x06, 0x49, +0x18, 0xCE, 0xBE, 0x72, 0xD6, 0xF4, 0xC9, 0xB2, 0x52, 0xD4, 0xF2, 0xD3, 0x4A, 0x41, 0x69, 0xE6, +0x2C, 0xFD, 0xBA, 0x38, 0x93, 0x00, 0x71, 0xF2, 0xD9, 0x0D, 0x24, 0xB5, 0x9E, 0x64, 0x20, 0x50, +0x05, 0xEF, 0x6C, 0x15, 0xC9, 0x29, 0x4C, 0x50, 0x63, 0xE0, 0x11, 0xE4, 0xA4, 0x1C, 0x16, 0x85, +0x7E, 0xFB, 0xBD, 0x74, 0xB2, 0x6F, 0x10, 0xAB, 0xBE, 0xE6, 0x29, 0xF6, 0x82, 0xFA, 0x5C, 0x78, +0xDA, 0xC0, 0x77, 0xD0, 0x1D, 0x99, 0x59, 0xC5, 0xB8, 0x40, 0xDB, 0x8C, 0x13, 0x11, 0xD4, 0x8D, +0x9E, 0x3E, 0x5C, 0x9F, 0x9F, 0xB0, 0x11, 0x54, 0x32, 0xC0, 0x62, 0x5D, 0xBF, 0xBA, 0x8D, 0x9C, +0xAE, 0x03, 0xFF, 0x5A, 0xE6, 0x35, 0x85, 0x12, 0xCF, 0x25, 0xF7, 0x51, 0x8B, 0xD0, 0x3D, 0xFE, +0x6E, 0x9E, 0xE8, 0x27, 0x46, 0xC1, 0x10, 0x5F, 0x54, 0xD8, 0x85, 0x0E, 0x51, 0xEA, 0xA5, 0xF2, +0x34, 0x07, 0x63, 0xE5, 0x51, 0x69, 0x43, 0x5C, 0x1C, 0x41, 0x65, 0xA7, 0x4E, 0x1D, 0x37, 0xBD, +0x87, 0x01, 0x8F, 0x0A, 0x55, 0x76, 0x2C, 0xE5, 0xD3, 0x31, 0xF2, 0x42, 0x2C, 0x44, 0xD7, 0x99, +0x37, 0x3A, 0x9C, 0xDC, 0x29, 0x55, 0x1E, 0x60, 0xB9, 0xC9, 0x9E, 0x87, 0xD2, 0x90, 0x74, 0x34, +0xCC, 0x43, 0x3A, 0x48, 0x70, 0x6F, 0x71, 0xAD, 0x83, 0xE3, 0x49, 0x73, 0x48, 0x65, 0x90, 0xF4, +0x13, 0x41, 0x78, 0x7A, 0xF8, 0xAB, 0xEF, 0x76, 0xF4, 0x12, 0xE9, 0x05, 0x3D, 0xF0, 0xED, 0x90, +0xC5, 0xEE, 0xF1, 0xC5, 0xC5, 0x69, 0x4F, 0x39, 0x14, 0x67, 0x21, 0x98, 0xA4, 0x3B, 0x02, 0x5A, +0x2E, 0x20, 0x72, 0xC1, 0x8D, 0xDC, 0x73, 0x78, 0xED, 0x9B, 0xBD, 0x96, 0xF8, 0x23, 0x51, 0xF7, +0x42, 0x62, 0xC8, 0xF1, 0xC1, 0x6E, 0x65, 0xD7, 0xB9, 0x50, 0xE4, 0x8A, 0xEC, 0x88, 0x18, 0x47, +0x4B, 0x9C, 0xEB, 0xEE, 0xE8, 0x51, 0x81, 0x00, 0x88, 0x08, 0xE0, 0xF2, 0x0B, 0x76, 0x61, 0xC5, +0x15, 0x02, 0x58, 0x6E, 0x97, 0x97, 0x28, 0x06, 0xBB, 0x80, 0x1D, 0x01, 0x7A, 0xB4, 0xC0, 0x8F, +0xE6, 0x1E, 0x75, 0x85, 0x87, 0x04, 0xB4, 0xB0, 0x5B, 0x7A, 0x6B, 0x1F, 0x51, 0xBF, 0x5B, 0xDA, +0x55, 0x8F, 0xE6, 0xBB, 0x68, 0x3A, 0xD2, 0x46, 0xA7, 0xD3, 0x98, 0x72, 0xAA, 0x1C, 0x06, 0x87, +0xB0, 0x7F, 0x37, 0xF7, 0x9B, 0x7B, 0x2F, 0x01, 0xE3, 0x7E, 0x11, 0x63, 0x7C, 0x54, 0xB6, 0xF0, +0xDB, 0x80, 0x0A, 0xB0, 0x38, 0x08, 0x29, 0x38, 0x0C, 0xD9, 0x44, 0xA0, 0x19, 0x4B, 0x90, 0x64, +0x28, 0x8D, 0x33, 0x32, 0x20, 0xE8, 0xFD, 0x8F, 0xB7, 0xB7, 0xA8, 0xCF, 0xD9, 0x1D, 0x70, 0x4D, +0xA3, 0x01, 0xD3, 0xA7, 0x24, 0x38, 0x9A, 0x21, 0xD5, 0xE2, 0x53, 0x5E, 0x04, 0x54, 0x45, 0xBA, +0x9A, 0x66, 0x81, 0xA4, 0x5B, 0xA4, 0xD9, 0x51, 0xB2, 0x42, 0x60, 0xDE, 0x01, 0xF3, 0xBB, 0x26, +0xC4, 0x22, 0xAC, 0x7D, 0xB1, 0xBB, 0x1C, 0x68, 0x11, 0xEC, 0x13, 0xFA, 0x6B, 0xD7, 0x49, 0x8D, +0x39, 0xBF, 0x13, 0xBC, 0x2E, 0x0A, 0x59, 0xE3, 0xD6, 0xAD, 0xB0, 0xA3, 0xF3, 0xAB, 0x76, 0xC7, +0x35, 0x8F, 0x16, 0x18, 0xD3, 0x43, 0xCA, 0xF5, 0xC5, 0x95, 0x94, 0xD5, 0xE1, 0x02, 0x8A, 0xC0, +0xEB, 0xCC, 0x93, 0xA4, 0x32, 0x84, 0xC7, 0x53, 0xD5, 0xC8, 0xD1, 0x22, 0x38, 0xBF, 0x52, 0x8B, +0xE5, 0x2A, 0x45, 0x62, 0x03, 0x25, 0x22, 0x9E, 0x97, 0x8A, 0x83, 0xB4, 0x93, 0x77, 0x1D, 0xE7, +0xA8, 0xD3, 0xE7, 0xD5, 0x8C, 0xBD, 0xD1, 0x41, 0x13, 0x8C, 0xC0, 0x27, 0x0F, 0xE7, 0x50, 0x1F, +0x57, 0xA4, 0x3C, 0x9A, 0xE7, 0x12, 0x97, 0xD8, 0xE0, 0xD7, 0xC7, 0x17, 0xEA, 0x5C, 0x6B, 0x53, +0x3E, 0x6F, 0x88, 0xBA, 0x23, 0x84, 0xCE, 0x7B, 0x1B, 0xC8, 0xD1, 0x9F, 0xCB, 0xD1, 0xB7, 0x70, +0x28, 0x32, 0xCC, 0x0B, 0xFE, 0x7C, 0x32, 0xA6, 0x1E, 0x59, 0x97, 0xB5, 0xBA, 0xC9, 0x20, 0x70, +0xB8, 0x85, 0x52, 0x69, 0x5E, 0xA9, 0x7E, 0x1B, 0x82, 0x3C, 0xFD, 0xE1, 0xCC, 0x9A, 0xCC, 0x3F, +0xE5, 0x37, 0xFD, 0x52, 0x62, 0x59, 0x55, 0x00, 0x45, 0xDD, 0x8B, 0x98, 0x78, 0x50, 0x72, 0x78, +0x4B, 0x3C, 0xDC, 0xBF, 0x04, 0x89, 0xFB, 0x21, 0x31, 0xED, 0x83, 0x6E, 0x4D, 0xB5, 0x0F, 0x6A, +0x16, 0x28, 0x0D, 0x79, 0x7B, 0x5D, 0x31, 0x63, 0x66, 0x7B, 0x8A, 0x14, 0x1D, 0x46, 0xDD, 0x9A, +0x64, 0x71, 0x2D, 0xC3, 0x78, 0x50, 0x8D, 0x70, 0xFE, 0x6A, 0x1A, 0x54, 0xDE, 0xAA, 0xFC, 0x12, +0x87, 0xF3, 0xC6, 0xC0, 0x51, 0x3A, 0x30, 0x8F, 0x4A, 0x96, 0xF0, 0x51, 0xFC, 0x40, 0x32, 0xA9, +0xD7, 0xE3, 0x5C, 0x67, 0x67, 0x4F, 0x3A, 0xC4, 0x99, 0x63, 0xAA, 0xCE, 0xF1, 0xAA, 0x15, 0xA8, +0x0F, 0xC4, 0x18, 0x41, 0x88, 0x2D, 0x86, 0xDC, 0xFF, 0x6E, 0x3E, 0xF6, 0x16, 0xBB, 0xF1, 0xB6, +0xC0, 0x50, 0x7A, 0x3F, 0xBF, 0x07, 0xE4, 0xDB, 0xE8, 0xCE, 0x91, 0x65, 0x31, 0xED, 0xD2, 0x5E, +0x50, 0x89, 0xD7, 0xF4, 0xE2, 0x97, 0x11, 0x9B, 0xDE, 0xF5, 0x3A, 0x6C, 0x69, 0x14, 0x79, 0x53, +0xD5, 0x15, 0x6F, 0x9F, 0x4D, 0x8D, 0xB9, 0x96, 0x0F, 0x03, 0x53, 0xD3, 0xB5, 0x4C, 0xB0, 0xC8, +0x04, 0xF0, 0x45, 0xF0, 0x2C, 0x66, 0xE0, 0x6B, 0x33, 0x94, 0x97, 0x55, 0x5A, 0xCB, 0x1E, 0xAD, +0x2F, 0x91, 0x4A, 0x9F, 0x5C, 0x86, 0x5A, 0xDE, 0x5B, 0xAD, 0x30, 0x5F, 0x4E, 0xE7, 0xA7, 0xEA, +0x44, 0x13, 0xCD, 0x0F, 0x3E, 0x9F, 0x8A, 0xBE, 0x0B, 0xC7, 0xB1, 0xA9, 0xB2, 0x0B, 0xA3, 0xCF, +0x5A, 0xCC, 0xB4, 0x78, 0xA6, 0x0F, 0x8A, 0xD1, 0xE2, 0x44, 0xF9, 0xA9, 0xE8, 0xB1, 0x74, 0xD2, +0x9D, 0x6A, 0xB2, 0x34, 0xFE, 0xAC, 0xCB, 0x79, 0x14, 0x7E, 0x7B, 0x8C, 0xDE, 0x9B, 0x34, 0xE9, +0x49, 0xA8, 0x70, 0x71, 0x14, 0x9E, 0xEA, 0x6E, 0x31, 0xF0, 0xAC, 0xB4, 0x4C, 0x69, 0x3D, 0x75, +0x14, 0xAB, 0x5A, 0x1B, 0x4F, 0x46, 0x6B, 0x59, 0xC7, 0x27, 0x53, 0x5A, 0xF6, 0xFD, 0x59, 0x67, +0x25, 0x9D, 0xA1, 0x13, 0x9D, 0x2F, 0x88, 0xA7, 0xA6, 0xBB, 0xB4, 0x99, 0x56, 0xD0, 0x60, 0x3A, +0xFA, 0xAC, 0xC7, 0x4C, 0x8F, 0xBA, 0xCA, 0xBB, 0x60, 0x4F, 0xCA, 0xFD, 0x16, 0x2D, 0xCA, 0x54, +0x7B, 0x8B, 0x81, 0x7F, 0x90, 0xE2, 0x3A, 0xEE, 0x6D, 0xEF, 0x0B, 0x15, 0x63, 0xCA, 0x1C, 0xB4, +0xA4, 0x0A, 0xF7, 0xB4, 0x1C, 0xA4, 0xAF, 0xB4, 0xE8, 0x5D, 0x46, 0x5F, 0xAF, 0x55, 0x37, 0x60, +0xD6, 0x32, 0x10, 0x28, 0xDA, 0x14, 0x22, 0x5D, 0xBB, 0xE8, 0x2B, 0x80, 0xEB, 0x14, 0x72, 0xEA, +0x73, 0x1A, 0xE9, 0x5A, 0x0E, 0xC4, 0xC5, 0x26, 0xE9, 0x9B, 0xAA, 0x42, 0x93, 0x29, 0xB2, 0x35, +0x6A, 0x32, 0xF5, 0x39, 0x1F, 0x98, 0x73, 0x21, 0x4E, 0xF4, 0x99, 0xCE, 0x98, 0xEC, 0x2C, 0x0E, +0x90, 0x5E, 0xA0, 0x98, 0xEB, 0x9B, 0xB1, 0x48, 0x9F, 0x63, 0x1B, 0xA0, 0x30, 0x44, 0x20, 0x39, +0xC6, 0x89, 0xBF, 0x1E, 0x81, 0xC7, 0x7A, 0x90, 0xC6, 0x51, 0xED, 0x45, 0x97, 0x69, 0xDF, 0x12, +0x5D, 0x13, 0x7F, 0x7D, 0x2F, 0xD2, 0x48, 0x1F, 0xEF, 0x49, 0x1A, 0x4D, 0xB5, 0x37, 0xE5, 0x5B, +0xE5, 0xA9, 0x3F, 0xE5, 0x87, 0x1E, 0x42, 0xE4, 0x51, 0x5E, 0xA5, 0x31, 0xAC, 0xE5, 0x59, 0x06, +0xF2, 0xFE, 0xB0, 0xA8, 0xE1, 0xFE, 0x4F, 0x8A, 0xD5, 0xCD, 0xFD, 0xA7, 0xAA, 0x5A, 0x73, 0x3D, +0xA1, 0xA0, 0x5C, 0x33, 0xF8, 0xAC, 0xDE, 0xB5, 0xD4, 0xAB, 0x6E, 0x54, 0x3C, 0x55, 0xED, 0xEA, +0x1B, 0x21, 0x05, 0xE5, 0xEA, 0xB1, 0x67, 0xDD, 0xAE, 0xA5, 0x5B, 0x75, 0x7F, 0x05, 0xE9, 0xDB, +0x24, 0x4F, 0x55, 0xC3, 0x8B, 0xAB, 0x38, 0x05, 0x35, 0x2F, 0x26, 0x9E, 0x75, 0xBD, 0x96, 0xAE, +0xD5, 0xC5, 0xA1, 0xA7, 0xAD, 0xEB, 0xC5, 0x1D, 0xA8, 0x82, 0xAE, 0x17, 0x13, 0xFF, 0x74, 0x5D, +0x43, 0xE2, 0xA8, 0xAF, 0x4A, 0xFF, 0xAC, 0x6E, 0x57, 0xDD, 0x48, 0x4E, 0xA2, 0xA1, 0x0C, 0xD6, +0xCC, 0x27, 0x5F, 0x0C, 0xE5, 0xEB, 0x6E, 0xE3, 0xA0, 0x85, 0xFC, 0xE3, 0x91, 0xD9, 0x74, 0x77, +0xCC, 0x18, 0x6A, 0x1C, 0x9A, 0xC1, 0x0B, 0x75, 0xE3, 0x44, 0xCF, 0xA8, 0xD4, 0x2F, 0x9D, 0xFB, +0xD6, 0xCC, 0xFD, 0x42, 0x54, 0x2F, 0x72, 0xFE, 0xC6, 0x2B, 0x33, 0x7A, 0xA9, 0x7F, 0x1F, 0x43, +0x43, 0x87, 0xF2, 0x35, 0x0C, 0x5E, 0x3F, 0x91, 0xB4, 0x51, 0x17, 0xD1, 0x5A, 0x4C, 0x4F, 0xCD, +0x5A, 0x17, 0xD7, 0xE7, 0xF2, 0x05, 0xB4, 0x1E, 0xF8, 0x07, 0x5B, 0xE7, 0x23, 0x4A, 0x36, 0x98, +0xB2, 0x19, 0x4C, 0xC7, 0xD5, 0xBD, 0xB9, 0xCA, 0xBE, 0xA3, 0x6E, 0x9A, 0x55, 0xDD, 0xA6, 0x3A, +0xCA, 0xDF, 0x9E, 0x82, 0xBA, 0x6F, 0xBD, 0x3E, 0x64, 0x4D, 0x5B, 0x73, 0xCD, 0x8A, 0xB9, 0x66, +0xB4, 0x65, 0x19, 0x1F, 0x51, 0xA8, 0x33, 0x5B, 0xF0, 0x13, 0x4F, 0x75, 0x0B, 0xB1, 0x96, 0x36, +0x1D, 0xF5, 0xF3, 0x11, 0x32, 0x8D, 0xC7, 0x7B, 0x1A, 0xA0, 0xE9, 0x2F, 0x4A, 0x67, 0xED, 0xCA, +0x1B, 0x3C, 0x56, 0x01, 0x57, 0xDD, 0xDB, 0x4A, 0xB8, 0xF5, 0x20, 0xBA, 0xE3, 0xAA, 0xA6, 0x7D, +0x71, 0xF0, 0xAB, 0x46, 0xA3, 0x93, 0xFE, 0xFA, 0xB0, 0xC1, 0x6B, 0xBE, 0xE8, 0xDE, 0x53, 0x48, +0xBD, 0xBB, 0xAE, 0x93, 0x5E, 0x93, 0x0B, 0x99, 0x39, 0xDF, 0x6E, 0xEA, 0xFF, 0xCF, 0xA3, 0xE6, +0x9A, 0x9B, 0x62, 0xB5, 0xD7, 0xCE, 0xD1, 0x07, 0xFD, 0x84, 0xF2, 0xB7, 0x2E, 0x0C, 0x92, 0xA3, +0x46, 0x23, 0x7F, 0xD5, 0x22, 0xA7, 0xEF, 0xEC, 0x19, 0x20, 0xCD, 0x6D, 0x15, 0x7D, 0x85, 0xC5, +0xFC, 0xA7, 0x22, 0xFF, 0x03, 0xC6, 0xA5, 0xC6, 0x6A, 0x6E, 0x44, 0x00, 0x00 }; \ No newline at end of file diff --git a/src/www/setuppage.html b/src/www/setuppage.html index 0eadf85..d64ce1b 100644 --- a/src/www/setuppage.html +++ b/src/www/setuppage.html @@ -134,18 +134,23 @@ }