From a0186e82723059dfec6c9036247d4d1e14eda87b Mon Sep 17 00:00:00 2001 From: Owen Date: Tue, 19 Feb 2019 01:29:34 +0100 Subject: [PATCH 1/4] Discard bed temp if none reported --- printermonitor/printermonitor.ino | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/printermonitor/printermonitor.ino b/printermonitor/printermonitor.ino index 428f36a..9d0885d 100644 --- a/printermonitor/printermonitor.ino +++ b/printermonitor/printermonitor.ino @@ -739,7 +739,9 @@ void displayPrinterStatus() { } html += "Tool Temperature: " + printerClient.getTempToolActual() + "° C
"; - html += "Bed Temperature: " + printerClient.getTempBedActual() + "° C
"; + if ( printerClient.getTempBedActual() != 0 ) { + html += "Bed Temperature: " + printerClient.getTempBedActual() + "° C
"; + } int val = printerClient.getProgressPrintTimeLeft().toInt(); int hours = numberOfHours(val); @@ -826,15 +828,25 @@ void flashLED(int number, int delayTime) { } void drawScreen1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_16); - display->drawString(64 + x, 0 + y, "Bed / Tool Temp"); - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); String bed = printerClient.getValueRounded(printerClient.getTempBedActual()); String tool = printerClient.getValueRounded(printerClient.getTempToolActual()); - display->drawString(2 + x, 14 + y, bed + "°"); - display->drawString(64 + x, 14 + y, tool + "°"); + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_16); + if (bed != "0") { + display->drawString(64 + x, 0 + y, "Bed / Tool Temp"); + } else { + display->drawString(64 + x, 0 + y, "Tool Temp"); + } + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + if (bed != "0") { + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->drawString(2 + x, 14 + y, bed + "°"); + display->drawString(64 + x, 14 + y, tool + "°"); + } else { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->drawString(64 + x, 14 + y, tool + "°"); + } } void drawScreen2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { From 0adead3bbf8f5f08d30d22099f53455651261051 Mon Sep 17 00:00:00 2001 From: Chrome Legion Date: Mon, 18 Feb 2019 19:15:40 -0700 Subject: [PATCH 2/4] Qrome - included ArduinoJson as part of the libs --- README.md | 3 +- printermonitor/OctoPrintClient.h | 2 +- printermonitor/OpenWeatherMapClient.h | 177 ++- printermonitor/libs/ArduinoJson/ArduinoJson.h | 5 + printermonitor/libs/ArduinoJson/CHANGELOG.md | 463 ++++++ .../libs/ArduinoJson/CMakeLists.txt | 16 + .../libs/ArduinoJson/CONTRIBUTING.md | 11 + printermonitor/libs/ArduinoJson/LICENSE.md | 10 + printermonitor/libs/ArduinoJson/README.md | 110 ++ printermonitor/libs/ArduinoJson/SUPPORT.md | 27 + printermonitor/libs/ArduinoJson/appveyor.yml | 20 + printermonitor/libs/ArduinoJson/banner.svg | 367 +++++ printermonitor/libs/ArduinoJson/keywords.txt | 15 + .../libs/ArduinoJson/src/ArduinoJson.h | 17 + .../libs/ArduinoJson/src/ArduinoJson.hpp | 17 + .../src/ArduinoJson/Configuration.hpp | 151 ++ .../src/ArduinoJson/Data/Encoding.hpp | 37 + .../ArduinoJson/Data/JsonBufferAllocated.hpp | 22 + .../src/ArduinoJson/Data/JsonFloat.hpp | 18 + .../src/ArduinoJson/Data/JsonInteger.hpp | 23 + .../src/ArduinoJson/Data/JsonVariantAs.hpp | 42 + .../ArduinoJson/Data/JsonVariantContent.hpp | 27 + .../ArduinoJson/Data/JsonVariantDefault.hpp | 23 + .../src/ArduinoJson/Data/JsonVariantType.hpp | 27 + .../ArduinoJson/src/ArduinoJson/Data/List.hpp | 94 ++ .../ArduinoJson/Data/ListConstIterator.hpp | 50 + .../src/ArduinoJson/Data/ListIterator.hpp | 60 + .../src/ArduinoJson/Data/ListNode.hpp | 24 + .../src/ArduinoJson/Data/NonCopyable.hpp | 23 + .../src/ArduinoJson/Data/ReferenceType.hpp | 24 + .../src/ArduinoJson/Data/ValueSaver.hpp | 52 + .../ArduinoJson/Deserialization/Comments.hpp | 61 + .../Deserialization/JsonParser.hpp | 103 ++ .../Deserialization/JsonParserImpl.hpp | 192 +++ .../Deserialization/StringWriter.hpp | 41 + .../src/ArduinoJson/DynamicJsonBuffer.hpp | 170 +++ .../ArduinoJson/src/ArduinoJson/JsonArray.hpp | 227 +++ .../src/ArduinoJson/JsonArrayImpl.hpp | 26 + .../src/ArduinoJson/JsonArraySubscript.hpp | 122 ++ .../src/ArduinoJson/JsonBuffer.hpp | 78 + .../src/ArduinoJson/JsonBufferBase.hpp | 127 ++ .../src/ArduinoJson/JsonBufferImpl.hpp | 17 + .../src/ArduinoJson/JsonObject.hpp | 322 +++++ .../src/ArduinoJson/JsonObjectImpl.hpp | 28 + .../src/ArduinoJson/JsonObjectSubscript.hpp | 110 ++ .../ArduinoJson/src/ArduinoJson/JsonPair.hpp | 16 + .../src/ArduinoJson/JsonVariant.hpp | 355 +++++ .../src/ArduinoJson/JsonVariantBase.hpp | 24 + .../src/ArduinoJson/JsonVariantCasts.hpp | 59 + .../ArduinoJson/JsonVariantComparisons.hpp | 138 ++ .../src/ArduinoJson/JsonVariantImpl.hpp | 126 ++ .../src/ArduinoJson/JsonVariantOr.hpp | 52 + .../src/ArduinoJson/JsonVariantSubscripts.hpp | 86 ++ .../src/ArduinoJson/Polyfills/attributes.hpp | 29 + .../src/ArduinoJson/Polyfills/ctype.hpp | 18 + .../src/ArduinoJson/Polyfills/isFloat.hpp | 38 + .../src/ArduinoJson/Polyfills/isInteger.hpp | 19 + .../src/ArduinoJson/Polyfills/math.hpp | 19 + .../src/ArduinoJson/Polyfills/parseFloat.hpp | 90 ++ .../ArduinoJson/Polyfills/parseInteger.hpp | 41 + .../ArduinoJson/src/ArduinoJson/RawJson.hpp | 46 + .../ArduinoJson/Serialization/DummyPrint.hpp | 22 + .../Serialization/DynamicStringBuilder.hpp | 35 + .../ArduinoJson/Serialization/FloatParts.hpp | 89 ++ .../Serialization/IndentedPrint.hpp | 68 + .../Serialization/JsonPrintable.hpp | 117 ++ .../Serialization/JsonSerializer.hpp | 32 + .../Serialization/JsonSerializerImpl.hpp | 103 ++ .../ArduinoJson/Serialization/JsonWriter.hpp | 155 ++ .../ArduinoJson/Serialization/Prettyfier.hpp | 133 ++ .../Serialization/StaticStringBuilder.hpp | 36 + .../Serialization/StreamPrintAdapter.hpp | 39 + .../src/ArduinoJson/StaticJsonBuffer.hpp | 126 ++ .../StringTraits/ArduinoStream.hpp | 61 + .../ArduinoJson/StringTraits/CharPointer.hpp | 62 + .../ArduinoJson/StringTraits/FlashString.hpp | 59 + .../ArduinoJson/StringTraits/StdStream.hpp | 60 + .../ArduinoJson/StringTraits/StdString.hpp | 74 + .../ArduinoJson/StringTraits/StringTraits.hpp | 36 + .../src/ArduinoJson/TypeTraits/EnableIf.hpp | 19 + .../ArduinoJson/TypeTraits/FloatTraits.hpp | 150 ++ .../src/ArduinoJson/TypeTraits/IsArray.hpp | 24 + .../src/ArduinoJson/TypeTraits/IsBaseOf.hpp | 27 + .../src/ArduinoJson/TypeTraits/IsChar.hpp | 23 + .../src/ArduinoJson/TypeTraits/IsConst.hpp | 21 + .../TypeTraits/IsFloatingPoint.hpp | 18 + .../src/ArduinoJson/TypeTraits/IsIntegral.hpp | 26 + .../src/ArduinoJson/TypeTraits/IsSame.hpp | 21 + .../TypeTraits/IsSignedIntegral.hpp | 28 + .../TypeTraits/IsUnsignedIntegral.hpp | 28 + .../src/ArduinoJson/TypeTraits/IsVariant.hpp | 17 + .../ArduinoJson/TypeTraits/RemoveConst.hpp | 20 + .../TypeTraits/RemoveReference.hpp | 20 + printermonitor/libs/OledDisplay/README.md | 405 ++++++ .../libs/OledDisplay/UPGRADE-3.0.md | 125 ++ .../libs/OledDisplay/UPGRADE-4.0.md | 27 + printermonitor/libs/OledDisplay/license | 24 + .../libs/OledDisplay/resources/DemoFrame1.jpg | Bin 0 -> 16026 bytes .../libs/OledDisplay/resources/DemoFrame2.jpg | Bin 0 -> 19502 bytes .../libs/OledDisplay/resources/DemoFrame3.jpg | Bin 0 -> 21777 bytes .../libs/OledDisplay/resources/DemoFrame4.jpg | Bin 0 -> 25325 bytes .../libs/OledDisplay/resources/FontTool.png | Bin 0 -> 14052 bytes .../OledDisplay/resources/SPI_version.jpg | Bin 0 -> 26912 bytes .../libs/OledDisplay/resources/Thumbs.db | Bin 0 -> 21504 bytes .../OledDisplay/resources/glyphEditor.html | 633 ++++++++ .../OledDisplay/resources/glyphEditor.png | Bin 0 -> 68751 bytes .../libs/OledDisplay/resources/xbmPreview.png | Bin 0 -> 41692 bytes .../libs/OledDisplay/src/OLEDDisplay.cpp | 890 ++++++++++++ .../libs/OledDisplay/src/OLEDDisplay.h | 329 +++++ .../libs/OledDisplay/src/OLEDDisplayFonts.h | 1274 +++++++++++++++++ .../libs/OledDisplay/src/OLEDDisplayUi.cpp | 422 ++++++ .../libs/OledDisplay/src/OLEDDisplayUi.h | 309 ++++ printermonitor/libs/OledDisplay/src/SH1106.h | 39 + .../libs/OledDisplay/src/SH1106Brzo.h | 138 ++ .../libs/OledDisplay/src/SH1106Spi.h | 132 ++ .../libs/OledDisplay/src/SH1106Wire.h | 157 ++ printermonitor/libs/OledDisplay/src/SSD1306.h | 39 + .../libs/OledDisplay/src/SSD1306Brzo.h | 159 ++ .../libs/OledDisplay/src/SSD1306Spi.h | 160 +++ .../libs/OledDisplay/src/SSD1306Wire.h | 173 +++ printermonitor/printermonitor.ino | 2 +- 121 files changed, 11831 insertions(+), 92 deletions(-) create mode 100644 printermonitor/libs/ArduinoJson/ArduinoJson.h create mode 100644 printermonitor/libs/ArduinoJson/CHANGELOG.md create mode 100644 printermonitor/libs/ArduinoJson/CMakeLists.txt create mode 100644 printermonitor/libs/ArduinoJson/CONTRIBUTING.md create mode 100644 printermonitor/libs/ArduinoJson/LICENSE.md create mode 100644 printermonitor/libs/ArduinoJson/README.md create mode 100644 printermonitor/libs/ArduinoJson/SUPPORT.md create mode 100644 printermonitor/libs/ArduinoJson/appveyor.yml create mode 100644 printermonitor/libs/ArduinoJson/banner.svg create mode 100644 printermonitor/libs/ArduinoJson/keywords.txt create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson.h create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Configuration.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/List.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArray.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObject.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonPair.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariant.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/RawJson.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp create mode 100644 printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp create mode 100644 printermonitor/libs/OledDisplay/README.md create mode 100644 printermonitor/libs/OledDisplay/UPGRADE-3.0.md create mode 100644 printermonitor/libs/OledDisplay/UPGRADE-4.0.md create mode 100644 printermonitor/libs/OledDisplay/license create mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg create mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg create mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame3.jpg create mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg create mode 100644 printermonitor/libs/OledDisplay/resources/FontTool.png create mode 100644 printermonitor/libs/OledDisplay/resources/SPI_version.jpg create mode 100644 printermonitor/libs/OledDisplay/resources/Thumbs.db create mode 100644 printermonitor/libs/OledDisplay/resources/glyphEditor.html create mode 100644 printermonitor/libs/OledDisplay/resources/glyphEditor.png create mode 100644 printermonitor/libs/OledDisplay/resources/xbmPreview.png create mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp create mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplay.h create mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h create mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp create mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h create mode 100644 printermonitor/libs/OledDisplay/src/SH1106.h create mode 100644 printermonitor/libs/OledDisplay/src/SH1106Brzo.h create mode 100644 printermonitor/libs/OledDisplay/src/SH1106Spi.h create mode 100644 printermonitor/libs/OledDisplay/src/SH1106Wire.h create mode 100644 printermonitor/libs/OledDisplay/src/SSD1306.h create mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Brzo.h create mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Spi.h create mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Wire.h diff --git a/README.md b/README.md index 42362c8..69e76f5 100644 --- a/README.md +++ b/README.md @@ -82,13 +82,14 @@ Use the Arduino guide for details on how to installing and manage libraries http **Packages** -- the following packages and libraries are used (download and install): ESP8266WiFi.h ESP8266WebServer.h -ArduinoJson.h --> https://github.com/bblanchon/ArduinoJson (Version 5.13.X) WiFiManager.h --> https://github.com/tzapu/WiFiManager ESP8266mDNS.h ArduinoOTA.h --> Arduino OTA Library "SSD1306Wire.h" --> https://github.com/ThingPulse/esp8266-oled-ssd1306 "OLEDDisplayUi.h" +Note Printer-Monitor version 2.5 and later include ArduinoJson (version 5.13.1). + ## Initial Configuration All settings may be managed from the Web Interface, however, you may update the **Settings.h** file manually -- but it is not required. There is also an option to display current weather when the print is off-line. * Your OctoPrint API Key from your OctoPrint -> User Settings -> Current API Key diff --git a/printermonitor/OctoPrintClient.h b/printermonitor/OctoPrintClient.h index c32358a..d8d7b8d 100644 --- a/printermonitor/OctoPrintClient.h +++ b/printermonitor/OctoPrintClient.h @@ -26,7 +26,7 @@ SOFTWARE. #pragma once #include -#include +#include "libs/ArduinoJson/ArduinoJson.h" #include class OctoPrintClient { diff --git a/printermonitor/OpenWeatherMapClient.h b/printermonitor/OpenWeatherMapClient.h index 7555447..9a8a44b 100644 --- a/printermonitor/OpenWeatherMapClient.h +++ b/printermonitor/OpenWeatherMapClient.h @@ -1,90 +1,89 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#pragma once -#include -#include - -class OpenWeatherMapClient { - -private: - String myCityIDs = ""; - String myApiKey = ""; - String units = ""; - String lang = ""; - - const char* servername = "api.openweathermap.org"; // remote server we will connect to - String result; - - typedef struct { - String lat; - String lon; - String dt; - String city; - String country; - String temp; - String humidity; - String condition; - String wind; - String weatherId; - String description; - String icon; - boolean cached; - String error; - } weather; - - weather weathers[5]; - - String roundValue(String value); - -public: - OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language); - void updateWeather(); - void updateWeatherApiKey(String ApiKey); - void updateCityIdList(int CityIDs[], int cityCount); - void updateLanguage(String language); - void setMetric(boolean isMetric); - - String getWeatherResults(); - - String getLat(int index); - String getLon(int index); - String getDt(int index); - String getCity(int index); - String getCountry(int index); - String getTemp(int index); - String getTempRounded(int index); - String getHumidity(int index); - String getHumidityRounded(int index); - String getCondition(int index); - String getWind(int index); - String getWindRounded(int index); - String getWeatherId(int index); - String getDescription(int index); - String getIcon(int index); - boolean getCached(); - String getMyCityIDs(); - String getWeatherIcon(int index); - String getError(); -}; +/** The MIT License (MIT) +Copyright (c) 2018 David Payne + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#pragma once +#include +#include "libs/ArduinoJson/ArduinoJson.h" + +class OpenWeatherMapClient { + +private: + String myCityIDs = ""; + String myApiKey = ""; + String units = ""; + String lang = ""; + + const char* servername = "api.openweathermap.org"; // remote server we will connect to + String result; + + typedef struct { + String lat; + String lon; + String dt; + String city; + String country; + String temp; + String humidity; + String condition; + String wind; + String weatherId; + String description; + String icon; + boolean cached; + String error; + } weather; + + weather weathers[5]; + + String roundValue(String value); + +public: + OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language); + void updateWeather(); + void updateWeatherApiKey(String ApiKey); + void updateCityIdList(int CityIDs[], int cityCount); + void updateLanguage(String language); + void setMetric(boolean isMetric); + + String getWeatherResults(); + + String getLat(int index); + String getLon(int index); + String getDt(int index); + String getCity(int index); + String getCountry(int index); + String getTemp(int index); + String getTempRounded(int index); + String getHumidity(int index); + String getHumidityRounded(int index); + String getCondition(int index); + String getWind(int index); + String getWindRounded(int index); + String getWeatherId(int index); + String getDescription(int index); + String getIcon(int index); + boolean getCached(); + String getMyCityIDs(); + String getWeatherIcon(int index); + String getError(); +}; diff --git a/printermonitor/libs/ArduinoJson/ArduinoJson.h b/printermonitor/libs/ArduinoJson/ArduinoJson.h new file mode 100644 index 0000000..9f78b9f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/ArduinoJson.h @@ -0,0 +1,5 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#include "src/ArduinoJson.h" diff --git a/printermonitor/libs/ArduinoJson/CHANGELOG.md b/printermonitor/libs/ArduinoJson/CHANGELOG.md new file mode 100644 index 0000000..9fb7ecf --- /dev/null +++ b/printermonitor/libs/ArduinoJson/CHANGELOG.md @@ -0,0 +1,463 @@ +ArduinoJson: change log +======================= + +v5.13.1 +------- + +* Fixed `JsonVariant::operator|(int)` that returned the default value if the variant contained a double (issue #675) +* Allowed non-quoted key to contain underscores (issue #665) + +v5.13.0 +------- + +* Changed the rules of string duplication (issue #658) +* `RawJson()` accepts any kind of string and obeys to the same rules for duplication +* Changed the return type of `strdup()` to `const char*` to prevent double duplication +* Marked `strdup()` as deprecated + +> ### New rules for string duplication +> +> | type | duplication | +> |:---------------------------|:------------| +> | const char* | no | +> | char* | ~~no~~ yes | +> | String | yes | +> | std::string | yes | +> | const __FlashStringHelper* | yes | +> +> These new rules make `JsonBuffer::strdup()` useless. + +v5.12.0 +------- + +* Added `JsonVariant::operator|` to return a default value (see below) +* Added a clear error message when compiled as C instead of C++ (issue #629) +* Added detection of MPLAB XC compiler (issue #629) +* Added detection of Keil ARM Compiler (issue #629) +* Added an example that shows how to save and load a configuration file +* Reworked all other examples + +> ### How to use the new feature? +> +> If you have a block like this: +> +> ```c++ +> const char* ssid = root["ssid"]; +> if (!ssid) +> ssid = "default ssid"; +> ``` +> +> You can simplify like that: +> +> ```c++ +> const char* ssid = root["ssid"] | "default ssid"; +> ``` + +v5.11.2 +------- + +* Fixed `DynamicJsonBuffer::clear()` not resetting allocation size (issue #561) +* Fixed incorrect rounding for float values (issue #588) + +v5.11.1 +------- + +* Removed dependency on `PGM_P` as Particle 0.6.2 doesn't define it (issue #546) +* Fixed warning "dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]" +* Fixed warning "floating constant exceeds range of 'float' [-Woverflow]" (issue #544) +* Fixed warning "this statement may fall through" [-Wimplicit-fallthrough=] (issue #539) +* Removed `ARDUINOJSON_DOUBLE_IS_64BITS` as it became useless. +* Fixed too many decimals places in float serialization (issue #543) + +v5.11.0 +------- + +* Made `JsonBuffer` non-copyable (PR #524 by @luisrayas3) +* Added `StaticJsonBuffer::clear()` +* Added `DynamicJsonBuffer::clear()` + +v5.10.1 +------- + +* Fixed IntelliSense errors in Visual Micro (issue #483) +* Fixed compilation in IAR Embedded Workbench (issue #515) +* Fixed reading "true" as a float (issue #516) +* Added `ARDUINOJSON_DOUBLE_IS_64BITS` +* Added `ARDUINOJSON_EMBEDDED_MODE` + +v5.10.0 +------- + +* Removed configurable number of decimal places (issues #288, #427 and #506) +* Changed exponentiation thresholds to `1e7` and `1e-5` (issues #288, #427 and #506) +* `JsonVariant::is()` now returns `true` for integers +* Fixed error `IsBaseOf is not a member of ArduinoJson::TypeTraits` (issue #495) +* Fixed error `forming reference to reference` (issue #495) + +> ### BREAKING CHANGES :warning: +> +> | Old syntax | New syntax | +> |:--------------------------------|:--------------------| +> | `double_with_n_digits(3.14, 2)` | `3.14` | +> | `float_with_n_digits(3.14, 2)` | `3.14f` | +> | `obj.set("key", 3.14, 2)` | `obj["key"] = 3.14` | +> | `arr.add(3.14, 2)` | `arr.add(3.14)` | +> +> | Input | Old output | New output | +> |:----------|:-----------|:-----------| +> | `3.14159` | `3.14` | `3.14159` | +> | `42.0` | `42.00` | `42` | +> | `0.0` | `0.00` | `0` | +> +> | Expression | Old result | New result | +> |:-------------------------------|:-----------|:-----------| +> | `JsonVariant(42).is()` | `true` | `true` | +> | `JsonVariant(42).is()` | `false` | `true` | +> | `JsonVariant(42).is()` | `false` | `true` | + +v5.9.0 +------ + +* Added `JsonArray::remove(iterator)` (issue #479) +* Added `JsonObject::remove(iterator)` +* Renamed `JsonArray::removeAt(size_t)` into `remove(size_t)` +* Renamed folder `include/` to `src/` +* Fixed warnings `floating constant exceeds range of float`and `floating constant truncated to zero` (issue #483) +* Removed `Print` class and converted `printTo()` to a template method (issue #276) +* Removed example `IndentedPrintExample.ino` +* Now compatible with Particle 0.6.1, thanks to Jacob Nite (issue #294 and PR #461 by @foodbag) + +v5.8.4 +------ + +* Added custom implementation of `strtod()` (issue #453) +* Added custom implementation of `strtol()` (issue #465) +* `char` is now treated as an integral type (issue #337, #370) + +v5.8.3 +------ + +* Fixed an access violation in `DynamicJsonBuffer` when memory allocation fails (issue #433) +* Added operators `==` and `!=` for two `JsonVariant`s (issue #436) +* Fixed `JsonVariant::operator[const FlashStringHelper*]` (issue #441) + +v5.8.2 +------ + +* Fixed parsing of comments (issue #421) +* Fixed ignored `Stream` timeout (issue #422) +* Made sure we don't read more that necessary (issue #422) +* Fixed error when the key of a `JsonObject` is a `char[]` (issue #423) +* Reduced code size when using `const` references +* Fixed error with string of type `unsigned char*` (issue #428) +* Added `deprecated` attribute on `asArray()`, `asObject()` and `asString()` (issue #420) + +v5.8.1 +------ + +* Fixed error when assigning a `volatile int` to a `JsonVariant` (issue #415) +* Fixed errors with Variable Length Arrays (issue #416) +* Fixed error when both `ARDUINOJSON_ENABLE_STD_STREAM` and `ARDUINOJSON_ENABLE_ARDUINO_STREAM` are set to `1` +* Fixed error "Stream does not name a type" (issue #412) + +v5.8.0 +------ + +* Added operator `==` to compare `JsonVariant` and strings (issue #402) +* Added support for `Stream` (issue #300) +* Reduced memory consumption by not duplicating spaces and comments + +> ### BREAKING CHANGES :warning: +> +> `JsonBuffer::parseObject()` and `JsonBuffer::parseArray()` have been pulled down to the derived classes `DynamicJsonBuffer` and `StaticJsonBufferBase`. +> +> This means that if you have code like: +> +> ```c++ +> void myFunction(JsonBuffer& jsonBuffer); +> ``` +> +> you need to replace it with one of the following: +> +> ```c++ +> void myFunction(DynamicJsonBuffer& jsonBuffer); +> void myFunction(StaticJsonBufferBase& jsonBuffer); +> template void myFunction(TJsonBuffer& jsonBuffer); +> ``` + +v5.7.3 +------ + +* Added an `printTo(char[N])` and `prettyPrintTo(char[N])` (issue #292) +* Added ability to set a nested value like this: `root["A"]["B"] = "C"` (issue #352) +* Renamed `*.ipp` to `*Impl.hpp` because they were ignored by Arduino IDE (issue #396) + +v5.7.2 +------ + +* Made PROGMEM available on more platforms (issue #381) +* Fixed PROGMEM causing an exception on ESP8266 (issue #383) + +v5.7.1 +------ + +* Added support for PROGMEM (issue #76) +* Fixed compilation error when index is not an `int` (issue #381) + +v5.7.0 +------ + +* Templatized all functions using `String` or `std::string` +* Removed `ArduinoJson::String` +* Removed `JsonVariant::defaultValue()` +* Removed non-template `JsonObject::get()` and `JsonArray.get()` +* Fixed support for `StringSumHelper` (issue #184) +* Replaced `ARDUINOJSON_USE_ARDUINO_STRING` by `ARDUINOJSON_ENABLE_STD_STRING` and `ARDUINOJSON_ENABLE_ARDUINO_STRING` (issue #378) +* Added example `StringExample.ino` to show where `String` can be used +* Increased default nesting limit to 50 when compiled for a computer (issue #349) + +> ### BREAKING CHANGES :warning: +> +> The non-template functions `JsonObject::get()` and `JsonArray.get()` have been removed. This means that you need to explicitely tell the type you expect in return. +> +> Old code: +> +> ```c++ +> #define ARDUINOJSON_USE_ARDUINO_STRING 0 +> JsonVariant value1 = myObject.get("myKey"); +> JsonVariant value2 = myArray.get(0); +> ``` +> +> New code: +> +> ```c++ +> #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 +> #define ARDUINOJSON_ENABLE_STD_STRING 1 +> JsonVariant value1 = myObject.get("myKey"); +> JsonVariant value2 = myArray.get(0); +> ``` + +v5.6.7 +------ + +* Fixed `array[idx].as()` and `object[key].as()` +* Fixed return value of `JsonObject::set()` (issue #350) +* Fixed undefined behavior in `Prettyfier` and `Print` (issue #354) +* Fixed parser that incorrectly rejected floats containing a `+` (issue #349) + +v5.6.6 +------ + +* Fixed `-Wparentheses` warning introduced in v5.6.5 (PR #335 by @nuket) +* Added `.mbedignore` for ARM mbdeb (PR #334 by @nuket) +* Fixed `JsonVariant::success()` which didn't propagate `JsonArray::success()` nor `JsonObject::success()` (issue #342). + +v5.6.5 +------ + +* `as()` now returns `true` when input is `null` (issue #330) + +v5.6.4 +------ + +* Fixed error in float serialization (issue #324) + +v5.6.3 +------ + +* Improved speed of float serialization (about twice faster) +* Added `as()` as a synonym for `as()`... (issue #291) +* Fixed `call of overloaded isinf(double&) is ambiguous` (issue #284) + +v5.6.2 +------ + +* Fixed build when another lib does `#undef isnan` (issue #284) + +v5.6.1 +------ + +* Added missing `#pragma once` (issue #310) + +v5.6.0 +------ + +* ArduinoJson is now a header-only library (issue #199) + +v5.5.1 +------ + +* Fixed compilation error with Intel Galileo (issue #299) + +v5.5.0 +------ + +* Added `JsonVariant::success()` (issue #279) +* Renamed `JsonVariant::invalid()` to `JsonVariant::defaultValue()` + +v5.4.0 +------ + +* Changed `::String` to `ArduinoJson::String` (issue #275) +* Changed `::Print` to `ArduinoJson::Print` too + +v5.3.0 +------ + +* Added custom implementation of `ftoa` (issues #266, #267, #269 and #270) +* Added `JsonVariant JsonBuffer::parse()` (issue #265) +* Fixed `unsigned long` printed as `signed long` (issue #170) + +v5.2.0 +------ + +* Added `JsonVariant::as()` as a synonym for `JsonVariant::as()` (issue #257) +* Added example `JsonHttpClient` (issue #256) +* Added `JsonArray::copyTo()` and `JsonArray::copyFrom()` (issue #254) +* Added `RawJson()` to insert pregenerated JSON portions (issue #259) + +v5.1.1 +------ + +* Removed `String` duplication when one replaces a value in a `JsonObject` (PR #232 by @ulion) + +v5.1.0 +------ + +* Added support of `long long` (issue #171) +* Moved all build settings to `ArduinoJson/Configuration.hpp` + +> ### BREAKING CHANGE :warning: +> +> If you defined `ARDUINOJSON_ENABLE_STD_STREAM`, you now need to define it to `1`. + +v5.0.8 +------ + +* Made the library compatible with [PlatformIO](http://platformio.org/) (issue #181) +* Fixed `JsonVariant::is()` that was incorrectly returning false (issue #214) + +v5.0.7 +------ + +* Made library easier to use from a CMake project: simply `add_subdirectory(ArduinoJson/src)` +* Changed `String` to be a `typedef` of `std::string` (issues #142 and #161) + +> ### BREAKING CHANGES :warning: +> +> - `JsonVariant(true).as()` now returns `"true"` instead of `"1"` +> - `JsonVariant(false).as()` now returns `"false"` instead of `"0"` + +v5.0.6 +------ + +* Added parameter to `DynamicJsonBuffer` constructor to set initial size (issue #152) +* Fixed warning about library category in Arduino 1.6.6 (issue #147) +* Examples: Added a loop to wait for serial port to be ready (issue #156) + +v5.0.5 +------ + +* Added overload `JsonObjectSuscript::set(value, decimals)` (issue #143) +* Use `float` instead of `double` to reduce the size of `JsonVariant` (issue #134) + +v5.0.4 +------ + +* Fixed ambiguous overload with `JsonArraySubscript` and `JsonObjectSubscript` (issue #122) + +v5.0.3 +------ + +* Fixed `printTo(String)` which wrote numbers instead of strings (issue #120) +* Fixed return type of `JsonArray::is()` and some others (issue #121) + +v5.0.2 +------ + +* Fixed segmentation fault in `parseObject(String)` and `parseArray(String)`, when the + `StaticJsonBuffer` is too small to hold a copy of the string +* Fixed Clang warning "register specifier is deprecated" (issue #102) +* Fixed GCC warning "declaration shadows a member" (issue #103) +* Fixed memory alignment, which made ESP8266 crash (issue #104) +* Fixed compilation on Visual Studio 2010 and 2012 (issue #107) + +v5.0.1 +------ + +* Fixed compilation with Arduino 1.0.6 (issue #99) + +v5.0.0 +------ + +* Added support of `String` class (issues #55, #56, #70, #77) +* Added `JsonBuffer::strdup()` to make a copy of a string (issues #10, #57) +* Implicitly call `strdup()` for `String` but not for `char*` (issues #84, #87) +* Added support of non standard JSON input (issue #44) +* Added support of comments in JSON input (issue #88) +* Added implicit cast between numerical types (issues #64, #69, #93) +* Added ability to read number values as string (issue #90) +* Redesigned `JsonVariant` to leverage converting constructors instead of assignment operators (issue #66) +* Switched to new the library layout (requires Arduino 1.0.6 or above) + +> ### BREAKING CHANGES :warning: +> +> - `JsonObject::add()` was renamed to `set()` +> - `JsonArray::at()` and `JsonObject::at()` were renamed to `get()` +> - Number of digits of floating point value are now set with `double_with_n_digits()` + +**Personal note about the `String` class**: +Support of the `String` class has been added to the library because many people use it in their programs. +However, you should not see this as an invitation to use the `String` class. +The `String` class is **bad** because it uses dynamic memory allocation. +Compared to static allocation, it compiles to a bigger, slower program, and is less predictable. +You certainly don't want that in an embedded environment! + +v4.6 +---- + +* Fixed segmentation fault in `DynamicJsonBuffer` when memory allocation fails (issue #92) + +v4.5 +---- + +* Fixed buffer overflow when input contains a backslash followed by a terminator (issue #81) + +**Upgrading is recommended** since previous versions contain a potential security risk. + +Special thanks to [Giancarlo Canales Barreto](https://github.com/gcanalesb) for finding this nasty bug. + +v4.4 +---- + +* Added `JsonArray::measureLength()` and `JsonObject::measureLength()` (issue #75) + +v4.3 +---- + +* Added `JsonArray::removeAt()` to remove an element of an array (issue #58) +* Fixed stack-overflow in `DynamicJsonBuffer` when parsing huge JSON files (issue #65) +* Fixed wrong return value of `parseArray()` and `parseObject()` when allocation fails (issue #68) + +v4.2 +---- + +* Switched back to old library layout (issues #39, #43 and #45) +* Removed global new operator overload (issue #40, #45 and #46) +* Added an example with EthernetServer + +v4.1 +---- + +* Added DynamicJsonBuffer (issue #19) + +v4.0 +---- + +* Unified parser and generator API (issue #23) +* Updated library layout, now requires Arduino 1.0.6 or newer + +> ### BREAKING CHANGES :warning: +> +> API changed significantly since v3, see [Migrating code to the new API](https://arduinojson.org/doc/migration/). + diff --git a/printermonitor/libs/ArduinoJson/CMakeLists.txt b/printermonitor/libs/ArduinoJson/CMakeLists.txt new file mode 100644 index 0000000..66c565b --- /dev/null +++ b/printermonitor/libs/ArduinoJson/CMakeLists.txt @@ -0,0 +1,16 @@ +# ArduinoJson - arduinojson.org +# Copyright Benoit Blanchon 2014-2018 +# MIT License + +cmake_minimum_required(VERSION 3.0) +project(ArduinoJson) + +enable_testing() + +if(${COVERAGE}) + set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage") +endif() + +include_directories(${CMAKE_CURRENT_LIST_DIR}/src) +add_subdirectory(third-party/catch) +add_subdirectory(test) diff --git a/printermonitor/libs/ArduinoJson/CONTRIBUTING.md b/printermonitor/libs/ArduinoJson/CONTRIBUTING.md new file mode 100644 index 0000000..5d4b96c --- /dev/null +++ b/printermonitor/libs/ArduinoJson/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# Contribution to ArduinoJson + +First, thank you for taking the time to contribute to this project. + +You can submit changes via GitHub Pull Requests. + +Please: + +1. Unit test every change in behavior +2. Use clang-format in "file" mode to format the code +3. Consider using the Continuous Integration (Travis and AppVeyor) diff --git a/printermonitor/libs/ArduinoJson/LICENSE.md b/printermonitor/libs/ArduinoJson/LICENSE.md new file mode 100644 index 0000000..247c508 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/LICENSE.md @@ -0,0 +1,10 @@ +The MIT License (MIT) +--------------------- + +Copyright © 2014-2018 Benoit BLANCHON + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/printermonitor/libs/ArduinoJson/README.md b/printermonitor/libs/ArduinoJson/README.md new file mode 100644 index 0000000..f9e08ff --- /dev/null +++ b/printermonitor/libs/ArduinoJson/README.md @@ -0,0 +1,110 @@ +![ArduinoJson](banner.svg) + +--- + +[![Build status](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/master?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/master) [![Build Status](https://travis-ci.org/bblanchon/ArduinoJson.svg?branch=master)](https://travis-ci.org/bblanchon/ArduinoJson) [![Coverage Status](https://img.shields.io/coveralls/bblanchon/ArduinoJson.svg)](https://coveralls.io/r/bblanchon/ArduinoJson?branch=master) [![Star this project](http://githubbadges.com/star.svg?user=bblanchon&repo=ArduinoJson&style=flat&color=fff&background=007ec6)](https://github.com/bblanchon/ArduinoJson) + +ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things). + +## Features + +* JSON decoding (comments are supported) +* JSON encoding (with optional indentation) +* Elegant API, easy to use +* Fixed memory allocation (zero malloc) +* No data duplication (zero copy) +* Portable (written in C++98, can be used in any C++ project) +* Self-contained (no external dependency) +* Small footprint +* Input and output streams +* [100% code coverage](https://coveralls.io/github/bblanchon/ArduinoJson) +* [Header-only library](https://en.wikipedia.org/wiki/Header-only) +* [MIT License](https://en.wikipedia.org/wiki/MIT_License) +* [Comprehensive documentation](https://arduinojson.org?utm_source=github&utm_medium=readme) + +## Compatibility + +ArduinoJson works on the following hardware: + +* Arduino boards: [Uno](https://www.arduino.cc/en/Main/ArduinoBoardUno), [Due](https://www.arduino.cc/en/Main/ArduinoBoardDue), [Mini](https://www.arduino.cc/en/Main/ArduinoBoardMini), [Micro](https://www.arduino.cc/en/Main/ArduinoBoardMicro), [Yun](https://www.arduino.cc/en/Main/ArduinoBoardYun)... +* Espressif chips: [ESP8266](https://en.wikipedia.org/wiki/ESP8266), [ESP32](https://en.wikipedia.org/wiki/ESP32) +* WeMos boards: [D1](https://wiki.wemos.cc/products:d1:d1), [D1 mini](https://wiki.wemos.cc/products:d1:d1_mini), ... +* RedBearLab boards: [BLE Nano](http://redbearlab.com/blenano/), [BLE Mini](http://redbearlab.com/blemini/), [WiFi Micro](https://redbear.cc/product/wifi/wifi-micro.html), [LOLIN32](https://wiki.wemos.cc/products:lolin32:lolin32)... +* [Teensy](https://www.pjrc.com/teensy/) boards +* Intel boards: Edison, Galileo... +* Particle boards: [Photon](https://www.particle.io/products/hardware/photon-wifi-dev-kit), [Electron](https://www.particle.io/products/hardware/electron-cellular-dev-kit)... +* Texas Instruments boards: [MSP430](http://www.ti.com/microcontrollers/msp430-ultra-low-power-mcus/overview/overview.html)... + +ArduinoJson compiles with zero warning on the following compilers, IDEs, and platforms: + +* [Arduino IDE](https://www.arduino.cc/en/Main/Software) +* [PlatformIO](http://platformio.org/) +* [Energia](http://energia.nu/) +* [Visual Micro](http://www.visualmicro.com/) +* [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/) +* [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/) +* [Atollic TrueSTUDIO](https://atollic.com/truestudio/) +* [Keil uVision](http://www.keil.com/) +* [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide) +* [GCC](https://gcc.gnu.org/) +* [Clang](https://clang.llvm.org/) +* [Visual Studio](https://www.visualstudio.com/) + +## Quickstart + +### Deserialization + +Here is a program that parses a JSON document with ArduinoJson. + +```c++ +char json[] = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}"; + +StaticJsonBuffer<200> jsonBuffer; + +JsonObject& root = jsonBuffer.parseObject(json); + +const char* sensor = root["sensor"]; +long time = root["time"]; +double latitude = root["data"][0]; +double longitude = root["data"][1]; +``` + +See the [tutorial on arduinojson.org](https://arduinojson.org/doc/decoding/?utm_source=github&utm_medium=readme) + +### Serialization + +Here is a program that generates a JSON document with ArduinoJson: + +```c++ +StaticJsonBuffer<200> jsonBuffer; + +JsonObject& root = jsonBuffer.createObject(); +root["sensor"] = "gps"; +root["time"] = 1351824120; + +JsonArray& data = root.createNestedArray("data"); +data.add(48.756080); +data.add(2.302038); + +root.printTo(Serial); +// This prints: +// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]} +``` + +See the [tutorial on arduinojson.org](https://arduinojson.org/doc/encoding/?utm_source=github&utm_medium=readme) + +## Documentation + +The documentation is available on [arduinojson.org](https://arduinojson.org/?utm_source=github&utm_medium=readme), here are some shortcuts: + +* The [Examples](https://arduinojson.org/example/?utm_source=github&utm_medium=readme) show how to use the library in various situations. +* The [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=readme) contains the description of each class and function. +* The [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=readme) has the answer to virtually every question. +* The [ArduinoJson Assistant](https://arduinojson.org/assistant/?utm_source=github&utm_medium=readme) writes programs for you! + +--- + +Do you like this library? Please [star this project on GitHub](https://github.com/bblanchon/ArduinoJson/stargazers)! + +What? You don't like it but you *love* it? +We don't take donations anymore, but [we sell a book](https://arduinojson.org/book/?utm_source=github&utm_medium=readme), so you can help and learn at the same time! \ No newline at end of file diff --git a/printermonitor/libs/ArduinoJson/SUPPORT.md b/printermonitor/libs/ArduinoJson/SUPPORT.md new file mode 100644 index 0000000..c47e1b1 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/SUPPORT.md @@ -0,0 +1,27 @@ +# ArduinoJson Support + +First off, thank you very much for using ArduinoJson. + +We'll be very happy to help you, but first please read the following. + +## Before asking for help + +1. Read the [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=support) +2. Search in the [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=support) + +If you did not find the answer, please create a [new issue on GitHub](https://github.com/bblanchon/ArduinoJson/issues/new). + +It is OK to add a comment to a currently opened issue, but please avoid adding comments to a closed issue. + +## Before hitting the Submit button + +Please provide all the relevant information: + +* Good title +* Short description of the problem +* Target platform +* Compiler model and version +* [MVCE](https://stackoverflow.com/help/mcve) +* Compiler output + +Good questions get fast answers! diff --git a/printermonitor/libs/ArduinoJson/appveyor.yml b/printermonitor/libs/ArduinoJson/appveyor.yml new file mode 100644 index 0000000..f5d79b1 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/appveyor.yml @@ -0,0 +1,20 @@ +version: 5.13.1.{build} +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + CMAKE_GENERATOR: Visual Studio 15 2017 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + CMAKE_GENERATOR: Visual Studio 14 2015 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + CMAKE_GENERATOR: Visual Studio 12 2013 + - CMAKE_GENERATOR: Visual Studio 11 2012 + - CMAKE_GENERATOR: Visual Studio 10 2010 + - CMAKE_GENERATOR: MinGW Makefiles +configuration: Debug +before_build: +- set PATH=C:\MinGW\bin;%PATH:C:\Program Files\Git\usr\bin;=% # Workaround for CMake not wanting sh.exe on PATH for MinGW +- cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -G "%CMAKE_GENERATOR%" . +build_script: +- cmake --build . --config %CONFIGURATION% +test_script: +- ctest --output-on-failure . diff --git a/printermonitor/libs/ArduinoJson/banner.svg b/printermonitor/libs/ArduinoJson/banner.svg new file mode 100644 index 0000000..5176096 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/banner.svg @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/printermonitor/libs/ArduinoJson/keywords.txt b/printermonitor/libs/ArduinoJson/keywords.txt new file mode 100644 index 0000000..833cddb --- /dev/null +++ b/printermonitor/libs/ArduinoJson/keywords.txt @@ -0,0 +1,15 @@ +JsonArray KEYWORD1 +JsonObject KEYWORD1 +JsonVariant KEYWORD1 +StaticJsonBuffer KEYWORD1 +DynamicJsonBuffer KEYWORD1 +add KEYWORD2 +createArray KEYWORD2 +createNestedArray KEYWORD2 +createNestedObject KEYWORD2 +createObject KEYWORD2 +parseArray KEYWORD2 +parseObject KEYWORD2 +prettyPrintTo KEYWORD2 +printTo KEYWORD2 +success KEYWORD2 diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson.h b/printermonitor/libs/ArduinoJson/src/ArduinoJson.h new file mode 100644 index 0000000..3782aea --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson.h @@ -0,0 +1,17 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#ifdef __cplusplus + +#include "ArduinoJson.hpp" + +using namespace ArduinoJson; + +#else + +#error ArduinoJson requires a C++ compiler, please change file extension to .cc or .cpp + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson.hpp new file mode 100644 index 0000000..445a2c8 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson.hpp @@ -0,0 +1,17 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "ArduinoJson/DynamicJsonBuffer.hpp" +#include "ArduinoJson/JsonArray.hpp" +#include "ArduinoJson/JsonObject.hpp" +#include "ArduinoJson/StaticJsonBuffer.hpp" + +#include "ArduinoJson/Deserialization/JsonParserImpl.hpp" +#include "ArduinoJson/JsonArrayImpl.hpp" +#include "ArduinoJson/JsonBufferImpl.hpp" +#include "ArduinoJson/JsonObjectImpl.hpp" +#include "ArduinoJson/JsonVariantImpl.hpp" +#include "ArduinoJson/Serialization/JsonSerializerImpl.hpp" diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Configuration.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Configuration.hpp new file mode 100644 index 0000000..82483ad --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Configuration.hpp @@ -0,0 +1,151 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +// Small or big machine? +#ifndef ARDUINOJSON_EMBEDDED_MODE +#if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \ + defined(__ARMCC_VERSION) +#define ARDUINOJSON_EMBEDDED_MODE 1 +#else +#define ARDUINOJSON_EMBEDDED_MODE 0 +#endif +#endif + +#if ARDUINOJSON_EMBEDDED_MODE + +// Store floats by default to reduce the memory usage (issue #134) +#ifndef ARDUINOJSON_USE_DOUBLE +#define ARDUINOJSON_USE_DOUBLE 0 +#endif + +// Store longs by default, because they usually match the size of a float. +#ifndef ARDUINOJSON_USE_LONG_LONG +#define ARDUINOJSON_USE_LONG_LONG 0 +#endif +#ifndef ARDUINOJSON_USE_INT64 +#define ARDUINOJSON_USE_INT64 0 +#endif + +// Embedded systems usually don't have std::string +#ifndef ARDUINOJSON_ENABLE_STD_STRING +#define ARDUINOJSON_ENABLE_STD_STRING 0 +#endif + +// Embedded systems usually don't have std::stream +#ifndef ARDUINOJSON_ENABLE_STD_STREAM +#define ARDUINOJSON_ENABLE_STD_STREAM 0 +#endif + +// Limit nesting as the stack is likely to be small +#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT +#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10 +#endif + +#else // ARDUINOJSON_EMBEDDED_MODE + +// On a computer we have plenty of memory so we can use doubles +#ifndef ARDUINOJSON_USE_DOUBLE +#define ARDUINOJSON_USE_DOUBLE 1 +#endif + +// Use long long when available +#ifndef ARDUINOJSON_USE_LONG_LONG +#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) +#define ARDUINOJSON_USE_LONG_LONG 1 +#else +#define ARDUINOJSON_USE_LONG_LONG 0 +#endif +#endif + +// Use _int64 on old versions of Visual Studio +#ifndef ARDUINOJSON_USE_INT64 +#if defined(_MSC_VER) && _MSC_VER <= 1700 +#define ARDUINOJSON_USE_INT64 1 +#else +#define ARDUINOJSON_USE_INT64 0 +#endif +#endif + +// On a computer, we can use std::string +#ifndef ARDUINOJSON_ENABLE_STD_STRING +#define ARDUINOJSON_ENABLE_STD_STRING 1 +#endif + +// On a computer, we can assume std::stream +#ifndef ARDUINOJSON_ENABLE_STD_STREAM +#define ARDUINOJSON_ENABLE_STD_STREAM 1 +#endif + +// On a computer, the stack is large so we can increase nesting limit +#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT +#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50 +#endif + +#endif // ARDUINOJSON_EMBEDDED_MODE + +#ifdef ARDUINO + +// Enable support for Arduino String +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 +#endif + +// Enable support for Arduino Stream +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM +#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1 +#endif + +#else // ARDUINO + +// Disable support for Arduino String +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 +#endif + +// Disable support for Arduino Stream +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM +#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0 +#endif + +#endif // ARDUINO + +#ifndef ARDUINOJSON_ENABLE_PROGMEM +#ifdef PROGMEM +#define ARDUINOJSON_ENABLE_PROGMEM 1 +#else +#define ARDUINOJSON_ENABLE_PROGMEM 0 +#endif +#endif + +#ifndef ARDUINOJSON_ENABLE_ALIGNMENT +#ifdef ARDUINO_ARCH_AVR +// alignment isn't needed for 8-bit AVR +#define ARDUINOJSON_ENABLE_ALIGNMENT 0 +#else +// but most processors need pointers to be align on word size +#define ARDUINOJSON_ENABLE_ALIGNMENT 1 +#endif +#endif + +// Enable deprecated functions by default +#ifndef ARDUINOJSON_ENABLE_DEPRECATED +#define ARDUINOJSON_ENABLE_DEPRECATED 1 +#endif + +// Control the exponentiation threshold for big numbers +// CAUTION: cannot be more that 1e9 !!!! +#ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD +#define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7 +#endif + +// Control the exponentiation threshold for small numbers +#ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD +#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5 +#endif + +#if ARDUINOJSON_USE_LONG_LONG && ARDUINOJSON_USE_INT64 +#error ARDUINOJSON_USE_LONG_LONG and ARDUINOJSON_USE_INT64 cannot be set together +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp new file mode 100644 index 0000000..a0efa2c --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/Encoding.hpp @@ -0,0 +1,37 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +class Encoding { + public: + // Optimized for code size on a 8-bit AVR + static char escapeChar(char c) { + const char *p = escapeTable(false); + while (p[0] && p[1] != c) { + p += 2; + } + return p[0]; + } + + // Optimized for code size on a 8-bit AVR + static char unescapeChar(char c) { + const char *p = escapeTable(true); + for (;;) { + if (p[0] == '\0') return c; + if (p[0] == c) return p[1]; + p += 2; + } + } + + private: + static const char *escapeTable(bool excludeIdenticals) { + return &"\"\"\\\\b\bf\fn\nr\rt\t"[excludeIdenticals ? 4 : 0]; + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp new file mode 100644 index 0000000..443aae4 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonBufferAllocated.hpp @@ -0,0 +1,22 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../JsonBuffer.hpp" + +namespace ArduinoJson { +namespace Internals { + +class JsonBufferAllocated { + public: + void *operator new(size_t n, JsonBuffer *jsonBuffer) throw() { + if (!jsonBuffer) return NULL; + return jsonBuffer->alloc(n); + } + + void operator delete(void *, JsonBuffer *)throw(); +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp new file mode 100644 index 0000000..0ed4214 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonFloat.hpp @@ -0,0 +1,18 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" + +namespace ArduinoJson { +namespace Internals { + +#if ARDUINOJSON_USE_DOUBLE +typedef double JsonFloat; +#else +typedef float JsonFloat; +#endif +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp new file mode 100644 index 0000000..c8ddd00 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonInteger.hpp @@ -0,0 +1,23 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" + +namespace ArduinoJson { +namespace Internals { + +#if ARDUINOJSON_USE_LONG_LONG +typedef long long JsonInteger; +typedef unsigned long long JsonUInt; +#elif ARDUINOJSON_USE_INT64 +typedef __int64 JsonInteger; +typedef unsigned _int64 JsonUInt; +#else +typedef long JsonInteger; +typedef unsigned long JsonUInt; +#endif +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp new file mode 100644 index 0000000..8f202c5 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantAs.hpp @@ -0,0 +1,42 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A metafunction that returns the type of the value returned by +// JsonVariant::as() +template +struct JsonVariantAs { + typedef T type; +}; + +template <> +struct JsonVariantAs { + typedef const char* type; +}; + +template <> +struct JsonVariantAs { + typedef JsonArray& type; +}; + +template <> +struct JsonVariantAs { + typedef const JsonArray& type; +}; + +template <> +struct JsonVariantAs { + typedef JsonObject& type; +}; + +template <> +struct JsonVariantAs { + typedef const JsonObject& type; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp new file mode 100644 index 0000000..c525a60 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantContent.hpp @@ -0,0 +1,27 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonFloat.hpp" +#include "JsonInteger.hpp" + +namespace ArduinoJson { + +// Forward declarations +class JsonArray; +class JsonObject; + +namespace Internals { +// A union that defines the actual content of a JsonVariant. +// The enum JsonVariantType determines which member is in use. +union JsonVariantContent { + JsonFloat asFloat; // used for double and float + JsonUInt asInteger; // used for bool, char, short, int and longs + const char* asString; // asString can be null + JsonArray* asArray; // asArray cannot be null + JsonObject* asObject; // asObject cannot be null +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp new file mode 100644 index 0000000..57ecc83 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantDefault.hpp @@ -0,0 +1,23 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +template +struct JsonVariantDefault { + static T get() { + return T(); + } +}; + +template +struct JsonVariantDefault : JsonVariantDefault {}; + +template +struct JsonVariantDefault : JsonVariantDefault {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp new file mode 100644 index 0000000..21f890e --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/JsonVariantType.hpp @@ -0,0 +1,27 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +class JsonArray; +class JsonObject; + +namespace Internals { + +// Enumerated type to know the current type of a JsonVariant. +// The value determines which member of JsonVariantContent is used. +enum JsonVariantType { + JSON_UNDEFINED, // JsonVariant has not been initialized + JSON_UNPARSED, // JsonVariant contains an unparsed string + JSON_STRING, // JsonVariant stores a const char* + JSON_BOOLEAN, // JsonVariant stores a bool + JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt + JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated + JSON_ARRAY, // JsonVariant stores a pointer to a JsonArray + JSON_OBJECT, // JsonVariant stores a pointer to a JsonObject + JSON_FLOAT // JsonVariant stores a JsonFloat +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/List.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/List.hpp new file mode 100644 index 0000000..506308c --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/List.hpp @@ -0,0 +1,94 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../JsonBuffer.hpp" +#include "ListConstIterator.hpp" +#include "ListIterator.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A singly linked list of T. +// The linked list is composed of ListNode. +// It is derived by JsonArray and JsonObject +template +class List { + public: + typedef T value_type; + typedef ListNode node_type; + typedef ListIterator iterator; + typedef ListConstIterator const_iterator; + + // Creates an empty List attached to a JsonBuffer. + // The JsonBuffer allows to allocate new nodes. + // When buffer is NULL, the List is not able to grow and success() returns + // false. This is used to identify bad memory allocations and parsing + // failures. + explicit List(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {} + + // Returns true if the object is valid + // Would return false in the following situation: + // - the memory allocation failed (StaticJsonBuffer was too small) + // - the JSON parsing failed + bool success() const { + return _buffer != NULL; + } + + // Returns the numbers of elements in the list. + // For a JsonObject, it would return the number of key-value pairs + size_t size() const { + size_t nodeCount = 0; + for (node_type *node = _firstNode; node; node = node->next) nodeCount++; + return nodeCount; + } + + iterator add() { + node_type *newNode = new (_buffer) node_type(); + + if (_firstNode) { + node_type *lastNode = _firstNode; + while (lastNode->next) lastNode = lastNode->next; + lastNode->next = newNode; + } else { + _firstNode = newNode; + } + + return iterator(newNode); + } + + iterator begin() { + return iterator(_firstNode); + } + iterator end() { + return iterator(NULL); + } + + const_iterator begin() const { + return const_iterator(_firstNode); + } + const_iterator end() const { + return const_iterator(NULL); + } + + void remove(iterator it) { + node_type *nodeToRemove = it._node; + if (!nodeToRemove) return; + if (nodeToRemove == _firstNode) { + _firstNode = nodeToRemove->next; + } else { + for (node_type *node = _firstNode; node; node = node->next) + if (node->next == nodeToRemove) node->next = nodeToRemove->next; + } + } + + protected: + JsonBuffer *_buffer; + + private: + node_type *_firstNode; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp new file mode 100644 index 0000000..a6af685 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListConstIterator.hpp @@ -0,0 +1,50 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "ListNode.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A read-only forward itertor for List +template +class ListConstIterator { + public: + explicit ListConstIterator(const ListNode *node = NULL) : _node(node) {} + + const T &operator*() const { + return _node->content; + } + const T *operator->() { + return &_node->content; + } + + bool operator==(const ListConstIterator &other) const { + return _node == other._node; + } + + bool operator!=(const ListConstIterator &other) const { + return _node != other._node; + } + + ListConstIterator &operator++() { + if (_node) _node = _node->next; + return *this; + } + + ListConstIterator &operator+=(size_t distance) { + while (_node && distance) { + _node = _node->next; + --distance; + } + return *this; + } + + private: + const ListNode *_node; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp new file mode 100644 index 0000000..01fa287 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListIterator.hpp @@ -0,0 +1,60 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "ListConstIterator.hpp" +#include "ListNode.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +class List; + +// A read-write forward iterator for List +template +class ListIterator { + friend class List; + + public: + explicit ListIterator(ListNode *node = NULL) : _node(node) {} + + T &operator*() const { + return _node->content; + } + T *operator->() { + return &_node->content; + } + + bool operator==(const ListIterator &other) const { + return _node == other._node; + } + + bool operator!=(const ListIterator &other) const { + return _node != other._node; + } + + ListIterator &operator++() { + if (_node) _node = _node->next; + return *this; + } + + ListIterator &operator+=(size_t distance) { + while (_node && distance) { + _node = _node->next; + --distance; + } + return *this; + } + + operator ListConstIterator() const { + return ListConstIterator(_node); + } + + private: + ListNode *_node; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp new file mode 100644 index 0000000..c090712 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ListNode.hpp @@ -0,0 +1,24 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include // for NULL + +#include "JsonBufferAllocated.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A node for a singly-linked list. +// Used by List and its iterators. +template +struct ListNode : public Internals::JsonBufferAllocated { + ListNode() throw() : next(NULL) {} + + ListNode *next; + T content; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp new file mode 100644 index 0000000..73f3d8e --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/NonCopyable.hpp @@ -0,0 +1,23 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A type that cannot be copied +class NonCopyable { + protected: + NonCopyable() {} + + private: + // copy constructor is private + NonCopyable(const NonCopyable&); + + // copy operator is private + NonCopyable& operator=(const NonCopyable&); +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp new file mode 100644 index 0000000..1e49117 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ReferenceType.hpp @@ -0,0 +1,24 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A type that is meant to be used by reference only (JsonArray and JsonObject) +class ReferenceType { + public: + bool operator==(const ReferenceType& other) const { + // two JsonArray are equal if they are the same instance + // (we don't compare the content) + return this == &other; + } + + bool operator!=(const ReferenceType& other) const { + return this != &other; + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp new file mode 100644 index 0000000..9750f1a --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Data/ValueSaver.hpp @@ -0,0 +1,52 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../JsonBuffer.hpp" +#include "../JsonVariant.hpp" +#include "../StringTraits/StringTraits.hpp" +#include "../TypeTraits/EnableIf.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +struct ValueSaver { + template + static bool save(JsonBuffer*, Destination& destination, Source source) { + destination = source; + return true; + } +}; + +template +struct ValueSaver< + Source, typename EnableIf::should_duplicate>::type> { + template + static bool save(JsonBuffer* buffer, Destination& dest, Source source) { + if (!StringTraits::is_null(source)) { + typename StringTraits::duplicate_t dup = + StringTraits::duplicate(source, buffer); + if (!dup) return false; + dest = dup; + } else { + dest = reinterpret_cast(0); + } + return true; + } +}; + +// const char*, const signed char*, const unsigned char* +template +struct ValueSaver< + Char*, typename EnableIf::should_duplicate>::type> { + template + static bool save(JsonBuffer*, Destination& dest, Char* source) { + dest = reinterpret_cast(source); + return true; + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp new file mode 100644 index 0000000..c2c48eb --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/Comments.hpp @@ -0,0 +1,61 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { +template +void skipSpacesAndComments(TInput& input) { + for (;;) { + switch (input.current()) { + // spaces + case ' ': + case '\t': + case '\r': + case '\n': + input.move(); + continue; + + // comments + case '/': + switch (input.next()) { + // C-style block comment + case '*': + input.move(); // skip '/' + // no need to skip '*' + for (;;) { + input.move(); + if (input.current() == '\0') return; + if (input.current() == '*' && input.next() == '/') { + input.move(); // skip '*' + input.move(); // skip '/' + break; + } + } + break; + + // C++-style line comment + case '/': + // not need to skip "//" + for (;;) { + input.move(); + if (input.current() == '\0') return; + if (input.current() == '\n') break; + } + break; + + // not a comment, just a '/' + default: + return; + } + break; + + default: + return; + } + } +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp new file mode 100644 index 0000000..c348e75 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParser.hpp @@ -0,0 +1,103 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../JsonBuffer.hpp" +#include "../JsonVariant.hpp" +#include "../TypeTraits/IsConst.hpp" +#include "StringWriter.hpp" + +namespace ArduinoJson { +namespace Internals { + +// Parse JSON string to create JsonArrays and JsonObjects +// This internal class is not indended to be used directly. +// Instead, use JsonBuffer.parseArray() or .parseObject() +template +class JsonParser { + public: + JsonParser(JsonBuffer *buffer, TReader reader, TWriter writer, + uint8_t nestingLimit) + : _buffer(buffer), + _reader(reader), + _writer(writer), + _nestingLimit(nestingLimit) {} + + JsonArray &parseArray(); + JsonObject &parseObject(); + + JsonVariant parseVariant() { + JsonVariant result; + parseAnythingTo(&result); + return result; + } + + private: + JsonParser &operator=(const JsonParser &); // non-copiable + + static bool eat(TReader &, char charToSkip); + FORCE_INLINE bool eat(char charToSkip) { + return eat(_reader, charToSkip); + } + + const char *parseString(); + bool parseAnythingTo(JsonVariant *destination); + FORCE_INLINE bool parseAnythingToUnsafe(JsonVariant *destination); + + inline bool parseArrayTo(JsonVariant *destination); + inline bool parseObjectTo(JsonVariant *destination); + inline bool parseStringTo(JsonVariant *destination); + + static inline bool isBetween(char c, char min, char max) { + return min <= c && c <= max; + } + + static inline bool canBeInNonQuotedString(char c) { + return isBetween(c, '0', '9') || isBetween(c, '_', 'z') || + isBetween(c, 'A', 'Z') || c == '+' || c == '-' || c == '.'; + } + + static inline bool isQuote(char c) { + return c == '\'' || c == '\"'; + } + + JsonBuffer *_buffer; + TReader _reader; + TWriter _writer; + uint8_t _nestingLimit; +}; + +template +struct JsonParserBuilder { + typedef typename StringTraits::Reader InputReader; + typedef JsonParser TParser; + + static TParser makeParser(TJsonBuffer *buffer, TString &json, + uint8_t nestingLimit) { + return TParser(buffer, InputReader(json), *buffer, nestingLimit); + } +}; + +template +struct JsonParserBuilder::value>::type> { + typedef typename StringTraits::Reader TReader; + typedef StringWriter TWriter; + typedef JsonParser TParser; + + static TParser makeParser(TJsonBuffer *buffer, TChar *json, + uint8_t nestingLimit) { + return TParser(buffer, TReader(json), TWriter(json), nestingLimit); + } +}; + +template +inline typename JsonParserBuilder::TParser makeParser( + TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) { + return JsonParserBuilder::makeParser(buffer, json, + nestingLimit); +} +} // namespace Internals +} // namespace ArduinoJson diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp new file mode 100644 index 0000000..33ad42e --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/JsonParserImpl.hpp @@ -0,0 +1,192 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Comments.hpp" +#include "JsonParser.hpp" + +template +inline bool ArduinoJson::Internals::JsonParser::eat( + TReader &reader, char charToSkip) { + skipSpacesAndComments(reader); + if (reader.current() != charToSkip) return false; + reader.move(); + return true; +} + +template +inline bool +ArduinoJson::Internals::JsonParser::parseAnythingTo( + JsonVariant *destination) { + if (_nestingLimit == 0) return false; + _nestingLimit--; + bool success = parseAnythingToUnsafe(destination); + _nestingLimit++; + return success; +} + +template +inline bool +ArduinoJson::Internals::JsonParser::parseAnythingToUnsafe( + JsonVariant *destination) { + skipSpacesAndComments(_reader); + + switch (_reader.current()) { + case '[': + return parseArrayTo(destination); + + case '{': + return parseObjectTo(destination); + + default: + return parseStringTo(destination); + } +} + +template +inline ArduinoJson::JsonArray & +ArduinoJson::Internals::JsonParser::parseArray() { + // Create an empty array + JsonArray &array = _buffer->createArray(); + + // Check opening braket + if (!eat('[')) goto ERROR_MISSING_BRACKET; + if (eat(']')) goto SUCCESS_EMPTY_ARRAY; + + // Read each value + for (;;) { + // 1 - Parse value + JsonVariant value; + if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE; + if (!array.add(value)) goto ERROR_NO_MEMORY; + + // 2 - More values? + if (eat(']')) goto SUCCES_NON_EMPTY_ARRAY; + if (!eat(',')) goto ERROR_MISSING_COMMA; + } + +SUCCESS_EMPTY_ARRAY: +SUCCES_NON_EMPTY_ARRAY: + return array; + +ERROR_INVALID_VALUE: +ERROR_MISSING_BRACKET: +ERROR_MISSING_COMMA: +ERROR_NO_MEMORY: + return JsonArray::invalid(); +} + +template +inline bool ArduinoJson::Internals::JsonParser::parseArrayTo( + JsonVariant *destination) { + JsonArray &array = parseArray(); + if (!array.success()) return false; + + *destination = array; + return true; +} + +template +inline ArduinoJson::JsonObject & +ArduinoJson::Internals::JsonParser::parseObject() { + // Create an empty object + JsonObject &object = _buffer->createObject(); + + // Check opening brace + if (!eat('{')) goto ERROR_MISSING_BRACE; + if (eat('}')) goto SUCCESS_EMPTY_OBJECT; + + // Read each key value pair + for (;;) { + // 1 - Parse key + const char *key = parseString(); + if (!key) goto ERROR_INVALID_KEY; + if (!eat(':')) goto ERROR_MISSING_COLON; + + // 2 - Parse value + JsonVariant value; + if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE; + if (!object.set(key, value)) goto ERROR_NO_MEMORY; + + // 3 - More keys/values? + if (eat('}')) goto SUCCESS_NON_EMPTY_OBJECT; + if (!eat(',')) goto ERROR_MISSING_COMMA; + } + +SUCCESS_EMPTY_OBJECT: +SUCCESS_NON_EMPTY_OBJECT: + return object; + +ERROR_INVALID_KEY: +ERROR_INVALID_VALUE: +ERROR_MISSING_BRACE: +ERROR_MISSING_COLON: +ERROR_MISSING_COMMA: +ERROR_NO_MEMORY: + return JsonObject::invalid(); +} + +template +inline bool ArduinoJson::Internals::JsonParser::parseObjectTo( + JsonVariant *destination) { + JsonObject &object = parseObject(); + if (!object.success()) return false; + + *destination = object; + return true; +} + +template +inline const char * +ArduinoJson::Internals::JsonParser::parseString() { + typename RemoveReference::type::String str = _writer.startString(); + + skipSpacesAndComments(_reader); + char c = _reader.current(); + + if (isQuote(c)) { // quotes + _reader.move(); + char stopChar = c; + for (;;) { + c = _reader.current(); + if (c == '\0') break; + _reader.move(); + + if (c == stopChar) break; + + if (c == '\\') { + // replace char + c = Encoding::unescapeChar(_reader.current()); + if (c == '\0') break; + _reader.move(); + } + + str.append(c); + } + } else { // no quotes + for (;;) { + if (!canBeInNonQuotedString(c)) break; + _reader.move(); + str.append(c); + c = _reader.current(); + } + } + + return str.c_str(); +} + +template +inline bool ArduinoJson::Internals::JsonParser::parseStringTo( + JsonVariant *destination) { + bool hasQuotes = isQuote(_reader.current()); + const char *value = parseString(); + if (value == NULL) return false; + if (hasQuotes) { + *destination = value; + } else { + *destination = RawJson(value); + } + return true; +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp new file mode 100644 index 0000000..fd5507e --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Deserialization/StringWriter.hpp @@ -0,0 +1,41 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +template +class StringWriter { + public: + class String { + public: + String(TChar** ptr) : _writePtr(ptr), _startPtr(*ptr) {} + + void append(char c) { + *(*_writePtr)++ = TChar(c); + } + + const char* c_str() const { + *(*_writePtr)++ = 0; + return reinterpret_cast(_startPtr); + } + + private: + TChar** _writePtr; + TChar* _startPtr; + }; + + StringWriter(TChar* buffer) : _ptr(buffer) {} + + String startString() { + return String(&_ptr); + } + + private: + TChar* _ptr; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp new file mode 100644 index 0000000..bdbd5dd --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/DynamicJsonBuffer.hpp @@ -0,0 +1,170 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonBufferBase.hpp" + +#include + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-virtual-dtor" +#elif defined(__GNUC__) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +#endif + +namespace ArduinoJson { +namespace Internals { +class DefaultAllocator { + public: + void* allocate(size_t size) { + return malloc(size); + } + void deallocate(void* pointer) { + free(pointer); + } +}; + +template +class DynamicJsonBufferBase + : public JsonBufferBase > { + struct Block; + struct EmptyBlock { + Block* next; + size_t capacity; + size_t size; + }; + struct Block : EmptyBlock { + uint8_t data[1]; + }; + + public: + enum { EmptyBlockSize = sizeof(EmptyBlock) }; + + DynamicJsonBufferBase(size_t initialSize = 256) + : _head(NULL), _nextBlockCapacity(initialSize) {} + + ~DynamicJsonBufferBase() { + clear(); + } + + // Gets the number of bytes occupied in the buffer + size_t size() const { + size_t total = 0; + for (const Block* b = _head; b; b = b->next) total += b->size; + return total; + } + + // Allocates the specified amount of bytes in the buffer + virtual void* alloc(size_t bytes) { + alignNextAlloc(); + return canAllocInHead(bytes) ? allocInHead(bytes) : allocInNewBlock(bytes); + } + + // Resets the buffer. + // USE WITH CAUTION: this invalidates all previously allocated data + void clear() { + Block* currentBlock = _head; + while (currentBlock != NULL) { + _nextBlockCapacity = currentBlock->capacity; + Block* nextBlock = currentBlock->next; + _allocator.deallocate(currentBlock); + currentBlock = nextBlock; + } + _head = 0; + } + + class String { + public: + String(DynamicJsonBufferBase* parent) + : _parent(parent), _start(NULL), _length(0) {} + + void append(char c) { + if (_parent->canAllocInHead(1)) { + char* end = static_cast(_parent->allocInHead(1)); + *end = c; + if (_length == 0) _start = end; + } else { + char* newStart = + static_cast(_parent->allocInNewBlock(_length + 1)); + if (_start && newStart) memcpy(newStart, _start, _length); + if (newStart) newStart[_length] = c; + _start = newStart; + } + _length++; + } + + const char* c_str() { + append(0); + return _start; + } + + private: + DynamicJsonBufferBase* _parent; + char* _start; + size_t _length; + }; + + String startString() { + return String(this); + } + + private: + void alignNextAlloc() { + if (_head) _head->size = this->round_size_up(_head->size); + } + + bool canAllocInHead(size_t bytes) const { + return _head != NULL && _head->size + bytes <= _head->capacity; + } + + void* allocInHead(size_t bytes) { + void* p = _head->data + _head->size; + _head->size += bytes; + return p; + } + + void* allocInNewBlock(size_t bytes) { + size_t capacity = _nextBlockCapacity; + if (bytes > capacity) capacity = bytes; + if (!addNewBlock(capacity)) return NULL; + _nextBlockCapacity *= 2; + return allocInHead(bytes); + } + + bool addNewBlock(size_t capacity) { + size_t bytes = EmptyBlockSize + capacity; + Block* block = static_cast(_allocator.allocate(bytes)); + if (block == NULL) return false; + block->capacity = capacity; + block->size = 0; + block->next = _head; + _head = block; + return true; + } + + TAllocator _allocator; + Block* _head; + size_t _nextBlockCapacity; +}; +} + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic pop +#endif +#endif + +// Implements a JsonBuffer with dynamic memory allocation. +// You are strongly encouraged to consider using StaticJsonBuffer which is much +// more suitable for embedded systems. +typedef Internals::DynamicJsonBufferBase + DynamicJsonBuffer; +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArray.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArray.hpp new file mode 100644 index 0000000..2acd2a1 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArray.hpp @@ -0,0 +1,227 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonBufferAllocated.hpp" +#include "Data/List.hpp" +#include "Data/ReferenceType.hpp" +#include "Data/ValueSaver.hpp" +#include "JsonVariant.hpp" +#include "Serialization/JsonPrintable.hpp" +#include "StringTraits/StringTraits.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsArray.hpp" +#include "TypeTraits/IsFloatingPoint.hpp" +#include "TypeTraits/IsSame.hpp" + +// Returns the size (in bytes) of an array with n elements. +// Can be very handy to determine the size of a StaticJsonBuffer. +#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \ + (sizeof(JsonArray) + (NUMBER_OF_ELEMENTS) * sizeof(JsonArray::node_type)) + +namespace ArduinoJson { + +// Forward declarations +class JsonObject; +class JsonBuffer; +namespace Internals { +class JsonArraySubscript; +} + +// An array of JsonVariant. +// +// The constructor is private, instances must be created via +// JsonBuffer::createArray() or JsonBuffer::parseArray(). +// A JsonArray can be serialized to a JSON string via JsonArray::printTo(). +// It can also be deserialized from a JSON string via JsonBuffer::parseArray(). +class JsonArray : public Internals::JsonPrintable, + public Internals::ReferenceType, + public Internals::NonCopyable, + public Internals::List, + public Internals::JsonBufferAllocated { + public: + // Create an empty JsonArray attached to the specified JsonBuffer. + // You should not call this constructor directly. + // Instead, use JsonBuffer::createArray() or JsonBuffer::parseArray(). + explicit JsonArray(JsonBuffer *buffer) throw() + : Internals::List(buffer) {} + + // Gets the value at the specified index + const Internals::JsonArraySubscript operator[](size_t index) const; + + // Gets or sets the value at specified index + Internals::JsonArraySubscript operator[](size_t index); + + // Adds the specified value at the end of the array. + // + // bool add(TValue); + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + bool add(const T &value) { + return add_impl(value); + } + // + // bool add(TValue); + // TValue = char*, const char*, const FlashStringHelper* + template + bool add(T *value) { + return add_impl(value); + } + // + // bool add(TValue value, uint8_t decimals); + // TValue = float, double + template + DEPRECATED("Second argument is not supported anymore") + bool add(T value, uint8_t) { + return add_impl(JsonVariant(value)); + } + + // Sets the value at specified index. + // + // bool add(size_t index, const TValue&); + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + bool set(size_t index, const T &value) { + return set_impl(index, value); + } + // + // bool add(size_t index, TValue); + // TValue = char*, const char*, const FlashStringHelper* + template + bool set(size_t index, T *value) { + return set_impl(index, value); + } + // + // bool set(size_t index, TValue value, uint8_t decimals); + // TValue = float, double + template + typename Internals::EnableIf::value, bool>::type + set(size_t index, T value, uint8_t decimals) { + return set_impl(index, JsonVariant(value, decimals)); + } + + // Gets the value at the specified index. + template + typename Internals::JsonVariantAs::type get(size_t index) const { + const_iterator it = begin() += index; + return it != end() ? it->as() : Internals::JsonVariantDefault::get(); + } + + // Check the type of the value at specified index. + template + bool is(size_t index) const { + const_iterator it = begin() += index; + return it != end() ? it->is() : false; + } + + // Creates a JsonArray and adds a reference at the end of the array. + // It's a shortcut for JsonBuffer::createArray() and JsonArray::add() + JsonArray &createNestedArray(); + + // Creates a JsonObject and adds a reference at the end of the array. + // It's a shortcut for JsonBuffer::createObject() and JsonArray::add() + JsonObject &createNestedObject(); + + // Removes element at specified index. + void remove(size_t index) { + remove(begin() += index); + } + using Internals::List::remove; + + // Returns a reference an invalid JsonArray. + // This object is meant to replace a NULL pointer. + // This is used when memory allocation or JSON parsing fail. + static JsonArray &invalid() { + static JsonArray instance(NULL); + return instance; + } + + // Imports a 1D array + template + bool copyFrom(T (&array)[N]) { + return copyFrom(array, N); + } + + // Imports a 1D array + template + bool copyFrom(T *array, size_t len) { + bool ok = true; + for (size_t i = 0; i < len; i++) { + ok &= add(array[i]); + } + return ok; + } + + // Imports a 2D array + template + bool copyFrom(T (&array)[N1][N2]) { + bool ok = true; + for (size_t i = 0; i < N1; i++) { + JsonArray &nestedArray = createNestedArray(); + for (size_t j = 0; j < N2; j++) { + ok &= nestedArray.add(array[i][j]); + } + } + return ok; + } + + // Exports a 1D array + template + size_t copyTo(T (&array)[N]) const { + return copyTo(array, N); + } + + // Exports a 1D array + template + size_t copyTo(T *array, size_t len) const { + size_t i = 0; + for (const_iterator it = begin(); it != end() && i < len; ++it) + array[i++] = *it; + return i; + } + + // Exports a 2D array + template + void copyTo(T (&array)[N1][N2]) const { + size_t i = 0; + for (const_iterator it = begin(); it != end() && i < N1; ++it) { + it->as().copyTo(array[i++]); + } + } + +#if ARDUINOJSON_ENABLE_DEPRECATED + DEPRECATED("use remove() instead") + FORCE_INLINE void removeAt(size_t index) { + return remove(index); + } +#endif + + private: + template + bool set_impl(size_t index, TValueRef value) { + iterator it = begin() += index; + if (it == end()) return false; + return Internals::ValueSaver::save(_buffer, *it, value); + } + + template + bool add_impl(TValueRef value) { + iterator it = Internals::List::add(); + if (it == end()) return false; + return Internals::ValueSaver::save(_buffer, *it, value); + } +}; + +namespace Internals { +template <> +struct JsonVariantDefault { + static JsonArray &get() { + return JsonArray::invalid(); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp new file mode 100644 index 0000000..924b7ea --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArrayImpl.hpp @@ -0,0 +1,26 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonArray.hpp" +#include "JsonArraySubscript.hpp" +#include "JsonObject.hpp" + +namespace ArduinoJson { + +inline JsonArray &JsonArray::createNestedArray() { + if (!_buffer) return JsonArray::invalid(); + JsonArray &array = _buffer->createArray(); + add(array); + return array; +} + +inline JsonObject &JsonArray::createNestedObject() { + if (!_buffer) return JsonObject::invalid(); + JsonObject &object = _buffer->createObject(); + add(object); + return object; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp new file mode 100644 index 0000000..afb4dc1 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonArraySubscript.hpp @@ -0,0 +1,122 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Configuration.hpp" +#include "JsonVariantBase.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4522) +#endif + +namespace ArduinoJson { +namespace Internals { +class JsonArraySubscript : public JsonVariantBase { + public: + FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index) + : _array(array), _index(index) {} + + FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) { + _array.set(_index, src); + return *this; + } + + // Replaces the value + // + // operator=(const TValue&) + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + FORCE_INLINE JsonArraySubscript& operator=(const T& src) { + _array.set(_index, src); + return *this; + } + // + // operator=(TValue) + // TValue = char*, const char*, const FlashStringHelper* + template + FORCE_INLINE JsonArraySubscript& operator=(T* src) { + _array.set(_index, src); + return *this; + } + + FORCE_INLINE bool success() const { + return _index < _array.size(); + } + + template + FORCE_INLINE typename JsonVariantAs::type as() const { + return _array.get(_index); + } + + template + FORCE_INLINE bool is() const { + return _array.is(_index); + } + + // Replaces the value + // + // bool set(const TValue&) + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + FORCE_INLINE bool set(const TValue& value) { + return _array.set(_index, value); + } + // + // bool set(TValue) + // TValue = char*, const char*, const FlashStringHelper* + template + FORCE_INLINE bool set(TValue* value) { + return _array.set(_index, value); + } + // + // bool set(TValue, uint8_t decimals); + // TValue = float, double + template + DEPRECATED("Second argument is not supported anymore") + FORCE_INLINE bool set(const TValue& value, uint8_t) { + return _array.set(_index, value); + } + + private: + JsonArray& _array; + const size_t _index; +}; + +template +inline JsonArraySubscript JsonVariantSubscripts::operator[]( + size_t index) { + return impl()->template as()[index]; +} + +template +inline const JsonArraySubscript JsonVariantSubscripts::operator[]( + size_t index) const { + return impl()->template as()[index]; +} + +#if ARDUINOJSON_ENABLE_STD_STREAM +inline std::ostream& operator<<(std::ostream& os, + const JsonArraySubscript& source) { + return source.printTo(os); +} +#endif +} + +inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) { + return Internals::JsonArraySubscript(*this, index); +} + +inline const Internals::JsonArraySubscript JsonArray::operator[]( + size_t index) const { + return Internals::JsonArraySubscript(*const_cast(this), index); +} +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp new file mode 100644 index 0000000..26101e0 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBuffer.hpp @@ -0,0 +1,78 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include // for size_t +#include // for uint8_t +#include + +#include "Data/NonCopyable.hpp" +#include "JsonVariant.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsArray.hpp" + +namespace ArduinoJson { +class JsonArray; +class JsonObject; + +// Entry point for using the library. +// +// Handle the memory management (done in derived classes) and calls the parser. +// This abstract class is implemented by StaticJsonBuffer which implements a +// fixed memory allocation. +class JsonBuffer : Internals::NonCopyable { + public: + // Allocates an empty JsonArray. + // + // Returns a reference to the new JsonArray or JsonArray::invalid() if the + // allocation fails. + JsonArray &createArray(); + + // Allocates an empty JsonObject. + // + // Returns a reference to the new JsonObject or JsonObject::invalid() if the + // allocation fails. + JsonObject &createObject(); + + // Duplicates a string + // + // const char* strdup(TValue); + // TValue = const std::string&, const String&, + template + DEPRECATED("char* are duplicated, you don't need strdup() anymore") + typename Internals::EnableIf::value, + const char *>::type strdup(const TString &src) { + return Internals::StringTraits::duplicate(src, this); + } + // + // const char* strdup(TValue); + // TValue = char*, const char*, const FlashStringHelper* + template + DEPRECATED("char* are duplicated, you don't need strdup() anymore") + const char *strdup(TString *src) { + return Internals::StringTraits::duplicate(src, this); + } + + // Allocates n bytes in the JsonBuffer. + // Return a pointer to the allocated memory or NULL if allocation fails. + virtual void *alloc(size_t size) = 0; + + protected: + // CAUTION: NO VIRTUAL DESTRUCTOR! + // If we add a virtual constructor the Arduino compiler will add malloc() + // and free() to the binary, adding 706 useless bytes. + ~JsonBuffer() {} + + // Preserve aligment if necessary + static FORCE_INLINE size_t round_size_up(size_t bytes) { +#if ARDUINOJSON_ENABLE_ALIGNMENT + const size_t x = sizeof(void *) - 1; + return (bytes + x) & ~x; +#else + return bytes; +#endif + } +}; +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp new file mode 100644 index 0000000..1e771bf --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferBase.hpp @@ -0,0 +1,127 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Deserialization/JsonParser.hpp" + +namespace ArduinoJson { +namespace Internals { +template +class JsonBufferBase : public JsonBuffer { + public: + // Allocates and populate a JsonArray from a JSON string. + // + // The First argument is a pointer to the JSON string, the memory must be + // writable + // because the parser will insert null-terminators and replace escaped chars. + // + // The second argument set the nesting limit + // + // Returns a reference to the new JsonObject or JsonObject::invalid() if the + // allocation fails. + // With this overload, the JsonBuffer will make a copy of the string + // + // JsonArray& parseArray(TString); + // TString = const std::string&, const String& + template + typename Internals::EnableIf::value, + JsonArray &>::type + parseArray(const TString &json, + uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseArray(); + } + // + // JsonArray& parseArray(TString); + // TString = const char*, const char[N], const FlashStringHelper* + template + JsonArray &parseArray( + TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseArray(); + } + // + // JsonArray& parseArray(TString); + // TString = std::istream&, Stream& + template + JsonArray &parseArray( + TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseArray(); + } + + // Allocates and populate a JsonObject from a JSON string. + // + // The First argument is a pointer to the JSON string, the memory must be + // writable + // because the parser will insert null-terminators and replace escaped chars. + // + // The second argument set the nesting limit + // + // Returns a reference to the new JsonObject or JsonObject::invalid() if the + // allocation fails. + // + // JsonObject& parseObject(TString); + // TString = const std::string&, const String& + template + typename Internals::EnableIf::value, + JsonObject &>::type + parseObject(const TString &json, + uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseObject(); + } + // + // JsonObject& parseObject(TString); + // TString = const char*, const char[N], const FlashStringHelper* + template + JsonObject &parseObject( + TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseObject(); + } + // + // JsonObject& parseObject(TString); + // TString = std::istream&, Stream& + template + JsonObject &parseObject( + TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseObject(); + } + + // Generalized version of parseArray() and parseObject(), also works for + // integral types. + // + // JsonVariant parse(TString); + // TString = const std::string&, const String& + template + typename Internals::EnableIf::value, + JsonVariant>::type + parse(const TString &json, + uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseVariant(); + } + // + // JsonVariant parse(TString); + // TString = const char*, const char[N], const FlashStringHelper* + template + JsonVariant parse(TString *json, + uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseVariant(); + } + // + // JsonVariant parse(TString); + // TString = std::istream&, Stream& + template + JsonVariant parse(TString &json, + uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) { + return Internals::makeParser(that(), json, nestingLimit).parseVariant(); + } + + protected: + ~JsonBufferBase() {} + + private: + TDerived *that() { + return static_cast(this); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp new file mode 100644 index 0000000..cdea374 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonBufferImpl.hpp @@ -0,0 +1,17 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Deserialization/JsonParser.hpp" + +inline ArduinoJson::JsonArray &ArduinoJson::JsonBuffer::createArray() { + JsonArray *ptr = new (this) JsonArray(this); + return ptr ? *ptr : JsonArray::invalid(); +} + +inline ArduinoJson::JsonObject &ArduinoJson::JsonBuffer::createObject() { + JsonObject *ptr = new (this) JsonObject(this); + return ptr ? *ptr : JsonObject::invalid(); +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObject.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObject.hpp new file mode 100644 index 0000000..c03bfa5 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObject.hpp @@ -0,0 +1,322 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonBufferAllocated.hpp" +#include "Data/List.hpp" +#include "Data/ReferenceType.hpp" +#include "Data/ValueSaver.hpp" +#include "JsonPair.hpp" +#include "Serialization/JsonPrintable.hpp" +#include "StringTraits/StringTraits.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsArray.hpp" +#include "TypeTraits/IsFloatingPoint.hpp" +#include "TypeTraits/IsSame.hpp" + +// Returns the size (in bytes) of an object with n elements. +// Can be very handy to determine the size of a StaticJsonBuffer. +#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \ + (sizeof(JsonObject) + (NUMBER_OF_ELEMENTS) * sizeof(JsonObject::node_type)) + +namespace ArduinoJson { + +// Forward declarations +class JsonArray; +class JsonBuffer; +namespace Internals { +template +class JsonObjectSubscript; +} + +// A dictionary of JsonVariant indexed by string (char*) +// +// The constructor is private, instances must be created via +// JsonBuffer::createObject() or JsonBuffer::parseObject(). +// A JsonObject can be serialized to a JSON string via JsonObject::printTo(). +// It can also be deserialized from a JSON string via JsonBuffer::parseObject(). +class JsonObject : public Internals::JsonPrintable, + public Internals::ReferenceType, + public Internals::NonCopyable, + public Internals::List, + public Internals::JsonBufferAllocated { + public: + // Create an empty JsonArray attached to the specified JsonBuffer. + // You should not use this constructor directly. + // Instead, use JsonBuffer::createObject() or JsonBuffer.parseObject(). + explicit JsonObject(JsonBuffer* buffer) throw() + : Internals::List(buffer) {} + + // Gets or sets the value associated with the specified key. + // + // JsonObjectSubscript operator[](TKey) + // TKey = const std::string&, const String& + template + Internals::JsonObjectSubscript operator[]( + const TString& key) { + return Internals::JsonObjectSubscript(*this, key); + } + // + // JsonObjectSubscript operator[](TKey) + // TKey = char*, const char*, char[], const char[N], const FlashStringHelper* + template + Internals::JsonObjectSubscript operator[](TString* key) { + return Internals::JsonObjectSubscript(*this, key); + } + + // Gets the value associated with the specified key. + // + // const JsonObjectSubscript operator[](TKey) const; + // TKey = const std::string&, const String& + template + const Internals::JsonObjectSubscript operator[]( + const TString& key) const { + return Internals::JsonObjectSubscript( + *const_cast(this), key); + } + // + // const JsonObjectSubscript operator[](TKey) const; + // TKey = const char*, const char[N], const FlashStringHelper* + template + const Internals::JsonObjectSubscript operator[]( + TString* key) const { + return Internals::JsonObjectSubscript( + *const_cast(this), key); + } + + // Sets the specified key with the specified value. + // + // bool set(TKey, TValue); + // TKey = const std::string&, const String& + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + bool set(const TString& key, const TValue& value) { + return set_impl(key, value); + } + // + // bool set(TKey, TValue); + // TKey = const std::string&, const String& + // TValue = char*, const char*, const FlashStringHelper* + template + bool set(const TString& key, TValue* value) { + return set_impl(key, value); + } + // + // bool set(TKey, const TValue&); + // TKey = char*, const char*, const FlashStringHelper* + // TValue = bool, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + bool set(TString* key, const TValue& value) { + return set_impl(key, value); + } + // + // bool set(TKey, TValue); + // TKey = char*, const char*, const FlashStringHelper* + // TValue = char*, const char*, const FlashStringHelper* + template + bool set(TString* key, TValue* value) { + return set_impl(key, value); + } + // + // bool set(TKey, TValue, uint8_t decimals); + // TKey = const std::string&, const String& + // TValue = float, double + template + DEPRECATED("Second argument is not supported anymore") + typename Internals::EnableIf::value, + bool>::type + set(const TString& key, TValue value, uint8_t) { + return set_impl(key, + JsonVariant(value)); + } + // + // bool set(TKey, TValue, uint8_t decimals); + // TKey = char*, const char*, const FlashStringHelper* + // TValue = float, double + template + DEPRECATED("Second argument is not supported anymore") + typename Internals::EnableIf::value, + bool>::type + set(TString* key, TValue value, uint8_t) { + return set_impl(key, JsonVariant(value)); + } + + // Gets the value associated with the specified key. + // + // TValue get(TKey) const; + // TKey = const std::string&, const String& + // TValue = bool, char, long, int, short, float, double, + // std::string, String, JsonArray, JsonObject + template + typename Internals::JsonVariantAs::type get( + const TString& key) const { + return get_impl(key); + } + // + // TValue get(TKey) const; + // TKey = char*, const char*, const FlashStringHelper* + // TValue = bool, char, long, int, short, float, double, + // std::string, String, JsonArray, JsonObject + template + typename Internals::JsonVariantAs::type get(TString* key) const { + return get_impl(key); + } + + // Checks the type of the value associated with the specified key. + // + // + // bool is(TKey) const; + // TKey = const std::string&, const String& + // TValue = bool, char, long, int, short, float, double, + // std::string, String, JsonArray, JsonObject + template + bool is(const TString& key) const { + return is_impl(key); + } + // + // bool is(TKey) const; + // TKey = char*, const char*, const FlashStringHelper* + // TValue = bool, char, long, int, short, float, double, + // std::string, String, JsonArray, JsonObject + template + bool is(TString* key) const { + return is_impl(key); + } + + // Creates and adds a JsonArray. + // + // JsonArray& createNestedArray(TKey); + // TKey = const std::string&, const String& + template + JsonArray& createNestedArray(const TString& key) { + return createNestedArray_impl(key); + } + // JsonArray& createNestedArray(TKey); + // TKey = char*, const char*, char[], const char[], const FlashStringHelper* + template + JsonArray& createNestedArray(TString* key) { + return createNestedArray_impl(key); + } + + // Creates and adds a JsonObject. + // + // JsonObject& createNestedObject(TKey); + // TKey = const std::string&, const String& + template + JsonObject& createNestedObject(const TString& key) { + return createNestedObject_impl(key); + } + // + // JsonObject& createNestedObject(TKey); + // TKey = char*, const char*, char[], const char[], const FlashStringHelper* + template + JsonObject& createNestedObject(TString* key) { + return createNestedObject_impl(key); + } + + // Tells weither the specified key is present and associated with a value. + // + // bool containsKey(TKey); + // TKey = const std::string&, const String& + template + bool containsKey(const TString& key) const { + return findKey(key) != end(); + } + // + // bool containsKey(TKey); + // TKey = char*, const char*, char[], const char[], const FlashStringHelper* + template + bool containsKey(TString* key) const { + return findKey(key) != end(); + } + + // Removes the specified key and the associated value. + // + // void remove(TKey); + // TKey = const std::string&, const String& + template + void remove(const TString& key) { + remove(findKey(key)); + } + // + // void remove(TKey); + // TKey = char*, const char*, char[], const char[], const FlashStringHelper* + template + void remove(TString* key) { + remove(findKey(key)); + } + // + // void remove(iterator) + using Internals::List::remove; + + // Returns a reference an invalid JsonObject. + // This object is meant to replace a NULL pointer. + // This is used when memory allocation or JSON parsing fail. + static JsonObject& invalid() { + static JsonObject instance(NULL); + return instance; + } + + private: + // Returns the list node that matches the specified key. + template + iterator findKey(TStringRef key) { + iterator it; + for (it = begin(); it != end(); ++it) { + if (Internals::StringTraits::equals(key, it->key)) break; + } + return it; + } + template + const_iterator findKey(TStringRef key) const { + return const_cast(this)->findKey(key); + } + + template + typename Internals::JsonVariantAs::type get_impl( + TStringRef key) const { + const_iterator it = findKey(key); + return it != end() ? it->value.as() + : Internals::JsonVariantDefault::get(); + } + + template + bool set_impl(TStringRef key, TValueRef value) { + iterator it = findKey(key); + if (it == end()) { + it = Internals::List::add(); + if (it == end()) return false; + + bool key_ok = + Internals::ValueSaver::save(_buffer, it->key, key); + if (!key_ok) return false; + } + return Internals::ValueSaver::save(_buffer, it->value, value); + } + + template + bool is_impl(TStringRef key) const { + const_iterator it = findKey(key); + return it != end() ? it->value.is() : false; + } + + template + JsonArray& createNestedArray_impl(TStringRef key); + + template + JsonObject& createNestedObject_impl(TStringRef key); +}; + +namespace Internals { +template <> +struct JsonVariantDefault { + static JsonObject& get() { + return JsonObject::invalid(); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp new file mode 100644 index 0000000..e7689b5 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectImpl.hpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonArray.hpp" +#include "JsonObject.hpp" +#include "JsonObjectSubscript.hpp" + +namespace ArduinoJson { + +template +inline JsonArray &JsonObject::createNestedArray_impl(TStringRef key) { + if (!_buffer) return JsonArray::invalid(); + JsonArray &array = _buffer->createArray(); + set(key, array); + return array; +} + +template +inline JsonObject &JsonObject::createNestedObject_impl(TStringRef key) { + if (!_buffer) return JsonObject::invalid(); + JsonObject &object = _buffer->createObject(); + set(key, object); + return object; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp new file mode 100644 index 0000000..6ac4763 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonObjectSubscript.hpp @@ -0,0 +1,110 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Configuration.hpp" +#include "JsonVariantBase.hpp" +#include "TypeTraits/EnableIf.hpp" + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4522) +#endif + +namespace ArduinoJson { +namespace Internals { + +template +class JsonObjectSubscript + : public JsonVariantBase > { + typedef JsonObjectSubscript this_type; + + public: + FORCE_INLINE JsonObjectSubscript(JsonObject& object, TStringRef key) + : _object(object), _key(key) {} + + FORCE_INLINE this_type& operator=(const this_type& src) { + _object.set(_key, src); + return *this; + } + + // Set the specified value + // + // operator=(const TValue&); + // TValue = bool, char, long, int, short, float, double, + // std::string, String, JsonArray, JsonObject + template + FORCE_INLINE typename EnableIf::value, this_type&>::type + operator=(const TValue& src) { + _object.set(_key, src); + return *this; + } + // + // operator=(TValue); + // TValue = char*, const char*, const FlashStringHelper* + template + FORCE_INLINE this_type& operator=(TValue* src) { + _object.set(_key, src); + return *this; + } + + FORCE_INLINE bool success() const { + return _object.containsKey(_key); + } + + template + FORCE_INLINE typename JsonVariantAs::type as() const { + return _object.get(_key); + } + + template + FORCE_INLINE bool is() const { + return _object.is(_key); + } + + // Sets the specified value. + // + // bool set(const TValue&); + // TValue = bool, char, long, int, short, float, double, RawJson, JsonVariant, + // std::string, String, JsonArray, JsonObject + template + FORCE_INLINE typename EnableIf::value, bool>::type set( + const TValue& value) { + return _object.set(_key, value); + } + // + // bool set(TValue); + // TValue = char*, const char, const FlashStringHelper* + template + FORCE_INLINE bool set(const TValue* value) { + return _object.set(_key, value); + } + // + // bool set(TValue, uint8_t decimals); + // TValue = float, double + template + DEPRECATED("Second argument is not supported anymore") + FORCE_INLINE bool set(const TValue& value, uint8_t) { + return _object.set(_key, value); + } + + private: + JsonObject& _object; + TStringRef _key; +}; + +#if ARDUINOJSON_ENABLE_STD_STREAM +template +inline std::ostream& operator<<(std::ostream& os, + const JsonObjectSubscript& source) { + return source.printTo(os); +} +#endif +} +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonPair.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonPair.hpp new file mode 100644 index 0000000..4172430 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonPair.hpp @@ -0,0 +1,16 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonVariant.hpp" + +namespace ArduinoJson { + +// A key value pair for JsonObject. +struct JsonPair { + const char* key; + JsonVariant value; +}; +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariant.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariant.hpp new file mode 100644 index 0000000..8326cbe --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariant.hpp @@ -0,0 +1,355 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include +#include // for uint8_t + +#include "Data/JsonVariantContent.hpp" +#include "Data/JsonVariantDefault.hpp" +#include "Data/JsonVariantType.hpp" +#include "JsonVariantBase.hpp" +#include "RawJson.hpp" +#include "Serialization/JsonPrintable.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsChar.hpp" +#include "TypeTraits/IsFloatingPoint.hpp" +#include "TypeTraits/IsIntegral.hpp" +#include "TypeTraits/IsSame.hpp" +#include "TypeTraits/IsSignedIntegral.hpp" +#include "TypeTraits/IsUnsignedIntegral.hpp" +#include "TypeTraits/RemoveConst.hpp" +#include "TypeTraits/RemoveReference.hpp" + +namespace ArduinoJson { + +// Forward declarations. +class JsonArray; +class JsonObject; + +// A variant that can be a any value serializable to a JSON value. +// +// It can be set to: +// - a boolean +// - a char, short, int or a long (signed or unsigned) +// - a string (const char*) +// - a reference to a JsonArray or JsonObject +class JsonVariant : public Internals::JsonVariantBase { + template + friend class Internals::JsonSerializer; + + public: + // Creates an uninitialized JsonVariant + JsonVariant() : _type(Internals::JSON_UNDEFINED) {} + + // Create a JsonVariant containing a boolean value. + // It will be serialized as "true" or "false" in JSON. + JsonVariant(bool value) { + using namespace Internals; + _type = JSON_BOOLEAN; + _content.asInteger = static_cast(value); + } + + // Create a JsonVariant containing a floating point value. + // JsonVariant(double value); + // JsonVariant(float value); + template + JsonVariant(T value, typename Internals::EnableIf< + Internals::IsFloatingPoint::value>::type * = 0) { + using namespace Internals; + _type = JSON_FLOAT; + _content.asFloat = static_cast(value); + } + template + DEPRECATED("Second argument is not supported anymore") + JsonVariant(T value, uint8_t, + typename Internals::EnableIf< + Internals::IsFloatingPoint::value>::type * = 0) { + using namespace Internals; + _type = JSON_FLOAT; + _content.asFloat = static_cast(value); + } + + // Create a JsonVariant containing an integer value. + // JsonVariant(char) + // JsonVariant(signed short) + // JsonVariant(signed int) + // JsonVariant(signed long) + // JsonVariant(signed char) + template + JsonVariant( + T value, + typename Internals::EnableIf::value || + Internals::IsSame::value>::type * = + 0) { + using namespace Internals; + if (value >= 0) { + _type = JSON_POSITIVE_INTEGER; + _content.asInteger = static_cast(value); + } else { + _type = JSON_NEGATIVE_INTEGER; + _content.asInteger = static_cast(-value); + } + } + // JsonVariant(unsigned short) + // JsonVariant(unsigned int) + // JsonVariant(unsigned long) + template + JsonVariant(T value, + typename Internals::EnableIf< + Internals::IsUnsignedIntegral::value>::type * = 0) { + using namespace Internals; + _type = JSON_POSITIVE_INTEGER; + _content.asInteger = static_cast(value); + } + + // Create a JsonVariant containing a string. + // JsonVariant(const char*); + // JsonVariant(const signed char*); + // JsonVariant(const unsigned char*); + template + JsonVariant( + const TChar *value, + typename Internals::EnableIf::value>::type * = + 0) { + _type = Internals::JSON_STRING; + _content.asString = reinterpret_cast(value); + } + + // Create a JsonVariant containing an unparsed string + JsonVariant(Internals::RawJsonString value) { + _type = Internals::JSON_UNPARSED; + _content.asString = value; + } + + // Create a JsonVariant containing a reference to an array. + // CAUTION: we are lying about constness, because the array can be modified if + // the variant is converted back to a JsonArray& + JsonVariant(const JsonArray &array); + + // Create a JsonVariant containing a reference to an object. + // CAUTION: we are lying about constness, because the object can be modified + // if the variant is converted back to a JsonObject& + JsonVariant(const JsonObject &object); + + // Get the variant as the specified type. + // + // char as() const; + // signed char as() const; + // signed short as() const; + // signed int as() const; + // signed long as() const; + // unsigned char as() const; + // unsigned short as() const; + // unsigned int as() const; + // unsigned long as() const; + template + const typename Internals::EnableIf::value, T>::type + as() const { + return variantAsInteger(); + } + // bool as() const + template + const typename Internals::EnableIf::value, T>::type + as() const { + return variantAsInteger() != 0; + } + // + // double as() const; + // float as() const; + template + const typename Internals::EnableIf::value, + T>::type + as() const { + return variantAsFloat(); + } + // + // const char* as() const; + // const char* as() const; + template + typename Internals::EnableIf::value || + Internals::IsSame::value, + const char *>::type + as() const { + return variantAsString(); + } + // + // std::string as() const; + // String as() const; + template + typename Internals::EnableIf::has_append, T>::type + as() const { + const char *cstr = variantAsString(); + if (cstr) return T(cstr); + T s; + printTo(s); + return s; + } + // + // JsonArray& as const; + // JsonArray& as const; + template + typename Internals::EnableIf< + Internals::IsSame::type, + JsonArray>::value, + JsonArray &>::type + as() const { + return variantAsArray(); + } + // + // const JsonArray& as const; + template + typename Internals::EnableIf< + Internals::IsSame::type, + const JsonArray>::value, + const JsonArray &>::type + as() const { + return variantAsArray(); + } + // + // JsonObject& as const; + // JsonObject& as const; + template + typename Internals::EnableIf< + Internals::IsSame::type, + JsonObject>::value, + JsonObject &>::type + as() const { + return variantAsObject(); + } + // + // JsonObject& as const; + // JsonObject& as const; + template + typename Internals::EnableIf< + Internals::IsSame::type, + const JsonObject>::value, + const JsonObject &>::type + as() const { + return variantAsObject(); + } + // + // JsonVariant as const; + template + typename Internals::EnableIf::value, + T>::type + as() const { + return *this; + } + + // Tells weither the variant has the specified type. + // Returns true if the variant has type type T, false otherwise. + // + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + // bool is() const; + template + typename Internals::EnableIf::value, bool>::type is() + const { + return variantIsInteger(); + } + // + // bool is() const; + // bool is() const; + template + typename Internals::EnableIf::value, bool>::type + is() const { + return variantIsFloat(); + } + // + // bool is() const + template + typename Internals::EnableIf::value, bool>::type + is() const { + return variantIsBoolean(); + } + // + // bool is() const; + // bool is() const; + template + typename Internals::EnableIf::value || + Internals::IsSame::value, + bool>::type + is() const { + return variantIsString(); + } + // + // bool is const; + // bool is const; + // bool is const; + template + typename Internals::EnableIf< + Internals::IsSame::type>::type, + JsonArray>::value, + bool>::type + is() const { + return variantIsArray(); + } + // + // bool is const; + // bool is const; + // bool is const; + template + typename Internals::EnableIf< + Internals::IsSame::type>::type, + JsonObject>::value, + bool>::type + is() const { + return variantIsObject(); + } + + // Returns true if the variant has a value + bool success() const { + return _type != Internals::JSON_UNDEFINED; + } + + private: + JsonArray &variantAsArray() const; + JsonObject &variantAsObject() const; + const char *variantAsString() const; + template + T variantAsFloat() const; + template + T variantAsInteger() const; + bool variantIsBoolean() const; + bool variantIsFloat() const; + bool variantIsInteger() const; + bool variantIsArray() const { + return _type == Internals::JSON_ARRAY; + } + bool variantIsObject() const { + return _type == Internals::JSON_OBJECT; + } + bool variantIsString() const { + return _type == Internals::JSON_STRING || + (_type == Internals::JSON_UNPARSED && _content.asString && + !strcmp("null", _content.asString)); + } + + // The current type of the variant + Internals::JsonVariantType _type; + + // The various alternatives for the value of the variant. + Internals::JsonVariantContent _content; +}; + +DEPRECATED("Decimal places are ignored, use the float value instead") +inline JsonVariant float_with_n_digits(float value, uint8_t) { + return JsonVariant(value); +} + +DEPRECATED("Decimal places are ignored, use the double value instead") +inline JsonVariant double_with_n_digits(double value, uint8_t) { + return JsonVariant(value); +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp new file mode 100644 index 0000000..44acf2e --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantBase.hpp @@ -0,0 +1,24 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonVariantCasts.hpp" +#include "JsonVariantComparisons.hpp" +#include "JsonVariantOr.hpp" +#include "JsonVariantSubscripts.hpp" +#include "Serialization/JsonPrintable.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +class JsonVariantBase : public JsonPrintable, + public JsonVariantCasts, + public JsonVariantComparisons, + public JsonVariantOr, + public JsonVariantSubscripts, + public JsonVariantTag {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp new file mode 100644 index 0000000..68f5bd7 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantCasts.hpp @@ -0,0 +1,59 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonVariantAs.hpp" +#include "Polyfills/attributes.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +class JsonVariantCasts { + public: +#if ARDUINOJSON_ENABLE_DEPRECATED + DEPRECATED("use as() instead") + FORCE_INLINE JsonArray &asArray() const { + return impl()->template as(); + } + + DEPRECATED("use as() instead") + FORCE_INLINE JsonObject &asObject() const { + return impl()->template as(); + } + + DEPRECATED("use as() instead") + FORCE_INLINE const char *asString() const { + return impl()->template as(); + } +#endif + + // Gets the variant as an array. + // Returns a reference to the JsonArray or JsonArray::invalid() if the + // variant + // is not an array. + FORCE_INLINE operator JsonArray &() const { + return impl()->template as(); + } + + // Gets the variant as an object. + // Returns a reference to the JsonObject or JsonObject::invalid() if the + // variant is not an object. + FORCE_INLINE operator JsonObject &() const { + return impl()->template as(); + } + + template + FORCE_INLINE operator T() const { + return impl()->template as(); + } + + private: + const TImpl *impl() const { + return static_cast(this); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp new file mode 100644 index 0000000..cae5337 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantComparisons.hpp @@ -0,0 +1,138 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "StringTraits/StringTraits.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsVariant.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +class JsonVariantComparisons { + public: + template + friend bool operator==(const JsonVariantComparisons &variant, + TComparand comparand) { + return variant.equals(comparand); + } + + template + friend typename EnableIf::value, bool>::type + operator==(TComparand comparand, const JsonVariantComparisons &variant) { + return variant.equals(comparand); + } + + template + friend bool operator!=(const JsonVariantComparisons &variant, + TComparand comparand) { + return !variant.equals(comparand); + } + + template + friend typename EnableIf::value, bool>::type + operator!=(TComparand comparand, const JsonVariantComparisons &variant) { + return !variant.equals(comparand); + } + + template + friend bool operator<=(const JsonVariantComparisons &left, TComparand right) { + return left.as() <= right; + } + + template + friend bool operator<=(TComparand comparand, + const JsonVariantComparisons &variant) { + return comparand <= variant.as(); + } + + template + friend bool operator>=(const JsonVariantComparisons &variant, + TComparand comparand) { + return variant.as() >= comparand; + } + + template + friend bool operator>=(TComparand comparand, + const JsonVariantComparisons &variant) { + return comparand >= variant.as(); + } + + template + friend bool operator<(const JsonVariantComparisons &varian, + TComparand comparand) { + return varian.as() < comparand; + } + + template + friend bool operator<(TComparand comparand, + const JsonVariantComparisons &variant) { + return comparand < variant.as(); + } + + template + friend bool operator>(const JsonVariantComparisons &variant, + TComparand comparand) { + return variant.as() > comparand; + } + + template + friend bool operator>(TComparand comparand, + const JsonVariantComparisons &variant) { + return comparand > variant.as(); + } + + private: + const TImpl *impl() const { + return static_cast(this); + } + + template + const typename JsonVariantAs::type as() const { + return impl()->template as(); + } + + template + bool is() const { + return impl()->template is(); + } + + template + typename EnableIf::has_equals, bool>::type equals( + const TString &comparand) const { + const char *value = as(); + return StringTraits::equals(comparand, value); + } + + template + typename EnableIf::value && + !StringTraits::has_equals, + bool>::type + equals(const TComparand &comparand) const { + return as() == comparand; + } + + template + bool equals(const JsonVariantComparisons &right) const { + using namespace Internals; + if (is() && right.template is()) + return as() == right.template as(); + if (is() && right.template is()) + return as() == right.template as(); + if (is() && right.template is()) + return as() == right.template as(); + if (is() && right.template is()) + return as() == right.template as(); + if (is() && right.template is()) + return as() == right.template as(); + if (is() && right.template is()) + return strcmp(as(), right.template as()) == 0; + + return false; + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp new file mode 100644 index 0000000..31f96ce --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantImpl.hpp @@ -0,0 +1,126 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Configuration.hpp" +#include "JsonArray.hpp" +#include "JsonObject.hpp" +#include "JsonVariant.hpp" +#include "Polyfills/isFloat.hpp" +#include "Polyfills/isInteger.hpp" +#include "Polyfills/parseFloat.hpp" +#include "Polyfills/parseInteger.hpp" + +#include // for strcmp + +namespace ArduinoJson { + +inline JsonVariant::JsonVariant(const JsonArray &array) { + if (array.success()) { + _type = Internals::JSON_ARRAY; + _content.asArray = const_cast(&array); + } else { + _type = Internals::JSON_UNDEFINED; + } +} + +inline JsonVariant::JsonVariant(const JsonObject &object) { + if (object.success()) { + _type = Internals::JSON_OBJECT; + _content.asObject = const_cast(&object); + } else { + _type = Internals::JSON_UNDEFINED; + } +} + +inline JsonArray &JsonVariant::variantAsArray() const { + if (_type == Internals::JSON_ARRAY) return *_content.asArray; + return JsonArray::invalid(); +} + +inline JsonObject &JsonVariant::variantAsObject() const { + if (_type == Internals::JSON_OBJECT) return *_content.asObject; + return JsonObject::invalid(); +} + +template +inline T JsonVariant::variantAsInteger() const { + using namespace Internals; + switch (_type) { + case JSON_UNDEFINED: + return 0; + case JSON_POSITIVE_INTEGER: + case JSON_BOOLEAN: + return T(_content.asInteger); + case JSON_NEGATIVE_INTEGER: + return T(~_content.asInteger + 1); + case JSON_STRING: + case JSON_UNPARSED: + return parseInteger(_content.asString); + default: + return T(_content.asFloat); + } +} + +inline const char *JsonVariant::variantAsString() const { + using namespace Internals; + if (_type == JSON_UNPARSED && _content.asString && + !strcmp("null", _content.asString)) + return NULL; + if (_type == JSON_STRING || _type == JSON_UNPARSED) return _content.asString; + return NULL; +} + +template +inline T JsonVariant::variantAsFloat() const { + using namespace Internals; + switch (_type) { + case JSON_UNDEFINED: + return 0; + case JSON_POSITIVE_INTEGER: + case JSON_BOOLEAN: + return static_cast(_content.asInteger); + case JSON_NEGATIVE_INTEGER: + return -static_cast(_content.asInteger); + case JSON_STRING: + case JSON_UNPARSED: + return parseFloat(_content.asString); + default: + return static_cast(_content.asFloat); + } +} + +inline bool JsonVariant::variantIsBoolean() const { + using namespace Internals; + if (_type == JSON_BOOLEAN) return true; + + if (_type != JSON_UNPARSED || _content.asString == NULL) return false; + + return !strcmp(_content.asString, "true") || + !strcmp(_content.asString, "false"); +} + +inline bool JsonVariant::variantIsInteger() const { + using namespace Internals; + + return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER || + (_type == JSON_UNPARSED && isInteger(_content.asString)); +} + +inline bool JsonVariant::variantIsFloat() const { + using namespace Internals; + + return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER || + _type == JSON_NEGATIVE_INTEGER || + (_type == JSON_UNPARSED && isFloat(_content.asString)); +} + +#if ARDUINOJSON_ENABLE_STD_STREAM +inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) { + return source.printTo(os); +} +#endif + +} // namespace ArduinoJson diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp new file mode 100644 index 0000000..d8022fc --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantOr.hpp @@ -0,0 +1,52 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonVariantAs.hpp" +#include "Polyfills/attributes.hpp" +#include "TypeTraits/EnableIf.hpp" +#include "TypeTraits/IsIntegral.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +class JsonVariantOr { + public: + // Returns the default value if the JsonVariant is undefined of incompatible + template + typename EnableIf::value, T>::type operator|( + const T &defaultValue) const { + if (impl()->template is()) + return impl()->template as(); + else + return defaultValue; + } + + // Returns the default value if the JsonVariant is undefined of incompatible + // Special case for string: null is treated as undefined + const char *operator|(const char *defaultValue) const { + const char *value = impl()->template as(); + return value ? value : defaultValue; + } + + // Returns the default value if the JsonVariant is undefined of incompatible + // Special case for integers: we also accept double + template + typename EnableIf::value, Integer>::type operator|( + const Integer &defaultValue) const { + if (impl()->template is()) + return impl()->template as(); + else + return defaultValue; + } + + private: + const TImpl *impl() const { + return static_cast(this); + } +}; +} // namespace Internals +} // namespace ArduinoJson diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp new file mode 100644 index 0000000..279ee01 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/JsonVariantSubscripts.hpp @@ -0,0 +1,86 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "Data/JsonVariantAs.hpp" +#include "Polyfills/attributes.hpp" +#include "StringTraits/StringTraits.hpp" +#include "TypeTraits/EnableIf.hpp" + +namespace ArduinoJson { +namespace Internals { + +// Forward declarations. +class JsonArraySubscript; +template +class JsonObjectSubscript; + +template +class JsonVariantSubscripts { + public: + // Mimics an array or an object. + // Returns the size of the array or object if the variant has that type. + // Returns 0 if the variant is neither an array nor an object + size_t size() const { + return impl()->template as().size() + + impl()->template as().size(); + } + + // Mimics an array. + // Returns the element at specified index if the variant is an array. + // Returns JsonVariant::invalid() if the variant is not an array. + FORCE_INLINE const JsonArraySubscript operator[](size_t index) const; + FORCE_INLINE JsonArraySubscript operator[](size_t index); + + // Mimics an object. + // Returns the value associated with the specified key if the variant is + // an object. + // Return JsonVariant::invalid() if the variant is not an object. + // + // const JsonObjectSubscript operator[](TKey) const; + // TKey = const std::string&, const String& + template + FORCE_INLINE + typename EnableIf::has_equals, + const JsonObjectSubscript >::type + operator[](const TString &key) const { + return impl()->template as()[key]; + } + // + // const JsonObjectSubscript operator[](TKey) const; + // TKey = const std::string&, const String& + template + FORCE_INLINE typename EnableIf::has_equals, + JsonObjectSubscript >::type + operator[](const TString &key) { + return impl()->template as()[key]; + } + // + // JsonObjectSubscript operator[](TKey); + // TKey = const char*, const char[N], const FlashStringHelper* + template + FORCE_INLINE typename EnableIf::has_equals, + JsonObjectSubscript >::type + operator[](const TString *key) { + return impl()->template as()[key]; + } + // + // JsonObjectSubscript operator[](TKey); + // TKey = const char*, const char[N], const FlashStringHelper* + template + FORCE_INLINE + typename EnableIf::has_equals, + const JsonObjectSubscript >::type + operator[](const TString *key) const { + return impl()->template as()[key]; + } + + private: + const TImpl *impl() const { + return static_cast(this); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp new file mode 100644 index 0000000..b49091d --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/attributes.hpp @@ -0,0 +1,29 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#ifdef _MSC_VER // Visual Studio + +#define FORCE_INLINE // __forceinline causes C4714 when returning std::string +#define NO_INLINE __declspec(noinline) +#define DEPRECATED(msg) __declspec(deprecated(msg)) + +#elif defined(__GNUC__) // GCC or Clang + +#define FORCE_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define DEPRECATED(msg) __attribute__((deprecated(msg))) +#else +#define DEPRECATED(msg) __attribute__((deprecated)) +#endif + +#else // Other compilers + +#define FORCE_INLINE +#define NO_INLINE +#define DEPRECATED(msg) + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp new file mode 100644 index 0000000..2d52703 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/ctype.hpp @@ -0,0 +1,18 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +inline bool isdigit(char c) { + return '0' <= c && c <= '9'; +} + +inline bool issign(char c) { + return '-' == c || c == '+'; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp new file mode 100644 index 0000000..973b89f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isFloat.hpp @@ -0,0 +1,38 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include // for strcmp +#include "./ctype.hpp" + +namespace ArduinoJson { +namespace Internals { + +inline bool isFloat(const char* s) { + if (!s) return false; + + if (!strcmp(s, "NaN")) return true; + if (issign(*s)) s++; + if (!strcmp(s, "Infinity")) return true; + if (*s == '\0') return false; + + while (isdigit(*s)) s++; + + if (*s == '.') { + s++; + while (isdigit(*s)) s++; + } + + if (*s == 'e' || *s == 'E') { + s++; + if (issign(*s)) s++; + if (!isdigit(*s)) return false; + while (isdigit(*s)) s++; + } + + return *s == '\0'; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp new file mode 100644 index 0000000..21f1668 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/isInteger.hpp @@ -0,0 +1,19 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "./ctype.hpp" + +namespace ArduinoJson { +namespace Internals { + +inline bool isInteger(const char* s) { + if (!s) return false; + if (issign(*s)) s++; + while (isdigit(*s)) s++; + return *s == '\0'; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp new file mode 100644 index 0000000..48773ed --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/math.hpp @@ -0,0 +1,19 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { +template +bool isNaN(T x) { + return x != x; +} + +template +bool isInfinity(T x) { + return x != 0.0 && x * 2 == x; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp new file mode 100644 index 0000000..49b0f6f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseFloat.hpp @@ -0,0 +1,90 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../TypeTraits/FloatTraits.hpp" +#include "./ctype.hpp" +#include "./math.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +inline T parseFloat(const char* s) { + typedef FloatTraits traits; + typedef typename traits::mantissa_type mantissa_t; + typedef typename traits::exponent_type exponent_t; + + if (!s) return 0; // NULL + + bool negative_result = false; + switch (*s) { + case '-': + negative_result = true; + s++; + break; + case '+': + s++; + break; + } + + if (*s == 't') return 1; // true + if (*s == 'n' || *s == 'N') return traits::nan(); + if (*s == 'i' || *s == 'I') + return negative_result ? -traits::inf() : traits::inf(); + + mantissa_t mantissa = 0; + exponent_t exponent_offset = 0; + + while (isdigit(*s)) { + if (mantissa < traits::mantissa_max / 10) + mantissa = mantissa * 10 + (*s - '0'); + else + exponent_offset++; + s++; + } + + if (*s == '.') { + s++; + while (isdigit(*s)) { + if (mantissa < traits::mantissa_max / 10) { + mantissa = mantissa * 10 + (*s - '0'); + exponent_offset--; + } + s++; + } + } + + int exponent = 0; + if (*s == 'e' || *s == 'E') { + s++; + bool negative_exponent = false; + if (*s == '-') { + negative_exponent = true; + s++; + } else if (*s == '+') { + s++; + } + + while (isdigit(*s)) { + exponent = exponent * 10 + (*s - '0'); + if (exponent + exponent_offset > traits::exponent_max) { + if (negative_exponent) + return negative_result ? -0.0f : 0.0f; + else + return negative_result ? -traits::inf() : traits::inf(); + } + s++; + } + if (negative_exponent) exponent = -exponent; + } + exponent += exponent_offset; + + T result = traits::make_float(static_cast(mantissa), exponent); + + return negative_result ? -result : result; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp new file mode 100644 index 0000000..e8f1974 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Polyfills/parseInteger.hpp @@ -0,0 +1,41 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include + +#include "../Configuration.hpp" +#include "./ctype.hpp" + +namespace ArduinoJson { +namespace Internals { +template +T parseInteger(const char *s) { + if (!s) return 0; // NULL + + if (*s == 't') return 1; // "true" + + T result = 0; + bool negative_result = false; + + switch (*s) { + case '-': + negative_result = true; + s++; + break; + case '+': + s++; + break; + } + + while (isdigit(*s)) { + result = T(result * 10 + T(*s - '0')); + s++; + } + + return negative_result ? T(~result + 1) : result; +} +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/RawJson.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/RawJson.hpp new file mode 100644 index 0000000..4beb980 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/RawJson.hpp @@ -0,0 +1,46 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { + +namespace Internals { +// A special type of data that can be used to insert pregenerated JSON portions. +template +class RawJsonString { + public: + explicit RawJsonString(T str) : _str(str) {} + operator T() const { + return _str; + } + + private: + T _str; +}; + +template +struct StringTraits, void> { + static bool is_null(RawJsonString source) { + return StringTraits::is_null(static_cast(source)); + } + + typedef RawJsonString duplicate_t; + + template + static duplicate_t duplicate(RawJsonString source, Buffer* buffer) { + return duplicate_t(StringTraits::duplicate(source, buffer)); + } + + static const bool has_append = false; + static const bool has_equals = false; + static const bool should_duplicate = StringTraits::should_duplicate; +}; +} + +template +inline Internals::RawJsonString RawJson(T str) { + return Internals::RawJsonString(str); +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp new file mode 100644 index 0000000..9fdf2d6 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DummyPrint.hpp @@ -0,0 +1,22 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A dummy Print implementation used in JsonPrintable::measureLength() +class DummyPrint { + public: + size_t print(char) { + return 1; + } + + size_t print(const char* s) { + return strlen(s); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp new file mode 100644 index 0000000..41be639 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/DynamicStringBuilder.hpp @@ -0,0 +1,35 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../StringTraits/StringTraits.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A Print implementation that allows to write in a String +template +class DynamicStringBuilder { + public: + DynamicStringBuilder(TString &str) : _str(str) {} + + size_t print(char c) { + StringTraits::append(_str, c); + return 1; + } + + size_t print(const char *s) { + size_t initialLen = _str.length(); + StringTraits::append(_str, s); + return _str.length() - initialLen; + } + + private: + DynamicStringBuilder &operator=(const DynamicStringBuilder &); + + TString &_str; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp new file mode 100644 index 0000000..c14e3b5 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/FloatParts.hpp @@ -0,0 +1,89 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" +#include "../Polyfills/math.hpp" +#include "../TypeTraits/FloatTraits.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +struct FloatParts { + uint32_t integral; + uint32_t decimal; + int16_t exponent; + int8_t decimalPlaces; + + FloatParts(TFloat value) { + uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000; + decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6; + + exponent = normalize(value); + + integral = uint32_t(value); + // reduce number of decimal places by the number of integral places + for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) { + maxDecimalPart /= 10; + decimalPlaces--; + } + + TFloat remainder = (value - TFloat(integral)) * TFloat(maxDecimalPart); + + decimal = uint32_t(remainder); + remainder = remainder - TFloat(decimal); + + // rounding: + // increment by 1 if remainder >= 0.5 + decimal += uint32_t(remainder * 2); + if (decimal >= maxDecimalPart) { + decimal = 0; + integral++; + if (exponent && integral >= 10) { + exponent++; + integral = 1; + } + } + + // remove trailing zeros + while (decimal % 10 == 0 && decimalPlaces > 0) { + decimal /= 10; + decimalPlaces--; + } + } + + static int16_t normalize(TFloat& value) { + typedef FloatTraits traits; + int16_t powersOf10 = 0; + + int8_t index = sizeof(TFloat) == 8 ? 8 : 5; + int bit = 1 << index; + + if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) { + for (; index >= 0; index--) { + if (value >= traits::positiveBinaryPowerOfTen(index)) { + value *= traits::negativeBinaryPowerOfTen(index); + powersOf10 = int16_t(powersOf10 + bit); + } + bit >>= 1; + } + } + + if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) { + for (; index >= 0; index--) { + if (value < traits::negativeBinaryPowerOfTenPlusOne(index)) { + value *= traits::positiveBinaryPowerOfTen(index); + powersOf10 = int16_t(powersOf10 - bit); + } + bit >>= 1; + } + } + + return powersOf10; + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp new file mode 100644 index 0000000..864f9aa --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/IndentedPrint.hpp @@ -0,0 +1,68 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// Decorator on top of Print to allow indented output. +// This class is used by JsonPrintable::prettyPrintTo() but can also be used +// for your own purpose, like logging. +template +class IndentedPrint { + public: + explicit IndentedPrint(Print &p) : sink(&p) { + level = 0; + tabSize = 2; + isNewLine = true; + } + + size_t print(char c) { + size_t n = 0; + if (isNewLine) n += writeTabs(); + n += sink->print(c); + isNewLine = c == '\n'; + return n; + } + + size_t print(const char *s) { + // TODO: optimize + size_t n = 0; + while (*s) n += print(*s++); + return n; + } + + // Adds one level of indentation + void indent() { + if (level < MAX_LEVEL) level++; + } + + // Removes one level of indentation + void unindent() { + if (level > 0) level--; + } + + // Set the number of space printed for each level of indentation + void setTabSize(uint8_t n) { + if (n < MAX_TAB_SIZE) tabSize = n & MAX_TAB_SIZE; + } + + private: + Print *sink; + uint8_t level : 4; + uint8_t tabSize : 3; + bool isNewLine : 1; + + size_t writeTabs() { + size_t n = 0; + for (int i = 0; i < level * tabSize; i++) n += sink->print(' '); + return n; + } + + static const int MAX_LEVEL = 15; // because it's only 4 bits + static const int MAX_TAB_SIZE = 7; // because it's only 3 bits +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp new file mode 100644 index 0000000..43d413a --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonPrintable.hpp @@ -0,0 +1,117 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" +#include "../TypeTraits/EnableIf.hpp" +#include "DummyPrint.hpp" +#include "DynamicStringBuilder.hpp" +#include "IndentedPrint.hpp" +#include "JsonSerializer.hpp" +#include "JsonWriter.hpp" +#include "Prettyfier.hpp" +#include "StaticStringBuilder.hpp" + +#if ARDUINOJSON_ENABLE_STD_STREAM +#include "StreamPrintAdapter.hpp" +#endif + +namespace ArduinoJson { +namespace Internals { + +// Implements all the overloads of printTo() and prettyPrintTo() +// Caution: this class use a template parameter to avoid virtual methods. +// This is a bit curious but allows to reduce the size of JsonVariant, JsonArray +// and JsonObject. +template +class JsonPrintable { + public: + template + typename EnableIf::has_append, size_t>::type printTo( + Print &print) const { + JsonWriter writer(print); + JsonSerializer >::serialize(downcast(), writer); + return writer.bytesWritten(); + } + +#if ARDUINOJSON_ENABLE_STD_STREAM + std::ostream &printTo(std::ostream &os) const { + StreamPrintAdapter adapter(os); + printTo(adapter); + return os; + } +#endif + + size_t printTo(char *buffer, size_t bufferSize) const { + StaticStringBuilder sb(buffer, bufferSize); + return printTo(sb); + } + + template + size_t printTo(char (&buffer)[N]) const { + return printTo(buffer, N); + } + + template + typename EnableIf::has_append, size_t>::type printTo( + TString &str) const { + DynamicStringBuilder sb(str); + return printTo(sb); + } + + template + size_t prettyPrintTo(IndentedPrint &print) const { + Prettyfier p(print); + return printTo(p); + } + + size_t prettyPrintTo(char *buffer, size_t bufferSize) const { + StaticStringBuilder sb(buffer, bufferSize); + return prettyPrintTo(sb); + } + + template + size_t prettyPrintTo(char (&buffer)[N]) const { + return prettyPrintTo(buffer, N); + } + + template + typename EnableIf::has_append, size_t>::type + prettyPrintTo(Print &print) const { + IndentedPrint indentedPrint(print); + return prettyPrintTo(indentedPrint); + } + + template + typename EnableIf::has_append, size_t>::type + prettyPrintTo(TString &str) const { + DynamicStringBuilder sb(str); + return prettyPrintTo(sb); + } + + size_t measureLength() const { + DummyPrint dp; + return printTo(dp); + } + + size_t measurePrettyLength() const { + DummyPrint dp; + return prettyPrintTo(dp); + } + + private: + const T &downcast() const { + return *static_cast(this); + } +}; + +#if ARDUINOJSON_ENABLE_STD_STREAM +template +inline std::ostream &operator<<(std::ostream &os, const JsonPrintable &v) { + return v.printTo(os); +} +#endif +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp new file mode 100644 index 0000000..0cb537f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializer.hpp @@ -0,0 +1,32 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonWriter.hpp" + +namespace ArduinoJson { + +class JsonArray; +class JsonObject; +class JsonVariant; + +namespace Internals { + +class JsonArraySubscript; +template +class JsonObjectSubscript; + +template +class JsonSerializer { + public: + static void serialize(const JsonArray &, Writer &); + static void serialize(const JsonArraySubscript &, Writer &); + static void serialize(const JsonObject &, Writer &); + template + static void serialize(const JsonObjectSubscript &, Writer &); + static void serialize(const JsonVariant &, Writer &); +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp new file mode 100644 index 0000000..0faae27 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonSerializerImpl.hpp @@ -0,0 +1,103 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../JsonArray.hpp" +#include "../JsonArraySubscript.hpp" +#include "../JsonObject.hpp" +#include "../JsonObjectSubscript.hpp" +#include "../JsonVariant.hpp" +#include "JsonSerializer.hpp" + +template +inline void ArduinoJson::Internals::JsonSerializer::serialize( + const JsonArray& array, Writer& writer) { + writer.beginArray(); + + JsonArray::const_iterator it = array.begin(); + while (it != array.end()) { + serialize(*it, writer); + + ++it; + if (it == array.end()) break; + + writer.writeComma(); + } + + writer.endArray(); +} + +template +inline void ArduinoJson::Internals::JsonSerializer::serialize( + const JsonArraySubscript& arraySubscript, Writer& writer) { + serialize(arraySubscript.as(), writer); +} + +template +inline void ArduinoJson::Internals::JsonSerializer::serialize( + const JsonObject& object, Writer& writer) { + writer.beginObject(); + + JsonObject::const_iterator it = object.begin(); + while (it != object.end()) { + writer.writeString(it->key); + writer.writeColon(); + serialize(it->value, writer); + + ++it; + if (it == object.end()) break; + + writer.writeComma(); + } + + writer.endObject(); +} + +template +template +inline void ArduinoJson::Internals::JsonSerializer::serialize( + const JsonObjectSubscript& objectSubscript, Writer& writer) { + serialize(objectSubscript.template as(), writer); +} + +template +inline void ArduinoJson::Internals::JsonSerializer::serialize( + const JsonVariant& variant, Writer& writer) { + switch (variant._type) { + case JSON_FLOAT: + writer.writeFloat(variant._content.asFloat); + return; + + case JSON_ARRAY: + serialize(*variant._content.asArray, writer); + return; + + case JSON_OBJECT: + serialize(*variant._content.asObject, writer); + return; + + case JSON_STRING: + writer.writeString(variant._content.asString); + return; + + case JSON_UNPARSED: + writer.writeRaw(variant._content.asString); + return; + + case JSON_NEGATIVE_INTEGER: + writer.writeRaw('-'); // Falls through. + + case JSON_POSITIVE_INTEGER: + writer.writeInteger(variant._content.asInteger); + return; + + case JSON_BOOLEAN: + writer.writeBoolean(variant._content.asInteger != 0); + return; + + default: // JSON_UNDEFINED + return; + } +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp new file mode 100644 index 0000000..146d51d --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/JsonWriter.hpp @@ -0,0 +1,155 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include +#include "../Data/Encoding.hpp" +#include "../Data/JsonInteger.hpp" +#include "../Polyfills/attributes.hpp" +#include "../Serialization/FloatParts.hpp" + +namespace ArduinoJson { +namespace Internals { + +// Writes the JSON tokens to a Print implementation +// This class is used by: +// - JsonArray::writeTo() +// - JsonObject::writeTo() +// - JsonVariant::writeTo() +// Its derived by PrettyJsonWriter that overrides some members to add +// indentation. +template +class JsonWriter { + public: + explicit JsonWriter(Print &sink) : _sink(sink), _length(0) {} + + // Returns the number of bytes sent to the Print implementation. + // This is very handy for implementations of printTo() that must return the + // number of bytes written. + size_t bytesWritten() const { + return _length; + } + + void beginArray() { + writeRaw('['); + } + void endArray() { + writeRaw(']'); + } + + void beginObject() { + writeRaw('{'); + } + void endObject() { + writeRaw('}'); + } + + void writeColon() { + writeRaw(':'); + } + void writeComma() { + writeRaw(','); + } + + void writeBoolean(bool value) { + writeRaw(value ? "true" : "false"); + } + + void writeString(const char *value) { + if (!value) { + writeRaw("null"); + } else { + writeRaw('\"'); + while (*value) writeChar(*value++); + writeRaw('\"'); + } + } + + void writeChar(char c) { + char specialChar = Encoding::escapeChar(c); + if (specialChar) { + writeRaw('\\'); + writeRaw(specialChar); + } else { + writeRaw(c); + } + } + + template + void writeFloat(TFloat value) { + if (isNaN(value)) return writeRaw("NaN"); + + if (value < 0.0) { + writeRaw('-'); + value = -value; + } + + if (isInfinity(value)) return writeRaw("Infinity"); + + FloatParts parts(value); + + writeInteger(parts.integral); + if (parts.decimalPlaces) writeDecimals(parts.decimal, parts.decimalPlaces); + + if (parts.exponent < 0) { + writeRaw("e-"); + writeInteger(-parts.exponent); + } + + if (parts.exponent > 0) { + writeRaw('e'); + writeInteger(parts.exponent); + } + } + + template + void writeInteger(UInt value) { + char buffer[22]; + char *end = buffer + sizeof(buffer) - 1; + char *ptr = end; + + *ptr = 0; + do { + *--ptr = char(value % 10 + '0'); + value = UInt(value / 10); + } while (value); + + writeRaw(ptr); + } + + void writeDecimals(uint32_t value, int8_t width) { + // buffer should be big enough for all digits, the dot and the null + // terminator + char buffer[16]; + char *ptr = buffer + sizeof(buffer) - 1; + + // write the string in reverse order + *ptr = 0; + while (width--) { + *--ptr = char(value % 10 + '0'); + value /= 10; + } + *--ptr = '.'; + + // and dump it in the right order + writeRaw(ptr); + } + + void writeRaw(const char *s) { + _length += _sink.print(s); + } + void writeRaw(char c) { + _length += _sink.print(c); + } + + protected: + Print &_sink; + size_t _length; + + private: + JsonWriter &operator=(const JsonWriter &); // cannot be assigned +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp new file mode 100644 index 0000000..8b4f0d2 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/Prettyfier.hpp @@ -0,0 +1,133 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "IndentedPrint.hpp" + +namespace ArduinoJson { +namespace Internals { + +// Converts a compact JSON string into an indented one. +template +class Prettyfier { + public: + explicit Prettyfier(IndentedPrint& p) : _sink(p) { + _previousChar = 0; + _inString = false; + } + + size_t print(char c) { + size_t n = _inString ? handleStringChar(c) : handleMarkupChar(c); + _previousChar = c; + return n; + } + + size_t print(const char* s) { + // TODO: optimize + size_t n = 0; + while (*s) n += print(*s++); + return n; + } + + private: + Prettyfier& operator=(const Prettyfier&); // cannot be assigned + + bool inEmptyBlock() { + return _previousChar == '{' || _previousChar == '['; + } + + size_t handleStringChar(char c) { + bool isQuote = c == '"' && _previousChar != '\\'; + + if (isQuote) _inString = false; + + return _sink.print(c); + } + + size_t handleMarkupChar(char c) { + switch (c) { + case '{': + case '[': + return writeBlockOpen(c); + + case '}': + case ']': + return writeBlockClose(c); + + case ':': + return writeColon(); + + case ',': + return writeComma(); + + case '"': + return writeQuoteOpen(); + + default: + return writeNormalChar(c); + } + } + + size_t writeBlockClose(char c) { + size_t n = 0; + n += unindentIfNeeded(); + n += _sink.print(c); + return n; + } + + size_t writeBlockOpen(char c) { + size_t n = 0; + n += indentIfNeeded(); + n += _sink.print(c); + return n; + } + + size_t writeColon() { + size_t n = 0; + n += _sink.print(": "); + return n; + } + + size_t writeComma() { + size_t n = 0; + n += _sink.print(",\r\n"); + return n; + } + + size_t writeQuoteOpen() { + _inString = true; + size_t n = 0; + n += indentIfNeeded(); + n += _sink.print('"'); + return n; + } + + size_t writeNormalChar(char c) { + size_t n = 0; + n += indentIfNeeded(); + n += _sink.print(c); + return n; + } + + size_t indentIfNeeded() { + if (!inEmptyBlock()) return 0; + + _sink.indent(); + return _sink.print("\r\n"); + } + + size_t unindentIfNeeded() { + if (inEmptyBlock()) return 0; + + _sink.unindent(); + return _sink.print("\r\n"); + } + + char _previousChar; + IndentedPrint& _sink; + bool _inString; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp new file mode 100644 index 0000000..9617bbd --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StaticStringBuilder.hpp @@ -0,0 +1,36 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A Print implementation that allows to write in a char[] +class StaticStringBuilder { + public: + StaticStringBuilder(char *buf, size_t size) : end(buf + size - 1), p(buf) { + *p = '\0'; + } + + size_t print(char c) { + if (p >= end) return 0; + *p++ = c; + *p = '\0'; + return 1; + } + + size_t print(const char *s) { + char *begin = p; + while (p < end && *s) *p++ = *s++; + *p = '\0'; + return size_t(p - begin); + } + + private: + char *end; + char *p; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp new file mode 100644 index 0000000..60f0af4 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/Serialization/StreamPrintAdapter.hpp @@ -0,0 +1,39 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" + +#if ARDUINOJSON_ENABLE_STD_STREAM + +#include + +namespace ArduinoJson { +namespace Internals { + +class StreamPrintAdapter { + public: + explicit StreamPrintAdapter(std::ostream& os) : _os(os) {} + + size_t print(char c) { + _os << c; + return 1; + } + + size_t print(const char* s) { + _os << s; + return strlen(s); + } + + private: + // cannot be assigned + StreamPrintAdapter& operator=(const StreamPrintAdapter&); + + std::ostream& _os; +}; +} +} + +#endif // ARDUINOJSON_ENABLE_STD_STREAM diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp new file mode 100644 index 0000000..267d9d0 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StaticJsonBuffer.hpp @@ -0,0 +1,126 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "JsonBufferBase.hpp" + +namespace ArduinoJson { +namespace Internals { + +class StaticJsonBufferBase : public JsonBufferBase { + public: + class String { + public: + String(StaticJsonBufferBase* parent) : _parent(parent) { + _start = parent->_buffer + parent->_size; + } + + void append(char c) { + if (_parent->canAlloc(1)) { + char* last = static_cast(_parent->doAlloc(1)); + *last = c; + } + } + + const char* c_str() const { + if (_parent->canAlloc(1)) { + char* last = static_cast(_parent->doAlloc(1)); + *last = '\0'; + return _start; + } else { + return NULL; + } + } + + private: + StaticJsonBufferBase* _parent; + char* _start; + }; + + StaticJsonBufferBase(char* buffer, size_t capa) + : _buffer(buffer), _capacity(capa), _size(0) {} + + // Gets the capacity of the buffer in bytes + size_t capacity() const { + return _capacity; + } + + // Gets the current usage of the buffer in bytes + size_t size() const { + return _size; + } + + // Allocates the specified amount of bytes in the buffer + virtual void* alloc(size_t bytes) { + alignNextAlloc(); + if (!canAlloc(bytes)) return NULL; + return doAlloc(bytes); + } + + // Resets the buffer. + // USE WITH CAUTION: this invalidates all previously allocated data + void clear() { + _size = 0; + } + + String startString() { + return String(this); + } + + protected: + ~StaticJsonBufferBase() {} + + private: + void alignNextAlloc() { + _size = round_size_up(_size); + } + + bool canAlloc(size_t bytes) const { + return _size + bytes <= _capacity; + } + + void* doAlloc(size_t bytes) { + void* p = &_buffer[_size]; + _size += bytes; + return p; + } + + char* _buffer; + size_t _capacity; + size_t _size; +}; +} + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnon-virtual-dtor" +#elif defined(__GNUC__) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wnon-virtual-dtor" +#endif + +// Implements a JsonBuffer with fixed memory allocation. +// The template paramenter CAPACITY specifies the capacity of the buffer in +// bytes. +template +class StaticJsonBuffer : public Internals::StaticJsonBufferBase { + public: + explicit StaticJsonBuffer() + : Internals::StaticJsonBufferBase(_buffer, CAPACITY) {} + + private: + char _buffer[CAPACITY]; +}; +} + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#pragma GCC diagnostic pop +#endif +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp new file mode 100644 index 0000000..5db0852 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/ArduinoStream.hpp @@ -0,0 +1,61 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#if ARDUINOJSON_ENABLE_ARDUINO_STREAM + +#include + +namespace ArduinoJson { +namespace Internals { + +struct ArduinoStreamTraits { + class Reader { + Stream& _stream; + char _current, _next; + + public: + Reader(Stream& stream) : _stream(stream), _current(0), _next(0) {} + + void move() { + _current = _next; + _next = 0; + } + + char current() { + if (!_current) _current = read(); + return _current; + } + + char next() { + // assumes that current() has been called + if (!_next) _next = read(); + return _next; + } + + private: + char read() { + // don't use _stream.read() as it ignores the timeout + char c = 0; + _stream.readBytes(&c, 1); + return c; + } + }; + + static const bool has_append = false; + static const bool has_equals = false; +}; + +template +struct StringTraits< + TStream, + // match any type that is derived from Stream: + typename EnableIf< + IsBaseOf::type>::value>::type> + : ArduinoStreamTraits {}; +} +} + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp new file mode 100644 index 0000000..a9f30f7 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/CharPointer.hpp @@ -0,0 +1,62 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +template +struct CharPointerTraits { + class Reader { + const TChar* _ptr; + + public: + Reader(const TChar* ptr) + : _ptr(ptr ? ptr : reinterpret_cast("")) {} + + void move() { + ++_ptr; + } + + char current() const { + return char(_ptr[0]); + } + + char next() const { + return char(_ptr[1]); + } + }; + + static bool equals(const TChar* str, const char* expected) { + return strcmp(reinterpret_cast(str), expected) == 0; + } + + static bool is_null(const TChar* str) { + return !str; + } + + typedef const char* duplicate_t; + + template + static duplicate_t duplicate(const TChar* str, Buffer* buffer) { + if (!str) return NULL; + size_t size = strlen(reinterpret_cast(str)) + 1; + void* dup = buffer->alloc(size); + if (dup != NULL) memcpy(dup, str, size); + return static_cast(dup); + } + + static const bool has_append = false; + static const bool has_equals = true; + static const bool should_duplicate = !IsConst::value; +}; + +// char*, unsigned char*, signed char* +// const char*, const unsigned char*, const signed char* +template +struct StringTraits::value>::type> + : CharPointerTraits {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp new file mode 100644 index 0000000..95f555d --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/FlashString.hpp @@ -0,0 +1,59 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#if ARDUINOJSON_ENABLE_PROGMEM + +namespace ArduinoJson { +namespace Internals { +template <> +struct StringTraits { + class Reader { + const char* _ptr; + + public: + Reader(const __FlashStringHelper* ptr) + : _ptr(reinterpret_cast(ptr)) {} + + void move() { + _ptr++; + } + + char current() const { + return pgm_read_byte_near(_ptr); + } + + char next() const { + return pgm_read_byte_near(_ptr + 1); + } + }; + + static bool equals(const __FlashStringHelper* str, const char* expected) { + return strcmp_P(expected, (const char*)str) == 0; + } + + static bool is_null(const __FlashStringHelper* str) { + return !str; + } + + typedef const char* duplicate_t; + + template + static duplicate_t duplicate(const __FlashStringHelper* str, Buffer* buffer) { + if (!str) return NULL; + size_t size = strlen_P((const char*)str) + 1; + void* dup = buffer->alloc(size); + if (dup != NULL) memcpy_P(dup, (const char*)str, size); + return static_cast(dup); + } + + static const bool has_append = false; + static const bool has_equals = true; + static const bool should_duplicate = true; +}; +} +} + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp new file mode 100644 index 0000000..227c744 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdStream.hpp @@ -0,0 +1,60 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#if ARDUINOJSON_ENABLE_STD_STREAM + +#include + +namespace ArduinoJson { +namespace Internals { + +struct StdStreamTraits { + class Reader { + std::istream& _stream; + char _current, _next; + + public: + Reader(std::istream& stream) : _stream(stream), _current(0), _next(0) {} + + void move() { + _current = _next; + _next = 0; + } + + char current() { + if (!_current) _current = read(); + return _current; + } + + char next() { + // assumes that current() has been called + if (!_next) _next = read(); + return _next; + } + + private: + Reader& operator=(const Reader&); // Visual Studio C4512 + + char read() { + return _stream.eof() ? '\0' : static_cast(_stream.get()); + } + }; + + static const bool has_append = false; + static const bool has_equals = false; +}; + +template +struct StringTraits< + TStream, + // match any type that is derived from std::istream: + typename EnableIf::type>::value>::type> + : StdStreamTraits {}; +} +} + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp new file mode 100644 index 0000000..39124da --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StdString.hpp @@ -0,0 +1,74 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#if ARDUINOJSON_ENABLE_STD_STRING || ARDUINOJSON_ENABLE_ARDUINO_STRING + +#if ARDUINOJSON_ENABLE_ARDUINO_STRING +#include +#endif + +#if ARDUINOJSON_ENABLE_STD_STRING +#include +#endif + +namespace ArduinoJson { +namespace Internals { + +template +struct StdStringTraits { + typedef const char* duplicate_t; + + template + static duplicate_t duplicate(const TString& str, Buffer* buffer) { + if (!str.c_str()) return NULL; // <- Arduino string can return NULL + size_t size = str.length() + 1; + void* dup = buffer->alloc(size); + if (dup != NULL) memcpy(dup, str.c_str(), size); + return static_cast(dup); + } + + static bool is_null(const TString& str) { + // Arduino's String::c_str() can return NULL + return !str.c_str(); + } + + struct Reader : CharPointerTraits::Reader { + Reader(const TString& str) : CharPointerTraits::Reader(str.c_str()) {} + }; + + static bool equals(const TString& str, const char* expected) { + return 0 == strcmp(str.c_str(), expected); + } + + static void append(TString& str, char c) { + str += c; + } + + static void append(TString& str, const char* s) { + str += s; + } + + static const bool has_append = true; + static const bool has_equals = true; + static const bool should_duplicate = true; +}; + +#if ARDUINOJSON_ENABLE_ARDUINO_STRING +template <> +struct StringTraits : StdStringTraits {}; +template <> +struct StringTraits : StdStringTraits { +}; +#endif + +#if ARDUINOJSON_ENABLE_STD_STRING +template <> +struct StringTraits : StdStringTraits {}; +#endif +} +} + +#endif diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp new file mode 100644 index 0000000..dd5694b --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/StringTraits/StringTraits.hpp @@ -0,0 +1,36 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include +#include "../Configuration.hpp" +#include "../TypeTraits/EnableIf.hpp" +#include "../TypeTraits/IsBaseOf.hpp" +#include "../TypeTraits/IsChar.hpp" +#include "../TypeTraits/IsConst.hpp" +#include "../TypeTraits/RemoveReference.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +struct StringTraits { + static const bool has_append = false; + static const bool has_equals = false; +}; + +template +struct StringTraits : StringTraits {}; + +template +struct StringTraits : StringTraits {}; +} +} + +#include "ArduinoStream.hpp" +#include "CharPointer.hpp" +#include "FlashString.hpp" +#include "StdStream.hpp" +#include "StdString.hpp" diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp new file mode 100644 index 0000000..83fc5e0 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/EnableIf.hpp @@ -0,0 +1,19 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that return the type T if Condition is true. +template +struct EnableIf {}; + +template +struct EnableIf { + typedef T type; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp new file mode 100644 index 0000000..5044807 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/FloatTraits.hpp @@ -0,0 +1,150 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include +#include // for size_t +#include "../Configuration.hpp" +#include "../Polyfills/math.hpp" + +namespace ArduinoJson { +namespace Internals { + +template +struct FloatTraits {}; + +template +struct FloatTraits { + typedef int64_t mantissa_type; + static const short mantissa_bits = 52; + static const mantissa_type mantissa_max = + (static_cast(1) << mantissa_bits) - 1; + + typedef int16_t exponent_type; + static const exponent_type exponent_max = 308; + + template + static T make_float(T m, TExponent e) { + if (e > 0) { + for (uint8_t index = 0; e != 0; index++) { + if (e & 1) m *= positiveBinaryPowerOfTen(index); + e >>= 1; + } + } else { + e = TExponent(-e); + for (uint8_t index = 0; e != 0; index++) { + if (e & 1) m *= negativeBinaryPowerOfTen(index); + e >>= 1; + } + } + return m; + } + + static T positiveBinaryPowerOfTen(int index) { + static T factors[] = { + 1e1, 1e2, 1e4, 1e8, 1e16, 1e32, + // workaround to support platforms with single precision literals + forge(0x4D384F03, 0xE93FF9F5), forge(0x5A827748, 0xF9301D32), + forge(0x75154FDD, 0x7F73BF3C)}; + return factors[index]; + } + + static T negativeBinaryPowerOfTen(int index) { + static T factors[] = { + 1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32, + // workaround to support platforms with single precision literals + forge(0x32A50FFD, 0x44F4A73D), forge(0x255BBA08, 0xCF8C979D), + forge(0x0AC80628, 0x64AC6F43)}; + return factors[index]; + } + + static T negativeBinaryPowerOfTenPlusOne(int index) { + static T factors[] = { + 1e0, 1e-1, 1e-3, 1e-7, 1e-15, 1e-31, + // workaround to support platforms with single precision literals + forge(0x32DA53FC, 0x9631D10D), forge(0x25915445, 0x81B7DEC2), + forge(0x0AFE07B2, 0x7DD78B14)}; + return factors[index]; + } + + static T nan() { + return forge(0x7ff80000, 0x00000000); + } + + static T inf() { + return forge(0x7ff00000, 0x00000000); + } + + static T forge(uint32_t msb, uint32_t lsb) { + union { + uint64_t integerBits; + T floatBits; + }; + integerBits = (uint64_t(msb) << 32) | lsb; + return floatBits; + } +}; + +template +struct FloatTraits { + typedef int32_t mantissa_type; + static const short mantissa_bits = 23; + static const mantissa_type mantissa_max = + (static_cast(1) << mantissa_bits) - 1; + + typedef int8_t exponent_type; + static const exponent_type exponent_max = 38; + + template + static T make_float(T m, TExponent e) { + if (e > 0) { + for (uint8_t index = 0; e != 0; index++) { + if (e & 1) m *= positiveBinaryPowerOfTen(index); + e >>= 1; + } + } else { + e = -e; + for (uint8_t index = 0; e != 0; index++) { + if (e & 1) m *= negativeBinaryPowerOfTen(index); + e >>= 1; + } + } + return m; + } + + static T positiveBinaryPowerOfTen(int index) { + static T factors[] = {1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f}; + return factors[index]; + } + + static T negativeBinaryPowerOfTen(int index) { + static T factors[] = {1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f}; + return factors[index]; + } + + static T negativeBinaryPowerOfTenPlusOne(int index) { + static T factors[] = {1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f}; + return factors[index]; + } + + static T forge(uint32_t bits) { + union { + uint32_t integerBits; + T floatBits; + }; + integerBits = bits; + return floatBits; + } + + static T nan() { + return forge(0x7fc00000); + } + + static T inf() { + return forge(0x7f800000); + } +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp new file mode 100644 index 0000000..2599231 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsArray.hpp @@ -0,0 +1,24 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that return the type T without the const modifier +template +struct IsArray { + static const bool value = false; +}; +template +struct IsArray { + static const bool value = true; +}; +template +struct IsArray { + static const bool value = true; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp new file mode 100644 index 0000000..bf24e96 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsBaseOf.hpp @@ -0,0 +1,27 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if Derived inherits from TBase is an +// integral type. +template +class IsBaseOf { + protected: // <- to avoid GCC's "all member functions in class are private" + typedef char Yes[1]; + typedef char No[2]; + + static Yes &probe(const TBase *); + static No &probe(...); + + public: + enum { + value = sizeof(probe(reinterpret_cast(0))) == sizeof(Yes) + }; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp new file mode 100644 index 0000000..d97cec2 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsChar.hpp @@ -0,0 +1,23 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "IsSame.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if T is a charater +template +struct IsChar { + static const bool value = IsSame::value || + IsSame::value || + IsSame::value; +}; + +template +struct IsChar : IsChar {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp new file mode 100644 index 0000000..512ee5c --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsConst.hpp @@ -0,0 +1,21 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that return the type T without the const modifier +template +struct IsConst { + static const bool value = false; +}; + +template +struct IsConst { + static const bool value = true; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp new file mode 100644 index 0000000..e41a682 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsFloatingPoint.hpp @@ -0,0 +1,18 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "IsSame.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if T is a floating point type +template +struct IsFloatingPoint { + static const bool value = IsSame::value || IsSame::value; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp new file mode 100644 index 0000000..17ae5f2 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsIntegral.hpp @@ -0,0 +1,26 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "IsSame.hpp" +#include "IsSignedIntegral.hpp" +#include "IsUnsignedIntegral.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if T is an integral type. +template +struct IsIntegral { + static const bool value = IsSignedIntegral::value || + IsUnsignedIntegral::value || + IsSame::value; + // CAUTION: differs from std::is_integral as it doesn't include bool +}; + +template +struct IsIntegral : IsIntegral {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp new file mode 100644 index 0000000..06567c9 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSame.hpp @@ -0,0 +1,21 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if types T and U are the same. +template +struct IsSame { + static const bool value = false; +}; + +template +struct IsSame { + static const bool value = true; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp new file mode 100644 index 0000000..7334eb9 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsSignedIntegral.hpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" +#include "IsSame.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if T is an integral type. +template +struct IsSignedIntegral { + static const bool value = + IsSame::value || IsSame::value || + IsSame::value || IsSame::value || +#if ARDUINOJSON_USE_LONG_LONG + IsSame::value || +#endif +#if ARDUINOJSON_USE_INT64 + IsSame::value || +#endif + false; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp new file mode 100644 index 0000000..938423f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsUnsignedIntegral.hpp @@ -0,0 +1,28 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "../Configuration.hpp" +#include "IsSame.hpp" + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that returns true if T is an integral type. +template +struct IsUnsignedIntegral { + static const bool value = + IsSame::value || IsSame::value || + IsSame::value || IsSame::value || +#if ARDUINOJSON_USE_LONG_LONG + IsSame::value || +#endif +#if ARDUINOJSON_USE_INT64 + IsSame::value || +#endif + false; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp new file mode 100644 index 0000000..f8b299f --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/IsVariant.hpp @@ -0,0 +1,17 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +#include "IsBaseOf.hpp" + +namespace ArduinoJson { +namespace Internals { + +class JsonVariantTag {}; + +template +struct IsVariant : IsBaseOf {}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp new file mode 100644 index 0000000..39d4cb5 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveConst.hpp @@ -0,0 +1,20 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that return the type T without the const modifier +template +struct RemoveConst { + typedef T type; +}; +template +struct RemoveConst { + typedef T type; +}; +} +} diff --git a/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp new file mode 100644 index 0000000..395a128 --- /dev/null +++ b/printermonitor/libs/ArduinoJson/src/ArduinoJson/TypeTraits/RemoveReference.hpp @@ -0,0 +1,20 @@ +// ArduinoJson - arduinojson.org +// Copyright Benoit Blanchon 2014-2018 +// MIT License + +#pragma once + +namespace ArduinoJson { +namespace Internals { + +// A meta-function that return the type T without the reference modifier. +template +struct RemoveReference { + typedef T type; +}; +template +struct RemoveReference { + typedef T type; +}; +} +} diff --git a/printermonitor/libs/OledDisplay/README.md b/printermonitor/libs/OledDisplay/README.md new file mode 100644 index 0000000..d7db5ef --- /dev/null +++ b/printermonitor/libs/OledDisplay/README.md @@ -0,0 +1,405 @@ +[![Build Status](https://travis-ci.org/ThingPulse/esp8266-oled-ssd1306.svg?branch=master)](https://travis-ci.org/ThingPulse/esp8266-oled-ssd1306) + +# ESP8266 OLED SSD1306 + +> We just released version 4.0.0. Please have a look at our [upgrade guide](UPGRADE-4.0.md) + +This is a driver for the SSD1306 based 128x64 pixel OLED display running on the Arduino/ESP8266 platform. +Can be used with either the I2C or SPI version of the display + +You can either download this library as a zip file and unpack it to your Arduino/libraries folder or (once it has been added) choose it from the Arduino library manager. + +It is also available as a platformio library. Just execute the following command: +``` +platformio lib install 562 +``` + +## Credits + +This library has initially been written by Daniel Eichhorn (@squix78). Many thanks go to Fabrice Weinberg (@FWeinb) for optimizing and refactoring many aspects of the library. Also many thanks to the many committers who helped to add new features and who fixed many bugs. +The init sequence for the SSD1306 was inspired by Adafruit's library for the same display. + +## Usage + +Check out the examples folder for a few comprehensive demonstrations how to use the library. Also check out the [ESP8266 Weather Station](https://github.com/ThingPulse/esp8266-weather-station) library which uses the OLED library to display beautiful weather information. + +## Upgrade + +The API changed a lot with the 3.0 release. If you were using this library with older versions please have a look at the [Upgrade Guide](UPGRADE-3.0.md). + +Going from 3.x version to 4.0 a lot of internals changed and compatibility for more displays was added. Please read the [Upgrade Guide](UPGRADE-4.0.md). + +## Features + +* Draw pixels at given coordinates +* Draw lines from given coordinates to given coordinates +* Draw or fill a rectangle with given dimensions +* Draw Text at given coordinates: + * Define Alignment: Left, Right and Center + * Set the Fontface you want to use (see section Fonts below) + * Limit the width of the text by an amount of pixels. Before this widths will be reached, the renderer will wrap the text to a new line if possible +* Display content in automatically side scrolling carousel + * Define transition cycles + * Define how long one frame will be displayed + * Draw the different frames in callback methods + * One indicator per frame will be automatically displayed. The active frame will be displayed from inactive once + +## Fonts + +Fonts are defined in a proprietary but open format. You can create new font files by choosing from a given list +of open sourced Fonts from this web app: http://oleddisplay.squix.ch +Choose the font family, style and size, check the preview image and if you like what you see click the "Create" button. This will create the font array in a text area form where you can copy and paste it into a new or existing header file. + + +![FontTool](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/FontTool.png) + +## Hardware Abstraction + +The library supports different protocols to access the OLED display. Currently there is support for I2C using the built in Wire.h library, I2C by using the much faster BRZO I2C library [https://github.com/pasko-zh/brzo_i2c] written in assembler and it also supports displays which come with the SPI interface. + +### I2C with Wire.h + +```C++ +#include +#include "SSD1306Wire.h" + +SSD1306Wire display(ADDRESS, SDA, SDC); +``` +or for a SH1106: +```C++ +#include +#include "SH1106Wire.h" + +SH1106Wire display(ADDRESS, SDA, SDC); +``` + +### I2C with brzo_i2c + +```C++ +#include +#include "SSD1306Brzo.h" + +SSD1306Brzo display(ADDRESS, SDA, SDC); +``` +or for the SH1106: +```C++ +#include +#include "SH1106Brzo.h" + +SH1106Brzo display(ADDRESS, SDA, SDC); +``` + +### SPI + +```C++ +#include +#include "SSD1306Spi.h" + +SSD1306Spi display(RES, DC, CS); +``` +or for the SH1106: +```C++ +#include +#include "SH1106Spi.h" + +SH1106Spi display(RES, DC, CS); +``` + +## API + +### Display Control + +```C++ +// Initialize the display +void init(); + +// Free the memory used by the display +void end(); + +// Cycle through the initialization +void resetDisplay(void); + +// Connect again to the display through I2C +void reconnect(void); + +// Turn the display on +void displayOn(void); + +// Turn the display offs +void displayOff(void); + +// Clear the local pixel buffer +void clear(void); + +// Write the buffer to the display memory +void display(void); + +// Inverted display mode +void invertDisplay(void); + +// Normal display mode +void normalDisplay(void); + +// Set display contrast +// really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0 +// normal brightness & contrast: contrast = 100 +void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64); + +// Convenience method to access +void setBrightness(uint8_t); + +// Turn the display upside down +void flipScreenVertically(); + +// Draw the screen mirrored +void mirrorScreen(); +``` + +## Pixel drawing + +```C++ + +/* Drawing functions */ +// Sets the color of all pixel operations +void setColor(OLEDDISPLAY_COLOR color); + +// Draw a pixel at given position +void setPixel(int16_t x, int16_t y); + +// Draw a line from position 0 to position 1 +void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); + +// Draw the border of a rectangle at the given location +void drawRect(int16_t x, int16_t y, int16_t width, int16_t height); + +// Fill the rectangle +void fillRect(int16_t x, int16_t y, int16_t width, int16_t height); + +// Draw the border of a circle +void drawCircle(int16_t x, int16_t y, int16_t radius); + +// Fill circle +void fillCircle(int16_t x, int16_t y, int16_t radius); + +// Draw a line horizontally +void drawHorizontalLine(int16_t x, int16_t y, int16_t length); + +// Draw a lin vertically +void drawVerticalLine(int16_t x, int16_t y, int16_t length); + +// Draws a rounded progress bar with the outer dimensions given by width and height. Progress is +// a unsigned byte value between 0 and 100 +void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress); + +// Draw a bitmap in the internal image format +void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image); + +// Draw a XBM +void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const char* xbm); +``` + +## Text operations + +``` C++ +void drawString(int16_t x, int16_t y, String text); + +// Draws a String with a maximum width at the given location. +// If the given String is wider than the specified width +// The text will be wrapped to the next line at a space or dash +void drawStringMaxWidth(int16_t x, int16_t y, int16_t maxLineWidth, String text); + +// Returns the width of the const char* with the current +// font settings +uint16_t getStringWidth(const char* text, uint16_t length); + +// Convencience method for the const char version +uint16_t getStringWidth(String text); + +// Specifies relative to which anchor point +// the text is rendered. Available constants: +// TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH +void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment); + +// Sets the current font. Available default fonts +// ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24 +// Or create one with the font tool at http://oleddisplay.squix.ch +void setFont(const uint8_t* fontData); +``` + +## Ui Library (OLEDDisplayUi) + +The Ui Library is used to provide a basic set of Ui elements called, `Frames` and `Overlays`. A `Frame` is used to provide +information the default behaviour is to display a `Frame` for a defined time and than move to the next. The library also provides an `Indicator` that will be updated accordingly. An `Overlay` on the other hand is a pieces of information (e.g. a clock) that is displayed always at the same position. + + +```C++ +/** + * Initialise the display + */ +void init(); + +/** + * Configure the internal used target FPS + */ +void setTargetFPS(uint8_t fps); + +/** + * Enable automatic transition to next frame after the some time can be configured with + * `setTimePerFrame` and `setTimePerTransition`. + */ +void enableAutoTransition(); + +/** + * Disable automatic transition to next frame. + */ +void disableAutoTransition(); + +/** + * Set the direction if the automatic transitioning + */ +void setAutoTransitionForwards(); +void setAutoTransitionBackwards(); + +/** + * Set the approx. time a frame is displayed + */ +void setTimePerFrame(uint16_t time); + +/** + * Set the approx. time a transition will take + */ +void setTimePerTransition(uint16_t time); + +/** + * Draw the indicator. + * This is the default state for all frames if + * the indicator was hidden on the previous frame + * it will be slided in. + */ +void enableIndicator(); + +/** + * Don't draw the indicator. + * This will slide out the indicator + * when transitioning to the next frame. + */ +void disableIndicator(); + +/** + * Enable drawing of all indicators. + */ +void enableAllIndicators(); + +/** + * Disable drawing of all indicators. + */ +void disableAllIndicators(); + +/** + * Set the position of the indicator bar. + */ +void setIndicatorPosition(IndicatorPosition pos); + +/** + * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING + */ +void setIndicatorDirection(IndicatorDirection dir); + +/** + * Set the symbol to indicate an active frame in the indicator bar. + */ +void setActiveSymbol(const char* symbol); + +/** + * Set the symbol to indicate an inactive frame in the indicator bar. + */ +void setInactiveSymbol(const char* symbol); + +/** + * Configure what animation is used to transition from one frame to another + */ +void setFrameAnimation(AnimationDirection dir); + +/** + * Add frame drawing functions + */ +void setFrames(FrameCallback* frameFunctions, uint8_t frameCount); + +/** + * Add overlays drawing functions that are draw independent of the Frames + */ +void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount); + +/** + * Set the function that will draw each step + * in the loading animation + */ +void setLoadingDrawFunction(LoadingDrawFunction loadingDrawFunction); + +/** + * Run the loading process + */ +void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount); + +// Manuell Controll +void nextFrame(); +void previousFrame(); + +/** + * Switch without transition to frame `frame`. + */ +void switchToFrame(uint8_t frame); + +/** + * Transition to frame `frame`, when the `frame` number is bigger than the current + * frame the forward animation will be used, otherwise the backwards animation is used. + */ +void transitionToFrame(uint8_t frame); + +// State Info +OLEDDisplayUiState* getUiState(); + +// This needs to be called in the main loop +// the returned value is the remaining time (in ms) +// you have to draw after drawing to keep the frame budget. +int8_t update(); +``` + +## Example: SSD1306Demo + +### Frame 1 +![DemoFrame1](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame1.jpg) + +This frame shows three things: + * How to draw an xbm image + * How to draw a static text which is not moved by the frame transition + * The active/inactive frame indicators + +### Frame 2 +![DemoFrame2](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame2.jpg) + +Currently there are one fontface with three sizes included in the library: Arial 10, 16 and 24. Once the converter is published you will be able to convert any ttf font into the used format. + +### Frame 3 + +![DemoFrame3](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame3.jpg) + +This frame demonstrates the text alignment. The coordinates in the frame show relative to which position the texts have been rendered. + +### Frame 4 + +![DemoFrame4](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame4.jpg) + +This shows how to use define a maximum width after which the driver automatically wraps a word to the next line. This comes in very handy if you have longer texts to display. + +### SPI version + +![SPIVersion](https://github.com/neptune2/esp8266-oled-ssd1306/raw/master/resources/SPI_version.jpg) + +This shows the code working on the SPI version of the display. See demo code for ESP8266 pins used. + +## Project using this library + + * [QRCode ESP8266](https://github.com/anunpanya/ESP8266_QRcode) (by @anunpanya) + * [Scan I2C](https://github.com/hallard/Scan-I2C-WiFi) (by @hallard) + * [Weather Station](https://github.com/squix78/esp8266-weather-station) (by @squix) diff --git a/printermonitor/libs/OledDisplay/UPGRADE-3.0.md b/printermonitor/libs/OledDisplay/UPGRADE-3.0.md new file mode 100644 index 0000000..e7a315b --- /dev/null +++ b/printermonitor/libs/OledDisplay/UPGRADE-3.0.md @@ -0,0 +1,125 @@ +# Upgrade from 2.0 to 3.0 + +While developing version 3.0 we made some breaking changes to the public +API of this library. This document will help you update your code to work with +version 3.0 + +## Font Definitions + +To get better performance and a smaller font definition format, we change the memory +layout of the font definition format. If you are using custom fonts not included in +this library we updated the font generator [here](http://oleddisplay.squix.ch/#/home). +Please update your fonts to be working with 3.0 by selecting the respective version in the dropdown. + + +## Architectural Changes + +To become a more versatile library for the SSD1306 chipset we abstracted the +hardware connection into subclasses of the base display class now called `OLEDDisplay`. +This library is currently shipping with three implementations: + + * `SSD1306Wire` implementing the I2C protocol using the Wire Library. + * `SSD1306Brzo` implementing the I2C protocol using the faster [`brzo_i2c`](https://github.com/pasko-zh/brzo_i2c) library. + * `SSD1306Spi` implementing the SPI protocol. + +To keep backwards compatiblity with the old API `SSD1306` is an alias of `SSD1306Wire`. +If you are not using the UI components you don't have to change anything to keep your code working. + +## Name Changes + +[Naming things is hard](http://martinfowler.com/bliki/TwoHardThings.html), to better reflect our intention with this library +we changed the name of the base class to `OLEDDisplay` and the UI library accordingly to `OLEDDisplayUi`. +As a consequence the type definitions of all frame and overlay related functions changed. +This means that you have to update all your frame drawing callbacks from: + +```c +bool frame1(SSD1306 *display, SSD1306UiState* state, int x, int y); +``` + +too + +```c +void frame1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); +``` + +And your overlay drawing functions from: + +```c +bool overlay1(SSD1306 *display, SSD1306UiState* state); +``` + +too + +```c +void overlay1(OLEDDisplay *display, OLEDDisplayUiState* state); +``` + +## New Features + +### Loading Animation + +While using this library ourself we noticed a pattern emerging. We want to drawing +a loading progress while connecting to WiFi and updating weather data etc. + +The simplest thing was to add the function `drawProgressBar(x, y, width, height, progress)` +,where `progress` is between `0` and `100`, right to the `OLEDDisplay` class. + +But we didn't stop there. We added a new feature to the `OLEDDisplayUi` called `LoadingStages`. +You can define your loading process like this: + +```c++ +LoadingStage loadingStages[] = { + { + .process = "Connect to WiFi", + .callback = []() { + // Connect to WiFi + } + }, + { + .process = "Get time from NTP", + .callback = []() { + // Get current time via NTP + } + } + // more steps +}; + +int LOADING_STAGES_COUNT = sizeof(loadingStages) / sizeof(LoadingStage); +``` + +After defining your array of `LoadingStages` you can then run the loading process by using +`ui.runLoadingProcess(loadingStages, LOADING_STAGES_COUNT)`. This will give you a +nice little loading animation you can see in the beginning of [this](https://vimeo.com/168362918) +video. + +To further customize this you are free to define your own `LoadingDrawFunction` like this: + +```c +void myLoadingDraw(OLEDDisplay *display, LoadingStage* stage, uint8_t progress) { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_10); + // stage->process contains the text of the current progress e.q. "Connect to WiFi" + display->drawString(64, 18, stage->process); + // you could just print the current process without the progress bar + display->drawString(64, 28, progress); +} +``` + +After defining a function like that, you can pass it to the Ui library by use +`ui.setLoadingDrawFunction(myLoadingDraw)`. + + +### Text Logging + +It is always useful to display some text on the display without worrying to much +where it goes and managing it. In 3.0 we made the `OLEDDisplay` class implement +[`Print`](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Print.h) +so you can use it like you would use `Serial`. We calls this feature `LogBuffer` +and the only thing you have to do is to define how many lines you want to display +and how many characters there are on average on each. This is done by calling +`setLogBuffer(lines, chars);`. If there is not enough memory the function will +return false. + +After that you can draw the `LogBuffer` anywhere you want by calling `drawLogBuffer(x, y)`. +(Note: You have to call `display()` to update the screen) +We made a [video](https://www.youtube.com/watch?v=8Fiss77A3TE) showing this feature in action. diff --git a/printermonitor/libs/OledDisplay/UPGRADE-4.0.md b/printermonitor/libs/OledDisplay/UPGRADE-4.0.md new file mode 100644 index 0000000..4b17693 --- /dev/null +++ b/printermonitor/libs/OledDisplay/UPGRADE-4.0.md @@ -0,0 +1,27 @@ +# Upgrade from 3.x to 4.0 + +There are changes that breaks compatibility with older versions. + +1. You'll have to change data type for all your binary resources such as images and fonts from + + ```c + const char MySymbol[] PROGMEM = { + ``` + + to + + ```c + const uint8_t MySymbol[] PROGMEM = { + ``` + +1. Arguments of `setContrast` from `char` to `uint8_t` + + ```c++ + void OLEDDisplay::setContrast(char contrast, char precharge, char comdetect); + ``` + + to + + ```c++ + void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge, uint8_t comdetect); + ``` diff --git a/printermonitor/libs/OledDisplay/license b/printermonitor/libs/OledDisplay/license new file mode 100644 index 0000000..706c10f --- /dev/null +++ b/printermonitor/libs/OledDisplay/license @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2016 by Daniel Eichhorn +Copyright (c) 2016 by Fabrice Weinberg + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +See more at http://blog.squix.ch diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..536b570db09931ec634b38777033432276bafed8 GIT binary patch literal 16026 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 literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dccbcd0210b5c1dd7bad824982c1ecbf5c1edc2 GIT binary patch literal 19502 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 C1xwrj literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99cbe1bc41ce7fe01700f5cd00bf04da68f9602a GIT binary patch literal 25325 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 EUrx=8H~;_u literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/SPI_version.jpg b/printermonitor/libs/OledDisplay/resources/SPI_version.jpg new file mode 100644 index 0000000000000000000000000000000000000000..115c9f3bccef1177204c88ef8b8cb8f22daa9e7c GIT binary patch literal 26912 zcmeFXXH*nj^Do*1NDw6FETBl193&Y?A|N0+j3i;mISGt{pk&EP6af(hM#&k;nUO4U zfFTG7%z(fM1KjpW@Bf~4KHT?yxNF^Yp54>a)wOGfs@~yO)qVc$d=a3&tFEOEKp+r6 z6Fh+PC8lh(K-ePy(9r<|0RSKcC;=|u0!Tr?n|25lKmgLjAl(n4{(~k1>8}u4fbb6) zFb5+3kIW22;t!f0lvyO8`%4C_={XD_`m4^LFRuJeGhQo{_@gZ_kLg~a7~cKy+O~Li{D+-<><|WZTbZ!#lPZBAqzuE#dNhbS?2BA*!#eZZ*lj;B9gP4hSCOPDHTZHN$ zy_}r%M;{2qL7kJ6|3km|yU*g+ufKu(RVRp`-Vpqa!zjMIA^e*rd-;~>FBwqxfo6qg`AKZ4){Xe*k+&kE%2`e{H3oL_zsiAcFag@tnZ>ZZPL>ncqn6 zZ@LMLi2Y4Bg3^D}5HJ>X5iASF#t210?q7Te9T-*nTL$dWKlJaI7+~w^3iI*3eqE1- z0MG^Q0k;5szyL4@OaTzZg559%x`1!M6mSF#0y^NK0XzWnT>)<(1n>cz!7_$GFMtAY z01~9k0TVzOFai<*UqA`C21o(Y057Q2Hn0KA0v3Qh@DPvzB!C>CAC$TWo@Kx|kOt;n zfE)uIkTF0WETsZ;0z+UKE`SpV1P*~*@WcS8z!N|jatERc2mmX<87RXIN(ce3foSmV z2s|hu;eZIh1h4>a05re{I08jrJ{Ry9xCEhv5JM6m7LZ6V_ZnFHEZDC~@Lv$%0D=KB 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 Vmt>cr&zI7iF#5{vw(shH|JlZ6us8q! literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/Thumbs.db b/printermonitor/libs/OledDisplay/resources/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..1b30db560adb88342d0803ac55ffa76a4481faff GIT binary patch literal 21504 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 HE>{EqEjBhJ literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/glyphEditor.html b/printermonitor/libs/OledDisplay/resources/glyphEditor.html new file mode 100644 index 0000000..f253a80 --- /dev/null +++ b/printermonitor/libs/OledDisplay/resources/glyphEditor.html @@ -0,0 +1,633 @@ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
Font array name: +
First char code:
Width:
Height:
+
+
+
+
+

+ +
+
+ +
+
+
+
+ + + diff --git a/printermonitor/libs/OledDisplay/resources/glyphEditor.png b/printermonitor/libs/OledDisplay/resources/glyphEditor.png new file mode 100644 index 0000000000000000000000000000000000000000..800efc56f4bd50ba347eab57f3205ec8d0c0dd31 GIT binary patch literal 68751 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 M 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℞9m-8fv#DxWbiNUN1>5} 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 -
-
-

- -
-
- -
-
-
-
- - - diff --git a/printermonitor/libs/OledDisplay/resources/glyphEditor.png b/printermonitor/libs/OledDisplay/resources/glyphEditor.png deleted file mode 100644 index 800efc56f4bd50ba347eab57f3205ec8d0c0dd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68751 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 M zFex8C1FB2SFed3sXJV=bggW5d3zB$kd9vzP!S6TUg}zDBa87s)sIVr2LOKXhQV5hG zfzQ+E0L)VE-V5175{xSlGuG^ZDf)Wpugt)?!0#`*Yb==ww0>daTQ;QpNP(A%&qr%H z>EF|QP7UGNyHB^fyPL0W&)$%e?$d_Y>PZn(Sf*k-KJx?DuHpX*gkR89FTcP_^1_l( zpx!+`x@Q3zHSg;OB-bemCQ9)kP-MWC=H{5&y-s{;V`PX(R4}9V0)^@t=peR?4K?NO zgqBp4IA+XFgY>DH{>W_IZD42CNq#N&>3rx1E;MIOH})*{^7jP5(*#7@R~Cm**m`8T z+dTj!zw9&W^$avagNIFNuE4t1Te0|%{t$8W>~quf9J+@Dpsk~_7BX>Tjw`nm zaGg;80CElCIFzlFB-biT2l@93IoS;R^PN)XVD&Okzk}A}?mm}kuzIvqR47Ei49H|N z%AnfN{@5q;!vsYdkNl1x5rx_^@-^hYkX%52(>_!Ep9wvqFhy*n?rgEApj5Ubb*|r` zFBS*b;1HWI804VO0}1~}LD#v3#eH_UcV#siQ^HDmE59QuSw$1Csz$goa+sZ3!7YGg z2I{JnEq@fH&j|`8N`@$Me1bcQiG9S^GU)j$l!+0%9J3@g$ZF;^@{p7c0F)iZ&qpLp!r*X?=j7mci>g(5Vlu zEili^S+CZq08DSuSm$naWc7d7-D7;eCV)rtQ%9z=D9TERk@?B?Dgn^-|4;BYv*Pjp zE%@u|18CD}k+ES6`)_ zMZw_dTdkZp=DR!XjQJ;DqbMo#`q}G!F&zEg)3GaseFR9=2$l{a>J2k14nn7DV&ovsKb_;#ErO)LVc)$zgdFJ(XmTCsuUleZ zaS1in`$lM#g5{sDk@*YzS52=)k`S}vdw+SeHeKgO=K^-g_l0q8FSfmpWOZXp@+`4I z?!4;KkV8ed+as^8^oetP>j##?nV{|A7J^u$gEAer^em_s`r@-e($;GYhJlflVtw4&UzPaUwpNY*uxI!okrB0Cjh_D zE*vl$=+0tpI?pO@>&5sLhz+^*&BTB`#3jfI-**ghydVefbBUPWsP^(*s_FXS_HXG- zoVO&EqB2t=uT403eHON_L(4*U&78IJZf#u!>oJ0t^*^RWqmojF1G>m2o|RP%DEIt8 zn0kdYXY=s!_mmT}I}i#sENHuIPGfNLso;qY{-cn>n~EcCEh!#8*akqd z8F2dBYfYf5V-uX5*C0OoEU;=FBP@C}RLpferQk}#4 z?G6XC=r@3%UsxDi)3mALS^|jE&@D`*my6#yxqdr7t(hLsIJ9_q`5SK4bm6K}cZKc2 zW_v+?K#h#lj`lRWF1W#SO*QO&Fpk~fj|^j&F5_Z}z@HLcU43{spiE!wMEBBSi6CRO z_U~$zY_<;859`6(w)q}TZgJk1Ztep}JM-s$HBTqoktubkiM64Rwj;@+Z!oUN)gN~FXeIf(SJ!KKy(WE zj)xRv+h@>_GNeTHrBbekK6`MU{Dg($i(3U3Lz&UOTHwhG+R3jhOY>ojdLg)Nikr?idA8YajD3S`oJeeCw}PPrxy_`jB! z&NgldO}|+B)l0JU`{YoD4Ap#lAjZC~?je0FpjT2@`9iR**@VHtQyeJ0VQGyQ$#qz)K^$*o>oe@jtgAfqx8C2yAUqi z7%9E*m4zc0s6;!8umay1;JqI3T2GVUW#=lfU(HHjdLc^5dRjUXZElo@Ag83z2eS1vlZ{%sQMYvmFREqWNu-8}Ir3x>(a*6fMl2Tnv!)4IaMhsW3fy z6-FRct&-m@jjj{E@(1MX;4$uqqf#%$C=G*#!KWMD- zsx8qW3XXZsxDbCyS#`DOo9?CPlY7a?T)tk(JA=)zLD{PnOsF|(A6$6+r7;m&ii#%< zdt8_xm^A5ZWk1A_jGBe}Zpcg-0YI~xZTHZu+c8Y>gVX)buyNy|d!N{L35Fq7aToWL zJ#9o-H&wb>s1oiY(~kA_V5dPkyaZHOZA=%$xxbd?<0mL`NE4!qh*%5Zlsh~B(Zdf4 zIbf8fj)+tMeuR(fjmd1=4_J#DgPIy$Z@fjTqU~pt-U3%s_3ll;V9xhgXFSPGF)${; z9Zt^L9rs|ApRJx)=LN3dp8y!vXeVo`izuB7j0wndfIt6*81Wh%F>32%>^q7KdD1f} zH0jYY?!8oDQ}01OG@Yz<6)X=*jb{DNjO!q9^ZX9Zhog(50 z{I6y2HsWrsmM-n10R$sQqiA%^=X)gM<{ghF?+IGDiwb~b-A*C>-wM{ZC6@pyCv?UL zYr3Ev^QBC;|EF3_`h{R!J>Gm}2aF$2_StE^*z2$pl=!D|J>(c1Owx=G-nfTrIXyh; zz6UL5xy@GB2$aLm0%YCAo9yb)k~a8;@FmnRFVnw!3efqx(#WZHrv=o za{_j)x)H;Ci?@AkLbFf~qxh*P3<2BV`1z1}nd(xT5 zFHN5LMb2RFw)WrAX_oW{U6_~7uCoicw#ugw@q^@mn);gdVSJ$iGwH9p`PVmT#*&DB zV?j&)Q4c~bwKt}!pjR74U7L5=En%uarVaS~Z(V&B59LikH@g93WAeLP%(3VZ={wWe z&v6qL-6K*GRk`Tf`q9M;@L3BXY8+zx-hki+F)|S3WJOOl#^ zQz4%_wO4({0(VJQcaGWArdwXDcMB^yc^A2nW{%y8?5eOHGG9zv_8e4_a(OxZa83UL z;xAHI{3g-v3_AD1{VZTsvKcLw?|d83?M|KUhuZ3+d%q*(&PyU$NcF-!$RLRjHZ}=F z|2=i6X7^4e_bN;7c|s2@D6hqhp=C|+1ED$>-}fJj>oUINBW@ty7e!Pl28!>C8f_H8 zOr*aOG(0m@p%}msVYtwWanGFT%ZEWQqvR0%`d6R25YDl1Xy+;e(*mn17Y%0?A(}iO z>Log5uZq)~^W5ez2JK(FvpE|}*l99|RP4&>2tA_)13J@(kWcZS~91_ID9aY=-efFpCylem>rUS)OxAmg9f1t8G~zbw=V}ku{%N*BSIu5P z-gPPG^ID5}{4C;=41otzxk6_wUC{)Yc2U$@R=`uf`^ z$yW2fcvpah?TOMaav%O==$lwabQ*c7({Tl^;MK5+`%To`pii6I9k+eOs+l{0h_<;5 z@#^~Jwe8DXeS1>@yItMzd$7Dw3Fw@%I?=LPai{aC^V->}HHwOT>%aW+EM1>>?U%wb zb;KDOMxp_kt>y`zw!!`XHDKuAqqYh8ke7Jqp*V6+bjRU+zDe`&;3fN=&ZTcv_RO$$ z!1uk8FyfW$0ZVxGRx2Plk`Zip|tC+q#R%4CZ9GPKYJ`O~iFT$;5SUmleZ z-Q`yTJ?f3zXp{MS=^6BY5V`%imq=4keRYRUV0TU%!EUh%c7~la}(F{-@E-JM277 zW56Mz%qZrXU|-n1Vis0g2?W-KXh2|{%6kSxlJ6|;+UJ}r=8J!$%d3mlbktnM2>l9k zQx`q;huc&5#13JfcnT!c(&PjO2J(wMO|z8A^C%)AwEE-M(7EsZTDoaV;0v$iOmC$! zly97ZSUv7Q$;aCzMdWk=h_Rl>PoG`aSZk~3#Sb<%o&Auy)V0C0&BB4=#?I9ZfmopF z&laHvFem>qaZ)Zl_Rb*fiHDCQTgQbiYKCZxjhM0Ug-VMta3NIye=DJ5N!?Qg9K&3O zm$(T4S@IA&gFx$zcDql55)QOaAJC=Bp8R8P*f(^O$9;*uRRO95X51AjusnPU%%`nB zyj^WA*Z*s}ya>)$9Xo8-CBrM~op)A@32zP%9?3t-db^C{jU@uK<_$J4kPV&Of=~4g zhVGG$+M-Kob-E!psT8uJfL9ha>jh@z{9WsV*sxLJg617V2>YWC8lwrc$Jz_+$xVwI zU0QqypkptxDVS%-Ed=Zm$W+x5@j_+dRC(%a^EfOJJ`m_u{y3-e|O_BTUM>azaM5p_N{phGCMqBM;mx1GNAss!- z>j6!J*!*AePZT@b#9Ll9Y{}O!%rq^b4u(K++agwz~^% z%=>8bC+FN_x8VWX`)u}cS=c2wWZ3zl^t7Y%bioR+og+m5q9bg+AzG?=>vI0S*Q!Nd z>YfUFqtmRHuJ~zOD0|H4*T*(tFMGG|#RV#~_2N$-x5%R8po-bMfQO@lwIREQy;?F*5(d8cNUYUKO#6M<4QDGpl`GJ9_E1IvIRAiW;Y^gD43X8VkA~Sd+yJ?1{ zpm}0*BvG9}o&XHS*_5Pi;%PsEtxE9}^*p~fds&CEPv$fammS3zbg8}Ii4<`{Ly-Zw zkg>}{ag_yt#b_K0YA{N{tpmu>W;?Djm(XA>CgsSc*;{?x({xuF|Jm= zwiWJk%~RDP+(}c0)Q)+}xb~4Y#vDid5GfuRuJSf!X0@kP!#2#52es4zKn_{z@JBvw zzi;3&SJ&J`BEZJe%y@YbnAxThhY+fdW>Td4{M6blVnxPtcW*7i?2Qp~U=?%M)7N_5 z$n<*jth{0W2?`f`_y?z!5oIj&LXQopA?nuoeZ5gJ@y_2DZQqru34H!HU$v2y?eo zx@gL^{urJ|Ni6o<94Prt#%7=ni?Ln16Cfcupdc_x;(tk3{SsFad%)K>GbYkAc9Dg#Xi|t87y~;@1Y#_L{D!M#! zg=|DaJyFk+;8)2T+m3U}U-@LnSWg-Rq?8fgtqO(|8h{9&V6|K5B{RrXTc(FiAc}=q zF6iz%#77+*859B>pi$=9WkT)IwyeDc7fu8R>)Bx(>+?JaZ7vV@KxZ!4vgcK2>UR^H zZX*puzff0*0W!53&Iah%J%IU}y4}_}Ab`++rR*YeyUNy=mCMd4vf^~#3+S8j zmE#`EnS02F(c_GHhyb)EfA+tv$9(NyT$n#Xyulj%AMuG~;OSIO_pduZ;KW}1mB^&P z%_qXcJv;*;02r*qMRxQ1-#3OJQ`ABI`{uX1aR8Ut>U;v+FM#LwIT=;l{T(P`%>jVI z%`gLE$@AHlyw@&*_+eJ&rH4wXg&ywwK!F+1y9Fe`{xu<}Er$b@R_paib}YmVG|ir> zAdBi0m7Y~%t}!ANxfGZ}th@w^!xtz$CbWkg;ti~0%FAT}KbQTQUa%g?QvN9=-r+Y( z+FRNlcH?Z@xrdLcy?B+{1qv)oyg|U3W04-q$XHOkk0uJ`l(el&b-|G0kP{vHnxv(Cufx%^w)+tRE50uwaj51qhYgJh>IB zXmWc+#jOD%!03(QE`)O`eI?U~Xf3N^HNpLp!Yyeskc*7B>h`71OWsRJ?F!44w!jP4 zwxiy;rAHNhy945P@B5O!5VsKAISjP@;loWE#mqK^^z?Mn_0x<;fIcnFgqbs&>!utu zl7+l%9tFrfR8gv+#QsxaqHv|>AF6_s&&2iBnT>VMlV}_fF0fEi@Ax%P?ZlDwm}3?v zl7u{;58Lx#PCB;tCN zc*tQmti;qNx&&ww^U`^%BPFd!QbJJOCX}SNX;opxT? za-8Nq-765hoFAzxem(xk(wvS!f*=6%G-;j#A(GvWlgEKAx`S&u!!`&^?_(c>j^{t#`nelLACE`D&yl(s!aO(|4?Ln*7W9k6Z@O6 z-gyu{pMoCO+!l54>+bR^JqWdX1(pNikd^$7u<%0h@nz~T!3E)+HGf-{5b~U$5mo_x z*ZV*lAZx8go<8innPWtnqiWI0to9fRD=nW{cXPgI^LXL1cX2Y~VT`!&_g}pbIMP47 zI8L%?=7gyDO?=^9$$KvVV0`Aep^UtlL95XXnLz%f!|6$9rOy98hGN(hpt`O0P&R+g zTQ#_RfuLb-GPkUw#ch|LO_8rZ5w;mZa$n{y5Rlc+30bA&sT$fGr z2sTeB@w+1yvTyXY)z2;$*H+D#Su$wbVnIU8wf5yt+quUb3CwP$e9ZHs?AjY934^?G z$8%2=&L`V>tr3T~pFJ+2h~bg7Ht6cb@Y-DnWBOkr9HYR8KQ^1#8DG6J6Gzh?QT>G< zwB1S4w+WFB3+-x_X7$@4lwtqu-0JWCx1C!MDy!IDvu_uer(r#fVw~sv^xD4Yp`tuY$HAbn0Iz3IQs6ygvX47)SBGNB5L^AzG z0-6|`ucwO@_ghmJ-$w{nFZ=6Jb#NSmnIP@GQ$qX3&9+hmRBZL$u3Eo%n?BD5FUa5o z_p>*Z2E&v5Ht??5Wkuf7TLS|MJTA95-?S2u{S6`|cVgY7uUa!pa9z;YMc}vlx3MegE3&Z*6j+1`TdB&%KO!5unwW7y zuLH(_#y*+Nudo8d34dWXFjG9$6{R5m1EA8w7(SwjeJI~J46F) z^1+BmyAlw1v|~t!N@pO2)EqPe8q^WeZ;&!-Z4By`R|;AZuUZ}i$ekc*=0FvXFQ=u! zB8>UnjP$>e*0{;j6v>Vj|LP;|$IzO*w_dz4H-n7IXUA1%f)D7JsR|^A3h-57o;BYPxn9_omL-Coimo<2=MIsv+rh& z7{p&u%9xHsHuKgUzvwTsdW1Xt8iLfiW6JPyvaz<47@J+Y?Hhc=XtUpai5@k<9pgO@h|lBckUI~ZO}Az6yn+IC)0Q`TfyEWziF}8 zj#%_I5RviJ8!hXgdBom|ZynwQ*y3R?y(SVgX3*IM@W{i4 z^4F%Ul-zktEUyTH<(0g9$W(ip$Mq`J>PgjrA^I-#M;f!a1qElOE<<-$tf6OlEPaI2 z&I=a<-Zi<#1xslQU0-qZY_J)i)kO5urMl>aHd~5@@$w=Gzy&o~YP) znYU1k)yrv82a=%uHbixu$s_=_sbf5rCnu9`V?$l&ifzV6QopwUlvAT5)LvnoDNZ(w zr9DKY<{_+{r8?LYnqMM2Kg;l{=c8sV)B=VSnXDewa9r=4b-d7Zio=;6LkOhoz{cz0 z=$E5t2kiGCU-fd>-)oq=YM4T2Hv!pOs^7+~GcoWTrJpGk3qCM$m($D)+rYj@SNQ^b zSIhhgFP+T4!u4!7k&*hcNdiYLrjkV$AT;bG7ZV>4|Z9JTq=xE^888fjc_Y)T0 zD(W9*T5(!&veJq&|Kb||$*c=wJ8g0JtBD$5f`b`P{EjTs$uv}s))aY|%31uMu4Ba< zxMpr&8XCUiX^V7aC|&QcbN7(l{;)1fC`B>Sf?KoK!`qi62w$k*Jr1$%AiBDF1N-*| z4sNLi4q4IakQBQJ%Tz(rEqyvCW^t?V>)Yg`G*?L6pg7*rw&>>t#@5PbM&m=`)}X%t z{S6+V99^<*x(|QuU!5>_g7JI`PQT3LDeaW}jm9s%^$VzrNE+AAlohL<%7V!W)3w-C zT4;3@H$NKF)=h=Kzjbzx>2LQQTG`L&I`v;(QzwR_Y_^(G$hmBIQ`JAhz-WX_fXidn zzR*7D>Y#1|-iA|G;@-{nd4i%E@UsYc`TOb7R7*07wjvKymAb?^-5mHn7pu;^LCaYIJycNj#c5!HqIZ2~` zK10cuy<;fubi`P4Cjm`1=C-z)#AhagH1JKBN*Ba=tsEq3RVg1=L-7pK^_3@fo=O3B zqg)7h5EiSCsU?D##g^GQN_nR{+f;tu#!1-kn<9Xsl${O7t&J2pGC^hR#%@bDHQzm! zgPJcJ6E}9%YqDuP{eO^`x)*QB}vJtKrFOGS_>3 z+ZYsJEaY9Y#aV%HCj8|b9-W^Ld zeqHrLBgCu}=t&*La&K~&ZYYQ0hLHs*hRKPDJQjDNX1o-w6hRFFaI~&5n}>kldalN6 zD=Dl5#=?|>=I~eMoj|lRh+(HAB0+sKOOJW-1@)Pv_vsI#q*gy7A`59zw%I8TBD=98 zA=U?kNnef_DvQ3D=P10a{xIq1Ziag;s)=+iXR0^>Ua-94WTNw;m2p01JIy@NBM{M9@(hu{z?Rf0RT@=7wrPZ#Y6nJu#IrjHYTAgAlsH za_-hgCJUcyiG%JD)}IEzBL!=m*lfJPEKLfJF+?>d3mh*M)u=NmeYFmxZD-=1ukW8F zxbKySA$G+Cw%~|UV~^dL8keK>p&aYWeL47oZq+yN)x{{dagKB>>YczZ<}$Zf5U^fY zgQ{*V@`VAq9(yyF^VV+2m$@I3)Sq65?qE#i=w5zII{V1tLFe}3sw=*tRWA>aR6U`4 zpL;3K+XVNf5Ok+!)^!KGen~(ruv$F?g^Nvd{6OqLPnB&2Ry5BhjiHCtWY!ssmn?Gi zuz?+pI@+4EI7FM^`6LS>*nFN%@UmycW7Qk#dK%MI@Dn_J4LxIioYH$)Jj0{d z2|e6Fu$*@Yo^3$SjIY}zT})EADKQ`DFw;7t_LUKW+JV=wq33Gj-_E<;PJ7{N#z{Jf zS%xWRyL0t$$wI#8W?R*WW5FbZ<>M4x`SiQ^B*03&hsWCDY{y^r)I_ zWuV})SND>;srKBjmprP|8j3%$h`94pQo@NZMVe$~gjuY*&YB6oQ?bDmzm zp?mpR_q-g6Q2fP4{nv1gL|z%+guEX)UDAawCBfR0CQAq5ipyF0%o4~udHXA`%B#M<97BBw~#M-gj!DR8^}ou;7UX3`d2CvCt`G7Mm*bVF z0`l_dH>9i{b^W*L$p5+$`8*#;Pa^OG{QUvWeA~skqjXGnLD>m;L&41 z^2J5^buj}Z=Lo=sw~B$D>4{vsZM-rLVL=ZRJ|K9B@Ly$d8*#k!opjxTx(~u*u@R$jK(JrpXj|K|ZO8e?%pJT21Vvlvw z<>WSEmu0iRc%Xn7F{}6sExEVe^?XdDjiK~|l(jp{fvc+K<1G`xWZkV~d9nw)s|e#A z4}DGbor?x&Qj2@&O|KyH(el^c*LZ^7G&2vrP$I~Ads6e8sYKjr)1dc`aIO)-)29(M zS-#seMPb8Ik`oWwn}ZBXF>@cuJl4{?EpVe52RHt->ZQ-UQOw!G_6I>)jqg8Vk-4(p zqP4-o7`-`9*y4QL^7TIA4no|ozmI$6!WrN8G;W5EtqQ$|rPn&qI3p*Av9pLEbnR}| z$OaSHXMb>QFArnqc*tXh+M3%tO88e$*b7d$?(ESpY)j_xW}Wi4ZQpi!+mv%8WM;MA zSF_5c#o3c+TjN`Aa^Kds0E(DF|9UyfxpgG8z+x1?=Wc%XNtgBU8gV{s_;g49{VmAo zpQE2MCEYdQlYDNx>+GeTVy}h4btqb8zh<&YzZ5+`LKwNO#F5)ks^HrC=1tCBxd8S^ z1&>=ls-+AmAYBWmNxLJFPLer#(%SD-ZbKD3A|EgH6@79 zSzxaxBF|R@Vzl_tUs=KqZz@XiL$?Y)Jb4VRs^V&xSAh7NZNv35wshF&bU_iT?mhRneF}RCwuk+#EQbfj4 zI;d7Jt_Zm9cUKF1=5_rY)8KbF3x;igYn9z5`qR+ItQre6-&{N@?3~y{qSK5GlJ=~? zTB9|Uk?pO6=Z08&#{!kw)=|R{lVF%!ldtIX!vGGCJ@c4##H@;U{g-+~bp2t#GOunq zmPEi3?6)Af8T4}5{>CiTMmmdi;7#0!YDxNZc((gtFuIALN_LW!yR8%EG8*JN!4p}} zryYa$n0PL`paUzzDI(EMC-VYH1b4yJXTFVtol{Gr%>Jj6r@t_Em^pBeW7r3qPjVTS zlb64Qf%UPOzM1#TKNL~k-LLT^A(^PfUZYma(*Mt1en&v%xCes;CGXxR|rv>lV}<=9echDuw)U?;k; zkM&1v(2JA$iK7d_nxk@$*(AgT#yXEX9CmiFBEJPa`v`qcJOytS;UhtAbqZ%68L^5t zq$~#g6OXE2dcxH84{=Hhjt3kTY*R@bOpYsbn%Jke*j!l}^RmTOcVJbH@lvLL;2TNj z{UaWi329>Qjb|>Ft*v7O8EJ=tAcavo;pV*LfpAYf%I2Nbi_g5<jPO%4+F~$y8xE3oxQgV>0uMRh(k?i zpq#s8+~~#G%8?@!MpAzkv@>eG&|8~Ve}D_`=A15`Zne7!>!3gcS-Y+9S}%A*_x6%b z)5oDFiI<-jXIHRvFTKvk9qSIrJy+zJ5q3~eby=yUxCtM0J@Kp8x=5NSW~<)?`pP!w z%B7t9f@5w7Ka`wW$L5y|^ClYdnBT2^yIu5)q4qeVXL8C7mf93@LgxNG;=EYU36Yb8 z5F2ibR9Iga7CeWk&LF%66(wJxB_TEkLO_YaY>l>>D9k(A6S_ZhviwZY>ar&Z@he+F zGE4CCSQX=GP?iMOhB$I{O4Q1e?9(_Kn$^WDO>gc%FXR#hM<9<50^|<^AOfe+4dod>eg9G6Mf^G11wqvEOFm-T(6(2t9H zcUl=Bx))HmFnzkf4=X74Ymu!(#-g{8$d5JoNYlfkqou{S$VF2*^z2~`9X^Q)+N>Dd z=AjY7@Eku0++#4ho*XVm(FT@h?`P6^UI8rgaOR?!12P+3e-D1xmM93#M~{7z#5iQm zA#(?Qtk<-zi&#sVn1Zj#LFbdM*TbrH&z4x=hvkUHvxEBJkjwHNShI0CVtU8@f^iN3 zx@B5!ah85>yE53;yPpw>brltA+S+7-iK}}zdWoDdLKe|?=$$5!7|>%~F{$ccEo4Bo z{(LA2ah3!fOMQe~cNgkCZ86DKZXV=+9yx*>gxBop6 z!tP9D^o{0~E~>e&PK_GKiwKqQdDk`Omw&{QSCq+`)W4PeQOu*GWrDYm&jK=Qrn#BsSE?@OxOO zQKP=-fB$IHqNs?su=ePoAC7}80e1}%hC#b6r5!?;7t7l^T2JgQjqkO`Pq}_NNMiR> zQNNF&zrw?xJuc*LYu;lXxZ5e@A0NLX5fnlzzzUn`o)t$&;H6$I4hw~pSnO|Hy$m!+ z9z?EW`YlyKEVWvs`GXB{_vygAeeI1X-T(s|v(jSVu+5WI2jd5f)|QJ`($E@MWD7RX zdt;k4bhd~fE}UEoho|e~86$k(5X4l0HG&98TU#o3WdkR}0xWDFxB5+7z-^0dYi^f4<&G@$Om!%4{qLc8#oV!A%ER{#GarX?Nr%aIA zo(Ws3x#{rjbjQzog>bT#PzUx^o$n8IdsqShmauSJQ#U?3q|iROJ2v#gbvGI=r->^CgP9~@#J>py7?6P3l3kJ`g0uW|Y1RMm!&xVTI4 zxX!9CB-^1QYa~HwvWDj{dh60p{%PI(Wk2%t6yQV!M=)U}x3LAi^*nT1Qge*%Se!9&%-N-@_VXQ_PaRsY7)`V`*?GUqSMW$WiQZ9iDW$l1I0o4XaH0p#9BW zV)^mCe8yqX^wj;KpYj>Y)BO04(IL(zQ?!4>QZxI(;!-`?vhm6bf6 z$%2xApvW0%j!YwvqUdS zAG}|yGaI86kGGl~Gc8@nOx250kMH={USwZzwsU3KGFtgF>uG0g*P;&D<-0ZU&ncpw z+wlv|o<3GXr`m0@hBqO29DJ*Lj3KSn56tWD%H4>BsUvdbHiixHS|}ipM&;V=G_cy4 z!Kbtlv96q^Dc^%GEy`g(Ztf{*oATp4+h?#Y>3G*p#*87>gGEAa!G_&1O6)vh(_fp5 zJ0tn9ME*AxrEr<23*Ik5#^&ea%iGP-*R1VT#!IS2qA9dAeAy^=z4bcc(qH46z56pu zVQ9hUeqJ<$lXBXmhNCZ4hMRL2@8%y@M3Se@^RvNh-J9X91MVX~5h)81g3X?*lTAg_ z)gNGVkccjI<^tqlDWL;COk&h?TH7}rLH~JqlRK3y%#^=4xwqO@c6?0RMp4M0x>sO5 zqe@+3=>rotq#-Opr&-*TxIG@vIHM{*P?a*gH!e7&vYiWxZ5L4d;()&90F!xD ztgLiq*SgA|(D;{AN%xerR+C_H2&WiJHviAP+`H7>;^r=`8i_|INed!v63ZQO$ma=Y z?GL>tyz*xOI_9Uy*j86!dNOfeGw4`R@%8<#VgZ>P((=q~9p3ahiwD8;stb?RBjg_j zGDW1U#Z=kd>*Wc0s!7bjr^F+{W}RxBek9$^Z;Iwm-22Ix4u6|^FY1D*%6fY$ux996 z1?eB=-u^@BOZC^+M8``w$AeDp8GA0cQn$NapPIoj-}At49Op#+I&gM<_qsy+7PZ4&fJ)zg~q8{XzjoBysPM5*~A?l%EsQ~Y3XkP}P2FJH@*tyjT2eJ55u+t8crW`o<8!N`1w zk1el9+6F^C!OZNE;Kb>#Q}1=^{)HS0DA9yIG$M5GaIN$A(l6UuDx z1ELM;8|Ql1D_fZ5=u!?frQ*wzb9-)ZK`Xbpq#@7PRn^~7n~TXyVsO09vXOdTenn1& z`RuIYc>T5XC?68US$}Ak;cbYmi}A0)7sy!09Q8Lk0z{C&)?(?sLN*>Z2TweJHL@s5 zb(9R`w7IDdCH$NgccF)64|2LHkNru?qCIqfD7s^;l6D;wPg$*<`iZ3fzF>jk2UeF;!%*JQz9G0=T=|V~5p%yN<#*zE)g8gC9sUfBC z)9GI}9-&>gD4S<-e7xJX*7?q0MGv3X2rlvonFgGGp=gaJuZs?q8f6t$D)kEvnsjBE zJJp_yS37jAW@$a!a>{Ai)4XuAIn~&!Ebbw8&1O4o;bKNER4rVMr{8@qU|{1p6;%7D zRf4jeEN>+C{b14cd{Iaz@#J&c^K|9n8#(u^oePx2)(>>*H7n5|91LXXHQn_a@eJ%P zEU%+i#Ve$i^aeJ>Z)3=$M<{eFbjuuVxPLa^DY_8+YP#;mS?|- zuiviYgavB8a=lKid$~S6TMFLPPil;v@5`pBR9ZaSA&OiSYpkf?4|1?p_~v(B4f@Dg zcJz#%6uVWqokY2b56euRu;O2v-+f@!)c1*B+qtwxmAoeshTyfQdQpeClF*v<$hV9O zMo{8)SYkwOOnZDbcedBAq_@MBOuuZ^d$5X8sCv&&Z}EbCnz<*IrXo9fSe+BO1-0~Q zJPJh~;RcRjc{8#x;qp5pw&p+3`dP3jJ3MlPB=g<4jny)GH}jalCN50`_BV-x zOb_Q($}R!(l5&TdT7o~(c@FP89l*?S0A&pU!D>M)fL~~9nH!T}Q z5#5QySPZ&{*os-fK91yQ9@k~kyFSUUvWp^Ps#OPh{p41=Mbtb!JB0lNuT7GD!MX5< z%V-oCh@0R4n3(pM7W-Tqj#N17TgziVFj~)ju)1^XA;&vy-!lHgA`k7EG*nW|a7z20 zP}*eY>Bgq(i(?RQsdc+Y2qx-%#JP{cW?b)Is8b40Ch|BYKCK^R%yq^8HjYoyOKgKi zn9xKj@laRFKrBPjIR2(dTq5!FvbXy0m3vnwo00H%Ri+W?@?TY#ESNxs_tyveetp8= zPyEI@ou^hCo41Io@}bHj=0T;Nl#G+%(>voB)w0B%p*ztLB#{drt3)OaYh->;b{ieO zY?t;x>s^&gI71U%UUE>K3@3n4eCwAds`nqwYOam7n_94(s*!a*kj9CXWS9DVM@C3i z{mveoo%OfHUNa_e-fLM8Qba1ifiG!^aHQhZ>4 zu%otV5_PT4HxLkw4hmN}D`$&s;OI^EK}`jukGB8s}{r zo8f&K1K0HE<;{ro9*3RUKjPaJM^2wOwl>MX>jhe8KIhx-e0?E36RSac(K7esAc6hn zj6IUcb4jf^D#Caf(yviRwH1K}VH(@}PV^t6ob@_mV;P=3$P#e<4}*kMN*G5j75@Cz zRo$ef#G~EoOo2R77GCOShWuWG!Uh>0rd+(6hRZn!9F^)rxNGg$0EX4-$U}=>jpqRX ztR|CW^{L+VLCfX~JCkKa=|tZE)jhN*i^)53c1AO);~HgHpG-P~PYllSr7M8%RFozA zar?zk;@eGj5+Tgy>UWDnr6timx0`#lj@I9Ta}c$qw3F#%aS6K#UNyIAP}4AYj%%z7 zgJKL59&fzV2HXfIL&9NT@%y+-Zm%2{qp3K~SX7X(5u#`JIGmqx8IyTtbARiHV)(x zzw$lk?1Y#qkH%6DBvigho^NbdRQjaB8Mq3w3}YC zdv8hr`5J!{R*u{{gTJX@N?Qna4${{O3%|H7C5FllAIE-7r;@>w)WoFB*rwy6q{$wC zOuI6+&ywA-&A`Y!CU;NS5+LQ2NiW^|m%T4{%=^T0_)1<%@r5N*Yr=}~>~OBoTT0cqd2VdAeY0rQW*^~IO6!xbK&$R78YN|JxNj24pM8Z7L6?DYa1j{N- z9Va?OC{(LX3@{iYzd{NpI-pbfd2Cc25?(->v~1)w%D>zytSLRZKYf-bws$VR?-(2KWnAAasOyVvJzPK6fT5j-&$+zsX4>MM zPqCy^2EVqf;AgjbT51Ssz8K^^stRA{EI_xpFo&^693K*BLEiqE{!`5vHJsP!DRZ?e zAQ2_E=0zsDxtST27V1R{ma_3@8)bn_`nuPb(9b40!Hc-_PvJDFBl*uTHBy98~=fmH3ZEZy#4#+JE!uB^@pcqoz3o zwvQ7m$KTsqA!R7YjSeU3D%A^1TY=>jRT)n3^>3EzhcVh{|LqHOScK+IyatDdI4UT%O#ygk+!rFT;i3swW__ z9y9%!(1!nq@z0!jT_F(UKe{+;FNH8nD@bzDkwp|HF&E_2BxaG&+Z<`8UtaT6x*I7~ z4tbR67+hGpI5yH$!279R$9Cf-zh6&QD%$w+&jhJk7*U%}ZqHGH1`|&*YcG|M5d6im z9J`DP%iWsSu56Ptc8P+gA4}4td9_kLAuWAXx%rc_3tnCk*T5CDxm%k8xH|#Z8lc$soVJdX~?f}MH;o-ArvGksM^%OvQ5A@#6F5B!xI{{{nZ+%|2(wo^WCN4 zzyM+8wYDUUB53jtGsj+*^Vhm|ti*DC3~g`qVf$%{877f_vTM`d3vl^%{49rOm#x{S`Fb1G2&R>-(bxNU zXYkmU?2($EZF7XB2Ey!Hh$-xBY@ZWJPSD-CS?{Nhq!)T5-Z`Tn_2DN#sYz(iZg=E| zqw9TR+?IHE#>q&N54kO-C|R1^@jRJHtD|O2G?v zhbLc?G7bS>19MUULs;aUuZ!wr!N$8t{0(H&NI6|69BELys>1?&ifpXico$ceC26lF z=QT|4$s71SnfaIq$=A&0VxbJ@+eH%a!$-4NF0en}%QL zJy}G5^+$QgSB4bZH3G=uVNVti&nP}NVJN07+V#_Q3>@i0Tj%~DOO|)?fR0@`v2zhc zKE_GYrMHFvf;~4szb9tCtnmP6tNT5)*BL&G(I3XT#dX5z$QdyctvuzNTuzGG(^Yg5 zm92j4bBis=0jPdH0eqPiL zzL;uuBpWL{e|8#AXvAEg1UJO>LOG8k;5?A06#UgWfCo^%;%+xGjAN!V`{0$`F}@+H zJdrPYS>Pdm$3tc~thS`C=GJlNJK-^mKMVmWf|Pynk7G6rUFG*4xrU@)MELw}S3kMh z1S~+b|BDxJkzY*WI*J>}c5r|?I0$+Y6_oLm+|LeG?Y;*J)4(s_K+Mm^%%@8_mWILT z#FY~DSpIxlJT#Z$Bzz~I%0OQc6#cp^8V1B!DjIPCM z|2lMtqqe7EM1uC_vr>3wJFkODTu*#w+PSgs*ee!>FkY)x)#+}BQ26Hsqm^&pP*l0g z5Xh=-$p0yeIyx<`vnch(HO!xgq7M-A*O4-#12T2ziA~DGZE5`*Q}NH#3ENWw|7>6~ zpHIp5X;sGKKc-E6GcGi$tV^(@dc_!z(`^tg==6W=&sQclc^Xv3No_&&7)7T4Wb&aa zpCxQDiMH5i7P%$nU0z^KpAHMGZeB;#2z2cJ4Hhta`DDhs(qTgjfPh5PJJ-|N7~86< zpZJJZMngPH>?RXhUjQm6XLvXyg2(y z_B$~~(w$(q;T|s(nJitfJPc*o7tO?-Layx{?EJo#PJ@ z{+gnBASmvrPh@M6ci>?z%^4b+V|(gOH|}Mv0A@RD^R=Dq#m4tzO*P|yp5!+E{JFsn z8>7T*ZL7vn#qI|Mp-PX}J5}a>oXG0Si@yCsPWBmN3^WV9&*A?$7k>(wfRMv4^3U=^$_NobM2oJWE z(E>{AQzRE5P_iyfSDwIgT)Y&e3s3_)=a6=7YikUikipN5v}6`ds?J4|I2}Oh-=Y*| zP~#-wwIcJiknMQakvBAzZu{MMT{c_L{QN8>VM?rVRfp$oOniwQ(}X&u57%J90eThV z1}0^h4IlK@Ra|Ab_aDKBhp)n?;HHi*SKy;nU93tDq%_+_Sd1w5!O!pyqAbL4_^R-w z<8Cc;{t*nf@a~O4zRRCn@ZS?*FJ94sq~qZzt^W46A7%mZfi&?iNa?G2^-2s_B#^1b z^RI7VzqRJO+0e_-onO_yy℞9m-8fv#DxWbiNUN1>5} zp2keeP;!@8(X7YAz&cJ$&@(0&*9;ly9^@=rIo^KK&8;k>z823jZn^ymnWB_)zdcvW znIQUMp#Bdn007(B>f_c=hWtQqWn$hmgLu9f7kz7RXL=x5!R*A$RYL+rV3(L6vxtpm z?J@g)$Q`>Deu?;sxQF<9&gL6{6<24|pL?^!r9d!VbZzDC1Mx;>GKk)y^0d=8sSL86 zs&`XvCvx#!+ZpH$YP}UZ%uZe?3ep5HWf70C#)pf@p~HX_+I?GZs6HX(Ea03e=dBi%6AWT8@45VO ztCy1pYtg=VmA2fRdI>GBOopbaxU>Y?9^k-Blm6{th0^EfK_1%M2e zM)89j!I^_Wo-^+!Bk%y*rQvSYn@w?J@4m($<}>=#pCe3L#?~1N{Vp_=*@Kg85bc>l z2C-mt8C{}N%eFpw6Lpqf7FXbqE5T$^k7Ro;(9s4Qv8_E;^#Xgvy!5U29VPCwU~2dJSa~7 z`Vs9&E8|s#SftR$w;-x|(9j6W~f8MG$NHUYN!P$(%eQbSN z1N<>(ZV6ys#2eXEc|T`fplGY!dUOko-a)Tzd|dDIj^?*03uZ>j6j0C%$*VSXb_^3k z>TA3g6nhWYwiU+Yf&*-o@EaG5;R!*wOtSg0 z|6Em0AS97JS-J#PWIqV)*(XiL`S8@`A#e602Y`CxBIW&`O);}Lodd}#9)|Ut}iiX3Asu@#Ra{3x@L1Org{{zhTROER!SIykp96kq; zdM1GVe6dlm(mxD%g3mCBQ4Nh5k`S3C1g^FFdW74OrCB@ejK+Pfs8~t*A*N)++fhIm z=FPnpou&vv-u`ilZybpIwR@nf--jsSpgQ*j#I(n$f9Op0P5`QS(x(M<8u&hcs@a0> zez5DGe5X|Ei?=i^!)dzXuS+20Uo^8}#a#Yphb6Kl&110r%p#IR3}D{W+7{y>?@V&w^VjWZsR89~uhsKg3I*`Xe}Qk~gT1=vrag!# zd4FCM*_T;Rg#WiZt9Gm2=x{E!Y%wQa(O5p`1O?{q0%(=8O6pScRF+GJTa=Zs-q-|N z)k=Orosa$D&1l8q5ibY?hL3SxawZK*7e7ASivtsZx4&?odZWs&+B}cd7ahn@w-0E3 zpkk^u=(*jT)RSx-49i|)e2@LMJvbU2qF)=qE{vwK){xDc)vK$n`vZ-g1cPpKi z+Bn^Po!sIQQ5@`{Zg3ldGb;8M2F0A_Q<11pw2~ah2h}K?Me}2#PH7eM{|Uep8al;& zt4=uj8iQ6(x4GU>7jnXB1bL}cDq@xIPLrB_xFE;O?E%=7+myn6J2N7=ld)9nD9{q{ zzcD9cY~*(3#pJAPfGM5=`noO(eD-`+YNw#AAq&oXE;SBcDH=$p_xf4BM1-3%3~B28 z#*N|yic%#HOCuwcIS~SW{g6!SJj+Ux?pK{_=x<>nH4V;%4KF|;MS zvuG}D8UpRcrHEE_3&2jDD-8Ex*RsS3=8?$Zj+koSffw;755#>m8~8Bm^rx@)5NU-jdbN(?t;6 zmsmTmk{@!w=K`Xn$27ADZ6nL{sV3mU;>I__zg5os7l2?8r95o38Y-L{l2qf2ROt2= zDqFq&r=R#cQYf@EcSy*K@^l1V=~UekcCv9qw534{Ekk+*?nd=<74(!KYbre-OjH)c zoR{eQaaZrf!l$}YBM6926{PVGhq^K`uLN0rmq?x13x36VtohzXW&Tui2p;+t_U#@A zzHWB%aJOOo4!#}rfQM|565?Iu5qm?8UNgp*lW8sot@?7vkox^(jF_J-HB$`tUxVt< zmd~C4nPbqlK8Zj2&Dv`}?A3bb)cD!Ot<2-x<7lOzp5&0=#%H)#enXfqKWxvf&0_Ju z+u5cJu5@H4Az(N9vjHSn{3PvQcG^ zqf(_>WxH+DF5tj7Jx+#%AtnhGr68BwG`p|7H3udjOJ$4d+XX}PHrd%^B{4&*#*aAI z8(17qK3IIq?0Ls)gIe5sx6%hs`vL+2hK7c?6(>2Irju)lws*LDDctIX=wG*0hSXx{ zwsg5O(+>nU-Fl5Yhb|)TheNj&>9!I+W^{A%+3Dsm^?Vo(LLRC^teAh;A5-y_5g)F* zn)l;csJTCM>p`8n!_%MtwAOzW(WTuIGQIu0#;=+5xg#&*XWjd?muxzrUHI=(vYBmJ zW8e3`PusLw>I+*S{E`iL&HI=1VkoS)eG5RG`|V`Cbt;lu=)B<_iAbA>ybn_43l@Py zzb?LiCJQ-ZRtDCJAX(t9foB7VMmwMcTzYsg%7;!-07#x@KcBzJV+#3HIiFav98fu- zE`j9Y^9ad$UmGR<7wA6-2B7~3HZ_Ye3nN)1X9g)Ha%HOIK&J5OU+N97WAKGAL&J;c zeDJ`a(f|oA+wv~E_@h-;xvl}MUEzVmQK#W=^1Pp_$gOFJgrKZy+@kwG-e}xX5Wuyp_wDMrGDi7D6u4v7)_MTYE{!5 z>E(SoA4&3Ey*cUMChcCuWGrxQr0Hz2^|}K4i6gYmy_+P2A2@wb zjWuT6!$dhmeqe0_}*>Z*`rmP;o|f2TgFrL2U^DbMO_lk zFt%@(K8mg?$Wy%XN32cn8-{O_*^Ng$C%c1#_x|n}SeXcMyI>1z38bRQ_JuHOH1nVr zWVaXVB_(4A+@$MN{bdf4rm>16LQ#;QfRkr=aLN|a=D!JV2=LFtFINFtI_;p8Z2p={ zeW=8ciAB#{2Ij7eF_x!KRa8}1q-`c^HfJcija6MO1{9)(21Mjzw$5w=T#mp@_9{u&+@f z9=@_=Xn3Db_$MmE6Aw*Wn2`Js08}XyGeR?eYOf9!E?7RgFy2J>yohmZ2bxI!1z>sR zOerp2ROu0BfUF1+C$Ww4|M$2RU=|i1%YEljc_0A1{0FxyMV75LOvg)%k8;mn zx@F39@r6F*sL{B!VN~v2zKRRK&lG2&ibN(U7=V6VPUFt(4h$b}-J3TnB#ODTv#9-3 zs`Klc-x+orlHdWP4u}xvukhqFM1vryM4X3t?AJYi>ik;jZZ`Qqey3Ls1(m1%*65CM z9>GbqhN^G>M6zf9YKUzq*;9YWEIZU4yZJ71Mfk8GChW5(!^M?iPQS~8Qo&Z#$D8W)Z9)2j|(-yQ=Nzm}RZitplgAF5P$ z`&xq_Bg8kC?jrU1f-zcN5vWpEX)n(_{Su*Azzae=o}W_+Gea@1urjagv?jZ;d`z3Z zumf~0$8?b_|N(@vlkpIn2=T-wgsTq%*vUHgO93Q-^fKV?yDa$|Icww zBEH-8IJ%F&g}XqyO1;rTOm5*#Roe5Pr`{jL9|QYCWv(wk_O09Ruo^BI5=V|k52>G z?UZr<)K(MA?dQ8F#mK4$Ah?A?C-*kZ(+8~z*|Ii?LO__(7jpK}PgfHA<=zYZxcB7d z|E1N=5*AyI$xE__l1+PEwMyxLbni(XzN6uY#Q);$t;3>RyS{%E0XGN;2q>u_-Q6Hk zN=o-2-ObP?C?VY-DIv|!T}nwycX#IilJ7O6?(N?9{oMC+yua9gcB2b@&?hA{m|U}~0{(2%yL13;`eDDwxU#sI z&@RFmV4%%(LXI8byc7u@K`#LFJj@lOS#}HFor~rHZZ8iY%>%B3jFR}bS3KuSh^Dm7@q}E5t;pt|_S-eGVZVPm{pezymIRk(*1A z3e`)57hXdy-6eK0hRt3FVX$qEo?pK z(}0PDrpcLM`2e=EF^t;y9zh_vz}9*0tY&mj7e5Jk>BWpH&aE`?;^^jXWO2ScV2-Tv z+6I)VkY1kK-X&u_+%!)_H_gVTh7o#s^2*VH5|EiU-%p%Z!!zYwecs0_u z+jN%P_p6jt2OrLV3iU*=cfL|?qE?Xolp8(C=KW$718Sb7lx>&rUspNKS(_hYAwGc| zHc(I=4>2+ywf?=Jl(3|B;c-*n$f+L)I)0sKitwRKkv7S85#AlxB?eIZK9Z%mdYI5w zw+i3ct5pC^0K*OH6M(VW^{_*y8Q2isva0nb;`F<|>0#@u)n5&C(YTdj0{0fOnRUDx zTk3r(vMz^A*YSb`SCUQ`@U?Vh80u+MF-9TFz^+O8tAE#5E0e2rTYb@pV!tEE%GAoh z>ZB<*^hqG!cm!qfWgGQd!SO-@c#8g{kmvI1E1pLtRJxF>-- zKsGRd^UHWMiF%(aceegu9Oedpyza5v_^BpV6_DI=EutOqwQ%9th63iD_%Cezq--_G zF~2Z$yTX@|@+ireVcitrdg9sC&Tz`eb!6TE&+!1u!&Tu0K&lPs6X4&0q%FmX(T;Z# z!Y8k4o&IgF>(+cKuJ?15=&OPFgEDUw^}8(fZms+Y#-VGw2^o1asXbaIs|ODwW|#~v zE*N1Z9Kdwy$nie!1lSo1X8$SSkw9QR`S1v)fobo!CTdtKc8FYQtmqtvyn?UKn*W@* zjgMCvxH#=~0FU@mrZEZ}l?0HJz?l~hB;D59#w0zoS^q0{FaMhA%J~oGx_||Nr>g-# zs{Lc}it6q9-bhJt&wfyP6Xm;1Zn~Fr-+FSM_F5dK3R!6@BKb=qDy_=RAZ@N!_ZsP_ z-8_^6+7I`Ys~WP2vxav^PL6ru-8hpcvy%K>xGFk`Oyyt9U@a?USS=eVV9N7{W`9`6 zysR;Wg)bKH%oWzWnVUMiwpw~Q`C0^^@Zu_e%yZb*B^bHfthBAKuC-NJEjJ~AwT8!f+=H?()6vUKG)AZ&rY+tD1a2l0~ik_wTh3eazgh;tpxLnG4I7Wzm13{?*3OK>R8bMt=J^Abil(g(gkAx>mv90I{(6&jLNF z&iJamcao<))`C=p{BfkjPFI~4xjzj2cT*(~KckR7CD{wQNiK{AdaloN6NpCW+s3#} z`kXFDTjC$_Gxs4Gdv<;v!$m`|v3HswS6Mk9O^8CL*jD01hz7jfn2SQ7Tpq`P16}H- zJ88>vtYvdomQI-9N@Y%bRb>+&2%-!hW&$?~s|oIS4hFkJzprV7Mfm1NZ2=;oX&2@) zWXV@#rtyC4$M5bH@W055lvKE~ADK9ro$HSZt3S?%W|xO~f}}KV7WP!%Um7#Lij0JED7>yVbpBQB}Fvj(&7 zgIbN|L=CHxhXGV%WV{L^J$upOTVRT(hC_{0^H*6qCd;{IQYlNf#9-UQI7^Mn5?9#M zG+15U8EfUu3xUi-et7{j^?AHV`5nHPvZ(rnIishm20kF3V@xGHsMG&4X4HNYlbS2; zqQ8HnbG_%~dYF2(Yi;Zq$3S#>FYZTyi z#s=KJ?!LJ`sY(Ri#ti$fS;eCCH3v(Ks<~oa`}nkvvY3pZZFZi7R49aYwqHL#NZZSk z*QQRHOhNj3ZxGX`veX>4!s{A82AKUiX`A!Exgxz8-CA!t+j6}~T`sV>^u2jfaS5$j z@(%EH1zup2A-y14O9$8@_aw%eUIj!8ZDZ`pdZrZlkTj0i*OmbTm#~8fwJd(k0m`Js zp;KMMD~KK8?OovnS7^Dri;bv|)pR94pZ+RWG1}x4&m=?10gvaHF%)ob_? zM_APBn#uE^`zCwmT8B#L<|?VQ>GT3AOy=6)!1!{v>gI46-`GpoYn=E}U8-Aj6r%;d zpc2BWspsm^SfS0D0d7K5Jhn*a?d!td*KdEgMX{RY+gM^k{%wTJEjejMwCa9Mn)ElW zFWOvjsOS9WggxO@zE8RKla%eoHCgE4$KMSczw%wy^qp>FI@O`B)efom_!+3Sat;RT zD~n61Ga3`*xlLy{7pv8o;fJZ0LvxpHsh4CBG|rQ{x$AD6tJH(^`iOv>NmMQ>qWCOP z4cvYG)to8UCaLCr3w`>mOX|M&hf(lDT!E_Py39+`XqLq#yH>5v8-hQjSr0SX3GTK< z1a;l%v(J*MEOU?Kw|RkngS_;Iq!vC2al04uL2b;wN4p?b`N?1a{E|ksCWG8aT$O>Uy^ShR>XArIqF@(6xSHI=-+QYH7(!43-@0 zq~9|1tLpU)GfD_xze;mSyx=#h>@hN4IpD3pO6}=2awC>lf#Q!O0H2DI4rdT$q$fAI zSzbn*NR5@bf1caJa!@!@?yQC=JV5U;QQo0q8v@^{tJ30X*tQbltvAb{!I78Tp-8cD zS-gIhm~ojAV<${@ZVFwFyIG8*0``3D88PjI)=g=BPE3(gIo%>Z5UF;ICbpjqjFmC! zS|*yHXZ?P;nXc)=ShB2NE{N~XaAgSY6S60aK${YLa14^4B|L5@d+Kzo%pr~Cp>T9V zhQr;znIE48+sD-#(obov_72j|wK~(vn|_X>JqH>4ZZJ|a9YThZy8W4A!(TzN%1wR? zJ&<~SE~0TZY4bgJR@)$bV{oX{ie9s96YHH<^SiMlSjCtKqJB9#`#fXOdQk5mrV9Z$kD$w@{hkVZW=o0k}!_ z*z0J^$Uck(&+=YW-LXT=*GHc#$=2c?@h-Qaz3&)J=g1ck*45y4TeMAaW{eMkhmmoC z%+T;`S3Lo3+tjaXs&b<*V*=`DAI(fpRH~ZpLhGkld5kUb)b~JIwyBG%ELZre+RIiJ{WUj46!ync<)#{e{rKP1X^)NDX zWyE(?5-bpO{V`DY=bXS~2j3{u3CL9|2MtS&vC!S5&7B&S^L13;Pao1+ zgmDDcrdX`VR#+0K?+{YhKVxUkc`QH8Zudz#*F{d$^;jc!!ScxS*=f&e6d^A|fYb`bDM?oZlHpB}=F%R3-Gn$_+2;NW1U&WX;?S>T;2 zea#!y!DeFIS%y^mIrgdw^RJp={2a^m7FGvY)$nuSdxw-?EcN%SNqZ;``yuY*~9@h!yS zb&Sf&R$T-*aq$VoJ6v1hMiRbmF=vqW5Z^l&Kbd!pKmKt*M(dFlv4#>TEtV}_s6C8T4 zL0UA=_1Fh^zdX9zmo0mghR_Tnj3WG+;^4Has3=SWFAdJU^=wuN!xJ=_Ae|0^y9(W+ zhGiqK0s``=MhBifhVNMEJtMMtm*+N1-d_Gf|E8zMQ_uO1V3zh!o;}fSN;X5gPzyX4 zl}TXb72TIt=gM)J#Qf^Cji}w-uFYi^+25usHRot8N`;Bkpc;LO?6F7RN$jDFt|*#1 zd@2bFY<5wB4qJu4cP-|ohMifn<74n!Wq18qnF8`WuW!&R*JQbEaVx8`m9L+vu&CtU zyI4l3>lr)PrzG-NX{~vCNu0aZ(H9L64*V4i(9zr#x?Lzf1v;c3`V`<;V8NNL&VLw7 zB{Sa1s*OH*u=nJ!y)9xW%0lpwewEuCJs6b)tVM43<=aQ=Ug%Vrp0#u61U*YTkT8VQ zs*Of)$dbzM5ea|i*`<&0)Lnr;TBCl$Sa#HAhWqqiQrnKw(rHB(5dFcdaxJH&2Hnf4 z6`srS_aFH0*VxLqs+)HPLLFi*^y0x}a!8l86Vv*^C6PQ2j)hMCpKVyXVCQr2U*P%7>ddIOX zNcjQG!okyN&x%7{-@WYSg`*=K!| z1gRg(00>$X;k?gpr4k0S814HM-aYEJa8wyB?s%vl4D~D17oNL|NpSUe{S;MBhe9x7 zOjq2?Q=~P`+5i(+a4-rQKaeD3M)n}F6y{m(d<^oJ5sL{Hq|1H+|8-OEfTs!RvWK%> zp(|{$fO?@bc4E7L9+DkWP!c^zQHZ}P5Au&`-e3g@hTpCzs7OA%+TWZ z);)EBU{NS$ZKDq4C~#(6B`=atodv?cDzzPK)mK5>+K+nXlnJRCTO{znW)NW5YA@x; zCy^hYZ^q2VV{@0-mNO zG@oDW#~SAWXh1}s&es_0nmz>ui2SIe!Ua(-1dS(bnv^#MQ1Yn$5c9!q4Jp}zY`Wd3 z!`b-$Q1`y06izLg>w0e;u0*$B78O<$#IoqR9B`T76EXq-KCG)BX$FlJU?9CSUDyun za9QMGBUI-U0^y1MKoAT#f?%&&EFa}lZDmS|g7$)~b}gpz*-u?TRtZUEobRPYPoF>S zr%fbfLg}60lWLe%|9n1(yOd20;K&4kBZEV|=WoBdy-)%#d>GlFQ}&h1T!o}Si3Ztt zvex*sNbmf(8g5Nv%>r8S&7Y0=DNsj3#qf|sJA+NzZxY@L6DCbjoS zCy8b`_fQ=AEd*;m4n@8k9p}s_=>HXET3}HI_iEc-AHwtE1R1sroBNn)3{TbpUaE82 zQ@K}SwV<32Y}Zhik4$hze!z1oW8c8_tv>Xuu80QB{}??( zXig4xjtH7>e-AbEQT4d6Q1gYCyFZ3;LYB7W*p;A0p{vAIIo_{O!LMGndP(m?KZFra zX@eqlmuGkf#NBP*@iFamfivWdNFFDjY;ACL94`38Ol5DBh&}|q!|XoxzW|Ey0t`^{ z!+(;;2a0&%8?#n9b~4(n_95ln`W0HkfERpmyDOKumwc?Nu&7xa%rx8*>p9_w$B_{5 z6(`f*^kZrlQEpz_4c1+S5!3IX8HeYQY4DR`@&!)nj-Jw7m>mwdNf28IR*&j;Bso3Q z?^#DlVC9kE3?jlMMsu>rv5W0EsHK4-bw=esqV_XGYu_Ht=HxEfGWpBR}}W!z2ksjkbl-* zpQt9Gbd$Dq0p(2{M>iac$mpypwd#SWYsZa7TE*qKndG4iLk;M>xWpi*X&+XmbsCsi zdt*~npcLjR9>OctC;{d5WS^-%w$o{Rcgobae*yb;ScOnb)>dy%XS5M*RT;;{7_iM_ zRMz@XKWp{sag7m}T*KTVgng9=&&WwwXML?EVN!}52kU#NB~X$Ek4%=E^qTFzd==g3 z`h2<18@aEHpwNVv_qecT<}>W;5x&Aw&rgssrepSC;mrdAj$l(9LzLI(c|>4prwBoVbo--D^08(`l-Rr>ymBJqrVC!70LnXO_eOxBNCf8EgJOGjV z)>r!~8zk)^Yb&vxJmwi+VeCR|q}Q7_c&5f;Eg;!wWek#i1dvg!hq2sQPVCH%Z@>%l zUJyv58dh_;a7g#y3<8lh@N}^U6w7A3{!Ld+9DpHSxid#qEcgz?Jr^$rm`F%TRl`bE z7Am%j2z1;Lb;SQSl~FcZNmj(o?wEwv<(3=SpkcL-gY#59={JG0@2yrQ4E?&nSYYj3 zEctI-l9cNDd=cV(F$b=0y`Lj+!#CZ9(k_HI;whaztrt%s4IpLsh}tfFJu*})lu?=+ zYZ+!-*QqdlRxktA8Z_IHQf)^w1fnSC7g7OX*WE+)y*I~4G7|9jU%yuTR}=zl6uWtE zkgs33_jwFWZ{%zFCB^k}%-I~(kW1X2#W<HKvEBU{58rV$`~2`z4DG2mLuO{0`reL zU))TX7}JuaPVK&3GFsyeIc;Z;2*P7ILM3`G`GftJAw~p<3Sf$+S9+A+*2Jqwzl^&8Pr7H8xXmB$*x~#grv1rPXu*;z342vv+D>*h2b{uTkz24f<3=X65R- zf-Lt$>TS401kIeG{wgA3SRpIAJo5opRg$N2-HnPm@nk%YR2^qx5D<9~Rois~fiQUJ z-WK>HT#o~V>sMTEpLCuMIUhTfd_PQT*#bl|vP0s;;r$4S9nE~tg||`O+K>uI$+e(c zSP`R<43^{iz%!@y22ga(0c`B~{_6q)#T9>}h*|tG(opIl^=b`|kiVJ=oy2CBbzj1o zK>3Ek*cato%vvH%==WM%UzW93vS*h+YTMTmz&VG`K`CLiohh+v4bis*Ms>035&+w=2wf?V1c1abfato;XfxU3{8<`0S zu#h|$S9Q`hp};Z_RjO*QIxN%E+e5Q zUFWSujCGgWzML{f#KNcB45@Y=zfV3r?_kRwOZ#Z#ZOLqSz3itfh{3mPU3*!r!4m_* z7Ckgq@_}?PB>C)&rGHd^swMe-?@||vM+(h@5!yzzNF6C49aX_78}%%~GB_)mv`xKF zMol;Y$@t0ZSUp%-z3Ixj_()V#P>6%BDB8|q{D{g`AViC1MXiChItbkzN{PxQhJqCQDXHx9e3=%}mwq^IElc?=uijjtc1^>_V89;)lpWJyg<@9d$@a6c8W zDuL-7NLR&XQD_9~_P!(3?{oQ%_yUT)Iij|fGj*sq=`gH^R6E=ZUo%H2c)APr$~eR7 z32?1Lb|Kdn5O#C+|ZmJprmh<5sChk@}7|l}-LCqhiE-%JsKtQNx_!lDC zD=#&~OM2)1-6`Kxd59k8yPi$1xu}u~-NqcsRX&!`KtN6bp`7aX?=O`V(@EbwR_??z zi9bL$Z-z*WRuN#)?1c<~<-a8HPFa{N2Mt7gj0=3B95&dblQp7jsc}m+Bd1|7xn+ppHvPO~QBXD{8Vj8^nTo{;Sn4_;cu ze1F<&LCs!oIqNiYL>=nLNR=d-o&YiYMsr^dywvbqbkkEn`*lpExdunko5vMNip>_S zxO2yoSpB}cAH_u_R|h9fY_gqwj*G>v-B%y3Osx(1-fFVqJU#rh1w7XvnCM7;KjYlf zK?(vSvqk?6R_58jvBciEP97icAVkUw_e$xKJSQfzh9?8x9(jC=;woNrc@?;8f(w29 z_;Ta+^Ar#kuuH6nKgQaw1LEweW#> zY53kait8cUsCmU+fCun0Cl9NdRaco5j&JsiIf-VCdMSy4{ThIliMXLGnQ$V0oT}&W zAp5gn#r0Fq_#)ojQ@hw#7;d_~4gQ?kpUz*ImiLGnK{b$*A6y}F^gBO$bL2rWLbz2S zV3VTk!3Yj^Bd0CdsK_98oYLqgKO_-vzZlLcTUn6(<3&hQdt=@wS3ezX2fF^OWj)m^ zjjj@o!Ek}w2+dOfj;I{SRPz^H3y+;{fdxwlCxkl5=lyO?5$My`NXwhM%v83I`!;Ti zw15MLfue~<1P5s9$8Zw~5H)szkk^{clQ%B77o{BeGe?dx+@Vf>TlB!45 zaoaZJu(Zc>HhDT4rka0yX*#VoOkbi{3o0EfE#8U#?)F)-q2#ba(Xu9Phd{sYqvfi! zMbS62^a}qee5KIMC9JIL$iq$&tw>MmEQgFHl!)}`z^+dMl`4scKuP8-7S8+SJ&@T8 zabnY$JbYmh1MH9W{G z{DX8PK7-2oQ%grf`=|wOnq2$%&McQy8xwILE_ms3Td|T9b(zy;1(`8?%CSp&#n3Io zd$4%M*JvZyDzZlL%prBmLs(2`C@m@t69>rP)0)?wahH|G*PvoM>jLMUJ9=};`>vXr zXQlbyV*U8eo>HF^xIOQIG!^ZonkbVE9!p6UNv4%rh2QUni8cFqKzbv3uknaq!il2{ zY6mD8Bb~t@-v|I?@owXxNDuZcU5x2Mjtk5ThhnYT>Sbm#s770n7jsD%nval(N2cr{ z`3Fcl#;IgUn&r895*h0ywXGjS4y2(Ojtq%7vArtJW4rcCAC5~$BXQ`ij%Roa`@Cqa zM=`fJc}AYeG-aNMY@ULIcsk3(r;bv46Jd|B*@|G_9d{P)yNP%K*{%Xw(|p;JsAYmX z#ZvgPn@4{96Y{WCJ>Q{v3>xTLc^g&~$)J(Fv&aKsTbd0ptKXr8S$F=)(d=vC3{m!Yw;AuLEx%mu2i~gS~Ho`fCfzjJ@ai`$mzUi2CZBZNQ^suLnZ&5!;L&>j3>){su8GEa`!)1 zZU)BmfZVP4b2{5%Atv8UA0K8Ps#sr4*PFb-*W%0YkusiYA(pDgH$Ev%QWrVi6+5en zY5ty~5T=7+z0>2{2xMnSa?g?K{>e({HbJ{evPtFYPC!8Iu7#!ASTa+T0G)-4~8slt1RSFRw# zwDYVCdkcBX9eXTkGp^}KR)9Y-OIOPf88nelsXOqW%;*UPShLm>kv zCI$^wt^q?0CGX6QC-;jXj=a;lbOmQZT0z;a=8RvYwVX9H)1yi*&=X@L3we$8$y{vHu!Fi~L@ZRsb#ofYhXzwaxRRB+*!7XVO9{v#*_ zZzE3!bN^w9f-GGSGSf{rz%q>rlKkq8sxLdSBhMn0B&}HUvpKso+x$S90s86#Z zVXIQUpHv5E}w3np}ag1s7tK^Vz#{O@K_rqv7rzGA}Z?^u&&d&aCG3 z{Nj6h;tXai)VdeIKK{j%ZHr6hcW$to5FQ-M?O@{2taPjmO>K75&e5MAhA?5rwpu70dKo_=xj# zl}QuEwQ3GJDM}o@tPxDeakb*2h82<59^aY>4sb#Ox@r#`V!SZ5M-~h3zJ1J5$M9y5 z8F+20w@z4rH3yl(EMdmhC85b)-Rk_HrI;qA2?I~bi#wu=F5d)(17370*}p4(uM(2K zx~6Jh37(}D*f`1$ss$5UwxqFJY$(6gad$V1nOC-))b~;1$ZobcZBuR!0IH&kBEq#l zCTo&xusshB##PUe9`B77xLZ(*W)iD>m@8!E$WB0i=gz{*dd!NIyD5KuIz@8&Kq!Xi z(GVg((`WN(J6cNc=?Nu{iW)i*Mnn`uU=+0Cwq)e?IV(5DwKd@)B(X%=hvKFzX^@k0r77MpW`8#X81NQ*z?T zPoOpQ##S;LwED{e4Fee%QwHi?n<7mqw!wEO3^cY?%mf*N@fis+i)LTZ z4TJIf-zsVD8rHSP+nX>=)OgCP^?z&?xbgtBsVVbNyL4$w4-*x15_jxQ>Bnp~HFzNd zK_1CE29E%ZEsqbA5GW+NSt>NNNmbK=MF5-1$SxuiyYtn8-+()U|#rw$wR zpM`qNWr=7@Zh$JyiJ5@G6@+Fwp!xP!GcR^`7>gNOkaq>t*M;;P+@W%nu5zppey5P5 zQk=jZW6dt|nAqhwXR4J~4G%K;VP8Ik=ll@Y;mx=cRsHN}Y<+`~{CG`5$-aD5iE@IF zSKp|=QOx|CqXJ4Q<}yUpG?U=U#jVTR;lI%3lMA{0aY4pda?DZZ!@8LZBU2ZZ%0k=I zx34mAkb1rN!iJ;r#6>4{<5EP!;i0Ai2sJzpDp;NI7W&ILesPK7?_8p}`8O`vr~JVs zGA3s}p_@B3Ro-VlCuNw%Vp8bY2g4ci$JE+-GHK4A&IcTBiw-g6UWLEkfx0|fhOxqz zY?Ps})Iw}d?11BP=^Tqn0&|RBw+v5fzD^L7hZK)Qht8S)X5jNg^Sclo-QaSV=#d-x z&~6tW_LJ!zrZu$tg{~n}9Nc#$p4^v%x>l2b`y6CS|7<)QXMEHoJx%zSX7k?eq*Wgz z(q$%a`s=O$a$Y(gL#mE|I+Zfn;XhiG@4V3v@o3`RUlEXI7}%XhV*aJ#IWL-91!~`F z;}5brZ`k_~!>0HI_1w?iWXcI=i{``8aAU>hLRp;dGJqZO=Pa~2tF*c;ukDX`zN>6> zmVQ65`W|(jMbb> z6wL3|4QUe`hFN2~6R_>>v^HC^iVrz?_Bm#L6}pb`y!GX5z>`oOu?2^!o&@aa4xxxWj%nb$0tz^95OnR0n5$p)DX2I?MbCAH5ep;e!zdA444e zn&tocSr~-G9<^7o@4~L~y?@Id|D88hq5mUqpgsBrZ-DVE*%D}Q#`sGj<~MIGjkdM< zC7@FF&se;|PSrd1O`A&;@^Be9XnHiwL{#u~(3XZ82aK=Z@Wds#XG3SorXw|G{Gx=L zKq@-8Wp(?Y8d@Sd;xAD_dT5c5Q%M|#jo6R|hMfx0-%KG%7i~VQXnoI{>DyrKf?tZVq_^{yXp=~D}&b~gLV_dX?*XxR)tZV~<8!>b)q$|aX7E#IX z2jAJbG!+R>-i}2jk`c&D{GyBA*>g2GU08d==;E{hP8ZAeAzw3EOv|kREpW;bC`~-? z{fqEojamj5Uc{U>U;ZcI<#be;p^*XC$IePV#_y4})BXLe2xy_WXqTJ5L$aHGvZ6RY zX01P<#3Y~=-G4QZXPb3-iQ0E^FlF(|-4iTdRg|Gk2CJOj@8hRLDvx|>c=|%w9<`_P zP}5M$t_wh)Q|(j!bD|wBS?)i)7HA&n4BJFGnX3qLJ|G*!pzGbklL={OFZ&qIBrf3x zq9jumki7An(obH@X6;a#@@trk;)p2ZF8$QT=X1wL$pUzP8G)j5j1-pYdslsW-qRah$RcfFQb$0N)4g=FS z+sM-ogSc-e5Px6x@ER0wA?bjxsX}-9Tw3)C+QQ)}z@+K-H?9Cqo_S!|zX!t&;0hgn z>eOxF=ohVdg({1_ql5%=SQqD7?Ep16#MpL5KiT^zvoLp8PckD$TE4MzffBF@E%p=^ zjHbe1XzB{Y{VdnqXgtU@t$=Wte+Olm??gCHs!DKl;~eO+lcf$T_20Ryoe{X7B~5i7 zsjn=L9PkKvSN)MoUa**GgQR-pTeLT}<*vsCs-8!^W&A@pQTtsu8TloguqHgt+8ajc z6##5D-^-an)$!rAt|Eo6#*%vzdhqR;ra0P@MBF-!)`M=lVo>ZJ?g19Pagcp9j-lC> zZz;dU{>!IjK0U8jG}sxL_AAi2Ja8E01Xzzx&91(Fm=cQsA zNIbd}mlm>OwW6H&xVi7T0UM$HgbCu`U_u0di7fyonEyx;IEWt$FV&FqY-b|@UhnM9bq~<7 zb5lf}UjI|o_}LvqyM>QT9~uAYg~AV@IQ$(buq`S&(E*-_y!B5}19gqxzU%%#PMQzh zonYGPK^&b#bjgWJXC9M2Q1%A2Z%}TcP>`Jm^ZqJ_+dJD%8byJUNSatcFyW{nJI*Jx z8k9X-&m(=R)4T+h-I%Q0n|`lO>rO|HC8JouGX?C{`NRLvCr597Zg`PLdS8CO^V0-Q zw|!I#kPoaw{tgg_KLFzUFMyE8YgqaP5L1thrw{;1!+iO7Nn`99kTk&FFiC?;$Yx2| z<1a~r4&jHS;m)cNt4`v8rx48|V;|L6b|`cO70hP;aUYUfXBHX?Pfy|l+e|=uu=Sl4>2V$?Sk)5d{8h5pl(bP-D~Fr~ zL$zyjHMmoc303Wt(d2%L1c=F=ce6%TKxZfblWlIj*ub6N_@ZMa&he0yrCP_?aVyCKsOKiDdqbOHD1GPf>l^4Ay``02c0}Sx!vB4~BqD z>$_^Xi>?KiSBlp;1#-=Rzty?N2nOT?Gm5K=G%t=tDgvw+@X`jY6M<;1*+J1C&%-~= z2n(CWA8_8i)kLB`XC|6i&m}%q<21r!*m{)amV*@$nG0kX+(H7?t}xoOQg0r^`n?an zQdPJ+y=fK8tz=jQ_;^tF3UWcxxqtL$RwN6|hJv1l=dC`V9v>KxGYrk`W;iDd7Z50^ z9)Yb;#6Od`$Im35jJwC&9zTHjR~kR%Jy3e7yayU~6-ocdb{<~)2)Ex?GWs4ZJdxA> zNaUvQL>>c6}F zCzCFFhPTQ%j+4+fKTQ_JuXTFdmG9>gSo}k9@7>sM9$SHl>@DrUMwo0MRNYh5ORuBc z(lbZJF>?Q~(R`3Xn*y&6uL>|W&RYUz#{4r%tw!Zv?vxPx+0)1K^shAmC+cKddFJS0 ztz}3FipPY%Uyyw6PooOImsoVQ3>8`WZ?!+t&)VOR&MWc6th>Qt?4doz4n<-n6Y4t8 zgSka(s(G}u6l<&2pXvHRjN+g9w=KD0eGo%1&;U8UhI7qDbip4#?MHNMS^KQj5}Te60*s z`nq~YAh?(wRKc;3L12F@HX-}?WabY@RmD5V0}Uc(4w~8!Z>G1djfGg4sbC__vaHmf z_Fo2f#QRvdI+L)PKUK8{lxUiA-^?LBt)~eKx8WlV0Gt_~Om_xc3t@rD189U}h!x&T z5j#7wh{y!s5a#+#OtDC~EW2OK{W{W-WDXD0Ez4M$F0s;qZq@RTk-LPF6G(n0u`T!x zO4j`i1g-exsUCXfRsxxMBq49*Y}?W$>RZ`H!X_)$ulcfr$7udgRwSrArtRHRz}0&4 z`sw{L^$&4KJ+TAFQf5M#f_+<5s+;L4)~>BMT}E_0SMF9?QJ_%`JH0GYM9`XKj~BnQ zqh;SCRMc#0z)HNz@zm3#=C4OvQ6SK&3GfgbBr5^yJ9(ft+0rd$71ZDT?-~V1{(m(J z>JPlEW`5M@y099(Y@Z_hSBai<)I%d8n&AV3(Y*QT<36<8tI-3ns{JT^!5@k)A+y?( zvzAB#3@-G5+Ba48`j$QiNy7{63f@yGv72Y|p1@R1+yJ(>4?H5G3(=gn0h0Kp{3z|c zmyn87+@ne66Sb(#(Qy^(`HqSc4^=8`OiQvn7CS>aZAv%1f#QyG$FZnF+S^8m*MPcr zeKvL~dKw%VMx&y+dyB4w5- zFeN+KYuIA;IUBJ2j$9XFG2M_uTBr(uNeQz^4&Vo7-5#%lv9xPTCE2%QdW4fvlpMF+ z2&UuieHagMcto}{U096GMpM*Ydn=|UE~1`$-W@&HVp5;=`xZS2DG zx*nNd3=5>bu9OgPf%zKcxnjo}%PaN|=8u@Qn!}`ek1GpCivPh8y>|07%-fv64#YT4@|ql!njf-!XDp7?Mnbn~(zWs0 zd#VY$%Ht8B3)VCI^aRm=Pm#Mb{k6D*WY}^wgg6%T@cRnNwEQ@vG6f)bWEw zNR0m<%5y_5O&ul5qVFvIy9!m3&Bd>o@fw`JMLO_R%Zr-?(C04=nfw7nq&%|$K zIN-`_WeW&!_cT)hitF*>HMu`skT&|nXPYt)tn{?=XiXV59D&K1r3|g)7?Kk+pdmnY zp~}NGjb!L^ZFX-xvUfBv_If}9l}b2f-NM(zS$NXlb@tLqVfMT%9N zK0OCCzC~$Cni=0!cP`kiL;Bb9dj1DIpzY<6|A+FrX6Uh`a*z}EeV^fND-_9=U@mgZ zGw4^q!9%vvz*5`Skl#l`o`NzX5)u$Cjih=P*o;fCi6W!!vH;zD-D8YMtG3WYAGwf% z3NMhOB|Qb=*t$k-Btrh@+)4EH6|JhCaw6yfOw51w*)i0U)?QlMYGBTL`%JXIX5BCG z9neiYZt$H3JomFie_9eQGJjYSchtvooIBr9tL+?4LN#!R*4zH(#2S$`^z9KSuHz^ed&Wfi4yi^Gm)k z>mdJz!Lqy<8O>VUBTg6mBsCmDpb^jBy@1A>SG5L0UqqYi7cAkZB2iEd6aSK3tv5gp zT1?oK*wJvfNmgv%ihi3%gRbcsv+9(K%81EbZ~1`(fd2~43iEZ-lS#uSBVr`p0Jpj^?zySSHZni zcI%gmHr-9Uv*STN!>M7X-S z#|JE0yA4NiO;fYrf%RQ>q%_e;F$FPOkS?o-rF9YmyP0cCMawCHnPHAK%@>ltWoXl$ zBC4G@`Z>U4bLRfHVMn#9{XFFh-oI7IDjRh7UWkhHbt6q7TC{H2SCnidO3fNI6TiDM z+xmWvXmukwePRgnxKzIWOuHS~A5ymLCWvK2-a_K`sw#oYaeURf-aYY_(}R=z!nG~T z>MJ_iskkSwQrP$ZQ7L@RdK>#4Ul~h#`py|h8@+)9t(UU^?OfdXE36k^e|BT?%L~Be zbxy16FF(9N`F3jkCF*&*Lv~|zB*e&smBZcT8Kgyl568$2+~94mFL2dgkJA(^=zcZV zQe`LRHS0wf<;TxBf3Q4)m7HSbc8sJ}&BTa+uze3$5r2+TvVn^KaDvs4jltf4O&mVU z{b={(ftHHrO@?97?*+$-@KzgrD6*{3NYijL#Dm(9i(062OQ#4ZE-*!|KN(h9yj0*xp6yF zDO&Hpu+~3k7k1?_qiINOFyPuBNnGFJ2fUITmv?^{C^sLw+(9_I2NVc@o2)X*7Paf9 z=ichR`(hbvMlKk!HhEYkD2I*+v&3hu8WaIzR^alTH}EN|&X?ZGU(WS_`FCJ|Y9zyw zJt-id9+-4+Jtl>ZX1|y#7bAn62Ed>J?~fF`VHs7cLmEi>#qh;;{E=+E zq*3wPK6Agc%~YflyXczZ{|q=X>-j_s{tL}@v#^%V&k=-JM_JMcpsg^is977GgP!1-n92(!W{ zdM&P~+2;gve<;vFj%m=y&FHGwoBTiBePvW!%eHP4k`Mw3n?R6YI}O2t2G@?@uE8yW zHSP`@f&>C=EVzY0AdN$#jeF4G?%uf5G~IV~_CELC^WJ&mjrZe>amV8aH7I(mHEVTM zee?Tj)+|1}(EGkncBuk`rE)7pzD=6k{q!s|uAQto5@ox4CJ%Tf9yQeY6t3g|Jas!# z+4|x(>R`;D#AIC-@uk{mFtSnn55{ibtle9gHwBysMxEvCZF7c!Im0RG@3^>#gN><2 zj{y&D`&~weY7%ar>S^$8t#f3sg>U1dJlcHrn4|gpg&CEjYRQd{B7Y>bqGoHD8wvqE z#j9=^LqtO_(bz%tG&$%GJq4A0*2w5N7ct4Mq191`)K_FA?S>_G^asCRzI%IOI!QSh zYQOD$ky7$&*nC;PUtm^8rR4u3o;1GVKmZ`aClOhIGSLQU!dj-rrAlH(s2uO>=1PR6oaC8t!{a^nv<>y_Fw$Iuld%5@>! zBuTq%my9#iNWHbD5J?}`g*G8zI$Zas$pxO_D75GQbWA*%)!9lpmf(x(7DYS(C}8f5 zhQbdIA0MCdJ)<*^VppOP-J_>v^?t?;2X>cfS9!G^iL}2j!tO-`+zAWFe6kqT3h+E! zGg|-Jp=M#=D?)#xak>=v_niy98+)ufND=^7AfkPue&!~aLfnclz$$!`{?bl=ZF>Dz zG4X268@Jznq7J43qMW0t0Trno^Ok5ppPuJo6{Ve%#Ex_(Zy!0@M&N6feV-eNzpucF zC`WCr$mOi*r2)}j`e~~#!M7sC+lCI~M*%&hUE-`4VU)Lg9PbhR@Mu8T85V^YkIIc7 zcOyH3fzEw_bm^-ws(smg?!HZ5dQ3HeBol~`B)XP{r zGB9=NS%|}3%By_;rEW- z*~znQDlE6eScz3u1L^b5)hf9N?=t9f<$oxMC=k}o3XpVpL88@0jF6D}K%RYvjmZF8 zi1t$%81jZRczC_;96Vf>7`rc6V^T|@;M2@q5iFm1l#iF0Kl7mN#IKUB#{$JYSx#vK zHlHXD*^?FQx`hwwqbXpFokeikH?Y5#YVWg8SYS5d-y}%TkdbOf7pi+~2(Lhue^Zm% zsYo|~eN(x9N_g(8X}s!6+7oZAt*WniJ582Ix?K`V-O{-9bn@kOmdNC|p;UWez8hzD z7Sw1~P?AqtYJqd!m}&isdB+vUvs@kRTG!b!I5Q#ZFg!|Os>=HFvz+Dxo*j<^s?<}n{2!FKtvug%zX=+ z|C5TF?@E$i^=V#MnAwg+q>{o?ZY7W4V&Y8e2UXAZ0M+$I$~JB*u~?G#t$EZoD@&rw z{uId?$BpX0ftrW^6b1i*oTWh5-+W_3VV7=?;+rb0n4E1@a>x}i>`mt~oe=dm>YcY` z8i@9iYfi3KldAh%q0__SI{m%UK_lvzt44T$YRWxoB-7J-OF1HPR!TsSs0W@$Z0WE5 z`Fk2v-)GwPfFhdsqML$Qr+T4x>5oI;2rYw>4#l1uUR#x42eZ@Hjd$A%XTWDV)g5yO zyZIlzp1r;<%XH1W*50=BBN1Dx^%)0)g*a>TKR_zRtd=$xvT`dOe!qy9y?600igea_ zC%i0G_lNBq_2rT{HK-I|?Mdyb3OWs)jpW9w$Em@AV^I1JnCN}cH*_gEPgSXgd>0VK z3VwsBoK>1lz&kZgocGdU88ABHua>S-Ylk<68Qv^0CSrK3qwc2s^)rO0TmuU0&aH4x z^cAp0e+Y0xx<0N?_RrB8jCFFEwnZ5zQ6IeERC3a^r)DhiWq9DAPZrXzJv|mjrwrZg zu$Nc<&EaT!1U_UZ@3-xj4_i|r2x{&VH*mv0(Avy}Rpr>yc4&}aHPA{jS;^ngofPMH2ESQ{IqlUrsafg3 z>H58Ea))Xduw2LXOUjCpPq)B9z3|y^_(60+J>l~1^1+MjIfiRyl7uASqS+hP@0{L#R1X5Y;;ks@qbqvXH$#dDjxSuMZu zu1POfPH?fSIu~SuUwMYr$Rtq^LHGqW+FC%>i78qc+ZL_93R#l<+=}T@dDmKM1le1F zDi;elHmfBoUHpMKFc5#XxTC+BQ0r;HwQHG@XC=nsR8E%sRY?9hpGiVo3D~`KN3l2E zQ%riN;$9ceX;5By#TqwwB$DN_@a-7G)XRm%7jQ>JI$2VHbOd57PZjLzbzBPEazDR8XvbfT$ zo$XzYK@_Y?wO4V?ebpbi*|!#?eQ$0&@tKD%GOt*|-8fx_o8$A)%LbPD@WB?ui(v4U}ayi+vMVMR*nxcpe^ zlHdt$xJ^>rPwdeSbfuqxFUfn6on~L^TzyFMJvZKnEG9)lz1dC8Pp#u>!!KvT zevBV)WB6sR)}Nxq=0sP$Fcc>(hvgQ$X=0Lrf3if^_Ix4V^fb^trgfq5I#iuXB2B)_>z7J*vZ#SwFrSIne zX8-J~B)RG*^1FIn9Lx^Ph6}Be-_nE^8O;(je%KLHFMvKI%P?bHe1<=5G5r-8{J=pSZ-e}Ez)i#80Oxx|AYG&YDTxEj1kGX8{71rwT(?yVWr9$-AnkDdAw`9P+7a&$4P z>$aXqZ8k=*xgQKI=*P`k)|aG@BrWwn^s>&I(2v&4@N7<_K1oN0nT5$s0JGFOANUQ` zmDN6mT-6iLSJ*I1Vi_!%FV%O3EupWCftSWy%Zg z+9;~z4>xjyOu0XvQi;5B%GCgP{ILOYh&)EA@nT6l%{#`c5Az9~=J7aCP)~1t;bo>#q z*;bm0Iz&xMg z8B0H!np|trxBn>kT4sN{j0VoloaJ|r_jv8zt{fNp3c(K-PFe+Z<9(%}NL7zjkCk^D zr}%HY;?#4ibe>gxHHRJa+g?5GA;EYW`4wAD%UrhQt5t=GpfyK_4k$>sM3?7o-2!p+ zRJ<1gsRkR@S&L0~{vmn?=xnmJXcy8N_e@2Ogd0PpG}^j(7=;_4baV7E!2X zytP4k3Yp7_CY{KU;HM67nTBEv8u{^&$d6_|M2{A^`64)6|Js}Ex5?Tx3uMqE; z8*N)(haxeFJ!u)>cG-B{1|2+~b(OjSI6MoNs`13@9Iojz*Mae90hZmeR0d#uk^U-x^#}(C#;9Nc}?&A{pyHN{572d+XUyS6sqwf)-nVQOo4M zY0~aqbW9T2mKHX7`qtBV%w~G(=(sLjmpOYpv3G6c3`!%s9<>d3Si|=Up^tb3 zKk4vFJ9>lSX)Tt`SmPsUFjO=|E>|5Uvw_d1Vhs6Hb#`s6a{S_O_t3x(ms^!b=-njW zchf`N>vMf1qK;~T*=!YYE(N>EG>yW;P1aI%`ZHWxtZ^o>-GWs=z}3b`p8Sv^FU-)`O_3`d`(VRzHq4+KX;$!O$vVvn;3&ny}HPX~d070d@mmNwhV8vjVB&OS%VgLcf9adM40i#@x}nS_ z;PdnG@Rmzeb@fUYnX-XLYb?XZ%hTi4;0+j5Z%%`4NuA=xgFgd~iCMwR`iUxArXfTT zK0bIl*r1HA?%J|KrGj`5$iWN1*Ah0ZV*`nMD(QBJyA~}wdQ3^+E+itvUC15%&OJ|W zs*A$m6te00DJ`|`EP=Ndaj3MyD-F^mnRPWRKW#z+x&UZ#Yo+*?Ch+^MztZOY_flq4 zUs`#j@{JGomgD=*QT^xuFu3?sV}!qd;gQ{#e$6)CZrwN~dHrE@u-lBm8zLRZq8bAV z{~5=4oL};Cjl|(H?ka`m#rDA+LhD?D%E6b{9$R&Z9ocrDMvX#a7_(c*c20zk0|;ef zXLVmpZoZDhq{@JAW{yqD)o8mr@8F4 z4{ery5FlcFN(I#FQv{xY-%Rw+bT(*w=UgAkUD8iGn!QrvHUb=~?0!^W5fQ-)?&uV5 zFNFdfciEibfWLr!NOGnY4%Aicc+?)Q+?XyG+AJ%~MiTUAXj9p2=TCR2AzZ0Mz)mYv zn8vV&&RlqLQA}k31x6p0i|P7};b0T9FYrC&F<9tyJVR(&b)f6|Jsyb19l(31<0{1I z_jpoLz9wxynkLG4U2~s$*9ufj0P+%$;6gM3pMh&>O^GJO~&hAkjQ^>4dfCCS6<>%yo~gDdspZu0kMB^t_p z`q04IH~iwy;li$N(uq3O#LQ4T1>hmAF;Z2Go()*d{NvL!YL~i|u!N6NurfA$bdqCMbm4+;*;s#EkEa$|1Dqu!K*VZR{d*mUAGR~ zilllPNjn9Qo-ZM%&r7_ya}|f({6wxt8q-5jYyDdn{j-^8xUV6fL|RHk zNg3$e;_@Wh{e83C>+X@QemU-^le^QDWNHwPkw1?@+?Xg=%wMX^wPq8ePX}(!T}a7B z6%U$Blw-bB+AU#PP$jqDPN~x5vQ@e)A_66qS@hb0 zGVV6GjJZ`t=1?1sh%W^M_rKy}0h>3nZ$x?5cyaoG@#eD>q2W4+WWDsmusxyhy2T4v0c*!m9<{GA1I+27fA#0X7eFlgHFgE<9X{KQ zr}eR^XK@6eKH`7y%&7AUXZKx*@vy7iIg!Q@kO3=Ez8Ic|*YK_Ab!{+=n&&t14koY> z%;WLpCq4Cs&d_6rvcG%6K~NN!n(=DjFvu+($yxFl=hPtzT0a6X$;q8nGv4bwHP){= zR$({DJx2;>CZRf6F&Ykv`e|oa62k}v8-yHg+LwAX$1`TwDH3yEJ6}OMeh8O~7|sBq zk{kyyNSFKnP#Je`D0_C?Vi13X4e z-Y?=C_hDRmYs2~Z+{+bXwy}Q+To%oL0hi5((*G5>78F@^8xky+wh2C+Wa}`0F+Byk zvs7RaGqCA{#GB5zBDB-_s}f@T2!EbHDE(go7fopsR8ipMN@ym4F^ag6N4vxf9(3RS zLlePEuSjbw<6e`I$M1Nc&x|6jH_g`@f0m9YlKvTRGtKdNZfoM!O`ohWY!;*yn2?|R z&C8-+!B%mfFjV@*q&%7G`O+584{sS>lb{%h?|^jamD%7sg1?mJ*N@!)%Cy4vcg7XA zj3@NFE}}$s1mSP7O=u7E1=DA;8;mN(bg?&;5xZ?Lu&05!K%Q8Og$B`!1C3X(uv**Uw*^|rI4e+`) zV>(H$=_44DnHR}6+a?LQ%1Ibc9|1VSMJI1U>Q{E-${Ez`#B28Oqam_J522&b;1t#7 z9TCmVmpATplbp1^*fzd;TA@I}?v_E#5uQC0gU?kZOplQf>^6t6oqd`+{YK`T+5{ju zf73FEOS0WWh;>b(Y(J$$?kKFD5hnH}q3kbO)`j`vBk`iB=f?CvUS_zKQ%)4ear_1_ z$+OgSOMa?xe5Z3h|LsYqsrKxLk~@%{nPFFsyCBoD2V@F+qJCPzWRq}A$iVJ)SQBkm z@23JdJzj#fPL6+o2^{CI|6w|@-=h50_-zx#RII&(3c#)MzZ9&Lx+w=n-Rn?&3baV$ z2C8Jd5EI~O)10CGTg(CMkWo=$ZR*@?=O*P;=uhX0K!Ywuci$Znd*IAF9q7G1(HqU> z0Iw!A+^8zG@_+zfVX#4i%mp~X*>L#)zw$_UqFv!Xp+mM+ikmshn0~cphA+dJtHFS| zF(p9ESl4nCb?S=NUrQpMEC4Pf7{#-bXWaCWeha5MG4Q`7mlR$wq!0jnjW4cx=YjQQ z0Pp%tqbAi3PxE>2{;sG1f3H#f`@}`*%C)HCa*P17Et|~n9fM5Go13qy0R|+*($-dw z)8o*a4xoSz56f*2O%jZbLs4Rf<8g%DcFK6uvg37c)}Ko-TBSZoqSF<{-iMCd$dwH* ziP3+?ji}#zQ=X!mlC;J^=DodKeDfwR6YFw=!jZU)frKwyvJs1*>$w;f;Qh% zy^6P>=NSzJgIV%`7h|6Bl|aJstT1qg^0;2ctm$VxyF^t25#gqBW5V1a5FB!_8 zih!OP>b#%I=lAY=Ky+DBKwRcx5WdO@g^}zt%;gmLBZIZ2NBuZuECb*9Lr^Izi4xr_ z|3~g=?n~cDTX*W*=`?Mh0w-J6g{>fH*fmp;Sc1LxyhpMq_)mCvO4YF_zvt1*D1O@< z7qRNxbo8(rEn``?smDU)YQ>bx9nfM7eUhlC`-I*r%8vt9 zA4`$b10So!^|30gk#9dt5LZGq`XLAQ-Ny%m3;x*abKqB({Es^9!8SLh%>;o8C5#K* zH!v|2!-}f^gm@KQZ176&ppK8=a;p?ld83~=l+Ib}Vj3Eq5t%uet}hfYUWA9wdf?;y zS!H@udQbuVniM?zD8?84#oCBJeL4&CmuATSX6}aXJ#1q?#rSSqyr>^I{jAdqxL9}R zwU*j}>pxQrHHdR33IhE;Be7&5LC9EtkI{gN6pL?p(yf1D){2{62wozWi79%ihZ*Mo zS!^9Y9&7;}Xfa9RC0BJTl$0^(YeTlIJnU`vMjtkGao;$+2sV=`TBGAew@qwhZi7+Z zHcYTQW~=RFO04Kmf7F@@68r_bgFYkKit#Un=7nwMhQt{P>z*Sh_Rll4k0ldjxn0P8 z+Rw8evLP6D^bf`lpB*wnDN2owDI@l=cMJ7_?=%a@E?X~nG1p{I9x@M|Q}M+33L}(M z)N--qSY_eOCAYDwY$GB&ozC9&Xbzz)?oq1>LMmkOS4QMm=&u2X`n!1#sOMkp;(<8& zM+@HiH|2#b?Kp0p=`7!VpFK7sqpQ0u%xq6f=J{px(7mYu{eEc^vLXHTU@AKXhF*7P zix~^s;bo=WSrXj#Un`6G_S=-LH>;!aT+u+W{1GNpRnXLjpj8_Rz@FB3qe%4L zmEyBA|Lo86tz#rqTWueF>4;trV(HJC(imw@Jn8mIPDQB(3k>dXNtg~n7|&hP*iEt6 z0zcI#;c`h|DoD$%^K1=vM8t|IwCnLJ6VeybK(cV%a)LQm+F2{53$a|2EG$I!Vq^7p zMhPC*6K=%vZRLBiXU8&^TN_QNy>n7XJJEUCKAHhsutL&=HF~+k(0IMJ)O2-%MlztV zD}LuNM(5+wt@hNzS0_dO*tydUNP^rM75RP4+YI+@;irt0#w@?%5eg3m0H;+!b=gcR zZZa*B;h-`qR2-R9CliI74G;4ee7=4pKpGSG+C@a+3Klm#?~~!&7oXCyC5@GvQqq63 zG*jJG;

#T@As)AeYsokZA6yCG@q*1jI{i%Nt(D{LOXa%{VMC)0NF9p?vAr|)4AW%26Y%gZJ|pVr0KmAf zhRC&_L5WOHe#g@h_#I^G`GD+4mx}J`9{>G}ZPJer${0Zdfo$rS1pLr_H%Xt??fn^e zTG-|jWc`Ubdg%;pA=87}6WfBRBu;~+_eY=Y--k$G;AqcXl+HswimBOSjm@~@$(PP&xgFEaI2+9O@W@`%$%fC{ zDP||b)RTu{-*3ig(QTx6`|%>Mle88v$v&;A9I8yrm&^6F5H3{HB`gz*qReErQ#e)o z^@L+=&!YsP@UT_(dD}kZu#BaS7oa-Bi3OW*>+L+=Z0Ai6W-C>yjvkVdR-fjQbH{2v zJO<9ZoZ*F&kxtp4fM*D1iYDObt)OYKC)Zh1X{DPi<{hsS2xO&GB+>UEm9$XR=Q&(HTo4S%x}Q@s5IR&>V+6~8ShV+y z23K#YCr8H{4#=583k0dY?-cr}?ZR*`Vp0BQyvAWpx{Af2a*K_vy*)${$fhqIE5z{` z2vi06tjZLZih3^p+;VyS6<9}LFqKwuXlZycj}tGN+dgQ2TE=&Uug^` zRQ!zq$s^BdXAFp91o@=lo{aRlbNy6D{kyI3UiUIk3mT^^V0L+vWdr?yeJG$(RMKA=4CR15pt#Td+sbUV z+-2GSt67NDvNIN8Z9beSro_yJzoJGoaG_ej&%dp-R4BOksq(GjBG0r65X}<*>SNI5 zseDRiRdLbu0j*#b4v~HH!fQg6v0sNLPz4dfa3%$i|CI{z-&dw+u=`bxY;iQQB^B-N z?!Fho^|s~|55eu=9q zR)qasbLfB3Ear?zFSDceoRKXhZ9sZFw(FeET-55vnGnGHKdZa_4;=;nznOK2#S0`g V=l%V&;(J^#ke61GDt>7i_#ZiQOU?iQ diff --git a/printermonitor/libs/OledDisplay/resources/xbmPreview.png b/printermonitor/libs/OledDisplay/resources/xbmPreview.png deleted file mode 100644 index 70ea3a53a843f220f18d2ef7cc0698516a990ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41692 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 diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp b/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp deleted file mode 100644 index 2c0c72a..0000000 --- a/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp +++ /dev/null @@ -1,890 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#include "OLEDDisplay.h" - -OLEDDisplay::~OLEDDisplay() { - end(); -} - -bool OLEDDisplay::init() { - if (!this->connect()) { - DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Can't establish connection to display\n"); - return false; - } - - if(this->buffer==NULL) { - this->buffer = (uint8_t*) malloc(sizeof(uint8_t) * displayBufferSize); - - if(!this->buffer) { - DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create display\n"); - return false; - } - } - - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - if(this->buffer_back==NULL) { - this->buffer_back = (uint8_t*) malloc(sizeof(uint8_t) * displayBufferSize); - - if(!this->buffer_back) { - DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create back buffer\n"); - free(this->buffer); - return false; - } - } - #endif - - sendInitCommands(); - resetDisplay(); - - return true; -} - -void OLEDDisplay::end() { - if (this->buffer) { free(this->buffer); this->buffer = NULL; } - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - if (this->buffer_back) { free(this->buffer_back); this->buffer_back = NULL; } - #endif - if (this->logBuffer != NULL) { free(this->logBuffer); this->logBuffer = NULL; } -} - -void OLEDDisplay::resetDisplay(void) { - clear(); - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - memset(buffer_back, 1, displayBufferSize); - #endif - display(); -} - -void OLEDDisplay::setColor(OLEDDISPLAY_COLOR color) { - this->color = color; -} - -OLEDDISPLAY_COLOR OLEDDisplay::getColor() { - return this->color; -} - -void OLEDDisplay::setPixel(int16_t x, int16_t y) { - if (x >= 0 && x < this->width() && y >= 0 && y < this->height()) { - switch (color) { - case WHITE: buffer[x + (y / 8) * this->width()] |= (1 << (y & 7)); break; - case BLACK: buffer[x + (y / 8) * this->width()] &= ~(1 << (y & 7)); break; - case INVERSE: buffer[x + (y / 8) * this->width()] ^= (1 << (y & 7)); break; - } - } -} - -// Bresenham's algorithm - thx wikipedia and Adafruit_GFX -void OLEDDisplay::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) { - int16_t steep = abs(y1 - y0) > abs(x1 - x0); - if (steep) { - _swap_int16_t(x0, y0); - _swap_int16_t(x1, y1); - } - - if (x0 > x1) { - _swap_int16_t(x0, x1); - _swap_int16_t(y0, y1); - } - - int16_t dx, dy; - dx = x1 - x0; - dy = abs(y1 - y0); - - int16_t err = dx / 2; - int16_t ystep; - - if (y0 < y1) { - ystep = 1; - } else { - ystep = -1; - } - - for (; x0<=x1; x0++) { - if (steep) { - setPixel(y0, x0); - } else { - setPixel(x0, y0); - } - err -= dy; - if (err < 0) { - y0 += ystep; - err += dx; - } - } -} - -void OLEDDisplay::drawRect(int16_t x, int16_t y, int16_t width, int16_t height) { - drawHorizontalLine(x, y, width); - drawVerticalLine(x, y, height); - drawVerticalLine(x + width - 1, y, height); - drawHorizontalLine(x, y + height - 1, width); -} - -void OLEDDisplay::fillRect(int16_t xMove, int16_t yMove, int16_t width, int16_t height) { - for (int16_t x = xMove; x < xMove + width; x++) { - drawVerticalLine(x, yMove, height); - } -} - -void OLEDDisplay::drawCircle(int16_t x0, int16_t y0, int16_t radius) { - int16_t x = 0, y = radius; - int16_t dp = 1 - radius; - do { - if (dp < 0) - dp = dp + 2 * (++x) + 3; - else - dp = dp + 2 * (++x) - 2 * (--y) + 5; - - setPixel(x0 + x, y0 + y); //For the 8 octants - setPixel(x0 - x, y0 + y); - setPixel(x0 + x, y0 - y); - setPixel(x0 - x, y0 - y); - setPixel(x0 + y, y0 + x); - setPixel(x0 - y, y0 + x); - setPixel(x0 + y, y0 - x); - setPixel(x0 - y, y0 - x); - - } while (x < y); - - setPixel(x0 + radius, y0); - setPixel(x0, y0 + radius); - setPixel(x0 - radius, y0); - setPixel(x0, y0 - radius); -} - -void OLEDDisplay::drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads) { - int16_t x = 0, y = radius; - int16_t dp = 1 - radius; - while (x < y) { - if (dp < 0) - dp = dp + 2 * (++x) + 3; - else - dp = dp + 2 * (++x) - 2 * (--y) + 5; - if (quads & 0x1) { - setPixel(x0 + x, y0 - y); - setPixel(x0 + y, y0 - x); - } - if (quads & 0x2) { - setPixel(x0 - y, y0 - x); - setPixel(x0 - x, y0 - y); - } - if (quads & 0x4) { - setPixel(x0 - y, y0 + x); - setPixel(x0 - x, y0 + y); - } - if (quads & 0x8) { - setPixel(x0 + x, y0 + y); - setPixel(x0 + y, y0 + x); - } - } - if (quads & 0x1 && quads & 0x8) { - setPixel(x0 + radius, y0); - } - if (quads & 0x4 && quads & 0x8) { - setPixel(x0, y0 + radius); - } - if (quads & 0x2 && quads & 0x4) { - setPixel(x0 - radius, y0); - } - if (quads & 0x1 && quads & 0x2) { - setPixel(x0, y0 - radius); - } -} - - -void OLEDDisplay::fillCircle(int16_t x0, int16_t y0, int16_t radius) { - int16_t x = 0, y = radius; - int16_t dp = 1 - radius; - do { - if (dp < 0) - dp = dp + 2 * (++x) + 3; - else - dp = dp + 2 * (++x) - 2 * (--y) + 5; - - drawHorizontalLine(x0 - x, y0 - y, 2*x); - drawHorizontalLine(x0 - x, y0 + y, 2*x); - drawHorizontalLine(x0 - y, y0 - x, 2*y); - drawHorizontalLine(x0 - y, y0 + x, 2*y); - - - } while (x < y); - drawHorizontalLine(x0 - radius, y0, 2 * radius); - -} - -void OLEDDisplay::drawHorizontalLine(int16_t x, int16_t y, int16_t length) { - if (y < 0 || y >= this->height()) { return; } - - if (x < 0) { - length += x; - x = 0; - } - - if ( (x + length) > this->width()) { - length = (this->width() - x); - } - - if (length <= 0) { return; } - - uint8_t * bufferPtr = buffer; - bufferPtr += (y >> 3) * this->width(); - bufferPtr += x; - - uint8_t drawBit = 1 << (y & 7); - - switch (color) { - case WHITE: while (length--) { - *bufferPtr++ |= drawBit; - }; break; - case BLACK: drawBit = ~drawBit; while (length--) { - *bufferPtr++ &= drawBit; - }; break; - case INVERSE: while (length--) { - *bufferPtr++ ^= drawBit; - }; break; - } -} - -void OLEDDisplay::drawVerticalLine(int16_t x, int16_t y, int16_t length) { - if (x < 0 || x >= this->width()) return; - - if (y < 0) { - length += y; - y = 0; - } - - if ( (y + length) > this->height()) { - length = (this->height() - y); - } - - if (length <= 0) return; - - - uint8_t yOffset = y & 7; - uint8_t drawBit; - uint8_t *bufferPtr = buffer; - - bufferPtr += (y >> 3) * this->width(); - bufferPtr += x; - - if (yOffset) { - yOffset = 8 - yOffset; - drawBit = ~(0xFF >> (yOffset)); - - if (length < yOffset) { - drawBit &= (0xFF >> (yOffset - length)); - } - - switch (color) { - case WHITE: *bufferPtr |= drawBit; break; - case BLACK: *bufferPtr &= ~drawBit; break; - case INVERSE: *bufferPtr ^= drawBit; break; - } - - if (length < yOffset) return; - - length -= yOffset; - bufferPtr += this->width(); - } - - if (length >= 8) { - switch (color) { - case WHITE: - case BLACK: - drawBit = (color == WHITE) ? 0xFF : 0x00; - do { - *bufferPtr = drawBit; - bufferPtr += this->width(); - length -= 8; - } while (length >= 8); - break; - case INVERSE: - do { - *bufferPtr = ~(*bufferPtr); - bufferPtr += this->width(); - length -= 8; - } while (length >= 8); - break; - } - } - - if (length > 0) { - drawBit = (1 << (length & 7)) - 1; - switch (color) { - case WHITE: *bufferPtr |= drawBit; break; - case BLACK: *bufferPtr &= ~drawBit; break; - case INVERSE: *bufferPtr ^= drawBit; break; - } - } -} - -void OLEDDisplay::drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress) { - uint16_t radius = height / 2; - uint16_t xRadius = x + radius; - uint16_t yRadius = y + radius; - uint16_t doubleRadius = 2 * radius; - uint16_t innerRadius = radius - 2; - - setColor(WHITE); - drawCircleQuads(xRadius, yRadius, radius, 0b00000110); - drawHorizontalLine(xRadius, y, width - doubleRadius + 1); - drawHorizontalLine(xRadius, y + height, width - doubleRadius + 1); - drawCircleQuads(x + width - radius, yRadius, radius, 0b00001001); - - uint16_t maxProgressWidth = (width - doubleRadius + 1) * progress / 100; - - fillCircle(xRadius, yRadius, innerRadius); - fillRect(xRadius + 1, y + 2, maxProgressWidth, height - 3); - fillCircle(xRadius + maxProgressWidth, yRadius, innerRadius); -} - -void OLEDDisplay::drawFastImage(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *image) { - drawInternal(xMove, yMove, width, height, image, 0, 0); -} - -void OLEDDisplay::drawXbm(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm) { - int16_t widthInXbm = (width + 7) / 8; - uint8_t data = 0; - - for(int16_t y = 0; y < height; y++) { - for(int16_t x = 0; x < width; x++ ) { - if (x & 7) { - data >>= 1; // Move a bit - } else { // Read new data every 8 bit - data = pgm_read_byte(xbm + (x / 8) + y * widthInXbm); - } - // if there is a bit draw it - if (data & 0x01) { - setPixel(xMove + x, yMove + y); - } - } - } -} - -void OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth) { - uint8_t textHeight = pgm_read_byte(fontData + HEIGHT_POS); - uint8_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); - uint16_t sizeOfJumpTable = pgm_read_byte(fontData + CHAR_NUM_POS) * JUMPTABLE_BYTES; - - uint8_t cursorX = 0; - uint8_t cursorY = 0; - - switch (textAlignment) { - case TEXT_ALIGN_CENTER_BOTH: - yMove -= textHeight >> 1; - // Fallthrough - case TEXT_ALIGN_CENTER: - xMove -= textWidth >> 1; // divide by 2 - break; - case TEXT_ALIGN_RIGHT: - xMove -= textWidth; - break; - case TEXT_ALIGN_LEFT: - break; - } - - // Don't draw anything if it is not on the screen. - if (xMove + textWidth < 0 || xMove > this->width() ) {return;} - if (yMove + textHeight < 0 || yMove > this->width() ) {return;} - - for (uint16_t j = 0; j < textLength; j++) { - int16_t xPos = xMove + cursorX; - int16_t yPos = yMove + cursorY; - - byte code = text[j]; - if (code >= firstChar) { - byte charCode = code - firstChar; - - // 4 Bytes per char code - byte msbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES ); // MSB \ JumpAddress - byte lsbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_LSB); // LSB / - byte charByteSize = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_SIZE); // Size - byte currentCharWidth = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); // Width - - // Test if the char is drawable - if (!(msbJumpToChar == 255 && lsbJumpToChar == 255)) { - // Get the position of the char data - uint16_t charDataPosition = JUMPTABLE_START + sizeOfJumpTable + ((msbJumpToChar << 8) + lsbJumpToChar); - drawInternal(xPos, yPos, currentCharWidth, textHeight, fontData, charDataPosition, charByteSize); - } - - cursorX += currentCharWidth; - } - } -} - - -void OLEDDisplay::drawString(int16_t xMove, int16_t yMove, String strUser) { - uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); - - // char* text must be freed! - char* text = utf8ascii(strUser); - - uint16_t yOffset = 0; - // If the string should be centered vertically too - // we need to now how heigh the string is. - if (textAlignment == TEXT_ALIGN_CENTER_BOTH) { - uint16_t lb = 0; - // Find number of linebreaks in text - for (uint16_t i=0;text[i] != 0; i++) { - lb += (text[i] == 10); - } - // Calculate center - yOffset = (lb * lineHeight) / 2; - } - - uint16_t line = 0; - char* textPart = strtok(text,"\n"); - while (textPart != NULL) { - uint16_t length = strlen(textPart); - drawStringInternal(xMove, yMove - yOffset + (line++) * lineHeight, textPart, length, getStringWidth(textPart, length)); - textPart = strtok(NULL, "\n"); - } - free(text); -} - -void OLEDDisplay::drawStringMaxWidth(int16_t xMove, int16_t yMove, uint16_t maxLineWidth, String strUser) { - uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); - uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); - - char* text = utf8ascii(strUser); - - uint16_t length = strlen(text); - uint16_t lastDrawnPos = 0; - uint16_t lineNumber = 0; - uint16_t strWidth = 0; - - uint16_t preferredBreakpoint = 0; - uint16_t widthAtBreakpoint = 0; - - for (uint16_t i = 0; i < length; i++) { - strWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[i] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); - - // Always try to break on a space or dash - if (text[i] == ' ' || text[i]== '-') { - preferredBreakpoint = i; - widthAtBreakpoint = strWidth; - } - - if (strWidth >= maxLineWidth) { - if (preferredBreakpoint == 0) { - preferredBreakpoint = i; - widthAtBreakpoint = strWidth; - } - drawStringInternal(xMove, yMove + (lineNumber++) * lineHeight , &text[lastDrawnPos], preferredBreakpoint - lastDrawnPos, widthAtBreakpoint); - lastDrawnPos = preferredBreakpoint + 1; - // It is possible that we did not draw all letters to i so we need - // to account for the width of the chars from `i - preferredBreakpoint` - // by calculating the width we did not draw yet. - strWidth = strWidth - widthAtBreakpoint; - preferredBreakpoint = 0; - } - } - - // Draw last part if needed - if (lastDrawnPos < length) { - drawStringInternal(xMove, yMove + lineNumber * lineHeight , &text[lastDrawnPos], length - lastDrawnPos, getStringWidth(&text[lastDrawnPos], length - lastDrawnPos)); - } - - free(text); -} - -uint16_t OLEDDisplay::getStringWidth(const char* text, uint16_t length) { - uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); - - uint16_t stringWidth = 0; - uint16_t maxWidth = 0; - - while (length--) { - stringWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[length] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); - if (text[length] == 10) { - maxWidth = max(maxWidth, stringWidth); - stringWidth = 0; - } - } - - return max(maxWidth, stringWidth); -} - -uint16_t OLEDDisplay::getStringWidth(String strUser) { - char* text = utf8ascii(strUser); - uint16_t length = strlen(text); - uint16_t width = getStringWidth(text, length); - free(text); - return width; -} - -void OLEDDisplay::setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment) { - this->textAlignment = textAlignment; -} - -void OLEDDisplay::setFont(const uint8_t *fontData) { - this->fontData = fontData; -} - -void OLEDDisplay::displayOn(void) { - sendCommand(DISPLAYON); -} - -void OLEDDisplay::displayOff(void) { - sendCommand(DISPLAYOFF); -} - -void OLEDDisplay::invertDisplay(void) { - sendCommand(INVERTDISPLAY); -} - -void OLEDDisplay::normalDisplay(void) { - sendCommand(NORMALDISPLAY); -} - -void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge, uint8_t comdetect) { - sendCommand(SETPRECHARGE); //0xD9 - sendCommand(precharge); //0xF1 default, to lower the contrast, put 1-1F - sendCommand(SETCONTRAST); - sendCommand(contrast); // 0-255 - sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast) - sendCommand(comdetect); //0x40 default, to lower the contrast, put 0 - sendCommand(DISPLAYALLON_RESUME); - sendCommand(NORMALDISPLAY); - sendCommand(DISPLAYON); -} - -void OLEDDisplay::setBrightness(uint8_t brightness) { - uint8_t contrast = brightness; - if (brightness < 128) { - // Magic values to get a smooth/ step-free transition - contrast = brightness * 1.171; - } else { - contrast = brightness * 1.171 - 43; - } - - uint8_t precharge = 241; - if (brightness == 0) { - precharge = 0; - } - uint8_t comdetect = brightness / 8; - - setContrast(contrast, precharge, comdetect); -} - -void OLEDDisplay::resetOrientation() { - sendCommand(SEGREMAP); - sendCommand(COMSCANINC); //Reset screen rotation or mirroring -} - -void OLEDDisplay::flipScreenVertically() { - sendCommand(SEGREMAP | 0x01); - sendCommand(COMSCANDEC); //Rotate screen 180 Deg -} - -void OLEDDisplay::mirrorScreen() { - sendCommand(SEGREMAP); - sendCommand(COMSCANDEC); //Mirror screen -} - -void OLEDDisplay::clear(void) { - memset(buffer, 0, displayBufferSize); -} - -void OLEDDisplay::drawLogBuffer(uint16_t xMove, uint16_t yMove) { - uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); - // Always align left - setTextAlignment(TEXT_ALIGN_LEFT); - - // State values - uint16_t length = 0; - uint16_t line = 0; - uint16_t lastPos = 0; - - for (uint16_t i=0;ilogBufferFilled;i++){ - // Everytime we have a \n print - if (this->logBuffer[i] == 10) { - length++; - // Draw string on line `line` from lastPos to length - // Passing 0 as the lenght because we are in TEXT_ALIGN_LEFT - drawStringInternal(xMove, yMove + (line++) * lineHeight, &this->logBuffer[lastPos], length, 0); - // Remember last pos - lastPos = i; - // Reset length - length = 0; - } else { - // Count chars until next linebreak - length++; - } - } - // Draw the remaining string - if (length > 0) { - drawStringInternal(xMove, yMove + line * lineHeight, &this->logBuffer[lastPos], length, 0); - } -} - -uint16_t OLEDDisplay::getWidth(void) { - return displayWidth; -} - -uint16_t OLEDDisplay::getHeight(void) { - return displayHeight; -} - -bool OLEDDisplay::setLogBuffer(uint16_t lines, uint16_t chars){ - if (logBuffer != NULL) free(logBuffer); - uint16_t size = lines * chars; - if (size > 0) { - this->logBufferLine = 0; // Lines printed - this->logBufferFilled = 0; // Nothing stored yet - this->logBufferMaxLines = lines; // Lines max printable - this->logBufferSize = size; // Total number of characters the buffer can hold - this->logBuffer = (char *) malloc(size * sizeof(uint8_t)); - if(!this->logBuffer) { - DEBUG_OLEDDISPLAY("[OLEDDISPLAY][setLogBuffer] Not enough memory to create log buffer\n"); - return false; - } - } - return true; -} - -size_t OLEDDisplay::write(uint8_t c) { - if (this->logBufferSize > 0) { - // Don't waste space on \r\n line endings, dropping \r - if (c == 13) return 1; - - // convert UTF-8 character to font table index - c = (this->fontTableLookupFunction)(c); - // drop unknown character - if (c == 0) return 1; - - bool maxLineNotReached = this->logBufferLine < this->logBufferMaxLines; - bool bufferNotFull = this->logBufferFilled < this->logBufferSize; - - // Can we write to the buffer? - if (bufferNotFull && maxLineNotReached) { - this->logBuffer[logBufferFilled] = c; - this->logBufferFilled++; - // Keep track of lines written - if (c == 10) this->logBufferLine++; - } else { - // Max line number is reached - if (!maxLineNotReached) this->logBufferLine--; - - // Find the end of the first line - uint16_t firstLineEnd = 0; - for (uint16_t i=0;ilogBufferFilled;i++) { - if (this->logBuffer[i] == 10){ - // Include last char too - firstLineEnd = i + 1; - break; - } - } - // If there was a line ending - if (firstLineEnd > 0) { - // Calculate the new logBufferFilled value - this->logBufferFilled = logBufferFilled - firstLineEnd; - // Now we move the lines infront of the buffer - memcpy(this->logBuffer, &this->logBuffer[firstLineEnd], logBufferFilled); - } else { - // Let's reuse the buffer if it was full - if (!bufferNotFull) { - this->logBufferFilled = 0; - }// else { - // Nothing to do here - //} - } - write(c); - } - } - // We are always writing all uint8_t to the buffer - return 1; -} - -size_t OLEDDisplay::write(const char* str) { - if (str == NULL) return 0; - size_t length = strlen(str); - for (size_t i = 0; i < length; i++) { - write(str[i]); - } - return length; -} - -// Private functions -void OLEDDisplay::setGeometry(OLEDDISPLAY_GEOMETRY g) { - this->geometry = g; - if (g == GEOMETRY_128_64) { - this->displayWidth = 128; - this->displayHeight = 64; - } else if (g == GEOMETRY_128_32) { - this->displayWidth = 128; - this->displayHeight = 32; - } - this->displayBufferSize = displayWidth*displayHeight/8; -} - -void OLEDDisplay::sendInitCommands(void) { - sendCommand(DISPLAYOFF); - sendCommand(SETDISPLAYCLOCKDIV); - sendCommand(0xF0); // Increase speed of the display max ~96Hz - sendCommand(SETMULTIPLEX); - sendCommand(this->height() - 1); - sendCommand(SETDISPLAYOFFSET); - sendCommand(0x00); - sendCommand(SETSTARTLINE); - sendCommand(CHARGEPUMP); - sendCommand(0x14); - sendCommand(MEMORYMODE); - sendCommand(0x00); - sendCommand(SEGREMAP); - sendCommand(COMSCANINC); - sendCommand(SETCOMPINS); - - if (geometry == GEOMETRY_128_64) { - sendCommand(0x12); - } else if (geometry == GEOMETRY_128_32) { - sendCommand(0x02); - } - - sendCommand(SETCONTRAST); - - if (geometry == GEOMETRY_128_64) { - sendCommand(0xCF); - } else if (geometry == GEOMETRY_128_32) { - sendCommand(0x8F); - } - - sendCommand(SETPRECHARGE); - sendCommand(0xF1); - sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast) - sendCommand(0x40); //0x40 default, to lower the contrast, put 0 - sendCommand(DISPLAYALLON_RESUME); - sendCommand(NORMALDISPLAY); - sendCommand(0x2e); // stop scroll - sendCommand(DISPLAYON); -} - -void inline OLEDDisplay::drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) { - if (width < 0 || height < 0) return; - if (yMove + height < 0 || yMove > this->height()) return; - if (xMove + width < 0 || xMove > this->width()) return; - - uint8_t rasterHeight = 1 + ((height - 1) >> 3); // fast ceil(height / 8.0) - int8_t yOffset = yMove & 7; - - bytesInData = bytesInData == 0 ? width * rasterHeight : bytesInData; - - int16_t initYMove = yMove; - int8_t initYOffset = yOffset; - - - for (uint16_t i = 0; i < bytesInData; i++) { - - // Reset if next horizontal drawing phase is started. - if ( i % rasterHeight == 0) { - yMove = initYMove; - yOffset = initYOffset; - } - - byte currentByte = pgm_read_byte(data + offset + i); - - int16_t xPos = xMove + (i / rasterHeight); - int16_t yPos = ((yMove >> 3) + (i % rasterHeight)) * this->width(); - -// int16_t yScreenPos = yMove + yOffset; - int16_t dataPos = xPos + yPos; - - if (dataPos >= 0 && dataPos < displayBufferSize && - xPos >= 0 && xPos < this->width() ) { - - if (yOffset >= 0) { - switch (this->color) { - case WHITE: buffer[dataPos] |= currentByte << yOffset; break; - case BLACK: buffer[dataPos] &= ~(currentByte << yOffset); break; - case INVERSE: buffer[dataPos] ^= currentByte << yOffset; break; - } - - if (dataPos < (displayBufferSize - this->width())) { - switch (this->color) { - case WHITE: buffer[dataPos + this->width()] |= currentByte >> (8 - yOffset); break; - case BLACK: buffer[dataPos + this->width()] &= ~(currentByte >> (8 - yOffset)); break; - case INVERSE: buffer[dataPos + this->width()] ^= currentByte >> (8 - yOffset); break; - } - } - } else { - // Make new offset position - yOffset = -yOffset; - - switch (this->color) { - case WHITE: buffer[dataPos] |= currentByte >> yOffset; break; - case BLACK: buffer[dataPos] &= ~(currentByte >> yOffset); break; - case INVERSE: buffer[dataPos] ^= currentByte >> yOffset; break; - } - - // Prepare for next iteration by moving one block up - yMove -= 8; - - // and setting the new yOffset - yOffset = 8 - yOffset; - } - - yield(); - } - } -} - -// You need to free the char! -char* OLEDDisplay::utf8ascii(String str) { - uint16_t k = 0; - uint16_t length = str.length() + 1; - - // Copy the string into a char array - char* s = (char*) malloc(length * sizeof(char)); - if(!s) { - DEBUG_OLEDDISPLAY("[OLEDDISPLAY][utf8ascii] Can't allocate another char array. Drop support for UTF-8.\n"); - return (char*) str.c_str(); - } - str.toCharArray(s, length); - - length--; - - for (uint16_t i=0; i < length; i++) { - char c = (this->fontTableLookupFunction)(s[i]); - if (c!=0) { - s[k++]=c; - } - } - - s[k]=0; - - // This will leak 's' be sure to free it in the calling function. - return s; -} - -void OLEDDisplay::setFontTableLookupFunction(FontTableLookupFunction function) { - this->fontTableLookupFunction = function; -} diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplay.h b/printermonitor/libs/OledDisplay/src/OLEDDisplay.h deleted file mode 100644 index ddf80bd..0000000 --- a/printermonitor/libs/OledDisplay/src/OLEDDisplay.h +++ /dev/null @@ -1,329 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef OLEDDISPLAY_h -#define OLEDDISPLAY_h - -#include -#include "OLEDDisplayFonts.h" - -//#define DEBUG_OLEDDISPLAY(...) Serial.printf( __VA_ARGS__ ) - -#ifndef DEBUG_OLEDDISPLAY -#define DEBUG_OLEDDISPLAY(...) -#endif - -// Use DOUBLE BUFFERING by default -#ifndef OLEDDISPLAY_REDUCE_MEMORY -#define OLEDDISPLAY_DOUBLE_BUFFER -#endif - -// Header Values -#define JUMPTABLE_BYTES 4 - -#define JUMPTABLE_LSB 1 -#define JUMPTABLE_SIZE 2 -#define JUMPTABLE_WIDTH 3 -#define JUMPTABLE_START 4 - -#define WIDTH_POS 0 -#define HEIGHT_POS 1 -#define FIRST_CHAR_POS 2 -#define CHAR_NUM_POS 3 - - -// Display commands -#define CHARGEPUMP 0x8D -#define COLUMNADDR 0x21 -#define COMSCANDEC 0xC8 -#define COMSCANINC 0xC0 -#define DISPLAYALLON 0xA5 -#define DISPLAYALLON_RESUME 0xA4 -#define DISPLAYOFF 0xAE -#define DISPLAYON 0xAF -#define EXTERNALVCC 0x1 -#define INVERTDISPLAY 0xA7 -#define MEMORYMODE 0x20 -#define NORMALDISPLAY 0xA6 -#define PAGEADDR 0x22 -#define SEGREMAP 0xA0 -#define SETCOMPINS 0xDA -#define SETCONTRAST 0x81 -#define SETDISPLAYCLOCKDIV 0xD5 -#define SETDISPLAYOFFSET 0xD3 -#define SETHIGHCOLUMN 0x10 -#define SETLOWCOLUMN 0x00 -#define SETMULTIPLEX 0xA8 -#define SETPRECHARGE 0xD9 -#define SETSEGMENTREMAP 0xA1 -#define SETSTARTLINE 0x40 -#define SETVCOMDETECT 0xDB -#define SWITCHCAPVCC 0x2 - -#ifndef _swap_int16_t -#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } -#endif - -enum OLEDDISPLAY_COLOR { - BLACK = 0, - WHITE = 1, - INVERSE = 2 -}; - -enum OLEDDISPLAY_TEXT_ALIGNMENT { - TEXT_ALIGN_LEFT = 0, - TEXT_ALIGN_RIGHT = 1, - TEXT_ALIGN_CENTER = 2, - TEXT_ALIGN_CENTER_BOTH = 3 -}; - - -enum OLEDDISPLAY_GEOMETRY { - GEOMETRY_128_64 = 0, - GEOMETRY_128_32 = 1 -}; - -typedef byte (*FontTableLookupFunction)(const byte ch); - - -class OLEDDisplay : public Print { - - public: - virtual ~OLEDDisplay(); - - const uint16_t width(void) const { return displayWidth; }; - const uint16_t height(void) const { return displayHeight; }; - - // Initialize the display - bool init(); - - // Free the memory used by the display - void end(); - - // Cycle through the initialization - void resetDisplay(void); - - /* Drawing functions */ - // Sets the color of all pixel operations - void setColor(OLEDDISPLAY_COLOR color); - - // Returns the current color. - OLEDDISPLAY_COLOR getColor(); - - // Draw a pixel at given position - void setPixel(int16_t x, int16_t y); - - // Draw a line from position 0 to position 1 - void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); - - // Draw the border of a rectangle at the given location - void drawRect(int16_t x, int16_t y, int16_t width, int16_t height); - - // Fill the rectangle - void fillRect(int16_t x, int16_t y, int16_t width, int16_t height); - - // Draw the border of a circle - void drawCircle(int16_t x, int16_t y, int16_t radius); - - // Draw all Quadrants specified in the quads bit mask - void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads); - - // Fill circle - void fillCircle(int16_t x, int16_t y, int16_t radius); - - // Draw a line horizontally - void drawHorizontalLine(int16_t x, int16_t y, int16_t length); - - // Draw a line vertically - void drawVerticalLine(int16_t x, int16_t y, int16_t length); - - // Draws a rounded progress bar with the outer dimensions given by width and height. Progress is - // a unsigned byte value between 0 and 100 - void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress); - - // Draw a bitmap in the internal image format - void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image); - - // Draw a XBM - void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *xbm); - - /* Text functions */ - - // Draws a string at the given location - void drawString(int16_t x, int16_t y, String text); - - // Draws a String with a maximum width at the given location. - // If the given String is wider than the specified width - // The text will be wrapped to the next line at a space or dash - void drawStringMaxWidth(int16_t x, int16_t y, uint16_t maxLineWidth, String text); - - // Returns the width of the const char* with the current - // font settings - uint16_t getStringWidth(const char* text, uint16_t length); - - // Convencience method for the const char version - uint16_t getStringWidth(String text); - - // Specifies relative to which anchor point - // the text is rendered. Available constants: - // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH - void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment); - - // Sets the current font. Available default fonts - // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24 - void setFont(const uint8_t *fontData); - - // Set the function that will convert utf-8 to font table index - void setFontTableLookupFunction(FontTableLookupFunction function); - - /* Display functions */ - - // Turn the display on - void displayOn(void); - - // Turn the display offs - void displayOff(void); - - // Inverted display mode - void invertDisplay(void); - - // Normal display mode - void normalDisplay(void); - - // Set display contrast - // really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0 - // normal brightness & contrast: contrast = 100 - void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64); - - // Convenience method to access - void setBrightness(uint8_t); - - // Reset display rotation or mirroring - void resetOrientation(); - - // Turn the display upside down - void flipScreenVertically(); - - // Mirror the display (to be used in a mirror or as a projector) - void mirrorScreen(); - - // Write the buffer to the display memory - virtual void display(void) = 0; - - // Clear the local pixel buffer - void clear(void); - - // Log buffer implementation - - // This will define the lines and characters you can - // print to the screen. When you exeed the buffer size (lines * chars) - // the output may be truncated due to the size constraint. - bool setLogBuffer(uint16_t lines, uint16_t chars); - - // Draw the log buffer at position (x, y) - void drawLogBuffer(uint16_t x, uint16_t y); - - // Get screen geometry - uint16_t getWidth(void); - uint16_t getHeight(void); - - // Implement needed function to be compatible with Print class - size_t write(uint8_t c); - size_t write(const char* s); - - uint8_t *buffer = NULL; - - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t *buffer_back = NULL; - #endif - - protected: - - OLEDDISPLAY_GEOMETRY geometry = GEOMETRY_128_64; - - uint16_t displayWidth = 128; - uint16_t displayHeight = 64; - uint16_t displayBufferSize = 1024; - - // Set the correct height, width and buffer for the geometry - void setGeometry(OLEDDISPLAY_GEOMETRY g); - - OLEDDISPLAY_TEXT_ALIGNMENT textAlignment = TEXT_ALIGN_LEFT; - OLEDDISPLAY_COLOR color = WHITE; - - const uint8_t *fontData = ArialMT_Plain_10; - - // State values for logBuffer - uint16_t logBufferSize = 0; - uint16_t logBufferFilled = 0; - uint16_t logBufferLine = 0; - uint16_t logBufferMaxLines = 0; - char *logBuffer = NULL; - - // Send a command to the display (low level function) - virtual void sendCommand(uint8_t com) {(void)com;}; - - // Connect to the display - virtual bool connect() { return false; }; - - // Send all the init commands - void sendInitCommands(); - - // converts utf8 characters to extended ascii - char* utf8ascii(String s); - - void inline drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) __attribute__((always_inline)); - - void drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth); - - // UTF-8 to font table index converter - // Code form http://playground.arduino.cc/Main/Utf8ascii - FontTableLookupFunction fontTableLookupFunction = [](const byte ch) { - static uint8_t LASTCHAR; - - if (ch < 128) { // Standard ASCII-set 0..0x7F handling - LASTCHAR = 0; - return ch; - } - - uint8_t last = LASTCHAR; // get last char - LASTCHAR = ch; - - switch (last) { // conversion depnding on first UTF8-character - case 0xC2: return (uint8_t) ch; - case 0xC3: return (uint8_t) (ch | 0xC0); - case 0x82: if (ch == 0xAC) return (uint8_t) 0x80; // special case Euro-symbol - } - - return (uint8_t) 0; // otherwise: return zero, if character has to be ignored - }; -}; - -#endif diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h b/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h deleted file mode 100644 index 3544edb..0000000 --- a/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h +++ /dev/null @@ -1,1274 +0,0 @@ -#ifndef OLEDDISPLAYFONTS_h -#define OLEDDISPLAYFONTS_h - -const uint8_t ArialMT_Plain_10[] PROGMEM = { - 0x0A, // Width: 10 - 0x0D, // Height: 13 - 0x20, // First Char: 32 - 0xE0, // Numbers of Chars: 224 - - // Jump Table: - 0xFF, 0xFF, 0x00, 0x03, // 32:65535 - 0x00, 0x00, 0x04, 0x03, // 33:0 - 0x00, 0x04, 0x05, 0x04, // 34:4 - 0x00, 0x09, 0x09, 0x06, // 35:9 - 0x00, 0x12, 0x0A, 0x06, // 36:18 - 0x00, 0x1C, 0x10, 0x09, // 37:28 - 0x00, 0x2C, 0x0E, 0x07, // 38:44 - 0x00, 0x3A, 0x01, 0x02, // 39:58 - 0x00, 0x3B, 0x06, 0x03, // 40:59 - 0x00, 0x41, 0x06, 0x03, // 41:65 - 0x00, 0x47, 0x05, 0x04, // 42:71 - 0x00, 0x4C, 0x09, 0x06, // 43:76 - 0x00, 0x55, 0x04, 0x03, // 44:85 - 0x00, 0x59, 0x03, 0x03, // 45:89 - 0x00, 0x5C, 0x04, 0x03, // 46:92 - 0x00, 0x60, 0x05, 0x03, // 47:96 - 0x00, 0x65, 0x0A, 0x06, // 48:101 - 0x00, 0x6F, 0x08, 0x06, // 49:111 - 0x00, 0x77, 0x0A, 0x06, // 50:119 - 0x00, 0x81, 0x0A, 0x06, // 51:129 - 0x00, 0x8B, 0x0B, 0x06, // 52:139 - 0x00, 0x96, 0x0A, 0x06, // 53:150 - 0x00, 0xA0, 0x0A, 0x06, // 54:160 - 0x00, 0xAA, 0x09, 0x06, // 55:170 - 0x00, 0xB3, 0x0A, 0x06, // 56:179 - 0x00, 0xBD, 0x0A, 0x06, // 57:189 - 0x00, 0xC7, 0x04, 0x03, // 58:199 - 0x00, 0xCB, 0x04, 0x03, // 59:203 - 0x00, 0xCF, 0x0A, 0x06, // 60:207 - 0x00, 0xD9, 0x09, 0x06, // 61:217 - 0x00, 0xE2, 0x09, 0x06, // 62:226 - 0x00, 0xEB, 0x0B, 0x06, // 63:235 - 0x00, 0xF6, 0x14, 0x0A, // 64:246 - 0x01, 0x0A, 0x0E, 0x07, // 65:266 - 0x01, 0x18, 0x0C, 0x07, // 66:280 - 0x01, 0x24, 0x0C, 0x07, // 67:292 - 0x01, 0x30, 0x0B, 0x07, // 68:304 - 0x01, 0x3B, 0x0C, 0x07, // 69:315 - 0x01, 0x47, 0x09, 0x06, // 70:327 - 0x01, 0x50, 0x0D, 0x08, // 71:336 - 0x01, 0x5D, 0x0C, 0x07, // 72:349 - 0x01, 0x69, 0x04, 0x03, // 73:361 - 0x01, 0x6D, 0x08, 0x05, // 74:365 - 0x01, 0x75, 0x0E, 0x07, // 75:373 - 0x01, 0x83, 0x0C, 0x06, // 76:387 - 0x01, 0x8F, 0x10, 0x08, // 77:399 - 0x01, 0x9F, 0x0C, 0x07, // 78:415 - 0x01, 0xAB, 0x0E, 0x08, // 79:427 - 0x01, 0xB9, 0x0B, 0x07, // 80:441 - 0x01, 0xC4, 0x0E, 0x08, // 81:452 - 0x01, 0xD2, 0x0C, 0x07, // 82:466 - 0x01, 0xDE, 0x0C, 0x07, // 83:478 - 0x01, 0xEA, 0x0B, 0x06, // 84:490 - 0x01, 0xF5, 0x0C, 0x07, // 85:501 - 0x02, 0x01, 0x0D, 0x07, // 86:513 - 0x02, 0x0E, 0x11, 0x09, // 87:526 - 0x02, 0x1F, 0x0E, 0x07, // 88:543 - 0x02, 0x2D, 0x0D, 0x07, // 89:557 - 0x02, 0x3A, 0x0C, 0x06, // 90:570 - 0x02, 0x46, 0x06, 0x03, // 91:582 - 0x02, 0x4C, 0x06, 0x03, // 92:588 - 0x02, 0x52, 0x04, 0x03, // 93:594 - 0x02, 0x56, 0x09, 0x05, // 94:598 - 0x02, 0x5F, 0x0C, 0x06, // 95:607 - 0x02, 0x6B, 0x03, 0x03, // 96:619 - 0x02, 0x6E, 0x0A, 0x06, // 97:622 - 0x02, 0x78, 0x0A, 0x06, // 98:632 - 0x02, 0x82, 0x0A, 0x05, // 99:642 - 0x02, 0x8C, 0x0A, 0x06, // 100:652 - 0x02, 0x96, 0x0A, 0x06, // 101:662 - 0x02, 0xA0, 0x05, 0x03, // 102:672 - 0x02, 0xA5, 0x0A, 0x06, // 103:677 - 0x02, 0xAF, 0x0A, 0x06, // 104:687 - 0x02, 0xB9, 0x04, 0x02, // 105:697 - 0x02, 0xBD, 0x04, 0x02, // 106:701 - 0x02, 0xC1, 0x08, 0x05, // 107:705 - 0x02, 0xC9, 0x04, 0x02, // 108:713 - 0x02, 0xCD, 0x10, 0x08, // 109:717 - 0x02, 0xDD, 0x0A, 0x06, // 110:733 - 0x02, 0xE7, 0x0A, 0x06, // 111:743 - 0x02, 0xF1, 0x0A, 0x06, // 112:753 - 0x02, 0xFB, 0x0A, 0x06, // 113:763 - 0x03, 0x05, 0x05, 0x03, // 114:773 - 0x03, 0x0A, 0x08, 0x05, // 115:778 - 0x03, 0x12, 0x06, 0x03, // 116:786 - 0x03, 0x18, 0x0A, 0x06, // 117:792 - 0x03, 0x22, 0x09, 0x05, // 118:802 - 0x03, 0x2B, 0x0E, 0x07, // 119:811 - 0x03, 0x39, 0x0A, 0x05, // 120:825 - 0x03, 0x43, 0x09, 0x05, // 121:835 - 0x03, 0x4C, 0x0A, 0x05, // 122:844 - 0x03, 0x56, 0x06, 0x03, // 123:854 - 0x03, 0x5C, 0x04, 0x03, // 124:860 - 0x03, 0x60, 0x05, 0x03, // 125:864 - 0x03, 0x65, 0x09, 0x06, // 126:869 - 0xFF, 0xFF, 0x00, 0x00, // 127:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 128:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 129:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 130:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 131:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 132:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 133:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 134:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 135:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 136:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 137:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 138:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 139:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 140:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 141:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 142:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 143:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 144:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 145:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 146:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 147:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 148:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 149:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 150:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 151:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 152:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 153:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 154:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 155:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 156:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 157:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 158:65535 - 0xFF, 0xFF, 0x00, 0x0A, // 159:65535 - 0xFF, 0xFF, 0x00, 0x03, // 160:65535 - 0x03, 0x6E, 0x04, 0x03, // 161:878 - 0x03, 0x72, 0x0A, 0x06, // 162:882 - 0x03, 0x7C, 0x0C, 0x06, // 163:892 - 0x03, 0x88, 0x0A, 0x06, // 164:904 - 0x03, 0x92, 0x0A, 0x06, // 165:914 - 0x03, 0x9C, 0x04, 0x03, // 166:924 - 0x03, 0xA0, 0x0A, 0x06, // 167:928 - 0x03, 0xAA, 0x05, 0x03, // 168:938 - 0x03, 0xAF, 0x0D, 0x07, // 169:943 - 0x03, 0xBC, 0x07, 0x04, // 170:956 - 0x03, 0xC3, 0x0A, 0x06, // 171:963 - 0x03, 0xCD, 0x09, 0x06, // 172:973 - 0x03, 0xD6, 0x03, 0x03, // 173:982 - 0x03, 0xD9, 0x0D, 0x07, // 174:985 - 0x03, 0xE6, 0x0B, 0x06, // 175:998 - 0x03, 0xF1, 0x07, 0x04, // 176:1009 - 0x03, 0xF8, 0x0A, 0x05, // 177:1016 - 0x04, 0x02, 0x05, 0x03, // 178:1026 - 0x04, 0x07, 0x05, 0x03, // 179:1031 - 0x04, 0x0C, 0x05, 0x03, // 180:1036 - 0x04, 0x11, 0x0A, 0x06, // 181:1041 - 0x04, 0x1B, 0x09, 0x05, // 182:1051 - 0x04, 0x24, 0x03, 0x03, // 183:1060 - 0x04, 0x27, 0x06, 0x03, // 184:1063 - 0x04, 0x2D, 0x05, 0x03, // 185:1069 - 0x04, 0x32, 0x07, 0x04, // 186:1074 - 0x04, 0x39, 0x0A, 0x06, // 187:1081 - 0x04, 0x43, 0x10, 0x08, // 188:1091 - 0x04, 0x53, 0x10, 0x08, // 189:1107 - 0x04, 0x63, 0x10, 0x08, // 190:1123 - 0x04, 0x73, 0x0A, 0x06, // 191:1139 - 0x04, 0x7D, 0x0E, 0x07, // 192:1149 - 0x04, 0x8B, 0x0E, 0x07, // 193:1163 - 0x04, 0x99, 0x0E, 0x07, // 194:1177 - 0x04, 0xA7, 0x0E, 0x07, // 195:1191 - 0x04, 0xB5, 0x0E, 0x07, // 196:1205 - 0x04, 0xC3, 0x0E, 0x07, // 197:1219 - 0x04, 0xD1, 0x12, 0x0A, // 198:1233 - 0x04, 0xE3, 0x0C, 0x07, // 199:1251 - 0x04, 0xEF, 0x0C, 0x07, // 200:1263 - 0x04, 0xFB, 0x0C, 0x07, // 201:1275 - 0x05, 0x07, 0x0C, 0x07, // 202:1287 - 0x05, 0x13, 0x0C, 0x07, // 203:1299 - 0x05, 0x1F, 0x05, 0x03, // 204:1311 - 0x05, 0x24, 0x04, 0x03, // 205:1316 - 0x05, 0x28, 0x04, 0x03, // 206:1320 - 0x05, 0x2C, 0x05, 0x03, // 207:1324 - 0x05, 0x31, 0x0B, 0x07, // 208:1329 - 0x05, 0x3C, 0x0C, 0x07, // 209:1340 - 0x05, 0x48, 0x0E, 0x08, // 210:1352 - 0x05, 0x56, 0x0E, 0x08, // 211:1366 - 0x05, 0x64, 0x0E, 0x08, // 212:1380 - 0x05, 0x72, 0x0E, 0x08, // 213:1394 - 0x05, 0x80, 0x0E, 0x08, // 214:1408 - 0x05, 0x8E, 0x0A, 0x06, // 215:1422 - 0x05, 0x98, 0x0D, 0x08, // 216:1432 - 0x05, 0xA5, 0x0C, 0x07, // 217:1445 - 0x05, 0xB1, 0x0C, 0x07, // 218:1457 - 0x05, 0xBD, 0x0C, 0x07, // 219:1469 - 0x05, 0xC9, 0x0C, 0x07, // 220:1481 - 0x05, 0xD5, 0x0D, 0x07, // 221:1493 - 0x05, 0xE2, 0x0B, 0x07, // 222:1506 - 0x05, 0xED, 0x0C, 0x06, // 223:1517 - 0x05, 0xF9, 0x0A, 0x06, // 224:1529 - 0x06, 0x03, 0x0A, 0x06, // 225:1539 - 0x06, 0x0D, 0x0A, 0x06, // 226:1549 - 0x06, 0x17, 0x0A, 0x06, // 227:1559 - 0x06, 0x21, 0x0A, 0x06, // 228:1569 - 0x06, 0x2B, 0x0A, 0x06, // 229:1579 - 0x06, 0x35, 0x10, 0x09, // 230:1589 - 0x06, 0x45, 0x0A, 0x05, // 231:1605 - 0x06, 0x4F, 0x0A, 0x06, // 232:1615 - 0x06, 0x59, 0x0A, 0x06, // 233:1625 - 0x06, 0x63, 0x0A, 0x06, // 234:1635 - 0x06, 0x6D, 0x0A, 0x06, // 235:1645 - 0x06, 0x77, 0x05, 0x03, // 236:1655 - 0x06, 0x7C, 0x04, 0x03, // 237:1660 - 0x06, 0x80, 0x05, 0x03, // 238:1664 - 0x06, 0x85, 0x05, 0x03, // 239:1669 - 0x06, 0x8A, 0x0A, 0x06, // 240:1674 - 0x06, 0x94, 0x0A, 0x06, // 241:1684 - 0x06, 0x9E, 0x0A, 0x06, // 242:1694 - 0x06, 0xA8, 0x0A, 0x06, // 243:1704 - 0x06, 0xB2, 0x0A, 0x06, // 244:1714 - 0x06, 0xBC, 0x0A, 0x06, // 245:1724 - 0x06, 0xC6, 0x0A, 0x06, // 246:1734 - 0x06, 0xD0, 0x09, 0x05, // 247:1744 - 0x06, 0xD9, 0x0A, 0x06, // 248:1753 - 0x06, 0xE3, 0x0A, 0x06, // 249:1763 - 0x06, 0xED, 0x0A, 0x06, // 250:1773 - 0x06, 0xF7, 0x0A, 0x06, // 251:1783 - 0x07, 0x01, 0x0A, 0x06, // 252:1793 - 0x07, 0x0B, 0x09, 0x05, // 253:1803 - 0x07, 0x14, 0x0A, 0x06, // 254:1812 - 0x07, 0x1E, 0x09, 0x05, // 255:1822 - - // Font Data: - 0x00,0x00,0xF8,0x02, // 33 - 0x38,0x00,0x00,0x00,0x38, // 34 - 0xA0,0x03,0xE0,0x00,0xB8,0x03,0xE0,0x00,0xB8, // 35 - 0x30,0x01,0x28,0x02,0xF8,0x07,0x48,0x02,0x90,0x01, // 36 - 0x00,0x00,0x30,0x00,0x48,0x00,0x30,0x03,0xC0,0x00,0xB0,0x01,0x48,0x02,0x80,0x01, // 37 - 0x80,0x01,0x50,0x02,0x68,0x02,0xA8,0x02,0x18,0x01,0x80,0x03,0x80,0x02, // 38 - 0x38, // 39 - 0xE0,0x03,0x10,0x04,0x08,0x08, // 40 - 0x08,0x08,0x10,0x04,0xE0,0x03, // 41 - 0x28,0x00,0x18,0x00,0x28, // 42 - 0x40,0x00,0x40,0x00,0xF0,0x01,0x40,0x00,0x40, // 43 - 0x00,0x00,0x00,0x06, // 44 - 0x80,0x00,0x80, // 45 - 0x00,0x00,0x00,0x02, // 46 - 0x00,0x03,0xE0,0x00,0x18, // 47 - 0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 48 - 0x00,0x00,0x20,0x00,0x10,0x00,0xF8,0x03, // 49 - 0x10,0x02,0x08,0x03,0x88,0x02,0x48,0x02,0x30,0x02, // 50 - 0x10,0x01,0x08,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 51 - 0xC0,0x00,0xA0,0x00,0x90,0x00,0x88,0x00,0xF8,0x03,0x80, // 52 - 0x60,0x01,0x38,0x02,0x28,0x02,0x28,0x02,0xC8,0x01, // 53 - 0xF0,0x01,0x28,0x02,0x28,0x02,0x28,0x02,0xD0,0x01, // 54 - 0x08,0x00,0x08,0x03,0xC8,0x00,0x38,0x00,0x08, // 55 - 0xB0,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 56 - 0x70,0x01,0x88,0x02,0x88,0x02,0x88,0x02,0xF0,0x01, // 57 - 0x00,0x00,0x20,0x02, // 58 - 0x00,0x00,0x20,0x06, // 59 - 0x00,0x00,0x40,0x00,0xA0,0x00,0xA0,0x00,0x10,0x01, // 60 - 0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0, // 61 - 0x00,0x00,0x10,0x01,0xA0,0x00,0xA0,0x00,0x40, // 62 - 0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x02,0x48,0x00,0x30, // 63 - 0x00,0x00,0xC0,0x03,0x30,0x04,0xD0,0x09,0x28,0x0A,0x28,0x0A,0xC8,0x0B,0x68,0x0A,0x10,0x05,0xE0,0x04, // 64 - 0x00,0x02,0xC0,0x01,0xB0,0x00,0x88,0x00,0xB0,0x00,0xC0,0x01,0x00,0x02, // 65 - 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0xF0,0x01, // 66 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x10,0x01, // 67 - 0x00,0x00,0xF8,0x03,0x08,0x02,0x08,0x02,0x10,0x01,0xE0, // 68 - 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0x48,0x02, // 69 - 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x08, // 70 - 0x00,0x00,0xE0,0x00,0x10,0x01,0x08,0x02,0x48,0x02,0x50,0x01,0xC0, // 71 - 0x00,0x00,0xF8,0x03,0x40,0x00,0x40,0x00,0x40,0x00,0xF8,0x03, // 72 - 0x00,0x00,0xF8,0x03, // 73 - 0x00,0x03,0x00,0x02,0x00,0x02,0xF8,0x01, // 74 - 0x00,0x00,0xF8,0x03,0x80,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 75 - 0x00,0x00,0xF8,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 76 - 0x00,0x00,0xF8,0x03,0x30,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x30,0x00,0xF8,0x03, // 77 - 0x00,0x00,0xF8,0x03,0x30,0x00,0x40,0x00,0x80,0x01,0xF8,0x03, // 78 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 79 - 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x48,0x00,0x30, // 80 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x03,0x08,0x03,0xF0,0x02, // 81 - 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0xC8,0x00,0x30,0x03, // 82 - 0x00,0x00,0x30,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0x90,0x01, // 83 - 0x00,0x00,0x08,0x00,0x08,0x00,0xF8,0x03,0x08,0x00,0x08, // 84 - 0x00,0x00,0xF8,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x01, // 85 - 0x08,0x00,0x70,0x00,0x80,0x01,0x00,0x02,0x80,0x01,0x70,0x00,0x08, // 86 - 0x18,0x00,0xE0,0x01,0x00,0x02,0xF0,0x01,0x08,0x00,0xF0,0x01,0x00,0x02,0xE0,0x01,0x18, // 87 - 0x00,0x02,0x08,0x01,0x90,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 88 - 0x08,0x00,0x10,0x00,0x20,0x00,0xC0,0x03,0x20,0x00,0x10,0x00,0x08, // 89 - 0x08,0x03,0x88,0x02,0xC8,0x02,0x68,0x02,0x38,0x02,0x18,0x02, // 90 - 0x00,0x00,0xF8,0x0F,0x08,0x08, // 91 - 0x18,0x00,0xE0,0x00,0x00,0x03, // 92 - 0x08,0x08,0xF8,0x0F, // 93 - 0x40,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x40, // 94 - 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08, // 95 - 0x08,0x00,0x10, // 96 - 0x00,0x00,0x00,0x03,0xA0,0x02,0xA0,0x02,0xE0,0x03, // 97 - 0x00,0x00,0xF8,0x03,0x20,0x02,0x20,0x02,0xC0,0x01, // 98 - 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x40,0x01, // 99 - 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xF8,0x03, // 100 - 0x00,0x00,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 101 - 0x20,0x00,0xF0,0x03,0x28, // 102 - 0x00,0x00,0xC0,0x05,0x20,0x0A,0x20,0x0A,0xE0,0x07, // 103 - 0x00,0x00,0xF8,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 104 - 0x00,0x00,0xE8,0x03, // 105 - 0x00,0x08,0xE8,0x07, // 106 - 0xF8,0x03,0x80,0x00,0xC0,0x01,0x20,0x02, // 107 - 0x00,0x00,0xF8,0x03, // 108 - 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 109 - 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 110 - 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xC0,0x01, // 111 - 0x00,0x00,0xE0,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 112 - 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xE0,0x0F, // 113 - 0x00,0x00,0xE0,0x03,0x20, // 114 - 0x40,0x02,0xA0,0x02,0xA0,0x02,0x20,0x01, // 115 - 0x20,0x00,0xF8,0x03,0x20,0x02, // 116 - 0x00,0x00,0xE0,0x01,0x00,0x02,0x00,0x02,0xE0,0x03, // 117 - 0x20,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x20, // 118 - 0xE0,0x01,0x00,0x02,0xC0,0x01,0x20,0x00,0xC0,0x01,0x00,0x02,0xE0,0x01, // 119 - 0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02, // 120 - 0x20,0x00,0xC0,0x09,0x00,0x06,0xC0,0x01,0x20, // 121 - 0x20,0x02,0x20,0x03,0xA0,0x02,0x60,0x02,0x20,0x02, // 122 - 0x80,0x00,0x78,0x0F,0x08,0x08, // 123 - 0x00,0x00,0xF8,0x0F, // 124 - 0x08,0x08,0x78,0x0F,0x80, // 125 - 0xC0,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0xC0, // 126 - 0x00,0x00,0xA0,0x0F, // 161 - 0x00,0x00,0xC0,0x01,0xA0,0x0F,0x78,0x02,0x40,0x01, // 162 - 0x40,0x02,0x70,0x03,0xC8,0x02,0x48,0x02,0x08,0x02,0x10,0x02, // 163 - 0x00,0x00,0xE0,0x01,0x20,0x01,0x20,0x01,0xE0,0x01, // 164 - 0x48,0x01,0x70,0x01,0xC0,0x03,0x70,0x01,0x48,0x01, // 165 - 0x00,0x00,0x38,0x0F, // 166 - 0xD0,0x04,0x28,0x09,0x48,0x09,0x48,0x0A,0x90,0x05, // 167 - 0x08,0x00,0x00,0x00,0x08, // 168 - 0xE0,0x00,0x10,0x01,0x48,0x02,0xA8,0x02,0xA8,0x02,0x10,0x01,0xE0, // 169 - 0x68,0x00,0x68,0x00,0x68,0x00,0x78, // 170 - 0x00,0x00,0x80,0x01,0x40,0x02,0x80,0x01,0x40,0x02, // 171 - 0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0, // 172 - 0x80,0x00,0x80, // 173 - 0xE0,0x00,0x10,0x01,0xE8,0x02,0x68,0x02,0xC8,0x02,0x10,0x01,0xE0, // 174 - 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 175 - 0x00,0x00,0x38,0x00,0x28,0x00,0x38, // 176 - 0x40,0x02,0x40,0x02,0xF0,0x03,0x40,0x02,0x40,0x02, // 177 - 0x48,0x00,0x68,0x00,0x58, // 178 - 0x48,0x00,0x58,0x00,0x68, // 179 - 0x00,0x00,0x10,0x00,0x08, // 180 - 0x00,0x00,0xE0,0x0F,0x00,0x02,0x00,0x02,0xE0,0x03, // 181 - 0x70,0x00,0xF8,0x0F,0x08,0x00,0xF8,0x0F,0x08, // 182 - 0x00,0x00,0x40, // 183 - 0x00,0x00,0x00,0x14,0x00,0x18, // 184 - 0x00,0x00,0x10,0x00,0x78, // 185 - 0x30,0x00,0x48,0x00,0x48,0x00,0x30, // 186 - 0x00,0x00,0x40,0x02,0x80,0x01,0x40,0x02,0x80,0x01, // 187 - 0x00,0x00,0x10,0x02,0x78,0x01,0xC0,0x00,0x20,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 188 - 0x00,0x00,0x10,0x02,0x78,0x01,0x80,0x00,0x60,0x00,0x50,0x02,0x48,0x03,0xC0,0x02, // 189 - 0x48,0x00,0x58,0x00,0x68,0x03,0x80,0x00,0x60,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 190 - 0x00,0x00,0x00,0x06,0x00,0x09,0xA0,0x09,0x00,0x04, // 191 - 0x00,0x02,0xC0,0x01,0xB0,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 192 - 0x00,0x02,0xC0,0x01,0xB0,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 193 - 0x00,0x02,0xC0,0x01,0xB2,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 194 - 0x00,0x02,0xC2,0x01,0xB1,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 195 - 0x00,0x02,0xC0,0x01,0xB2,0x00,0x88,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 196 - 0x00,0x02,0xC0,0x01,0xBE,0x00,0x8A,0x00,0xBE,0x00,0xC0,0x01,0x00,0x02, // 197 - 0x00,0x03,0xC0,0x00,0xE0,0x00,0x98,0x00,0x88,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02, // 198 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x16,0x08,0x1A,0x10,0x01, // 199 - 0x00,0x00,0xF8,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 200 - 0x00,0x00,0xF8,0x03,0x48,0x02,0x4A,0x02,0x49,0x02,0x48,0x02, // 201 - 0x00,0x00,0xFA,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 202 - 0x00,0x00,0xF8,0x03,0x4A,0x02,0x48,0x02,0x4A,0x02,0x48,0x02, // 203 - 0x00,0x00,0xF9,0x03,0x02, // 204 - 0x02,0x00,0xF9,0x03, // 205 - 0x01,0x00,0xFA,0x03, // 206 - 0x02,0x00,0xF8,0x03,0x02, // 207 - 0x40,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x10,0x01,0xE0, // 208 - 0x00,0x00,0xFA,0x03,0x31,0x00,0x42,0x00,0x81,0x01,0xF8,0x03, // 209 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x09,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 210 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0xF0,0x01, // 211 - 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x0A,0x02,0xF0,0x01, // 212 - 0x00,0x00,0xF0,0x01,0x0A,0x02,0x09,0x02,0x0A,0x02,0x09,0x02,0xF0,0x01, // 213 - 0x00,0x00,0xF0,0x01,0x0A,0x02,0x08,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 214 - 0x10,0x01,0xA0,0x00,0xE0,0x00,0xA0,0x00,0x10,0x01, // 215 - 0x00,0x00,0xF0,0x02,0x08,0x03,0xC8,0x02,0x28,0x02,0x18,0x03,0xE8, // 216 - 0x00,0x00,0xF8,0x01,0x01,0x02,0x02,0x02,0x00,0x02,0xF8,0x01, // 217 - 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x00,0x02,0xF8,0x01, // 218 - 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x02,0x02,0xF8,0x01, // 219 - 0x00,0x00,0xF8,0x01,0x02,0x02,0x00,0x02,0x02,0x02,0xF8,0x01, // 220 - 0x08,0x00,0x10,0x00,0x20,0x00,0xC2,0x03,0x21,0x00,0x10,0x00,0x08, // 221 - 0x00,0x00,0xF8,0x03,0x10,0x01,0x10,0x01,0x10,0x01,0xE0, // 222 - 0x00,0x00,0xF0,0x03,0x08,0x01,0x48,0x02,0xB0,0x02,0x80,0x01, // 223 - 0x00,0x00,0x00,0x03,0xA4,0x02,0xA8,0x02,0xE0,0x03, // 224 - 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE0,0x03, // 225 - 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE8,0x03, // 226 - 0x00,0x00,0x08,0x03,0xA4,0x02,0xA8,0x02,0xE4,0x03, // 227 - 0x00,0x00,0x00,0x03,0xA8,0x02,0xA0,0x02,0xE8,0x03, // 228 - 0x00,0x00,0x00,0x03,0xAE,0x02,0xAA,0x02,0xEE,0x03, // 229 - 0x00,0x00,0x40,0x03,0xA0,0x02,0xA0,0x02,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 230 - 0x00,0x00,0xC0,0x01,0x20,0x16,0x20,0x1A,0x40,0x01, // 231 - 0x00,0x00,0xC0,0x01,0xA4,0x02,0xA8,0x02,0xC0,0x02, // 232 - 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC0,0x02, // 233 - 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC8,0x02, // 234 - 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA0,0x02,0xC8,0x02, // 235 - 0x00,0x00,0xE4,0x03,0x08, // 236 - 0x08,0x00,0xE4,0x03, // 237 - 0x08,0x00,0xE4,0x03,0x08, // 238 - 0x08,0x00,0xE0,0x03,0x08, // 239 - 0x00,0x00,0xC0,0x01,0x28,0x02,0x38,0x02,0xE0,0x01, // 240 - 0x00,0x00,0xE8,0x03,0x24,0x00,0x28,0x00,0xC4,0x03, // 241 - 0x00,0x00,0xC0,0x01,0x24,0x02,0x28,0x02,0xC0,0x01, // 242 - 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC0,0x01, // 243 - 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC8,0x01, // 244 - 0x00,0x00,0xC8,0x01,0x24,0x02,0x28,0x02,0xC4,0x01, // 245 - 0x00,0x00,0xC0,0x01,0x28,0x02,0x20,0x02,0xC8,0x01, // 246 - 0x40,0x00,0x40,0x00,0x50,0x01,0x40,0x00,0x40, // 247 - 0x00,0x00,0xC0,0x02,0xA0,0x03,0x60,0x02,0xA0,0x01, // 248 - 0x00,0x00,0xE0,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 249 - 0x00,0x00,0xE0,0x01,0x08,0x02,0x04,0x02,0xE0,0x03, // 250 - 0x00,0x00,0xE8,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 251 - 0x00,0x00,0xE0,0x01,0x08,0x02,0x00,0x02,0xE8,0x03, // 252 - 0x20,0x00,0xC0,0x09,0x08,0x06,0xC4,0x01,0x20, // 253 - 0x00,0x00,0xF8,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 254 - 0x20,0x00,0xC8,0x09,0x00,0x06,0xC8,0x01,0x20 // 255 -}; - -const uint8_t ArialMT_Plain_16[] PROGMEM = { - 0x10, // Width: 16 - 0x13, // Height: 19 - 0x20, // First Char: 32 - 0xE0, // Numbers of Chars: 224 - - // Jump Table: - 0xFF, 0xFF, 0x00, 0x04, // 32:65535 - 0x00, 0x00, 0x08, 0x04, // 33:0 - 0x00, 0x08, 0x0D, 0x06, // 34:8 - 0x00, 0x15, 0x1A, 0x09, // 35:21 - 0x00, 0x2F, 0x17, 0x09, // 36:47 - 0x00, 0x46, 0x26, 0x0E, // 37:70 - 0x00, 0x6C, 0x1D, 0x0B, // 38:108 - 0x00, 0x89, 0x04, 0x03, // 39:137 - 0x00, 0x8D, 0x0C, 0x05, // 40:141 - 0x00, 0x99, 0x0B, 0x05, // 41:153 - 0x00, 0xA4, 0x0D, 0x06, // 42:164 - 0x00, 0xB1, 0x17, 0x09, // 43:177 - 0x00, 0xC8, 0x09, 0x04, // 44:200 - 0x00, 0xD1, 0x0B, 0x05, // 45:209 - 0x00, 0xDC, 0x08, 0x04, // 46:220 - 0x00, 0xE4, 0x0A, 0x04, // 47:228 - 0x00, 0xEE, 0x17, 0x09, // 48:238 - 0x01, 0x05, 0x11, 0x09, // 49:261 - 0x01, 0x16, 0x17, 0x09, // 50:278 - 0x01, 0x2D, 0x17, 0x09, // 51:301 - 0x01, 0x44, 0x17, 0x09, // 52:324 - 0x01, 0x5B, 0x17, 0x09, // 53:347 - 0x01, 0x72, 0x17, 0x09, // 54:370 - 0x01, 0x89, 0x16, 0x09, // 55:393 - 0x01, 0x9F, 0x17, 0x09, // 56:415 - 0x01, 0xB6, 0x17, 0x09, // 57:438 - 0x01, 0xCD, 0x05, 0x04, // 58:461 - 0x01, 0xD2, 0x06, 0x04, // 59:466 - 0x01, 0xD8, 0x17, 0x09, // 60:472 - 0x01, 0xEF, 0x17, 0x09, // 61:495 - 0x02, 0x06, 0x17, 0x09, // 62:518 - 0x02, 0x1D, 0x16, 0x09, // 63:541 - 0x02, 0x33, 0x2F, 0x10, // 64:563 - 0x02, 0x62, 0x1D, 0x0B, // 65:610 - 0x02, 0x7F, 0x1D, 0x0B, // 66:639 - 0x02, 0x9C, 0x20, 0x0C, // 67:668 - 0x02, 0xBC, 0x20, 0x0C, // 68:700 - 0x02, 0xDC, 0x1D, 0x0B, // 69:732 - 0x02, 0xF9, 0x19, 0x0A, // 70:761 - 0x03, 0x12, 0x20, 0x0C, // 71:786 - 0x03, 0x32, 0x1D, 0x0C, // 72:818 - 0x03, 0x4F, 0x05, 0x04, // 73:847 - 0x03, 0x54, 0x14, 0x08, // 74:852 - 0x03, 0x68, 0x1D, 0x0B, // 75:872 - 0x03, 0x85, 0x17, 0x09, // 76:901 - 0x03, 0x9C, 0x23, 0x0D, // 77:924 - 0x03, 0xBF, 0x1D, 0x0C, // 78:959 - 0x03, 0xDC, 0x20, 0x0C, // 79:988 - 0x03, 0xFC, 0x1C, 0x0B, // 80:1020 - 0x04, 0x18, 0x20, 0x0C, // 81:1048 - 0x04, 0x38, 0x1D, 0x0C, // 82:1080 - 0x04, 0x55, 0x1D, 0x0B, // 83:1109 - 0x04, 0x72, 0x19, 0x0A, // 84:1138 - 0x04, 0x8B, 0x1D, 0x0C, // 85:1163 - 0x04, 0xA8, 0x1C, 0x0B, // 86:1192 - 0x04, 0xC4, 0x2B, 0x0F, // 87:1220 - 0x04, 0xEF, 0x20, 0x0B, // 88:1263 - 0x05, 0x0F, 0x19, 0x0B, // 89:1295 - 0x05, 0x28, 0x1A, 0x0A, // 90:1320 - 0x05, 0x42, 0x0C, 0x04, // 91:1346 - 0x05, 0x4E, 0x0B, 0x04, // 92:1358 - 0x05, 0x59, 0x09, 0x04, // 93:1369 - 0x05, 0x62, 0x14, 0x08, // 94:1378 - 0x05, 0x76, 0x1B, 0x09, // 95:1398 - 0x05, 0x91, 0x07, 0x05, // 96:1425 - 0x05, 0x98, 0x17, 0x09, // 97:1432 - 0x05, 0xAF, 0x17, 0x09, // 98:1455 - 0x05, 0xC6, 0x14, 0x08, // 99:1478 - 0x05, 0xDA, 0x17, 0x09, // 100:1498 - 0x05, 0xF1, 0x17, 0x09, // 101:1521 - 0x06, 0x08, 0x0A, 0x04, // 102:1544 - 0x06, 0x12, 0x17, 0x09, // 103:1554 - 0x06, 0x29, 0x14, 0x09, // 104:1577 - 0x06, 0x3D, 0x05, 0x04, // 105:1597 - 0x06, 0x42, 0x06, 0x04, // 106:1602 - 0x06, 0x48, 0x17, 0x08, // 107:1608 - 0x06, 0x5F, 0x05, 0x04, // 108:1631 - 0x06, 0x64, 0x23, 0x0D, // 109:1636 - 0x06, 0x87, 0x14, 0x09, // 110:1671 - 0x06, 0x9B, 0x17, 0x09, // 111:1691 - 0x06, 0xB2, 0x17, 0x09, // 112:1714 - 0x06, 0xC9, 0x18, 0x09, // 113:1737 - 0x06, 0xE1, 0x0D, 0x05, // 114:1761 - 0x06, 0xEE, 0x14, 0x08, // 115:1774 - 0x07, 0x02, 0x0B, 0x04, // 116:1794 - 0x07, 0x0D, 0x14, 0x09, // 117:1805 - 0x07, 0x21, 0x13, 0x08, // 118:1825 - 0x07, 0x34, 0x1F, 0x0C, // 119:1844 - 0x07, 0x53, 0x14, 0x08, // 120:1875 - 0x07, 0x67, 0x13, 0x08, // 121:1895 - 0x07, 0x7A, 0x14, 0x08, // 122:1914 - 0x07, 0x8E, 0x0F, 0x05, // 123:1934 - 0x07, 0x9D, 0x06, 0x04, // 124:1949 - 0x07, 0xA3, 0x0E, 0x05, // 125:1955 - 0x07, 0xB1, 0x17, 0x09, // 126:1969 - 0xFF, 0xFF, 0x00, 0x00, // 127:65535 - 0xFF, 0xFF, 0x00, 0x10, // 128:65535 - 0xFF, 0xFF, 0x00, 0x10, // 129:65535 - 0xFF, 0xFF, 0x00, 0x10, // 130:65535 - 0xFF, 0xFF, 0x00, 0x10, // 131:65535 - 0xFF, 0xFF, 0x00, 0x10, // 132:65535 - 0xFF, 0xFF, 0x00, 0x10, // 133:65535 - 0xFF, 0xFF, 0x00, 0x10, // 134:65535 - 0xFF, 0xFF, 0x00, 0x10, // 135:65535 - 0xFF, 0xFF, 0x00, 0x10, // 136:65535 - 0xFF, 0xFF, 0x00, 0x10, // 137:65535 - 0xFF, 0xFF, 0x00, 0x10, // 138:65535 - 0xFF, 0xFF, 0x00, 0x10, // 139:65535 - 0xFF, 0xFF, 0x00, 0x10, // 140:65535 - 0xFF, 0xFF, 0x00, 0x10, // 141:65535 - 0xFF, 0xFF, 0x00, 0x10, // 142:65535 - 0xFF, 0xFF, 0x00, 0x10, // 143:65535 - 0xFF, 0xFF, 0x00, 0x10, // 144:65535 - 0xFF, 0xFF, 0x00, 0x10, // 145:65535 - 0xFF, 0xFF, 0x00, 0x10, // 146:65535 - 0xFF, 0xFF, 0x00, 0x10, // 147:65535 - 0xFF, 0xFF, 0x00, 0x10, // 148:65535 - 0xFF, 0xFF, 0x00, 0x10, // 149:65535 - 0xFF, 0xFF, 0x00, 0x10, // 150:65535 - 0xFF, 0xFF, 0x00, 0x10, // 151:65535 - 0xFF, 0xFF, 0x00, 0x10, // 152:65535 - 0xFF, 0xFF, 0x00, 0x10, // 153:65535 - 0xFF, 0xFF, 0x00, 0x10, // 154:65535 - 0xFF, 0xFF, 0x00, 0x10, // 155:65535 - 0xFF, 0xFF, 0x00, 0x10, // 156:65535 - 0xFF, 0xFF, 0x00, 0x10, // 157:65535 - 0xFF, 0xFF, 0x00, 0x10, // 158:65535 - 0xFF, 0xFF, 0x00, 0x10, // 159:65535 - 0xFF, 0xFF, 0x00, 0x04, // 160:65535 - 0x07, 0xC8, 0x09, 0x05, // 161:1992 - 0x07, 0xD1, 0x17, 0x09, // 162:2001 - 0x07, 0xE8, 0x17, 0x09, // 163:2024 - 0x07, 0xFF, 0x14, 0x09, // 164:2047 - 0x08, 0x13, 0x1A, 0x09, // 165:2067 - 0x08, 0x2D, 0x06, 0x04, // 166:2093 - 0x08, 0x33, 0x17, 0x09, // 167:2099 - 0x08, 0x4A, 0x07, 0x05, // 168:2122 - 0x08, 0x51, 0x23, 0x0C, // 169:2129 - 0x08, 0x74, 0x0E, 0x06, // 170:2164 - 0x08, 0x82, 0x14, 0x09, // 171:2178 - 0x08, 0x96, 0x17, 0x09, // 172:2198 - 0x08, 0xAD, 0x0B, 0x05, // 173:2221 - 0x08, 0xB8, 0x23, 0x0C, // 174:2232 - 0x08, 0xDB, 0x19, 0x09, // 175:2267 - 0x08, 0xF4, 0x0D, 0x06, // 176:2292 - 0x09, 0x01, 0x17, 0x09, // 177:2305 - 0x09, 0x18, 0x0E, 0x05, // 178:2328 - 0x09, 0x26, 0x0D, 0x05, // 179:2342 - 0x09, 0x33, 0x0A, 0x05, // 180:2355 - 0x09, 0x3D, 0x17, 0x09, // 181:2365 - 0x09, 0x54, 0x19, 0x09, // 182:2388 - 0x09, 0x6D, 0x08, 0x05, // 183:2413 - 0x09, 0x75, 0x0C, 0x05, // 184:2421 - 0x09, 0x81, 0x0B, 0x05, // 185:2433 - 0x09, 0x8C, 0x0D, 0x06, // 186:2444 - 0x09, 0x99, 0x17, 0x09, // 187:2457 - 0x09, 0xB0, 0x26, 0x0D, // 188:2480 - 0x09, 0xD6, 0x26, 0x0D, // 189:2518 - 0x09, 0xFC, 0x26, 0x0D, // 190:2556 - 0x0A, 0x22, 0x1A, 0x0A, // 191:2594 - 0x0A, 0x3C, 0x1D, 0x0B, // 192:2620 - 0x0A, 0x59, 0x1D, 0x0B, // 193:2649 - 0x0A, 0x76, 0x1D, 0x0B, // 194:2678 - 0x0A, 0x93, 0x1D, 0x0B, // 195:2707 - 0x0A, 0xB0, 0x1D, 0x0B, // 196:2736 - 0x0A, 0xCD, 0x1D, 0x0B, // 197:2765 - 0x0A, 0xEA, 0x2C, 0x10, // 198:2794 - 0x0B, 0x16, 0x20, 0x0C, // 199:2838 - 0x0B, 0x36, 0x1D, 0x0B, // 200:2870 - 0x0B, 0x53, 0x1D, 0x0B, // 201:2899 - 0x0B, 0x70, 0x1D, 0x0B, // 202:2928 - 0x0B, 0x8D, 0x1D, 0x0B, // 203:2957 - 0x0B, 0xAA, 0x05, 0x04, // 204:2986 - 0x0B, 0xAF, 0x07, 0x04, // 205:2991 - 0x0B, 0xB6, 0x0A, 0x04, // 206:2998 - 0x0B, 0xC0, 0x07, 0x04, // 207:3008 - 0x0B, 0xC7, 0x20, 0x0C, // 208:3015 - 0x0B, 0xE7, 0x1D, 0x0C, // 209:3047 - 0x0C, 0x04, 0x20, 0x0C, // 210:3076 - 0x0C, 0x24, 0x20, 0x0C, // 211:3108 - 0x0C, 0x44, 0x20, 0x0C, // 212:3140 - 0x0C, 0x64, 0x20, 0x0C, // 213:3172 - 0x0C, 0x84, 0x20, 0x0C, // 214:3204 - 0x0C, 0xA4, 0x17, 0x09, // 215:3236 - 0x0C, 0xBB, 0x20, 0x0C, // 216:3259 - 0x0C, 0xDB, 0x1D, 0x0C, // 217:3291 - 0x0C, 0xF8, 0x1D, 0x0C, // 218:3320 - 0x0D, 0x15, 0x1D, 0x0C, // 219:3349 - 0x0D, 0x32, 0x1D, 0x0C, // 220:3378 - 0x0D, 0x4F, 0x19, 0x0B, // 221:3407 - 0x0D, 0x68, 0x1D, 0x0B, // 222:3432 - 0x0D, 0x85, 0x17, 0x0A, // 223:3461 - 0x0D, 0x9C, 0x17, 0x09, // 224:3484 - 0x0D, 0xB3, 0x17, 0x09, // 225:3507 - 0x0D, 0xCA, 0x17, 0x09, // 226:3530 - 0x0D, 0xE1, 0x17, 0x09, // 227:3553 - 0x0D, 0xF8, 0x17, 0x09, // 228:3576 - 0x0E, 0x0F, 0x17, 0x09, // 229:3599 - 0x0E, 0x26, 0x29, 0x0E, // 230:3622 - 0x0E, 0x4F, 0x14, 0x08, // 231:3663 - 0x0E, 0x63, 0x17, 0x09, // 232:3683 - 0x0E, 0x7A, 0x17, 0x09, // 233:3706 - 0x0E, 0x91, 0x17, 0x09, // 234:3729 - 0x0E, 0xA8, 0x17, 0x09, // 235:3752 - 0x0E, 0xBF, 0x05, 0x04, // 236:3775 - 0x0E, 0xC4, 0x07, 0x04, // 237:3780 - 0x0E, 0xCB, 0x0A, 0x04, // 238:3787 - 0x0E, 0xD5, 0x07, 0x04, // 239:3797 - 0x0E, 0xDC, 0x17, 0x09, // 240:3804 - 0x0E, 0xF3, 0x14, 0x09, // 241:3827 - 0x0F, 0x07, 0x17, 0x09, // 242:3847 - 0x0F, 0x1E, 0x17, 0x09, // 243:3870 - 0x0F, 0x35, 0x17, 0x09, // 244:3893 - 0x0F, 0x4C, 0x17, 0x09, // 245:3916 - 0x0F, 0x63, 0x17, 0x09, // 246:3939 - 0x0F, 0x7A, 0x17, 0x09, // 247:3962 - 0x0F, 0x91, 0x17, 0x0A, // 248:3985 - 0x0F, 0xA8, 0x14, 0x09, // 249:4008 - 0x0F, 0xBC, 0x14, 0x09, // 250:4028 - 0x0F, 0xD0, 0x14, 0x09, // 251:4048 - 0x0F, 0xE4, 0x14, 0x09, // 252:4068 - 0x0F, 0xF8, 0x13, 0x08, // 253:4088 - 0x10, 0x0B, 0x17, 0x09, // 254:4107 - 0x10, 0x22, 0x13, 0x08, // 255:4130 - - // Font Data: - 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x5F, // 33 - 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, // 34 - 0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08, // 35 - 0x00,0x00,0x00,0xE0,0x10,0x00,0x10,0x21,0x00,0x08,0x41,0x00,0xFC,0xFF,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 36 - 0x00,0x00,0x00,0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x61,0x00,0xF0,0x18,0x00,0x00,0x06,0x00,0xC0,0x01,0x00,0x30,0x3C,0x00,0x08,0x42,0x00,0x00,0x42,0x00,0x00,0x42,0x00,0x00,0x3C, // 37 - 0x00,0x00,0x00,0x00,0x1C,0x00,0x70,0x22,0x00,0x88,0x41,0x00,0x08,0x43,0x00,0x88,0x44,0x00,0x70,0x28,0x00,0x00,0x10,0x00,0x00,0x28,0x00,0x00,0x44, // 38 - 0x00,0x00,0x00,0x78, // 39 - 0x00,0x00,0x00,0x80,0x3F,0x00,0x70,0xC0,0x01,0x08,0x00,0x02, // 40 - 0x00,0x00,0x00,0x08,0x00,0x02,0x70,0xC0,0x01,0x80,0x3F, // 41 - 0x10,0x00,0x00,0xD0,0x00,0x00,0x38,0x00,0x00,0xD0,0x00,0x00,0x10, // 42 - 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xC0,0x1F,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 43 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01, // 44 - 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 45 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, // 46 - 0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 47 - 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xE0,0x1F, // 48 - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0xF8,0x7F, // 49 - 0x00,0x00,0x00,0x20,0x40,0x00,0x10,0x60,0x00,0x08,0x50,0x00,0x08,0x48,0x00,0x08,0x44,0x00,0x10,0x43,0x00,0xE0,0x40, // 50 - 0x00,0x00,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x88,0x41,0x00,0xF0,0x22,0x00,0x00,0x1C, // 51 - 0x00,0x0C,0x00,0x00,0x0A,0x00,0x00,0x09,0x00,0xC0,0x08,0x00,0x20,0x08,0x00,0x10,0x08,0x00,0xF8,0x7F,0x00,0x00,0x08, // 52 - 0x00,0x00,0x00,0xC0,0x11,0x00,0xB8,0x20,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x08,0x21,0x00,0x08,0x1E, // 53 - 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x21,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x10,0x21,0x00,0x20,0x1E, // 54 - 0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x78,0x00,0x08,0x07,0x00,0xC8,0x00,0x00,0x28,0x00,0x00,0x18, // 55 - 0x00,0x00,0x00,0x60,0x1C,0x00,0x90,0x22,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 56 - 0x00,0x00,0x00,0xE0,0x11,0x00,0x10,0x22,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x10,0x22,0x00,0xE0,0x1F, // 57 - 0x00,0x00,0x00,0x40,0x40, // 58 - 0x00,0x00,0x00,0x40,0xC0,0x01, // 59 - 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x40,0x10, // 60 - 0x00,0x00,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08, // 61 - 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x02, // 62 - 0x00,0x00,0x00,0x60,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x08,0x5C,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 63 - 0x00,0x00,0x00,0x00,0x3F,0x00,0xC0,0x40,0x00,0x20,0x80,0x00,0x10,0x1E,0x01,0x10,0x21,0x01,0x88,0x40,0x02,0x48,0x40,0x02,0x48,0x40,0x02,0x48,0x20,0x02,0x88,0x7C,0x02,0xC8,0x43,0x02,0x10,0x40,0x02,0x10,0x20,0x01,0x60,0x10,0x01,0x80,0x8F, // 64 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x08,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 65 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 66 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 67 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 68 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 69 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08, // 70 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x12,0x00,0x00,0x0E, // 71 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0xF8,0x7F, // 72 - 0x00,0x00,0x00,0xF8,0x7F, // 73 - 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0xF8,0x3F, // 74 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x80,0x03,0x00,0x40,0x04,0x00,0x20,0x18,0x00,0x10,0x20,0x00,0x08,0x40, // 75 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40, // 76 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0xF8,0x7F, // 77 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 78 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 79 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 80 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x50,0x00,0x08,0x50,0x00,0x10,0x20,0x00,0x20,0x70,0x00,0xC0,0x4F, // 81 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x06,0x00,0x08,0x1A,0x00,0x10,0x21,0x00,0xE0,0x40, // 82 - 0x00,0x00,0x00,0x60,0x10,0x00,0x90,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 83 - 0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0x7F,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 84 - 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 85 - 0x00,0x00,0x00,0x18,0x00,0x00,0xE0,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0xE0,0x00,0x00,0x18, // 86 - 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x70,0x00,0x00,0x08,0x00,0x00,0x70,0x00,0x00,0x80,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 87 - 0x00,0x40,0x00,0x08,0x20,0x00,0x10,0x10,0x00,0x60,0x0C,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x80,0x02,0x00,0x60,0x0C,0x00,0x10,0x10,0x00,0x08,0x20,0x00,0x00,0x40, // 88 - 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x00,0x7E,0x00,0x80,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 89 - 0x00,0x40,0x00,0x08,0x60,0x00,0x08,0x58,0x00,0x08,0x44,0x00,0x08,0x43,0x00,0x88,0x40,0x00,0x68,0x40,0x00,0x18,0x40,0x00,0x08,0x40, // 90 - 0x00,0x00,0x00,0xF8,0xFF,0x03,0x08,0x00,0x02,0x08,0x00,0x02, // 91 - 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60, // 92 - 0x08,0x00,0x02,0x08,0x00,0x02,0xF8,0xFF,0x03, // 93 - 0x00,0x01,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x01, // 94 - 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 95 - 0x00,0x00,0x00,0x08,0x00,0x00,0x10, // 96 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 97 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 98 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20, // 99 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xF8,0x7F, // 100 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 101 - 0x40,0x00,0x00,0xF0,0x7F,0x00,0x48,0x00,0x00,0x48, // 102 - 0x00,0x00,0x00,0x00,0x1F,0x01,0x80,0x20,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x80,0x20,0x01,0xC0,0xFF, // 103 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 104 - 0x00,0x00,0x00,0xC8,0x7F, // 105 - 0x00,0x00,0x02,0xC8,0xFF,0x01, // 106 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x19,0x00,0x80,0x20,0x00,0x40,0x40, // 107 - 0x00,0x00,0x00,0xF8,0x7F, // 108 - 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 109 - 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 110 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 111 - 0x00,0x00,0x00,0xC0,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 112 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xC0,0xFF,0x03, // 113 - 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40, // 114 - 0x00,0x00,0x00,0x80,0x23,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x38, // 115 - 0x40,0x00,0x00,0xF0,0x7F,0x00,0x40,0x40,0x00,0x40,0x40, // 116 - 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 117 - 0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0, // 118 - 0xC0,0x00,0x00,0x00,0x1F,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1F,0x00,0xC0, // 119 - 0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x40,0x40, // 120 - 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x00,0xE0,0x01,0x00,0x38,0x00,0x00,0x07,0x00,0xC0, // 121 - 0x40,0x40,0x00,0x40,0x60,0x00,0x40,0x58,0x00,0x40,0x44,0x00,0x40,0x43,0x00,0xC0,0x40,0x00,0x40,0x40, // 122 - 0x00,0x04,0x00,0x00,0x04,0x00,0xF0,0xFB,0x01,0x08,0x00,0x02,0x08,0x00,0x02, // 123 - 0x00,0x00,0x00,0xF8,0xFF,0x03, // 124 - 0x08,0x00,0x02,0x08,0x00,0x02,0xF0,0xFB,0x01,0x00,0x04,0x00,0x00,0x04, // 125 - 0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01, // 126 - 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0x03, // 161 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x03,0x40,0xF0,0x00,0x40,0x4E,0x00,0xC0,0x41,0x00,0xB8,0x20,0x00,0x00,0x11, // 162 - 0x00,0x41,0x00,0xE0,0x31,0x00,0x10,0x2F,0x00,0x08,0x21,0x00,0x08,0x21,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x20,0x20, // 163 - 0x00,0x00,0x00,0x40,0x0B,0x00,0x80,0x04,0x00,0x40,0x08,0x00,0x40,0x08,0x00,0x80,0x04,0x00,0x40,0x0B, // 164 - 0x08,0x0A,0x00,0x10,0x0A,0x00,0x60,0x0A,0x00,0x80,0x0B,0x00,0x00,0x7E,0x00,0x80,0x0B,0x00,0x60,0x0A,0x00,0x10,0x0A,0x00,0x08,0x0A, // 165 - 0x00,0x00,0x00,0xF8,0xF1,0x03, // 166 - 0x00,0x86,0x00,0x70,0x09,0x01,0xC8,0x10,0x02,0x88,0x10,0x02,0x08,0x21,0x02,0x08,0x61,0x02,0x30,0xD2,0x01,0x00,0x0C, // 167 - 0x08,0x00,0x00,0x00,0x00,0x00,0x08, // 168 - 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xC8,0x47,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x48,0x44,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 169 - 0xD0,0x00,0x00,0x48,0x01,0x00,0x28,0x01,0x00,0x28,0x01,0x00,0xF0,0x01, // 170 - 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20, // 171 - 0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x0F, // 172 - 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 173 - 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xE8,0x4F,0x00,0x28,0x41,0x00,0x28,0x41,0x00,0x28,0x43,0x00,0x28,0x45,0x00,0xC8,0x48,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 174 - 0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04, // 175 - 0x00,0x00,0x00,0x30,0x00,0x00,0x48,0x00,0x00,0x48,0x00,0x00,0x30, // 176 - 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0xE0,0x4F,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41, // 177 - 0x10,0x01,0x00,0x88,0x01,0x00,0x48,0x01,0x00,0x48,0x01,0x00,0x30,0x01, // 178 - 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x28,0x01,0x00,0xD8, // 179 - 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x08, // 180 - 0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 181 - 0xF0,0x00,0x00,0xF8,0x00,0x00,0xF8,0x01,0x00,0xF8,0x01,0x00,0xF8,0xFF,0x03,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0xFF,0x03,0x08, // 182 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, // 183 - 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x03, // 184 - 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0xF8,0x01, // 185 - 0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0xF0, // 186 - 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04, // 187 - 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x21,0x00,0x00,0x10,0x00,0x00,0x0C,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 188 - 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x31,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x60,0x44,0x00,0x10,0x62,0x00,0x08,0x52,0x00,0x00,0x52,0x00,0x00,0x4C, // 189 - 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x41,0x00,0x28,0x21,0x00,0xD8,0x18,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 190 - 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x10,0x01,0x00,0x08,0x02,0x40,0x07,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0xC0, // 191 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x71,0x04,0x00,0x0A,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 192 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x0A,0x04,0x00,0x71,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 193 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x71,0x04,0x00,0x82,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 194 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x72,0x04,0x00,0x81,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 195 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x08,0x04,0x00,0x72,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 196 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x7E,0x04,0x00,0x0A,0x04,0x00,0x7E,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 197 - 0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x06,0x00,0x80,0x05,0x00,0x60,0x04,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41, // 198 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x02,0x08,0xC0,0x02,0x08,0x40,0x03,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 199 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 200 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 201 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 202 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 203 - 0x01,0x00,0x00,0xFA,0x7F, // 204 - 0x00,0x00,0x00,0xFA,0x7F,0x00,0x01, // 205 - 0x02,0x00,0x00,0xF9,0x7F,0x00,0x01,0x00,0x00,0x02, // 206 - 0x02,0x00,0x00,0xF8,0x7F,0x00,0x02, // 207 - 0x00,0x02,0x00,0xF8,0x7F,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 208 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x82,0x00,0x00,0x01,0x03,0x00,0x02,0x04,0x00,0x01,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 209 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 210 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 211 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 212 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 213 - 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 214 - 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x07,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x40,0x10, // 215 - 0x00,0x00,0x00,0xC0,0x4F,0x00,0x20,0x30,0x00,0x10,0x30,0x00,0x08,0x4C,0x00,0x08,0x42,0x00,0x08,0x41,0x00,0xC8,0x40,0x00,0x30,0x20,0x00,0x30,0x10,0x00,0xC8,0x0F, // 216 - 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 217 - 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 218 - 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 219 - 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 220 - 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x02,0x7E,0x00,0x81,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 221 - 0x00,0x00,0x00,0xF8,0x7F,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 222 - 0x00,0x00,0x00,0xE0,0x7F,0x00,0x10,0x00,0x00,0x08,0x20,0x00,0x88,0x43,0x00,0x70,0x42,0x00,0x00,0x44,0x00,0x00,0x38, // 223 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 224 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 225 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x42,0x00,0x50,0x22,0x00,0x80,0x7F, // 226 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x48,0x22,0x00,0x80,0x7F, // 227 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 228 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x5C,0x44,0x00,0x54,0x44,0x00,0x5C,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 229 - 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x3F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 230 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x02,0x40,0xC0,0x02,0x40,0x40,0x03,0x80,0x20, // 231 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x48,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 232 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 233 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x44,0x00,0x90,0x24,0x00,0x00,0x17, // 234 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 235 - 0x08,0x00,0x00,0xD0,0x7F, // 236 - 0x00,0x00,0x00,0xD0,0x7F,0x00,0x08, // 237 - 0x10,0x00,0x00,0xC8,0x7F,0x00,0x08,0x00,0x00,0x10, // 238 - 0x10,0x00,0x00,0xC0,0x7F,0x00,0x10, // 239 - 0x00,0x00,0x00,0x00,0x1F,0x00,0xA0,0x20,0x00,0x68,0x40,0x00,0x58,0x40,0x00,0x70,0x40,0x00,0xE8,0x20,0x00,0x00,0x1F, // 240 - 0x00,0x00,0x00,0xC0,0x7F,0x00,0x90,0x00,0x00,0x48,0x00,0x00,0x50,0x00,0x00,0x48,0x00,0x00,0x80,0x7F, // 241 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 242 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 243 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x48,0x40,0x00,0x90,0x20,0x00,0x00,0x1F, // 244 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x88,0x20,0x00,0x00,0x1F, // 245 - 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 246 - 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x80,0x0A,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 247 - 0x00,0x00,0x00,0x00,0x5F,0x00,0x80,0x30,0x00,0x40,0x48,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x80,0x21,0x00,0x40,0x1F, // 248 - 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 249 - 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x08,0x20,0x00,0xC0,0x7F, // 250 - 0x00,0x00,0x00,0xC0,0x3F,0x00,0x10,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xC0,0x7F, // 251 - 0x00,0x00,0x00,0xD0,0x3F,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 252 - 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x10,0xE0,0x01,0x08,0x38,0x00,0x00,0x07,0x00,0xC0, // 253 - 0x00,0x00,0x00,0xF8,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 254 - 0xC0,0x01,0x00,0x00,0x06,0x02,0x10,0x38,0x02,0x00,0xE0,0x01,0x10,0x38,0x00,0x00,0x07,0x00,0xC0 // 255 -}; -const uint8_t ArialMT_Plain_24[] PROGMEM = { - 0x18, // Width: 24 - 0x1C, // Height: 28 - 0x20, // First Char: 32 - 0xE0, // Numbers of Chars: 224 - - // Jump Table: - 0xFF, 0xFF, 0x00, 0x07, // 32:65535 - 0x00, 0x00, 0x13, 0x07, // 33:0 - 0x00, 0x13, 0x1A, 0x09, // 34:19 - 0x00, 0x2D, 0x33, 0x0D, // 35:45 - 0x00, 0x60, 0x2F, 0x0D, // 36:96 - 0x00, 0x8F, 0x4F, 0x15, // 37:143 - 0x00, 0xDE, 0x3B, 0x10, // 38:222 - 0x01, 0x19, 0x0A, 0x05, // 39:281 - 0x01, 0x23, 0x1C, 0x08, // 40:291 - 0x01, 0x3F, 0x1B, 0x08, // 41:319 - 0x01, 0x5A, 0x21, 0x09, // 42:346 - 0x01, 0x7B, 0x32, 0x0E, // 43:379 - 0x01, 0xAD, 0x10, 0x07, // 44:429 - 0x01, 0xBD, 0x1B, 0x08, // 45:445 - 0x01, 0xD8, 0x0F, 0x07, // 46:472 - 0x01, 0xE7, 0x19, 0x07, // 47:487 - 0x02, 0x00, 0x2F, 0x0D, // 48:512 - 0x02, 0x2F, 0x23, 0x0D, // 49:559 - 0x02, 0x52, 0x2F, 0x0D, // 50:594 - 0x02, 0x81, 0x2F, 0x0D, // 51:641 - 0x02, 0xB0, 0x2F, 0x0D, // 52:688 - 0x02, 0xDF, 0x2F, 0x0D, // 53:735 - 0x03, 0x0E, 0x2F, 0x0D, // 54:782 - 0x03, 0x3D, 0x2D, 0x0D, // 55:829 - 0x03, 0x6A, 0x2F, 0x0D, // 56:874 - 0x03, 0x99, 0x2F, 0x0D, // 57:921 - 0x03, 0xC8, 0x0F, 0x07, // 58:968 - 0x03, 0xD7, 0x10, 0x07, // 59:983 - 0x03, 0xE7, 0x2F, 0x0E, // 60:999 - 0x04, 0x16, 0x2F, 0x0E, // 61:1046 - 0x04, 0x45, 0x2E, 0x0E, // 62:1093 - 0x04, 0x73, 0x2E, 0x0D, // 63:1139 - 0x04, 0xA1, 0x5B, 0x18, // 64:1185 - 0x04, 0xFC, 0x3B, 0x10, // 65:1276 - 0x05, 0x37, 0x3B, 0x10, // 66:1335 - 0x05, 0x72, 0x3F, 0x11, // 67:1394 - 0x05, 0xB1, 0x3F, 0x11, // 68:1457 - 0x05, 0xF0, 0x3B, 0x10, // 69:1520 - 0x06, 0x2B, 0x35, 0x0F, // 70:1579 - 0x06, 0x60, 0x43, 0x13, // 71:1632 - 0x06, 0xA3, 0x3B, 0x11, // 72:1699 - 0x06, 0xDE, 0x0F, 0x07, // 73:1758 - 0x06, 0xED, 0x27, 0x0C, // 74:1773 - 0x07, 0x14, 0x3F, 0x10, // 75:1812 - 0x07, 0x53, 0x2F, 0x0D, // 76:1875 - 0x07, 0x82, 0x43, 0x14, // 77:1922 - 0x07, 0xC5, 0x3B, 0x11, // 78:1989 - 0x08, 0x00, 0x47, 0x13, // 79:2048 - 0x08, 0x47, 0x3A, 0x10, // 80:2119 - 0x08, 0x81, 0x47, 0x13, // 81:2177 - 0x08, 0xC8, 0x3F, 0x11, // 82:2248 - 0x09, 0x07, 0x3B, 0x10, // 83:2311 - 0x09, 0x42, 0x35, 0x0F, // 84:2370 - 0x09, 0x77, 0x3B, 0x11, // 85:2423 - 0x09, 0xB2, 0x39, 0x10, // 86:2482 - 0x09, 0xEB, 0x59, 0x17, // 87:2539 - 0x0A, 0x44, 0x3B, 0x10, // 88:2628 - 0x0A, 0x7F, 0x3D, 0x10, // 89:2687 - 0x0A, 0xBC, 0x37, 0x0F, // 90:2748 - 0x0A, 0xF3, 0x14, 0x07, // 91:2803 - 0x0B, 0x07, 0x1B, 0x07, // 92:2823 - 0x0B, 0x22, 0x18, 0x07, // 93:2850 - 0x0B, 0x3A, 0x2A, 0x0B, // 94:2874 - 0x0B, 0x64, 0x34, 0x0D, // 95:2916 - 0x0B, 0x98, 0x11, 0x08, // 96:2968 - 0x0B, 0xA9, 0x2F, 0x0D, // 97:2985 - 0x0B, 0xD8, 0x33, 0x0D, // 98:3032 - 0x0C, 0x0B, 0x2B, 0x0C, // 99:3083 - 0x0C, 0x36, 0x2F, 0x0D, // 100:3126 - 0x0C, 0x65, 0x2F, 0x0D, // 101:3173 - 0x0C, 0x94, 0x1A, 0x07, // 102:3220 - 0x0C, 0xAE, 0x2F, 0x0D, // 103:3246 - 0x0C, 0xDD, 0x2F, 0x0D, // 104:3293 - 0x0D, 0x0C, 0x0F, 0x05, // 105:3340 - 0x0D, 0x1B, 0x10, 0x05, // 106:3355 - 0x0D, 0x2B, 0x2F, 0x0C, // 107:3371 - 0x0D, 0x5A, 0x0F, 0x05, // 108:3418 - 0x0D, 0x69, 0x47, 0x14, // 109:3433 - 0x0D, 0xB0, 0x2F, 0x0D, // 110:3504 - 0x0D, 0xDF, 0x2F, 0x0D, // 111:3551 - 0x0E, 0x0E, 0x33, 0x0D, // 112:3598 - 0x0E, 0x41, 0x30, 0x0D, // 113:3649 - 0x0E, 0x71, 0x1E, 0x08, // 114:3697 - 0x0E, 0x8F, 0x2B, 0x0C, // 115:3727 - 0x0E, 0xBA, 0x1B, 0x07, // 116:3770 - 0x0E, 0xD5, 0x2F, 0x0D, // 117:3797 - 0x0F, 0x04, 0x2A, 0x0C, // 118:3844 - 0x0F, 0x2E, 0x42, 0x11, // 119:3886 - 0x0F, 0x70, 0x2B, 0x0C, // 120:3952 - 0x0F, 0x9B, 0x2A, 0x0C, // 121:3995 - 0x0F, 0xC5, 0x2B, 0x0C, // 122:4037 - 0x0F, 0xF0, 0x1C, 0x08, // 123:4080 - 0x10, 0x0C, 0x10, 0x06, // 124:4108 - 0x10, 0x1C, 0x1B, 0x08, // 125:4124 - 0x10, 0x37, 0x32, 0x0E, // 126:4151 - 0xFF, 0xFF, 0x00, 0x00, // 127:65535 - 0xFF, 0xFF, 0x00, 0x18, // 128:65535 - 0xFF, 0xFF, 0x00, 0x18, // 129:65535 - 0xFF, 0xFF, 0x00, 0x18, // 130:65535 - 0xFF, 0xFF, 0x00, 0x18, // 131:65535 - 0xFF, 0xFF, 0x00, 0x18, // 132:65535 - 0xFF, 0xFF, 0x00, 0x18, // 133:65535 - 0xFF, 0xFF, 0x00, 0x18, // 134:65535 - 0xFF, 0xFF, 0x00, 0x18, // 135:65535 - 0xFF, 0xFF, 0x00, 0x18, // 136:65535 - 0xFF, 0xFF, 0x00, 0x18, // 137:65535 - 0xFF, 0xFF, 0x00, 0x18, // 138:65535 - 0xFF, 0xFF, 0x00, 0x18, // 139:65535 - 0xFF, 0xFF, 0x00, 0x18, // 140:65535 - 0xFF, 0xFF, 0x00, 0x18, // 141:65535 - 0xFF, 0xFF, 0x00, 0x18, // 142:65535 - 0xFF, 0xFF, 0x00, 0x18, // 143:65535 - 0xFF, 0xFF, 0x00, 0x18, // 144:65535 - 0xFF, 0xFF, 0x00, 0x18, // 145:65535 - 0xFF, 0xFF, 0x00, 0x18, // 146:65535 - 0xFF, 0xFF, 0x00, 0x18, // 147:65535 - 0xFF, 0xFF, 0x00, 0x18, // 148:65535 - 0xFF, 0xFF, 0x00, 0x18, // 149:65535 - 0xFF, 0xFF, 0x00, 0x18, // 150:65535 - 0xFF, 0xFF, 0x00, 0x18, // 151:65535 - 0xFF, 0xFF, 0x00, 0x18, // 152:65535 - 0xFF, 0xFF, 0x00, 0x18, // 153:65535 - 0xFF, 0xFF, 0x00, 0x18, // 154:65535 - 0xFF, 0xFF, 0x00, 0x18, // 155:65535 - 0xFF, 0xFF, 0x00, 0x18, // 156:65535 - 0xFF, 0xFF, 0x00, 0x18, // 157:65535 - 0xFF, 0xFF, 0x00, 0x18, // 158:65535 - 0xFF, 0xFF, 0x00, 0x18, // 159:65535 - 0xFF, 0xFF, 0x00, 0x07, // 160:65535 - 0x10, 0x69, 0x14, 0x08, // 161:4201 - 0x10, 0x7D, 0x2B, 0x0D, // 162:4221 - 0x10, 0xA8, 0x2F, 0x0D, // 163:4264 - 0x10, 0xD7, 0x33, 0x0D, // 164:4311 - 0x11, 0x0A, 0x31, 0x0D, // 165:4362 - 0x11, 0x3B, 0x10, 0x06, // 166:4411 - 0x11, 0x4B, 0x2F, 0x0D, // 167:4427 - 0x11, 0x7A, 0x19, 0x08, // 168:4474 - 0x11, 0x93, 0x46, 0x12, // 169:4499 - 0x11, 0xD9, 0x1A, 0x09, // 170:4569 - 0x11, 0xF3, 0x27, 0x0D, // 171:4595 - 0x12, 0x1A, 0x2F, 0x0E, // 172:4634 - 0x12, 0x49, 0x1B, 0x08, // 173:4681 - 0x12, 0x64, 0x46, 0x12, // 174:4708 - 0x12, 0xAA, 0x31, 0x0D, // 175:4778 - 0x12, 0xDB, 0x1E, 0x0A, // 176:4827 - 0x12, 0xF9, 0x33, 0x0D, // 177:4857 - 0x13, 0x2C, 0x1A, 0x08, // 178:4908 - 0x13, 0x46, 0x1A, 0x08, // 179:4934 - 0x13, 0x60, 0x19, 0x08, // 180:4960 - 0x13, 0x79, 0x2F, 0x0E, // 181:4985 - 0x13, 0xA8, 0x31, 0x0D, // 182:5032 - 0x13, 0xD9, 0x12, 0x08, // 183:5081 - 0x13, 0xEB, 0x18, 0x08, // 184:5099 - 0x14, 0x03, 0x16, 0x08, // 185:5123 - 0x14, 0x19, 0x1E, 0x09, // 186:5145 - 0x14, 0x37, 0x2E, 0x0D, // 187:5175 - 0x14, 0x65, 0x4F, 0x14, // 188:5221 - 0x14, 0xB4, 0x4B, 0x14, // 189:5300 - 0x14, 0xFF, 0x4B, 0x14, // 190:5375 - 0x15, 0x4A, 0x33, 0x0F, // 191:5450 - 0x15, 0x7D, 0x3B, 0x10, // 192:5501 - 0x15, 0xB8, 0x3B, 0x10, // 193:5560 - 0x15, 0xF3, 0x3B, 0x10, // 194:5619 - 0x16, 0x2E, 0x3B, 0x10, // 195:5678 - 0x16, 0x69, 0x3B, 0x10, // 196:5737 - 0x16, 0xA4, 0x3B, 0x10, // 197:5796 - 0x16, 0xDF, 0x5B, 0x18, // 198:5855 - 0x17, 0x3A, 0x3F, 0x11, // 199:5946 - 0x17, 0x79, 0x3B, 0x10, // 200:6009 - 0x17, 0xB4, 0x3B, 0x10, // 201:6068 - 0x17, 0xEF, 0x3B, 0x10, // 202:6127 - 0x18, 0x2A, 0x3B, 0x10, // 203:6186 - 0x18, 0x65, 0x11, 0x07, // 204:6245 - 0x18, 0x76, 0x11, 0x07, // 205:6262 - 0x18, 0x87, 0x15, 0x07, // 206:6279 - 0x18, 0x9C, 0x15, 0x07, // 207:6300 - 0x18, 0xB1, 0x3F, 0x11, // 208:6321 - 0x18, 0xF0, 0x3B, 0x11, // 209:6384 - 0x19, 0x2B, 0x47, 0x13, // 210:6443 - 0x19, 0x72, 0x47, 0x13, // 211:6514 - 0x19, 0xB9, 0x47, 0x13, // 212:6585 - 0x1A, 0x00, 0x47, 0x13, // 213:6656 - 0x1A, 0x47, 0x47, 0x13, // 214:6727 - 0x1A, 0x8E, 0x2B, 0x0E, // 215:6798 - 0x1A, 0xB9, 0x47, 0x13, // 216:6841 - 0x1B, 0x00, 0x3B, 0x11, // 217:6912 - 0x1B, 0x3B, 0x3B, 0x11, // 218:6971 - 0x1B, 0x76, 0x3B, 0x11, // 219:7030 - 0x1B, 0xB1, 0x3B, 0x11, // 220:7089 - 0x1B, 0xEC, 0x3D, 0x10, // 221:7148 - 0x1C, 0x29, 0x3A, 0x10, // 222:7209 - 0x1C, 0x63, 0x37, 0x0F, // 223:7267 - 0x1C, 0x9A, 0x2F, 0x0D, // 224:7322 - 0x1C, 0xC9, 0x2F, 0x0D, // 225:7369 - 0x1C, 0xF8, 0x2F, 0x0D, // 226:7416 - 0x1D, 0x27, 0x2F, 0x0D, // 227:7463 - 0x1D, 0x56, 0x2F, 0x0D, // 228:7510 - 0x1D, 0x85, 0x2F, 0x0D, // 229:7557 - 0x1D, 0xB4, 0x53, 0x15, // 230:7604 - 0x1E, 0x07, 0x2B, 0x0C, // 231:7687 - 0x1E, 0x32, 0x2F, 0x0D, // 232:7730 - 0x1E, 0x61, 0x2F, 0x0D, // 233:7777 - 0x1E, 0x90, 0x2F, 0x0D, // 234:7824 - 0x1E, 0xBF, 0x2F, 0x0D, // 235:7871 - 0x1E, 0xEE, 0x11, 0x07, // 236:7918 - 0x1E, 0xFF, 0x11, 0x07, // 237:7935 - 0x1F, 0x10, 0x15, 0x07, // 238:7952 - 0x1F, 0x25, 0x15, 0x07, // 239:7973 - 0x1F, 0x3A, 0x2F, 0x0D, // 240:7994 - 0x1F, 0x69, 0x2F, 0x0D, // 241:8041 - 0x1F, 0x98, 0x2F, 0x0D, // 242:8088 - 0x1F, 0xC7, 0x2F, 0x0D, // 243:8135 - 0x1F, 0xF6, 0x2F, 0x0D, // 244:8182 - 0x20, 0x25, 0x2F, 0x0D, // 245:8229 - 0x20, 0x54, 0x2F, 0x0D, // 246:8276 - 0x20, 0x83, 0x32, 0x0D, // 247:8323 - 0x20, 0xB5, 0x33, 0x0F, // 248:8373 - 0x20, 0xE8, 0x2F, 0x0D, // 249:8424 - 0x21, 0x17, 0x2F, 0x0D, // 250:8471 - 0x21, 0x46, 0x2F, 0x0D, // 251:8518 - 0x21, 0x75, 0x2F, 0x0D, // 252:8565 - 0x21, 0xA4, 0x2A, 0x0C, // 253:8612 - 0x21, 0xCE, 0x2F, 0x0D, // 254:8654 - 0x21, 0xFD, 0x2A, 0x0C, // 255:8701 - - // Font Data: - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x33,0x00,0xE0,0xFF,0x33, // 33 - 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 34 - 0x00,0x0C,0x03,0x00,0x00,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x03,0x00,0x00,0x0C,0x03, // 35 - 0x00,0x00,0x00,0x00,0x80,0x07,0x06,0x00,0xC0,0x0F,0x1E,0x00,0xC0,0x18,0x1C,0x00,0x60,0x18,0x38,0x00,0x60,0x30,0x30,0x00,0xF0,0xFF,0xFF,0x00,0x60,0x30,0x30,0x00,0x60,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0xC1,0x1F,0x00,0x00,0x81,0x07, // 36 - 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x00,0x60,0x30,0x38,0x00,0xC0,0x1F,0x1E,0x00,0x80,0x8F,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x8F,0x0F,0x00,0xC0,0xC3,0x1F,0x00,0xE0,0x60,0x30,0x00,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 37 - 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0F,0x00,0x80,0xE3,0x1C,0x00,0xC0,0x77,0x38,0x00,0xE0,0x3C,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x78,0x30,0x00,0xE0,0xEC,0x38,0x00,0xC0,0x8F,0x1B,0x00,0x80,0x03,0x1F,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x10, // 38 - 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 39 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFE,0x7F,0x00,0x80,0x0F,0xF0,0x01,0xC0,0x01,0x80,0x03,0x60,0x00,0x00,0x06,0x20,0x00,0x00,0x04, // 40 - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x04,0x60,0x00,0x00,0x06,0xC0,0x01,0x80,0x03,0x80,0x0F,0xF0,0x01,0x00,0xFE,0x7F,0x00,0x00,0xF0,0x0F, // 41 - 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x04,0x00,0x00,0x80, // 42 - 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 43 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0xF0,0x01, // 44 - 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 45 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 46 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x3F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60, // 47 - 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x01,0x1C,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x03, // 48 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 49 - 0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x00,0xC0,0x03,0x38,0x00,0xC0,0x00,0x3C,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x33,0x00,0x60,0x80,0x31,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x30,0x00,0xC0,0x30,0x30,0x00,0xC0,0x1F,0x30,0x00,0x00,0x0F,0x30, // 50 - 0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0xC0,0x01,0x0E,0x00,0xC0,0x00,0x1C,0x00,0x60,0x00,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x0F,0x00,0x00,0x80,0x07, // 51 - 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x03,0x00,0x00,0x0E,0x03,0x00,0x80,0x07,0x03,0x00,0xC0,0x01,0x03,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 52 - 0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x80,0x3F,0x0E,0x00,0xE0,0x1F,0x18,0x00,0x60,0x08,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x18,0x1C,0x00,0x60,0xF0,0x0F,0x00,0x00,0xE0,0x03, // 53 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x63,0x1C,0x00,0xC0,0x30,0x38,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0xE0,0x30,0x18,0x00,0xC0,0xF1,0x0F,0x00,0x80,0xC1,0x07, // 54 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x3C,0x00,0x60,0x80,0x3F,0x00,0x60,0xE0,0x03,0x00,0x60,0x78,0x00,0x00,0x60,0x0E,0x00,0x00,0x60,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60, // 55 - 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x80,0xC7,0x1F,0x00,0xC0,0x6F,0x18,0x00,0xE0,0x38,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xE0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 56 - 0x00,0x00,0x00,0x00,0x00,0x1F,0x0C,0x00,0x80,0x7F,0x1C,0x00,0xC0,0x61,0x38,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x18,0x00,0xC0,0x31,0x1E,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x01, // 57 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 58 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x03,0x00,0x06,0xF0,0x01, // 59 - 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x03,0x06, // 60 - 0x00,0x00,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01, // 61 - 0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x04,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20, // 62 - 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x33,0x00,0x60,0xE0,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x07, // 63 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xC0,0x01,0x80,0xC3,0x87,0x01,0xC0,0xF1,0x9F,0x03,0xC0,0x38,0x18,0x03,0xC0,0x0C,0x30,0x03,0x60,0x0E,0x30,0x06,0x60,0x06,0x30,0x06,0x60,0x06,0x18,0x06,0x60,0x06,0x0C,0x06,0x60,0x0C,0x1E,0x06,0x60,0xF8,0x3F,0x06,0xE0,0xFE,0x31,0x06,0xC0,0x0E,0x30,0x06,0xC0,0x01,0x18,0x03,0x80,0x03,0x1C,0x03,0x00,0x07,0x8F,0x01,0x00,0xFE,0x87,0x01,0x00,0xF8,0xC1,0x00,0x00,0x00,0x40, // 64 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE0,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 65 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x78,0x30,0x00,0xC0,0xFF,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 66 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 67 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 68 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 69 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60, // 70 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x60,0x30,0x00,0x60,0x60,0x30,0x00,0xE0,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0x61,0x18,0x00,0x80,0xE3,0x0F,0x00,0x00,0xE2,0x0F, // 71 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 72 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 73 - 0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F, // 74 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE7,0x01,0x00,0x80,0x83,0x07,0x00,0xC0,0x01,0x0F,0x00,0xE0,0x00,0x1E,0x00,0x60,0x00,0x38,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 75 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 76 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 77 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 78 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 79 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0xC0,0x30,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x0F, // 80 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x0C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x36,0x00,0xE0,0x00,0x3C,0x00,0xC0,0x00,0x1C,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x3F,0x00,0x00,0xFF,0x77,0x00,0x00,0xFC,0x61, // 81 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x70,0x00,0x00,0x60,0xF0,0x00,0x00,0x60,0xF0,0x03,0x00,0x60,0xB0,0x07,0x00,0xE0,0x18,0x1F,0x00,0xC0,0x1F,0x3C,0x00,0x80,0x0F,0x30,0x00,0x00,0x00,0x20, // 82 - 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x0F,0x00,0xC0,0x1F,0x1C,0x00,0xC0,0x18,0x18,0x00,0x60,0x38,0x38,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x70,0x30,0x00,0xC0,0x60,0x18,0x00,0xC0,0xE1,0x18,0x00,0x80,0xC3,0x0F,0x00,0x00,0x83,0x07, // 83 - 0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 84 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 85 - 0x20,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xF8,0x01,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x20, // 86 - 0x60,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x3F,0x00,0x00,0xF8,0x0F,0x00,0x80,0xFF,0x00,0x00,0xE0,0x07,0x00,0x00,0x60, // 87 - 0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x60,0x00,0x3C,0x00,0xE0,0x01,0x1E,0x00,0xC0,0x83,0x07,0x00,0x00,0xCF,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xCF,0x03,0x00,0xC0,0x03,0x07,0x00,0xE0,0x01,0x1E,0x00,0x60,0x00,0x3C,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 88 - 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 89 - 0x00,0x00,0x30,0x00,0x60,0x00,0x38,0x00,0x60,0x00,0x3C,0x00,0x60,0x00,0x37,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0x60,0x0E,0x30,0x00,0x60,0x07,0x30,0x00,0xE0,0x01,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x30, // 90 - 0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 91 - 0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 92 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07, // 93 - 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x20, // 94 - 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 95 - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80, // 96 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 97 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 98 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 99 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 100 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 101 - 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x06,0x00,0x00,0x60,0x06,0x00,0x00,0x60,0x06, // 102 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x83,0x01,0x00,0xF8,0x8F,0x03,0x00,0x1C,0x1C,0x07,0x00,0x0E,0x38,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x0C,0x18,0x07,0x00,0x18,0x8C,0x03,0x00,0xFE,0xFF,0x01,0x00,0xFE,0xFF, // 103 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 104 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F, // 105 - 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x60,0xFE,0xFF,0x07,0x60,0xFE,0xFF,0x03, // 106 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x98,0x07,0x00,0x00,0x0C,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x02,0x30,0x00,0x00,0x00,0x20, // 107 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 108 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 109 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 110 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 111 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 112 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07, // 113 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 114 - 0x00,0x00,0x00,0x00,0x00,0x38,0x0C,0x00,0x00,0x7C,0x1C,0x00,0x00,0xEE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x31,0x00,0x00,0xC6,0x31,0x00,0x00,0x8E,0x39,0x00,0x00,0x9C,0x1F,0x00,0x00,0x18,0x0F, // 115 - 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 116 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 117 - 0x00,0x06,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 118 - 0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x7C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xF0,0x03,0x00,0x00,0x7E,0x00,0x00,0x00,0x0E, // 119 - 0x00,0x02,0x20,0x00,0x00,0x06,0x30,0x00,0x00,0x1E,0x3C,0x00,0x00,0x38,0x0E,0x00,0x00,0xF0,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x38,0x0E,0x00,0x00,0x1C,0x3C,0x00,0x00,0x0E,0x30,0x00,0x00,0x02,0x20, // 120 - 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 121 - 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x3E,0x00,0x00,0x06,0x37,0x00,0x00,0xC6,0x33,0x00,0x00,0xE6,0x30,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x30,0x00,0x00,0x1E,0x30,0x00,0x00,0x06,0x30, // 122 - 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x03,0x00,0xC0,0x7F,0xFE,0x03,0xE0,0x3F,0xFC,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 123 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0xE0,0xFF,0xFF,0x0F, // 124 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0x3F,0xFC,0x07,0xC0,0x7F,0xFF,0x03,0x00,0xC0,0x03,0x00,0x00,0x80,0x01, // 125 - 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60, // 126 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0x07,0x00,0xE6,0xFF,0x07, // 161 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x9C,0x07,0x00,0x0E,0x78,0x00,0x00,0x06,0x3F,0x00,0x00,0xF6,0x30,0x00,0x00,0x0E,0x30,0x00,0xE0,0x0D,0x1C,0x00,0x00,0x1C,0x0E,0x00,0x00,0x10,0x06, // 162 - 0x00,0x60,0x10,0x00,0x00,0x60,0x38,0x00,0x00,0x7F,0x1C,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xE0,0x19,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x30,0x00,0xE0,0x00,0x30,0x00,0xC0,0x01,0x30,0x00,0x80,0x01,0x38,0x00,0x00,0x00,0x10, // 163 - 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0xF7,0x0E,0x00,0x00,0xFE,0x07,0x00,0x00,0x0C,0x03,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x0C,0x03,0x00,0x00,0xFE,0x07,0x00,0x00,0xF7,0x0E,0x00,0x00,0x02,0x04, // 164 - 0xE0,0x60,0x06,0x00,0xC0,0x61,0x06,0x00,0x80,0x67,0x06,0x00,0x00,0x7E,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x7C,0x06,0x00,0x00,0x7E,0x06,0x00,0x80,0x67,0x06,0x00,0xC0,0x61,0x06,0x00,0xE0,0x60,0x06,0x00,0x20, // 165 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0xF8,0x0F,0xE0,0x7F,0xF8,0x0F, // 166 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x80,0xF3,0xC1,0x00,0xC0,0x1F,0xC3,0x03,0xE0,0x0C,0x07,0x03,0x60,0x1C,0x06,0x06,0x60,0x18,0x0C,0x06,0x60,0x30,0x1C,0x06,0xE0,0x70,0x38,0x07,0xC0,0xE1,0xF4,0x03,0x80,0xC1,0xE7,0x01,0x00,0x80,0x03, // 167 - 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 168 - 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x79,0x1C,0x00,0xC0,0xFE,0x19,0x00,0x60,0x86,0x31,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x87,0x33,0x00,0xC0,0x86,0x19,0x00,0xC0,0x85,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 169 - 0x00,0x00,0x00,0x00,0xC0,0x1C,0x00,0x00,0xE0,0x3E,0x00,0x00,0x60,0x32,0x00,0x00,0x60,0x32,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x3F, // 170 - 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x84,0x10,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x04,0x10, // 171 - 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFC,0x01, // 172 - 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 173 - 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x01,0x1C,0x00,0xC0,0xFE,0x1B,0x00,0x60,0xFE,0x33,0x00,0x60,0x66,0x30,0x00,0x60,0x66,0x30,0x00,0x60,0xE6,0x30,0x00,0x60,0xFE,0x31,0x00,0x60,0x3C,0x33,0x00,0xC0,0x00,0x1A,0x00,0xC0,0x01,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 174 - 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 175 - 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x40,0x04,0x00,0x00,0x80,0x03, // 176 - 0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30, // 177 - 0x40,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x38,0x00,0x00,0x20,0x2C,0x00,0x00,0x20,0x26,0x00,0x00,0xE0,0x23,0x00,0x00,0xC0,0x21, // 178 - 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0xE0,0x3D,0x00,0x00,0xC0,0x1D, // 179 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 180 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 181 - 0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60, // 182 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 183 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0xC0,0x02,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x01, // 184 - 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F, // 185 - 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x38,0x00,0x00,0x60,0x30,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 186 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x84,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x80, // 187 - 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x38,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x0C,0x00,0xC0,0x01,0x0E,0x00,0xE0,0x80,0x0B,0x00,0x60,0xC0,0x08,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x08, // 188 - 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x30,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x4E,0x20,0x00,0x00,0x67,0x30,0x00,0xC0,0x21,0x38,0x00,0xE0,0x20,0x2C,0x00,0x60,0x20,0x26,0x00,0x00,0xE0,0x27,0x00,0x00,0xC0,0x21, // 189 - 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x20,0x00,0x20,0x22,0x30,0x00,0xE0,0x3D,0x38,0x00,0xC0,0x1D,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x0C,0x00,0x00,0x07,0x0E,0x00,0x80,0x83,0x0B,0x00,0xE0,0xC0,0x08,0x00,0x60,0xE0,0x3F,0x00,0x20,0xE0,0x3F,0x00,0x00,0x00,0x08, // 190 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x1E,0x03,0x00,0x00,0x07,0x07,0x00,0xE6,0x03,0x06,0x00,0xE6,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0, // 191 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x82,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE8,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 192 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE8,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x82,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 193 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x88,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x08,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 194 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x0C,0xFE,0x01,0x00,0x8E,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xEC,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0E,0xFE,0x01,0x00,0x06,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 195 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x8C,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0C,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 196 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x9C,0x8F,0x01,0x00,0xE2,0x83,0x01,0x00,0x62,0x80,0x01,0x00,0xE2,0x83,0x01,0x00,0x9C,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 197 - 0x00,0x00,0x30,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x01,0x00,0x00,0xBC,0x01,0x00,0x00,0x8F,0x01,0x00,0xC0,0x83,0x01,0x00,0xE0,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 198 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x02,0x60,0x00,0x30,0x02,0x60,0x00,0xF0,0x02,0x60,0x00,0xB0,0x03,0x60,0x00,0x30,0x01,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 199 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 200 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 201 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 202 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 203 - 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xEE,0xFF,0x3F,0x00,0x08, // 204 - 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xEE,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x02, // 205 - 0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x08, // 206 - 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x0C, // 207 - 0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 208 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x8C,0x03,0x00,0x00,0x0E,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x70,0x00,0x00,0x0C,0xE0,0x01,0x00,0x0C,0x80,0x03,0x00,0x0E,0x00,0x0F,0x00,0x06,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 209 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x62,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 210 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x62,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 211 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x68,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xE8,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 212 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xCC,0x00,0x18,0x00,0xEE,0x00,0x38,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0xE6,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 213 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xEC,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 214 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x8E,0x03,0x00,0x00,0xDC,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xDC,0x01,0x00,0x00,0x8E,0x03,0x00,0x00,0x06,0x03, // 215 - 0x00,0x00,0x00,0x00,0x00,0xFC,0x21,0x00,0x00,0xFF,0x77,0x00,0x80,0x07,0x3F,0x00,0xC0,0x01,0x1E,0x00,0xC0,0x00,0x1F,0x00,0xE0,0x80,0x3B,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x70,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0xE0,0x0E,0x38,0x00,0xC0,0x07,0x18,0x00,0xC0,0x03,0x1C,0x00,0xE0,0x07,0x0F,0x00,0x70,0xFF,0x07,0x00,0x20,0xFC,0x01, // 216 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x02,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 217 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 218 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x08,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x08,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 219 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 220 - 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x08,0xF0,0x3F,0x00,0x0E,0xF0,0x3F,0x00,0x06,0x3C,0x00,0x00,0x02,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 221 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x07,0x00,0x00,0x86,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0xF8, // 222 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x08,0x00,0x60,0x00,0x1C,0x00,0x60,0x00,0x38,0x00,0xE0,0x78,0x30,0x00,0xC0,0x7F,0x30,0x00,0x80,0xC7,0x30,0x00,0x00,0x80,0x39,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x0F, // 223 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x20,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 224 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x80,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x18,0x00,0x20,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 225 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x80,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0x60,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0x80,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 226 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0xC0,0x1C,0x1F,0x00,0xE0,0x8C,0x39,0x00,0x60,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xC0,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xE0,0xCE,0x0C,0x00,0x60,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 227 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0xC0,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xC0,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 228 - 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x70,0x86,0x31,0x00,0x88,0x86,0x31,0x00,0x88,0xC6,0x30,0x00,0x88,0xC6,0x18,0x00,0x70,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 229 - 0x00,0x00,0x00,0x00,0x00,0x10,0x0F,0x00,0x00,0x9C,0x1F,0x00,0x00,0xCC,0x39,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0x66,0x18,0x00,0x00,0x6E,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xCC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xE0,0x04, // 230 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x02,0x00,0x06,0x30,0x02,0x00,0x06,0xF0,0x02,0x00,0x06,0xB0,0x03,0x00,0x0E,0x38,0x01,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 231 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x20,0xCE,0x38,0x00,0x60,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 232 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x80,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x20,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 233 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x80,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0x80,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 234 - 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 235 - 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0xE0,0xFE,0x3F,0x00,0x80, // 236 - 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0x20, // 237 - 0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0x80, // 238 - 0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0xC0, // 239 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1D,0x1C,0x00,0xA0,0x0F,0x38,0x00,0xA0,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0F,0x38,0x00,0x20,0x1F,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xE0,0x07, // 240 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0xC0,0xFE,0x3F,0x00,0xE0,0x18,0x00,0x00,0x60,0x0C,0x00,0x00,0x60,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xE0,0x0E,0x00,0x00,0x60,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 241 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x20,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x80,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 242 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x80,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x20,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 243 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x80,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0x80,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 244 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0xC0,0x1C,0x1C,0x00,0xE0,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xE0,0x1C,0x1C,0x00,0x60,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 245 - 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 246 - 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xB6,0x01,0x00,0x00,0xB6,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 247 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x67,0x00,0x00,0xF8,0x7F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x3F,0x00,0x00,0x86,0x33,0x00,0x00,0xE6,0x31,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xFF,0x0F,0x00,0x00,0xF3,0x07, // 248 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x20,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 249 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x18,0x00,0x20,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 250 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x80,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0x80,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 251 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0xC0,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 252 - 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x80,0x00,0xFE,0x03,0xE0,0x00,0xFC,0x00,0x60,0xC0,0x1F,0x00,0x20,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 253 - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x00,0x1C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x03, // 254 - 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0xC0,0xF0,0x01,0x06,0xC0,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0xC0,0xC0,0x1F,0x00,0xC0,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06 // 255 -}; -#endif diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp deleted file mode 100644 index cd371a0..0000000 --- a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp +++ /dev/null @@ -1,422 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#include "OLEDDisplayUi.h" - -OLEDDisplayUi::OLEDDisplayUi(OLEDDisplay *display) { - this->display = display; -} - -void OLEDDisplayUi::init() { - this->display->init(); -} - -void OLEDDisplayUi::setTargetFPS(uint8_t fps){ - float oldInterval = this->updateInterval; - this->updateInterval = ((float) 1.0 / (float) fps) * 1000; - - // Calculate new ticksPerFrame - float changeRatio = oldInterval / (float) this->updateInterval; - this->ticksPerFrame *= changeRatio; - this->ticksPerTransition *= changeRatio; -} - -// -/------ Automatic controll ------\- - -void OLEDDisplayUi::enableAutoTransition(){ - this->autoTransition = true; -} -void OLEDDisplayUi::disableAutoTransition(){ - this->autoTransition = false; -} -void OLEDDisplayUi::setAutoTransitionForwards(){ - this->state.frameTransitionDirection = 1; - this->lastTransitionDirection = 1; -} -void OLEDDisplayUi::setAutoTransitionBackwards(){ - this->state.frameTransitionDirection = -1; - this->lastTransitionDirection = -1; -} -void OLEDDisplayUi::setTimePerFrame(uint16_t time){ - this->ticksPerFrame = (uint16_t) ( (float) time / (float) updateInterval); -} -void OLEDDisplayUi::setTimePerTransition(uint16_t time){ - this->ticksPerTransition = (uint16_t) ( (float) time / (float) updateInterval); -} - -// -/------ Customize indicator position and style -------\- -void OLEDDisplayUi::enableIndicator(){ - this->state.isIndicatorDrawen = true; -} - -void OLEDDisplayUi::disableIndicator(){ - this->state.isIndicatorDrawen = false; -} - -void OLEDDisplayUi::enableAllIndicators(){ - this->shouldDrawIndicators = true; -} - -void OLEDDisplayUi::disableAllIndicators(){ - this->shouldDrawIndicators = false; -} - -void OLEDDisplayUi::setIndicatorPosition(IndicatorPosition pos) { - this->indicatorPosition = pos; -} -void OLEDDisplayUi::setIndicatorDirection(IndicatorDirection dir) { - this->indicatorDirection = dir; -} -void OLEDDisplayUi::setActiveSymbol(const uint8_t* symbol) { - this->activeSymbol = symbol; -} -void OLEDDisplayUi::setInactiveSymbol(const uint8_t* symbol) { - this->inactiveSymbol = symbol; -} - - -// -/----- Frame settings -----\- -void OLEDDisplayUi::setFrameAnimation(AnimationDirection dir) { - this->frameAnimationDirection = dir; -} -void OLEDDisplayUi::setFrames(FrameCallback* frameFunctions, uint8_t frameCount) { - this->frameFunctions = frameFunctions; - this->frameCount = frameCount; - this->resetState(); -} - -// -/----- Overlays ------\- -void OLEDDisplayUi::setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount){ - this->overlayFunctions = overlayFunctions; - this->overlayCount = overlayCount; -} - -// -/----- Loading Process -----\- - -void OLEDDisplayUi::setLoadingDrawFunction(LoadingDrawFunction loadingDrawFunction) { - this->loadingDrawFunction = loadingDrawFunction; -} - -void OLEDDisplayUi::runLoadingProcess(LoadingStage* stages, uint8_t stagesCount) { - uint8_t progress = 0; - uint8_t increment = 100 / stagesCount; - - for (uint8_t i = 0; i < stagesCount; i++) { - display->clear(); - this->loadingDrawFunction(this->display, &stages[i], progress); - display->display(); - - stages[i].callback(); - - progress += increment; - yield(); - } - - display->clear(); - this->loadingDrawFunction(this->display, &stages[stagesCount-1], progress); - display->display(); - - delay(150); -} - -// -/----- Manuel control -----\- -void OLEDDisplayUi::nextFrame() { - if (this->state.frameState != IN_TRANSITION) { - this->state.manuelControll = true; - this->state.frameState = IN_TRANSITION; - this->state.ticksSinceLastStateSwitch = 0; - this->lastTransitionDirection = this->state.frameTransitionDirection; - this->state.frameTransitionDirection = 1; - } -} -void OLEDDisplayUi::previousFrame() { - if (this->state.frameState != IN_TRANSITION) { - this->state.manuelControll = true; - this->state.frameState = IN_TRANSITION; - this->state.ticksSinceLastStateSwitch = 0; - this->lastTransitionDirection = this->state.frameTransitionDirection; - this->state.frameTransitionDirection = -1; - } -} - -void OLEDDisplayUi::switchToFrame(uint8_t frame) { - if (frame >= this->frameCount) return; - this->state.ticksSinceLastStateSwitch = 0; - if (frame == this->state.currentFrame) return; - this->state.frameState = FIXED; - this->state.currentFrame = frame; - this->state.isIndicatorDrawen = true; -} - -void OLEDDisplayUi::transitionToFrame(uint8_t frame) { - if (frame >= this->frameCount) return; - this->state.ticksSinceLastStateSwitch = 0; - if (frame == this->state.currentFrame) return; - this->nextFrameNumber = frame; - this->lastTransitionDirection = this->state.frameTransitionDirection; - this->state.manuelControll = true; - this->state.frameState = IN_TRANSITION; - this->state.frameTransitionDirection = frame < this->state.currentFrame ? -1 : 1; -} - - -// -/----- State information -----\- -OLEDDisplayUiState* OLEDDisplayUi::getUiState(){ - return &this->state; -} - - -int8_t OLEDDisplayUi::update(){ - unsigned long frameStart = millis(); - int8_t timeBudget = this->updateInterval - (frameStart - this->state.lastUpdate); - if ( timeBudget <= 0) { - // Implement frame skipping to ensure time budget is keept - if (this->autoTransition && this->state.lastUpdate != 0) this->state.ticksSinceLastStateSwitch += ceil(-timeBudget / this->updateInterval); - - this->state.lastUpdate = frameStart; - this->tick(); - } - return this->updateInterval - (millis() - frameStart); -} - - -void OLEDDisplayUi::tick() { - this->state.ticksSinceLastStateSwitch++; - - switch (this->state.frameState) { - case IN_TRANSITION: - if (this->state.ticksSinceLastStateSwitch >= this->ticksPerTransition){ - this->state.frameState = FIXED; - this->state.currentFrame = getNextFrameNumber(); - this->state.ticksSinceLastStateSwitch = 0; - this->nextFrameNumber = -1; - } - break; - case FIXED: - // Revert manuelControll - if (this->state.manuelControll) { - this->state.frameTransitionDirection = this->lastTransitionDirection; - this->state.manuelControll = false; - } - if (this->state.ticksSinceLastStateSwitch >= this->ticksPerFrame){ - if (this->autoTransition){ - this->state.frameState = IN_TRANSITION; - } - this->state.ticksSinceLastStateSwitch = 0; - } - break; - } - - this->display->clear(); - this->drawFrame(); - if (shouldDrawIndicators) { - this->drawIndicator(); - } - this->drawOverlays(); - this->display->display(); -} - -void OLEDDisplayUi::resetState() { - this->state.lastUpdate = 0; - this->state.ticksSinceLastStateSwitch = 0; - this->state.frameState = FIXED; - this->state.currentFrame = 0; - this->state.isIndicatorDrawen = true; -} - -void OLEDDisplayUi::drawFrame(){ - switch (this->state.frameState){ - case IN_TRANSITION: { - float progress = (float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition; - int16_t x = 0, y = 0, x1 = 0, y1 = 0; - switch(this->frameAnimationDirection){ - case SLIDE_LEFT: - x = -this->display->width() * progress; - y = 0; - x1 = x + this->display->width(); - y1 = 0; - break; - case SLIDE_RIGHT: - x = this->display->width() * progress; - y = 0; - x1 = x - this->display->width(); - y1 = 0; - break; - case SLIDE_UP: - x = 0; - y = -this->display->height() * progress; - x1 = 0; - y1 = y + this->display->height(); - break; - case SLIDE_DOWN: - default: - x = 0; - y = this->display->height() * progress; - x1 = 0; - y1 = y - this->display->height(); - break; - } - - // Invert animation if direction is reversed. - int8_t dir = this->state.frameTransitionDirection >= 0 ? 1 : -1; - x *= dir; y *= dir; x1 *= dir; y1 *= dir; - - bool drawenCurrentFrame; - - - // Prope each frameFunction for the indicator Drawen state - this->enableIndicator(); - (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, x, y); - drawenCurrentFrame = this->state.isIndicatorDrawen; - - this->enableIndicator(); - (this->frameFunctions[this->getNextFrameNumber()])(this->display, &this->state, x1, y1); - - // Build up the indicatorDrawState - if (drawenCurrentFrame && !this->state.isIndicatorDrawen) { - // Drawen now but not next - this->indicatorDrawState = 2; - } else if (!drawenCurrentFrame && this->state.isIndicatorDrawen) { - // Not drawen now but next - this->indicatorDrawState = 1; - } else if (!drawenCurrentFrame && !this->state.isIndicatorDrawen) { - // Not drawen in both frames - this->indicatorDrawState = 3; - } - - // If the indicator isn't draw in the current frame - // reflect it in state.isIndicatorDrawen - if (!drawenCurrentFrame) this->state.isIndicatorDrawen = false; - - break; - } - case FIXED: - // Always assume that the indicator is drawn! - // And set indicatorDrawState to "not known yet" - this->indicatorDrawState = 0; - this->enableIndicator(); - (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, 0, 0); - break; - } -} - -void OLEDDisplayUi::drawIndicator() { - - // Only draw if the indicator is invisible - // for both frames or - // the indiactor is shown and we are IN_TRANSITION - if (this->indicatorDrawState == 3 || (!this->state.isIndicatorDrawen && this->state.frameState != IN_TRANSITION)) { - return; - } - - uint8_t posOfHighlightFrame = 0; - float indicatorFadeProgress = 0; - - // if the indicator needs to be slided in we want to - // highlight the next frame in the transition - uint8_t frameToHighlight = this->indicatorDrawState == 1 ? this->getNextFrameNumber() : this->state.currentFrame; - - // Calculate the frame that needs to be highlighted - // based on the Direction the indiactor is drawn - switch (this->indicatorDirection){ - case LEFT_RIGHT: - posOfHighlightFrame = frameToHighlight; - break; - case RIGHT_LEFT: - default: - posOfHighlightFrame = this->frameCount - frameToHighlight; - break; - } - - switch (this->indicatorDrawState) { - case 1: // Indicator was not drawn in this frame but will be in next - // Slide IN - indicatorFadeProgress = 1 - ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition); - break; - case 2: // Indicator was drawn in this frame but not in next - // Slide OUT - indicatorFadeProgress = ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition); - break; - } - - //Space between indicators - reduce for small screen sizes - uint16_t indicatorSpacing = 12; - if (this->display->getHeight() < 64 && (this->indicatorPosition == RIGHT || this->indicatorPosition == LEFT)) { - indicatorSpacing = 6; - } - - uint16_t frameStartPos = (indicatorSpacing * frameCount / 2); - const uint8_t *image; - - uint16_t x = 0,y = 0; - - - for (byte i = 0; i < this->frameCount; i++) { - - switch (this->indicatorPosition){ - case TOP: - y = 0 - (8 * indicatorFadeProgress); - x = (this->display->width() / 2) - frameStartPos + 12 * i; - break; - case BOTTOM: - y = (this->display->height() - 8) + (8 * indicatorFadeProgress); - x = (this->display->width() / 2) - frameStartPos + 12 * i; - break; - case RIGHT: - x = (this->display->width() - 8) + (8 * indicatorFadeProgress); - y = (this->display->height() / 2) - frameStartPos + 2 + 12 * i; - break; - case LEFT: - default: - x = 0 - (8 * indicatorFadeProgress); - y = (this->display->height() / 2) - frameStartPos + 2 + indicatorSpacing * i; - break; - } - - if (posOfHighlightFrame == i) { - image = this->activeSymbol; - } else { - image = this->inactiveSymbol; - } - - this->display->drawFastImage(x, y, 8, 8, image); - } -} - -void OLEDDisplayUi::drawOverlays() { - for (uint8_t i=0;ioverlayCount;i++){ - (this->overlayFunctions[i])(this->display, &this->state); - } -} - -uint8_t OLEDDisplayUi::getNextFrameNumber(){ - if (this->nextFrameNumber != -1) return this->nextFrameNumber; - return (this->state.currentFrame + this->frameCount + this->state.frameTransitionDirection) % this->frameCount; -} diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h deleted file mode 100644 index 2cabf30..0000000 --- a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h +++ /dev/null @@ -1,309 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef OLEDDISPLAYUI_h -#define OLEDDISPLAYUI_h - -#include -#include "OLEDDisplay.h" - -//#define DEBUG_OLEDDISPLAYUI(...) Serial.printf( __VA_ARGS__ ) - -#ifndef DEBUG_OLEDDISPLAYUI -#define DEBUG_OLEDDISPLAYUI(...) -#endif - -enum AnimationDirection { - SLIDE_UP, - SLIDE_DOWN, - SLIDE_LEFT, - SLIDE_RIGHT -}; - -enum IndicatorPosition { - TOP, - RIGHT, - BOTTOM, - LEFT -}; - -enum IndicatorDirection { - LEFT_RIGHT, - RIGHT_LEFT -}; - -enum FrameState { - IN_TRANSITION, - FIXED -}; - - -const uint8_t ANIMATION_activeSymbol[] PROGMEM = { - 0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00 -}; - -const uint8_t ANIMATION_inactiveSymbol[] PROGMEM = { - 0x00, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x00 -}; - - -// Structure of the UiState -struct OLEDDisplayUiState { - uint64_t lastUpdate = 0; - uint16_t ticksSinceLastStateSwitch = 0; - - FrameState frameState = FIXED; - uint8_t currentFrame = 0; - - bool isIndicatorDrawen = true; - - // Normal = 1, Inverse = -1; - int8_t frameTransitionDirection = 1; - - bool manuelControll = false; - - // Custom data that can be used by the user - void* userData = NULL; -}; - -struct LoadingStage { - const char* process; - void (*callback)(); -}; - -typedef void (*FrameCallback)(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); -typedef void (*OverlayCallback)(OLEDDisplay *display, OLEDDisplayUiState* state); -typedef void (*LoadingDrawFunction)(OLEDDisplay *display, LoadingStage* stage, uint8_t progress); - -class OLEDDisplayUi { - private: - OLEDDisplay *display; - - // Symbols for the Indicator - IndicatorPosition indicatorPosition = BOTTOM; - IndicatorDirection indicatorDirection = LEFT_RIGHT; - - const uint8_t* activeSymbol = ANIMATION_activeSymbol; - const uint8_t* inactiveSymbol = ANIMATION_inactiveSymbol; - - bool shouldDrawIndicators = true; - - // Values for the Frames - AnimationDirection frameAnimationDirection = SLIDE_RIGHT; - - int8_t lastTransitionDirection = 1; - - uint16_t ticksPerFrame = 151; // ~ 5000ms at 30 FPS - uint16_t ticksPerTransition = 15; // ~ 500ms at 30 FPS - - bool autoTransition = true; - - FrameCallback* frameFunctions; - uint8_t frameCount = 0; - - // Internally used to transition to a specific frame - int8_t nextFrameNumber = -1; - - // Values for Overlays - OverlayCallback* overlayFunctions; - uint8_t overlayCount = 0; - - // Will the Indicator be drawen - // 3 Not drawn in both frames - // 2 Drawn this frame but not next - // 1 Not drown this frame but next - // 0 Not known yet - uint8_t indicatorDrawState = 1; - - // Loading screen - LoadingDrawFunction loadingDrawFunction = [](OLEDDisplay *display, LoadingStage* stage, uint8_t progress) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_10); - display->drawString(64, 18, stage->process); - display->drawProgressBar(4, 32, 120, 8, progress); - }; - - // UI State - OLEDDisplayUiState state; - - // Bookeeping for update - uint8_t updateInterval = 33; - - uint8_t getNextFrameNumber(); - void drawIndicator(); - void drawFrame(); - void drawOverlays(); - void tick(); - void resetState(); - - public: - - OLEDDisplayUi(OLEDDisplay *display); - - /** - * Initialise the display - */ - void init(); - - /** - * Configure the internal used target FPS - */ - void setTargetFPS(uint8_t fps); - - // Automatic Controll - /** - * Enable automatic transition to next frame after the some time can be configured with `setTimePerFrame` and `setTimePerTransition`. - */ - void enableAutoTransition(); - - /** - * Disable automatic transition to next frame. - */ - void disableAutoTransition(); - - /** - * Set the direction if the automatic transitioning - */ - void setAutoTransitionForwards(); - void setAutoTransitionBackwards(); - - /** - * Set the approx. time a frame is displayed - */ - void setTimePerFrame(uint16_t time); - - /** - * Set the approx. time a transition will take - */ - void setTimePerTransition(uint16_t time); - - // Customize indicator position and style - - /** - * Draw the indicator. - * This is the defaut state for all frames if - * the indicator was hidden on the previous frame - * it will be slided in. - */ - void enableIndicator(); - - /** - * Don't draw the indicator. - * This will slide out the indicator - * when transitioning to the next frame. - */ - void disableIndicator(); - - /** - * Enable drawing of indicators - */ - void enableAllIndicators(); - - /** - * Disable draw of indicators. - */ - void disableAllIndicators(); - - /** - * Set the position of the indicator bar. - */ - void setIndicatorPosition(IndicatorPosition pos); - - /** - * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING - */ - void setIndicatorDirection(IndicatorDirection dir); - - /** - * Set the symbol to indicate an active frame in the indicator bar. - */ - void setActiveSymbol(const uint8_t* symbol); - - /** - * Set the symbol to indicate an inactive frame in the indicator bar. - */ - void setInactiveSymbol(const uint8_t* symbol); - - - // Frame settings - - /** - * Configure what animation is used to transition from one frame to another - */ - void setFrameAnimation(AnimationDirection dir); - - /** - * Add frame drawing functions - */ - void setFrames(FrameCallback* frameFunctions, uint8_t frameCount); - - // Overlay - - /** - * Add overlays drawing functions that are draw independent of the Frames - */ - void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount); - - - // Loading animation - /** - * Set the function that will draw each step - * in the loading animation - */ - void setLoadingDrawFunction(LoadingDrawFunction loadingFunction); - - - /** - * Run the loading process - */ - void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount); - - - // Manual Control - void nextFrame(); - void previousFrame(); - - /** - * Switch without transition to frame `frame`. - */ - void switchToFrame(uint8_t frame); - - /** - * Transition to frame `frame`, when the `frame` number is bigger than the current - * frame the forward animation will be used, otherwise the backwards animation is used. - */ - void transitionToFrame(uint8_t frame); - - // State Info - OLEDDisplayUiState* getUiState(); - - int8_t update(); -}; -#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106.h b/printermonitor/libs/OledDisplay/src/SH1106.h deleted file mode 100644 index 47188d1..0000000 --- a/printermonitor/libs/OledDisplay/src/SH1106.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef SH1106_h -#define SH1106_h -#include "SH1106Wire.h" - -// For make SH1106 an alias for SH1106Wire -typedef SH1106Wire SH1106; - - -#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106Brzo.h b/printermonitor/libs/OledDisplay/src/SH1106Brzo.h deleted file mode 100644 index 8ef3d5b..0000000 --- a/printermonitor/libs/OledDisplay/src/SH1106Brzo.h +++ /dev/null @@ -1,138 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef SH1106Brzo_h -#define SH1106Brzo_h - -#include "OLEDDisplay.h" -#include - -#if F_CPU == 160000000L - #define BRZO_I2C_SPEED 1000 -#else - #define BRZO_I2C_SPEED 800 -#endif - -class SH1106Brzo : public OLEDDisplay { - private: - uint8_t _address; - uint8_t _sda; - uint8_t _scl; - - public: - SH1106Brzo(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_address = _address; - this->_sda = _sda; - this->_scl = _scl; - } - - bool connect(){ - brzo_i2c_setup(_sda, _scl, 0); - return true; - } - - void display(void) { - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (displayHeight / 8); y++) { - for (x = 0; x < displayWidth; x++) { - uint16_t pos = x + y * displayWidth; - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - if (minBoundY == UINT8_MAX) return; - - byte k = 0; - uint8_t sendBuffer[17]; - sendBuffer[0] = 0x40; - - // Calculate the colum offset - uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; - uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); - - brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); - - for (y = minBoundY; y <= maxBoundY; y++) { - sendCommand(0xB0 + y); - sendCommand(minBoundXp2H); - sendCommand(minBoundXp2L); - for (x = minBoundX; x <= maxBoundX; x++) { - k++; - sendBuffer[k] = buffer[x + y * displayWidth]; - if (k == 16) { - brzo_i2c_write(sendBuffer, 17, true); - k = 0; - } - } - if (k != 0) { - brzo_i2c_write(sendBuffer, k + 1, true); - k = 0; - } - yield(); - } - if (k != 0) { - brzo_i2c_write(sendBuffer, k + 1, true); - } - brzo_i2c_end_transaction(); - #else - #endif - } - - private: - inline void sendCommand(uint8_t com) __attribute__((always_inline)){ - uint8_t command[2] = {0x80 /* command mode */, com}; - brzo_i2c_start_transaction(_address, BRZO_I2C_SPEED); - brzo_i2c_write(command, 2, true); - brzo_i2c_end_transaction(); - } -}; - -#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106Spi.h b/printermonitor/libs/OledDisplay/src/SH1106Spi.h deleted file mode 100644 index cf8f088..0000000 --- a/printermonitor/libs/OledDisplay/src/SH1106Spi.h +++ /dev/null @@ -1,132 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef SH1106Spi_h -#define SH1106Spi_h - -#include "OLEDDisplay.h" -#include - -class SH1106Spi : public OLEDDisplay { - private: - uint8_t _rst; - uint8_t _dc; - - public: - SH1106Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_rst = _rst; - this->_dc = _dc; - } - - bool connect(){ - pinMode(_dc, OUTPUT); - pinMode(_rst, OUTPUT); - - SPI.begin (); - SPI.setClockDivider (SPI_CLOCK_DIV2); - - // Pulse Reset low for 10ms - digitalWrite(_rst, HIGH); - delay(1); - digitalWrite(_rst, LOW); - delay(10); - digitalWrite(_rst, HIGH); - return true; - } - - void display(void) { - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (displayHeight / 8); y++) { - for (x = 0; x < displayWidth; x++) { - uint16_t pos = x + y * displayWidth; - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - if (minBoundY == UINT8_MAX) return; - - // Calculate the colum offset - uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; - uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); - - for (y = minBoundY; y <= maxBoundY; y++) { - sendCommand(0xB0 + y); - sendCommand(minBoundXp2H); - sendCommand(minBoundXp2L); - digitalWrite(_dc, HIGH); // data mode - for (x = minBoundX; x <= maxBoundX; x++) { - SPI.transfer(buffer[x + y * displayWidth]); - } - yield(); - } - #else - for (uint8_t y=0; y - -#define SH1106_SET_PUMP_VOLTAGE 0X30 -#define SH1106_SET_PUMP_MODE 0XAD -#define SH1106_PUMP_ON 0X8B -#define SH1106_PUMP_OFF 0X8A -//-------------------------------------- - -class SH1106Wire : public OLEDDisplay { - private: - uint8_t _address; - uint8_t _sda; - uint8_t _scl; - - public: - SH1106Wire(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_address = _address; - this->_sda = _sda; - this->_scl = _scl; - } - - bool connect() { - Wire.begin(this->_sda, this->_scl); - // Let's use ~700khz if ESP8266 is in 160Mhz mode - // this will be limited to ~400khz if the ESP8266 in 80Mhz mode. - Wire.setClock(700000); - return true; - } - - void display(void) { - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (displayHeight / 8); y++) { - for (x = 0; x < displayWidth; x++) { - uint16_t pos = x + y * displayWidth; - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - if (minBoundY == UINT8_MAX) return; - - // Calculate the colum offset - uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; - uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); - - byte k = 0; - for (y = minBoundY; y <= maxBoundY; y++) { - sendCommand(0xB0 + y); - sendCommand(minBoundXp2H); - sendCommand(minBoundXp2L); - for (x = minBoundX; x <= maxBoundX; x++) { - if (k == 0) { - Wire.beginTransmission(_address); - Wire.write(0x40); - } - Wire.write(buffer[x + y * displayWidth]); - k++; - if (k == 16) { - Wire.endTransmission(); - k = 0; - } - } - if (k != 0) { - Wire.endTransmission(); - k = 0; - } - yield(); - } - - if (k != 0) { - Wire.endTransmission(); - } - #else - uint8_t * p = &buffer[0]; - for (uint8_t y=0; y<8; y++) { - sendCommand(0xB0+y); - sendCommand(0x02); - sendCommand(0x10); - for( uint8_t x=0; x<8; x++) { - Wire.beginTransmission(_address); - Wire.write(0x40); - for (uint8_t k = 0; k < 16; k++) { - Wire.write(*p++); - } - Wire.endTransmission(); - } - } - #endif - } - - private: - inline void sendCommand(uint8_t command) __attribute__((always_inline)){ - Wire.beginTransmission(_address); - Wire.write(0x80); - Wire.write(command); - Wire.endTransmission(); - } - - -}; - -#endif diff --git a/printermonitor/libs/OledDisplay/src/SSD1306.h b/printermonitor/libs/OledDisplay/src/SSD1306.h deleted file mode 100644 index f6bd554..0000000 --- a/printermonitor/libs/OledDisplay/src/SSD1306.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef SSD1306_h -#define SSD1306_h -#include "SSD1306Wire.h" - -// For legacy support make SSD1306 an alias for SSD1306 -typedef SSD1306Wire SSD1306; - - -#endif diff --git a/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h b/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h deleted file mode 100644 index e90b7b3..0000000 --- a/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn - * Copyright (c) 2018 by Fabrice Weinberg - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - * - * ThingPulse invests considerable time and money to develop these open source libraries. - * Please support us by buying our products (and not the clones) from - * https://thingpulse.com - * - */ - -#ifndef SSD1306Brzo_h -#define SSD1306Brzo_h - -#include "OLEDDisplay.h" -#include - -#if F_CPU == 160000000L - #define BRZO_I2C_SPEED 1000 -#else - #define BRZO_I2C_SPEED 800 -#endif - -class SSD1306Brzo : public OLEDDisplay { - private: - uint8_t _address; - uint8_t _sda; - uint8_t _scl; - - public: - SSD1306Brzo(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_address = _address; - this->_sda = _sda; - this->_scl = _scl; - } - - bool connect(){ - brzo_i2c_setup(_sda, _scl, 0); - return true; - } - - void display(void) { - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (displayHeight / 8); y++) { - for (x = 0; x < displayWidth; x++) { - uint16_t pos = x + y * displayWidth; - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - if (minBoundY == UINT8_MAX) return; - - sendCommand(COLUMNADDR); - sendCommand(minBoundX); - sendCommand(maxBoundX); - - sendCommand(PAGEADDR); - sendCommand(minBoundY); - sendCommand(maxBoundY); - - byte k = 0; - uint8_t sendBuffer[17]; - sendBuffer[0] = 0x40; - brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); - for (y = minBoundY; y <= maxBoundY; y++) { - for (x = minBoundX; x <= maxBoundX; x++) { - k++; - sendBuffer[k] = buffer[x + y * displayWidth]; - if (k == 16) { - brzo_i2c_write(sendBuffer, 17, true); - k = 0; - } - } - yield(); - } - brzo_i2c_write(sendBuffer, k + 1, true); - brzo_i2c_end_transaction(); - #else - // No double buffering - sendCommand(COLUMNADDR); - sendCommand(0x0); - sendCommand(0x7F); - - sendCommand(PAGEADDR); - sendCommand(0x0); - - if (geometry == GEOMETRY_128_64) { - sendCommand(0x7); - } else if (geometry == GEOMETRY_128_32) { - sendCommand(0x3); - } - - uint8_t sendBuffer[17]; - sendBuffer[0] = 0x40; - brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); - for (uint16_t i=0; i - -#if F_CPU == 160000000L - #define BRZO_I2C_SPEED 1000 -#else - #define BRZO_I2C_SPEED 800 -#endif - -class SSD1306Spi : public OLEDDisplay { - private: - uint8_t _rst; - uint8_t _dc; - uint8_t _cs; - - public: - SSD1306Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_rst = _rst; - this->_dc = _dc; - this->_cs = _cs; - } - - bool connect(){ - pinMode(_dc, OUTPUT); - pinMode(_cs, OUTPUT); - pinMode(_rst, OUTPUT); - - SPI.begin (); - SPI.setClockDivider (SPI_CLOCK_DIV2); - - // Pulse Reset low for 10ms - digitalWrite(_rst, HIGH); - delay(1); - digitalWrite(_rst, LOW); - delay(10); - digitalWrite(_rst, HIGH); - return true; - } - - void display(void) { - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (displayHeight / 8); y++) { - for (x = 0; x < displayWidth; x++) { - uint16_t pos = x + y * displayWidth; - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - if (minBoundY == UINT8_MAX) return; - - sendCommand(COLUMNADDR); - sendCommand(minBoundX); - sendCommand(maxBoundX); - - sendCommand(PAGEADDR); - sendCommand(minBoundY); - sendCommand(maxBoundY); - - digitalWrite(_cs, HIGH); - digitalWrite(_dc, HIGH); // data mode - digitalWrite(_cs, LOW); - for (y = minBoundY; y <= maxBoundY; y++) { - for (x = minBoundX; x <= maxBoundX; x++) { - SPI.transfer(buffer[x + y * displayWidth]); - } - yield(); - } - digitalWrite(_cs, HIGH); - #else - // No double buffering - sendCommand(COLUMNADDR); - sendCommand(0x0); - sendCommand(0x7F); - - sendCommand(PAGEADDR); - sendCommand(0x0); - - if (geometry == GEOMETRY_128_64) { - sendCommand(0x7); - } else if (geometry == GEOMETRY_128_32) { - sendCommand(0x3); - } - - digitalWrite(_cs, HIGH); - digitalWrite(_dc, HIGH); // data mode - digitalWrite(_cs, LOW); - for (uint16_t i=0; i - -class SSD1306Wire : public OLEDDisplay { - private: - uint8_t _address; - uint8_t _sda; - uint8_t _scl; - bool _doI2cAutoInit = false; - - public: - SSD1306Wire(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { - setGeometry(g); - - this->_address = _address; - this->_sda = _sda; - this->_scl = _scl; - } - - bool connect() { - Wire.begin(this->_sda, this->_scl); - // Let's use ~700khz if ESP8266 is in 160Mhz mode - // this will be limited to ~400khz if the ESP8266 in 80Mhz mode. - Wire.setClock(700000); - return true; - } - - void display(void) { - initI2cIfNeccesary(); - const int x_offset = (128 - this->width()) / 2; - #ifdef OLEDDISPLAY_DOUBLE_BUFFER - uint8_t minBoundY = UINT8_MAX; - uint8_t maxBoundY = 0; - - uint8_t minBoundX = UINT8_MAX; - uint8_t maxBoundX = 0; - uint8_t x, y; - - // Calculate the Y bounding box of changes - // and copy buffer[pos] to buffer_back[pos]; - for (y = 0; y < (this->height() / 8); y++) { - for (x = 0; x < this->width(); x++) { - uint16_t pos = x + y * this->width(); - if (buffer[pos] != buffer_back[pos]) { - minBoundY = _min(minBoundY, y); - maxBoundY = _max(maxBoundY, y); - minBoundX = _min(minBoundX, x); - maxBoundX = _max(maxBoundX, x); - } - buffer_back[pos] = buffer[pos]; - } - yield(); - } - - // If the minBoundY wasn't updated - // we can savely assume that buffer_back[pos] == buffer[pos] - // holdes true for all values of pos - - if (minBoundY == UINT8_MAX) return; - - sendCommand(COLUMNADDR); - sendCommand(x_offset + minBoundX); - sendCommand(x_offset + maxBoundX); - - sendCommand(PAGEADDR); - sendCommand(minBoundY); - sendCommand(maxBoundY); - - byte k = 0; - for (y = minBoundY; y <= maxBoundY; y++) { - for (x = minBoundX; x <= maxBoundX; x++) { - if (k == 0) { - Wire.beginTransmission(_address); - Wire.write(0x40); - } - - Wire.write(buffer[x + y * this->width()]); - k++; - if (k == 16) { - Wire.endTransmission(); - k = 0; - } - } - yield(); - } - - if (k != 0) { - Wire.endTransmission(); - } - #else - - sendCommand(COLUMNADDR); - sendCommand(x_offset); - sendCommand(x_offset + (this->width() - 1)); - - sendCommand(PAGEADDR); - sendCommand(0x0); - sendCommand((this->height() / 8) - 1); - - if (geometry == GEOMETRY_128_64) { - sendCommand(0x7); - } else if (geometry == GEOMETRY_128_32) { - sendCommand(0x3); - } - - for (uint16_t i=0; i < displayBufferSize; i++) { - Wire.beginTransmission(this->_address); - Wire.write(0x40); - for (uint8_t x = 0; x < 16; x++) { - Wire.write(buffer[i]); - i++; - } - i--; - Wire.endTransmission(); - } - #endif - } - - void setI2cAutoInit(bool doI2cAutoInit) { - _doI2cAutoInit = doI2cAutoInit; - } - - private: - inline void sendCommand(uint8_t command) __attribute__((always_inline)){ - initI2cIfNeccesary(); - Wire.beginTransmission(_address); - Wire.write(0x80); - Wire.write(command); - Wire.endTransmission(); - } - - void initI2cIfNeccesary() { - if (_doI2cAutoInit) { - Wire.begin(this->_sda, this->_scl); - } - } - -}; - -#endif From 185467597eda2f7f6eae056039ce8a69d2b993eb Mon Sep 17 00:00:00 2001 From: Chrome Legion Date: Mon, 18 Feb 2019 19:26:43 -0700 Subject: [PATCH 4/4] Qrome - added the cimpiled bin files --- ... printermonitor.ino.d1_mini_SH1106-2.5.bin | Bin 598880 -> 599184 bytes ...printermonitor.ino.d1_mini_SSD1306-2.5.bin | Bin 598784 -> 599280 bytes 2 files changed, 0 insertions(+), 0 deletions(-) rename printermonitor.ino.d1_mini_SSD1306-2.4.bin => printermonitor.ino.d1_mini_SH1106-2.5.bin (70%) rename printermonitor.ino.d1_mini_SH1106-2.4.bin => printermonitor.ino.d1_mini_SSD1306-2.5.bin (70%) diff --git a/printermonitor.ino.d1_mini_SSD1306-2.4.bin b/printermonitor.ino.d1_mini_SH1106-2.5.bin similarity index 70% rename from printermonitor.ino.d1_mini_SSD1306-2.4.bin rename to printermonitor.ino.d1_mini_SH1106-2.5.bin index 4025bbb1e6a5e226ffccb20b9bddb0d645b574bc..d03871cf1b6a4602a69d8b5797685a18f5e28d58 100644 GIT binary patch delta 78843 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 z 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 Jw|M^Q|3B8S;|%}+ diff --git a/printermonitor.ino.d1_mini_SH1106-2.4.bin b/printermonitor.ino.d1_mini_SSD1306-2.5.bin similarity index 70% rename from printermonitor.ino.d1_mini_SH1106-2.4.bin rename to printermonitor.ino.d1_mini_SSD1306-2.5.bin index a5b3a39bc1c5671a0412f3df0bbaf584280f8722..a3ba1e59f70c54e4499d535115e6c1300c89ca8c 100644 GIT binary patch delta 79089 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 V=l%V&;(J^#ke61GDt>7i_#ZiQOU?iQ literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/resources/xbmPreview.png b/printermonitor/libs/OledDisplay/resources/xbmPreview.png new file mode 100644 index 0000000000000000000000000000000000000000..70ea3a53a843f220f18d2ef7cc0698516a990ba6 GIT binary patch literal 41692 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 literal 0 HcmV?d00001 diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp b/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp new file mode 100644 index 0000000..2c0c72a --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp @@ -0,0 +1,890 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#include "OLEDDisplay.h" + +OLEDDisplay::~OLEDDisplay() { + end(); +} + +bool OLEDDisplay::init() { + if (!this->connect()) { + DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Can't establish connection to display\n"); + return false; + } + + if(this->buffer==NULL) { + this->buffer = (uint8_t*) malloc(sizeof(uint8_t) * displayBufferSize); + + if(!this->buffer) { + DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create display\n"); + return false; + } + } + + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + if(this->buffer_back==NULL) { + this->buffer_back = (uint8_t*) malloc(sizeof(uint8_t) * displayBufferSize); + + if(!this->buffer_back) { + DEBUG_OLEDDISPLAY("[OLEDDISPLAY][init] Not enough memory to create back buffer\n"); + free(this->buffer); + return false; + } + } + #endif + + sendInitCommands(); + resetDisplay(); + + return true; +} + +void OLEDDisplay::end() { + if (this->buffer) { free(this->buffer); this->buffer = NULL; } + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + if (this->buffer_back) { free(this->buffer_back); this->buffer_back = NULL; } + #endif + if (this->logBuffer != NULL) { free(this->logBuffer); this->logBuffer = NULL; } +} + +void OLEDDisplay::resetDisplay(void) { + clear(); + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + memset(buffer_back, 1, displayBufferSize); + #endif + display(); +} + +void OLEDDisplay::setColor(OLEDDISPLAY_COLOR color) { + this->color = color; +} + +OLEDDISPLAY_COLOR OLEDDisplay::getColor() { + return this->color; +} + +void OLEDDisplay::setPixel(int16_t x, int16_t y) { + if (x >= 0 && x < this->width() && y >= 0 && y < this->height()) { + switch (color) { + case WHITE: buffer[x + (y / 8) * this->width()] |= (1 << (y & 7)); break; + case BLACK: buffer[x + (y / 8) * this->width()] &= ~(1 << (y & 7)); break; + case INVERSE: buffer[x + (y / 8) * this->width()] ^= (1 << (y & 7)); break; + } + } +} + +// Bresenham's algorithm - thx wikipedia and Adafruit_GFX +void OLEDDisplay::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) { + int16_t steep = abs(y1 - y0) > abs(x1 - x0); + if (steep) { + _swap_int16_t(x0, y0); + _swap_int16_t(x1, y1); + } + + if (x0 > x1) { + _swap_int16_t(x0, x1); + _swap_int16_t(y0, y1); + } + + int16_t dx, dy; + dx = x1 - x0; + dy = abs(y1 - y0); + + int16_t err = dx / 2; + int16_t ystep; + + if (y0 < y1) { + ystep = 1; + } else { + ystep = -1; + } + + for (; x0<=x1; x0++) { + if (steep) { + setPixel(y0, x0); + } else { + setPixel(x0, y0); + } + err -= dy; + if (err < 0) { + y0 += ystep; + err += dx; + } + } +} + +void OLEDDisplay::drawRect(int16_t x, int16_t y, int16_t width, int16_t height) { + drawHorizontalLine(x, y, width); + drawVerticalLine(x, y, height); + drawVerticalLine(x + width - 1, y, height); + drawHorizontalLine(x, y + height - 1, width); +} + +void OLEDDisplay::fillRect(int16_t xMove, int16_t yMove, int16_t width, int16_t height) { + for (int16_t x = xMove; x < xMove + width; x++) { + drawVerticalLine(x, yMove, height); + } +} + +void OLEDDisplay::drawCircle(int16_t x0, int16_t y0, int16_t radius) { + int16_t x = 0, y = radius; + int16_t dp = 1 - radius; + do { + if (dp < 0) + dp = dp + 2 * (++x) + 3; + else + dp = dp + 2 * (++x) - 2 * (--y) + 5; + + setPixel(x0 + x, y0 + y); //For the 8 octants + setPixel(x0 - x, y0 + y); + setPixel(x0 + x, y0 - y); + setPixel(x0 - x, y0 - y); + setPixel(x0 + y, y0 + x); + setPixel(x0 - y, y0 + x); + setPixel(x0 + y, y0 - x); + setPixel(x0 - y, y0 - x); + + } while (x < y); + + setPixel(x0 + radius, y0); + setPixel(x0, y0 + radius); + setPixel(x0 - radius, y0); + setPixel(x0, y0 - radius); +} + +void OLEDDisplay::drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads) { + int16_t x = 0, y = radius; + int16_t dp = 1 - radius; + while (x < y) { + if (dp < 0) + dp = dp + 2 * (++x) + 3; + else + dp = dp + 2 * (++x) - 2 * (--y) + 5; + if (quads & 0x1) { + setPixel(x0 + x, y0 - y); + setPixel(x0 + y, y0 - x); + } + if (quads & 0x2) { + setPixel(x0 - y, y0 - x); + setPixel(x0 - x, y0 - y); + } + if (quads & 0x4) { + setPixel(x0 - y, y0 + x); + setPixel(x0 - x, y0 + y); + } + if (quads & 0x8) { + setPixel(x0 + x, y0 + y); + setPixel(x0 + y, y0 + x); + } + } + if (quads & 0x1 && quads & 0x8) { + setPixel(x0 + radius, y0); + } + if (quads & 0x4 && quads & 0x8) { + setPixel(x0, y0 + radius); + } + if (quads & 0x2 && quads & 0x4) { + setPixel(x0 - radius, y0); + } + if (quads & 0x1 && quads & 0x2) { + setPixel(x0, y0 - radius); + } +} + + +void OLEDDisplay::fillCircle(int16_t x0, int16_t y0, int16_t radius) { + int16_t x = 0, y = radius; + int16_t dp = 1 - radius; + do { + if (dp < 0) + dp = dp + 2 * (++x) + 3; + else + dp = dp + 2 * (++x) - 2 * (--y) + 5; + + drawHorizontalLine(x0 - x, y0 - y, 2*x); + drawHorizontalLine(x0 - x, y0 + y, 2*x); + drawHorizontalLine(x0 - y, y0 - x, 2*y); + drawHorizontalLine(x0 - y, y0 + x, 2*y); + + + } while (x < y); + drawHorizontalLine(x0 - radius, y0, 2 * radius); + +} + +void OLEDDisplay::drawHorizontalLine(int16_t x, int16_t y, int16_t length) { + if (y < 0 || y >= this->height()) { return; } + + if (x < 0) { + length += x; + x = 0; + } + + if ( (x + length) > this->width()) { + length = (this->width() - x); + } + + if (length <= 0) { return; } + + uint8_t * bufferPtr = buffer; + bufferPtr += (y >> 3) * this->width(); + bufferPtr += x; + + uint8_t drawBit = 1 << (y & 7); + + switch (color) { + case WHITE: while (length--) { + *bufferPtr++ |= drawBit; + }; break; + case BLACK: drawBit = ~drawBit; while (length--) { + *bufferPtr++ &= drawBit; + }; break; + case INVERSE: while (length--) { + *bufferPtr++ ^= drawBit; + }; break; + } +} + +void OLEDDisplay::drawVerticalLine(int16_t x, int16_t y, int16_t length) { + if (x < 0 || x >= this->width()) return; + + if (y < 0) { + length += y; + y = 0; + } + + if ( (y + length) > this->height()) { + length = (this->height() - y); + } + + if (length <= 0) return; + + + uint8_t yOffset = y & 7; + uint8_t drawBit; + uint8_t *bufferPtr = buffer; + + bufferPtr += (y >> 3) * this->width(); + bufferPtr += x; + + if (yOffset) { + yOffset = 8 - yOffset; + drawBit = ~(0xFF >> (yOffset)); + + if (length < yOffset) { + drawBit &= (0xFF >> (yOffset - length)); + } + + switch (color) { + case WHITE: *bufferPtr |= drawBit; break; + case BLACK: *bufferPtr &= ~drawBit; break; + case INVERSE: *bufferPtr ^= drawBit; break; + } + + if (length < yOffset) return; + + length -= yOffset; + bufferPtr += this->width(); + } + + if (length >= 8) { + switch (color) { + case WHITE: + case BLACK: + drawBit = (color == WHITE) ? 0xFF : 0x00; + do { + *bufferPtr = drawBit; + bufferPtr += this->width(); + length -= 8; + } while (length >= 8); + break; + case INVERSE: + do { + *bufferPtr = ~(*bufferPtr); + bufferPtr += this->width(); + length -= 8; + } while (length >= 8); + break; + } + } + + if (length > 0) { + drawBit = (1 << (length & 7)) - 1; + switch (color) { + case WHITE: *bufferPtr |= drawBit; break; + case BLACK: *bufferPtr &= ~drawBit; break; + case INVERSE: *bufferPtr ^= drawBit; break; + } + } +} + +void OLEDDisplay::drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress) { + uint16_t radius = height / 2; + uint16_t xRadius = x + radius; + uint16_t yRadius = y + radius; + uint16_t doubleRadius = 2 * radius; + uint16_t innerRadius = radius - 2; + + setColor(WHITE); + drawCircleQuads(xRadius, yRadius, radius, 0b00000110); + drawHorizontalLine(xRadius, y, width - doubleRadius + 1); + drawHorizontalLine(xRadius, y + height, width - doubleRadius + 1); + drawCircleQuads(x + width - radius, yRadius, radius, 0b00001001); + + uint16_t maxProgressWidth = (width - doubleRadius + 1) * progress / 100; + + fillCircle(xRadius, yRadius, innerRadius); + fillRect(xRadius + 1, y + 2, maxProgressWidth, height - 3); + fillCircle(xRadius + maxProgressWidth, yRadius, innerRadius); +} + +void OLEDDisplay::drawFastImage(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *image) { + drawInternal(xMove, yMove, width, height, image, 0, 0); +} + +void OLEDDisplay::drawXbm(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm) { + int16_t widthInXbm = (width + 7) / 8; + uint8_t data = 0; + + for(int16_t y = 0; y < height; y++) { + for(int16_t x = 0; x < width; x++ ) { + if (x & 7) { + data >>= 1; // Move a bit + } else { // Read new data every 8 bit + data = pgm_read_byte(xbm + (x / 8) + y * widthInXbm); + } + // if there is a bit draw it + if (data & 0x01) { + setPixel(xMove + x, yMove + y); + } + } + } +} + +void OLEDDisplay::drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth) { + uint8_t textHeight = pgm_read_byte(fontData + HEIGHT_POS); + uint8_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); + uint16_t sizeOfJumpTable = pgm_read_byte(fontData + CHAR_NUM_POS) * JUMPTABLE_BYTES; + + uint8_t cursorX = 0; + uint8_t cursorY = 0; + + switch (textAlignment) { + case TEXT_ALIGN_CENTER_BOTH: + yMove -= textHeight >> 1; + // Fallthrough + case TEXT_ALIGN_CENTER: + xMove -= textWidth >> 1; // divide by 2 + break; + case TEXT_ALIGN_RIGHT: + xMove -= textWidth; + break; + case TEXT_ALIGN_LEFT: + break; + } + + // Don't draw anything if it is not on the screen. + if (xMove + textWidth < 0 || xMove > this->width() ) {return;} + if (yMove + textHeight < 0 || yMove > this->width() ) {return;} + + for (uint16_t j = 0; j < textLength; j++) { + int16_t xPos = xMove + cursorX; + int16_t yPos = yMove + cursorY; + + byte code = text[j]; + if (code >= firstChar) { + byte charCode = code - firstChar; + + // 4 Bytes per char code + byte msbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES ); // MSB \ JumpAddress + byte lsbJumpToChar = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_LSB); // LSB / + byte charByteSize = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_SIZE); // Size + byte currentCharWidth = pgm_read_byte( fontData + JUMPTABLE_START + charCode * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); // Width + + // Test if the char is drawable + if (!(msbJumpToChar == 255 && lsbJumpToChar == 255)) { + // Get the position of the char data + uint16_t charDataPosition = JUMPTABLE_START + sizeOfJumpTable + ((msbJumpToChar << 8) + lsbJumpToChar); + drawInternal(xPos, yPos, currentCharWidth, textHeight, fontData, charDataPosition, charByteSize); + } + + cursorX += currentCharWidth; + } + } +} + + +void OLEDDisplay::drawString(int16_t xMove, int16_t yMove, String strUser) { + uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); + + // char* text must be freed! + char* text = utf8ascii(strUser); + + uint16_t yOffset = 0; + // If the string should be centered vertically too + // we need to now how heigh the string is. + if (textAlignment == TEXT_ALIGN_CENTER_BOTH) { + uint16_t lb = 0; + // Find number of linebreaks in text + for (uint16_t i=0;text[i] != 0; i++) { + lb += (text[i] == 10); + } + // Calculate center + yOffset = (lb * lineHeight) / 2; + } + + uint16_t line = 0; + char* textPart = strtok(text,"\n"); + while (textPart != NULL) { + uint16_t length = strlen(textPart); + drawStringInternal(xMove, yMove - yOffset + (line++) * lineHeight, textPart, length, getStringWidth(textPart, length)); + textPart = strtok(NULL, "\n"); + } + free(text); +} + +void OLEDDisplay::drawStringMaxWidth(int16_t xMove, int16_t yMove, uint16_t maxLineWidth, String strUser) { + uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); + uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); + + char* text = utf8ascii(strUser); + + uint16_t length = strlen(text); + uint16_t lastDrawnPos = 0; + uint16_t lineNumber = 0; + uint16_t strWidth = 0; + + uint16_t preferredBreakpoint = 0; + uint16_t widthAtBreakpoint = 0; + + for (uint16_t i = 0; i < length; i++) { + strWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[i] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); + + // Always try to break on a space or dash + if (text[i] == ' ' || text[i]== '-') { + preferredBreakpoint = i; + widthAtBreakpoint = strWidth; + } + + if (strWidth >= maxLineWidth) { + if (preferredBreakpoint == 0) { + preferredBreakpoint = i; + widthAtBreakpoint = strWidth; + } + drawStringInternal(xMove, yMove + (lineNumber++) * lineHeight , &text[lastDrawnPos], preferredBreakpoint - lastDrawnPos, widthAtBreakpoint); + lastDrawnPos = preferredBreakpoint + 1; + // It is possible that we did not draw all letters to i so we need + // to account for the width of the chars from `i - preferredBreakpoint` + // by calculating the width we did not draw yet. + strWidth = strWidth - widthAtBreakpoint; + preferredBreakpoint = 0; + } + } + + // Draw last part if needed + if (lastDrawnPos < length) { + drawStringInternal(xMove, yMove + lineNumber * lineHeight , &text[lastDrawnPos], length - lastDrawnPos, getStringWidth(&text[lastDrawnPos], length - lastDrawnPos)); + } + + free(text); +} + +uint16_t OLEDDisplay::getStringWidth(const char* text, uint16_t length) { + uint16_t firstChar = pgm_read_byte(fontData + FIRST_CHAR_POS); + + uint16_t stringWidth = 0; + uint16_t maxWidth = 0; + + while (length--) { + stringWidth += pgm_read_byte(fontData + JUMPTABLE_START + (text[length] - firstChar) * JUMPTABLE_BYTES + JUMPTABLE_WIDTH); + if (text[length] == 10) { + maxWidth = max(maxWidth, stringWidth); + stringWidth = 0; + } + } + + return max(maxWidth, stringWidth); +} + +uint16_t OLEDDisplay::getStringWidth(String strUser) { + char* text = utf8ascii(strUser); + uint16_t length = strlen(text); + uint16_t width = getStringWidth(text, length); + free(text); + return width; +} + +void OLEDDisplay::setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment) { + this->textAlignment = textAlignment; +} + +void OLEDDisplay::setFont(const uint8_t *fontData) { + this->fontData = fontData; +} + +void OLEDDisplay::displayOn(void) { + sendCommand(DISPLAYON); +} + +void OLEDDisplay::displayOff(void) { + sendCommand(DISPLAYOFF); +} + +void OLEDDisplay::invertDisplay(void) { + sendCommand(INVERTDISPLAY); +} + +void OLEDDisplay::normalDisplay(void) { + sendCommand(NORMALDISPLAY); +} + +void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge, uint8_t comdetect) { + sendCommand(SETPRECHARGE); //0xD9 + sendCommand(precharge); //0xF1 default, to lower the contrast, put 1-1F + sendCommand(SETCONTRAST); + sendCommand(contrast); // 0-255 + sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast) + sendCommand(comdetect); //0x40 default, to lower the contrast, put 0 + sendCommand(DISPLAYALLON_RESUME); + sendCommand(NORMALDISPLAY); + sendCommand(DISPLAYON); +} + +void OLEDDisplay::setBrightness(uint8_t brightness) { + uint8_t contrast = brightness; + if (brightness < 128) { + // Magic values to get a smooth/ step-free transition + contrast = brightness * 1.171; + } else { + contrast = brightness * 1.171 - 43; + } + + uint8_t precharge = 241; + if (brightness == 0) { + precharge = 0; + } + uint8_t comdetect = brightness / 8; + + setContrast(contrast, precharge, comdetect); +} + +void OLEDDisplay::resetOrientation() { + sendCommand(SEGREMAP); + sendCommand(COMSCANINC); //Reset screen rotation or mirroring +} + +void OLEDDisplay::flipScreenVertically() { + sendCommand(SEGREMAP | 0x01); + sendCommand(COMSCANDEC); //Rotate screen 180 Deg +} + +void OLEDDisplay::mirrorScreen() { + sendCommand(SEGREMAP); + sendCommand(COMSCANDEC); //Mirror screen +} + +void OLEDDisplay::clear(void) { + memset(buffer, 0, displayBufferSize); +} + +void OLEDDisplay::drawLogBuffer(uint16_t xMove, uint16_t yMove) { + uint16_t lineHeight = pgm_read_byte(fontData + HEIGHT_POS); + // Always align left + setTextAlignment(TEXT_ALIGN_LEFT); + + // State values + uint16_t length = 0; + uint16_t line = 0; + uint16_t lastPos = 0; + + for (uint16_t i=0;ilogBufferFilled;i++){ + // Everytime we have a \n print + if (this->logBuffer[i] == 10) { + length++; + // Draw string on line `line` from lastPos to length + // Passing 0 as the lenght because we are in TEXT_ALIGN_LEFT + drawStringInternal(xMove, yMove + (line++) * lineHeight, &this->logBuffer[lastPos], length, 0); + // Remember last pos + lastPos = i; + // Reset length + length = 0; + } else { + // Count chars until next linebreak + length++; + } + } + // Draw the remaining string + if (length > 0) { + drawStringInternal(xMove, yMove + line * lineHeight, &this->logBuffer[lastPos], length, 0); + } +} + +uint16_t OLEDDisplay::getWidth(void) { + return displayWidth; +} + +uint16_t OLEDDisplay::getHeight(void) { + return displayHeight; +} + +bool OLEDDisplay::setLogBuffer(uint16_t lines, uint16_t chars){ + if (logBuffer != NULL) free(logBuffer); + uint16_t size = lines * chars; + if (size > 0) { + this->logBufferLine = 0; // Lines printed + this->logBufferFilled = 0; // Nothing stored yet + this->logBufferMaxLines = lines; // Lines max printable + this->logBufferSize = size; // Total number of characters the buffer can hold + this->logBuffer = (char *) malloc(size * sizeof(uint8_t)); + if(!this->logBuffer) { + DEBUG_OLEDDISPLAY("[OLEDDISPLAY][setLogBuffer] Not enough memory to create log buffer\n"); + return false; + } + } + return true; +} + +size_t OLEDDisplay::write(uint8_t c) { + if (this->logBufferSize > 0) { + // Don't waste space on \r\n line endings, dropping \r + if (c == 13) return 1; + + // convert UTF-8 character to font table index + c = (this->fontTableLookupFunction)(c); + // drop unknown character + if (c == 0) return 1; + + bool maxLineNotReached = this->logBufferLine < this->logBufferMaxLines; + bool bufferNotFull = this->logBufferFilled < this->logBufferSize; + + // Can we write to the buffer? + if (bufferNotFull && maxLineNotReached) { + this->logBuffer[logBufferFilled] = c; + this->logBufferFilled++; + // Keep track of lines written + if (c == 10) this->logBufferLine++; + } else { + // Max line number is reached + if (!maxLineNotReached) this->logBufferLine--; + + // Find the end of the first line + uint16_t firstLineEnd = 0; + for (uint16_t i=0;ilogBufferFilled;i++) { + if (this->logBuffer[i] == 10){ + // Include last char too + firstLineEnd = i + 1; + break; + } + } + // If there was a line ending + if (firstLineEnd > 0) { + // Calculate the new logBufferFilled value + this->logBufferFilled = logBufferFilled - firstLineEnd; + // Now we move the lines infront of the buffer + memcpy(this->logBuffer, &this->logBuffer[firstLineEnd], logBufferFilled); + } else { + // Let's reuse the buffer if it was full + if (!bufferNotFull) { + this->logBufferFilled = 0; + }// else { + // Nothing to do here + //} + } + write(c); + } + } + // We are always writing all uint8_t to the buffer + return 1; +} + +size_t OLEDDisplay::write(const char* str) { + if (str == NULL) return 0; + size_t length = strlen(str); + for (size_t i = 0; i < length; i++) { + write(str[i]); + } + return length; +} + +// Private functions +void OLEDDisplay::setGeometry(OLEDDISPLAY_GEOMETRY g) { + this->geometry = g; + if (g == GEOMETRY_128_64) { + this->displayWidth = 128; + this->displayHeight = 64; + } else if (g == GEOMETRY_128_32) { + this->displayWidth = 128; + this->displayHeight = 32; + } + this->displayBufferSize = displayWidth*displayHeight/8; +} + +void OLEDDisplay::sendInitCommands(void) { + sendCommand(DISPLAYOFF); + sendCommand(SETDISPLAYCLOCKDIV); + sendCommand(0xF0); // Increase speed of the display max ~96Hz + sendCommand(SETMULTIPLEX); + sendCommand(this->height() - 1); + sendCommand(SETDISPLAYOFFSET); + sendCommand(0x00); + sendCommand(SETSTARTLINE); + sendCommand(CHARGEPUMP); + sendCommand(0x14); + sendCommand(MEMORYMODE); + sendCommand(0x00); + sendCommand(SEGREMAP); + sendCommand(COMSCANINC); + sendCommand(SETCOMPINS); + + if (geometry == GEOMETRY_128_64) { + sendCommand(0x12); + } else if (geometry == GEOMETRY_128_32) { + sendCommand(0x02); + } + + sendCommand(SETCONTRAST); + + if (geometry == GEOMETRY_128_64) { + sendCommand(0xCF); + } else if (geometry == GEOMETRY_128_32) { + sendCommand(0x8F); + } + + sendCommand(SETPRECHARGE); + sendCommand(0xF1); + sendCommand(SETVCOMDETECT); //0xDB, (additionally needed to lower the contrast) + sendCommand(0x40); //0x40 default, to lower the contrast, put 0 + sendCommand(DISPLAYALLON_RESUME); + sendCommand(NORMALDISPLAY); + sendCommand(0x2e); // stop scroll + sendCommand(DISPLAYON); +} + +void inline OLEDDisplay::drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) { + if (width < 0 || height < 0) return; + if (yMove + height < 0 || yMove > this->height()) return; + if (xMove + width < 0 || xMove > this->width()) return; + + uint8_t rasterHeight = 1 + ((height - 1) >> 3); // fast ceil(height / 8.0) + int8_t yOffset = yMove & 7; + + bytesInData = bytesInData == 0 ? width * rasterHeight : bytesInData; + + int16_t initYMove = yMove; + int8_t initYOffset = yOffset; + + + for (uint16_t i = 0; i < bytesInData; i++) { + + // Reset if next horizontal drawing phase is started. + if ( i % rasterHeight == 0) { + yMove = initYMove; + yOffset = initYOffset; + } + + byte currentByte = pgm_read_byte(data + offset + i); + + int16_t xPos = xMove + (i / rasterHeight); + int16_t yPos = ((yMove >> 3) + (i % rasterHeight)) * this->width(); + +// int16_t yScreenPos = yMove + yOffset; + int16_t dataPos = xPos + yPos; + + if (dataPos >= 0 && dataPos < displayBufferSize && + xPos >= 0 && xPos < this->width() ) { + + if (yOffset >= 0) { + switch (this->color) { + case WHITE: buffer[dataPos] |= currentByte << yOffset; break; + case BLACK: buffer[dataPos] &= ~(currentByte << yOffset); break; + case INVERSE: buffer[dataPos] ^= currentByte << yOffset; break; + } + + if (dataPos < (displayBufferSize - this->width())) { + switch (this->color) { + case WHITE: buffer[dataPos + this->width()] |= currentByte >> (8 - yOffset); break; + case BLACK: buffer[dataPos + this->width()] &= ~(currentByte >> (8 - yOffset)); break; + case INVERSE: buffer[dataPos + this->width()] ^= currentByte >> (8 - yOffset); break; + } + } + } else { + // Make new offset position + yOffset = -yOffset; + + switch (this->color) { + case WHITE: buffer[dataPos] |= currentByte >> yOffset; break; + case BLACK: buffer[dataPos] &= ~(currentByte >> yOffset); break; + case INVERSE: buffer[dataPos] ^= currentByte >> yOffset; break; + } + + // Prepare for next iteration by moving one block up + yMove -= 8; + + // and setting the new yOffset + yOffset = 8 - yOffset; + } + + yield(); + } + } +} + +// You need to free the char! +char* OLEDDisplay::utf8ascii(String str) { + uint16_t k = 0; + uint16_t length = str.length() + 1; + + // Copy the string into a char array + char* s = (char*) malloc(length * sizeof(char)); + if(!s) { + DEBUG_OLEDDISPLAY("[OLEDDISPLAY][utf8ascii] Can't allocate another char array. Drop support for UTF-8.\n"); + return (char*) str.c_str(); + } + str.toCharArray(s, length); + + length--; + + for (uint16_t i=0; i < length; i++) { + char c = (this->fontTableLookupFunction)(s[i]); + if (c!=0) { + s[k++]=c; + } + } + + s[k]=0; + + // This will leak 's' be sure to free it in the calling function. + return s; +} + +void OLEDDisplay::setFontTableLookupFunction(FontTableLookupFunction function) { + this->fontTableLookupFunction = function; +} diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplay.h b/printermonitor/libs/OledDisplay/src/OLEDDisplay.h new file mode 100644 index 0000000..ddf80bd --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/OLEDDisplay.h @@ -0,0 +1,329 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef OLEDDISPLAY_h +#define OLEDDISPLAY_h + +#include +#include "OLEDDisplayFonts.h" + +//#define DEBUG_OLEDDISPLAY(...) Serial.printf( __VA_ARGS__ ) + +#ifndef DEBUG_OLEDDISPLAY +#define DEBUG_OLEDDISPLAY(...) +#endif + +// Use DOUBLE BUFFERING by default +#ifndef OLEDDISPLAY_REDUCE_MEMORY +#define OLEDDISPLAY_DOUBLE_BUFFER +#endif + +// Header Values +#define JUMPTABLE_BYTES 4 + +#define JUMPTABLE_LSB 1 +#define JUMPTABLE_SIZE 2 +#define JUMPTABLE_WIDTH 3 +#define JUMPTABLE_START 4 + +#define WIDTH_POS 0 +#define HEIGHT_POS 1 +#define FIRST_CHAR_POS 2 +#define CHAR_NUM_POS 3 + + +// Display commands +#define CHARGEPUMP 0x8D +#define COLUMNADDR 0x21 +#define COMSCANDEC 0xC8 +#define COMSCANINC 0xC0 +#define DISPLAYALLON 0xA5 +#define DISPLAYALLON_RESUME 0xA4 +#define DISPLAYOFF 0xAE +#define DISPLAYON 0xAF +#define EXTERNALVCC 0x1 +#define INVERTDISPLAY 0xA7 +#define MEMORYMODE 0x20 +#define NORMALDISPLAY 0xA6 +#define PAGEADDR 0x22 +#define SEGREMAP 0xA0 +#define SETCOMPINS 0xDA +#define SETCONTRAST 0x81 +#define SETDISPLAYCLOCKDIV 0xD5 +#define SETDISPLAYOFFSET 0xD3 +#define SETHIGHCOLUMN 0x10 +#define SETLOWCOLUMN 0x00 +#define SETMULTIPLEX 0xA8 +#define SETPRECHARGE 0xD9 +#define SETSEGMENTREMAP 0xA1 +#define SETSTARTLINE 0x40 +#define SETVCOMDETECT 0xDB +#define SWITCHCAPVCC 0x2 + +#ifndef _swap_int16_t +#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; } +#endif + +enum OLEDDISPLAY_COLOR { + BLACK = 0, + WHITE = 1, + INVERSE = 2 +}; + +enum OLEDDISPLAY_TEXT_ALIGNMENT { + TEXT_ALIGN_LEFT = 0, + TEXT_ALIGN_RIGHT = 1, + TEXT_ALIGN_CENTER = 2, + TEXT_ALIGN_CENTER_BOTH = 3 +}; + + +enum OLEDDISPLAY_GEOMETRY { + GEOMETRY_128_64 = 0, + GEOMETRY_128_32 = 1 +}; + +typedef byte (*FontTableLookupFunction)(const byte ch); + + +class OLEDDisplay : public Print { + + public: + virtual ~OLEDDisplay(); + + const uint16_t width(void) const { return displayWidth; }; + const uint16_t height(void) const { return displayHeight; }; + + // Initialize the display + bool init(); + + // Free the memory used by the display + void end(); + + // Cycle through the initialization + void resetDisplay(void); + + /* Drawing functions */ + // Sets the color of all pixel operations + void setColor(OLEDDISPLAY_COLOR color); + + // Returns the current color. + OLEDDISPLAY_COLOR getColor(); + + // Draw a pixel at given position + void setPixel(int16_t x, int16_t y); + + // Draw a line from position 0 to position 1 + void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); + + // Draw the border of a rectangle at the given location + void drawRect(int16_t x, int16_t y, int16_t width, int16_t height); + + // Fill the rectangle + void fillRect(int16_t x, int16_t y, int16_t width, int16_t height); + + // Draw the border of a circle + void drawCircle(int16_t x, int16_t y, int16_t radius); + + // Draw all Quadrants specified in the quads bit mask + void drawCircleQuads(int16_t x0, int16_t y0, int16_t radius, uint8_t quads); + + // Fill circle + void fillCircle(int16_t x, int16_t y, int16_t radius); + + // Draw a line horizontally + void drawHorizontalLine(int16_t x, int16_t y, int16_t length); + + // Draw a line vertically + void drawVerticalLine(int16_t x, int16_t y, int16_t length); + + // Draws a rounded progress bar with the outer dimensions given by width and height. Progress is + // a unsigned byte value between 0 and 100 + void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress); + + // Draw a bitmap in the internal image format + void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image); + + // Draw a XBM + void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *xbm); + + /* Text functions */ + + // Draws a string at the given location + void drawString(int16_t x, int16_t y, String text); + + // Draws a String with a maximum width at the given location. + // If the given String is wider than the specified width + // The text will be wrapped to the next line at a space or dash + void drawStringMaxWidth(int16_t x, int16_t y, uint16_t maxLineWidth, String text); + + // Returns the width of the const char* with the current + // font settings + uint16_t getStringWidth(const char* text, uint16_t length); + + // Convencience method for the const char version + uint16_t getStringWidth(String text); + + // Specifies relative to which anchor point + // the text is rendered. Available constants: + // TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH + void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment); + + // Sets the current font. Available default fonts + // ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24 + void setFont(const uint8_t *fontData); + + // Set the function that will convert utf-8 to font table index + void setFontTableLookupFunction(FontTableLookupFunction function); + + /* Display functions */ + + // Turn the display on + void displayOn(void); + + // Turn the display offs + void displayOff(void); + + // Inverted display mode + void invertDisplay(void); + + // Normal display mode + void normalDisplay(void); + + // Set display contrast + // really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0 + // normal brightness & contrast: contrast = 100 + void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64); + + // Convenience method to access + void setBrightness(uint8_t); + + // Reset display rotation or mirroring + void resetOrientation(); + + // Turn the display upside down + void flipScreenVertically(); + + // Mirror the display (to be used in a mirror or as a projector) + void mirrorScreen(); + + // Write the buffer to the display memory + virtual void display(void) = 0; + + // Clear the local pixel buffer + void clear(void); + + // Log buffer implementation + + // This will define the lines and characters you can + // print to the screen. When you exeed the buffer size (lines * chars) + // the output may be truncated due to the size constraint. + bool setLogBuffer(uint16_t lines, uint16_t chars); + + // Draw the log buffer at position (x, y) + void drawLogBuffer(uint16_t x, uint16_t y); + + // Get screen geometry + uint16_t getWidth(void); + uint16_t getHeight(void); + + // Implement needed function to be compatible with Print class + size_t write(uint8_t c); + size_t write(const char* s); + + uint8_t *buffer = NULL; + + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t *buffer_back = NULL; + #endif + + protected: + + OLEDDISPLAY_GEOMETRY geometry = GEOMETRY_128_64; + + uint16_t displayWidth = 128; + uint16_t displayHeight = 64; + uint16_t displayBufferSize = 1024; + + // Set the correct height, width and buffer for the geometry + void setGeometry(OLEDDISPLAY_GEOMETRY g); + + OLEDDISPLAY_TEXT_ALIGNMENT textAlignment = TEXT_ALIGN_LEFT; + OLEDDISPLAY_COLOR color = WHITE; + + const uint8_t *fontData = ArialMT_Plain_10; + + // State values for logBuffer + uint16_t logBufferSize = 0; + uint16_t logBufferFilled = 0; + uint16_t logBufferLine = 0; + uint16_t logBufferMaxLines = 0; + char *logBuffer = NULL; + + // Send a command to the display (low level function) + virtual void sendCommand(uint8_t com) {(void)com;}; + + // Connect to the display + virtual bool connect() { return false; }; + + // Send all the init commands + void sendInitCommands(); + + // converts utf8 characters to extended ascii + char* utf8ascii(String s); + + void inline drawInternal(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *data, uint16_t offset, uint16_t bytesInData) __attribute__((always_inline)); + + void drawStringInternal(int16_t xMove, int16_t yMove, char* text, uint16_t textLength, uint16_t textWidth); + + // UTF-8 to font table index converter + // Code form http://playground.arduino.cc/Main/Utf8ascii + FontTableLookupFunction fontTableLookupFunction = [](const byte ch) { + static uint8_t LASTCHAR; + + if (ch < 128) { // Standard ASCII-set 0..0x7F handling + LASTCHAR = 0; + return ch; + } + + uint8_t last = LASTCHAR; // get last char + LASTCHAR = ch; + + switch (last) { // conversion depnding on first UTF8-character + case 0xC2: return (uint8_t) ch; + case 0xC3: return (uint8_t) (ch | 0xC0); + case 0x82: if (ch == 0xAC) return (uint8_t) 0x80; // special case Euro-symbol + } + + return (uint8_t) 0; // otherwise: return zero, if character has to be ignored + }; +}; + +#endif diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h b/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h new file mode 100644 index 0000000..3544edb --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h @@ -0,0 +1,1274 @@ +#ifndef OLEDDISPLAYFONTS_h +#define OLEDDISPLAYFONTS_h + +const uint8_t ArialMT_Plain_10[] PROGMEM = { + 0x0A, // Width: 10 + 0x0D, // Height: 13 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x03, // 32:65535 + 0x00, 0x00, 0x04, 0x03, // 33:0 + 0x00, 0x04, 0x05, 0x04, // 34:4 + 0x00, 0x09, 0x09, 0x06, // 35:9 + 0x00, 0x12, 0x0A, 0x06, // 36:18 + 0x00, 0x1C, 0x10, 0x09, // 37:28 + 0x00, 0x2C, 0x0E, 0x07, // 38:44 + 0x00, 0x3A, 0x01, 0x02, // 39:58 + 0x00, 0x3B, 0x06, 0x03, // 40:59 + 0x00, 0x41, 0x06, 0x03, // 41:65 + 0x00, 0x47, 0x05, 0x04, // 42:71 + 0x00, 0x4C, 0x09, 0x06, // 43:76 + 0x00, 0x55, 0x04, 0x03, // 44:85 + 0x00, 0x59, 0x03, 0x03, // 45:89 + 0x00, 0x5C, 0x04, 0x03, // 46:92 + 0x00, 0x60, 0x05, 0x03, // 47:96 + 0x00, 0x65, 0x0A, 0x06, // 48:101 + 0x00, 0x6F, 0x08, 0x06, // 49:111 + 0x00, 0x77, 0x0A, 0x06, // 50:119 + 0x00, 0x81, 0x0A, 0x06, // 51:129 + 0x00, 0x8B, 0x0B, 0x06, // 52:139 + 0x00, 0x96, 0x0A, 0x06, // 53:150 + 0x00, 0xA0, 0x0A, 0x06, // 54:160 + 0x00, 0xAA, 0x09, 0x06, // 55:170 + 0x00, 0xB3, 0x0A, 0x06, // 56:179 + 0x00, 0xBD, 0x0A, 0x06, // 57:189 + 0x00, 0xC7, 0x04, 0x03, // 58:199 + 0x00, 0xCB, 0x04, 0x03, // 59:203 + 0x00, 0xCF, 0x0A, 0x06, // 60:207 + 0x00, 0xD9, 0x09, 0x06, // 61:217 + 0x00, 0xE2, 0x09, 0x06, // 62:226 + 0x00, 0xEB, 0x0B, 0x06, // 63:235 + 0x00, 0xF6, 0x14, 0x0A, // 64:246 + 0x01, 0x0A, 0x0E, 0x07, // 65:266 + 0x01, 0x18, 0x0C, 0x07, // 66:280 + 0x01, 0x24, 0x0C, 0x07, // 67:292 + 0x01, 0x30, 0x0B, 0x07, // 68:304 + 0x01, 0x3B, 0x0C, 0x07, // 69:315 + 0x01, 0x47, 0x09, 0x06, // 70:327 + 0x01, 0x50, 0x0D, 0x08, // 71:336 + 0x01, 0x5D, 0x0C, 0x07, // 72:349 + 0x01, 0x69, 0x04, 0x03, // 73:361 + 0x01, 0x6D, 0x08, 0x05, // 74:365 + 0x01, 0x75, 0x0E, 0x07, // 75:373 + 0x01, 0x83, 0x0C, 0x06, // 76:387 + 0x01, 0x8F, 0x10, 0x08, // 77:399 + 0x01, 0x9F, 0x0C, 0x07, // 78:415 + 0x01, 0xAB, 0x0E, 0x08, // 79:427 + 0x01, 0xB9, 0x0B, 0x07, // 80:441 + 0x01, 0xC4, 0x0E, 0x08, // 81:452 + 0x01, 0xD2, 0x0C, 0x07, // 82:466 + 0x01, 0xDE, 0x0C, 0x07, // 83:478 + 0x01, 0xEA, 0x0B, 0x06, // 84:490 + 0x01, 0xF5, 0x0C, 0x07, // 85:501 + 0x02, 0x01, 0x0D, 0x07, // 86:513 + 0x02, 0x0E, 0x11, 0x09, // 87:526 + 0x02, 0x1F, 0x0E, 0x07, // 88:543 + 0x02, 0x2D, 0x0D, 0x07, // 89:557 + 0x02, 0x3A, 0x0C, 0x06, // 90:570 + 0x02, 0x46, 0x06, 0x03, // 91:582 + 0x02, 0x4C, 0x06, 0x03, // 92:588 + 0x02, 0x52, 0x04, 0x03, // 93:594 + 0x02, 0x56, 0x09, 0x05, // 94:598 + 0x02, 0x5F, 0x0C, 0x06, // 95:607 + 0x02, 0x6B, 0x03, 0x03, // 96:619 + 0x02, 0x6E, 0x0A, 0x06, // 97:622 + 0x02, 0x78, 0x0A, 0x06, // 98:632 + 0x02, 0x82, 0x0A, 0x05, // 99:642 + 0x02, 0x8C, 0x0A, 0x06, // 100:652 + 0x02, 0x96, 0x0A, 0x06, // 101:662 + 0x02, 0xA0, 0x05, 0x03, // 102:672 + 0x02, 0xA5, 0x0A, 0x06, // 103:677 + 0x02, 0xAF, 0x0A, 0x06, // 104:687 + 0x02, 0xB9, 0x04, 0x02, // 105:697 + 0x02, 0xBD, 0x04, 0x02, // 106:701 + 0x02, 0xC1, 0x08, 0x05, // 107:705 + 0x02, 0xC9, 0x04, 0x02, // 108:713 + 0x02, 0xCD, 0x10, 0x08, // 109:717 + 0x02, 0xDD, 0x0A, 0x06, // 110:733 + 0x02, 0xE7, 0x0A, 0x06, // 111:743 + 0x02, 0xF1, 0x0A, 0x06, // 112:753 + 0x02, 0xFB, 0x0A, 0x06, // 113:763 + 0x03, 0x05, 0x05, 0x03, // 114:773 + 0x03, 0x0A, 0x08, 0x05, // 115:778 + 0x03, 0x12, 0x06, 0x03, // 116:786 + 0x03, 0x18, 0x0A, 0x06, // 117:792 + 0x03, 0x22, 0x09, 0x05, // 118:802 + 0x03, 0x2B, 0x0E, 0x07, // 119:811 + 0x03, 0x39, 0x0A, 0x05, // 120:825 + 0x03, 0x43, 0x09, 0x05, // 121:835 + 0x03, 0x4C, 0x0A, 0x05, // 122:844 + 0x03, 0x56, 0x06, 0x03, // 123:854 + 0x03, 0x5C, 0x04, 0x03, // 124:860 + 0x03, 0x60, 0x05, 0x03, // 125:864 + 0x03, 0x65, 0x09, 0x06, // 126:869 + 0xFF, 0xFF, 0x00, 0x00, // 127:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 128:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 129:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 130:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 131:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 132:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 133:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 134:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 135:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 136:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 137:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 138:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 139:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 140:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 141:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 142:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 143:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 144:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 145:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 146:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 147:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 148:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 149:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 150:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 151:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 152:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 153:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 154:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 155:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 156:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 157:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 158:65535 + 0xFF, 0xFF, 0x00, 0x0A, // 159:65535 + 0xFF, 0xFF, 0x00, 0x03, // 160:65535 + 0x03, 0x6E, 0x04, 0x03, // 161:878 + 0x03, 0x72, 0x0A, 0x06, // 162:882 + 0x03, 0x7C, 0x0C, 0x06, // 163:892 + 0x03, 0x88, 0x0A, 0x06, // 164:904 + 0x03, 0x92, 0x0A, 0x06, // 165:914 + 0x03, 0x9C, 0x04, 0x03, // 166:924 + 0x03, 0xA0, 0x0A, 0x06, // 167:928 + 0x03, 0xAA, 0x05, 0x03, // 168:938 + 0x03, 0xAF, 0x0D, 0x07, // 169:943 + 0x03, 0xBC, 0x07, 0x04, // 170:956 + 0x03, 0xC3, 0x0A, 0x06, // 171:963 + 0x03, 0xCD, 0x09, 0x06, // 172:973 + 0x03, 0xD6, 0x03, 0x03, // 173:982 + 0x03, 0xD9, 0x0D, 0x07, // 174:985 + 0x03, 0xE6, 0x0B, 0x06, // 175:998 + 0x03, 0xF1, 0x07, 0x04, // 176:1009 + 0x03, 0xF8, 0x0A, 0x05, // 177:1016 + 0x04, 0x02, 0x05, 0x03, // 178:1026 + 0x04, 0x07, 0x05, 0x03, // 179:1031 + 0x04, 0x0C, 0x05, 0x03, // 180:1036 + 0x04, 0x11, 0x0A, 0x06, // 181:1041 + 0x04, 0x1B, 0x09, 0x05, // 182:1051 + 0x04, 0x24, 0x03, 0x03, // 183:1060 + 0x04, 0x27, 0x06, 0x03, // 184:1063 + 0x04, 0x2D, 0x05, 0x03, // 185:1069 + 0x04, 0x32, 0x07, 0x04, // 186:1074 + 0x04, 0x39, 0x0A, 0x06, // 187:1081 + 0x04, 0x43, 0x10, 0x08, // 188:1091 + 0x04, 0x53, 0x10, 0x08, // 189:1107 + 0x04, 0x63, 0x10, 0x08, // 190:1123 + 0x04, 0x73, 0x0A, 0x06, // 191:1139 + 0x04, 0x7D, 0x0E, 0x07, // 192:1149 + 0x04, 0x8B, 0x0E, 0x07, // 193:1163 + 0x04, 0x99, 0x0E, 0x07, // 194:1177 + 0x04, 0xA7, 0x0E, 0x07, // 195:1191 + 0x04, 0xB5, 0x0E, 0x07, // 196:1205 + 0x04, 0xC3, 0x0E, 0x07, // 197:1219 + 0x04, 0xD1, 0x12, 0x0A, // 198:1233 + 0x04, 0xE3, 0x0C, 0x07, // 199:1251 + 0x04, 0xEF, 0x0C, 0x07, // 200:1263 + 0x04, 0xFB, 0x0C, 0x07, // 201:1275 + 0x05, 0x07, 0x0C, 0x07, // 202:1287 + 0x05, 0x13, 0x0C, 0x07, // 203:1299 + 0x05, 0x1F, 0x05, 0x03, // 204:1311 + 0x05, 0x24, 0x04, 0x03, // 205:1316 + 0x05, 0x28, 0x04, 0x03, // 206:1320 + 0x05, 0x2C, 0x05, 0x03, // 207:1324 + 0x05, 0x31, 0x0B, 0x07, // 208:1329 + 0x05, 0x3C, 0x0C, 0x07, // 209:1340 + 0x05, 0x48, 0x0E, 0x08, // 210:1352 + 0x05, 0x56, 0x0E, 0x08, // 211:1366 + 0x05, 0x64, 0x0E, 0x08, // 212:1380 + 0x05, 0x72, 0x0E, 0x08, // 213:1394 + 0x05, 0x80, 0x0E, 0x08, // 214:1408 + 0x05, 0x8E, 0x0A, 0x06, // 215:1422 + 0x05, 0x98, 0x0D, 0x08, // 216:1432 + 0x05, 0xA5, 0x0C, 0x07, // 217:1445 + 0x05, 0xB1, 0x0C, 0x07, // 218:1457 + 0x05, 0xBD, 0x0C, 0x07, // 219:1469 + 0x05, 0xC9, 0x0C, 0x07, // 220:1481 + 0x05, 0xD5, 0x0D, 0x07, // 221:1493 + 0x05, 0xE2, 0x0B, 0x07, // 222:1506 + 0x05, 0xED, 0x0C, 0x06, // 223:1517 + 0x05, 0xF9, 0x0A, 0x06, // 224:1529 + 0x06, 0x03, 0x0A, 0x06, // 225:1539 + 0x06, 0x0D, 0x0A, 0x06, // 226:1549 + 0x06, 0x17, 0x0A, 0x06, // 227:1559 + 0x06, 0x21, 0x0A, 0x06, // 228:1569 + 0x06, 0x2B, 0x0A, 0x06, // 229:1579 + 0x06, 0x35, 0x10, 0x09, // 230:1589 + 0x06, 0x45, 0x0A, 0x05, // 231:1605 + 0x06, 0x4F, 0x0A, 0x06, // 232:1615 + 0x06, 0x59, 0x0A, 0x06, // 233:1625 + 0x06, 0x63, 0x0A, 0x06, // 234:1635 + 0x06, 0x6D, 0x0A, 0x06, // 235:1645 + 0x06, 0x77, 0x05, 0x03, // 236:1655 + 0x06, 0x7C, 0x04, 0x03, // 237:1660 + 0x06, 0x80, 0x05, 0x03, // 238:1664 + 0x06, 0x85, 0x05, 0x03, // 239:1669 + 0x06, 0x8A, 0x0A, 0x06, // 240:1674 + 0x06, 0x94, 0x0A, 0x06, // 241:1684 + 0x06, 0x9E, 0x0A, 0x06, // 242:1694 + 0x06, 0xA8, 0x0A, 0x06, // 243:1704 + 0x06, 0xB2, 0x0A, 0x06, // 244:1714 + 0x06, 0xBC, 0x0A, 0x06, // 245:1724 + 0x06, 0xC6, 0x0A, 0x06, // 246:1734 + 0x06, 0xD0, 0x09, 0x05, // 247:1744 + 0x06, 0xD9, 0x0A, 0x06, // 248:1753 + 0x06, 0xE3, 0x0A, 0x06, // 249:1763 + 0x06, 0xED, 0x0A, 0x06, // 250:1773 + 0x06, 0xF7, 0x0A, 0x06, // 251:1783 + 0x07, 0x01, 0x0A, 0x06, // 252:1793 + 0x07, 0x0B, 0x09, 0x05, // 253:1803 + 0x07, 0x14, 0x0A, 0x06, // 254:1812 + 0x07, 0x1E, 0x09, 0x05, // 255:1822 + + // Font Data: + 0x00,0x00,0xF8,0x02, // 33 + 0x38,0x00,0x00,0x00,0x38, // 34 + 0xA0,0x03,0xE0,0x00,0xB8,0x03,0xE0,0x00,0xB8, // 35 + 0x30,0x01,0x28,0x02,0xF8,0x07,0x48,0x02,0x90,0x01, // 36 + 0x00,0x00,0x30,0x00,0x48,0x00,0x30,0x03,0xC0,0x00,0xB0,0x01,0x48,0x02,0x80,0x01, // 37 + 0x80,0x01,0x50,0x02,0x68,0x02,0xA8,0x02,0x18,0x01,0x80,0x03,0x80,0x02, // 38 + 0x38, // 39 + 0xE0,0x03,0x10,0x04,0x08,0x08, // 40 + 0x08,0x08,0x10,0x04,0xE0,0x03, // 41 + 0x28,0x00,0x18,0x00,0x28, // 42 + 0x40,0x00,0x40,0x00,0xF0,0x01,0x40,0x00,0x40, // 43 + 0x00,0x00,0x00,0x06, // 44 + 0x80,0x00,0x80, // 45 + 0x00,0x00,0x00,0x02, // 46 + 0x00,0x03,0xE0,0x00,0x18, // 47 + 0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 48 + 0x00,0x00,0x20,0x00,0x10,0x00,0xF8,0x03, // 49 + 0x10,0x02,0x08,0x03,0x88,0x02,0x48,0x02,0x30,0x02, // 50 + 0x10,0x01,0x08,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 51 + 0xC0,0x00,0xA0,0x00,0x90,0x00,0x88,0x00,0xF8,0x03,0x80, // 52 + 0x60,0x01,0x38,0x02,0x28,0x02,0x28,0x02,0xC8,0x01, // 53 + 0xF0,0x01,0x28,0x02,0x28,0x02,0x28,0x02,0xD0,0x01, // 54 + 0x08,0x00,0x08,0x03,0xC8,0x00,0x38,0x00,0x08, // 55 + 0xB0,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0xB0,0x01, // 56 + 0x70,0x01,0x88,0x02,0x88,0x02,0x88,0x02,0xF0,0x01, // 57 + 0x00,0x00,0x20,0x02, // 58 + 0x00,0x00,0x20,0x06, // 59 + 0x00,0x00,0x40,0x00,0xA0,0x00,0xA0,0x00,0x10,0x01, // 60 + 0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0,0x00,0xA0, // 61 + 0x00,0x00,0x10,0x01,0xA0,0x00,0xA0,0x00,0x40, // 62 + 0x10,0x00,0x08,0x00,0x08,0x00,0xC8,0x02,0x48,0x00,0x30, // 63 + 0x00,0x00,0xC0,0x03,0x30,0x04,0xD0,0x09,0x28,0x0A,0x28,0x0A,0xC8,0x0B,0x68,0x0A,0x10,0x05,0xE0,0x04, // 64 + 0x00,0x02,0xC0,0x01,0xB0,0x00,0x88,0x00,0xB0,0x00,0xC0,0x01,0x00,0x02, // 65 + 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0xF0,0x01, // 66 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x10,0x01, // 67 + 0x00,0x00,0xF8,0x03,0x08,0x02,0x08,0x02,0x10,0x01,0xE0, // 68 + 0x00,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02,0x48,0x02, // 69 + 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x08, // 70 + 0x00,0x00,0xE0,0x00,0x10,0x01,0x08,0x02,0x48,0x02,0x50,0x01,0xC0, // 71 + 0x00,0x00,0xF8,0x03,0x40,0x00,0x40,0x00,0x40,0x00,0xF8,0x03, // 72 + 0x00,0x00,0xF8,0x03, // 73 + 0x00,0x03,0x00,0x02,0x00,0x02,0xF8,0x01, // 74 + 0x00,0x00,0xF8,0x03,0x80,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 75 + 0x00,0x00,0xF8,0x03,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 76 + 0x00,0x00,0xF8,0x03,0x30,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x30,0x00,0xF8,0x03, // 77 + 0x00,0x00,0xF8,0x03,0x30,0x00,0x40,0x00,0x80,0x01,0xF8,0x03, // 78 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x02,0x08,0x02,0xF0,0x01, // 79 + 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0x48,0x00,0x30, // 80 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x02,0x08,0x03,0x08,0x03,0xF0,0x02, // 81 + 0x00,0x00,0xF8,0x03,0x48,0x00,0x48,0x00,0xC8,0x00,0x30,0x03, // 82 + 0x00,0x00,0x30,0x01,0x48,0x02,0x48,0x02,0x48,0x02,0x90,0x01, // 83 + 0x00,0x00,0x08,0x00,0x08,0x00,0xF8,0x03,0x08,0x00,0x08, // 84 + 0x00,0x00,0xF8,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x01, // 85 + 0x08,0x00,0x70,0x00,0x80,0x01,0x00,0x02,0x80,0x01,0x70,0x00,0x08, // 86 + 0x18,0x00,0xE0,0x01,0x00,0x02,0xF0,0x01,0x08,0x00,0xF0,0x01,0x00,0x02,0xE0,0x01,0x18, // 87 + 0x00,0x02,0x08,0x01,0x90,0x00,0x60,0x00,0x90,0x00,0x08,0x01,0x00,0x02, // 88 + 0x08,0x00,0x10,0x00,0x20,0x00,0xC0,0x03,0x20,0x00,0x10,0x00,0x08, // 89 + 0x08,0x03,0x88,0x02,0xC8,0x02,0x68,0x02,0x38,0x02,0x18,0x02, // 90 + 0x00,0x00,0xF8,0x0F,0x08,0x08, // 91 + 0x18,0x00,0xE0,0x00,0x00,0x03, // 92 + 0x08,0x08,0xF8,0x0F, // 93 + 0x40,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x40, // 94 + 0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08, // 95 + 0x08,0x00,0x10, // 96 + 0x00,0x00,0x00,0x03,0xA0,0x02,0xA0,0x02,0xE0,0x03, // 97 + 0x00,0x00,0xF8,0x03,0x20,0x02,0x20,0x02,0xC0,0x01, // 98 + 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0x40,0x01, // 99 + 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xF8,0x03, // 100 + 0x00,0x00,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 101 + 0x20,0x00,0xF0,0x03,0x28, // 102 + 0x00,0x00,0xC0,0x05,0x20,0x0A,0x20,0x0A,0xE0,0x07, // 103 + 0x00,0x00,0xF8,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 104 + 0x00,0x00,0xE8,0x03, // 105 + 0x00,0x08,0xE8,0x07, // 106 + 0xF8,0x03,0x80,0x00,0xC0,0x01,0x20,0x02, // 107 + 0x00,0x00,0xF8,0x03, // 108 + 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 109 + 0x00,0x00,0xE0,0x03,0x20,0x00,0x20,0x00,0xC0,0x03, // 110 + 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xC0,0x01, // 111 + 0x00,0x00,0xE0,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 112 + 0x00,0x00,0xC0,0x01,0x20,0x02,0x20,0x02,0xE0,0x0F, // 113 + 0x00,0x00,0xE0,0x03,0x20, // 114 + 0x40,0x02,0xA0,0x02,0xA0,0x02,0x20,0x01, // 115 + 0x20,0x00,0xF8,0x03,0x20,0x02, // 116 + 0x00,0x00,0xE0,0x01,0x00,0x02,0x00,0x02,0xE0,0x03, // 117 + 0x20,0x00,0xC0,0x01,0x00,0x02,0xC0,0x01,0x20, // 118 + 0xE0,0x01,0x00,0x02,0xC0,0x01,0x20,0x00,0xC0,0x01,0x00,0x02,0xE0,0x01, // 119 + 0x20,0x02,0x40,0x01,0x80,0x00,0x40,0x01,0x20,0x02, // 120 + 0x20,0x00,0xC0,0x09,0x00,0x06,0xC0,0x01,0x20, // 121 + 0x20,0x02,0x20,0x03,0xA0,0x02,0x60,0x02,0x20,0x02, // 122 + 0x80,0x00,0x78,0x0F,0x08,0x08, // 123 + 0x00,0x00,0xF8,0x0F, // 124 + 0x08,0x08,0x78,0x0F,0x80, // 125 + 0xC0,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0xC0, // 126 + 0x00,0x00,0xA0,0x0F, // 161 + 0x00,0x00,0xC0,0x01,0xA0,0x0F,0x78,0x02,0x40,0x01, // 162 + 0x40,0x02,0x70,0x03,0xC8,0x02,0x48,0x02,0x08,0x02,0x10,0x02, // 163 + 0x00,0x00,0xE0,0x01,0x20,0x01,0x20,0x01,0xE0,0x01, // 164 + 0x48,0x01,0x70,0x01,0xC0,0x03,0x70,0x01,0x48,0x01, // 165 + 0x00,0x00,0x38,0x0F, // 166 + 0xD0,0x04,0x28,0x09,0x48,0x09,0x48,0x0A,0x90,0x05, // 167 + 0x08,0x00,0x00,0x00,0x08, // 168 + 0xE0,0x00,0x10,0x01,0x48,0x02,0xA8,0x02,0xA8,0x02,0x10,0x01,0xE0, // 169 + 0x68,0x00,0x68,0x00,0x68,0x00,0x78, // 170 + 0x00,0x00,0x80,0x01,0x40,0x02,0x80,0x01,0x40,0x02, // 171 + 0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xE0, // 172 + 0x80,0x00,0x80, // 173 + 0xE0,0x00,0x10,0x01,0xE8,0x02,0x68,0x02,0xC8,0x02,0x10,0x01,0xE0, // 174 + 0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02, // 175 + 0x00,0x00,0x38,0x00,0x28,0x00,0x38, // 176 + 0x40,0x02,0x40,0x02,0xF0,0x03,0x40,0x02,0x40,0x02, // 177 + 0x48,0x00,0x68,0x00,0x58, // 178 + 0x48,0x00,0x58,0x00,0x68, // 179 + 0x00,0x00,0x10,0x00,0x08, // 180 + 0x00,0x00,0xE0,0x0F,0x00,0x02,0x00,0x02,0xE0,0x03, // 181 + 0x70,0x00,0xF8,0x0F,0x08,0x00,0xF8,0x0F,0x08, // 182 + 0x00,0x00,0x40, // 183 + 0x00,0x00,0x00,0x14,0x00,0x18, // 184 + 0x00,0x00,0x10,0x00,0x78, // 185 + 0x30,0x00,0x48,0x00,0x48,0x00,0x30, // 186 + 0x00,0x00,0x40,0x02,0x80,0x01,0x40,0x02,0x80,0x01, // 187 + 0x00,0x00,0x10,0x02,0x78,0x01,0xC0,0x00,0x20,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 188 + 0x00,0x00,0x10,0x02,0x78,0x01,0x80,0x00,0x60,0x00,0x50,0x02,0x48,0x03,0xC0,0x02, // 189 + 0x48,0x00,0x58,0x00,0x68,0x03,0x80,0x00,0x60,0x01,0x90,0x01,0xC8,0x03,0x00,0x01, // 190 + 0x00,0x00,0x00,0x06,0x00,0x09,0xA0,0x09,0x00,0x04, // 191 + 0x00,0x02,0xC0,0x01,0xB0,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 192 + 0x00,0x02,0xC0,0x01,0xB0,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 193 + 0x00,0x02,0xC0,0x01,0xB2,0x00,0x89,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 194 + 0x00,0x02,0xC2,0x01,0xB1,0x00,0x8A,0x00,0xB1,0x00,0xC0,0x01,0x00,0x02, // 195 + 0x00,0x02,0xC0,0x01,0xB2,0x00,0x88,0x00,0xB2,0x00,0xC0,0x01,0x00,0x02, // 196 + 0x00,0x02,0xC0,0x01,0xBE,0x00,0x8A,0x00,0xBE,0x00,0xC0,0x01,0x00,0x02, // 197 + 0x00,0x03,0xC0,0x00,0xE0,0x00,0x98,0x00,0x88,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x48,0x02, // 198 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x08,0x16,0x08,0x1A,0x10,0x01, // 199 + 0x00,0x00,0xF8,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 200 + 0x00,0x00,0xF8,0x03,0x48,0x02,0x4A,0x02,0x49,0x02,0x48,0x02, // 201 + 0x00,0x00,0xFA,0x03,0x49,0x02,0x4A,0x02,0x48,0x02,0x48,0x02, // 202 + 0x00,0x00,0xF8,0x03,0x4A,0x02,0x48,0x02,0x4A,0x02,0x48,0x02, // 203 + 0x00,0x00,0xF9,0x03,0x02, // 204 + 0x02,0x00,0xF9,0x03, // 205 + 0x01,0x00,0xFA,0x03, // 206 + 0x02,0x00,0xF8,0x03,0x02, // 207 + 0x40,0x00,0xF8,0x03,0x48,0x02,0x48,0x02,0x10,0x01,0xE0, // 208 + 0x00,0x00,0xFA,0x03,0x31,0x00,0x42,0x00,0x81,0x01,0xF8,0x03, // 209 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x09,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 210 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x08,0x02,0xF0,0x01, // 211 + 0x00,0x00,0xF0,0x01,0x08,0x02,0x0A,0x02,0x09,0x02,0x0A,0x02,0xF0,0x01, // 212 + 0x00,0x00,0xF0,0x01,0x0A,0x02,0x09,0x02,0x0A,0x02,0x09,0x02,0xF0,0x01, // 213 + 0x00,0x00,0xF0,0x01,0x0A,0x02,0x08,0x02,0x0A,0x02,0x08,0x02,0xF0,0x01, // 214 + 0x10,0x01,0xA0,0x00,0xE0,0x00,0xA0,0x00,0x10,0x01, // 215 + 0x00,0x00,0xF0,0x02,0x08,0x03,0xC8,0x02,0x28,0x02,0x18,0x03,0xE8, // 216 + 0x00,0x00,0xF8,0x01,0x01,0x02,0x02,0x02,0x00,0x02,0xF8,0x01, // 217 + 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x00,0x02,0xF8,0x01, // 218 + 0x00,0x00,0xF8,0x01,0x02,0x02,0x01,0x02,0x02,0x02,0xF8,0x01, // 219 + 0x00,0x00,0xF8,0x01,0x02,0x02,0x00,0x02,0x02,0x02,0xF8,0x01, // 220 + 0x08,0x00,0x10,0x00,0x20,0x00,0xC2,0x03,0x21,0x00,0x10,0x00,0x08, // 221 + 0x00,0x00,0xF8,0x03,0x10,0x01,0x10,0x01,0x10,0x01,0xE0, // 222 + 0x00,0x00,0xF0,0x03,0x08,0x01,0x48,0x02,0xB0,0x02,0x80,0x01, // 223 + 0x00,0x00,0x00,0x03,0xA4,0x02,0xA8,0x02,0xE0,0x03, // 224 + 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE0,0x03, // 225 + 0x00,0x00,0x00,0x03,0xA8,0x02,0xA4,0x02,0xE8,0x03, // 226 + 0x00,0x00,0x08,0x03,0xA4,0x02,0xA8,0x02,0xE4,0x03, // 227 + 0x00,0x00,0x00,0x03,0xA8,0x02,0xA0,0x02,0xE8,0x03, // 228 + 0x00,0x00,0x00,0x03,0xAE,0x02,0xAA,0x02,0xEE,0x03, // 229 + 0x00,0x00,0x40,0x03,0xA0,0x02,0xA0,0x02,0xC0,0x01,0xA0,0x02,0xA0,0x02,0xC0,0x02, // 230 + 0x00,0x00,0xC0,0x01,0x20,0x16,0x20,0x1A,0x40,0x01, // 231 + 0x00,0x00,0xC0,0x01,0xA4,0x02,0xA8,0x02,0xC0,0x02, // 232 + 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC0,0x02, // 233 + 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA4,0x02,0xC8,0x02, // 234 + 0x00,0x00,0xC0,0x01,0xA8,0x02,0xA0,0x02,0xC8,0x02, // 235 + 0x00,0x00,0xE4,0x03,0x08, // 236 + 0x08,0x00,0xE4,0x03, // 237 + 0x08,0x00,0xE4,0x03,0x08, // 238 + 0x08,0x00,0xE0,0x03,0x08, // 239 + 0x00,0x00,0xC0,0x01,0x28,0x02,0x38,0x02,0xE0,0x01, // 240 + 0x00,0x00,0xE8,0x03,0x24,0x00,0x28,0x00,0xC4,0x03, // 241 + 0x00,0x00,0xC0,0x01,0x24,0x02,0x28,0x02,0xC0,0x01, // 242 + 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC0,0x01, // 243 + 0x00,0x00,0xC0,0x01,0x28,0x02,0x24,0x02,0xC8,0x01, // 244 + 0x00,0x00,0xC8,0x01,0x24,0x02,0x28,0x02,0xC4,0x01, // 245 + 0x00,0x00,0xC0,0x01,0x28,0x02,0x20,0x02,0xC8,0x01, // 246 + 0x40,0x00,0x40,0x00,0x50,0x01,0x40,0x00,0x40, // 247 + 0x00,0x00,0xC0,0x02,0xA0,0x03,0x60,0x02,0xA0,0x01, // 248 + 0x00,0x00,0xE0,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 249 + 0x00,0x00,0xE0,0x01,0x08,0x02,0x04,0x02,0xE0,0x03, // 250 + 0x00,0x00,0xE8,0x01,0x04,0x02,0x08,0x02,0xE0,0x03, // 251 + 0x00,0x00,0xE0,0x01,0x08,0x02,0x00,0x02,0xE8,0x03, // 252 + 0x20,0x00,0xC0,0x09,0x08,0x06,0xC4,0x01,0x20, // 253 + 0x00,0x00,0xF8,0x0F,0x20,0x02,0x20,0x02,0xC0,0x01, // 254 + 0x20,0x00,0xC8,0x09,0x00,0x06,0xC8,0x01,0x20 // 255 +}; + +const uint8_t ArialMT_Plain_16[] PROGMEM = { + 0x10, // Width: 16 + 0x13, // Height: 19 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x04, // 32:65535 + 0x00, 0x00, 0x08, 0x04, // 33:0 + 0x00, 0x08, 0x0D, 0x06, // 34:8 + 0x00, 0x15, 0x1A, 0x09, // 35:21 + 0x00, 0x2F, 0x17, 0x09, // 36:47 + 0x00, 0x46, 0x26, 0x0E, // 37:70 + 0x00, 0x6C, 0x1D, 0x0B, // 38:108 + 0x00, 0x89, 0x04, 0x03, // 39:137 + 0x00, 0x8D, 0x0C, 0x05, // 40:141 + 0x00, 0x99, 0x0B, 0x05, // 41:153 + 0x00, 0xA4, 0x0D, 0x06, // 42:164 + 0x00, 0xB1, 0x17, 0x09, // 43:177 + 0x00, 0xC8, 0x09, 0x04, // 44:200 + 0x00, 0xD1, 0x0B, 0x05, // 45:209 + 0x00, 0xDC, 0x08, 0x04, // 46:220 + 0x00, 0xE4, 0x0A, 0x04, // 47:228 + 0x00, 0xEE, 0x17, 0x09, // 48:238 + 0x01, 0x05, 0x11, 0x09, // 49:261 + 0x01, 0x16, 0x17, 0x09, // 50:278 + 0x01, 0x2D, 0x17, 0x09, // 51:301 + 0x01, 0x44, 0x17, 0x09, // 52:324 + 0x01, 0x5B, 0x17, 0x09, // 53:347 + 0x01, 0x72, 0x17, 0x09, // 54:370 + 0x01, 0x89, 0x16, 0x09, // 55:393 + 0x01, 0x9F, 0x17, 0x09, // 56:415 + 0x01, 0xB6, 0x17, 0x09, // 57:438 + 0x01, 0xCD, 0x05, 0x04, // 58:461 + 0x01, 0xD2, 0x06, 0x04, // 59:466 + 0x01, 0xD8, 0x17, 0x09, // 60:472 + 0x01, 0xEF, 0x17, 0x09, // 61:495 + 0x02, 0x06, 0x17, 0x09, // 62:518 + 0x02, 0x1D, 0x16, 0x09, // 63:541 + 0x02, 0x33, 0x2F, 0x10, // 64:563 + 0x02, 0x62, 0x1D, 0x0B, // 65:610 + 0x02, 0x7F, 0x1D, 0x0B, // 66:639 + 0x02, 0x9C, 0x20, 0x0C, // 67:668 + 0x02, 0xBC, 0x20, 0x0C, // 68:700 + 0x02, 0xDC, 0x1D, 0x0B, // 69:732 + 0x02, 0xF9, 0x19, 0x0A, // 70:761 + 0x03, 0x12, 0x20, 0x0C, // 71:786 + 0x03, 0x32, 0x1D, 0x0C, // 72:818 + 0x03, 0x4F, 0x05, 0x04, // 73:847 + 0x03, 0x54, 0x14, 0x08, // 74:852 + 0x03, 0x68, 0x1D, 0x0B, // 75:872 + 0x03, 0x85, 0x17, 0x09, // 76:901 + 0x03, 0x9C, 0x23, 0x0D, // 77:924 + 0x03, 0xBF, 0x1D, 0x0C, // 78:959 + 0x03, 0xDC, 0x20, 0x0C, // 79:988 + 0x03, 0xFC, 0x1C, 0x0B, // 80:1020 + 0x04, 0x18, 0x20, 0x0C, // 81:1048 + 0x04, 0x38, 0x1D, 0x0C, // 82:1080 + 0x04, 0x55, 0x1D, 0x0B, // 83:1109 + 0x04, 0x72, 0x19, 0x0A, // 84:1138 + 0x04, 0x8B, 0x1D, 0x0C, // 85:1163 + 0x04, 0xA8, 0x1C, 0x0B, // 86:1192 + 0x04, 0xC4, 0x2B, 0x0F, // 87:1220 + 0x04, 0xEF, 0x20, 0x0B, // 88:1263 + 0x05, 0x0F, 0x19, 0x0B, // 89:1295 + 0x05, 0x28, 0x1A, 0x0A, // 90:1320 + 0x05, 0x42, 0x0C, 0x04, // 91:1346 + 0x05, 0x4E, 0x0B, 0x04, // 92:1358 + 0x05, 0x59, 0x09, 0x04, // 93:1369 + 0x05, 0x62, 0x14, 0x08, // 94:1378 + 0x05, 0x76, 0x1B, 0x09, // 95:1398 + 0x05, 0x91, 0x07, 0x05, // 96:1425 + 0x05, 0x98, 0x17, 0x09, // 97:1432 + 0x05, 0xAF, 0x17, 0x09, // 98:1455 + 0x05, 0xC6, 0x14, 0x08, // 99:1478 + 0x05, 0xDA, 0x17, 0x09, // 100:1498 + 0x05, 0xF1, 0x17, 0x09, // 101:1521 + 0x06, 0x08, 0x0A, 0x04, // 102:1544 + 0x06, 0x12, 0x17, 0x09, // 103:1554 + 0x06, 0x29, 0x14, 0x09, // 104:1577 + 0x06, 0x3D, 0x05, 0x04, // 105:1597 + 0x06, 0x42, 0x06, 0x04, // 106:1602 + 0x06, 0x48, 0x17, 0x08, // 107:1608 + 0x06, 0x5F, 0x05, 0x04, // 108:1631 + 0x06, 0x64, 0x23, 0x0D, // 109:1636 + 0x06, 0x87, 0x14, 0x09, // 110:1671 + 0x06, 0x9B, 0x17, 0x09, // 111:1691 + 0x06, 0xB2, 0x17, 0x09, // 112:1714 + 0x06, 0xC9, 0x18, 0x09, // 113:1737 + 0x06, 0xE1, 0x0D, 0x05, // 114:1761 + 0x06, 0xEE, 0x14, 0x08, // 115:1774 + 0x07, 0x02, 0x0B, 0x04, // 116:1794 + 0x07, 0x0D, 0x14, 0x09, // 117:1805 + 0x07, 0x21, 0x13, 0x08, // 118:1825 + 0x07, 0x34, 0x1F, 0x0C, // 119:1844 + 0x07, 0x53, 0x14, 0x08, // 120:1875 + 0x07, 0x67, 0x13, 0x08, // 121:1895 + 0x07, 0x7A, 0x14, 0x08, // 122:1914 + 0x07, 0x8E, 0x0F, 0x05, // 123:1934 + 0x07, 0x9D, 0x06, 0x04, // 124:1949 + 0x07, 0xA3, 0x0E, 0x05, // 125:1955 + 0x07, 0xB1, 0x17, 0x09, // 126:1969 + 0xFF, 0xFF, 0x00, 0x00, // 127:65535 + 0xFF, 0xFF, 0x00, 0x10, // 128:65535 + 0xFF, 0xFF, 0x00, 0x10, // 129:65535 + 0xFF, 0xFF, 0x00, 0x10, // 130:65535 + 0xFF, 0xFF, 0x00, 0x10, // 131:65535 + 0xFF, 0xFF, 0x00, 0x10, // 132:65535 + 0xFF, 0xFF, 0x00, 0x10, // 133:65535 + 0xFF, 0xFF, 0x00, 0x10, // 134:65535 + 0xFF, 0xFF, 0x00, 0x10, // 135:65535 + 0xFF, 0xFF, 0x00, 0x10, // 136:65535 + 0xFF, 0xFF, 0x00, 0x10, // 137:65535 + 0xFF, 0xFF, 0x00, 0x10, // 138:65535 + 0xFF, 0xFF, 0x00, 0x10, // 139:65535 + 0xFF, 0xFF, 0x00, 0x10, // 140:65535 + 0xFF, 0xFF, 0x00, 0x10, // 141:65535 + 0xFF, 0xFF, 0x00, 0x10, // 142:65535 + 0xFF, 0xFF, 0x00, 0x10, // 143:65535 + 0xFF, 0xFF, 0x00, 0x10, // 144:65535 + 0xFF, 0xFF, 0x00, 0x10, // 145:65535 + 0xFF, 0xFF, 0x00, 0x10, // 146:65535 + 0xFF, 0xFF, 0x00, 0x10, // 147:65535 + 0xFF, 0xFF, 0x00, 0x10, // 148:65535 + 0xFF, 0xFF, 0x00, 0x10, // 149:65535 + 0xFF, 0xFF, 0x00, 0x10, // 150:65535 + 0xFF, 0xFF, 0x00, 0x10, // 151:65535 + 0xFF, 0xFF, 0x00, 0x10, // 152:65535 + 0xFF, 0xFF, 0x00, 0x10, // 153:65535 + 0xFF, 0xFF, 0x00, 0x10, // 154:65535 + 0xFF, 0xFF, 0x00, 0x10, // 155:65535 + 0xFF, 0xFF, 0x00, 0x10, // 156:65535 + 0xFF, 0xFF, 0x00, 0x10, // 157:65535 + 0xFF, 0xFF, 0x00, 0x10, // 158:65535 + 0xFF, 0xFF, 0x00, 0x10, // 159:65535 + 0xFF, 0xFF, 0x00, 0x04, // 160:65535 + 0x07, 0xC8, 0x09, 0x05, // 161:1992 + 0x07, 0xD1, 0x17, 0x09, // 162:2001 + 0x07, 0xE8, 0x17, 0x09, // 163:2024 + 0x07, 0xFF, 0x14, 0x09, // 164:2047 + 0x08, 0x13, 0x1A, 0x09, // 165:2067 + 0x08, 0x2D, 0x06, 0x04, // 166:2093 + 0x08, 0x33, 0x17, 0x09, // 167:2099 + 0x08, 0x4A, 0x07, 0x05, // 168:2122 + 0x08, 0x51, 0x23, 0x0C, // 169:2129 + 0x08, 0x74, 0x0E, 0x06, // 170:2164 + 0x08, 0x82, 0x14, 0x09, // 171:2178 + 0x08, 0x96, 0x17, 0x09, // 172:2198 + 0x08, 0xAD, 0x0B, 0x05, // 173:2221 + 0x08, 0xB8, 0x23, 0x0C, // 174:2232 + 0x08, 0xDB, 0x19, 0x09, // 175:2267 + 0x08, 0xF4, 0x0D, 0x06, // 176:2292 + 0x09, 0x01, 0x17, 0x09, // 177:2305 + 0x09, 0x18, 0x0E, 0x05, // 178:2328 + 0x09, 0x26, 0x0D, 0x05, // 179:2342 + 0x09, 0x33, 0x0A, 0x05, // 180:2355 + 0x09, 0x3D, 0x17, 0x09, // 181:2365 + 0x09, 0x54, 0x19, 0x09, // 182:2388 + 0x09, 0x6D, 0x08, 0x05, // 183:2413 + 0x09, 0x75, 0x0C, 0x05, // 184:2421 + 0x09, 0x81, 0x0B, 0x05, // 185:2433 + 0x09, 0x8C, 0x0D, 0x06, // 186:2444 + 0x09, 0x99, 0x17, 0x09, // 187:2457 + 0x09, 0xB0, 0x26, 0x0D, // 188:2480 + 0x09, 0xD6, 0x26, 0x0D, // 189:2518 + 0x09, 0xFC, 0x26, 0x0D, // 190:2556 + 0x0A, 0x22, 0x1A, 0x0A, // 191:2594 + 0x0A, 0x3C, 0x1D, 0x0B, // 192:2620 + 0x0A, 0x59, 0x1D, 0x0B, // 193:2649 + 0x0A, 0x76, 0x1D, 0x0B, // 194:2678 + 0x0A, 0x93, 0x1D, 0x0B, // 195:2707 + 0x0A, 0xB0, 0x1D, 0x0B, // 196:2736 + 0x0A, 0xCD, 0x1D, 0x0B, // 197:2765 + 0x0A, 0xEA, 0x2C, 0x10, // 198:2794 + 0x0B, 0x16, 0x20, 0x0C, // 199:2838 + 0x0B, 0x36, 0x1D, 0x0B, // 200:2870 + 0x0B, 0x53, 0x1D, 0x0B, // 201:2899 + 0x0B, 0x70, 0x1D, 0x0B, // 202:2928 + 0x0B, 0x8D, 0x1D, 0x0B, // 203:2957 + 0x0B, 0xAA, 0x05, 0x04, // 204:2986 + 0x0B, 0xAF, 0x07, 0x04, // 205:2991 + 0x0B, 0xB6, 0x0A, 0x04, // 206:2998 + 0x0B, 0xC0, 0x07, 0x04, // 207:3008 + 0x0B, 0xC7, 0x20, 0x0C, // 208:3015 + 0x0B, 0xE7, 0x1D, 0x0C, // 209:3047 + 0x0C, 0x04, 0x20, 0x0C, // 210:3076 + 0x0C, 0x24, 0x20, 0x0C, // 211:3108 + 0x0C, 0x44, 0x20, 0x0C, // 212:3140 + 0x0C, 0x64, 0x20, 0x0C, // 213:3172 + 0x0C, 0x84, 0x20, 0x0C, // 214:3204 + 0x0C, 0xA4, 0x17, 0x09, // 215:3236 + 0x0C, 0xBB, 0x20, 0x0C, // 216:3259 + 0x0C, 0xDB, 0x1D, 0x0C, // 217:3291 + 0x0C, 0xF8, 0x1D, 0x0C, // 218:3320 + 0x0D, 0x15, 0x1D, 0x0C, // 219:3349 + 0x0D, 0x32, 0x1D, 0x0C, // 220:3378 + 0x0D, 0x4F, 0x19, 0x0B, // 221:3407 + 0x0D, 0x68, 0x1D, 0x0B, // 222:3432 + 0x0D, 0x85, 0x17, 0x0A, // 223:3461 + 0x0D, 0x9C, 0x17, 0x09, // 224:3484 + 0x0D, 0xB3, 0x17, 0x09, // 225:3507 + 0x0D, 0xCA, 0x17, 0x09, // 226:3530 + 0x0D, 0xE1, 0x17, 0x09, // 227:3553 + 0x0D, 0xF8, 0x17, 0x09, // 228:3576 + 0x0E, 0x0F, 0x17, 0x09, // 229:3599 + 0x0E, 0x26, 0x29, 0x0E, // 230:3622 + 0x0E, 0x4F, 0x14, 0x08, // 231:3663 + 0x0E, 0x63, 0x17, 0x09, // 232:3683 + 0x0E, 0x7A, 0x17, 0x09, // 233:3706 + 0x0E, 0x91, 0x17, 0x09, // 234:3729 + 0x0E, 0xA8, 0x17, 0x09, // 235:3752 + 0x0E, 0xBF, 0x05, 0x04, // 236:3775 + 0x0E, 0xC4, 0x07, 0x04, // 237:3780 + 0x0E, 0xCB, 0x0A, 0x04, // 238:3787 + 0x0E, 0xD5, 0x07, 0x04, // 239:3797 + 0x0E, 0xDC, 0x17, 0x09, // 240:3804 + 0x0E, 0xF3, 0x14, 0x09, // 241:3827 + 0x0F, 0x07, 0x17, 0x09, // 242:3847 + 0x0F, 0x1E, 0x17, 0x09, // 243:3870 + 0x0F, 0x35, 0x17, 0x09, // 244:3893 + 0x0F, 0x4C, 0x17, 0x09, // 245:3916 + 0x0F, 0x63, 0x17, 0x09, // 246:3939 + 0x0F, 0x7A, 0x17, 0x09, // 247:3962 + 0x0F, 0x91, 0x17, 0x0A, // 248:3985 + 0x0F, 0xA8, 0x14, 0x09, // 249:4008 + 0x0F, 0xBC, 0x14, 0x09, // 250:4028 + 0x0F, 0xD0, 0x14, 0x09, // 251:4048 + 0x0F, 0xE4, 0x14, 0x09, // 252:4068 + 0x0F, 0xF8, 0x13, 0x08, // 253:4088 + 0x10, 0x0B, 0x17, 0x09, // 254:4107 + 0x10, 0x22, 0x13, 0x08, // 255:4130 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x5F, // 33 + 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78, // 34 + 0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08,0x00,0x80,0x78,0x00,0xC0,0x0F,0x00,0xB8,0x08,0x00,0x80,0x08, // 35 + 0x00,0x00,0x00,0xE0,0x10,0x00,0x10,0x21,0x00,0x08,0x41,0x00,0xFC,0xFF,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 36 + 0x00,0x00,0x00,0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x61,0x00,0xF0,0x18,0x00,0x00,0x06,0x00,0xC0,0x01,0x00,0x30,0x3C,0x00,0x08,0x42,0x00,0x00,0x42,0x00,0x00,0x42,0x00,0x00,0x3C, // 37 + 0x00,0x00,0x00,0x00,0x1C,0x00,0x70,0x22,0x00,0x88,0x41,0x00,0x08,0x43,0x00,0x88,0x44,0x00,0x70,0x28,0x00,0x00,0x10,0x00,0x00,0x28,0x00,0x00,0x44, // 38 + 0x00,0x00,0x00,0x78, // 39 + 0x00,0x00,0x00,0x80,0x3F,0x00,0x70,0xC0,0x01,0x08,0x00,0x02, // 40 + 0x00,0x00,0x00,0x08,0x00,0x02,0x70,0xC0,0x01,0x80,0x3F, // 41 + 0x10,0x00,0x00,0xD0,0x00,0x00,0x38,0x00,0x00,0xD0,0x00,0x00,0x10, // 42 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0xC0,0x1F,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01, // 44 + 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40, // 46 + 0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 47 + 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xE0,0x1F, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x10,0x00,0x00,0xF8,0x7F, // 49 + 0x00,0x00,0x00,0x20,0x40,0x00,0x10,0x60,0x00,0x08,0x50,0x00,0x08,0x48,0x00,0x08,0x44,0x00,0x10,0x43,0x00,0xE0,0x40, // 50 + 0x00,0x00,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x88,0x41,0x00,0xF0,0x22,0x00,0x00,0x1C, // 51 + 0x00,0x0C,0x00,0x00,0x0A,0x00,0x00,0x09,0x00,0xC0,0x08,0x00,0x20,0x08,0x00,0x10,0x08,0x00,0xF8,0x7F,0x00,0x00,0x08, // 52 + 0x00,0x00,0x00,0xC0,0x11,0x00,0xB8,0x20,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x08,0x21,0x00,0x08,0x1E, // 53 + 0x00,0x00,0x00,0xE0,0x1F,0x00,0x10,0x21,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x88,0x40,0x00,0x10,0x21,0x00,0x20,0x1E, // 54 + 0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x78,0x00,0x08,0x07,0x00,0xC8,0x00,0x00,0x28,0x00,0x00,0x18, // 55 + 0x00,0x00,0x00,0x60,0x1C,0x00,0x90,0x22,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 56 + 0x00,0x00,0x00,0xE0,0x11,0x00,0x10,0x22,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x08,0x44,0x00,0x10,0x22,0x00,0xE0,0x1F, // 57 + 0x00,0x00,0x00,0x40,0x40, // 58 + 0x00,0x00,0x00,0x40,0xC0,0x01, // 59 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x40,0x10, // 60 + 0x00,0x00,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08, // 61 + 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x02, // 62 + 0x00,0x00,0x00,0x60,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0x08,0x5C,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 63 + 0x00,0x00,0x00,0x00,0x3F,0x00,0xC0,0x40,0x00,0x20,0x80,0x00,0x10,0x1E,0x01,0x10,0x21,0x01,0x88,0x40,0x02,0x48,0x40,0x02,0x48,0x40,0x02,0x48,0x20,0x02,0x88,0x7C,0x02,0xC8,0x43,0x02,0x10,0x40,0x02,0x10,0x20,0x01,0x60,0x10,0x01,0x80,0x8F, // 64 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x08,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 65 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x90,0x22,0x00,0x60,0x1C, // 66 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 67 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 68 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 69 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08, // 70 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x12,0x00,0x00,0x0E, // 71 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0xF8,0x7F, // 72 + 0x00,0x00,0x00,0xF8,0x7F, // 73 + 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0xF8,0x3F, // 74 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x04,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0x80,0x03,0x00,0x40,0x04,0x00,0x20,0x18,0x00,0x10,0x20,0x00,0x08,0x40, // 75 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40, // 76 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0xF8,0x7F, // 77 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x80,0x00,0x00,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 78 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 79 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x10,0x01,0x00,0xE0, // 80 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x08,0x50,0x00,0x08,0x50,0x00,0x10,0x20,0x00,0x20,0x70,0x00,0xC0,0x4F, // 81 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x02,0x00,0x08,0x06,0x00,0x08,0x1A,0x00,0x10,0x21,0x00,0xE0,0x40, // 82 + 0x00,0x00,0x00,0x60,0x10,0x00,0x90,0x20,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x10,0x22,0x00,0x20,0x1C, // 83 + 0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0x7F,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 84 + 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 85 + 0x00,0x00,0x00,0x18,0x00,0x00,0xE0,0x00,0x00,0x00,0x07,0x00,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x07,0x00,0xE0,0x00,0x00,0x18, // 86 + 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x03,0x00,0x70,0x00,0x00,0x08,0x00,0x00,0x70,0x00,0x00,0x80,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1E,0x00,0xE0,0x01,0x00,0x18, // 87 + 0x00,0x40,0x00,0x08,0x20,0x00,0x10,0x10,0x00,0x60,0x0C,0x00,0x80,0x02,0x00,0x00,0x01,0x00,0x80,0x02,0x00,0x60,0x0C,0x00,0x10,0x10,0x00,0x08,0x20,0x00,0x00,0x40, // 88 + 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x00,0x7E,0x00,0x80,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 89 + 0x00,0x40,0x00,0x08,0x60,0x00,0x08,0x58,0x00,0x08,0x44,0x00,0x08,0x43,0x00,0x88,0x40,0x00,0x68,0x40,0x00,0x18,0x40,0x00,0x08,0x40, // 90 + 0x00,0x00,0x00,0xF8,0xFF,0x03,0x08,0x00,0x02,0x08,0x00,0x02, // 91 + 0x18,0x00,0x00,0xE0,0x01,0x00,0x00,0x1E,0x00,0x00,0x60, // 92 + 0x08,0x00,0x02,0x08,0x00,0x02,0xF8,0xFF,0x03, // 93 + 0x00,0x01,0x00,0xC0,0x00,0x00,0x30,0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,0xC0,0x00,0x00,0x00,0x01, // 94 + 0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 95 + 0x00,0x00,0x00,0x08,0x00,0x00,0x10, // 96 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 97 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 98 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20, // 99 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xF8,0x7F, // 100 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 101 + 0x40,0x00,0x00,0xF0,0x7F,0x00,0x48,0x00,0x00,0x48, // 102 + 0x00,0x00,0x00,0x00,0x1F,0x01,0x80,0x20,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x40,0x40,0x02,0x80,0x20,0x01,0xC0,0xFF, // 103 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 104 + 0x00,0x00,0x00,0xC8,0x7F, // 105 + 0x00,0x00,0x02,0xC8,0xFF,0x01, // 106 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x06,0x00,0x00,0x19,0x00,0x80,0x20,0x00,0x40,0x40, // 107 + 0x00,0x00,0x00,0xF8,0x7F, // 108 + 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 109 + 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x80,0x7F, // 110 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 111 + 0x00,0x00,0x00,0xC0,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 112 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0xC0,0xFF,0x03, // 113 + 0x00,0x00,0x00,0xC0,0x7F,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x40, // 114 + 0x00,0x00,0x00,0x80,0x23,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x38, // 115 + 0x40,0x00,0x00,0xF0,0x7F,0x00,0x40,0x40,0x00,0x40,0x40, // 116 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 117 + 0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0, // 118 + 0xC0,0x00,0x00,0x00,0x1F,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x1C,0x00,0x00,0x60,0x00,0x00,0x1F,0x00,0xC0, // 119 + 0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x40,0x40, // 120 + 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x00,0xE0,0x01,0x00,0x38,0x00,0x00,0x07,0x00,0xC0, // 121 + 0x40,0x40,0x00,0x40,0x60,0x00,0x40,0x58,0x00,0x40,0x44,0x00,0x40,0x43,0x00,0xC0,0x40,0x00,0x40,0x40, // 122 + 0x00,0x04,0x00,0x00,0x04,0x00,0xF0,0xFB,0x01,0x08,0x00,0x02,0x08,0x00,0x02, // 123 + 0x00,0x00,0x00,0xF8,0xFF,0x03, // 124 + 0x08,0x00,0x02,0x08,0x00,0x02,0xF0,0xFB,0x01,0x00,0x04,0x00,0x00,0x04, // 125 + 0x00,0x02,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xFF,0x03, // 161 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x03,0x40,0xF0,0x00,0x40,0x4E,0x00,0xC0,0x41,0x00,0xB8,0x20,0x00,0x00,0x11, // 162 + 0x00,0x41,0x00,0xE0,0x31,0x00,0x10,0x2F,0x00,0x08,0x21,0x00,0x08,0x21,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x20,0x20, // 163 + 0x00,0x00,0x00,0x40,0x0B,0x00,0x80,0x04,0x00,0x40,0x08,0x00,0x40,0x08,0x00,0x80,0x04,0x00,0x40,0x0B, // 164 + 0x08,0x0A,0x00,0x10,0x0A,0x00,0x60,0x0A,0x00,0x80,0x0B,0x00,0x00,0x7E,0x00,0x80,0x0B,0x00,0x60,0x0A,0x00,0x10,0x0A,0x00,0x08,0x0A, // 165 + 0x00,0x00,0x00,0xF8,0xF1,0x03, // 166 + 0x00,0x86,0x00,0x70,0x09,0x01,0xC8,0x10,0x02,0x88,0x10,0x02,0x08,0x21,0x02,0x08,0x61,0x02,0x30,0xD2,0x01,0x00,0x0C, // 167 + 0x08,0x00,0x00,0x00,0x00,0x00,0x08, // 168 + 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xC8,0x47,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x28,0x48,0x00,0x48,0x44,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 169 + 0xD0,0x00,0x00,0x48,0x01,0x00,0x28,0x01,0x00,0x28,0x01,0x00,0xF0,0x01, // 170 + 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20,0x00,0x00,0x04,0x00,0x00,0x1B,0x00,0x80,0x20, // 171 + 0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x0F, // 172 + 0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x08, // 173 + 0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0xE8,0x4F,0x00,0x28,0x41,0x00,0x28,0x41,0x00,0x28,0x43,0x00,0x28,0x45,0x00,0xC8,0x48,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 174 + 0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04, // 175 + 0x00,0x00,0x00,0x30,0x00,0x00,0x48,0x00,0x00,0x48,0x00,0x00,0x30, // 176 + 0x00,0x00,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0xE0,0x4F,0x00,0x00,0x41,0x00,0x00,0x41,0x00,0x00,0x41, // 177 + 0x10,0x01,0x00,0x88,0x01,0x00,0x48,0x01,0x00,0x48,0x01,0x00,0x30,0x01, // 178 + 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x28,0x01,0x00,0xD8, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x08, // 180 + 0x00,0x00,0x00,0xC0,0xFF,0x03,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 181 + 0xF0,0x00,0x00,0xF8,0x00,0x00,0xF8,0x01,0x00,0xF8,0x01,0x00,0xF8,0xFF,0x03,0x08,0x00,0x00,0x08,0x00,0x00,0xF8,0xFF,0x03,0x08, // 182 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02, // 183 + 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x02,0x00,0x00,0x03, // 184 + 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x00,0x00,0xF8,0x01, // 185 + 0xF0,0x00,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0x08,0x01,0x00,0xF0, // 186 + 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04,0x00,0x80,0x20,0x00,0x00,0x1B,0x00,0x00,0x04, // 187 + 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x21,0x00,0x00,0x10,0x00,0x00,0x0C,0x00,0x00,0x02,0x00,0x80,0x01,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 188 + 0x00,0x00,0x00,0x10,0x00,0x00,0x08,0x40,0x00,0xF8,0x31,0x00,0x00,0x08,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x60,0x44,0x00,0x10,0x62,0x00,0x08,0x52,0x00,0x00,0x52,0x00,0x00,0x4C, // 189 + 0x90,0x00,0x00,0x08,0x01,0x00,0x08,0x41,0x00,0x28,0x21,0x00,0xD8,0x18,0x00,0x00,0x04,0x00,0x00,0x03,0x00,0x80,0x00,0x00,0x40,0x30,0x00,0x30,0x28,0x00,0x08,0x24,0x00,0x00,0x7E,0x00,0x00,0x20, // 190 + 0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x10,0x01,0x00,0x08,0x02,0x40,0x07,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x01,0x00,0xC0, // 191 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x71,0x04,0x00,0x0A,0x04,0x00,0x70,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 192 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x70,0x04,0x00,0x0A,0x04,0x00,0x71,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 193 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x71,0x04,0x00,0x82,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 194 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x09,0x04,0x00,0x72,0x04,0x00,0x81,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 195 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x72,0x04,0x00,0x08,0x04,0x00,0x72,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 196 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x1C,0x00,0x80,0x07,0x00,0x7E,0x04,0x00,0x0A,0x04,0x00,0x7E,0x04,0x00,0x80,0x07,0x00,0x00,0x1C,0x00,0x00,0x60, // 197 + 0x00,0x60,0x00,0x00,0x18,0x00,0x00,0x06,0x00,0x80,0x05,0x00,0x60,0x04,0x00,0x18,0x04,0x00,0x08,0x04,0x00,0x08,0x04,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41, // 198 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x08,0x40,0x02,0x08,0xC0,0x02,0x08,0x40,0x03,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10, // 199 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 200 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 201 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x09,0x41,0x00,0x09,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 202 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x0A,0x41,0x00,0x08,0x41,0x00,0x08,0x41,0x00,0x08,0x40, // 203 + 0x01,0x00,0x00,0xFA,0x7F, // 204 + 0x00,0x00,0x00,0xFA,0x7F,0x00,0x01, // 205 + 0x02,0x00,0x00,0xF9,0x7F,0x00,0x01,0x00,0x00,0x02, // 206 + 0x02,0x00,0x00,0xF8,0x7F,0x00,0x02, // 207 + 0x00,0x02,0x00,0xF8,0x7F,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x42,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 208 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x10,0x00,0x00,0x60,0x00,0x00,0x82,0x00,0x00,0x01,0x03,0x00,0x02,0x04,0x00,0x01,0x18,0x00,0x00,0x20,0x00,0xF8,0x7F, // 209 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 210 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 211 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 212 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x0A,0x40,0x00,0x09,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 213 + 0x00,0x00,0x00,0xC0,0x0F,0x00,0x20,0x10,0x00,0x10,0x20,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x08,0x40,0x00,0x0A,0x40,0x00,0x10,0x20,0x00,0x20,0x10,0x00,0xC0,0x0F, // 214 + 0x00,0x00,0x00,0x40,0x10,0x00,0x80,0x08,0x00,0x00,0x05,0x00,0x00,0x07,0x00,0x00,0x05,0x00,0x80,0x08,0x00,0x40,0x10, // 215 + 0x00,0x00,0x00,0xC0,0x4F,0x00,0x20,0x30,0x00,0x10,0x30,0x00,0x08,0x4C,0x00,0x08,0x42,0x00,0x08,0x41,0x00,0xC8,0x40,0x00,0x30,0x20,0x00,0x30,0x10,0x00,0xC8,0x0F, // 216 + 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 217 + 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 218 + 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x01,0x40,0x00,0x01,0x40,0x00,0x02,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 219 + 0x00,0x00,0x00,0xF8,0x1F,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x02,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xF8,0x1F, // 220 + 0x08,0x00,0x00,0x30,0x00,0x00,0x40,0x00,0x00,0x80,0x01,0x00,0x02,0x7E,0x00,0x81,0x01,0x00,0x40,0x00,0x00,0x30,0x00,0x00,0x08, // 221 + 0x00,0x00,0x00,0xF8,0x7F,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x20,0x10,0x00,0x40,0x08,0x00,0x80,0x07, // 222 + 0x00,0x00,0x00,0xE0,0x7F,0x00,0x10,0x00,0x00,0x08,0x20,0x00,0x88,0x43,0x00,0x70,0x42,0x00,0x00,0x44,0x00,0x00,0x38, // 223 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 224 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 225 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x42,0x00,0x50,0x22,0x00,0x80,0x7F, // 226 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x50,0x42,0x00,0x48,0x22,0x00,0x80,0x7F, // 227 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 228 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x5C,0x44,0x00,0x54,0x44,0x00,0x5C,0x42,0x00,0x40,0x22,0x00,0x80,0x7F, // 229 + 0x00,0x00,0x00,0x00,0x39,0x00,0x80,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x40,0x22,0x00,0x80,0x3F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 230 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x02,0x40,0xC0,0x02,0x40,0x40,0x03,0x80,0x20, // 231 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x48,0x44,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 232 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 233 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x48,0x44,0x00,0x48,0x44,0x00,0x90,0x24,0x00,0x00,0x17, // 234 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x24,0x00,0x50,0x44,0x00,0x40,0x44,0x00,0x50,0x44,0x00,0x80,0x24,0x00,0x00,0x17, // 235 + 0x08,0x00,0x00,0xD0,0x7F, // 236 + 0x00,0x00,0x00,0xD0,0x7F,0x00,0x08, // 237 + 0x10,0x00,0x00,0xC8,0x7F,0x00,0x08,0x00,0x00,0x10, // 238 + 0x10,0x00,0x00,0xC0,0x7F,0x00,0x10, // 239 + 0x00,0x00,0x00,0x00,0x1F,0x00,0xA0,0x20,0x00,0x68,0x40,0x00,0x58,0x40,0x00,0x70,0x40,0x00,0xE8,0x20,0x00,0x00,0x1F, // 240 + 0x00,0x00,0x00,0xC0,0x7F,0x00,0x90,0x00,0x00,0x48,0x00,0x00,0x50,0x00,0x00,0x48,0x00,0x00,0x80,0x7F, // 241 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 242 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 243 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x48,0x40,0x00,0x90,0x20,0x00,0x00,0x1F, // 244 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x48,0x40,0x00,0x50,0x40,0x00,0x88,0x20,0x00,0x00,0x1F, // 245 + 0x00,0x00,0x00,0x00,0x1F,0x00,0x80,0x20,0x00,0x50,0x40,0x00,0x40,0x40,0x00,0x50,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 246 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x80,0x0A,0x00,0x00,0x02,0x00,0x00,0x02,0x00,0x00,0x02, // 247 + 0x00,0x00,0x00,0x00,0x5F,0x00,0x80,0x30,0x00,0x40,0x48,0x00,0x40,0x44,0x00,0x40,0x42,0x00,0x80,0x21,0x00,0x40,0x1F, // 248 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x08,0x40,0x00,0x10,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 249 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x08,0x20,0x00,0xC0,0x7F, // 250 + 0x00,0x00,0x00,0xC0,0x3F,0x00,0x10,0x40,0x00,0x08,0x40,0x00,0x08,0x40,0x00,0x10,0x20,0x00,0xC0,0x7F, // 251 + 0x00,0x00,0x00,0xD0,0x3F,0x00,0x00,0x40,0x00,0x10,0x40,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0xC0,0x7F, // 252 + 0xC0,0x01,0x00,0x00,0x06,0x02,0x00,0x38,0x02,0x10,0xE0,0x01,0x08,0x38,0x00,0x00,0x07,0x00,0xC0, // 253 + 0x00,0x00,0x00,0xF8,0xFF,0x03,0x80,0x20,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x40,0x40,0x00,0x80,0x20,0x00,0x00,0x1F, // 254 + 0xC0,0x01,0x00,0x00,0x06,0x02,0x10,0x38,0x02,0x00,0xE0,0x01,0x10,0x38,0x00,0x00,0x07,0x00,0xC0 // 255 +}; +const uint8_t ArialMT_Plain_24[] PROGMEM = { + 0x18, // Width: 24 + 0x1C, // Height: 28 + 0x20, // First Char: 32 + 0xE0, // Numbers of Chars: 224 + + // Jump Table: + 0xFF, 0xFF, 0x00, 0x07, // 32:65535 + 0x00, 0x00, 0x13, 0x07, // 33:0 + 0x00, 0x13, 0x1A, 0x09, // 34:19 + 0x00, 0x2D, 0x33, 0x0D, // 35:45 + 0x00, 0x60, 0x2F, 0x0D, // 36:96 + 0x00, 0x8F, 0x4F, 0x15, // 37:143 + 0x00, 0xDE, 0x3B, 0x10, // 38:222 + 0x01, 0x19, 0x0A, 0x05, // 39:281 + 0x01, 0x23, 0x1C, 0x08, // 40:291 + 0x01, 0x3F, 0x1B, 0x08, // 41:319 + 0x01, 0x5A, 0x21, 0x09, // 42:346 + 0x01, 0x7B, 0x32, 0x0E, // 43:379 + 0x01, 0xAD, 0x10, 0x07, // 44:429 + 0x01, 0xBD, 0x1B, 0x08, // 45:445 + 0x01, 0xD8, 0x0F, 0x07, // 46:472 + 0x01, 0xE7, 0x19, 0x07, // 47:487 + 0x02, 0x00, 0x2F, 0x0D, // 48:512 + 0x02, 0x2F, 0x23, 0x0D, // 49:559 + 0x02, 0x52, 0x2F, 0x0D, // 50:594 + 0x02, 0x81, 0x2F, 0x0D, // 51:641 + 0x02, 0xB0, 0x2F, 0x0D, // 52:688 + 0x02, 0xDF, 0x2F, 0x0D, // 53:735 + 0x03, 0x0E, 0x2F, 0x0D, // 54:782 + 0x03, 0x3D, 0x2D, 0x0D, // 55:829 + 0x03, 0x6A, 0x2F, 0x0D, // 56:874 + 0x03, 0x99, 0x2F, 0x0D, // 57:921 + 0x03, 0xC8, 0x0F, 0x07, // 58:968 + 0x03, 0xD7, 0x10, 0x07, // 59:983 + 0x03, 0xE7, 0x2F, 0x0E, // 60:999 + 0x04, 0x16, 0x2F, 0x0E, // 61:1046 + 0x04, 0x45, 0x2E, 0x0E, // 62:1093 + 0x04, 0x73, 0x2E, 0x0D, // 63:1139 + 0x04, 0xA1, 0x5B, 0x18, // 64:1185 + 0x04, 0xFC, 0x3B, 0x10, // 65:1276 + 0x05, 0x37, 0x3B, 0x10, // 66:1335 + 0x05, 0x72, 0x3F, 0x11, // 67:1394 + 0x05, 0xB1, 0x3F, 0x11, // 68:1457 + 0x05, 0xF0, 0x3B, 0x10, // 69:1520 + 0x06, 0x2B, 0x35, 0x0F, // 70:1579 + 0x06, 0x60, 0x43, 0x13, // 71:1632 + 0x06, 0xA3, 0x3B, 0x11, // 72:1699 + 0x06, 0xDE, 0x0F, 0x07, // 73:1758 + 0x06, 0xED, 0x27, 0x0C, // 74:1773 + 0x07, 0x14, 0x3F, 0x10, // 75:1812 + 0x07, 0x53, 0x2F, 0x0D, // 76:1875 + 0x07, 0x82, 0x43, 0x14, // 77:1922 + 0x07, 0xC5, 0x3B, 0x11, // 78:1989 + 0x08, 0x00, 0x47, 0x13, // 79:2048 + 0x08, 0x47, 0x3A, 0x10, // 80:2119 + 0x08, 0x81, 0x47, 0x13, // 81:2177 + 0x08, 0xC8, 0x3F, 0x11, // 82:2248 + 0x09, 0x07, 0x3B, 0x10, // 83:2311 + 0x09, 0x42, 0x35, 0x0F, // 84:2370 + 0x09, 0x77, 0x3B, 0x11, // 85:2423 + 0x09, 0xB2, 0x39, 0x10, // 86:2482 + 0x09, 0xEB, 0x59, 0x17, // 87:2539 + 0x0A, 0x44, 0x3B, 0x10, // 88:2628 + 0x0A, 0x7F, 0x3D, 0x10, // 89:2687 + 0x0A, 0xBC, 0x37, 0x0F, // 90:2748 + 0x0A, 0xF3, 0x14, 0x07, // 91:2803 + 0x0B, 0x07, 0x1B, 0x07, // 92:2823 + 0x0B, 0x22, 0x18, 0x07, // 93:2850 + 0x0B, 0x3A, 0x2A, 0x0B, // 94:2874 + 0x0B, 0x64, 0x34, 0x0D, // 95:2916 + 0x0B, 0x98, 0x11, 0x08, // 96:2968 + 0x0B, 0xA9, 0x2F, 0x0D, // 97:2985 + 0x0B, 0xD8, 0x33, 0x0D, // 98:3032 + 0x0C, 0x0B, 0x2B, 0x0C, // 99:3083 + 0x0C, 0x36, 0x2F, 0x0D, // 100:3126 + 0x0C, 0x65, 0x2F, 0x0D, // 101:3173 + 0x0C, 0x94, 0x1A, 0x07, // 102:3220 + 0x0C, 0xAE, 0x2F, 0x0D, // 103:3246 + 0x0C, 0xDD, 0x2F, 0x0D, // 104:3293 + 0x0D, 0x0C, 0x0F, 0x05, // 105:3340 + 0x0D, 0x1B, 0x10, 0x05, // 106:3355 + 0x0D, 0x2B, 0x2F, 0x0C, // 107:3371 + 0x0D, 0x5A, 0x0F, 0x05, // 108:3418 + 0x0D, 0x69, 0x47, 0x14, // 109:3433 + 0x0D, 0xB0, 0x2F, 0x0D, // 110:3504 + 0x0D, 0xDF, 0x2F, 0x0D, // 111:3551 + 0x0E, 0x0E, 0x33, 0x0D, // 112:3598 + 0x0E, 0x41, 0x30, 0x0D, // 113:3649 + 0x0E, 0x71, 0x1E, 0x08, // 114:3697 + 0x0E, 0x8F, 0x2B, 0x0C, // 115:3727 + 0x0E, 0xBA, 0x1B, 0x07, // 116:3770 + 0x0E, 0xD5, 0x2F, 0x0D, // 117:3797 + 0x0F, 0x04, 0x2A, 0x0C, // 118:3844 + 0x0F, 0x2E, 0x42, 0x11, // 119:3886 + 0x0F, 0x70, 0x2B, 0x0C, // 120:3952 + 0x0F, 0x9B, 0x2A, 0x0C, // 121:3995 + 0x0F, 0xC5, 0x2B, 0x0C, // 122:4037 + 0x0F, 0xF0, 0x1C, 0x08, // 123:4080 + 0x10, 0x0C, 0x10, 0x06, // 124:4108 + 0x10, 0x1C, 0x1B, 0x08, // 125:4124 + 0x10, 0x37, 0x32, 0x0E, // 126:4151 + 0xFF, 0xFF, 0x00, 0x00, // 127:65535 + 0xFF, 0xFF, 0x00, 0x18, // 128:65535 + 0xFF, 0xFF, 0x00, 0x18, // 129:65535 + 0xFF, 0xFF, 0x00, 0x18, // 130:65535 + 0xFF, 0xFF, 0x00, 0x18, // 131:65535 + 0xFF, 0xFF, 0x00, 0x18, // 132:65535 + 0xFF, 0xFF, 0x00, 0x18, // 133:65535 + 0xFF, 0xFF, 0x00, 0x18, // 134:65535 + 0xFF, 0xFF, 0x00, 0x18, // 135:65535 + 0xFF, 0xFF, 0x00, 0x18, // 136:65535 + 0xFF, 0xFF, 0x00, 0x18, // 137:65535 + 0xFF, 0xFF, 0x00, 0x18, // 138:65535 + 0xFF, 0xFF, 0x00, 0x18, // 139:65535 + 0xFF, 0xFF, 0x00, 0x18, // 140:65535 + 0xFF, 0xFF, 0x00, 0x18, // 141:65535 + 0xFF, 0xFF, 0x00, 0x18, // 142:65535 + 0xFF, 0xFF, 0x00, 0x18, // 143:65535 + 0xFF, 0xFF, 0x00, 0x18, // 144:65535 + 0xFF, 0xFF, 0x00, 0x18, // 145:65535 + 0xFF, 0xFF, 0x00, 0x18, // 146:65535 + 0xFF, 0xFF, 0x00, 0x18, // 147:65535 + 0xFF, 0xFF, 0x00, 0x18, // 148:65535 + 0xFF, 0xFF, 0x00, 0x18, // 149:65535 + 0xFF, 0xFF, 0x00, 0x18, // 150:65535 + 0xFF, 0xFF, 0x00, 0x18, // 151:65535 + 0xFF, 0xFF, 0x00, 0x18, // 152:65535 + 0xFF, 0xFF, 0x00, 0x18, // 153:65535 + 0xFF, 0xFF, 0x00, 0x18, // 154:65535 + 0xFF, 0xFF, 0x00, 0x18, // 155:65535 + 0xFF, 0xFF, 0x00, 0x18, // 156:65535 + 0xFF, 0xFF, 0x00, 0x18, // 157:65535 + 0xFF, 0xFF, 0x00, 0x18, // 158:65535 + 0xFF, 0xFF, 0x00, 0x18, // 159:65535 + 0xFF, 0xFF, 0x00, 0x07, // 160:65535 + 0x10, 0x69, 0x14, 0x08, // 161:4201 + 0x10, 0x7D, 0x2B, 0x0D, // 162:4221 + 0x10, 0xA8, 0x2F, 0x0D, // 163:4264 + 0x10, 0xD7, 0x33, 0x0D, // 164:4311 + 0x11, 0x0A, 0x31, 0x0D, // 165:4362 + 0x11, 0x3B, 0x10, 0x06, // 166:4411 + 0x11, 0x4B, 0x2F, 0x0D, // 167:4427 + 0x11, 0x7A, 0x19, 0x08, // 168:4474 + 0x11, 0x93, 0x46, 0x12, // 169:4499 + 0x11, 0xD9, 0x1A, 0x09, // 170:4569 + 0x11, 0xF3, 0x27, 0x0D, // 171:4595 + 0x12, 0x1A, 0x2F, 0x0E, // 172:4634 + 0x12, 0x49, 0x1B, 0x08, // 173:4681 + 0x12, 0x64, 0x46, 0x12, // 174:4708 + 0x12, 0xAA, 0x31, 0x0D, // 175:4778 + 0x12, 0xDB, 0x1E, 0x0A, // 176:4827 + 0x12, 0xF9, 0x33, 0x0D, // 177:4857 + 0x13, 0x2C, 0x1A, 0x08, // 178:4908 + 0x13, 0x46, 0x1A, 0x08, // 179:4934 + 0x13, 0x60, 0x19, 0x08, // 180:4960 + 0x13, 0x79, 0x2F, 0x0E, // 181:4985 + 0x13, 0xA8, 0x31, 0x0D, // 182:5032 + 0x13, 0xD9, 0x12, 0x08, // 183:5081 + 0x13, 0xEB, 0x18, 0x08, // 184:5099 + 0x14, 0x03, 0x16, 0x08, // 185:5123 + 0x14, 0x19, 0x1E, 0x09, // 186:5145 + 0x14, 0x37, 0x2E, 0x0D, // 187:5175 + 0x14, 0x65, 0x4F, 0x14, // 188:5221 + 0x14, 0xB4, 0x4B, 0x14, // 189:5300 + 0x14, 0xFF, 0x4B, 0x14, // 190:5375 + 0x15, 0x4A, 0x33, 0x0F, // 191:5450 + 0x15, 0x7D, 0x3B, 0x10, // 192:5501 + 0x15, 0xB8, 0x3B, 0x10, // 193:5560 + 0x15, 0xF3, 0x3B, 0x10, // 194:5619 + 0x16, 0x2E, 0x3B, 0x10, // 195:5678 + 0x16, 0x69, 0x3B, 0x10, // 196:5737 + 0x16, 0xA4, 0x3B, 0x10, // 197:5796 + 0x16, 0xDF, 0x5B, 0x18, // 198:5855 + 0x17, 0x3A, 0x3F, 0x11, // 199:5946 + 0x17, 0x79, 0x3B, 0x10, // 200:6009 + 0x17, 0xB4, 0x3B, 0x10, // 201:6068 + 0x17, 0xEF, 0x3B, 0x10, // 202:6127 + 0x18, 0x2A, 0x3B, 0x10, // 203:6186 + 0x18, 0x65, 0x11, 0x07, // 204:6245 + 0x18, 0x76, 0x11, 0x07, // 205:6262 + 0x18, 0x87, 0x15, 0x07, // 206:6279 + 0x18, 0x9C, 0x15, 0x07, // 207:6300 + 0x18, 0xB1, 0x3F, 0x11, // 208:6321 + 0x18, 0xF0, 0x3B, 0x11, // 209:6384 + 0x19, 0x2B, 0x47, 0x13, // 210:6443 + 0x19, 0x72, 0x47, 0x13, // 211:6514 + 0x19, 0xB9, 0x47, 0x13, // 212:6585 + 0x1A, 0x00, 0x47, 0x13, // 213:6656 + 0x1A, 0x47, 0x47, 0x13, // 214:6727 + 0x1A, 0x8E, 0x2B, 0x0E, // 215:6798 + 0x1A, 0xB9, 0x47, 0x13, // 216:6841 + 0x1B, 0x00, 0x3B, 0x11, // 217:6912 + 0x1B, 0x3B, 0x3B, 0x11, // 218:6971 + 0x1B, 0x76, 0x3B, 0x11, // 219:7030 + 0x1B, 0xB1, 0x3B, 0x11, // 220:7089 + 0x1B, 0xEC, 0x3D, 0x10, // 221:7148 + 0x1C, 0x29, 0x3A, 0x10, // 222:7209 + 0x1C, 0x63, 0x37, 0x0F, // 223:7267 + 0x1C, 0x9A, 0x2F, 0x0D, // 224:7322 + 0x1C, 0xC9, 0x2F, 0x0D, // 225:7369 + 0x1C, 0xF8, 0x2F, 0x0D, // 226:7416 + 0x1D, 0x27, 0x2F, 0x0D, // 227:7463 + 0x1D, 0x56, 0x2F, 0x0D, // 228:7510 + 0x1D, 0x85, 0x2F, 0x0D, // 229:7557 + 0x1D, 0xB4, 0x53, 0x15, // 230:7604 + 0x1E, 0x07, 0x2B, 0x0C, // 231:7687 + 0x1E, 0x32, 0x2F, 0x0D, // 232:7730 + 0x1E, 0x61, 0x2F, 0x0D, // 233:7777 + 0x1E, 0x90, 0x2F, 0x0D, // 234:7824 + 0x1E, 0xBF, 0x2F, 0x0D, // 235:7871 + 0x1E, 0xEE, 0x11, 0x07, // 236:7918 + 0x1E, 0xFF, 0x11, 0x07, // 237:7935 + 0x1F, 0x10, 0x15, 0x07, // 238:7952 + 0x1F, 0x25, 0x15, 0x07, // 239:7973 + 0x1F, 0x3A, 0x2F, 0x0D, // 240:7994 + 0x1F, 0x69, 0x2F, 0x0D, // 241:8041 + 0x1F, 0x98, 0x2F, 0x0D, // 242:8088 + 0x1F, 0xC7, 0x2F, 0x0D, // 243:8135 + 0x1F, 0xF6, 0x2F, 0x0D, // 244:8182 + 0x20, 0x25, 0x2F, 0x0D, // 245:8229 + 0x20, 0x54, 0x2F, 0x0D, // 246:8276 + 0x20, 0x83, 0x32, 0x0D, // 247:8323 + 0x20, 0xB5, 0x33, 0x0F, // 248:8373 + 0x20, 0xE8, 0x2F, 0x0D, // 249:8424 + 0x21, 0x17, 0x2F, 0x0D, // 250:8471 + 0x21, 0x46, 0x2F, 0x0D, // 251:8518 + 0x21, 0x75, 0x2F, 0x0D, // 252:8565 + 0x21, 0xA4, 0x2A, 0x0C, // 253:8612 + 0x21, 0xCE, 0x2F, 0x0D, // 254:8654 + 0x21, 0xFD, 0x2A, 0x0C, // 255:8701 + + // Font Data: + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x33,0x00,0xE0,0xFF,0x33, // 33 + 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 34 + 0x00,0x0C,0x03,0x00,0x00,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x33,0x00,0x00,0x0C,0x3F,0x00,0x00,0xFC,0x0F,0x00,0x80,0xFF,0x03,0x00,0xE0,0x0F,0x03,0x00,0x60,0x0C,0x03,0x00,0x00,0x0C,0x03, // 35 + 0x00,0x00,0x00,0x00,0x80,0x07,0x06,0x00,0xC0,0x0F,0x1E,0x00,0xC0,0x18,0x1C,0x00,0x60,0x18,0x38,0x00,0x60,0x30,0x30,0x00,0xF0,0xFF,0xFF,0x00,0x60,0x30,0x30,0x00,0x60,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0xC1,0x1F,0x00,0x00,0x81,0x07, // 36 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x20,0x20,0x00,0x60,0x30,0x38,0x00,0xC0,0x1F,0x1E,0x00,0x80,0x8F,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x8F,0x0F,0x00,0xC0,0xC3,0x1F,0x00,0xE0,0x60,0x30,0x00,0x20,0x20,0x20,0x00,0x00,0x20,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 37 + 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xC0,0x0F,0x00,0x80,0xE3,0x1C,0x00,0xC0,0x77,0x38,0x00,0xE0,0x3C,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x78,0x30,0x00,0xE0,0xEC,0x38,0x00,0xC0,0x8F,0x1B,0x00,0x80,0x03,0x1F,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xC0,0x38,0x00,0x00,0x00,0x10, // 38 + 0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xE0,0x07, // 39 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x00,0x00,0xFE,0x7F,0x00,0x80,0x0F,0xF0,0x01,0xC0,0x01,0x80,0x03,0x60,0x00,0x00,0x06,0x20,0x00,0x00,0x04, // 40 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x04,0x60,0x00,0x00,0x06,0xC0,0x01,0x80,0x03,0x80,0x0F,0xF0,0x01,0x00,0xFE,0x7F,0x00,0x00,0xF0,0x0F, // 41 + 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x80,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x80,0x04,0x00,0x00,0x80, // 42 + 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xFF,0x0F,0x00,0x00,0xFF,0x0F,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 43 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x03,0x00,0x00,0xF0,0x01, // 44 + 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 45 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 46 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x3F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60, // 47 + 0x00,0x00,0x00,0x00,0x00,0xFE,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x01,0x1C,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x03, // 48 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 49 + 0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x00,0xC0,0x03,0x38,0x00,0xC0,0x00,0x3C,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x33,0x00,0x60,0x80,0x31,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x30,0x00,0xC0,0x30,0x30,0x00,0xC0,0x1F,0x30,0x00,0x00,0x0F,0x30, // 50 + 0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0xC0,0x01,0x0E,0x00,0xC0,0x00,0x1C,0x00,0x60,0x00,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x0F,0x00,0x00,0x80,0x07, // 51 + 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x03,0x00,0x00,0x3C,0x03,0x00,0x00,0x0E,0x03,0x00,0x80,0x07,0x03,0x00,0xC0,0x01,0x03,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03, // 52 + 0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x80,0x3F,0x0E,0x00,0xE0,0x1F,0x18,0x00,0x60,0x08,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x0C,0x30,0x00,0x60,0x18,0x1C,0x00,0x60,0xF0,0x0F,0x00,0x00,0xE0,0x03, // 53 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x03,0x00,0x80,0xFF,0x0F,0x00,0xC0,0x63,0x1C,0x00,0xC0,0x30,0x38,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0x60,0x18,0x30,0x00,0xE0,0x30,0x18,0x00,0xC0,0xF1,0x0F,0x00,0x80,0xC1,0x07, // 54 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x3C,0x00,0x60,0x80,0x3F,0x00,0x60,0xE0,0x03,0x00,0x60,0x78,0x00,0x00,0x60,0x0E,0x00,0x00,0x60,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60, // 55 + 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x80,0xC7,0x1F,0x00,0xC0,0x6F,0x18,0x00,0xE0,0x38,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xE0,0x38,0x30,0x00,0xC0,0x6F,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 56 + 0x00,0x00,0x00,0x00,0x00,0x1F,0x0C,0x00,0x80,0x7F,0x1C,0x00,0xC0,0x61,0x38,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0xC0,0x30,0x00,0x60,0x60,0x18,0x00,0xC0,0x31,0x1E,0x00,0x80,0xFF,0x0F,0x00,0x00,0xFE,0x01, // 57 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 58 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x30,0x03,0x00,0x06,0xF0,0x01, // 59 + 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x03,0x06, // 60 + 0x00,0x00,0x00,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01, // 61 + 0x00,0x00,0x00,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x03,0x00,0x00,0x06,0x03,0x00,0x00,0x04,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0x8C,0x01,0x00,0x00,0xD8,0x00,0x00,0x00,0xD8,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x20, // 62 + 0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x33,0x00,0x60,0xE0,0x00,0x00,0x60,0x30,0x00,0x00,0xC0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x00,0x07, // 63 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x0F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x1E,0xF0,0x00,0x00,0x07,0xC0,0x01,0x80,0xC3,0x87,0x01,0xC0,0xF1,0x9F,0x03,0xC0,0x38,0x18,0x03,0xC0,0x0C,0x30,0x03,0x60,0x0E,0x30,0x06,0x60,0x06,0x30,0x06,0x60,0x06,0x18,0x06,0x60,0x06,0x0C,0x06,0x60,0x0C,0x1E,0x06,0x60,0xF8,0x3F,0x06,0xE0,0xFE,0x31,0x06,0xC0,0x0E,0x30,0x06,0xC0,0x01,0x18,0x03,0x80,0x03,0x1C,0x03,0x00,0x07,0x8F,0x01,0x00,0xFE,0x87,0x01,0x00,0xF8,0xC1,0x00,0x00,0x00,0x40, // 64 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE0,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 65 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0xC0,0x78,0x30,0x00,0xC0,0xFF,0x18,0x00,0x80,0xC7,0x1F,0x00,0x00,0x80,0x07, // 66 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 67 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 68 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 69 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60, // 70 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x60,0x30,0x00,0x60,0x60,0x30,0x00,0xE0,0x60,0x38,0x00,0xC0,0x60,0x18,0x00,0xC0,0x61,0x18,0x00,0x80,0xE3,0x0F,0x00,0x00,0xE2,0x0F, // 71 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 72 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 73 + 0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0xE0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F, // 74 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE7,0x01,0x00,0x80,0x83,0x07,0x00,0xC0,0x01,0x0F,0x00,0xE0,0x00,0x1E,0x00,0x60,0x00,0x38,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 75 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 76 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x07,0x00,0x00,0xFE,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 77 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 78 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 79 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0x60,0x60,0x00,0x00,0xC0,0x30,0x00,0x00,0xC0,0x3F,0x00,0x00,0x00,0x0F, // 80 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x0C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x18,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x36,0x00,0x60,0x00,0x36,0x00,0xE0,0x00,0x3C,0x00,0xC0,0x00,0x1C,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x3F,0x00,0x00,0xFF,0x77,0x00,0x00,0xFC,0x61, // 81 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x70,0x00,0x00,0x60,0xF0,0x00,0x00,0x60,0xF0,0x03,0x00,0x60,0xB0,0x07,0x00,0xE0,0x18,0x1F,0x00,0xC0,0x1F,0x3C,0x00,0x80,0x0F,0x30,0x00,0x00,0x00,0x20, // 82 + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x07,0x0F,0x00,0xC0,0x1F,0x1C,0x00,0xC0,0x18,0x18,0x00,0x60,0x38,0x38,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x70,0x30,0x00,0xC0,0x60,0x18,0x00,0xC0,0xE1,0x18,0x00,0x80,0xC3,0x0F,0x00,0x00,0x83,0x07, // 83 + 0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 84 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 85 + 0x20,0x00,0x00,0x00,0xE0,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x01,0x00,0x00,0xC0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xF8,0x01,0x00,0x00,0x3E,0x00,0x00,0xC0,0x0F,0x00,0x00,0xE0,0x01,0x00,0x00,0x20, // 86 + 0x60,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0x80,0xFF,0x00,0x00,0x00,0xF8,0x0F,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x3F,0x00,0x00,0xE0,0x0F,0x00,0x00,0xFC,0x01,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x3F,0x00,0x00,0xF8,0x0F,0x00,0x80,0xFF,0x00,0x00,0xE0,0x07,0x00,0x00,0x60, // 87 + 0x00,0x00,0x20,0x00,0x20,0x00,0x30,0x00,0x60,0x00,0x3C,0x00,0xE0,0x01,0x1E,0x00,0xC0,0x83,0x07,0x00,0x00,0xCF,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0x38,0x00,0x00,0x00,0xFE,0x01,0x00,0x00,0xCF,0x03,0x00,0xC0,0x03,0x07,0x00,0xE0,0x01,0x1E,0x00,0x60,0x00,0x3C,0x00,0x20,0x00,0x30,0x00,0x00,0x00,0x20, // 88 + 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x3C,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 89 + 0x00,0x00,0x30,0x00,0x60,0x00,0x38,0x00,0x60,0x00,0x3C,0x00,0x60,0x00,0x37,0x00,0x60,0x80,0x33,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0x60,0x0E,0x30,0x00,0x60,0x07,0x30,0x00,0xE0,0x01,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x30, // 90 + 0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 91 + 0x60,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x3F,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xE0,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 92 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07, // 93 + 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x20, // 94 + 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 95 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x80, // 96 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 97 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 98 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 99 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 100 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 101 + 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x06,0x00,0x00,0x60,0x06,0x00,0x00,0x60,0x06, // 102 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x83,0x01,0x00,0xF8,0x8F,0x03,0x00,0x1C,0x1C,0x07,0x00,0x0E,0x38,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x06,0x30,0x06,0x00,0x0C,0x18,0x07,0x00,0x18,0x8C,0x03,0x00,0xFE,0xFF,0x01,0x00,0xFE,0xFF, // 103 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 104 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F, // 105 + 0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x60,0xFE,0xFF,0x07,0x60,0xFE,0xFF,0x03, // 106 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xF0,0x01,0x00,0x00,0x98,0x07,0x00,0x00,0x0C,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x02,0x30,0x00,0x00,0x00,0x20, // 107 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 108 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 109 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 110 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 111 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x18,0x0C,0x00,0x00,0x0C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xE0,0x03, // 112 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0C,0x18,0x00,0x00,0x18,0x0C,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07, // 113 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0x00,0x0C,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x06, // 114 + 0x00,0x00,0x00,0x00,0x00,0x38,0x0C,0x00,0x00,0x7C,0x1C,0x00,0x00,0xEE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x31,0x00,0x00,0xC6,0x31,0x00,0x00,0x8E,0x39,0x00,0x00,0x9C,0x1F,0x00,0x00,0x18,0x0F, // 115 + 0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30, // 116 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 117 + 0x00,0x06,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xC0,0x07,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1F,0x00,0x00,0xC0,0x07,0x00,0x00,0xF8,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 118 + 0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xE0,0x03,0x00,0x00,0x7C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x1F,0x00,0x00,0xF0,0x03,0x00,0x00,0x7E,0x00,0x00,0x00,0x0E, // 119 + 0x00,0x02,0x20,0x00,0x00,0x06,0x30,0x00,0x00,0x1E,0x3C,0x00,0x00,0x38,0x0E,0x00,0x00,0xF0,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x07,0x00,0x00,0x38,0x0E,0x00,0x00,0x1C,0x3C,0x00,0x00,0x0E,0x30,0x00,0x00,0x02,0x20, // 120 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0x00,0xC0,0x1F,0x00,0x00,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 121 + 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x3E,0x00,0x00,0x06,0x37,0x00,0x00,0xC6,0x33,0x00,0x00,0xE6,0x30,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x30,0x00,0x00,0x1E,0x30,0x00,0x00,0x06,0x30, // 122 + 0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x03,0x00,0xC0,0x7F,0xFE,0x03,0xE0,0x3F,0xFC,0x07,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06, // 123 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x0F,0xE0,0xFF,0xFF,0x0F, // 124 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x60,0x00,0x00,0x06,0xE0,0x3F,0xFC,0x07,0xC0,0x7F,0xFF,0x03,0x00,0xC0,0x03,0x00,0x00,0x80,0x01, // 125 + 0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60, // 126 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE6,0xFF,0x07,0x00,0xE6,0xFF,0x07, // 161 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x9C,0x07,0x00,0x0E,0x78,0x00,0x00,0x06,0x3F,0x00,0x00,0xF6,0x30,0x00,0x00,0x0E,0x30,0x00,0xE0,0x0D,0x1C,0x00,0x00,0x1C,0x0E,0x00,0x00,0x10,0x06, // 162 + 0x00,0x60,0x10,0x00,0x00,0x60,0x38,0x00,0x00,0x7F,0x1C,0x00,0xC0,0xFF,0x1F,0x00,0xE0,0xE0,0x19,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x18,0x00,0x60,0x60,0x30,0x00,0xE0,0x00,0x30,0x00,0xC0,0x01,0x30,0x00,0x80,0x01,0x38,0x00,0x00,0x00,0x10, // 163 + 0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,0xF7,0x0E,0x00,0x00,0xFE,0x07,0x00,0x00,0x0C,0x03,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x06,0x06,0x00,0x00,0x0C,0x03,0x00,0x00,0xFE,0x07,0x00,0x00,0xF7,0x0E,0x00,0x00,0x02,0x04, // 164 + 0xE0,0x60,0x06,0x00,0xC0,0x61,0x06,0x00,0x80,0x67,0x06,0x00,0x00,0x7E,0x06,0x00,0x00,0x7C,0x06,0x00,0x00,0xF0,0x3F,0x00,0x00,0xF0,0x3F,0x00,0x00,0x7C,0x06,0x00,0x00,0x7E,0x06,0x00,0x80,0x67,0x06,0x00,0xC0,0x61,0x06,0x00,0xE0,0x60,0x06,0x00,0x20, // 165 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x7F,0xF8,0x0F,0xE0,0x7F,0xF8,0x0F, // 166 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x80,0xF3,0xC1,0x00,0xC0,0x1F,0xC3,0x03,0xE0,0x0C,0x07,0x03,0x60,0x1C,0x06,0x06,0x60,0x18,0x0C,0x06,0x60,0x30,0x1C,0x06,0xE0,0x70,0x38,0x07,0xC0,0xE1,0xF4,0x03,0x80,0xC1,0xE7,0x01,0x00,0x80,0x03, // 167 + 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 168 + 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x79,0x1C,0x00,0xC0,0xFE,0x19,0x00,0x60,0x86,0x31,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x03,0x33,0x00,0x60,0x87,0x33,0x00,0xC0,0x86,0x19,0x00,0xC0,0x85,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 169 + 0x00,0x00,0x00,0x00,0xC0,0x1C,0x00,0x00,0xE0,0x3E,0x00,0x00,0x60,0x32,0x00,0x00,0x60,0x32,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x3F, // 170 + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x84,0x10,0x00,0x00,0xE0,0x03,0x00,0x00,0x78,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x04,0x10, // 171 + 0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFC,0x01, // 172 + 0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01, // 173 + 0x00,0xF8,0x00,0x00,0x00,0xFE,0x03,0x00,0x00,0x07,0x07,0x00,0x80,0x01,0x0C,0x00,0xC0,0x01,0x1C,0x00,0xC0,0xFE,0x1B,0x00,0x60,0xFE,0x33,0x00,0x60,0x66,0x30,0x00,0x60,0x66,0x30,0x00,0x60,0xE6,0x30,0x00,0x60,0xFE,0x31,0x00,0x60,0x3C,0x33,0x00,0xC0,0x00,0x1A,0x00,0xC0,0x01,0x1C,0x00,0x80,0x01,0x0C,0x00,0x00,0x07,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xF8, // 174 + 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x0C, // 175 + 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x08,0x00,0x00,0x40,0x04,0x00,0x00,0x80,0x03, // 176 + 0x00,0x00,0x00,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0xFF,0x3F,0x00,0x00,0xFF,0x3F,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30,0x00,0x00,0x60,0x30, // 177 + 0x40,0x20,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x38,0x00,0x00,0x20,0x2C,0x00,0x00,0x20,0x26,0x00,0x00,0xE0,0x23,0x00,0x00,0xC0,0x21, // 178 + 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0xE0,0x3D,0x00,0x00,0xC0,0x1D, // 179 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 180 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x07,0x00,0xFE,0xFF,0x07,0x00,0x00,0x1C,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x1C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 181 + 0x00,0x0F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xC0,0x3F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0x7F,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x60,0x00,0x00,0x00,0x60, // 182 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60, // 183 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0xC0,0x02,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x01, // 184 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F, // 185 + 0x00,0x00,0x00,0x00,0x80,0x0F,0x00,0x00,0xC0,0x1F,0x00,0x00,0xE0,0x38,0x00,0x00,0x60,0x30,0x00,0x00,0xE0,0x38,0x00,0x00,0xC0,0x1F,0x00,0x00,0x80,0x0F, // 186 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x84,0x10,0x00,0x00,0x1C,0x1C,0x00,0x00,0x78,0x0F,0x00,0x00,0xE0,0x03,0x00,0x00,0x80, // 187 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x38,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x0C,0x00,0xC0,0x01,0x0E,0x00,0xE0,0x80,0x0B,0x00,0x60,0xC0,0x08,0x00,0x00,0xE0,0x3F,0x00,0x00,0xE0,0x3F,0x00,0x00,0x00,0x08, // 188 + 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xC0,0x00,0x00,0x00,0xC0,0x00,0x20,0x00,0xE0,0x3F,0x30,0x00,0xE0,0x3F,0x1C,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x01,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x4E,0x20,0x00,0x00,0x67,0x30,0x00,0xC0,0x21,0x38,0x00,0xE0,0x20,0x2C,0x00,0x60,0x20,0x26,0x00,0x00,0xE0,0x27,0x00,0x00,0xC0,0x21, // 189 + 0x40,0x10,0x00,0x00,0x60,0x30,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x22,0x20,0x00,0x20,0x22,0x30,0x00,0xE0,0x3D,0x38,0x00,0xC0,0x1D,0x0E,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xE0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x0E,0x0C,0x00,0x00,0x07,0x0E,0x00,0x80,0x83,0x0B,0x00,0xE0,0xC0,0x08,0x00,0x60,0xE0,0x3F,0x00,0x20,0xE0,0x3F,0x00,0x00,0x00,0x08, // 190 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xF8,0x03,0x00,0x00,0x1E,0x03,0x00,0x00,0x07,0x07,0x00,0xE6,0x03,0x06,0x00,0xE6,0x01,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x80,0x03,0x00,0x00,0xC0,0x01,0x00,0x00,0xC0, // 191 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x82,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE8,0x83,0x01,0x00,0x80,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 192 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x80,0x8F,0x01,0x00,0xE8,0x83,0x01,0x00,0x6E,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x82,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 193 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x88,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xE6,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x08,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 194 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x0C,0xFE,0x01,0x00,0x8E,0x8F,0x01,0x00,0xE6,0x83,0x01,0x00,0x66,0x80,0x01,0x00,0xEC,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0E,0xFE,0x01,0x00,0x06,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 195 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x8C,0x8F,0x01,0x00,0xEC,0x83,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0x83,0x01,0x00,0x8C,0x8F,0x01,0x00,0x0C,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 196 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3E,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x03,0x00,0x00,0xFE,0x01,0x00,0x9C,0x8F,0x01,0x00,0xE2,0x83,0x01,0x00,0x62,0x80,0x01,0x00,0xE2,0x83,0x01,0x00,0x9C,0x8F,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xF0,0x03,0x00,0x00,0x80,0x0F,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x30, // 197 + 0x00,0x00,0x30,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x0F,0x00,0x00,0xC0,0x03,0x00,0x00,0xF0,0x01,0x00,0x00,0xBC,0x01,0x00,0x00,0x8F,0x01,0x00,0xC0,0x83,0x01,0x00,0xE0,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0x60,0x80,0x01,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 198 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0x60,0x00,0x30,0x02,0x60,0x00,0x30,0x02,0x60,0x00,0xF0,0x02,0x60,0x00,0xB0,0x03,0x60,0x00,0x30,0x01,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0F,0x00,0x00,0x02,0x03, // 199 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 200 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6E,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x62,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 201 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x66,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x68,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 202 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x6C,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30, // 203 + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xEE,0xFF,0x3F,0x00,0x08, // 204 + 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xEE,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x02, // 205 + 0x08,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE6,0xFF,0x3F,0x00,0xE6,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x08, // 206 + 0x0C,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x0C, // 207 + 0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x30,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x03,0x0E,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 208 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0xC0,0x01,0x00,0x00,0x8C,0x03,0x00,0x00,0x0E,0x0E,0x00,0x00,0x06,0x3C,0x00,0x00,0x06,0x70,0x00,0x00,0x0C,0xE0,0x01,0x00,0x0C,0x80,0x03,0x00,0x0E,0x00,0x0F,0x00,0x06,0x00,0x1C,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F, // 209 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x62,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 210 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0x68,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x62,0x00,0x30,0x00,0xE0,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 211 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x68,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xE8,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 212 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xCC,0x00,0x18,0x00,0xEE,0x00,0x38,0x00,0x66,0x00,0x30,0x00,0x66,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x6E,0x00,0x30,0x00,0xE6,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 213 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x01,0x00,0x00,0xFF,0x07,0x00,0x80,0x07,0x0F,0x00,0xC0,0x01,0x1C,0x00,0xC0,0x00,0x18,0x00,0xE0,0x00,0x38,0x00,0x6C,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x6C,0x00,0x30,0x00,0xEC,0x00,0x38,0x00,0xC0,0x00,0x18,0x00,0xC0,0x01,0x1C,0x00,0x80,0x07,0x0F,0x00,0x00,0xFF,0x07,0x00,0x00,0xFC,0x01, // 214 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x00,0x00,0x8E,0x03,0x00,0x00,0xDC,0x01,0x00,0x00,0xF8,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0xDC,0x01,0x00,0x00,0x8E,0x03,0x00,0x00,0x06,0x03, // 215 + 0x00,0x00,0x00,0x00,0x00,0xFC,0x21,0x00,0x00,0xFF,0x77,0x00,0x80,0x07,0x3F,0x00,0xC0,0x01,0x1E,0x00,0xC0,0x00,0x1F,0x00,0xE0,0x80,0x3B,0x00,0x60,0xC0,0x31,0x00,0x60,0xE0,0x30,0x00,0x60,0x70,0x30,0x00,0x60,0x38,0x30,0x00,0x60,0x1C,0x30,0x00,0xE0,0x0E,0x38,0x00,0xC0,0x07,0x18,0x00,0xC0,0x03,0x1C,0x00,0xE0,0x07,0x0F,0x00,0x70,0xFF,0x07,0x00,0x20,0xFC,0x01, // 216 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x02,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 217 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x30,0x00,0x0E,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 218 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x08,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x06,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x08,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 219 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x03,0x00,0xE0,0xFF,0x0F,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x38,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x0C,0x00,0x30,0x00,0x0C,0x00,0x38,0x00,0x00,0x00,0x1C,0x00,0xE0,0xFF,0x0F,0x00,0xE0,0xFF,0x03, // 220 + 0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x3C,0x00,0x00,0x08,0xF0,0x3F,0x00,0x0E,0xF0,0x3F,0x00,0x06,0x3C,0x00,0x00,0x02,0x1E,0x00,0x00,0x00,0x07,0x00,0x00,0xC0,0x03,0x00,0x00,0xE0,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x20, // 221 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x07,0x00,0x00,0x86,0x03,0x00,0x00,0xFE,0x01,0x00,0x00,0xF8, // 222 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x3F,0x00,0xC0,0xFF,0x3F,0x00,0xC0,0x00,0x00,0x00,0x60,0x00,0x08,0x00,0x60,0x00,0x1C,0x00,0x60,0x00,0x38,0x00,0xE0,0x78,0x30,0x00,0xC0,0x7F,0x30,0x00,0x80,0xC7,0x30,0x00,0x00,0x80,0x39,0x00,0x00,0x80,0x1F,0x00,0x00,0x00,0x0F, // 223 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x20,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x18,0x00,0x00,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 224 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x00,0x86,0x31,0x00,0x80,0x86,0x31,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x18,0x00,0x20,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 225 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x80,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0x60,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0x80,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 226 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0xC0,0x1C,0x1F,0x00,0xE0,0x8C,0x39,0x00,0x60,0x86,0x31,0x00,0x60,0x86,0x31,0x00,0xC0,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xE0,0xCE,0x0C,0x00,0x60,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 227 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0xC0,0x8C,0x39,0x00,0xC0,0x86,0x31,0x00,0x00,0x86,0x31,0x00,0x00,0xC6,0x30,0x00,0xC0,0xC6,0x18,0x00,0xC0,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 228 + 0x00,0x00,0x00,0x00,0x00,0x18,0x0E,0x00,0x00,0x1C,0x1F,0x00,0x00,0x8C,0x39,0x00,0x70,0x86,0x31,0x00,0x88,0x86,0x31,0x00,0x88,0xC6,0x30,0x00,0x88,0xC6,0x18,0x00,0x70,0xCE,0x0C,0x00,0x00,0xFC,0x1F,0x00,0x00,0xF8,0x3F,0x00,0x00,0x00,0x20, // 229 + 0x00,0x00,0x00,0x00,0x00,0x10,0x0F,0x00,0x00,0x9C,0x1F,0x00,0x00,0xCC,0x39,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0x66,0x18,0x00,0x00,0x6E,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xFC,0x1F,0x00,0x00,0xCC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xCC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xE0,0x04, // 230 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x02,0x00,0x06,0x30,0x02,0x00,0x06,0xF0,0x02,0x00,0x06,0xB0,0x03,0x00,0x0E,0x38,0x01,0x00,0x1C,0x1C,0x00,0x00,0x18,0x0C, // 231 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x20,0xCE,0x38,0x00,0x60,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x80,0xC6,0x30,0x00,0x00,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 232 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x00,0xCE,0x38,0x00,0x80,0xC6,0x30,0x00,0xE0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x20,0xCE,0x38,0x00,0x00,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 233 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0x80,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0x60,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0x80,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 234 + 0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0xDC,0x1C,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0x00,0xC6,0x30,0x00,0xC0,0xCE,0x38,0x00,0xC0,0xDC,0x18,0x00,0x00,0xF8,0x0C,0x00,0x00,0xF0,0x04, // 235 + 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0xE0,0xFE,0x3F,0x00,0x80, // 236 + 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xE0,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0x20, // 237 + 0x80,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x60,0xFE,0x3F,0x00,0x60,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0x80, // 238 + 0xC0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F,0x00,0xC0,0x00,0x00,0x00,0xC0, // 239 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1D,0x1C,0x00,0xA0,0x0F,0x38,0x00,0xA0,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0F,0x38,0x00,0x20,0x1F,0x1C,0x00,0x00,0xFC,0x0F,0x00,0x00,0xE0,0x07, // 240 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0xC0,0xFE,0x3F,0x00,0xE0,0x18,0x00,0x00,0x60,0x0C,0x00,0x00,0x60,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xC0,0x06,0x00,0x00,0xE0,0x0E,0x00,0x00,0x60,0xFC,0x3F,0x00,0x00,0xF8,0x3F, // 241 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x20,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x80,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 242 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x38,0x00,0x80,0x06,0x30,0x00,0xE0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x20,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 243 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0x80,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0x80,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 244 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0xC0,0x1C,0x1C,0x00,0xE0,0x0E,0x38,0x00,0x60,0x06,0x30,0x00,0x60,0x06,0x30,0x00,0xC0,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xE0,0x1C,0x1C,0x00,0x60,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 245 + 0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,0xF8,0x0F,0x00,0x00,0x1C,0x1C,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0xC0,0x0E,0x38,0x00,0xC0,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x07, // 246 + 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0xB6,0x01,0x00,0x00,0xB6,0x01,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30, // 247 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x67,0x00,0x00,0xF8,0x7F,0x00,0x00,0x1C,0x1C,0x00,0x00,0x0E,0x3F,0x00,0x00,0x86,0x33,0x00,0x00,0xE6,0x31,0x00,0x00,0x76,0x30,0x00,0x00,0x3E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xFF,0x0F,0x00,0x00,0xF3,0x07, // 248 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x20,0x00,0x38,0x00,0x60,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 249 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x30,0x00,0x80,0x00,0x30,0x00,0xE0,0x00,0x30,0x00,0x60,0x00,0x18,0x00,0x20,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 250 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0x80,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0x60,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0x80,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 251 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x0F,0x00,0x00,0xFE,0x1F,0x00,0xC0,0x00,0x38,0x00,0xC0,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0xC0,0x00,0x18,0x00,0xC0,0x00,0x0C,0x00,0x00,0xFE,0x3F,0x00,0x00,0xFE,0x3F, // 252 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0x00,0xF0,0x01,0x06,0x00,0x80,0x0F,0x07,0x80,0x00,0xFE,0x03,0xE0,0x00,0xFC,0x00,0x60,0xC0,0x1F,0x00,0x20,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06, // 253 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFF,0xFF,0x07,0xE0,0xFF,0xFF,0x07,0x00,0x1C,0x18,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x06,0x30,0x00,0x00,0x0E,0x38,0x00,0x00,0x1C,0x1C,0x00,0x00,0xF8,0x0F,0x00,0x00,0xF0,0x03, // 254 + 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x7E,0x00,0x06,0xC0,0xF0,0x01,0x06,0xC0,0x80,0x0F,0x07,0x00,0x00,0xFE,0x03,0x00,0x00,0xFC,0x00,0xC0,0xC0,0x1F,0x00,0xC0,0xF8,0x03,0x00,0x00,0x3E,0x00,0x00,0x00,0x06 // 255 +}; +#endif diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp new file mode 100644 index 0000000..cd371a0 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp @@ -0,0 +1,422 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#include "OLEDDisplayUi.h" + +OLEDDisplayUi::OLEDDisplayUi(OLEDDisplay *display) { + this->display = display; +} + +void OLEDDisplayUi::init() { + this->display->init(); +} + +void OLEDDisplayUi::setTargetFPS(uint8_t fps){ + float oldInterval = this->updateInterval; + this->updateInterval = ((float) 1.0 / (float) fps) * 1000; + + // Calculate new ticksPerFrame + float changeRatio = oldInterval / (float) this->updateInterval; + this->ticksPerFrame *= changeRatio; + this->ticksPerTransition *= changeRatio; +} + +// -/------ Automatic controll ------\- + +void OLEDDisplayUi::enableAutoTransition(){ + this->autoTransition = true; +} +void OLEDDisplayUi::disableAutoTransition(){ + this->autoTransition = false; +} +void OLEDDisplayUi::setAutoTransitionForwards(){ + this->state.frameTransitionDirection = 1; + this->lastTransitionDirection = 1; +} +void OLEDDisplayUi::setAutoTransitionBackwards(){ + this->state.frameTransitionDirection = -1; + this->lastTransitionDirection = -1; +} +void OLEDDisplayUi::setTimePerFrame(uint16_t time){ + this->ticksPerFrame = (uint16_t) ( (float) time / (float) updateInterval); +} +void OLEDDisplayUi::setTimePerTransition(uint16_t time){ + this->ticksPerTransition = (uint16_t) ( (float) time / (float) updateInterval); +} + +// -/------ Customize indicator position and style -------\- +void OLEDDisplayUi::enableIndicator(){ + this->state.isIndicatorDrawen = true; +} + +void OLEDDisplayUi::disableIndicator(){ + this->state.isIndicatorDrawen = false; +} + +void OLEDDisplayUi::enableAllIndicators(){ + this->shouldDrawIndicators = true; +} + +void OLEDDisplayUi::disableAllIndicators(){ + this->shouldDrawIndicators = false; +} + +void OLEDDisplayUi::setIndicatorPosition(IndicatorPosition pos) { + this->indicatorPosition = pos; +} +void OLEDDisplayUi::setIndicatorDirection(IndicatorDirection dir) { + this->indicatorDirection = dir; +} +void OLEDDisplayUi::setActiveSymbol(const uint8_t* symbol) { + this->activeSymbol = symbol; +} +void OLEDDisplayUi::setInactiveSymbol(const uint8_t* symbol) { + this->inactiveSymbol = symbol; +} + + +// -/----- Frame settings -----\- +void OLEDDisplayUi::setFrameAnimation(AnimationDirection dir) { + this->frameAnimationDirection = dir; +} +void OLEDDisplayUi::setFrames(FrameCallback* frameFunctions, uint8_t frameCount) { + this->frameFunctions = frameFunctions; + this->frameCount = frameCount; + this->resetState(); +} + +// -/----- Overlays ------\- +void OLEDDisplayUi::setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount){ + this->overlayFunctions = overlayFunctions; + this->overlayCount = overlayCount; +} + +// -/----- Loading Process -----\- + +void OLEDDisplayUi::setLoadingDrawFunction(LoadingDrawFunction loadingDrawFunction) { + this->loadingDrawFunction = loadingDrawFunction; +} + +void OLEDDisplayUi::runLoadingProcess(LoadingStage* stages, uint8_t stagesCount) { + uint8_t progress = 0; + uint8_t increment = 100 / stagesCount; + + for (uint8_t i = 0; i < stagesCount; i++) { + display->clear(); + this->loadingDrawFunction(this->display, &stages[i], progress); + display->display(); + + stages[i].callback(); + + progress += increment; + yield(); + } + + display->clear(); + this->loadingDrawFunction(this->display, &stages[stagesCount-1], progress); + display->display(); + + delay(150); +} + +// -/----- Manuel control -----\- +void OLEDDisplayUi::nextFrame() { + if (this->state.frameState != IN_TRANSITION) { + this->state.manuelControll = true; + this->state.frameState = IN_TRANSITION; + this->state.ticksSinceLastStateSwitch = 0; + this->lastTransitionDirection = this->state.frameTransitionDirection; + this->state.frameTransitionDirection = 1; + } +} +void OLEDDisplayUi::previousFrame() { + if (this->state.frameState != IN_TRANSITION) { + this->state.manuelControll = true; + this->state.frameState = IN_TRANSITION; + this->state.ticksSinceLastStateSwitch = 0; + this->lastTransitionDirection = this->state.frameTransitionDirection; + this->state.frameTransitionDirection = -1; + } +} + +void OLEDDisplayUi::switchToFrame(uint8_t frame) { + if (frame >= this->frameCount) return; + this->state.ticksSinceLastStateSwitch = 0; + if (frame == this->state.currentFrame) return; + this->state.frameState = FIXED; + this->state.currentFrame = frame; + this->state.isIndicatorDrawen = true; +} + +void OLEDDisplayUi::transitionToFrame(uint8_t frame) { + if (frame >= this->frameCount) return; + this->state.ticksSinceLastStateSwitch = 0; + if (frame == this->state.currentFrame) return; + this->nextFrameNumber = frame; + this->lastTransitionDirection = this->state.frameTransitionDirection; + this->state.manuelControll = true; + this->state.frameState = IN_TRANSITION; + this->state.frameTransitionDirection = frame < this->state.currentFrame ? -1 : 1; +} + + +// -/----- State information -----\- +OLEDDisplayUiState* OLEDDisplayUi::getUiState(){ + return &this->state; +} + + +int8_t OLEDDisplayUi::update(){ + unsigned long frameStart = millis(); + int8_t timeBudget = this->updateInterval - (frameStart - this->state.lastUpdate); + if ( timeBudget <= 0) { + // Implement frame skipping to ensure time budget is keept + if (this->autoTransition && this->state.lastUpdate != 0) this->state.ticksSinceLastStateSwitch += ceil(-timeBudget / this->updateInterval); + + this->state.lastUpdate = frameStart; + this->tick(); + } + return this->updateInterval - (millis() - frameStart); +} + + +void OLEDDisplayUi::tick() { + this->state.ticksSinceLastStateSwitch++; + + switch (this->state.frameState) { + case IN_TRANSITION: + if (this->state.ticksSinceLastStateSwitch >= this->ticksPerTransition){ + this->state.frameState = FIXED; + this->state.currentFrame = getNextFrameNumber(); + this->state.ticksSinceLastStateSwitch = 0; + this->nextFrameNumber = -1; + } + break; + case FIXED: + // Revert manuelControll + if (this->state.manuelControll) { + this->state.frameTransitionDirection = this->lastTransitionDirection; + this->state.manuelControll = false; + } + if (this->state.ticksSinceLastStateSwitch >= this->ticksPerFrame){ + if (this->autoTransition){ + this->state.frameState = IN_TRANSITION; + } + this->state.ticksSinceLastStateSwitch = 0; + } + break; + } + + this->display->clear(); + this->drawFrame(); + if (shouldDrawIndicators) { + this->drawIndicator(); + } + this->drawOverlays(); + this->display->display(); +} + +void OLEDDisplayUi::resetState() { + this->state.lastUpdate = 0; + this->state.ticksSinceLastStateSwitch = 0; + this->state.frameState = FIXED; + this->state.currentFrame = 0; + this->state.isIndicatorDrawen = true; +} + +void OLEDDisplayUi::drawFrame(){ + switch (this->state.frameState){ + case IN_TRANSITION: { + float progress = (float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition; + int16_t x = 0, y = 0, x1 = 0, y1 = 0; + switch(this->frameAnimationDirection){ + case SLIDE_LEFT: + x = -this->display->width() * progress; + y = 0; + x1 = x + this->display->width(); + y1 = 0; + break; + case SLIDE_RIGHT: + x = this->display->width() * progress; + y = 0; + x1 = x - this->display->width(); + y1 = 0; + break; + case SLIDE_UP: + x = 0; + y = -this->display->height() * progress; + x1 = 0; + y1 = y + this->display->height(); + break; + case SLIDE_DOWN: + default: + x = 0; + y = this->display->height() * progress; + x1 = 0; + y1 = y - this->display->height(); + break; + } + + // Invert animation if direction is reversed. + int8_t dir = this->state.frameTransitionDirection >= 0 ? 1 : -1; + x *= dir; y *= dir; x1 *= dir; y1 *= dir; + + bool drawenCurrentFrame; + + + // Prope each frameFunction for the indicator Drawen state + this->enableIndicator(); + (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, x, y); + drawenCurrentFrame = this->state.isIndicatorDrawen; + + this->enableIndicator(); + (this->frameFunctions[this->getNextFrameNumber()])(this->display, &this->state, x1, y1); + + // Build up the indicatorDrawState + if (drawenCurrentFrame && !this->state.isIndicatorDrawen) { + // Drawen now but not next + this->indicatorDrawState = 2; + } else if (!drawenCurrentFrame && this->state.isIndicatorDrawen) { + // Not drawen now but next + this->indicatorDrawState = 1; + } else if (!drawenCurrentFrame && !this->state.isIndicatorDrawen) { + // Not drawen in both frames + this->indicatorDrawState = 3; + } + + // If the indicator isn't draw in the current frame + // reflect it in state.isIndicatorDrawen + if (!drawenCurrentFrame) this->state.isIndicatorDrawen = false; + + break; + } + case FIXED: + // Always assume that the indicator is drawn! + // And set indicatorDrawState to "not known yet" + this->indicatorDrawState = 0; + this->enableIndicator(); + (this->frameFunctions[this->state.currentFrame])(this->display, &this->state, 0, 0); + break; + } +} + +void OLEDDisplayUi::drawIndicator() { + + // Only draw if the indicator is invisible + // for both frames or + // the indiactor is shown and we are IN_TRANSITION + if (this->indicatorDrawState == 3 || (!this->state.isIndicatorDrawen && this->state.frameState != IN_TRANSITION)) { + return; + } + + uint8_t posOfHighlightFrame = 0; + float indicatorFadeProgress = 0; + + // if the indicator needs to be slided in we want to + // highlight the next frame in the transition + uint8_t frameToHighlight = this->indicatorDrawState == 1 ? this->getNextFrameNumber() : this->state.currentFrame; + + // Calculate the frame that needs to be highlighted + // based on the Direction the indiactor is drawn + switch (this->indicatorDirection){ + case LEFT_RIGHT: + posOfHighlightFrame = frameToHighlight; + break; + case RIGHT_LEFT: + default: + posOfHighlightFrame = this->frameCount - frameToHighlight; + break; + } + + switch (this->indicatorDrawState) { + case 1: // Indicator was not drawn in this frame but will be in next + // Slide IN + indicatorFadeProgress = 1 - ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition); + break; + case 2: // Indicator was drawn in this frame but not in next + // Slide OUT + indicatorFadeProgress = ((float) this->state.ticksSinceLastStateSwitch / (float) this->ticksPerTransition); + break; + } + + //Space between indicators - reduce for small screen sizes + uint16_t indicatorSpacing = 12; + if (this->display->getHeight() < 64 && (this->indicatorPosition == RIGHT || this->indicatorPosition == LEFT)) { + indicatorSpacing = 6; + } + + uint16_t frameStartPos = (indicatorSpacing * frameCount / 2); + const uint8_t *image; + + uint16_t x = 0,y = 0; + + + for (byte i = 0; i < this->frameCount; i++) { + + switch (this->indicatorPosition){ + case TOP: + y = 0 - (8 * indicatorFadeProgress); + x = (this->display->width() / 2) - frameStartPos + 12 * i; + break; + case BOTTOM: + y = (this->display->height() - 8) + (8 * indicatorFadeProgress); + x = (this->display->width() / 2) - frameStartPos + 12 * i; + break; + case RIGHT: + x = (this->display->width() - 8) + (8 * indicatorFadeProgress); + y = (this->display->height() / 2) - frameStartPos + 2 + 12 * i; + break; + case LEFT: + default: + x = 0 - (8 * indicatorFadeProgress); + y = (this->display->height() / 2) - frameStartPos + 2 + indicatorSpacing * i; + break; + } + + if (posOfHighlightFrame == i) { + image = this->activeSymbol; + } else { + image = this->inactiveSymbol; + } + + this->display->drawFastImage(x, y, 8, 8, image); + } +} + +void OLEDDisplayUi::drawOverlays() { + for (uint8_t i=0;ioverlayCount;i++){ + (this->overlayFunctions[i])(this->display, &this->state); + } +} + +uint8_t OLEDDisplayUi::getNextFrameNumber(){ + if (this->nextFrameNumber != -1) return this->nextFrameNumber; + return (this->state.currentFrame + this->frameCount + this->state.frameTransitionDirection) % this->frameCount; +} diff --git a/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h new file mode 100644 index 0000000..2cabf30 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h @@ -0,0 +1,309 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef OLEDDISPLAYUI_h +#define OLEDDISPLAYUI_h + +#include +#include "OLEDDisplay.h" + +//#define DEBUG_OLEDDISPLAYUI(...) Serial.printf( __VA_ARGS__ ) + +#ifndef DEBUG_OLEDDISPLAYUI +#define DEBUG_OLEDDISPLAYUI(...) +#endif + +enum AnimationDirection { + SLIDE_UP, + SLIDE_DOWN, + SLIDE_LEFT, + SLIDE_RIGHT +}; + +enum IndicatorPosition { + TOP, + RIGHT, + BOTTOM, + LEFT +}; + +enum IndicatorDirection { + LEFT_RIGHT, + RIGHT_LEFT +}; + +enum FrameState { + IN_TRANSITION, + FIXED +}; + + +const uint8_t ANIMATION_activeSymbol[] PROGMEM = { + 0x00, 0x18, 0x3c, 0x7e, 0x7e, 0x3c, 0x18, 0x00 +}; + +const uint8_t ANIMATION_inactiveSymbol[] PROGMEM = { + 0x00, 0x0, 0x0, 0x18, 0x18, 0x0, 0x0, 0x00 +}; + + +// Structure of the UiState +struct OLEDDisplayUiState { + uint64_t lastUpdate = 0; + uint16_t ticksSinceLastStateSwitch = 0; + + FrameState frameState = FIXED; + uint8_t currentFrame = 0; + + bool isIndicatorDrawen = true; + + // Normal = 1, Inverse = -1; + int8_t frameTransitionDirection = 1; + + bool manuelControll = false; + + // Custom data that can be used by the user + void* userData = NULL; +}; + +struct LoadingStage { + const char* process; + void (*callback)(); +}; + +typedef void (*FrameCallback)(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); +typedef void (*OverlayCallback)(OLEDDisplay *display, OLEDDisplayUiState* state); +typedef void (*LoadingDrawFunction)(OLEDDisplay *display, LoadingStage* stage, uint8_t progress); + +class OLEDDisplayUi { + private: + OLEDDisplay *display; + + // Symbols for the Indicator + IndicatorPosition indicatorPosition = BOTTOM; + IndicatorDirection indicatorDirection = LEFT_RIGHT; + + const uint8_t* activeSymbol = ANIMATION_activeSymbol; + const uint8_t* inactiveSymbol = ANIMATION_inactiveSymbol; + + bool shouldDrawIndicators = true; + + // Values for the Frames + AnimationDirection frameAnimationDirection = SLIDE_RIGHT; + + int8_t lastTransitionDirection = 1; + + uint16_t ticksPerFrame = 151; // ~ 5000ms at 30 FPS + uint16_t ticksPerTransition = 15; // ~ 500ms at 30 FPS + + bool autoTransition = true; + + FrameCallback* frameFunctions; + uint8_t frameCount = 0; + + // Internally used to transition to a specific frame + int8_t nextFrameNumber = -1; + + // Values for Overlays + OverlayCallback* overlayFunctions; + uint8_t overlayCount = 0; + + // Will the Indicator be drawen + // 3 Not drawn in both frames + // 2 Drawn this frame but not next + // 1 Not drown this frame but next + // 0 Not known yet + uint8_t indicatorDrawState = 1; + + // Loading screen + LoadingDrawFunction loadingDrawFunction = [](OLEDDisplay *display, LoadingStage* stage, uint8_t progress) { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_10); + display->drawString(64, 18, stage->process); + display->drawProgressBar(4, 32, 120, 8, progress); + }; + + // UI State + OLEDDisplayUiState state; + + // Bookeeping for update + uint8_t updateInterval = 33; + + uint8_t getNextFrameNumber(); + void drawIndicator(); + void drawFrame(); + void drawOverlays(); + void tick(); + void resetState(); + + public: + + OLEDDisplayUi(OLEDDisplay *display); + + /** + * Initialise the display + */ + void init(); + + /** + * Configure the internal used target FPS + */ + void setTargetFPS(uint8_t fps); + + // Automatic Controll + /** + * Enable automatic transition to next frame after the some time can be configured with `setTimePerFrame` and `setTimePerTransition`. + */ + void enableAutoTransition(); + + /** + * Disable automatic transition to next frame. + */ + void disableAutoTransition(); + + /** + * Set the direction if the automatic transitioning + */ + void setAutoTransitionForwards(); + void setAutoTransitionBackwards(); + + /** + * Set the approx. time a frame is displayed + */ + void setTimePerFrame(uint16_t time); + + /** + * Set the approx. time a transition will take + */ + void setTimePerTransition(uint16_t time); + + // Customize indicator position and style + + /** + * Draw the indicator. + * This is the defaut state for all frames if + * the indicator was hidden on the previous frame + * it will be slided in. + */ + void enableIndicator(); + + /** + * Don't draw the indicator. + * This will slide out the indicator + * when transitioning to the next frame. + */ + void disableIndicator(); + + /** + * Enable drawing of indicators + */ + void enableAllIndicators(); + + /** + * Disable draw of indicators. + */ + void disableAllIndicators(); + + /** + * Set the position of the indicator bar. + */ + void setIndicatorPosition(IndicatorPosition pos); + + /** + * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING + */ + void setIndicatorDirection(IndicatorDirection dir); + + /** + * Set the symbol to indicate an active frame in the indicator bar. + */ + void setActiveSymbol(const uint8_t* symbol); + + /** + * Set the symbol to indicate an inactive frame in the indicator bar. + */ + void setInactiveSymbol(const uint8_t* symbol); + + + // Frame settings + + /** + * Configure what animation is used to transition from one frame to another + */ + void setFrameAnimation(AnimationDirection dir); + + /** + * Add frame drawing functions + */ + void setFrames(FrameCallback* frameFunctions, uint8_t frameCount); + + // Overlay + + /** + * Add overlays drawing functions that are draw independent of the Frames + */ + void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount); + + + // Loading animation + /** + * Set the function that will draw each step + * in the loading animation + */ + void setLoadingDrawFunction(LoadingDrawFunction loadingFunction); + + + /** + * Run the loading process + */ + void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount); + + + // Manual Control + void nextFrame(); + void previousFrame(); + + /** + * Switch without transition to frame `frame`. + */ + void switchToFrame(uint8_t frame); + + /** + * Transition to frame `frame`, when the `frame` number is bigger than the current + * frame the forward animation will be used, otherwise the backwards animation is used. + */ + void transitionToFrame(uint8_t frame); + + // State Info + OLEDDisplayUiState* getUiState(); + + int8_t update(); +}; +#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106.h b/printermonitor/libs/OledDisplay/src/SH1106.h new file mode 100644 index 0000000..47188d1 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/SH1106.h @@ -0,0 +1,39 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef SH1106_h +#define SH1106_h +#include "SH1106Wire.h" + +// For make SH1106 an alias for SH1106Wire +typedef SH1106Wire SH1106; + + +#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106Brzo.h b/printermonitor/libs/OledDisplay/src/SH1106Brzo.h new file mode 100644 index 0000000..8ef3d5b --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/SH1106Brzo.h @@ -0,0 +1,138 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef SH1106Brzo_h +#define SH1106Brzo_h + +#include "OLEDDisplay.h" +#include + +#if F_CPU == 160000000L + #define BRZO_I2C_SPEED 1000 +#else + #define BRZO_I2C_SPEED 800 +#endif + +class SH1106Brzo : public OLEDDisplay { + private: + uint8_t _address; + uint8_t _sda; + uint8_t _scl; + + public: + SH1106Brzo(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_address = _address; + this->_sda = _sda; + this->_scl = _scl; + } + + bool connect(){ + brzo_i2c_setup(_sda, _scl, 0); + return true; + } + + void display(void) { + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (displayHeight / 8); y++) { + for (x = 0; x < displayWidth; x++) { + uint16_t pos = x + y * displayWidth; + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + if (minBoundY == UINT8_MAX) return; + + byte k = 0; + uint8_t sendBuffer[17]; + sendBuffer[0] = 0x40; + + // Calculate the colum offset + uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; + uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); + + brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); + + for (y = minBoundY; y <= maxBoundY; y++) { + sendCommand(0xB0 + y); + sendCommand(minBoundXp2H); + sendCommand(minBoundXp2L); + for (x = minBoundX; x <= maxBoundX; x++) { + k++; + sendBuffer[k] = buffer[x + y * displayWidth]; + if (k == 16) { + brzo_i2c_write(sendBuffer, 17, true); + k = 0; + } + } + if (k != 0) { + brzo_i2c_write(sendBuffer, k + 1, true); + k = 0; + } + yield(); + } + if (k != 0) { + brzo_i2c_write(sendBuffer, k + 1, true); + } + brzo_i2c_end_transaction(); + #else + #endif + } + + private: + inline void sendCommand(uint8_t com) __attribute__((always_inline)){ + uint8_t command[2] = {0x80 /* command mode */, com}; + brzo_i2c_start_transaction(_address, BRZO_I2C_SPEED); + brzo_i2c_write(command, 2, true); + brzo_i2c_end_transaction(); + } +}; + +#endif diff --git a/printermonitor/libs/OledDisplay/src/SH1106Spi.h b/printermonitor/libs/OledDisplay/src/SH1106Spi.h new file mode 100644 index 0000000..cf8f088 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/SH1106Spi.h @@ -0,0 +1,132 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef SH1106Spi_h +#define SH1106Spi_h + +#include "OLEDDisplay.h" +#include + +class SH1106Spi : public OLEDDisplay { + private: + uint8_t _rst; + uint8_t _dc; + + public: + SH1106Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_rst = _rst; + this->_dc = _dc; + } + + bool connect(){ + pinMode(_dc, OUTPUT); + pinMode(_rst, OUTPUT); + + SPI.begin (); + SPI.setClockDivider (SPI_CLOCK_DIV2); + + // Pulse Reset low for 10ms + digitalWrite(_rst, HIGH); + delay(1); + digitalWrite(_rst, LOW); + delay(10); + digitalWrite(_rst, HIGH); + return true; + } + + void display(void) { + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (displayHeight / 8); y++) { + for (x = 0; x < displayWidth; x++) { + uint16_t pos = x + y * displayWidth; + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + if (minBoundY == UINT8_MAX) return; + + // Calculate the colum offset + uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; + uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); + + for (y = minBoundY; y <= maxBoundY; y++) { + sendCommand(0xB0 + y); + sendCommand(minBoundXp2H); + sendCommand(minBoundXp2L); + digitalWrite(_dc, HIGH); // data mode + for (x = minBoundX; x <= maxBoundX; x++) { + SPI.transfer(buffer[x + y * displayWidth]); + } + yield(); + } + #else + for (uint8_t y=0; y + +#define SH1106_SET_PUMP_VOLTAGE 0X30 +#define SH1106_SET_PUMP_MODE 0XAD +#define SH1106_PUMP_ON 0X8B +#define SH1106_PUMP_OFF 0X8A +//-------------------------------------- + +class SH1106Wire : public OLEDDisplay { + private: + uint8_t _address; + uint8_t _sda; + uint8_t _scl; + + public: + SH1106Wire(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_address = _address; + this->_sda = _sda; + this->_scl = _scl; + } + + bool connect() { + Wire.begin(this->_sda, this->_scl); + // Let's use ~700khz if ESP8266 is in 160Mhz mode + // this will be limited to ~400khz if the ESP8266 in 80Mhz mode. + Wire.setClock(700000); + return true; + } + + void display(void) { + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (displayHeight / 8); y++) { + for (x = 0; x < displayWidth; x++) { + uint16_t pos = x + y * displayWidth; + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + if (minBoundY == UINT8_MAX) return; + + // Calculate the colum offset + uint8_t minBoundXp2H = (minBoundX + 2) & 0x0F; + uint8_t minBoundXp2L = 0x10 | ((minBoundX + 2) >> 4 ); + + byte k = 0; + for (y = minBoundY; y <= maxBoundY; y++) { + sendCommand(0xB0 + y); + sendCommand(minBoundXp2H); + sendCommand(minBoundXp2L); + for (x = minBoundX; x <= maxBoundX; x++) { + if (k == 0) { + Wire.beginTransmission(_address); + Wire.write(0x40); + } + Wire.write(buffer[x + y * displayWidth]); + k++; + if (k == 16) { + Wire.endTransmission(); + k = 0; + } + } + if (k != 0) { + Wire.endTransmission(); + k = 0; + } + yield(); + } + + if (k != 0) { + Wire.endTransmission(); + } + #else + uint8_t * p = &buffer[0]; + for (uint8_t y=0; y<8; y++) { + sendCommand(0xB0+y); + sendCommand(0x02); + sendCommand(0x10); + for( uint8_t x=0; x<8; x++) { + Wire.beginTransmission(_address); + Wire.write(0x40); + for (uint8_t k = 0; k < 16; k++) { + Wire.write(*p++); + } + Wire.endTransmission(); + } + } + #endif + } + + private: + inline void sendCommand(uint8_t command) __attribute__((always_inline)){ + Wire.beginTransmission(_address); + Wire.write(0x80); + Wire.write(command); + Wire.endTransmission(); + } + + +}; + +#endif diff --git a/printermonitor/libs/OledDisplay/src/SSD1306.h b/printermonitor/libs/OledDisplay/src/SSD1306.h new file mode 100644 index 0000000..f6bd554 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/SSD1306.h @@ -0,0 +1,39 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef SSD1306_h +#define SSD1306_h +#include "SSD1306Wire.h" + +// For legacy support make SSD1306 an alias for SSD1306 +typedef SSD1306Wire SSD1306; + + +#endif diff --git a/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h b/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h new file mode 100644 index 0000000..e90b7b3 --- /dev/null +++ b/printermonitor/libs/OledDisplay/src/SSD1306Brzo.h @@ -0,0 +1,159 @@ +/** + * The MIT License (MIT) + * + * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn + * Copyright (c) 2018 by Fabrice Weinberg + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * ThingPulse invests considerable time and money to develop these open source libraries. + * Please support us by buying our products (and not the clones) from + * https://thingpulse.com + * + */ + +#ifndef SSD1306Brzo_h +#define SSD1306Brzo_h + +#include "OLEDDisplay.h" +#include + +#if F_CPU == 160000000L + #define BRZO_I2C_SPEED 1000 +#else + #define BRZO_I2C_SPEED 800 +#endif + +class SSD1306Brzo : public OLEDDisplay { + private: + uint8_t _address; + uint8_t _sda; + uint8_t _scl; + + public: + SSD1306Brzo(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_address = _address; + this->_sda = _sda; + this->_scl = _scl; + } + + bool connect(){ + brzo_i2c_setup(_sda, _scl, 0); + return true; + } + + void display(void) { + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (displayHeight / 8); y++) { + for (x = 0; x < displayWidth; x++) { + uint16_t pos = x + y * displayWidth; + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + if (minBoundY == UINT8_MAX) return; + + sendCommand(COLUMNADDR); + sendCommand(minBoundX); + sendCommand(maxBoundX); + + sendCommand(PAGEADDR); + sendCommand(minBoundY); + sendCommand(maxBoundY); + + byte k = 0; + uint8_t sendBuffer[17]; + sendBuffer[0] = 0x40; + brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); + for (y = minBoundY; y <= maxBoundY; y++) { + for (x = minBoundX; x <= maxBoundX; x++) { + k++; + sendBuffer[k] = buffer[x + y * displayWidth]; + if (k == 16) { + brzo_i2c_write(sendBuffer, 17, true); + k = 0; + } + } + yield(); + } + brzo_i2c_write(sendBuffer, k + 1, true); + brzo_i2c_end_transaction(); + #else + // No double buffering + sendCommand(COLUMNADDR); + sendCommand(0x0); + sendCommand(0x7F); + + sendCommand(PAGEADDR); + sendCommand(0x0); + + if (geometry == GEOMETRY_128_64) { + sendCommand(0x7); + } else if (geometry == GEOMETRY_128_32) { + sendCommand(0x3); + } + + uint8_t sendBuffer[17]; + sendBuffer[0] = 0x40; + brzo_i2c_start_transaction(this->_address, BRZO_I2C_SPEED); + for (uint16_t i=0; i + +#if F_CPU == 160000000L + #define BRZO_I2C_SPEED 1000 +#else + #define BRZO_I2C_SPEED 800 +#endif + +class SSD1306Spi : public OLEDDisplay { + private: + uint8_t _rst; + uint8_t _dc; + uint8_t _cs; + + public: + SSD1306Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_rst = _rst; + this->_dc = _dc; + this->_cs = _cs; + } + + bool connect(){ + pinMode(_dc, OUTPUT); + pinMode(_cs, OUTPUT); + pinMode(_rst, OUTPUT); + + SPI.begin (); + SPI.setClockDivider (SPI_CLOCK_DIV2); + + // Pulse Reset low for 10ms + digitalWrite(_rst, HIGH); + delay(1); + digitalWrite(_rst, LOW); + delay(10); + digitalWrite(_rst, HIGH); + return true; + } + + void display(void) { + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (displayHeight / 8); y++) { + for (x = 0; x < displayWidth; x++) { + uint16_t pos = x + y * displayWidth; + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + if (minBoundY == UINT8_MAX) return; + + sendCommand(COLUMNADDR); + sendCommand(minBoundX); + sendCommand(maxBoundX); + + sendCommand(PAGEADDR); + sendCommand(minBoundY); + sendCommand(maxBoundY); + + digitalWrite(_cs, HIGH); + digitalWrite(_dc, HIGH); // data mode + digitalWrite(_cs, LOW); + for (y = minBoundY; y <= maxBoundY; y++) { + for (x = minBoundX; x <= maxBoundX; x++) { + SPI.transfer(buffer[x + y * displayWidth]); + } + yield(); + } + digitalWrite(_cs, HIGH); + #else + // No double buffering + sendCommand(COLUMNADDR); + sendCommand(0x0); + sendCommand(0x7F); + + sendCommand(PAGEADDR); + sendCommand(0x0); + + if (geometry == GEOMETRY_128_64) { + sendCommand(0x7); + } else if (geometry == GEOMETRY_128_32) { + sendCommand(0x3); + } + + digitalWrite(_cs, HIGH); + digitalWrite(_dc, HIGH); // data mode + digitalWrite(_cs, LOW); + for (uint16_t i=0; i + +class SSD1306Wire : public OLEDDisplay { + private: + uint8_t _address; + uint8_t _sda; + uint8_t _scl; + bool _doI2cAutoInit = false; + + public: + SSD1306Wire(uint8_t _address, uint8_t _sda, uint8_t _scl, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) { + setGeometry(g); + + this->_address = _address; + this->_sda = _sda; + this->_scl = _scl; + } + + bool connect() { + Wire.begin(this->_sda, this->_scl); + // Let's use ~700khz if ESP8266 is in 160Mhz mode + // this will be limited to ~400khz if the ESP8266 in 80Mhz mode. + Wire.setClock(700000); + return true; + } + + void display(void) { + initI2cIfNeccesary(); + const int x_offset = (128 - this->width()) / 2; + #ifdef OLEDDISPLAY_DOUBLE_BUFFER + uint8_t minBoundY = UINT8_MAX; + uint8_t maxBoundY = 0; + + uint8_t minBoundX = UINT8_MAX; + uint8_t maxBoundX = 0; + uint8_t x, y; + + // Calculate the Y bounding box of changes + // and copy buffer[pos] to buffer_back[pos]; + for (y = 0; y < (this->height() / 8); y++) { + for (x = 0; x < this->width(); x++) { + uint16_t pos = x + y * this->width(); + if (buffer[pos] != buffer_back[pos]) { + minBoundY = _min(minBoundY, y); + maxBoundY = _max(maxBoundY, y); + minBoundX = _min(minBoundX, x); + maxBoundX = _max(maxBoundX, x); + } + buffer_back[pos] = buffer[pos]; + } + yield(); + } + + // If the minBoundY wasn't updated + // we can savely assume that buffer_back[pos] == buffer[pos] + // holdes true for all values of pos + + if (minBoundY == UINT8_MAX) return; + + sendCommand(COLUMNADDR); + sendCommand(x_offset + minBoundX); + sendCommand(x_offset + maxBoundX); + + sendCommand(PAGEADDR); + sendCommand(minBoundY); + sendCommand(maxBoundY); + + byte k = 0; + for (y = minBoundY; y <= maxBoundY; y++) { + for (x = minBoundX; x <= maxBoundX; x++) { + if (k == 0) { + Wire.beginTransmission(_address); + Wire.write(0x40); + } + + Wire.write(buffer[x + y * this->width()]); + k++; + if (k == 16) { + Wire.endTransmission(); + k = 0; + } + } + yield(); + } + + if (k != 0) { + Wire.endTransmission(); + } + #else + + sendCommand(COLUMNADDR); + sendCommand(x_offset); + sendCommand(x_offset + (this->width() - 1)); + + sendCommand(PAGEADDR); + sendCommand(0x0); + sendCommand((this->height() / 8) - 1); + + if (geometry == GEOMETRY_128_64) { + sendCommand(0x7); + } else if (geometry == GEOMETRY_128_32) { + sendCommand(0x3); + } + + for (uint16_t i=0; i < displayBufferSize; i++) { + Wire.beginTransmission(this->_address); + Wire.write(0x40); + for (uint8_t x = 0; x < 16; x++) { + Wire.write(buffer[i]); + i++; + } + i--; + Wire.endTransmission(); + } + #endif + } + + void setI2cAutoInit(bool doI2cAutoInit) { + _doI2cAutoInit = doI2cAutoInit; + } + + private: + inline void sendCommand(uint8_t command) __attribute__((always_inline)){ + initI2cIfNeccesary(); + Wire.beginTransmission(_address); + Wire.write(0x80); + Wire.write(command); + Wire.endTransmission(); + } + + void initI2cIfNeccesary() { + if (_doI2cAutoInit) { + Wire.begin(this->_sda, this->_scl); + } + } + +}; + +#endif diff --git a/printermonitor/printermonitor.ino b/printermonitor/printermonitor.ino index 428f36a..a029565 100644 --- a/printermonitor/printermonitor.ino +++ b/printermonitor/printermonitor.ino @@ -30,7 +30,7 @@ SOFTWARE. #include "Settings.h" -#define VERSION "2.4" +#define VERSION "2.5" #define HOSTNAME "OctMon-" #define CONFIG "/conf.txt" From 9d51257d046afb19f9c28a44ccc5914c9c798fbb Mon Sep 17 00:00:00 2001 From: Chrome Legion Date: Mon, 18 Feb 2019 19:17:39 -0700 Subject: [PATCH 3/4] Qrome - removed the OledDisplay libs as they are not used here --- printermonitor/libs/OledDisplay/README.md | 405 ------ .../libs/OledDisplay/UPGRADE-3.0.md | 125 -- .../libs/OledDisplay/UPGRADE-4.0.md | 27 - printermonitor/libs/OledDisplay/license | 24 - .../libs/OledDisplay/resources/DemoFrame1.jpg | Bin 16026 -> 0 bytes .../libs/OledDisplay/resources/DemoFrame2.jpg | Bin 19502 -> 0 bytes .../libs/OledDisplay/resources/DemoFrame3.jpg | Bin 21777 -> 0 bytes .../libs/OledDisplay/resources/DemoFrame4.jpg | Bin 25325 -> 0 bytes .../libs/OledDisplay/resources/FontTool.png | Bin 14052 -> 0 bytes .../OledDisplay/resources/SPI_version.jpg | Bin 26912 -> 0 bytes .../libs/OledDisplay/resources/Thumbs.db | Bin 21504 -> 0 bytes .../OledDisplay/resources/glyphEditor.html | 633 -------- .../OledDisplay/resources/glyphEditor.png | Bin 68751 -> 0 bytes .../libs/OledDisplay/resources/xbmPreview.png | Bin 41692 -> 0 bytes .../libs/OledDisplay/src/OLEDDisplay.cpp | 890 ------------ .../libs/OledDisplay/src/OLEDDisplay.h | 329 ----- .../libs/OledDisplay/src/OLEDDisplayFonts.h | 1274 ----------------- .../libs/OledDisplay/src/OLEDDisplayUi.cpp | 422 ------ .../libs/OledDisplay/src/OLEDDisplayUi.h | 309 ---- printermonitor/libs/OledDisplay/src/SH1106.h | 39 - .../libs/OledDisplay/src/SH1106Brzo.h | 138 -- .../libs/OledDisplay/src/SH1106Spi.h | 132 -- .../libs/OledDisplay/src/SH1106Wire.h | 157 -- printermonitor/libs/OledDisplay/src/SSD1306.h | 39 - .../libs/OledDisplay/src/SSD1306Brzo.h | 159 -- .../libs/OledDisplay/src/SSD1306Spi.h | 160 --- .../libs/OledDisplay/src/SSD1306Wire.h | 173 --- 27 files changed, 5435 deletions(-) delete mode 100644 printermonitor/libs/OledDisplay/README.md delete mode 100644 printermonitor/libs/OledDisplay/UPGRADE-3.0.md delete mode 100644 printermonitor/libs/OledDisplay/UPGRADE-4.0.md delete mode 100644 printermonitor/libs/OledDisplay/license delete mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg delete mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg delete mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame3.jpg delete mode 100644 printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg delete mode 100644 printermonitor/libs/OledDisplay/resources/FontTool.png delete mode 100644 printermonitor/libs/OledDisplay/resources/SPI_version.jpg delete mode 100644 printermonitor/libs/OledDisplay/resources/Thumbs.db delete mode 100644 printermonitor/libs/OledDisplay/resources/glyphEditor.html delete mode 100644 printermonitor/libs/OledDisplay/resources/glyphEditor.png delete mode 100644 printermonitor/libs/OledDisplay/resources/xbmPreview.png delete mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplay.cpp delete mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplay.h delete mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayFonts.h delete mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayUi.cpp delete mode 100644 printermonitor/libs/OledDisplay/src/OLEDDisplayUi.h delete mode 100644 printermonitor/libs/OledDisplay/src/SH1106.h delete mode 100644 printermonitor/libs/OledDisplay/src/SH1106Brzo.h delete mode 100644 printermonitor/libs/OledDisplay/src/SH1106Spi.h delete mode 100644 printermonitor/libs/OledDisplay/src/SH1106Wire.h delete mode 100644 printermonitor/libs/OledDisplay/src/SSD1306.h delete mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Brzo.h delete mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Spi.h delete mode 100644 printermonitor/libs/OledDisplay/src/SSD1306Wire.h diff --git a/printermonitor/libs/OledDisplay/README.md b/printermonitor/libs/OledDisplay/README.md deleted file mode 100644 index d7db5ef..0000000 --- a/printermonitor/libs/OledDisplay/README.md +++ /dev/null @@ -1,405 +0,0 @@ -[![Build Status](https://travis-ci.org/ThingPulse/esp8266-oled-ssd1306.svg?branch=master)](https://travis-ci.org/ThingPulse/esp8266-oled-ssd1306) - -# ESP8266 OLED SSD1306 - -> We just released version 4.0.0. Please have a look at our [upgrade guide](UPGRADE-4.0.md) - -This is a driver for the SSD1306 based 128x64 pixel OLED display running on the Arduino/ESP8266 platform. -Can be used with either the I2C or SPI version of the display - -You can either download this library as a zip file and unpack it to your Arduino/libraries folder or (once it has been added) choose it from the Arduino library manager. - -It is also available as a platformio library. Just execute the following command: -``` -platformio lib install 562 -``` - -## Credits - -This library has initially been written by Daniel Eichhorn (@squix78). Many thanks go to Fabrice Weinberg (@FWeinb) for optimizing and refactoring many aspects of the library. Also many thanks to the many committers who helped to add new features and who fixed many bugs. -The init sequence for the SSD1306 was inspired by Adafruit's library for the same display. - -## Usage - -Check out the examples folder for a few comprehensive demonstrations how to use the library. Also check out the [ESP8266 Weather Station](https://github.com/ThingPulse/esp8266-weather-station) library which uses the OLED library to display beautiful weather information. - -## Upgrade - -The API changed a lot with the 3.0 release. If you were using this library with older versions please have a look at the [Upgrade Guide](UPGRADE-3.0.md). - -Going from 3.x version to 4.0 a lot of internals changed and compatibility for more displays was added. Please read the [Upgrade Guide](UPGRADE-4.0.md). - -## Features - -* Draw pixels at given coordinates -* Draw lines from given coordinates to given coordinates -* Draw or fill a rectangle with given dimensions -* Draw Text at given coordinates: - * Define Alignment: Left, Right and Center - * Set the Fontface you want to use (see section Fonts below) - * Limit the width of the text by an amount of pixels. Before this widths will be reached, the renderer will wrap the text to a new line if possible -* Display content in automatically side scrolling carousel - * Define transition cycles - * Define how long one frame will be displayed - * Draw the different frames in callback methods - * One indicator per frame will be automatically displayed. The active frame will be displayed from inactive once - -## Fonts - -Fonts are defined in a proprietary but open format. You can create new font files by choosing from a given list -of open sourced Fonts from this web app: http://oleddisplay.squix.ch -Choose the font family, style and size, check the preview image and if you like what you see click the "Create" button. This will create the font array in a text area form where you can copy and paste it into a new or existing header file. - - -![FontTool](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/FontTool.png) - -## Hardware Abstraction - -The library supports different protocols to access the OLED display. Currently there is support for I2C using the built in Wire.h library, I2C by using the much faster BRZO I2C library [https://github.com/pasko-zh/brzo_i2c] written in assembler and it also supports displays which come with the SPI interface. - -### I2C with Wire.h - -```C++ -#include -#include "SSD1306Wire.h" - -SSD1306Wire display(ADDRESS, SDA, SDC); -``` -or for a SH1106: -```C++ -#include -#include "SH1106Wire.h" - -SH1106Wire display(ADDRESS, SDA, SDC); -``` - -### I2C with brzo_i2c - -```C++ -#include -#include "SSD1306Brzo.h" - -SSD1306Brzo display(ADDRESS, SDA, SDC); -``` -or for the SH1106: -```C++ -#include -#include "SH1106Brzo.h" - -SH1106Brzo display(ADDRESS, SDA, SDC); -``` - -### SPI - -```C++ -#include -#include "SSD1306Spi.h" - -SSD1306Spi display(RES, DC, CS); -``` -or for the SH1106: -```C++ -#include -#include "SH1106Spi.h" - -SH1106Spi display(RES, DC, CS); -``` - -## API - -### Display Control - -```C++ -// Initialize the display -void init(); - -// Free the memory used by the display -void end(); - -// Cycle through the initialization -void resetDisplay(void); - -// Connect again to the display through I2C -void reconnect(void); - -// Turn the display on -void displayOn(void); - -// Turn the display offs -void displayOff(void); - -// Clear the local pixel buffer -void clear(void); - -// Write the buffer to the display memory -void display(void); - -// Inverted display mode -void invertDisplay(void); - -// Normal display mode -void normalDisplay(void); - -// Set display contrast -// really low brightness & contrast: contrast = 10, precharge = 5, comdetect = 0 -// normal brightness & contrast: contrast = 100 -void setContrast(uint8_t contrast, uint8_t precharge = 241, uint8_t comdetect = 64); - -// Convenience method to access -void setBrightness(uint8_t); - -// Turn the display upside down -void flipScreenVertically(); - -// Draw the screen mirrored -void mirrorScreen(); -``` - -## Pixel drawing - -```C++ - -/* Drawing functions */ -// Sets the color of all pixel operations -void setColor(OLEDDISPLAY_COLOR color); - -// Draw a pixel at given position -void setPixel(int16_t x, int16_t y); - -// Draw a line from position 0 to position 1 -void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); - -// Draw the border of a rectangle at the given location -void drawRect(int16_t x, int16_t y, int16_t width, int16_t height); - -// Fill the rectangle -void fillRect(int16_t x, int16_t y, int16_t width, int16_t height); - -// Draw the border of a circle -void drawCircle(int16_t x, int16_t y, int16_t radius); - -// Fill circle -void fillCircle(int16_t x, int16_t y, int16_t radius); - -// Draw a line horizontally -void drawHorizontalLine(int16_t x, int16_t y, int16_t length); - -// Draw a lin vertically -void drawVerticalLine(int16_t x, int16_t y, int16_t length); - -// Draws a rounded progress bar with the outer dimensions given by width and height. Progress is -// a unsigned byte value between 0 and 100 -void drawProgressBar(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t progress); - -// Draw a bitmap in the internal image format -void drawFastImage(int16_t x, int16_t y, int16_t width, int16_t height, const uint8_t *image); - -// Draw a XBM -void drawXbm(int16_t x, int16_t y, int16_t width, int16_t height, const char* xbm); -``` - -## Text operations - -``` C++ -void drawString(int16_t x, int16_t y, String text); - -// Draws a String with a maximum width at the given location. -// If the given String is wider than the specified width -// The text will be wrapped to the next line at a space or dash -void drawStringMaxWidth(int16_t x, int16_t y, int16_t maxLineWidth, String text); - -// Returns the width of the const char* with the current -// font settings -uint16_t getStringWidth(const char* text, uint16_t length); - -// Convencience method for the const char version -uint16_t getStringWidth(String text); - -// Specifies relative to which anchor point -// the text is rendered. Available constants: -// TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER_BOTH -void setTextAlignment(OLEDDISPLAY_TEXT_ALIGNMENT textAlignment); - -// Sets the current font. Available default fonts -// ArialMT_Plain_10, ArialMT_Plain_16, ArialMT_Plain_24 -// Or create one with the font tool at http://oleddisplay.squix.ch -void setFont(const uint8_t* fontData); -``` - -## Ui Library (OLEDDisplayUi) - -The Ui Library is used to provide a basic set of Ui elements called, `Frames` and `Overlays`. A `Frame` is used to provide -information the default behaviour is to display a `Frame` for a defined time and than move to the next. The library also provides an `Indicator` that will be updated accordingly. An `Overlay` on the other hand is a pieces of information (e.g. a clock) that is displayed always at the same position. - - -```C++ -/** - * Initialise the display - */ -void init(); - -/** - * Configure the internal used target FPS - */ -void setTargetFPS(uint8_t fps); - -/** - * Enable automatic transition to next frame after the some time can be configured with - * `setTimePerFrame` and `setTimePerTransition`. - */ -void enableAutoTransition(); - -/** - * Disable automatic transition to next frame. - */ -void disableAutoTransition(); - -/** - * Set the direction if the automatic transitioning - */ -void setAutoTransitionForwards(); -void setAutoTransitionBackwards(); - -/** - * Set the approx. time a frame is displayed - */ -void setTimePerFrame(uint16_t time); - -/** - * Set the approx. time a transition will take - */ -void setTimePerTransition(uint16_t time); - -/** - * Draw the indicator. - * This is the default state for all frames if - * the indicator was hidden on the previous frame - * it will be slided in. - */ -void enableIndicator(); - -/** - * Don't draw the indicator. - * This will slide out the indicator - * when transitioning to the next frame. - */ -void disableIndicator(); - -/** - * Enable drawing of all indicators. - */ -void enableAllIndicators(); - -/** - * Disable drawing of all indicators. - */ -void disableAllIndicators(); - -/** - * Set the position of the indicator bar. - */ -void setIndicatorPosition(IndicatorPosition pos); - -/** - * Set the direction of the indicator bar. Defining the order of frames ASCENDING / DESCENDING - */ -void setIndicatorDirection(IndicatorDirection dir); - -/** - * Set the symbol to indicate an active frame in the indicator bar. - */ -void setActiveSymbol(const char* symbol); - -/** - * Set the symbol to indicate an inactive frame in the indicator bar. - */ -void setInactiveSymbol(const char* symbol); - -/** - * Configure what animation is used to transition from one frame to another - */ -void setFrameAnimation(AnimationDirection dir); - -/** - * Add frame drawing functions - */ -void setFrames(FrameCallback* frameFunctions, uint8_t frameCount); - -/** - * Add overlays drawing functions that are draw independent of the Frames - */ -void setOverlays(OverlayCallback* overlayFunctions, uint8_t overlayCount); - -/** - * Set the function that will draw each step - * in the loading animation - */ -void setLoadingDrawFunction(LoadingDrawFunction loadingDrawFunction); - -/** - * Run the loading process - */ -void runLoadingProcess(LoadingStage* stages, uint8_t stagesCount); - -// Manuell Controll -void nextFrame(); -void previousFrame(); - -/** - * Switch without transition to frame `frame`. - */ -void switchToFrame(uint8_t frame); - -/** - * Transition to frame `frame`, when the `frame` number is bigger than the current - * frame the forward animation will be used, otherwise the backwards animation is used. - */ -void transitionToFrame(uint8_t frame); - -// State Info -OLEDDisplayUiState* getUiState(); - -// This needs to be called in the main loop -// the returned value is the remaining time (in ms) -// you have to draw after drawing to keep the frame budget. -int8_t update(); -``` - -## Example: SSD1306Demo - -### Frame 1 -![DemoFrame1](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame1.jpg) - -This frame shows three things: - * How to draw an xbm image - * How to draw a static text which is not moved by the frame transition - * The active/inactive frame indicators - -### Frame 2 -![DemoFrame2](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame2.jpg) - -Currently there are one fontface with three sizes included in the library: Arial 10, 16 and 24. Once the converter is published you will be able to convert any ttf font into the used format. - -### Frame 3 - -![DemoFrame3](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame3.jpg) - -This frame demonstrates the text alignment. The coordinates in the frame show relative to which position the texts have been rendered. - -### Frame 4 - -![DemoFrame4](https://github.com/squix78/esp8266-oled-ssd1306/raw/master/resources/DemoFrame4.jpg) - -This shows how to use define a maximum width after which the driver automatically wraps a word to the next line. This comes in very handy if you have longer texts to display. - -### SPI version - -![SPIVersion](https://github.com/neptune2/esp8266-oled-ssd1306/raw/master/resources/SPI_version.jpg) - -This shows the code working on the SPI version of the display. See demo code for ESP8266 pins used. - -## Project using this library - - * [QRCode ESP8266](https://github.com/anunpanya/ESP8266_QRcode) (by @anunpanya) - * [Scan I2C](https://github.com/hallard/Scan-I2C-WiFi) (by @hallard) - * [Weather Station](https://github.com/squix78/esp8266-weather-station) (by @squix) diff --git a/printermonitor/libs/OledDisplay/UPGRADE-3.0.md b/printermonitor/libs/OledDisplay/UPGRADE-3.0.md deleted file mode 100644 index e7a315b..0000000 --- a/printermonitor/libs/OledDisplay/UPGRADE-3.0.md +++ /dev/null @@ -1,125 +0,0 @@ -# Upgrade from 2.0 to 3.0 - -While developing version 3.0 we made some breaking changes to the public -API of this library. This document will help you update your code to work with -version 3.0 - -## Font Definitions - -To get better performance and a smaller font definition format, we change the memory -layout of the font definition format. If you are using custom fonts not included in -this library we updated the font generator [here](http://oleddisplay.squix.ch/#/home). -Please update your fonts to be working with 3.0 by selecting the respective version in the dropdown. - - -## Architectural Changes - -To become a more versatile library for the SSD1306 chipset we abstracted the -hardware connection into subclasses of the base display class now called `OLEDDisplay`. -This library is currently shipping with three implementations: - - * `SSD1306Wire` implementing the I2C protocol using the Wire Library. - * `SSD1306Brzo` implementing the I2C protocol using the faster [`brzo_i2c`](https://github.com/pasko-zh/brzo_i2c) library. - * `SSD1306Spi` implementing the SPI protocol. - -To keep backwards compatiblity with the old API `SSD1306` is an alias of `SSD1306Wire`. -If you are not using the UI components you don't have to change anything to keep your code working. - -## Name Changes - -[Naming things is hard](http://martinfowler.com/bliki/TwoHardThings.html), to better reflect our intention with this library -we changed the name of the base class to `OLEDDisplay` and the UI library accordingly to `OLEDDisplayUi`. -As a consequence the type definitions of all frame and overlay related functions changed. -This means that you have to update all your frame drawing callbacks from: - -```c -bool frame1(SSD1306 *display, SSD1306UiState* state, int x, int y); -``` - -too - -```c -void frame1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); -``` - -And your overlay drawing functions from: - -```c -bool overlay1(SSD1306 *display, SSD1306UiState* state); -``` - -too - -```c -void overlay1(OLEDDisplay *display, OLEDDisplayUiState* state); -``` - -## New Features - -### Loading Animation - -While using this library ourself we noticed a pattern emerging. We want to drawing -a loading progress while connecting to WiFi and updating weather data etc. - -The simplest thing was to add the function `drawProgressBar(x, y, width, height, progress)` -,where `progress` is between `0` and `100`, right to the `OLEDDisplay` class. - -But we didn't stop there. We added a new feature to the `OLEDDisplayUi` called `LoadingStages`. -You can define your loading process like this: - -```c++ -LoadingStage loadingStages[] = { - { - .process = "Connect to WiFi", - .callback = []() { - // Connect to WiFi - } - }, - { - .process = "Get time from NTP", - .callback = []() { - // Get current time via NTP - } - } - // more steps -}; - -int LOADING_STAGES_COUNT = sizeof(loadingStages) / sizeof(LoadingStage); -``` - -After defining your array of `LoadingStages` you can then run the loading process by using -`ui.runLoadingProcess(loadingStages, LOADING_STAGES_COUNT)`. This will give you a -nice little loading animation you can see in the beginning of [this](https://vimeo.com/168362918) -video. - -To further customize this you are free to define your own `LoadingDrawFunction` like this: - -```c -void myLoadingDraw(OLEDDisplay *display, LoadingStage* stage, uint8_t progress) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_10); - // stage->process contains the text of the current progress e.q. "Connect to WiFi" - display->drawString(64, 18, stage->process); - // you could just print the current process without the progress bar - display->drawString(64, 28, progress); -} -``` - -After defining a function like that, you can pass it to the Ui library by use -`ui.setLoadingDrawFunction(myLoadingDraw)`. - - -### Text Logging - -It is always useful to display some text on the display without worrying to much -where it goes and managing it. In 3.0 we made the `OLEDDisplay` class implement -[`Print`](https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Print.h) -so you can use it like you would use `Serial`. We calls this feature `LogBuffer` -and the only thing you have to do is to define how many lines you want to display -and how many characters there are on average on each. This is done by calling -`setLogBuffer(lines, chars);`. If there is not enough memory the function will -return false. - -After that you can draw the `LogBuffer` anywhere you want by calling `drawLogBuffer(x, y)`. -(Note: You have to call `display()` to update the screen) -We made a [video](https://www.youtube.com/watch?v=8Fiss77A3TE) showing this feature in action. diff --git a/printermonitor/libs/OledDisplay/UPGRADE-4.0.md b/printermonitor/libs/OledDisplay/UPGRADE-4.0.md deleted file mode 100644 index 4b17693..0000000 --- a/printermonitor/libs/OledDisplay/UPGRADE-4.0.md +++ /dev/null @@ -1,27 +0,0 @@ -# Upgrade from 3.x to 4.0 - -There are changes that breaks compatibility with older versions. - -1. You'll have to change data type for all your binary resources such as images and fonts from - - ```c - const char MySymbol[] PROGMEM = { - ``` - - to - - ```c - const uint8_t MySymbol[] PROGMEM = { - ``` - -1. Arguments of `setContrast` from `char` to `uint8_t` - - ```c++ - void OLEDDisplay::setContrast(char contrast, char precharge, char comdetect); - ``` - - to - - ```c++ - void OLEDDisplay::setContrast(uint8_t contrast, uint8_t precharge, uint8_t comdetect); - ``` diff --git a/printermonitor/libs/OledDisplay/license b/printermonitor/libs/OledDisplay/license deleted file mode 100644 index 706c10f..0000000 --- a/printermonitor/libs/OledDisplay/license +++ /dev/null @@ -1,24 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 by Daniel Eichhorn -Copyright (c) 2016 by Fabrice Weinberg - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -See more at http://blog.squix.ch diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame1.jpg deleted file mode 100644 index 536b570db09931ec634b38777033432276bafed8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16026 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 diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame2.jpg deleted file mode 100644 index 8dccbcd0210b5c1dd7bad824982c1ecbf5c1edc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19502 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 C1xwrj diff --git a/printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg b/printermonitor/libs/OledDisplay/resources/DemoFrame4.jpg deleted file mode 100644 index 99cbe1bc41ce7fe01700f5cd00bf04da68f9602a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25325 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 EUrx=8H~;_u diff --git a/printermonitor/libs/OledDisplay/resources/SPI_version.jpg b/printermonitor/libs/OledDisplay/resources/SPI_version.jpg deleted file mode 100644 index 115c9f3bccef1177204c88ef8b8cb8f22daa9e7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26912 zcmeFXXH*nj^Do*1NDw6FETBl193&Y?A|N0+j3i;mISGt{pk&EP6af(hM#&k;nUO4U zfFTG7%z(fM1KjpW@Bf~4KHT?yxNF^Yp54>a)wOGfs@~yO)qVc$d=a3&tFEOEKp+r6 z6Fh+PC8lh(K-ePy(9r<|0RSKcC;=|u0!Tr?n|25lKmgLjAl(n4{(~k1>8}u4fbb6) zFb5+3kIW22;t!f0lvyO8`%4C_={XD_`m4^LFRuJeGhQo{_@gZ_kLg~a7~cKy+O~Li{D+-<><|WZTbZ!#lPZBAqzuE#dNhbS?2BA*!#eZZ*lj;B9gP4hSCOPDHTZHN$ zy_}r%M;{2qL7kJ6|3km|yU*g+ufKu(RVRp`-Vpqa!zjMIA^e*rd-;~>FBwqxfo6qg`AKZ4){Xe*k+&kE%2`e{H3oL_zsiAcFag@tnZ>ZZPL>ncqn6 zZ@LMLi2Y4Bg3^D}5HJ>X5iASF#t210?q7Te9T-*nTL$dWKlJaI7+~w^3iI*3eqE1- z0MG^Q0k;5szyL4@OaTzZg559%x`1!M6mSF#0y^NK0XzWnT>)<(1n>cz!7_$GFMtAY z01~9k0TVzOFai<*UqA`C21o(Y057Q2Hn0KA0v3Qh@DPvzB!C>CAC$TWo@Kx|kOt;n zfE)uIkTF0WETsZ;0z+UKE`SpV1P*~*@WcS8z!N|jatERc2mmX<87RXIN(ce3foSmV z2s|hu;eZIh1h4>a05re{I08jrJ{Ry9xCEhv5JM6m7LZ6V_ZnFHEZDC~@Lv$%0D=KB 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 Vmt>cr&zI7iF#5{vw(shH|JlZ6us8q! diff --git a/printermonitor/libs/OledDisplay/resources/Thumbs.db b/printermonitor/libs/OledDisplay/resources/Thumbs.db deleted file mode 100644 index 1b30db560adb88342d0803ac55ffa76a4481faff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 HE>{EqEjBhJ diff --git a/printermonitor/libs/OledDisplay/resources/glyphEditor.html b/printermonitor/libs/OledDisplay/resources/glyphEditor.html deleted file mode 100644 index f253a80..0000000 --- a/printermonitor/libs/OledDisplay/resources/glyphEditor.html +++ /dev/null @@ -1,633 +0,0 @@ - - - - - - - - -