From 3b380bac12a466a1d6557822dff9c715b6ee09f3 Mon Sep 17 00:00:00 2001 From: Luc Date: Sun, 24 Mar 2019 09:44:05 +0100 Subject: [PATCH] Add screen basic notification Dsiplay SSID / SIGNAL / IP and status like in 2.X --- esp3d/configuration.h | 13 +- esp3d/src/core/esp3d.cpp | 11 +- esp3d/src/core/esp3doutput.cpp | 16 +- esp3d/src/core/esp3doutput.h | 2 +- esp3d/src/core/espcmd/ESP400.cpp | 6 +- esp3d/src/include/version.h | 2 +- esp3d/src/modules/bluetooth/BT_service.cpp | 15 +- esp3d/src/modules/bluetooth/BT_service.h | 2 +- esp3d/src/modules/display/OLED_SSD1306.h | 67 ++ esp3d/src/modules/display/OLED_SSDSH1106.h | 67 ++ .../src/modules/display/TFT_ILI9341_240X320.h | 66 ++ esp3d/src/modules/display/display.cpp | 485 ++++++++++++-- esp3d/src/modules/display/display.h | 17 +- esp3d/src/modules/display/esp3d_logob.h | 606 +++++++++--------- esp3d/src/modules/network/netconfig.cpp | 61 +- esp3d/src/modules/network/netconfig.h | 2 + 16 files changed, 1052 insertions(+), 386 deletions(-) create mode 100644 esp3d/src/modules/display/OLED_SSD1306.h create mode 100644 esp3d/src/modules/display/OLED_SSDSH1106.h create mode 100644 esp3d/src/modules/display/TFT_ILI9341_240X320.h diff --git a/esp3d/configuration.h b/esp3d/configuration.h index b577bf29..115aa612 100644 --- a/esp3d/configuration.h +++ b/esp3d/configuration.h @@ -49,14 +49,15 @@ //OLED_I2C_SSD1306 1 //OLED_I2C_SSDSH1106 2 //TFT_SPI_ILI9341_320X240 3 -//#define DISPLAY_DEVICE TFT_SPI_ILI9341_320X240 +#define DISPLAY_DEVICE OLED_I2C_SSD1306 #if defined (DISPLAY_DEVICE) +//for ILI9143 edit User_Setup.h of TFT_eSPI library #define DISPLAY_I2C_PIN_SDA 4 -#define DISPLAY_I2C_PIN_SCL 15 -#define DISPLAY_I2C_PIN_RST 16 //comment if not applicable +#define DISPLAY_I2C_PIN_SCL 5 +//#define DISPLAY_I2C_PIN_RST 16 //comment if not applicable #define DISPLAY_I2C_ADDR 0x3c -//#define DISPLAY_FLIP_VERTICALY 1 //comment to disable +#define DISPLAY_FLIP_VERTICALY 1 //comment to disable #endif //DISPLAY_DEVICE //DHT_DEVICE: send update of temperature / humidity based on DHT 11/22 //#define DHT_DEVICE @@ -68,9 +69,9 @@ #endif //DHT_DEVICE //PIN_RESET_FEATURE : allow to reset settings by setting low a pin -#define PIN_RESET_FEATURE +//#define PIN_RESET_FEATURE #if defined (PIN_RESET_FEATURE) -#define ESP3D_RESET_PIN 4 +#define ESP3D_RESET_PIN 2 #endif //PIN_RESET_FEATURE //SDCARD_FEATURE: to access SD Card files directly instead of access by serial using printer Board FW //#define SDCARD_FEATURE diff --git a/esp3d/src/core/esp3d.cpp b/esp3d/src/core/esp3d.cpp index c42946e0..f0fcdfd2 100644 --- a/esp3d/src/core/esp3d.cpp +++ b/esp3d/src/core/esp3d.cpp @@ -44,6 +44,7 @@ #include "esp3doutput.h" #include "../modules/boot_delay/boot_delay.h" + bool Esp3D::restart = false; //Contructor @@ -64,6 +65,8 @@ bool Esp3D::begin() BootDelay bd; Hal::begin(); DEBUG_ESP3D_INIT + //init output + ESP3DOutput::isOutput(ESP_ALL_CLIENTS, true); bool res = true; #if defined(CONNECTED_DEVICES_FEATURE) if (!DevicesServices::begin()) { @@ -72,7 +75,11 @@ bool Esp3D::begin() } #endif //CONNECTED_DEVICES_FEATURE //delayto avoid to disturb printer - bd.begin(/*&outserialfn*/); +#ifdef DISPLAY_DEVICE + bd.begin(&display_progress); +#else + bd.begin(); +#endif //DISPLAY_DEVICE log_esp3d("Mode %d", WiFi.getMode()); if (!Settings_ESP3D::begin()) { @@ -81,8 +88,6 @@ bool Esp3D::begin() //Restart ESP3D restart_esp(); } - //init output - ESP3DOutput::isOutput(ESP_ALL_CLIENTS, true); //BT do not start automaticaly so should be OK //Serial service if (!serial_service.begin()) { diff --git a/esp3d/src/core/esp3doutput.cpp b/esp3d/src/core/esp3doutput.cpp index d9525e5b..adcbfcf4 100644 --- a/esp3d/src/core/esp3doutput.cpp +++ b/esp3d/src/core/esp3doutput.cpp @@ -40,8 +40,9 @@ uint8_t ESP3DOutput::_outputflags = ESP_ALL_CLIENTS; #include #endif //ARDUINO_ARCH_ESP8266 #endif //HTTP_FEATURE - - +#if defined (DISPLAY_DEVICE) +#include "../modules/display/display.h" +#endif //DISPLAY_DEVICE //constructor ESP3DOutput::ESP3DOutput(uint8_t client) @@ -204,6 +205,9 @@ size_t ESP3DOutput::printMSG(const char * s) display+= s; return printLN(display.c_str()); } + if (_client == ESP_SCREEN_CLIENT){ + return print(s); + } switch(Settings_ESP3D::GetFirmwareTarget()) { case GRBL: display = "[MSG:"; @@ -230,6 +234,9 @@ size_t ESP3DOutput::printERROR(const char * s, int code_error) if (!isOutput(_client)) { return 0; } + if (_client == ESP_SCREEN_CLIENT){ + return print(s); + } #ifdef HTTP_FEATURE _code = code_error; if (_client == ESP_HTTP_CLIENT) { @@ -350,6 +357,11 @@ size_t ESP3DOutput::write(const uint8_t *buffer, size_t size) } break; #endif //HTTP_FEATURE +#if defined (DISPLAY_DEVICE) + case ESP_SCREEN_CLIENT: + esp3d_display.SetStatus((const char *)buffer); + return size; +#endif //DISPLAY_DEVICE #if defined (BLUETOOTH_FEATURE) case ESP_BT_CLIENT: if(bt_service.started()) { diff --git a/esp3d/src/core/esp3doutput.h b/esp3d/src/core/esp3doutput.h index 6d216fee..fcce2d0e 100644 --- a/esp3d/src/core/esp3doutput.h +++ b/esp3d/src/core/esp3doutput.h @@ -25,7 +25,7 @@ #define ESP_WEBSOCKET_TERMINAL_CLIENT 8 #define ESP_PRINTER_LCD_CLIENT 16 #define ESP_BT_CLIENT 32 -#define ESP_OLED_CLIENT 64 +#define ESP_SCREEN_CLIENT 64 #define ESP_WEBSOCKET_CLIENT 128 #define ESP_ALL_CLIENTS 255 diff --git a/esp3d/src/core/espcmd/ESP400.cpp b/esp3d/src/core/espcmd/ESP400.cpp index d972653d..a15e7857 100644 --- a/esp3d/src/core/espcmd/ESP400.cpp +++ b/esp3d/src/core/espcmd/ESP400.cpp @@ -444,9 +444,9 @@ bool Commands::ESP400(const char* cmd_params, level_authenticate_type auth_type, output->print ("\",\"T\":\"F\",\"V\":\""); output->print (Settings_ESP3D::read_byte(ESP_TARGET_FW)); output->printf ("\",\"H\":\"Output msg\",\"O\":[{\"M117\":\"%d\"}", ESP_PRINTER_LCD_CLIENT); -#ifdef ESP_OLED_FEATURE - output->printf (",{\"Oled\":\"%d\"}", ESP_OLED_CLIENT); -#endif //ESP_OLED_FEATURE +#ifdef DISPLAY_DEVICE + output->printf (",{\"Screen\":\"%d\"}", ESP_SCREEN_CLIENT); +#endif //DISPLAY_DEVICE output->printf (",{\"Serial\":\"%d\"}", ESP_SERIAL_CLIENT); #ifdef WS_DATA_FEATURE output->printf (",{\"Web Socket\":\"%d\"}", ESP_WEBSOCKET_CLIENT); diff --git a/esp3d/src/include/version.h b/esp3d/src/include/version.h index ad6fa710..deb10c99 100644 --- a/esp3d/src/include/version.h +++ b/esp3d/src/include/version.h @@ -22,7 +22,7 @@ #define _VERSION_ESP3D_H //version and sources location -#define FW_VERSION "3.0.0.a5" +#define FW_VERSION "3.0.0.a6" #define REPOSITORY "https://github.com/luc-github/ESP3D" #endif //_VERSION_ESP3D_H diff --git a/esp3d/src/modules/bluetooth/BT_service.cpp b/esp3d/src/modules/bluetooth/BT_service.cpp index f4ce5fc4..2a709fbe 100644 --- a/esp3d/src/modules/bluetooth/BT_service.cpp +++ b/esp3d/src/modules/bluetooth/BT_service.cpp @@ -69,7 +69,8 @@ static void my_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) { ESP3DOutput output(ESP_ALL_CLIENTS); switch (event) { - case ESP_SPP_SRV_OPEN_EVT: { //Server connection open + case ESP_SPP_SRV_OPEN_EVT: + { //Server connection open char str[18]; str[17]='\0'; uint8_t * addr = param->srv_open.rem_bda; @@ -78,12 +79,22 @@ static void my_spp_cb(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) String stmp = "BT Connected with "; stmp += str; output.printMSG(stmp.c_str()); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG(stmp.c_str()); +#endif //DISPLAY_DEVICE } break; - case ESP_SPP_CLOSE_EVT://Client connection closed + case ESP_SPP_CLOSE_EVT: + {//Client connection closed output.printMSG("BT Disconnected"); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG("BT Disconnected"); +#endif //DISPLAY_DEVICE BTService::setClientAddress(""); + } break; default: break; diff --git a/esp3d/src/modules/bluetooth/BT_service.h b/esp3d/src/modules/bluetooth/BT_service.h index 4a8da408..6c865cec 100644 --- a/esp3d/src/modules/bluetooth/BT_service.h +++ b/esp3d/src/modules/bluetooth/BT_service.h @@ -77,6 +77,6 @@ private : void flushbuffer(); }; -extern BTService bt_service; +extern BTService bt_service; #endif //_BT_SERVICE_H diff --git a/esp3d/src/modules/display/OLED_SSD1306.h b/esp3d/src/modules/display/OLED_SSD1306.h new file mode 100644 index 00000000..83973024 --- /dev/null +++ b/esp3d/src/modules/display/OLED_SSD1306.h @@ -0,0 +1,67 @@ +/* + OLED_SSD1306.h - ESP3D display data file + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +//Screen size +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +//Colors +#define TFT_BLACK BLACK +#define TFT_WHITE WHITE +#define SPLASH_FG TFT_BLACK +#define SPLASH_BG TFT_WHITE +#define SCREEN_BG TFT_BLACK +#define PROGRESS_FG TFT_WHITE +#define SIGNAL_FG TFT_WHITE +#define SSID_FG TFT_WHITE +#define IP_FG TFT_WHITE +#define STATUS_FG TFT_WHITE + +//Fonts +#define FONTSIGNAL 2 +#define FONTSSID 2 +#define FONTIP 3 +#define FONTSTATUS 2 + +//Positions +#define SIGNAL_X 128-27 +#define SIGNAL_Y 0 +#define SIGNAL_W 46 +#define SIGNAL_H 10 + +#define SIGNAL_ICON_X 128-43 +#define SIGNAL_ICON_Y 2 +#define SIGNAL_ICON_W 15 +#define SIGNAL_ICON_H 10 +#define SIGNAL_ICON_W_BAR 3 +#define SIGNAL_ICON_SPACER_X 1 + +#define SSID_AREA_X 0 +#define SSID_AREA_Y 0 +#define SSID_AREA_W 85 +#define SSID_AREA_H 12 + +#define IP_AREA_X 0 +#define IP_AREA_Y 16 +#define IP_AREA_W 128 +#define IP_AREA_H 16 + +#define STATUS_AREA_X 0 +#define STATUS_AREA_Y 48 +#define STATUS_AREA_W 128 +#define STATUS_AREA_H 16 diff --git a/esp3d/src/modules/display/OLED_SSDSH1106.h b/esp3d/src/modules/display/OLED_SSDSH1106.h new file mode 100644 index 00000000..0db48bfb --- /dev/null +++ b/esp3d/src/modules/display/OLED_SSDSH1106.h @@ -0,0 +1,67 @@ +/* + OLED_SSDSH1106.h - ESP3D display data file + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +//Screen size +#define SCREEN_WIDTH 132 +#define SCREEN_HEIGHT 64 +//Colors +#define TFT_BLACK BLACK +#define TFT_WHITE WHITE +#define SPLASH_FG TFT_BLACK +#define SPLASH_BG TFT_WHITE +#define SCREEN_BG TFT_BLACK +#define PROGRESS_FG TFT_WHITE +#define SIGNAL_FG TFT_WHITE +#define SSID_FG TFT_WHITE +#define IP_FG TFT_WHITE +#define STATUS_FG TFT_WHITE + +//Fonts +#define FONTSIGNAL 2 +#define FONTSSID 2 +#define FONTIP 3 +#define FONTSTATUS 2 + +//Positions +#define SIGNAL_X 132-27 +#define SIGNAL_Y 0 +#define SIGNAL_W 46 +#define SIGNAL_H 10 + +#define SIGNAL_ICON_X 132-43 +#define SIGNAL_ICON_Y 2 +#define SIGNAL_ICON_W 15 +#define SIGNAL_ICON_H 10 +#define SIGNAL_ICON_W_BAR 3 +#define SIGNAL_ICON_SPACER_X 1 + +#define SSID_AREA_X 0 +#define SSID_AREA_Y 0 +#define SSID_AREA_W 85 +#define SSID_AREA_H 12 + +#define IP_AREA_X 0 +#define IP_AREA_Y 16 +#define IP_AREA_W 132 +#define IP_AREA_H 16 + +#define STATUS_AREA_X 0 +#define STATUS_AREA_Y 48 +#define STATUS_AREA_W 132 +#define STATUS_AREA_H 16 diff --git a/esp3d/src/modules/display/TFT_ILI9341_240X320.h b/esp3d/src/modules/display/TFT_ILI9341_240X320.h new file mode 100644 index 00000000..7284c8f5 --- /dev/null +++ b/esp3d/src/modules/display/TFT_ILI9341_240X320.h @@ -0,0 +1,66 @@ +/* + OLED_SSD1306.h - ESP3D display data file + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +//Screen size +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 + +//Colors +#define SPLASH_FG TFT_BLACK +#define SPLASH_BG TFT_WHITE +#define SCREEN_BG TFT_BLACK +#define PROGRESS_FG TFT_WHITE +#define SIGNAL_FG TFT_WHITE +#define SSID_FG TFT_WHITE +#define IP_FG TFT_WHITE +#define STATUS_FG TFT_WHITE + +//Fonts +#define FONTSIGNAL 2 +#define FONTSSID 2 +#define FONTIP 3 +#define FONTSTATUS 2 + +//Positions +#define SIGNAL_X 320-34 +#define SIGNAL_Y 0 +#define SIGNAL_W 34 +#define SIGNAL_H 16 + +#define SIGNAL_ICON_X 320-50 +#define SIGNAL_ICON_Y 2 +#define SIGNAL_ICON_W 15 +#define SIGNAL_ICON_H 10 +#define SIGNAL_ICON_W_BAR 3 +#define SIGNAL_ICON_SPACER_X 1 + +#define SSID_AREA_X 0 +#define SSID_AREA_Y 0 +#define SSID_AREA_W 269 +#define SSID_AREA_H 16 + +#define IP_AREA_X 0 +#define IP_AREA_Y 16 +#define IP_AREA_W 320 +#define IP_AREA_H 16 + +#define STATUS_AREA_X 0 +#define STATUS_AREA_Y 48 +#define STATUS_AREA_W 320 +#define STATUS_AREA_H 16 diff --git a/esp3d/src/modules/display/display.cpp b/esp3d/src/modules/display/display.cpp index 691048f5..71399e8e 100644 --- a/esp3d/src/modules/display/display.cpp +++ b/esp3d/src/modules/display/display.cpp @@ -29,43 +29,295 @@ #include "esp3d_logo.h" #if DISPLAY_DEVICE == OLED_I2C_SSD1306 #include -SSD1306 esp_display(DISPLAY_I2C_ADDR, DISPLAY_I2C_PIN_SDA, DISPLAY_I2C_PIN_SCL); +SSD1306 esp3d_screen(DISPLAY_I2C_ADDR, DISPLAY_I2C_PIN_SDA, DISPLAY_I2C_PIN_SCL); +#include "OLED_SSD1306.h" #endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 #if DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #include -SH1106 esp_display(DISPLAY_I2C_ADDR, (DISPLAY_I2C_PIN_SDA==-1)?SDA:DISPLAY_I2C_PIN_SDA, (DISPLAY_I2C_PIN_SCL==-1)?SCL:DISPLAY_I2C_PIN_SCL); +SH1106 esp3d_screen(DISPLAY_I2C_ADDR, (DISPLAY_I2C_PIN_SDA==-1)?SDA:DISPLAY_I2C_PIN_SDA, (DISPLAY_I2C_PIN_SCL==-1)?SCL:DISPLAY_I2C_PIN_SCL); +#include "OLED_SSDSH1106.h" #endif //DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 #include -TFT_eSPI esp_display = TFT_eSPI(); +TFT_eSPI esp3d_screen = TFT_eSPI(); #include "esp3d_logob.h" +#include "TFT_ILI9341_240X320.h" #endif //TFT_SPI_ILI9341_240X320 - - - +#if defined (WIFI_FEATURE) +#include "../wifi/wificonfig.h" +#endif // WIFI_FEATURE +#if defined (ETH_FEATURE) +#include "../ethernet/ethconfig.h" +#endif //ETH_FEATURE +#if defined (BLUETOOTH_FEATURE) +#include "../bluetooth/BT_service.h" +#endif //BLUETOOTH_FEATURE +#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE) +#include "../network/netconfig.h" +#endif //WIFI_FEATURE || ETH_FEATURE) ||BLUETOOTH_FEATURE #define DISPLAY_REFRESH_TIME 1000 Display esp3d_display; bool Display::splash() { + log_esp3d("Splash"); + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return false; + } if (!_splash_displayed) { -#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 - esp_display.drawXbm((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo_width, ESP3D_Logo_height, ESP3D_Logo); -#endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 -#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 - esp_display.drawXBitmap((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo, ESP3D_Logo_width, ESP3D_Logo_height, TFT_WHITE); -#endif //TFT_SPI_ILI9341_240X320 - log_esp3d("Splash"); + drawXbm((_screenwidth-ESP3D_Logo_width)/2, (_screenheight-ESP3D_Logo_height)/2, ESP3D_Logo_width, ESP3D_Logo_height, SPLASH_FG, SPLASH_BG ,ESP3D_Logo); + log_esp3d("Display Splash"); _splash_displayed = true; return true; } return false; } + +void Display::showStatus() +{ + //Display Status + String status = _status; + setTextFont(FONTSTATUS); + uint16_t size = sizetoFitSpace(status.c_str(), STATUS_AREA_W); + //check the need for resize + if (size < status.length()){ + static int status_shift = -1; + status+=" "; + log_esp3d("current %s", status.c_str()); + if (status_shift > status.length()){ + status_shift = -1; + } + log_esp3d("shift %d", status_shift); + if (status_shift > 0){ + status.remove(0,status_shift); + } + log_esp3d("shifted %s", status.c_str()); + size = sizetoFitSpace(status.c_str(), STATUS_AREA_W); + log_esp3d("size available %d existing %d",size, status.length()); + if (size < status.length()){ + //cut + status = status.substring(0,size); + status_shift++; + } else{ + status_shift = -1; + } + log_esp3d("sized %s", status.c_str()); + } + //clear area + fillRect(STATUS_AREA_X, STATUS_AREA_Y, STATUS_AREA_W, STATUS_AREA_H, SCREEN_BG); + drawString(status.c_str(), STATUS_AREA_X, STATUS_AREA_Y, STATUS_FG); +} + +bool Display::main_screen() +{ + log_esp3d("Mainscreen"); + //Signal + int sig = -1; + +#if defined (WIFI_FEATURE) + if (WiFiConfig::started()){ + String ssid; + if (WiFi.getMode() == WIFI_AP) { + sig = 100; + ssid = WiFiConfig::AP_SSID(); + } else { + if (WiFi.isConnected()) { + sig = WiFiConfig::getSignal (WiFi.RSSI ()); + ssid = WiFi.SSID(); + } + } + + //Display SSID + setTextFont(FONTSSID); + uint16_t size = sizetoFitSpace(ssid.c_str(), SSID_AREA_W); + //check the need for resize + if (size < ssid.length()){ + static int ssid_shift = -1; + ssid+=" "; + log_esp3d("current %s", ssid.c_str()); + if (ssid_shift > ssid.length()){ + ssid_shift = -1; + } + log_esp3d("shift %d", ssid_shift); + if (ssid_shift > 0){ + ssid.remove(0,ssid_shift); + } + log_esp3d("shifted %s", ssid.c_str()); + size = sizetoFitSpace(ssid.c_str(), SSID_AREA_W); + log_esp3d("size available %d existing %d",size, ssid.length()); + if (size < ssid.length()){ + //cut + ssid = ssid.substring(0,size); + ssid_shift++; + } else{ + ssid_shift = -1; + } + log_esp3d("sized %s", ssid.c_str()); + } + //clear area + fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG); + drawString(ssid.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG); + } +#endif // WIFI_FEATURE +#if defined (ETH_FEATURE) + if (EthConfig::started()){ + sig = -2; + setTextFont(FONTSSID); + //clear area + fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG); + //display connection speed + if(ETH.linkUp()){ + ssid = ETH.linkSpeed(); + ssid+= "Mbps"; + drawString(ssid.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG); + } + } +#endif //ETH_FEATURE +#if defined (BLUETOOTH_FEATURE) + if (bt_service.started()){ + sig = -3; + //Display hostname + String hostname = bt_service.hostname(); + setTextFont(FONTSSID); + uint16_t size = sizetoFitSpace(hostname.c_str(), SSID_AREA_W); + //check the need for resize + if (size < hostname.length()){ + static int hostname_shift = -1; + hostname+=" "; + log_esp3d("current %s", hostname.c_str()); + if (hostname_shift > hostname.length()){ + hostname_shift = -1; + } + log_esp3d("shift %d", hostname_shift); + if (hostname_shift > 0){ + hostname.remove(0,hostname_shift); + } + log_esp3d("shifted %s", hostname.c_str()); + size = sizetoFitSpace(hostname.c_str(), SSID_AREA_W); + log_esp3d("size available %d existing %d",size, hostname.length()); + if (size < hostname.length()){ + //cut + hostname = hostname.substring(0,size); + hostname_shift++; + } else{ + hostname_shift = -1; + } + log_esp3d("sized %s", hostname.c_str()); + } + //clear area + fillRect(SSID_AREA_X, SSID_AREA_Y, SSID_AREA_W, SSID_AREA_H, SCREEN_BG); + if (hostname.length()>0){ + drawString(hostname.c_str(), SSID_AREA_X, SSID_AREA_Y, SSID_FG); + } + } +#endif //BLUETOOTH_FEATURE + //set current font size + setTextFont(FONTSIGNAL); + fillRect(SIGNAL_X, SIGNAL_Y, SIGNAL_W, SIGNAL_H,SCREEN_BG); + fillRect(SIGNAL_ICON_X, SIGNAL_ICON_Y, SIGNAL_ICON_W, SIGNAL_ICON_H,SCREEN_BG); + String s; + if (sig > 0) { + //Signal % + s = String(sig); + s+="%"; + //Signal Icon according % + if (sig > 0) { + fillRect(SIGNAL_ICON_X, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.6), SIGNAL_ICON_W_BAR, SIGNAL_ICON_H * 0.4, SIGNAL_FG); + } else { + drawRect(SIGNAL_ICON_X, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.6), SIGNAL_ICON_W_BAR, SIGNAL_ICON_H * 0.4, SIGNAL_FG); + } + + if (sig >= 25) { + fillRect(SIGNAL_ICON_X + SIGNAL_ICON_SPACER_X +SIGNAL_ICON_W_BAR, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.4), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.6), SIGNAL_FG); + } else { + drawRect(SIGNAL_ICON_X + SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR, SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.4), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.6), SIGNAL_FG); + } + + if (sig >= 50) { + fillRect(SIGNAL_ICON_X + (2*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.2), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.8), SIGNAL_FG); + } else { + drawRect(SIGNAL_ICON_X + (2*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y + (SIGNAL_ICON_H * 0.2), SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H * 0.8), SIGNAL_FG); + } + + if (sig >= 75) { + fillRect(SIGNAL_ICON_X + (3*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y, SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H), SIGNAL_FG); + } else { + drawRect(SIGNAL_ICON_X + (3*(SIGNAL_ICON_SPACER_X + SIGNAL_ICON_W_BAR)), SIGNAL_ICON_Y, SIGNAL_ICON_W_BAR, (SIGNAL_ICON_H), SIGNAL_FG); + } + + } + //No signal / no connection + if (sig == -1) { + s = " X"; + } + //Ethernet is connected + if (sig == -2) { + s = "Eth"; + } + //BT is active + if (sig == -3) { + s = "BT"; + } + //Show Connection type + drawString(s.c_str(), SIGNAL_X, SIGNAL_Y, SIGNAL_FG); + + //IP + setTextFont(FONTIP); + fillRect(IP_AREA_X, IP_AREA_Y, IP_AREA_W, IP_AREA_H, SCREEN_BG); +#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE) + if (NetConfig::started()){ + switch(NetConfig::getMode()){ +#if defined (WIFI_FEATURE) + case ESP_WIFI_STA: + s = WiFi.localIP().toString(); + break; + case ESP_WIFI_AP: + s = WiFi.softAPIP().toString(); + break; +#endif //WIFI_FEATURE +#if defined (ETH_FEATURE) + case ESP_ETH_STA: + s = ETH.localIP().toString(); + break; +#endif //ETH_FEATURE +#if defined (BLUETOOTH_FEATURE) + case ESP_BT: + s = bt_service.isConnected()?"Connected":""; + break; +#endif //BLUETOOTH_FEATURE + default: + s=""; + break; + } + if (s.length()>0){ + drawString(s.c_str(), IP_AREA_X, IP_AREA_Y, IP_FG); + } + } +#endif //WIFI_FEATURE || ETH_FEATURE || BLUETOOTH_FEATURE + //status + showStatus(); + return true; +} + +uint16_t Display::sizetoFitSpace(const char * string, uint16_t maxwidth) +{ + String s = string; + while (getStringWidth(s.c_str()) > maxwidth) { + if (s.length() > 0) { + s.remove(s.length()-1); + } else { + return 0; + } + } + return s.length(); +} + void Display::show_screenID(uint8_t screenID) { + clear_screen(); _screenID = screenID; } @@ -74,18 +326,8 @@ Display::Display() _started = false; _screenID = SPLASH_SCREEN; _splash_displayed=false; -#if DISPLAY_DEVICE == OLED_I2C_SSD1306 - _screenwidth = 128; - _screenheight = 64; -#endif //OLED_I2C_SSD1306 -#if DISPLAY_DEVICE == OLED_I2C_SSDSH1106 - _screenwidth = 132; - _screenheight = 64; -#endif //OLED_I2C_SSDSH1106 -#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 - _screenwidth = 320; - _screenheight = 240; -#endif //TFT_SPI_ILI9341_240X320 + _screenwidth = SCREEN_WIDTH; + _screenheight = SCREEN_HEIGHT; } Display::~Display() { @@ -96,6 +338,7 @@ bool Display::begin() { bool res = true; _started = false; + log_esp3d("Init Display"); #if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #if defined(DISPLAY_I2C_PIN_RST) pinMode(DISPLAY_I2C_PIN_RST,OUTPUT); @@ -103,17 +346,20 @@ bool Display::begin() delay(10); // wait for a second digitalWrite(DISPLAY_I2C_PIN_RST, HIGH); // turn the LED off by making the voltage LOW #endif //DISPLAY_I2C_PIN_RST - log_esp3d("Init Display"); - esp_display.init(); - esp_display.clear(); + esp3d_screen.init(); + esp3d_screen.clear(); #if defined(DISPLAY_FLIP_VERTICALY) - esp_display.flipScreenVertically(); + esp3d_screen.flipScreenVertically(); #endif #endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 - esp_display.begin(); // Initialise the display - esp_display.setRotation(3); - esp_display.fillScreen(TFT_BLACK); // Black screen fill + esp3d_screen.begin(); // Initialise the display +#if defined(DISPLAY_FLIP_VERTICALY) + esp3d_screen.setRotation(3); +#else + esp3d_screen.setRotation(1); +#endif + esp3d_screen.fillScreen(SCREEN_BG); // Black screen fill #endif //TFT_SPI_ILI9341_320X240 show_screenID(SPLASH_SCREEN); update_screen(); @@ -129,48 +375,63 @@ void Display::end() if(!_started) { return; } + _status =""; _started = false; _screenID = SPLASH_SCREEN; _splash_displayed=false; clear_screen(); } +void Display::SetStatus(const char * status) +{ + _status= status; +} + void Display::clear_screen() { + log_esp3d("clear screen"); #if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 - esp_display.clear(); + esp3d_screen.clear(); #endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 #if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 - esp_display.fillScreen(TFT_BLACK); // Black screen fill + log_esp3d("Fill black"); + esp3d_screen.fillScreen(SCREEN_BG); // Black screen fill #endif //TFT_SPI_ILI9341_240X320 } -void Display::update_screen() +void Display::update_screen(bool force) { - bool need_update = false; + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } + bool need_update = force; switch(_screenID) { case SPLASH_SCREEN: - need_update = splash(); + if (!_splash_displayed) { + need_update = splash(); + } break; case MAIN_SCREEN: - log_esp3d("Mainscreen"); - clear_screen(); - need_update = true; + need_update = main_screen(); break; default: break; } if (need_update) { #if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 - esp_display.display(); + esp3d_screen.display(); + log_esp3d("Update display"); #endif //DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + Hal::wait(0); } } void Display::handle() { static uint32_t last_update = millis(); - + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } if (_started) { if ((millis()- last_update) > DISPLAY_REFRESH_TIME) { last_update = millis(); @@ -179,4 +440,144 @@ void Display::handle() } } +// Draw a line from position 0 to position 1 +void Display::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t color) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE); + esp3d_screen.drawLine(x0, y0, x1, y1); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.drawLine(x0, y0, x1, y1, color); +#endif //TFT_SPI_ILI9341_240X320 +} + +// Draw the border of a rectangle at the given location +void Display::drawRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE); + esp3d_screen.drawRect(x, y, width, height); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.drawRect(x, y, width, height, color); +#endif //TFT_SPI_ILI9341_240X320 +} + +// Fill the rectangle +void Display::fillRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE); + esp3d_screen.fillRect(x, y, width, height); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.fillRect(x, y, width, height, color); +#endif //TFT_SPI_ILI9341_240X320 +} +void Display::setTextFont(uint8_t font) +{ +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + switch(font) { + case 3: + esp3d_screen.setFont(ArialMT_Plain_16); + break; + case 2: + default: + esp3d_screen.setFont(ArialMT_Plain_10); + } +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.setTextFont(font); +#endif //TFT_SPI_ILI9341_240X320 +} +void Display::drawString(const char *string, int32_t poX, int32_t poY, int16_t color) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + esp3d_screen.setColor((color == TFT_BLACK)?BLACK:WHITE); + esp3d_screen.drawString(poX, poY, string); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.setTextColor(color); + esp3d_screen.drawString(string, poX, poY); +#endif //TFT_SPI_ILI9341_240X320 +} + +// Draw a XBM +void Display::drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color, const unsigned char *xbm) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + (void)color; + esp3d_screen.drawXbm(x, y, width, height, (const char *)xbm); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.drawXBitmap(x, y, xbm, width, height,color); +#endif //TFT_SPI_ILI9341_240X320 +} + + + +void Display::drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t fgcolor, uint16_t bgcolor, const unsigned char *xbm) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + (void)fgcolor; + (void)bgcolor; + esp3d_screen.drawXbm(x, y, width, height, (const char *)xbm); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + esp3d_screen.drawXBitmap(x, y, xbm, width, height, fgcolor, bgcolor); +#endif //TFT_SPI_ILI9341_240X320 +} + +uint16_t Display::getStringWidth(const char* text) +{ +#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 + return esp3d_screen.getStringWidth(text, strlen(text)); +#endif //#if DISPLAY_DEVICE == OLED_I2C_SSD1306 || DISPLAY_DEVICE == OLED_I2C_SSDSH1106 +#if DISPLAY_DEVICE == TFT_SPI_ILI9341_320X240 + return esp3d_screen.textWidth(text); +#endif //TFT_SPI_ILI9341_240X320 +} + +void Display::progress(uint8_t v) +{ + if ( !ESP3DOutput::isOutput(ESP_SCREEN_CLIENT)) { + return; + } + static uint8_t previous = 0; + if (previous > v) { + //clear + fillRect(10, _screenheight-2, _screenwidth-20, 2, SCREEN_BG); + } + log_esp3d("%d", v); + previous = v; + //display bar + drawRect(10, _screenheight-2, ((_screenwidth-20) * v)/100, 2, PROGRESS_FG); + //update screen + update_screen(true); +} + +void display_progress(uint8_t v) +{ + esp3d_display.progress(v); +} + #endif //DISPLAY_DEVICE diff --git a/esp3d/src/modules/display/display.h b/esp3d/src/modules/display/display.h index f3f2391c..8500f1c6 100644 --- a/esp3d/src/modules/display/display.h +++ b/esp3d/src/modules/display/display.h @@ -34,18 +34,33 @@ public: void end(); void handle(); void show_screenID(uint8_t screenID); - void update_screen(); + void update_screen(bool force=false); void clear_screen(); + void progress(uint8_t v); + void SetStatus(const char * status); private: + bool main_screen(); bool splash(); + void showStatus(); bool _started; uint8_t _screenID; bool _splash_displayed; uint _screenwidth; uint _screenheight; + uint16_t sizetoFitSpace(const char * string, uint16_t maxwidth); + void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t color); + void drawRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color); + void fillRect(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color); + void setTextFont(uint8_t font); + void drawString(const char *string, int32_t poX, int32_t poY, int16_t color); + void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, int16_t color, const unsigned char *xbm); + void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, uint16_t fgcolor, uint16_t bgcolor, const unsigned char *xbm); + uint16_t getStringWidth(const char* text); + String _status; }; extern Display esp3d_display; +extern void display_progress(uint8_t v); #endif //_DISPLAY_H diff --git a/esp3d/src/modules/display/esp3d_logob.h b/esp3d/src/modules/display/esp3d_logob.h index b6157d54..2f62d47d 100644 --- a/esp3d/src/modules/display/esp3d_logob.h +++ b/esp3d/src/modules/display/esp3d_logob.h @@ -24,319 +24,319 @@ #define ESP3D_Logo_width 200 #define ESP3D_Logo_height 150 const unsigned char ESP3D_Logo[] PROGMEM = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xA4, 0x69, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC0, 0xFD, 0xFF, 0x7F, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF5, 0xFF, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x05, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x03, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0F, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x66, 0x59, 0x99, 0x96, 0x99, - 0x96, 0x66, 0x59, 0x55, 0x66, 0x59, 0x55, 0x66, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, - 0xA4, 0x4A, 0xAA, 0xA4, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xA4, 0x4A, - 0x94, 0xAA, 0xAA, 0xAA, 0x59, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, - 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x5F, 0xA5, 0x56, 0x6A, 0xAA, 0xFE, 0x7F, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x7F, 0x00, - 0x00, 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, - 0x01, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xF0, 0x07, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x1F, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x80, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x80, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x07, 0xC0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, - 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x07, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x07, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xF8, 0x7F, 0x00, 0x00, 0xF0, - 0xFF, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x03, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFE, 0x1F, 0x00, 0x00, - 0xF0, 0x1F, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0xF0, 0xFF, 0x01, 0x00, 0xE0, - 0xFF, 0x01, 0x00, 0x6E, 0x6B, 0x00, 0x00, 0x00, 0x38, 0xFC, 0x3F, 0x00, - 0x00, 0xF0, 0x0F, 0x00, 0xC0, 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0x03, 0x00, - 0xFC, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFE, 0x1F, - 0x00, 0x00, 0xF8, 0x07, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x03, - 0x00, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF8, 0xFC, - 0x1F, 0x00, 0x00, 0xF0, 0x03, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF, - 0x03, 0x00, 0xFF, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, - 0xFE, 0x1F, 0x00, 0x10, 0xF8, 0x03, 0xF8, 0x81, 0x7F, 0x00, 0x00, 0x00, - 0xFF, 0x01, 0x80, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFC, 0x8F, 0xFF, 0x80, 0x3F, - 0x00, 0xFE, 0x01, 0x80, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x03, - 0x00, 0xF0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0x7F, 0x80, - 0xFF, 0x00, 0xFE, 0x01, 0x80, 0x1F, 0xF8, 0x3F, 0x80, 0x7F, 0xE1, 0xFF, - 0x07, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0xFF, - 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x80, 0x07, 0xE0, 0x3F, 0x80, 0x7F, 0x00, - 0xFE, 0x0F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFE, 0xFF, - 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00, 0x01, 0xE0, 0x3F, 0x80, 0x7F, - 0x00, 0xFC, 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, 0xFF, - 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFC, 0x01, 0x00, 0x00, 0xC0, 0x3F, 0x80, - 0x7F, 0x00, 0xF0, 0x1F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0x01, - 0xFC, 0xFF, 0xFF, 0x80, 0xFF, 0x03, 0xFE, 0x01, 0x00, 0x00, 0xC0, 0x3F, - 0x80, 0x7F, 0x00, 0xE0, 0x1F, 0x00, 0xE0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, - 0x01, 0xF8, 0xFF, 0x7F, 0x80, 0xFF, 0x03, 0xFE, 0x01, 0x00, 0x00, 0xE0, - 0x3F, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, - 0xFF, 0x01, 0xF8, 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00, 0x00, - 0xE0, 0x3F, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xE0, - 0xFF, 0xFF, 0x03, 0xE0, 0xFF, 0xFF, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0x00, - 0x00, 0xE0, 0x1F, 0x80, 0x7F, 0x00, 0xC0, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, - 0x40, 0x95, 0xFE, 0x07, 0x00, 0xFF, 0x7F, 0x80, 0xFF, 0x01, 0xFE, 0x01, - 0x00, 0x00, 0xF0, 0x1F, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF, - 0x1F, 0x00, 0x00, 0xFE, 0x07, 0x00, 0xFC, 0xFF, 0x80, 0xFF, 0x00, 0xFE, - 0x01, 0x00, 0x00, 0xF9, 0x0F, 0x80, 0x7F, 0x00, 0x80, 0x7F, 0x00, 0xF0, - 0xFF, 0x1F, 0x00, 0x00, 0xFC, 0x0F, 0x00, 0xF0, 0xFF, 0x80, 0x7F, 0x00, - 0xFF, 0x01, 0x00, 0x78, 0xFF, 0x07, 0x80, 0x7F, 0x00, 0x80, 0x3F, 0x00, - 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0x7F, 0x00, 0x1B, - 0x00, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x03, 0x80, 0x3F, 0x00, 0x80, 0x7F, - 0x00, 0xF0, 0xFF, 0x3F, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0xC0, 0xFF, 0x00, - 0x00, 0x80, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x00, 0x80, 0x7F, 0x00, 0x80, - 0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x80, 0xFF, - 0x00, 0x00, 0xC0, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x03, 0x80, 0x7F, 0x00, - 0x80, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFB, 0xFF, 0xFF, 0x03, 0x00, - 0x7F, 0x00, 0x00, 0xE0, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x0F, 0x80, 0x7F, - 0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0x1F, - 0x00, 0xFF, 0x00, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xFC, 0xFF, 0x3F, 0x80, - 0x7F, 0x00, 0x80, 0x7F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, - 0x7F, 0x00, 0x7E, 0x00, 0x00, 0xFC, 0xFF, 0x01, 0x00, 0x00, 0xFA, 0x3F, - 0x80, 0x7F, 0x00, 0x80, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, - 0xFF, 0xFF, 0x00, 0xFE, 0x00, 0xE0, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF0, - 0x7F, 0x80, 0x7F, 0x00, 0xC0, 0x7F, 0x00, 0xE0, 0xFF, 0x1F, 0xE0, 0xFF, - 0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0xC0, 0x7F, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, - 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7E, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0xC0, 0xFF, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xE0, 0xFF, 0x1F, - 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFE, 0x80, 0xFF, 0xFF, 0xFF, 0x01, - 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xC0, 0x3F, 0x00, 0xF0, 0xFF, - 0x3F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x7E, 0x80, 0xFF, 0xFF, 0xFF, - 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xE0, 0x3F, 0x00, 0xF0, - 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0x80, 0xFF, 0xFF, - 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xF0, 0x1F, 0x00, - 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x7E, 0x80, 0xFF, - 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0x7F, 0x00, 0xF0, 0x1F, - 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0xFF, 0xFF, 0xE1, 0xFF, 0x00, 0xFF, 0x80, - 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0x7F, 0x00, 0xF8, - 0x1F, 0x00, 0xE0, 0xFF, 0x3F, 0x00, 0xA8, 0xFA, 0x00, 0x0C, 0x80, 0x7F, - 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x01, 0xE0, 0x7F, 0x80, 0x7F, 0x00, - 0xFE, 0x0F, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x80, - 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0x07, 0xF0, 0x7F, 0x80, 0x7F, - 0xD4, 0xFF, 0x07, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01, 0x00, - 0xC0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x3F, 0x80, - 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0xF0, 0xFF, 0x1F, 0x00, 0x00, 0xF0, 0x01, - 0x00, 0xE0, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, 0x3F, - 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0xF0, 0xFC, 0x3F, 0x00, 0x00, 0xF0, - 0x03, 0x00, 0xF0, 0x7F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xC0, 0xFF, 0xFF, - 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xF0, 0xFE, 0x7F, 0x00, 0x00, - 0xF8, 0x1F, 0x00, 0xFE, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0xFF, - 0xFF, 0x07, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0xF0, 0xFC, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xF0, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0xFC, 0xFF, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x78, 0xFC, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, - 0x00, 0x00, 0x80, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, - 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x1C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x3E, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0E, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x80, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x01, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, - 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, - 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x7C, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xE8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x40, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x52, 0xAA, 0xA4, 0x24, 0xAA, 0x49, 0x49, 0x8A, 0xA2, - 0x22, 0x8A, 0x28, 0x49, 0x8A, 0xA2, 0x22, 0x8A, 0x0D, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x6A, - 0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A, 0xAA, 0xA6, 0x6A, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, + 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, + 0xFC, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x0F, 0xF8, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x7F, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0x7F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x3F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x1F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF8, + 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, + 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xE0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xE1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x1F, 0xC0, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0xF0, + 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0xF8, 0xFF, 0x01, 0x00, 0xFE, + 0xFF, 0x01, 0x00, 0xF0, 0xFF, 0xFF, 0x83, 0x83, 0xFF, 0xFF, 0xFF, 0x00, + 0xFC, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0x1F, 0x00, 0xFC, 0x7F, 0x00, 0x00, + 0xFC, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x87, 0x81, 0xFF, 0xFF, 0xFF, + 0x00, 0xFE, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0x3F, 0x00, + 0x00, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x87, 0x81, 0xFF, 0xFF, + 0xFF, 0x00, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFC, 0x1F, + 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x81, 0xFF, + 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0xFC, + 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x81, + 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0x03, + 0xFE, 0x1F, 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F, + 0x80, 0xFF, 0xFF, 0xFF, 0xC0, 0xFF, 0x81, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, + 0x07, 0xFE, 0x1F, 0xF0, 0x03, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0xFF, + 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xC0, 0x7F, 0x00, 0x3C, 0x80, 0xFF, 0x80, + 0xFF, 0x07, 0xFE, 0x1F, 0xFE, 0x07, 0xC0, 0xFF, 0x00, 0xFE, 0x03, 0x80, + 0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x30, 0x80, 0xFF, + 0x00, 0xFE, 0x07, 0xFE, 0x9F, 0xFF, 0x0F, 0xC0, 0xFF, 0x00, 0xFE, 0x0F, + 0x00, 0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x80, + 0xFF, 0x00, 0xFC, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF, 0x00, 0xFE, + 0x3F, 0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, + 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF, 0x00, + 0xFE, 0x7F, 0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x3F, 0x00, + 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, 0xFF, + 0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, 0x7F, + 0x00, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, 0xC0, + 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xE0, + 0x7F, 0x00, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, 0x1F, + 0xC0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00, 0x00, + 0xE0, 0xFF, 0x01, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF, + 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00, + 0x00, 0xC0, 0xFF, 0x03, 0x00, 0x80, 0xFF, 0x00, 0xF8, 0x0F, 0xFE, 0xFF, + 0xFF, 0x0F, 0xE0, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xF8, 0x0F, 0x80, 0xFF, + 0xFF, 0x3F, 0xC0, 0xFF, 0x1F, 0x00, 0x80, 0xFF, 0x00, 0xFC, 0x0F, 0xFE, + 0xFF, 0xFF, 0x07, 0xF0, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, + 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0x7F, 0x00, 0x80, 0xFF, 0x00, 0xFC, 0x07, + 0xFE, 0xFF, 0xFF, 0x01, 0xF8, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, + 0x80, 0xFF, 0xFF, 0x3F, 0x80, 0xFF, 0xFF, 0x01, 0x80, 0xFF, 0x00, 0xFE, + 0x07, 0xFE, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, + 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0x80, + 0xFF, 0x07, 0xFE, 0xFF, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0xFE, 0xFF, 0x03, + 0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0x0F, 0x80, 0xFF, + 0xFF, 0xFF, 0x03, 0xFE, 0xFF, 0x00, 0x80, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, + 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xF8, 0xFF, 0x1F, 0x80, + 0xFF, 0xFF, 0xFF, 0x01, 0xFE, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0xFE, + 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xF0, 0xFF, 0x3F, + 0x80, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xF0, 0xFF, 0x00, + 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, + 0x3F, 0x80, 0xFF, 0xFF, 0x7F, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0xE0, 0xFF, + 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x7F, 0x80, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0xC0, + 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0xF8, 0x7F, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0xFE, 0xFF, 0xFF, 0x0F, + 0x80, 0xFF, 0x00, 0xFE, 0xFF, 0x03, 0xF8, 0x0F, 0x80, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xFF, 0x80, 0xFF, 0xFF, 0x01, 0x00, 0xFE, 0xFF, 0xFF, + 0x1F, 0x80, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0x1F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, + 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x01, 0xFC, 0x0F, 0x80, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x00, + 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFC, 0x0F, + 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0x00, + 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0x00, 0xFE, + 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, + 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0x7F, 0x00, + 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, + 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x3F, 0x00, 0xFF, 0x00, 0xFE, 0x3F, + 0x00, 0xFE, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0x70, 0x00, 0xC0, 0x7F, 0x80, + 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xCF, 0xFF, 0x1F, 0x00, 0xFF, 0x00, 0xFE, + 0x0F, 0x00, 0xFF, 0x0F, 0x80, 0xFF, 0x00, 0x00, 0xF0, 0x01, 0xE0, 0x7F, + 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xFF, 0x0F, 0x80, 0xFF, 0x00, + 0xFE, 0x03, 0x80, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xF8, + 0x7F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0xF8, 0x03, 0x80, 0xFF, + 0x00, 0x00, 0x00, 0x80, 0xFF, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, + 0xFF, 0x3F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, 0xC0, + 0xFF, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, 0xF0, + 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x0F, 0x00, 0x00, + 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x0F, 0x81, 0xFF, 0xFF, 0xFF, + 0xF0, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, + 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0x0F, 0x81, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0x07, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x1F, + 0x00, 0x00, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0x0F, 0x81, 0xFF, + 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0x03, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFF, + 0x3F, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x07, 0x01, + 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x80, + 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x01, 0x00, 0xF8, 0xFF, 0xFF, 0x87, + 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xFF, 0xFF, 0x07, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x87, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xC3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xC1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFE, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0xF0, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xF8, 0x3F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0x7F, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0xFF, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0xFE, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, + 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x81, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x80, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x3F, 0xE0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x03, 0xFC, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xF9, 0xFF, 0xFF, 0xFF, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; #endif //_esp3d_logo_h diff --git a/esp3d/src/modules/network/netconfig.cpp b/esp3d/src/modules/network/netconfig.cpp index 5a6bd7de..cd3798ee 100644 --- a/esp3d/src/modules/network/netconfig.cpp +++ b/esp3d/src/modules/network/netconfig.cpp @@ -19,7 +19,7 @@ */ #include "../../include/esp3d_config.h" -#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) +#if defined (WIFI_FEATURE) || defined (ETH_FEATURE) || defined (BLUETOOTH_FEATURE) #ifdef ARDUINO_ARCH_ESP32 #define WIFI_EVENT_STAMODE_CONNECTED SYSTEM_EVENT_STA_CONNECTED #define WIFI_EVENT_STAMODE_DISCONNECTED SYSTEM_EVENT_STA_DISCONNECTED @@ -46,7 +46,7 @@ String NetConfig::_hostname = ""; bool NetConfig::_needReconnect2AP = false; bool NetConfig::_events_registered = false; bool NetConfig::_started = false; - +uint8_t NetConfig::_mode = ESP_RADIO_OFF; NetConfig::NetConfig() { } @@ -127,40 +127,42 @@ bool NetConfig::isValidIP(const char * string) //wifi event void NetConfig::onWiFiEvent(WiFiEvent_t event) { - ESP3DOutput output(ESP_PRINTER_LCD_CLIENT); + ESP3DOutput output(ESP_ALL_CLIENTS); switch (event) { case WIFI_EVENT_STAMODE_CONNECTED: _needReconnect2AP = false; -#ifdef ESP_OLED_FEATURE - OLED_DISPLAY::display_signal(wifi_config.getSignal (WiFi.RSSI ())); - OLED_DISPLAY::setCursor(0, 0); - ESPCOM::print("", OLED_PIPE); -#endif //ESP_OLED_FEATURE break; case WIFI_EVENT_STAMODE_DISCONNECTED: -#ifdef ESP_OLED_FEATURE - OLED_DISPLAY::display_signal(-1); - OLED_DISPLAY::setCursor(0, 16); - ESPCOM::print("", OLED_PIPE); - OLED_DISPLAY::setCursor(0, 48); -#endif //ESP_OLED_FEATURE + { if(_started) { output.printMSG ("Disconnected"); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); +#endif //DISPLAY_DEVICE _needReconnect2AP = true; } + } break; case WIFI_EVENT_STAMODE_GOT_IP: + { output.printMSG ("Connected"); +#if defined (DISPLAY_DEVICE) + { + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG("Connected"); + } +#endif //DISPLAY_DEVICE output.printMSG (WiFi.localIP().toString().c_str()); -#ifdef ESP_OLED_FEATURE - OLED_DISPLAY::setCursor(0, 16); - ESPCOM::print(WiFi.localIP().toString().c_str(), OLED_PIPE); - OLED_DISPLAY::setCursor(0, 48); - ESPCOM::print("", OLED_PIPE); -#endif //ESP_OLED_FEATURE + } break; case WIFI_EVENT_SOFTAPMODE_STACONNECTED: + { output.printMSG ("New client"); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG("New client"); +#endif //DISPLAY_DEVICE + } break; #ifdef ARDUINO_ARCH_ESP32 case SYSTEM_EVENT_STA_LOST_IP: @@ -170,10 +172,22 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event) break; #ifdef ETH_FEATURE case SYSTEM_EVENT_ETH_CONNECTED: + { output.printMSG ("Cable connected"); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG("Cable connected"); +#endif //DISPLAY_DEVICE + } break; case SYSTEM_EVENT_ETH_DISCONNECTED: + { output.printMSG ("Cable disconnected"); +#if defined (DISPLAY_DEVICE) + ESP3DOutput outputscr(ESP_SCREEN_CLIENT); + outputscr.printMSG("Cable disconnected"); +#endif //DISPLAY_DEVICE + } break; case SYSTEM_EVENT_ETH_GOT_IP: output.printMSG (ETH.localIP().toString().c_str()); @@ -183,7 +197,11 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event) default: break; } +} +uint8_t NetConfig::getMode() +{ + return _mode; } /** @@ -211,6 +229,7 @@ bool NetConfig::begin() //Get hostname _hostname = Settings_ESP3D::read_string(ESP_HOSTNAME); int8_t espMode =Settings_ESP3D::read_byte(ESP_RADIO_MODE); + _mode = espMode; if (espMode == NO_NETWORK) { return true; } @@ -270,7 +289,7 @@ bool NetConfig::begin() void NetConfig::end() { NetServices::end(); - + _mode = ESP_RADIO_OFF; #if defined (WIFI_FEATURE) WiFiConfig::end(); _needReconnect2AP=false; diff --git a/esp3d/src/modules/network/netconfig.h b/esp3d/src/modules/network/netconfig.h index 6026953f..f525c829 100644 --- a/esp3d/src/modules/network/netconfig.h +++ b/esp3d/src/modules/network/netconfig.h @@ -66,6 +66,7 @@ public: static bool begin(); static void end(); static void handle(); + static uint8_t getMode(); static bool started() { return _started; @@ -76,6 +77,7 @@ private : static bool _needReconnect2AP; static bool _events_registered; static bool _started; + static uint8_t _mode; }; #endif //_NET_CONFIG_H