diff --git a/docs/source/Plugin/AdaGFX_commands.repl b/docs/source/Plugin/AdaGFX_commands.repl index 75e9ae72c..3a0315aef 100644 --- a/docs/source/Plugin/AdaGFX_commands.repl +++ b/docs/source/Plugin/AdaGFX_commands.repl @@ -9,6 +9,8 @@ * If a text has comma's or spaces, then it should be 'wrapped' in either double quotes ``^"``, single quotes ``^'`` or back-ticks ``^```. * For ``color`` arguments, see how colors can be defined in the ``txc`` subcommand description. + + * Commands and subcommands are not case-sensitive. " " ``,clear[,]`` @@ -68,6 +70,8 @@ ``,txs,`` "," Set font scaling option. Only values from 0 to 10 are accepted. 0 assumes 1 by default. + + Some display types may limit or extend the maximum accepted size. " " ``,txtfull,,,,,,,,`` @@ -106,23 +110,37 @@ * *sevenseg18* A somewhat less large 7-segment 16 * 34 font * *freesans* A sans-serif 10 * 21 font - Usually disabled fonts: (can be enabled in a Custom build, default included in the MAX builds) + Usually disabled fonts: (can be enabled in a Custom build, default enabled in the MAX builds) * *angelina8prop* A proportional, handwriting, 6 * 16 font * *novamono8pt* A modern 9 * 16 font * *unispace8pt* A modern 12 * 24 font * *unispaceitalic8pt* A modern italic (slanted) 12 * 24 font * *whiterabbit8pt* A modern 12 * 24 font + * *robotomono8pt* A modern 8 * 10 font * *angelina12prop* A proportional, handwriting, 8 * 24 font * *novamono12pt* A modern 13 * 34 font * *repetitionscrolling12pt* A modern 13 * 24 font * *unispace12pt* A modern 13 * 18 font * *unispaceitalic12pt* A modern italic (slanted) 13 * 18 font * *whiterabbit12pt* A modern 13 * 18 font + * *robotomono12pt* A modern 13 * 18 font * *amerikasans16pt* A proportional 17 * 20 font * *whiterabbit16pt* A modern 16 * 20 font + * *robotomono16pt* A modern 16 * 20 font * *whiterabbit18pt* A modern 18 * 22 font * *whiterabbit20pt* A modern 20 * 24 font + + Standard disabled fonts (even on MAX builds), that can be enabled in a custom build: + + * *roboto8pt* A modern 9 * 16 font (proportionally spaced) + * *roboto12pt* A modern 13 * 18 font (proportionally spaced) + * *roboto16pt* A modern 16 * 20 font (proportionally spaced) + * *robotocond8pt* A modern 9 * 16 font (Roboto Condensed, proportionally spaced) + * *robotocond12pt* A modern 13 * 18 font (Roboto Condensed, proportionally spaced) + * *robotocond16pt* A modern 16 * 20 font (Roboto Condensed, proportionally spaced) + + NB: Roboto is used as the default Android font since Android 4.1, and very readable, even when using small fonts on a small display. " " ``,l,,,,,`` @@ -226,3 +244,108 @@ The file can be read from SD-card, when available, and the bmp file is not found on the internal file storage. " + " + ``,btn,,,,,,,,,,,,,,,,,,,,,`` + "," + As a companion to the ESPEasy_TouchHelper, the AdafruitGFX_helper takes care of drawing button objects via this subcommand. + + All arguments *must* be provided, though most can be empty, but all separator-commas must still be provided. + + * ``state`` : 0 = off, 1 = on, -1 = off + disabled, -2 = on + disabled. + + * ``mode`` : 0 = normal, -1 = initial, -2 = clear button area. + + * ``x,y,w,h`` : button left-top coordinate, width and height. + + * ``id`` : object id nr. Not used for drawing the button, but passed to be used in rules from the ESPEasy_TouchHelper. + + * ``type`` : combination (addition/and operation) of ``button type`` (bits 0..3) and ``button layout`` (bits 4..7), when negative (multiplied by -1) will clear the button area. + + * ``button types`` : 0 = none, 0x01 = rectangle, 0x02 = rounded rectangle, 0x03 = circle, 0x04 = left arrow, 0x05 = up arrow, 0x06 = right arrow, 0x07 = down arrow. + + * ``button layouts`` : 0 = center aligned, 0x10 = left aligned, 0x20 = top aligned, 0x30 = right aligned, 0x40 = bottom aligned, 0x50 = left top aligned, 0x60 = right top aligned, 0x70 = right bottom aligned, 0x80 = left bottom aligned, 0x90 = no caption, 0xA0 = ``bitmap`` (see ``ONcaption`` / ``OFFcaption``). + + * ``ONcolor`` / ``OFFcolor`` : fill color when button state is on or off and enabled. + + * ``CaptionColor`` : color used for caption text. + + * ``fontsize`` : size of the font for writing the caption, range 1..10. + + * ``ONcaption`` / ``OFFcaption`` : The caption to show when state is on or off, when empty the objectname will be used. For ``button layout`` = ``bitmap`` a .bmp filename should be entered, that is available on the filesystem, optionally *prefixed* with an ``x`` and ``y`` offset, in pixels, to enable f.e. drawing a small bitmap centered on a button. The format with these optional arguments is: ``[[,],]bmpfile.bmp`` + + * If a caption contains space(s), comma(s) or quote(s), it *must* be quoted with a different quote (double/single/backtick). + * Captions can use variables as available in rules, like plugin values via ``[taskname#valuename]``, ``%vNN%``, ``%%`` and ``{}`` formats. + + * ``BorderColor``, ``DisabledColor``, ``DisabledCaptionColor`` : A separate border color can be specified, and a fill-color and caption color for disabled buttons. + + * ``TaskIndex`` : The Task number for the display the button is to be drawn on. Not used, but passed to be used in rules from the ESPEasy_TouchHelper. + + * ``Group`` : The group this button is a member of. Not used for drawing the button, but passed to be used in rules from the ESPEasy_TouchHelper. + + * ``SelectGroup`` : The group that will be activated by this button. Not used for drawing the button, but passed to be used in rules from the ESPEasy_TouchHelper. + + * ``objectname`` : **Required** The name of the button object, will be used as a caption if no ``ONcaption`` and/or ``OFFcaption`` are provided. *Not required* if both an ``ONcaption`` and ``OFFcaption`` are provided. + + NB: This command wil only *draw* a button, it will not respond to any action. The action is usually provided by a touch screen like :ref:`P099_page` and :ref:`P123_page`. + " + " + ``,defwin,,,,,[,]`` + + Example: (Display Task is named ``st7796``, using trigger ``st77xx``) + + .. code:: none + + on window1 do + if %eventvalue1|1%=1 // on = default + st77xx,defwin,20,50,390,219,1,1 // Window 1, using rotation 1 + st77xx,win,1 // Select window + st77xx,rot,1 // Select rotation + st77xx,clear // Clear area + st77xx,r,0,0,[st7796#width],[st7796#height],white // Draw a white border + st77xx,win,0 // Return to Window 0 + else + asyncevent,removewindow=1 // Remove Window 1 + endif + endon + on removewindow do + if [st7796#iswin,%eventvalue1|-1%]=1 // Does the Window exist? + st77xx,win,%eventvalue1% // Select window + st77xx,clear // Clear area + st77xx,delwin,%eventvalue1% // Delete Window + st77xx,win,0 // Return to Window 0 + endif + endon + + "," + Define Window. + + When enabled, the Window feature of the plugin can be used to define custom areas of the screen as a window. Any printing and drawing can then be limited to that area, having a coordinate system from ``0,0`` to ``,``. + + Window 0 is the default window, having the native size of the display. The coordinates, width and height for the ``defwin`` subcommand must be specified in pixels. + + * ``x,y``: The top-left coordinate of the window, according to the native resolution of the screen. This coordinate will become the ``0,0`` coordinate of the new window. + + * ``w,h``: The width and height of the window. + + * ``windowId``: The Id of the new window, can be any value from 1 to 255. When re-using an Id, the previous definition will be overwritten. + + * ``rotation``: Optional. The rotation, identical to the ``rot`` subcommand, that the window dimensions are related to. When not specified, the current rotation setting will be used. Internally, the dimensions are transformed to the dimensions for rotation 0, and on each change of ``rot``, all windows will be re-calculated to have the dimensions corresponding with the new rotation setting. + " + " + ``,delwin,`` + "," + Delete Window. + + When no longer needed, a window definition can be deleted using this subcommand. + + * ``windowId``: The window Id of a previously defined window. + " + " + ``,win,`` + "," + Select Window. + + To make a window active, is must be selected using this subcommand. + + * ``windowId``: The window Id of a previously defined window. + " diff --git a/docs/source/Plugin/AdaGFX_values.repl b/docs/source/Plugin/AdaGFX_values.repl new file mode 100644 index 000000000..ecfd4797f --- /dev/null +++ b/docs/source/Plugin/AdaGFX_values.repl @@ -0,0 +1,94 @@ +.. csv-table:: + :escape: ^ + :widths: 20, 30 + + " + Generic variables, available for all ``AdafruitGFX_Helper`` enabled plugins, currently: :ref:`P095_page`, :ref:`P096_page`, :ref:`P116_page` and :ref:`P131_page`. + "," + Generic notes: + + * If an argument has comma's or spaces, then that part should be 'wrapped' in either double quotes ``^"``, single quotes ``^'`` or back-ticks ``^```. + * The ```` part is the name of the Device task. + * True(1)/False(0) values can optionally return -1 to indicate an invalid request, like a missing Window Id. + * All sizes, lengths etc. are returned in pixels. + " + " + ``[#win]`` + "," + Get the currently active Window Id, expected range: 0..255. + " + " + ``[#iswin,]`` + "," + Is the request Window Id valid, expected result: 1 = true, 0 = false. + " + " + ``[#width]`` + "," + Get the width of the currently active Window and rotation, expected range 0... + " + " + ``[#height]`` + "," + Get the height of the currently active Window and rotation, expected range 0... + " + " + ``[#length,^"^"]`` + "," + Get the length of the text in pixels for the current font and text scaling. Needs quotes if text contains space(s), comma(s) or quote(s). + " + " + ``[#textheight,^"^"]`` + "," + Get the height of the text in pixels for the current font and text scaling. Needs quotes if the text contains space(s), comma(s) or quote(s). + " + " + ``[#rot]`` + "," + Get the currently active rotation, expected range 0..3 (0 = 0 degrees, 1 = +90 degrees, 2 = +180 degrees, 3 = +270 degrees). + " + " + ``[#txs]`` + "," + Get the currently active text scaling, expected range 1..10, limited to the max. font scaling allowed for the display. + " + " + ``[#tpm]`` + "," + Get the currently active text print mode, expected range 0..3, see the ``tpm`` subcommand for details. + " + +.. csv-table:: + :escape: ^ + :widths: 20, 10 + + " + Example rules for centering a value (time) in a window: + + .. code:: none + + on centertime do // NB: Comments & extra spaces should be removed to reduce rules size! + if [st7796#iswin,%eventvalue1|2%]=1 // default window: 2 + let,120,[st7796#win] // store current window + st77xx,win,%eventvalue1|2% // switch to window + let,121,[st7796#txs] // store textscaling + st77xx,txs,3 // set text scaling + let,122,[st7796#rot] // store rotation + st77xx,rot,%eventvalue2|0% // set rotation, default: 0 + let,123,([st7796#width]-[st7796#length,%systm_hm%])/2 // (width - textlength)/2 + let,124,([st7796#height]-[st7796#textheight,%systm_hm%])/2 // (height - textheight)/2 + st77xx,txtfull,[int#123],[int#124],3,red,black,%systm_hm% // Display time red on black + st77xx,rot,%v122% // restore rotation + st77xx,txs,%v121% // restore text scaling + st77xx,win,%v120% // restore window + endif + endon + on Clock#Time=All,**:** do + asyncevent,centertime=2 // Update the display every minute + endon + + "," + Display Task is named ``st7796``, using trigger ``st77xx`` + + Usage: ``asyncevent,centertime[=[,]]`` + " diff --git a/docs/source/Plugin/P059.rst b/docs/source/Plugin/P059.rst index a4ec25028..4b004447f 100644 --- a/docs/source/Plugin/P059.rst +++ b/docs/source/Plugin/P059.rst @@ -1,4 +1,4 @@ -.. include:: ../Plugin/_plugin_substitutions_p05x.repl +.. include:: ../Plugin/_plugin_substitutions_p05x.repl .. _P059_page: |P059_typename| @@ -21,15 +21,95 @@ Maintainer: |P059_maintainer| Used libraries: |P059_usedlibraries| +Introduction +------------ + +A rotary encoder can be used in many applications that require precise (unlimited) rotation indication. A general use is to have the encoder set the volume of a speaker or position of a stepper motor. + Supported hardware ------------------ +.. image:: P059_520px-Pulse_wheel.jpg + +A pulse wheel used for CNC machines. + +.. image:: P059_520px-Pulse_wheel_002.jpg + +. + +.. image:: P059_520px-Rotary_encoder_001.jpg + +A rotary encoder used for volume and GUI interaction (press the knob for switch input) + |P059_usedby| -.. Commands available -.. ^^^^^^^^^^^^^^^^^^ +Wiring +------ -.. .. include:: P059_commands.repl +.. code:: none + + ESP Encoder + GPIO <--> A or CLK + GPIO <--> B or DT + GPIO* <--> I (optional) + + Power + 3.3V <--> VCC/+ + GND <--> GND/V0 + +\*if any is available, used to "0" the counter after each turn. + +Switch A/B if the encoder is counting backwards! + +A and B is sometimes labeled CLK and DT, other labels might also be used. Test and see what works for your encoder. If the rotary encoder have A- and B- ports it is ideal to use them since the pulses are negative and doesn't strain the ESP unit's power. Using a positive signal is not a problem though. + +Use only GPIO pins that support interrupts, so f.e. GPIO-16 on ESP8266 can't be used. + +Device +------ + +.. image:: P059_DeviceConfiguration.png + +Task settings +~~~~~~~~~~~~~ + +* **Name** The name of the task. This should be unique for all devices that are configured. (Initially empty) + +* **Enabled** For the device to work it has to be enabled. When checked, the device will be started as soon as the ESP starts. If desired, the device can also be enabled from f.e. a rule by using the ``TaskEnable,`` or ``TaskEnable,`` command, or disabled using the corresponding ``TaskDisable,|`` commands. + +Sensor +~~~~~~ + +* **GPIO <- A (CLK)**: Input pin for the **A** or **CLK** wire. + +* **GPIO <- B (DT)**: Input pin for the **B** or **DT** wire. + +* **GPIO <- I (Z)(optional)**: Optional input pin for the reset signal from the rotary knob, to reset the counter when it passes the 0 mark. + +* **Mode**: Sets the "resolution" of the turning on the knob. 1 pulse per cycle is "slowest"/finest and 4 pulses per cycle is the "fastest"/coarsest. + +* **Limit min**: The lowest value that the counter will go to. Observe that if you have the counter on a value below this limit the counter will climb above this value but not below it once it has reached the min limit. + +* **Limit max**: The highest value that the counter will go to. As with the min limit if the counter is above this limit it will descend to the max level but never climb over it once reached below it. + +Data Acquisition +^^^^^^^^^^^^^^^^ + +This group of settings, **Single event with all values**, **Send to Controller** and **Interval** settings are standard available configuration items. Send to Controller is only visible when one or more Controllers are configured. + +**Interval** By default, Interval will be set to 0 sec for this plugin, as this setting is optional. It is the frequency used to read sensor values and send these to any Controllers configured for this device. + +Values +^^^^^^ + +The counted value is available in ``Counter``. + + + +Commands available +^^^^^^^^^^^^^^^^^^ + +.. include:: P059_commands.repl .. Events .. ~~~~~~ diff --git a/docs/source/Plugin/P059_520px-Pulse_wheel.jpg b/docs/source/Plugin/P059_520px-Pulse_wheel.jpg new file mode 100644 index 000000000..c6dbdd9a5 Binary files /dev/null and b/docs/source/Plugin/P059_520px-Pulse_wheel.jpg differ diff --git a/docs/source/Plugin/P059_520px-Pulse_wheel_002.jpg b/docs/source/Plugin/P059_520px-Pulse_wheel_002.jpg new file mode 100644 index 000000000..edc424438 Binary files /dev/null and b/docs/source/Plugin/P059_520px-Pulse_wheel_002.jpg differ diff --git a/docs/source/Plugin/P059_520px-Rotary_encoder_001.jpg b/docs/source/Plugin/P059_520px-Rotary_encoder_001.jpg new file mode 100644 index 000000000..ae675b678 Binary files /dev/null and b/docs/source/Plugin/P059_520px-Rotary_encoder_001.jpg differ diff --git a/docs/source/Plugin/P059_DeviceConfiguration.png b/docs/source/Plugin/P059_DeviceConfiguration.png new file mode 100644 index 000000000..d36ebcf8a Binary files /dev/null and b/docs/source/Plugin/P059_DeviceConfiguration.png differ diff --git a/docs/source/Plugin/P059_Rotary_Encoder.rst b/docs/source/Plugin/P059_Rotary_Encoder.rst deleted file mode 100644 index 5b6dea882..000000000 --- a/docs/source/Plugin/P059_Rotary_Encoder.rst +++ /dev/null @@ -1,70 +0,0 @@ -.. include:: ../Plugin/_plugin_substitutions_p05x.repl -.. _P059_Rotary_Encoder_page: - -Rotary Encoder -============== - -|P059_typename| -|P059_status| - - -Introduction ------------- - - -Specifications: - * Input - - -Wiring ------- - - -.. code-block:: none - - ESP S8 - GPIO (X) <--> TX - GPIO (X) <--> RX - - - Power - 5.0V <--> VCC - GND <--> GND - - -Setup ------ - - - -Rules examples --------------- - -.. code-block:: none - - //Code below... - - -Indicators (recommended settings) ---------------------------------- - -.. csv-table:: - :header: "Indicator", "Value Name", "Interval", "Decimals", "Extra information" - :widths: 8, 5, 5, 5, 40 - - "XXXXXX", "N/A", "", "", "" - -Where to buy ------------- - -.. csv-table:: - :header: "Store", "Link" - :widths: 5, 40 - - "AliExpress","`Link 1 ($) `_" - -|affiliate| - - -More pictures -------------- diff --git a/docs/source/Plugin/P059_commands.repl b/docs/source/Plugin/P059_commands.repl new file mode 100644 index 000000000..3c62f9cad --- /dev/null +++ b/docs/source/Plugin/P059_commands.repl @@ -0,0 +1,9 @@ +.. csv-table:: + :header: "Command Syntax", "Extra information" + :widths: 20, 30 + + " + | ``encwrite,>`` + "," + | Set the **Counter** value, and generate an event for it, as if a pulse was received. + " diff --git a/docs/source/Plugin/P095.rst b/docs/source/Plugin/P095.rst index b11b6d2db..d3184371d 100644 --- a/docs/source/Plugin/P095.rst +++ b/docs/source/Plugin/P095.rst @@ -195,6 +195,11 @@ Commands available .. include:: P095_commands.repl .. include:: AdaGFX_commands.repl +Values +------ + +.. include:: AdaGFX_values.repl + Change log diff --git a/docs/source/Reference/Command.rst b/docs/source/Reference/Command.rst index a3bd6653c..32cc08d70 100644 --- a/docs/source/Reference/Command.rst +++ b/docs/source/Reference/Command.rst @@ -483,10 +483,10 @@ P053 :ref:`P053_page` .. .. include:: ../Plugin/P058_commands.repl -.. P059 :ref:`P059_page` -.. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +P059 :ref:`P059_page` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. .. include:: ../Plugin/P059_commands.repl +.. include:: ../Plugin/P059_commands.repl .. P060 :ref:`P060_page` diff --git a/lib/ESPEasySerial/ESPEasySC16IS752_Serial.cpp b/lib/ESPEasySerial/ESPEasySC16IS752_Serial.cpp index c67d161e2..fb3da3f32 100644 --- a/lib/ESPEasySerial/ESPEasySC16IS752_Serial.cpp +++ b/lib/ESPEasySerial/ESPEasySC16IS752_Serial.cpp @@ -1,5 +1,7 @@ #include +#ifndef DISABLE_SC16IS752_Serial + #include @@ -141,3 +143,5 @@ void ESPEasySC16IS752_Serial::flush(void) _i2cuart->flush(_channel); } } + +#endif \ No newline at end of file diff --git a/lib/ESPEasySerial/ESPEasySC16IS752_Serial.h b/lib/ESPEasySerial/ESPEasySC16IS752_Serial.h index 84559dc4a..18d83a6bf 100644 --- a/lib/ESPEasySerial/ESPEasySC16IS752_Serial.h +++ b/lib/ESPEasySerial/ESPEasySC16IS752_Serial.h @@ -1,6 +1,7 @@ #ifndef ESPeasySC16IS752_Serial_h #define ESPeasySC16IS752_Serial_h +#ifndef DISABLE_SC16IS752_Serial #include #include @@ -41,4 +42,6 @@ private: bool _pingReplied = false; }; +#endif + #endif // ESPeasySC16IS752_Serial_h diff --git a/lib/ESPEasySerial/ESPEasySerial_ESP32.cpp b/lib/ESPEasySerial/ESPEasySerial_ESP32.cpp index 61aad9f5f..d99c1bbb0 100644 --- a/lib/ESPEasySerial/ESPEasySerial_ESP32.cpp +++ b/lib/ESPEasySerial/ESPEasySerial_ESP32.cpp @@ -92,6 +92,7 @@ ESPeasySerial::ESPeasySerial( _serialtype = ESPeasySerialType::getSerialType(port, receivePin, transmitPin); } +#ifndef DISABLE_SC16IS752_Serial switch (_serialtype) { case ESPEasySerialPort::sc16is752: { @@ -103,6 +104,7 @@ ESPeasySerial::ESPeasySerial( default: break; } +#endif } diff --git a/lib/ESPEasySerial/ESPEasySerial_ESP8266_noSWserial.cpp b/lib/ESPEasySerial/ESPEasySerial_ESP8266_noSWserial.cpp index 4dd9e408b..de86a6898 100644 --- a/lib/ESPEasySerial/ESPEasySerial_ESP8266_noSWserial.cpp +++ b/lib/ESPEasySerial/ESPEasySerial_ESP8266_noSWserial.cpp @@ -7,7 +7,13 @@ // No SoftwareSerial // Only support HW serial on Serial 0 .. 1 // **************************************** -ESPeasySerial::ESPeasySerial(ESPEasySerialPort port, int receivePin, int transmitPin, bool inverse_logic, unsigned int buffSize) +ESPeasySerial::ESPeasySerial( + ESPEasySerialPort port, + int receivePin, + int transmitPin, + bool inverse_logic, + unsigned int buffSize, + bool forceSWserial) : _receivePin(receivePin), _transmitPin(transmitPin) { _serialtype = ESPeasySerialType::getSerialType(port, receivePin, transmitPin); @@ -259,11 +265,6 @@ unsigned long ESPeasySerial::detectBaudrate(time_t timeoutMillis) { bool ESPeasySerial::listen() { - if (isValid()) { -# ifndef ARDUINO_ESP8266_RELEASE_2_3_0 - return _swserial->listen(); -# endif // ifndef ARDUINO_ESP8266_RELEASE_2_3_0 - } return false; } diff --git a/lib/ESPEasySerial/library.json b/lib/ESPEasySerial/library.json index b86185ece..e5221a4e1 100644 --- a/lib/ESPEasySerial/library.json +++ b/lib/ESPEasySerial/library.json @@ -1,6 +1,6 @@ { "name": "ESPeasySerial", - "version": "2.0.13", + "version": "2.0.15", "keywords": [ "serial", "io", "softwareserial", "hardwareserial" ], diff --git a/lib/ESPEasySerial/library.properties b/lib/ESPEasySerial/library.properties index 83ea80441..0ac07918e 100644 --- a/lib/ESPEasySerial/library.properties +++ b/lib/ESPEasySerial/library.properties @@ -1,5 +1,5 @@ name=ESPeasySerial -version=2.0.13 +version=2.0.15 author=Gijs Noorlander maintainer=Gijs Noorlander sentence=Wrapper for SoftwareSerial, SC16IS752 I2C to UART bridge and HardwareSerial for ESP8266 and ESP32/ESP32S2. diff --git a/lib/ccronexpr/library.properties b/lib/ccronexpr/library.properties index 413205dc2..ac3a250a4 100644 --- a/lib/ccronexpr/library.properties +++ b/lib/ccronexpr/library.properties @@ -4,3 +4,5 @@ sentence=Cron expression parsing in ANSI C paragraph= url=https://github.com/staticlibs/ccronexpr architectures=esp8266,esp32,esp32s2 +author= +maintainer= diff --git a/platformio_core_defs.ini b/platformio_core_defs.ini index c5b0d23b2..e6127f921 100644 --- a/platformio_core_defs.ini +++ b/platformio_core_defs.ini @@ -38,6 +38,9 @@ build_flags = -D NDEBUG -DVTABLES_IN_FLASH -DPUYA_SUPPORT=1 -fno-strict-aliasing + -I$PROJECT_DIR/src/include + -include "ESPEasy_config.h" + lib_ignore = ESP32_ping ESP32WebServer ESP32HTTPUpdateServer @@ -57,6 +60,8 @@ build_flags = -DNDEBUG -DCORE_POST_2_5_0 -fno-strict-aliasing -DLIBRARIES_NO_LOG=1 + -I$PROJECT_DIR/src/include + -include "ESPEasy_config.h" lib_ignore = ${esp82xx_defaults.lib_ignore} [esp82xx_2_6_x] @@ -75,7 +80,6 @@ build_flags = ${esp82xx_2_6_x.build_flags} -DCORE_POST_3_0_0 -Wno-deprecated-declarations -Werror=return-type - -DFS_NO_GLOBALS lib_ignore = ${esp82xx_defaults.lib_ignore} @@ -232,6 +236,9 @@ platform_packages = framework-arduinoespressif32 @ https://github.com/ build_flags = -DESP32_STAGE -DMUSTFIX_CLIENT_TIMEOUT_IN_SECONDS -DLIBRARIES_NO_LOG=1 + -I$PROJECT_DIR/src/include + -include "sdkconfig.h" + -include "ESPEasy_config.h" [core_esp32_stage] platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-2.0.4.1.zip @@ -239,3 +246,6 @@ platform_packages = build_flags = -DESP32_STAGE -DMUSTFIX_CLIENT_TIMEOUT_IN_SECONDS -DLIBRARIES_NO_LOG=1 + -I$PROJECT_DIR/src/include + -include "sdkconfig.h" + -include "ESPEasy_config.h" diff --git a/platformio_esp32_envs.ini b/platformio_esp32_envs.ini index 57b46a2b3..3ed3b7e28 100644 --- a/platformio_esp32_envs.ini +++ b/platformio_esp32_envs.ini @@ -39,7 +39,7 @@ lib_deps = adafruit/Adafruit GFX Library@^1.11.1 ccronexpr rlogiacco/CircularBuffer - td-er/ESPeasySerial @ 2.0.13 + td-er/ESPeasySerial @ 2.0.15 sparkfun/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.3 ShiftRegister74HC595_NonTemplate VL53L0X @ 1.3.0 diff --git a/platformio_esp82xx_base.ini b/platformio_esp82xx_base.ini index 8112b0be0..7b2e32100 100644 --- a/platformio_esp82xx_base.ini +++ b/platformio_esp82xx_base.ini @@ -37,10 +37,15 @@ lib_ignore = ${core_stage.lib_ignore} [no_ir] -lib_ignore = IRremoteESP8266, HeatpumpIR +lib_ignore = IRremoteESP8266 + HeatpumpIR [no_sd] -lib_ignore = SD(esp8266), SD, SDFS +lib_ignore = ESP8266SdFat + SD(esp8266) + SD + SDFS + LittleFS(esp8266) [no_littlefs] lib_ignore = LittleFS(esp8266) @@ -84,7 +89,7 @@ lib_deps = adafruit/Adafruit GFX Library@^1.11.1 bblanchon/ArduinoJson @ ^6.17.2 rlogiacco/CircularBuffer - td-er/ESPeasySerial @ 2.0.13 + td-er/ESPeasySerial @ 2.0.15 td-er/RABurton ESP8266 Mutex @ ^1.0.2 sparkfun/SparkFun MAX1704x Fuel Gauge Arduino Library @ ^1.0.3 VL53L0X @ 1.3.0 @@ -111,6 +116,7 @@ platform = ${regular_platform.platform} platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} lib_ignore = ${regular_platform.lib_ignore} + ESP8266SdFat SD(esp8266) SD SDFS @@ -121,6 +127,7 @@ platform = ${regular_platform_alt_wifi.platform} platform_packages = ${regular_platform_alt_wifi.platform_packages} build_flags = ${regular_platform_alt_wifi.build_flags} lib_ignore = ${regular_platform_alt_wifi.lib_ignore} + ESP8266SdFat SD(esp8266) SD SDFS @@ -132,6 +139,7 @@ platform = ${beta_platform.platform} platform_packages = ${beta_platform.platform_packages} build_flags = ${beta_platform.build_flags} lib_ignore = ${beta_platform.lib_ignore} + ESP8266SdFat SD(esp8266) SD SDFS @@ -165,6 +173,7 @@ build_flags = ${regular_platform_alt_wifi.build_flags} -DLIMIT_BUILD_SIZE -DDISABLE_SC16IS752_Serial lib_ignore = ${regular_platform_alt_wifi.lib_ignore} + ESP8266SdFat SD(esp8266) SD SDFS @@ -178,6 +187,8 @@ build_flags = ${beta_platform.build_flags} -DLIMIT_BUILD_SIZE -DDISABLE_SC16IS752_Serial lib_ignore = ${beta_platform.lib_ignore} + ESP8266SdFat + SD(esp8266) SD SDFS LittleFS(esp8266) @@ -195,6 +206,7 @@ lib_ignore = ESP32_ping ESP32WebServer ServoESP32 ESP32HTTPUpdateServer + ESP8266SdFat SD(esp8266) SD SDFS @@ -240,10 +252,19 @@ build_flags = ${ir.build_flags} [esp82xx_1M] extends = esp82xx_common build_flags = -DBUILD_NO_DEBUG + -DFEATURE_SD=0 -Os -s ${esp82xx_common.build_flags} extra_scripts = ${esp82xx_common.extra_scripts} +lib_ignore = ${esp82xx_common.lib_ignore} + ESP8266SdFat + SD + SDFS + SD(esp8266) + LittleFS + + [esp8266_1M] extends = esp82xx_1M @@ -260,12 +281,21 @@ extends = esp82xx_1M build_flags = ${esp82xx_1M.build_flags} -DPLUGIN_BUILD_MINIMAL_OTA -DDISABLE_SC16IS752_Serial + [esp8266_1M_OTA] extends = esp82xx_1M_OTA board = esp8266_1M128k_OTA build_flags = ${esp82xx_1M_OTA.build_flags} +lib_ignore = ${esp82xx_1M.lib_ignore} + ArduinoOTA + ESP8266mDNS +; Adding the libs below to the lib_ignore will even increase build size +; Adafruit TCS34725 +; RN2xx3 Arduino Library + + ;;; 2MB flash nodes ************************************************** diff --git a/platformio_esp82xx_envs.ini b/platformio_esp82xx_envs.ini index 557b49a7c..bf424eb9b 100644 --- a/platformio_esp82xx_envs.ini +++ b/platformio_esp82xx_envs.ini @@ -374,10 +374,12 @@ lib_ignore = ESP32_ping ; ********************************************************************* [minimal_OTA_domoticz] -build_flags = -DFEATURE_DOMOTICZ=1 +build_flags = ${esp8266_1M_OTA.build_flags} + -DFEATURE_DOMOTICZ=1 [minimal_OTA_FHEM_HA] -build_flags = -DFEATURE_FHEM=1 +build_flags = ${esp8266_1M_OTA.build_flags} + -DFEATURE_FHEM=1 -DFEATURE_HOMEASSISTANT_OPENHAB=1 @@ -386,8 +388,8 @@ extends = esp8266_1M_OTA platform = ${regular_platform.platform} platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} - ${esp8266_1M_OTA.build_flags} ${minimal_OTA_domoticz.build_flags} + -DDISABLE_SC16IS752_Serial [env:minimal_core_302_ESP8266_1M_OTA_Domoticz] @@ -395,7 +397,6 @@ extends = esp8266_1M_OTA platform = ${core302_platform.platform} platform_packages = ${core302_platform.platform_packages} build_flags = ${core302_platform.build_flags} - ${esp8266_1M_OTA.build_flags} ${minimal_OTA_domoticz.build_flags} @@ -404,7 +405,6 @@ extends = esp8266_1M_OTA platform = ${regular_platform.platform} platform_packages = ${regular_platform.platform_packages} build_flags = ${regular_platform.build_flags} - ${esp8266_1M_OTA.build_flags} ${minimal_OTA_FHEM_HA.build_flags} @@ -413,7 +413,6 @@ extends = esp8266_1M_OTA platform = ${core302_platform.platform} platform_packages = ${core302_platform.platform_packages} build_flags = ${core302_platform.build_flags} - ${esp8266_1M_OTA.build_flags} ${minimal_OTA_FHEM_HA.build_flags} diff --git a/src/Custom-sample.h b/src/Custom-sample.h index fd40c2a93..d086fa0de 100644 --- a/src/Custom-sample.h +++ b/src/Custom-sample.h @@ -1,8 +1,6 @@ #ifndef ESPEASY_CUSTOM_H #define ESPEASY_CUSTOM_H -#include - /* To modify the stock configuration without changing the EspEasy.ino file : 1) rename this file to "Custom.h" (It is ignored by Git) diff --git a/src/ESPEasy_common.cpp b/src/ESPEasy_common.cpp index aa7e6a602..e58e339b4 100644 --- a/src/ESPEasy_common.cpp +++ b/src/ESPEasy_common.cpp @@ -1,6 +1,4 @@ #include "ESPEasy_common.h" -String getUnknownString() { return F("Unknown"); } - const String EMPTY_STRING; \ No newline at end of file diff --git a/src/ESPEasy_common.h b/src/ESPEasy_common.h index 6c6b36706..ec7836ff4 100644 --- a/src/ESPEasy_common.h +++ b/src/ESPEasy_common.h @@ -14,30 +14,18 @@ */ -#ifndef CORE_POST_2_5_0 - #define STR_HELPER(x) #x - #define STR(x) STR_HELPER(x) -#endif +#include +// User configuration +#include "include/ESPEasy_config.h" +#include "./src/CustomBuild/ESPEasyDefaults.h" + #ifdef USE_SECOND_HEAP #include #endif -#ifdef __GCC__ -#pragma GCC system_header -#endif -#include -namespace std -{ - using ::ptrdiff_t; - using ::size_t; -} - -#include -#include -#include #ifdef ESP8266 @@ -50,37 +38,13 @@ namespace std # define SUPPORT_ARP #endif -// User configuration -// Include Custom.h before ESPEasyDefaults.h. -#ifdef USE_CUSTOM_H -// make the compiler show a warning to confirm that this file is inlcuded -//#warning "**** Using Settings from Custom.h File ***" - #include "Custom.h" -#else - // Set as default -// #define PLUGIN_BUILD_NORMAL -#endif - -// Check if any deprecated '#define ' (Custom.h) or '-D' (pre_custom_esp82xx.py/pre_custom_esp32.py) are used -#include "./src/CustomBuild/check_defines_custom.h" // Check for replaced #define variables, see https://github.com/letscontrolit/ESPEasy/pull/4153 - -#include "src/CustomBuild/ESPEasyDefaults.h" #include "src/DataStructs/NodeStruct.h" #include "src/Globals/RamTracker.h" #include "src/ESPEasyCore/ESPEasy_Log.h" #include "src/Helpers/ESPEasy_math.h" -#ifndef FS_NO_GLOBALS - #define FS_NO_GLOBALS -#endif #if defined(ESP8266) - #ifndef CORE_POST_3_0_0 - #define IRAM_ATTR ICACHE_RAM_ATTR - #endif - - - #include #define NODE_TYPE_ID NODE_TYPE_ID_ESP_EASYM_STD #include @@ -111,9 +75,6 @@ namespace std #endif #if defined(ESP32) - // Temp fix for a missing core_version.h within ESP Arduino core. Wait until they actually have different releases - #define ARDUINO_ESP8266_RELEASE "2_4_0" - #ifdef ESP32S2 #define NODE_TYPE_ID NODE_TYPE_ID_ESP_EASY32S2_STD #elif defined(ESP32C3) @@ -121,10 +82,7 @@ namespace std #else #define NODE_TYPE_ID NODE_TYPE_ID_ESP_EASY32_STD #endif - #if ESP_IDF_VERSION_MAJOR < 3 - #define ICACHE_RAM_ATTR IRAM_ATTR - #endif - #include +// #include // #include "esp32_ping.h" #ifdef ESP32S2 @@ -140,99 +98,16 @@ namespace std #include // Needed to call ESP-IDF functions like esp_wifi_.... #endif -#ifdef USE_LITTLEFS - #ifdef ESP32 - #if ESP_IDF_VERSION_MAJOR >= 4 - #include - #define ESPEASY_FS LittleFS - #else - #include - #define ESPEASY_FS LITTLEFS - #endif - #else - #include - #define ESPEASY_FS LittleFS - #endif -#else - #ifdef ESP32 - #include - #endif - #define ESPEASY_FS SPIFFS -#endif #include #include #include -#include -#if FEATURE_SD -#include -#else -using namespace fs; -#endif -#include -// Include custom first, then build info. (one may want to set BUILD_GIT for example) -#include "src/CustomBuild/ESPEasy_buildinfo.h" -#include "src/CustomBuild/ESPEasyLimits.h" -#include "src/CustomBuild/define_plugin_sets.h" - -#ifdef ESP32 -#include - -#endif - - -#define ZERO_FILL(S) memset((S), 0, sizeof(S)) -#define ZERO_TERMINATE(S) S[sizeof(S) - 1] = 0 - - - -String getUnknownString(); - extern const String EMPTY_STRING; - -/******************************************************************************\ - * Detect core versions ******************************************************* -\******************************************************************************/ - -#ifndef ESP32 - #if defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) || defined(ARDUINO_ESP8266_RELEASE_2_4_2) - #ifndef CORE_2_4_X - #define CORE_2_4_X - #endif - #endif - - #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) - #ifndef CORE_PRE_2_4_2 - #define CORE_PRE_2_4_2 - #endif - #endif - - #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(CORE_2_4_X) - #ifndef CORE_PRE_2_5_0 - #define CORE_PRE_2_5_0 - #endif - #else - #ifndef CORE_POST_2_5_0 - #define CORE_POST_2_5_0 - #endif - #endif - - - #ifdef FORCE_PRE_2_5_0 - #ifdef CORE_POST_2_5_0 - #undef CORE_POST_2_5_0 - #endif - #endif -#endif // ESP32 - - - - // Enable FEATURE_ADC_VCC to measure supply voltage using the analog pin // Please note that the TOUT pin has to be disconnected in this mode // Use the "System Info" device to read the VCC value diff --git a/src/_N001_Email.cpp b/src/_N001_Email.cpp index d26d89932..1276acf0f 100644 --- a/src/_N001_Email.cpp +++ b/src/_N001_Email.cpp @@ -20,10 +20,13 @@ #include "src/Helpers/ESPEasy_Storage.h" #include "src/Helpers/ESPEasy_time_calc.h" #include "src/Helpers/Networking.h" +#include "src/Helpers/StringGenerator_System.h" #include "src/Helpers/StringParser.h" #include "src/Helpers/_CPlugin_Helper.h" // safeReadStringUntil #include "src/Helpers/_NPlugin_init.h" +#include + // Forward declaration bool NPlugin_001_send(const NotificationSettingsStruct& notificationsettings, const String& aSub, String& aMesg); bool NPlugin_001_Auth(WiFiClient& client, const String& user, const String& pass); @@ -140,7 +143,7 @@ bool NPlugin_001_send(const NotificationSettingsStruct& notificationsettings, co mailheader.replace(F("$emailfrom"), notificationsettings.Sender); mailheader.replace(F("$ato"), notificationsettings.Receiver); mailheader.replace(F("$subject"), aSub); - mailheader.replace(F("$espeasyversion"), String(BUILD)); + mailheader.replace(F("$espeasyversion"), getSystemBuildString()); aMesg.replace(F("\r"), F("
")); // re-write line breaks for Content-type: text/html // Wait for Client to Start Sending diff --git a/src/_P001_Switch.ino b/src/_P001_Switch.ino index d397cd32f..e47dc5b52 100644 --- a/src/_P001_Switch.ino +++ b/src/_P001_Switch.ino @@ -60,6 +60,23 @@ # define P001_LP_MIN_INT PCONFIG_FLOAT(2) # define P001_SAFE_BTN PCONFIG_FLOAT(3) +// TD-er: Needed to fix a mistake in earlier fixes. +uint8_t P001_getSwitchType(struct EventStruct *event) { + uint8_t choice = PCONFIG(0); + + switch (choice) { + case 2: // Old implementation for Dimmer + case PLUGIN_001_TYPE_DIMMER: + choice = PLUGIN_001_TYPE_DIMMER; + break; + case 1: // Old implementation for switch + case PLUGIN_001_TYPE_SWITCH: + default: + choice = PLUGIN_001_TYPE_SWITCH; + break; + } + return choice; +} boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) { @@ -229,10 +246,13 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) // used to track if LP has fired PCONFIG(6) = 0; - // store millis for debounce, doubleclick and long press - PCONFIG_LONG(0) = millis(); // debounce timer - PCONFIG_LONG(1) = millis(); // doubleclick timer - PCONFIG_LONG(2) = millis(); // longpress timer + { + // store millis for debounce, doubleclick and long press + const unsigned long cur_millis = millis(); + PCONFIG_LONG(0) = cur_millis; // debounce timer + PCONFIG_LONG(1) = cur_millis; // doubleclick timer + PCONFIG_LONG(2) = cur_millis; // longpress timer + } // set minimum value for doubleclick MIN interval speed if (P001_DC_MAX_INT < SWITCH_DOUBLECLICK_MIN_INTERVAL) { @@ -712,22 +732,4 @@ boolean Plugin_001(uint8_t function, struct EventStruct *event, String& string) return success; } -// TD-er: Needed to fix a mistake in earlier fixes. -uint8_t P001_getSwitchType(struct EventStruct *event) { - uint8_t choice = PCONFIG(0); - - switch (choice) { - case 2: // Old implementation for Dimmer - case PLUGIN_001_TYPE_DIMMER: - choice = PLUGIN_001_TYPE_DIMMER; - break; - case 1: // Old implementation for switch - case PLUGIN_001_TYPE_SWITCH: - default: - choice = PLUGIN_001_TYPE_SWITCH; - break; - } - return choice; -} - #endif // USES_P001 diff --git a/src/_P016_IR.ino b/src/_P016_IR.ino index 609f93da3..1793892c2 100644 --- a/src/_P016_IR.ino +++ b/src/_P016_IR.ino @@ -745,7 +745,7 @@ boolean Plugin_016(uint8_t function, struct EventStruct *event, String& string) (typeToString(results.decode_type).length() > 1)) // be sent { IRAcUtils::decodeToState(&results, &state); - StaticJsonDocument<300> doc; + DynamicJsonDocument doc(300); // Checks if a particular state is something else than the default and only then it adds it to the JSON document doc[F("protocol")] = typeToString(state.protocol); diff --git a/src/_P021_Level.ino b/src/_P021_Level.ino index fcdc5e11b..3d008cb90 100644 --- a/src/_P021_Level.ino +++ b/src/_P021_Level.ino @@ -14,7 +14,7 @@ # include "src/Helpers/ESPEasy_math.h" # include "src/Helpers/Rules_calculate.h" -# include "src/WebServer/WebServer.h" +# include "src/WebServer/ESPEasy_WebServer.h" # define PLUGIN_021 # define PLUGIN_ID_021 21 diff --git a/src/_P026_Sysinfo.ino b/src/_P026_Sysinfo.ino index 06bb39476..d9ad2d160 100644 --- a/src/_P026_Sysinfo.ino +++ b/src/_P026_Sysinfo.ino @@ -212,73 +212,34 @@ boolean Plugin_026(uint8_t function, struct EventStruct *event, String& string) float P026_get_value(int type) { - float value = 0; - switch (type) { - case 0: - { - value = getUptimeMinutes(); - break; - } - case 1: - { - value = FreeMem(); - break; - } - case 2: - { - value = WiFi.RSSI(); - break; - } + case 0: return getUptimeMinutes(); + case 1: return FreeMem(); + case 2: return WiFi.RSSI(); case 3: - { # if FEATURE_ADC_VCC - value = vcc; + return vcc; # else // if FEATURE_ADC_VCC - value = -1.0f; + return -1.0f; # endif // if FEATURE_ADC_VCC - break; - } - case 4: - { - value = getCPUload(); - break; - } + case 4: return getCPUload(); case 5: case 6: case 7: case 8: - { - value = NetworkLocalIP()[type - 5]; - break; - } - case 9: - { - value = timePassedSince(lastWeb) / 1000.0f; // respond in seconds - break; - } - case 10: - { - value = getCurrentFreeStack(); - break; - } - case 12: - { - value = WiFiEventData.wifi_TX_pwr; - break; - } + return NetworkLocalIP()[type - 5]; + case 9: return timePassedSince(lastWeb) / 1000.0f; // respond in seconds + case 10: return getCurrentFreeStack(); + case 12: return WiFiEventData.wifi_TX_pwr; case 13: - { #ifdef USE_SECOND_HEAP - value = FreeMem2ndHeap(); - #endif + return FreeMem2ndHeap(); + #else break; - } - - + #endif } - return value; + return 0.0f; } #endif // USES_P026 diff --git a/src/_P081_Cron.ino b/src/_P081_Cron.ino index 44cb2ec7f..81d770288 100644 --- a/src/_P081_Cron.ino +++ b/src/_P081_Cron.ino @@ -163,7 +163,7 @@ boolean Plugin_081(uint8_t function, struct EventStruct *event, String& string) P081_setCronExecTimes(event, last_exec_time, next_exec_time); # ifndef BUILD_NO_DEBUG - addLog(LOG_LEVEL_DEBUG, String(F("Next execution:")) + ESPEasy_time::getDateTimeString(*gmtime(&next_exec_time))); + addLog(LOG_LEVEL_DEBUG, String(F("Next execution:")) + formatDateTimeString(*gmtime(&next_exec_time))); # endif // ifndef BUILD_NO_DEBUG if (function != PLUGIN_TIME_CHANGE) { diff --git a/src/_P082_GPS.ino b/src/_P082_GPS.ino index 362fa4dba..2068493ae 100644 --- a/src/_P082_GPS.ino +++ b/src/_P082_GPS.ino @@ -721,7 +721,7 @@ void P082_html_show_stats(struct EventStruct *event) { if (P082_data->getDateTime(dateTime, age, pps_sync)) { dateTime = node_time.addSeconds(dateTime, (age / 1000), false); - addHtml(ESPEasy_time::getDateTimeString(dateTime)); + addHtml(formatDateTimeString(dateTime)); } else { addHtml('-'); } diff --git a/src/_P095_ILI9341.ino b/src/_P095_ILI9341.ino index bf84f1f5a..fab3f8b72 100644 --- a/src/_P095_ILI9341.ino +++ b/src/_P095_ILI9341.ino @@ -217,12 +217,12 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) strcpy_P(ExtraTaskSettings.TaskDeviceValueNames[1], PSTR(PLUGIN_VALUENAME2_095)); } - AdaGFXFormBacklight(F("pbacklight"), P095_CONFIG_BACKLIGHT_PIN, - F("pbkpercent"), P095_CONFIG_BACKLIGHT_PERCENT); + AdaGFXFormBacklight(F("backlight"), P095_CONFIG_BACKLIGHT_PIN, + F("backpercentage"), P095_CONFIG_BACKLIGHT_PERCENT); - AdaGFXFormDisplayButton(F("pbutton"), P095_CONFIG_BUTTON_PIN, - F("pbtnInverse"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON), - F("ptimer"), P095_CONFIG_DISPLAY_TIMEOUT); + AdaGFXFormDisplayButton(F("button"), P095_CONFIG_BUTTON_PIN, + F("buttonInverse"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON), + F("timer"), P095_CONFIG_DISPLAY_TIMEOUT); { const __FlashStringHelper *hardwareTypes[] = { @@ -258,7 +258,7 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("TFT display model"), - F("ptype"), + F("dsptype"), static_cast(ILI9xxx_type_e::ILI9xxx_MAX), hardwareTypes, hardwareOptions, @@ -267,17 +267,17 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) addFormSubHeader(F("Layout")); - AdaGFXFormRotation(F("protate"), P095_CONFIG_ROTATION); + AdaGFXFormRotation(F("rotate"), P095_CONFIG_ROTATION); - AdaGFXFormTextPrintMode(F("pmode"), P095_CONFIG_FLAG_GET_MODE); + AdaGFXFormTextPrintMode(F("tpmode"), P095_CONFIG_FLAG_GET_MODE); - AdaGFXFormFontScaling(F("pfontscale"), P095_CONFIG_FLAG_GET_FONTSCALE); + AdaGFXFormFontScaling(F("fontscale"), P095_CONFIG_FLAG_GET_FONTSCALE); # ifdef P095_SHOW_SPLASH - addFormCheckBox(F("Show splash on start"), F("psplash"), P095_CONFIG_FLAG_GET_SHOW_SPLASH); + addFormCheckBox(F("Show splash on start"), F("splash"), P095_CONFIG_FLAG_GET_SHOW_SPLASH); # endif // ifdef P095_SHOW_SPLASH - addFormCheckBox(F("Clear display on exit"), F("pclrOnExit"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)); + addFormCheckBox(F("Clear display on exit"), F("clearOnExit"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT)); { const __FlashStringHelper *commandTriggers[] = { // Be sure to use all options available in the enum (except MAX)! @@ -301,27 +301,27 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) # endif // ifdef P095_ENABLE_ILI948X }; addFormSelector(F("Write Command trigger"), - F("pcmdtrigger"), + F("commandtrigger"), static_cast(P095_CommandTrigger::MAX), commandTriggers, commandTriggerOptions, P095_CONFIG_FLAG_GET_CMD_TRIGGER); - # ifndef BUILD_NO_DEBUG + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Select the command that is used to handle commands for this display.")); - # endif // ifndef BUILD_NO_DEBUG + # endif // ifndef LIMIT_BUILD_SIZE } // Inverted state! - addFormCheckBox(F("Wake display on receiving text"), F("pNoDisplay"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE)); - # ifndef BUILD_NO_DEBUG + addFormCheckBox(F("Wake display on receiving text"), F("NoDisplay"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE)); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("When checked, the display wakes up at receiving remote updates.")); - # endif // ifndef BUILD_NO_DEBUG + # endif // ifndef LIMIT_BUILD_SIZE - AdaGFXFormTextColRowMode(F("pcolrow"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW) == 1); + AdaGFXFormTextColRowMode(F("colrow"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW) == 1); - AdaGFXFormOnePixelCompatibilityOption(F("pcompat"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095)); // Inverse + AdaGFXFormOnePixelCompatibilityOption(F("compat"), !bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095)); // Inverse - AdaGFXFormTextBackgroundFill(F("pbackfill"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL) == 0); // Inverse + AdaGFXFormTextBackgroundFill(F("backfill"), bitRead(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL) == 0); // Inverse addFormSubHeader(F("Content")); @@ -361,27 +361,29 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) P095_CONFIG_VERSION = 2; // mark config V2 as already saved (next time, will not convert 'invalid' values) // PIN(0)..(2) are already set - P095_CONFIG_ROTATION = getFormItemInt(F("protate")); - P095_CONFIG_BUTTON_PIN = getFormItemInt(F("pbutton")); - P095_CONFIG_DISPLAY_TIMEOUT = getFormItemInt(F("ptimer")); - P095_CONFIG_BACKLIGHT_PIN = getFormItemInt(F("pbacklight")); - P095_CONFIG_BACKLIGHT_PERCENT = getFormItemInt(F("pbkpercent")); + P095_CONFIG_ROTATION = getFormItemInt(F("rotate")); + P095_CONFIG_BUTTON_PIN = getFormItemInt(F("button")); + P095_CONFIG_DISPLAY_TIMEOUT = getFormItemInt(F("timer")); + P095_CONFIG_BACKLIGHT_PIN = getFormItemInt(F("backlight")); + P095_CONFIG_BACKLIGHT_PERCENT = getFormItemInt(F("backpercentage")); - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_NO_WAKE, !isFormItemChecked(F("pNoDisplay"))); // Bit 0 NoDisplayOnReceivingText, - // reverse logic, default=checked! - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_INVERT_BUTTON, isFormItemChecked(F("pbtnInverse"))); // Bit 1 buttonInverse - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("pclrOnExit"))); // Bit 2 ClearOnExit - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_USE_COL_ROW, isFormItemChecked(F("pcolrow"))); // Bit 3 Col/Row addressing - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_COMPAT_P095, !isFormItemChecked(F("pcompat"))); // Bit 4 Compat_P095 (inv) - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_BACK_FILL, !isFormItemChecked(F("pbackfill"))); // Bit 5 Back fill text (inv) + uint32_t lSettings = 0; + bitWrite(lSettings, P095_CONFIG_FLAG_NO_WAKE, !isFormItemChecked(F("NoDisplay"))); // Bit 0 NoDisplayOnReceivingText, reverse + // logic, default=checked! + bitWrite(lSettings, P095_CONFIG_FLAG_INVERT_BUTTON, isFormItemChecked(F("buttonInverse"))); // Bit 1 buttonInverse + bitWrite(lSettings, P095_CONFIG_FLAG_CLEAR_ON_EXIT, isFormItemChecked(F("clearOnExit"))); // Bit 2 ClearOnExit + bitWrite(lSettings, P095_CONFIG_FLAG_USE_COL_ROW, isFormItemChecked(F("colrow"))); // Bit 3 Col/Row addressing + bitWrite(lSettings, P095_CONFIG_FLAG_COMPAT_P095, !isFormItemChecked(F("compat"))); // Bit 4 Compat_P095 (inv) + bitWrite(lSettings, P095_CONFIG_FLAG_BACK_FILL, !isFormItemChecked(F("backfill"))); // Bit 5 Back fill text (inv) # ifdef P095_SHOW_SPLASH - bitWrite(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("psplash"))); // Bit 6 Splash on start (inv) + bitWrite(lSettings, P095_CONFIG_FLAG_SHOW_SPLASH, !isFormItemChecked(F("splash"))); // Bit 6 Show splash on startup (inv) # endif // ifdef P095_SHOW_SPLASH - set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("pcmdtrigger"))); // Bit 8..11 Command trigger - set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("pfontscale"))); // Bit 12..15 Font scale - set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_MODE, getFormItemInt(F("pmode"))); // Bit 16..19 Text print mode - set4BitToUL(P095_CONFIG_FLAGS, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("ptype"))); // Bit 20..24 Hardwaretype + set4BitToUL(lSettings, P095_CONFIG_FLAG_CMD_TRIGGER, getFormItemInt(F("commandtrigger"))); // Bit 8..11 Command trigger + set4BitToUL(lSettings, P095_CONFIG_FLAG_FONTSCALE, getFormItemInt(F("fontscale"))); // Bit 12..15 Font scale + set4BitToUL(lSettings, P095_CONFIG_FLAG_MODE, getFormItemInt(F("tpmode"))); // Bit 16..19 Text print mode + set4BitToUL(lSettings, P095_CONFIG_FLAG_TYPE, getFormItemInt(F("dsptype"))); // Bit 20..24 Hardwaretype + P095_CONFIG_FLAGS = lSettings; String color = web_server.arg(F("pfgcolor")); uint16_t fgcolor = ADAGFX_WHITE; // Default to white when empty @@ -514,6 +516,19 @@ boolean Plugin_095(uint8_t function, struct EventStruct *event, String& string) } break; } + + # if ADAGFX_ENABLE_GET_CONFIG_VALUE + case PLUGIN_GET_CONFIG_VALUE: + { + P095_data_struct *P095_data = static_cast(getPluginTaskData(event->TaskIndex)); + + if (nullptr != P095_data) { + success = P095_data->plugin_get_config_value(event, string); // GetConfig operation, handle variables, fully delegated to + // AdafruitGFX_helper + } + break; + } + # endif // if ADAGFX_ENABLE_GET_CONFIG_VALUE } return success; diff --git a/src/_Plugin_Helper.h b/src/_Plugin_Helper.h index 3edecbf47..da3c127f1 100644 --- a/src/_Plugin_Helper.h +++ b/src/_Plugin_Helper.h @@ -3,7 +3,7 @@ #include -#include "ESPEasy_common.h" +#include "include/ESPEasy_config.h" #include "src/CustomBuild/ESPEasyLimits.h" @@ -53,7 +53,7 @@ #include "src/WebServer/HTML_wrappers.h" #include "src/WebServer/Markup.h" #include "src/WebServer/Markup_Forms.h" -#include "src/WebServer/WebServer.h" +#include "src/WebServer/ESPEasy_WebServer.h" // Defines to make plugins more readable. diff --git a/src/include/ESPEasy_config.h b/src/include/ESPEasy_config.h new file mode 100644 index 000000000..d2c0f7666 --- /dev/null +++ b/src/include/ESPEasy_config.h @@ -0,0 +1,109 @@ +#ifndef INCLUDE_ESPEASY_CONFIG_H +#define INCLUDE_ESPEASY_CONFIG_H + +#ifdef __cplusplus + +//#include + +//#include + +//#include +//#include + + +#ifdef __GCC__ +#pragma GCC system_header +#endif + + +/******************************************************************************\ + * Detect core versions ******************************************************* +\******************************************************************************/ + +#ifndef ESP32 + #if defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) || defined(ARDUINO_ESP8266_RELEASE_2_4_2) + #ifndef CORE_2_4_X + #define CORE_2_4_X + #endif + #endif + + #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_0) || defined(ARDUINO_ESP8266_RELEASE_2_4_1) + #ifndef CORE_PRE_2_4_2 + #define CORE_PRE_2_4_2 + #endif + #endif + + #if defined(ARDUINO_ESP8266_RELEASE_2_3_0) || defined(CORE_2_4_X) + #ifndef CORE_PRE_2_5_0 + #define CORE_PRE_2_5_0 + #endif + #else + #ifndef CORE_POST_2_5_0 + #define CORE_POST_2_5_0 + #endif + #endif + + + #ifdef FORCE_PRE_2_5_0 + #ifdef CORE_POST_2_5_0 + #undef CORE_POST_2_5_0 + #endif + #endif + +/* + #ifndef CORE_POST_2_5_0 + #define STR_HELPER(x) #x + #define STR(x) STR_HELPER(x) + #endif +*/ + +#endif + + +#if defined(ESP8266) + #include + + #ifndef CORE_POST_3_0_0 + #ifndef IRAM_ATTR + #define IRAM_ATTR ICACHE_RAM_ATTR + #endif + #endif +#endif + +#if defined(ESP32) + #include + #if ESP_IDF_VERSION_MAJOR < 3 + #ifndef ICACHE_RAM_ATTR + #define ICACHE_RAM_ATTR IRAM_ATTR + #endif + #endif +#endif + +#define ZERO_FILL(S) memset((S), 0, sizeof(S)) +#define ZERO_TERMINATE(S) S[sizeof(S) - 1] = 0 + + + + + +// User configuration +// Include Custom.h before ESPEasyDefaults.h. +#ifdef USE_CUSTOM_H + // make the compiler show a warning to confirm that this file is inlcuded + //#warning "**** Using Settings from Custom.h File ***" + #include "../Custom.h" +#endif + +// Check if any deprecated '#define ' (Custom.h) or '-D' (pre_custom_esp82xx.py/pre_custom_esp32.py) are used + +#include "../src/CustomBuild/check_defines_custom.h" // Check for replaced #define variables, see https://github.com/letscontrolit/ESPEasy/pull/4153 + +// Include custom first, then build info. (one may want to set BUILD_GIT for example) +#include "../src/CustomBuild/ESPEasy_buildinfo.h" +#include "../src/CustomBuild/ESPEasyLimits.h" +#include "../src/CustomBuild/define_plugin_sets.h" + + +#endif // ifdef __cplusplus + +#endif // ifndef INCLUDE_ESPEASY_CONFIG_H diff --git a/src/src/Commands/GPIO.cpp b/src/src/Commands/GPIO.cpp index 0b6cb44de..9780569f4 100644 --- a/src/src/Commands/GPIO.cpp +++ b/src/src/Commands/GPIO.cpp @@ -30,15 +30,27 @@ void logErrorGpioNotOutput(const String& prefix, int port); void logErrorModeOutOfRange(const String& prefix, int port); bool gpio_monitor_helper(int port, struct EventStruct *event, const char* Line); bool gpio_unmonitor_helper(int port, struct EventStruct *event, const char* Line); +#ifdef USES_P009 bool mcpgpio_range_pattern_helper(struct EventStruct *event, const char* Line, bool isWritePattern); +#endif +#ifdef USES_P019 bool pcfgpio_range_pattern_helper(struct EventStruct *event, const char* Line, bool isWritePattern); +#endif bool gpio_mode_range_helper(uint8_t pin, uint8_t pinMode, struct EventStruct *event, const char* Line); +#ifdef USES_P019 uint8_t getPcfAddress(uint8_t pin); +#endif bool setGPIOMode(uint8_t pin, uint8_t mode); +#ifdef USES_P019 bool setPCFMode(uint8_t pin, uint8_t mode); +#endif +#ifdef USES_P009 bool setMCPMode(uint8_t pin, uint8_t mode); bool mcpgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t &result); +#endif +#ifdef USES_P019 bool pcfgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t &result); +#endif /*************************************************************************/ @@ -192,7 +204,6 @@ const __FlashStringHelper * Command_GPIO_LongPulse_Ms(struct EventStruct *event, const __FlashStringHelper * Command_GPIO_Status(struct EventStruct *event, const char *Line) { - bool success = true; bool sendStatusFlag; uint8_t pluginID = 0; @@ -202,27 +213,31 @@ const __FlashStringHelper * Command_GPIO_Status(struct EventStruct *event, const pluginID = PLUGIN_GPIO; sendStatusFlag = true; break; +#ifdef USES_P009 case 'm': // mcp pluginID = PLUGIN_MCP; sendStatusFlag = GPIO_MCP_Read(event->Par2) == -1; break; +#endif +#ifdef USES_P019 case 'p': // pcf pluginID = PLUGIN_PCF; sendStatusFlag = GPIO_PCF_Read(event->Par2) == -1; break; +#endif default: - success = false; + addLog(LOG_LEVEL_ERROR, F("Plugin not included in build")); + return return_command_failed(); } - if (success && checkValidPortRange(pluginID, event->Par2)) + if (!checkValidPortRange(pluginID, event->Par2)) { - const uint32_t key = createKey(pluginID, event->Par2); // WARNING: 'status' uses Par2 instead of Par1 - String dummy; - SendStatusOnlyIfNeeded(event, sendStatusFlag, key, dummy, 0); - return return_command_success(); - } else { return return_command_failed(); } + const uint32_t key = createKey(pluginID, event->Par2); // WARNING: 'status' uses Par2 instead of Par1 + String dummy; + SendStatusOnlyIfNeeded(event, sendStatusFlag, key, dummy, 0); + return return_command_success(); } const __FlashStringHelper * Command_GPIO_PWM(struct EventStruct *event, const char *Line) @@ -449,14 +464,21 @@ const __FlashStringHelper * Command_GPIO(struct EventStruct *event, const char * setInternalGPIOPullupMode(event->Par1); state = GPIO_Read_Switch_State(event->Par1, PIN_MODE_INPUT_PULLUP); break; +#ifdef USES_P009 case PLUGIN_MCP: setMCPInputAndPullupMode(event->Par1, true); GPIO_Read(PLUGIN_MCP, event->Par1, state); break; +#endif +#ifdef USES_P019 case PLUGIN_PCF: // PCF8574 specific: only can read 0/low state, so we must send 1 state = 1; break; +#endif + default: + addLog(LOG_LEVEL_ERROR, F("Plugin not included in build")); + return return_command_failed(); } } else { // OUTPUT mode = PIN_MODE_OUTPUT; @@ -566,8 +588,6 @@ void createAndSetPortStatus_Mode_State(uint32_t key, uint8_t newMode, int8_t new bool getPluginIDAndPrefix(char selection, pluginID_t& pluginID, String& logPrefix) { - bool success = true; - switch (tolower(selection)) { case 'g': // gpio @@ -575,19 +595,23 @@ bool getPluginIDAndPrefix(char selection, pluginID_t& pluginID, String& logPrefi pluginID = PLUGIN_GPIO; logPrefix = F("GPIO"); break; +#ifdef USES_P009 case 'm': // mcp & mcplongpulse pluginID = PLUGIN_MCP; logPrefix = F("MCP"); break; +#endif +#ifdef USES_P019 case 'p': // pcf & pcflongpulse pluginID = PLUGIN_PCF; logPrefix = F("PCF"); break; +#endif default: - logPrefix = F("PluginID out of range. Error"); - success = false; + logPrefix = F("Plugin not included in build"); + return false; } - return success; + return true; } struct range_pattern_helper_data { @@ -731,15 +755,19 @@ range_pattern_helper_data range_pattern_helper_shared(pluginID_t plugin, struct ** mask = 973 = '1111001101' ** write pattern after mask = '1000xx11x1' where x indicates that the pin will not be changed ******************************************************************************/ +#ifdef USES_P009 const __FlashStringHelper * Command_GPIO_McpGPIOPattern(struct EventStruct *event, const char *Line) { return mcpgpio_range_pattern_helper(event, Line, true) ? return_command_success() : return_command_failed(); } +#endif +#ifdef USES_P019 const __FlashStringHelper * Command_GPIO_PcfGPIOPattern(struct EventStruct *event, const char *Line) { return pcfgpio_range_pattern_helper(event, Line, true) ? return_command_success() : return_command_failed(); } +#endif /****************************************************************************** ** Par1=starting pin @@ -760,16 +788,21 @@ const __FlashStringHelper * Command_GPIO_PcfGPIOPattern(struct EventStruct *even ** mask = 973 = '1111001101' ** write pattern after mask = '1111xx11x1' where x indicates that the pin will not be changed ******************************************************************************/ +#ifdef USES_P009 const __FlashStringHelper * Command_GPIO_McpGPIORange(struct EventStruct *event, const char *Line) { return mcpgpio_range_pattern_helper(event, Line, false) ? return_command_success() : return_command_failed(); } +#endif +#ifdef USES_P019 const __FlashStringHelper * Command_GPIO_PcfGPIORange(struct EventStruct *event, const char *Line) { return pcfgpio_range_pattern_helper(event, Line, false) ? return_command_success() : return_command_failed(); } +#endif +#ifdef USES_P009 bool mcpgpio_range_pattern_helper(struct EventStruct *event, const char *Line, bool isWritePattern) { range_pattern_helper_data data = range_pattern_helper_shared(PLUGIN_MCP, event, Line, isWritePattern); @@ -828,7 +861,9 @@ bool mcpgpio_range_pattern_helper(struct EventStruct *event, const char *Line, b } return onLine; } +#endif +#ifdef USES_P019 uint8_t getPcfAddress(uint8_t pin) { uint8_t retValue = static_cast((pin - 1) / 8) + 0x20; @@ -895,6 +930,7 @@ bool pcfgpio_range_pattern_helper(struct EventStruct *event, const char *Line, b } return onLine; } +#endif bool setGPIOMode(uint8_t pin, uint8_t mode) { @@ -916,6 +952,7 @@ bool setGPIOMode(uint8_t pin, uint8_t mode) } } +#ifdef USES_P009 bool setMCPMode(uint8_t pin, uint8_t mode) { if (checkValidPortRange(PLUGIN_MCP, pin)) { @@ -935,7 +972,9 @@ bool setMCPMode(uint8_t pin, uint8_t mode) return false; } } +#endif +#ifdef USES_P019 bool setPCFMode(uint8_t pin, uint8_t mode) { if (checkValidPortRange(PLUGIN_PCF, pin)) { @@ -953,6 +992,7 @@ bool setPCFMode(uint8_t pin, uint8_t mode) return false; } } +#endif /*********************************************** * event->Par1: PIN to be set @@ -1017,14 +1057,20 @@ bool gpio_mode_range_helper(uint8_t pin, uint8_t pinMode, struct EventStruct *ev case PLUGIN_GPIO: /* setSuccess = */ setGPIOMode(pin, mode); break; +#ifdef USES_P019 case PLUGIN_PCF: // set pin = 1 when INPUT - /* setSuccess = */ setPCFMode(pin, mode); break; +#endif +#ifdef USES_P009 case PLUGIN_MCP: /* setSuccess = */ setMCPMode(pin, mode); break; +#endif + default: + addLog(LOG_LEVEL_ERROR, F("Plugin not included in build")); + return false; } const uint32_t key = createKey(pluginID, pin); @@ -1085,19 +1131,24 @@ bool getGPIOPinStateValues(String& str) { success = true; break; +#ifdef USES_P009 case 'm': - str = GPIO_MCP_Read(par1); logPrefix = F("MCP"); success = true; break; +#endif +#ifdef USES_P019 case 'p': - str = GPIO_PCF_Read(par1); logPrefix = F("PCF"); success = true; break; +#endif + default: + addLog(LOG_LEVEL_ERROR, F("Plugin not included in build")); + return false; } } @@ -1121,20 +1172,33 @@ bool getGPIOPinStateValues(String& str) { } if (successPar) { - uint16_t tempValue = 0; switch (device[0]) { +#ifdef USES_P009 case 'm': + { + uint16_t tempValue = 0; logPrefix = F("MCP"); success = mcpgpio_plugin_range_helper(par1, par2, tempValue); str = String(tempValue); break; + } +#endif +#ifdef USES_P019 case 'p': + { + uint16_t tempValue = 0; logPrefix = F("PCF"); success = pcfgpio_plugin_range_helper(par1, par2, tempValue); str = String(tempValue); break; + } + #endif + default: + addLog(LOG_LEVEL_ERROR, F("PLUGIN PINSTATE. Plugin not included in build")); + return false; + } if (success) { @@ -1161,6 +1225,7 @@ bool getGPIOPinStateValues(String& str) { return success; } +#ifdef USES_P009 bool mcpgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t& result) { const range_pattern_helper_data data = range_helper_shared(PLUGIN_MCP, pin1, pin2); @@ -1195,7 +1260,9 @@ bool mcpgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t& result) return success; } +#endif +#ifdef USES_P019 bool pcfgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t& result) { const range_pattern_helper_data data = range_helper_shared(PLUGIN_PCF, pin1, pin2); @@ -1229,3 +1296,4 @@ bool pcfgpio_plugin_range_helper(uint8_t pin1, uint8_t pin2, uint16_t& result) return success; } +#endif \ No newline at end of file diff --git a/src/src/Commands/GPIO.h b/src/src/Commands/GPIO.h index 69ad3e26e..5dedb7d04 100644 --- a/src/src/Commands/GPIO.h +++ b/src/src/Commands/GPIO.h @@ -21,11 +21,15 @@ const __FlashStringHelper * Command_GPIO_Monitor(struct EventStruct *event, cons const __FlashStringHelper * Command_GPIO_UnMonitor(struct EventStruct *event, const char* Line); const __FlashStringHelper * Command_GPIO_Status(struct EventStruct *event, const char* Line); +#ifdef USES_P009 const __FlashStringHelper * Command_GPIO_McpGPIORange(struct EventStruct *event, const char* Line); const __FlashStringHelper * Command_GPIO_McpGPIOPattern(struct EventStruct *event, const char* Line); +#endif +#ifdef USES_P019 const __FlashStringHelper * Command_GPIO_PcfGPIORange(struct EventStruct *event, const char* Line); const __FlashStringHelper * Command_GPIO_PcfGPIOPattern(struct EventStruct *event, const char* Line); +#endif const __FlashStringHelper * Command_GPIO_Mode(struct EventStruct *event, const char* Line); const __FlashStringHelper * Command_GPIO_ModeRange(struct EventStruct *event, const char* Line); diff --git a/src/src/Commands/InternalCommands.cpp b/src/src/Commands/InternalCommands.cpp index 9b3dae2f8..5b60ffba1 100644 --- a/src/src/Commands/InternalCommands.cpp +++ b/src/src/Commands/InternalCommands.cpp @@ -342,6 +342,7 @@ bool executeInternalCommand(command_case_data & data) break; } case 'm': { +#ifdef USES_P009 if (cmd_lc_length > 3 && data.cmd_lc[3] == 'g') { COMMAND_CASE_A( "mcpgpio", Command_GPIO, 2); // Gpio.h COMMAND_CASE_A( "mcpgpiorange", Command_GPIO_McpGPIORange, -1); // Gpio.h @@ -354,6 +355,7 @@ bool executeInternalCommand(command_case_data & data) COMMAND_CASE_A( "mcpmoderange", Command_GPIO_ModeRange, 3); // Gpio.h COMMAND_CASE_A( "mcppulse", Command_GPIO_Pulse, 3); // GPIO.h } +#endif COMMAND_CASE_A( "monitor", Command_GPIO_Monitor, 2); // GPIO.h COMMAND_CASE_A( "monitorrange", Command_GPIO_MonitorRange, 3); // GPIO.h #ifndef BUILD_NO_DIAGNOSTIC_COMMANDS @@ -374,6 +376,7 @@ bool executeInternalCommand(command_case_data & data) break; } case 'p': { +#ifdef USES_P019 if (cmd_lc_length > 3 && data.cmd_lc[3] == 'g') { COMMAND_CASE_A( "pcfgpio", Command_GPIO, 2); // Gpio.h COMMAND_CASE_A( "pcfgpiorange", Command_GPIO_PcfGPIORange, -1); // Gpio.h @@ -386,6 +389,7 @@ bool executeInternalCommand(command_case_data & data) COMMAND_CASE_A( "pcfmoderange", Command_GPIO_ModeRange, 3); // Gpio.h ************ COMMAND_CASE_A( "pcfpulse", Command_GPIO_Pulse, 3); // GPIO.h } +#endif COMMAND_CASE_R("password", Command_Settings_Password, 1); // Settings.h #if FEATURE_CUSTOM_PROVISIONING COMMAND_CASE_A( "provisionconfig", Command_Provisioning_Config, 0); // Provisioning.h diff --git a/src/src/Commands/Settings.cpp b/src/src/Commands/Settings.cpp index 0e16e99b8..17ef70b6d 100644 --- a/src/src/Commands/Settings.cpp +++ b/src/src/Commands/Settings.cpp @@ -4,6 +4,8 @@ #include "../Commands/Common.h" +#include "../CustomBuild/CompiletimeDefines.h" + #include "../ESPEasyCore/ESPEasyNetwork.h" #include "../ESPEasyCore/Serial.h" @@ -15,6 +17,7 @@ #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" #include "../Helpers/StringConverter.h" +#include "../Helpers/StringGenerator_System.h" String Command_Settings_Build(struct EventStruct *event, const char* Line) @@ -94,7 +97,7 @@ const __FlashStringHelper * Command_Settings_Print(struct EventStruct *event, co serialPrintln(F("System Info")); serialPrint(F(" IP Address : ")); serialPrintln(NetworkLocalIP().toString()); - serialPrint(F(" Build : ")); serialPrintln(String(static_cast(BUILD))); + serialPrint(F(" Build : ")); serialPrintln(String(get_build_nr()) + '/' + getSystemBuildString()); serialPrint(F(" Name : ")); serialPrintln(Settings.Name); serialPrint(F(" Unit : ")); serialPrintln(String(static_cast(Settings.Unit))); serialPrint(F(" WifiSSID : ")); serialPrintln(SecuritySettings.WifiSSID); diff --git a/src/src/CustomBuild/CompiletimeDefines.cpp b/src/src/CustomBuild/CompiletimeDefines.cpp index 82525ca53..4554e6ccf 100644 --- a/src/src/CustomBuild/CompiletimeDefines.cpp +++ b/src/src/CustomBuild/CompiletimeDefines.cpp @@ -1,5 +1,7 @@ #include "../CustomBuild/CompiletimeDefines.h" +#include "../CustomBuild/ESPEasy_buildinfo.h" + // This file will be "patched" at compiletime by // tools/pio/generate-compiletime-defines.py // Therefore this one may not include ESPEasy_common.h @@ -12,15 +14,32 @@ // End of defines being patched by the Python build script. +// Uncrustify must not be used on macros, so turn it off. +// *INDENT-OFF* + // Need to add quotes around defines as the PIO build tools make it hard to include the string quotes. #define STRINGIFY(s) STRINGIFY1(s) -#define STRINGIFY1(s) # s +#define STRINGIFY1(s) #s +// Uncrustify must not be used on macros, but we're now done, so turn Uncrustify on again. +// *INDENT-ON* + + +uint16_t get_build_nr() { + #ifdef SET_BUILD_VERSION + return SET_BUILD_VERSION; + #else + #pragma message ( "Build is not based on current date" ) + // Last used version for BUILD was 20116, + // so make sure we can recognize a build not made using the compile time defines. + return 20117; + #endif +} const __FlashStringHelper* get_binary_filename() { #ifndef SET_BUILD_BINARY_FILENAME return F("firmware.bin"); #else // ifndef SET_BUILD_BINARY_FILENAME - return F(STRINGIFY(SET_BUILD_BINARY_FILENAME)); + return F(SET_BUILD_BINARY_FILENAME); #endif // ifndef SET_BUILD_BINARY_FILENAME } @@ -46,7 +65,7 @@ const __FlashStringHelper* get_build_platform() { #ifndef SET_BUILD_PLATFORM return F(""); #else // ifndef SET_BUILD_PLATFORM - return F(STRINGIFY(SET_BUILD_PLATFORM)); + return F(SET_BUILD_PLATFORM); #endif // ifndef SET_BUILD_PLATFORM } @@ -54,13 +73,13 @@ const __FlashStringHelper* get_git_head() { #ifndef SET_BUILD_GIT_HEAD return F(""); #else // ifndef SET_BUILD_GIT_HEAD - return F(STRINGIFY(SET_BUILD_GIT_HEAD)); + return F(SET_BUILD_GIT_HEAD); #endif // ifndef SET_BUILD_GIT_HEAD } const __FlashStringHelper * get_board_name() { #ifdef SET_BOARD_NAME - return F(STRINGIFY(SET_BOARD_NAME)); + return F(SET_BOARD_NAME); #elif defined(ARDUINO_BOARD) return F(ARDUINO_BOARD); #else diff --git a/src/src/CustomBuild/CompiletimeDefines.h b/src/src/CustomBuild/CompiletimeDefines.h index 4ffa1ef19..392a83d25 100644 --- a/src/src/CustomBuild/CompiletimeDefines.h +++ b/src/src/CustomBuild/CompiletimeDefines.h @@ -3,8 +3,10 @@ #include -//#include "../../ESPEasy_common.h" +// Build NR is used as a "revision" nr for settings +// As of 2022-08-18, it is the nr of days since 2022-08-18 + 20200 +uint16_t get_build_nr(); const __FlashStringHelper * get_binary_filename(); const __FlashStringHelper * get_build_time(); const __FlashStringHelper * get_build_date(); diff --git a/src/src/CustomBuild/ESPEasyLimits.h b/src/src/CustomBuild/ESPEasyLimits.h index 386611012..64bf0fdeb 100644 --- a/src/src/CustomBuild/ESPEasyLimits.h +++ b/src/src/CustomBuild/ESPEasyLimits.h @@ -1,7 +1,7 @@ #ifndef CUSTOMBUILD_ESPEASY_LIMITS_H #define CUSTOMBUILD_ESPEASY_LIMITS_H -#include "../../ESPEasy_common.h" +#include "../../include/ESPEasy_config.h" // *********************************************************************** // * These limits have direct impact on the settings files diff --git a/src/src/CustomBuild/ESPEasy_buildinfo.h b/src/src/CustomBuild/ESPEasy_buildinfo.h index 9fcc3c922..73047418d 100644 --- a/src/src/CustomBuild/ESPEasy_buildinfo.h +++ b/src/src/CustomBuild/ESPEasy_buildinfo.h @@ -20,7 +20,11 @@ #endif // if defined(ESP32) -#define BUILD 20116 // git version e.g. "20103" can be read as "2.1.03" (stored in int16_t) +// Deprecated define. +// Use get_build_nr() from CustomBuild/CompiletimeDefines.h +//#define BUILD 20116 // git version e.g. "20103" can be read as "2.1.03" (stored in int16_t) + + #ifndef BUILD_NOTES #if defined(ESP8266) # define BUILD_NOTES " - Mega" diff --git a/src/src/CustomBuild/define_plugin_sets.h b/src/src/CustomBuild/define_plugin_sets.h index bbae6d458..c042fee22 100644 --- a/src/src/CustomBuild/define_plugin_sets.h +++ b/src/src/CustomBuild/define_plugin_sets.h @@ -1,7 +1,7 @@ #ifndef CUSTOMBUILD_DEFINE_PLUGIN_SETS_H #define CUSTOMBUILD_DEFINE_PLUGIN_SETS_H -#include "../../ESPEasy_common.h" +#include "../../include/ESPEasy_config.h" /* ################################################# @@ -333,6 +333,19 @@ To create/register a plugin, you have to : #define FEATURE_ESPEASY_P2P 0 #endif + #ifdef FEATURE_MDNS + #undef FEATURE_MDNS + #endif + #define FEATURE_MDNS 0 + #ifndef DISABLE_SC16IS752_Serial + #define DISABLE_SC16IS752_Serial + #endif + + #ifdef FEATURE_ARDUINO_OTA + #undef FEATURE_ARDUINO_OTA + #endif + #define FEATURE_ARDUINO_OTA 0 + #ifndef PLUGIN_DESCR #define PLUGIN_DESCR "Minimal 1M OTA" #endif @@ -1734,7 +1747,7 @@ To create/register a plugin, you have to : /******************************************************************************\ * Libraries dependencies ***************************************************** \******************************************************************************/ -#if defined(USES_P020) || defined(USES_P049) || defined(USES_P052) || defined(USES_P053) || defined(USES_P056) || defined(USES_P071) || defined(USES_P075) || defined(USES_P078) || defined(USES_P082) || defined(USES_P085) || defined(USES_P087) || defined(USES_P094) || defined(USES_P102) || defined(USES_P108) || defined(USES_C018) +#if defined(USES_P020) || defined(USES_P049) || defined(USES_P052) || defined(USES_P053) || defined(USES_P056) || defined(USES_P071) || defined(USES_P075) || defined(USES_P078) || defined(USES_P082) || defined(USES_P085) || defined(USES_P087) || defined(USES_P093)|| defined(USES_P094) || defined(USES_P102) || defined(USES_P105) || defined(USES_P108) || defined(USES_C018) // At least one plugin uses serial. #ifndef PLUGIN_USES_SERIAL #define PLUGIN_USES_SERIAL @@ -1756,7 +1769,6 @@ To create/register a plugin, you have to : #endif */ - #if defined(USES_C018) #define FEATURE_PACKED_RAW_DATA 1 #endif @@ -1815,6 +1827,7 @@ To create/register a plugin, you have to : #if FEATURE_SD #undef FEATURE_SD // Unlikely on 1M units #define FEATURE_SD 0 + #define NO_GLOBAL_SD #endif #ifndef LIMIT_BUILD_SIZE #define LIMIT_BUILD_SIZE diff --git a/src/src/DataStructs/SettingsStruct.h b/src/src/DataStructs/SettingsStruct.h index 6f0b16af6..9689cfcda 100644 --- a/src/src/DataStructs/SettingsStruct.h +++ b/src/src/DataStructs/SettingsStruct.h @@ -185,8 +185,6 @@ class SettingsStruct_tmpl void clearMisc(); - void clearAll(); - void clearTask(taskIndex_t task); // Return hostname + unit when selected to add unit. diff --git a/src/src/DataStructs/WiFi_AP_Candidate.cpp b/src/src/DataStructs/WiFi_AP_Candidate.cpp index 30caedb09..c46408bcb 100644 --- a/src/src/DataStructs/WiFi_AP_Candidate.cpp +++ b/src/src/DataStructs/WiFi_AP_Candidate.cpp @@ -9,8 +9,12 @@ #include "../Helpers/StringGenerator_WiFi.h" #include "../../ESPEasy_common.h" - - +#if defined(ESP8266) + # include +#endif // if defined(ESP8266) +#if defined(ESP32) + # include +#endif // if defined(ESP32) #define WIFI_AP_CANDIDATE_MAX_AGE 300000 // 5 minutes in msec diff --git a/src/src/DataStructs_templ/SettingsStruct.cpp b/src/src/DataStructs_templ/SettingsStruct.cpp index d1e901c81..5c3f464de 100644 --- a/src/src/DataStructs_templ/SettingsStruct.cpp +++ b/src/src/DataStructs_templ/SettingsStruct.cpp @@ -12,7 +12,13 @@ template SettingsStruct_tmpl::SettingsStruct_tmpl() : ResetFactoryDefaultPreference(0) { //-V730 - clearAll(); + clearMisc(); + clearTimeSettings(); + clearNotifications(); + clearControllers(); + clearTasks(); + clearLogSettings(); + clearUnitNameSettings(); clearNetworkSettings(); } @@ -498,17 +504,6 @@ void SettingsStruct_tmpl::clearMisc() { DoNotStartAP(DEFAULT_DONT_ALLOW_START_AP); } -template -void SettingsStruct_tmpl::clearAll() { - clearMisc(); - clearTimeSettings(); - clearNetworkSettings(); - clearNotifications(); - clearControllers(); - clearTasks(); - clearLogSettings(); - clearUnitNameSettings(); -} template void SettingsStruct_tmpl::clearTask(taskIndex_t task) { diff --git a/src/src/DataTypes/NetworkMedium.h b/src/src/DataTypes/NetworkMedium.h index 388a6c37b..4e45ebe1d 100644 --- a/src/src/DataTypes/NetworkMedium.h +++ b/src/src/DataTypes/NetworkMedium.h @@ -4,7 +4,7 @@ #include // Is stored in settings -enum class NetworkMedium_t : uint8_t { +enum class NetworkMedium_t : unsigned char { WIFI = 0, Ethernet = 1 }; diff --git a/src/src/ESPEasyCore/Controller.cpp b/src/src/ESPEasyCore/Controller.cpp index b99d73d65..3f27c7ce7 100644 --- a/src/src/ESPEasyCore/Controller.cpp +++ b/src/src/ESPEasyCore/Controller.cpp @@ -212,14 +212,14 @@ bool MQTTConnect(controllerIndex_t controller_idx) MQTTclient.setCallback(incoming_mqtt_callback); // MQTT needs a unique clientname to subscribe to broker - String clientid = getMQTTclientID(ControllerSettings); + const String clientid = getMQTTclientID(ControllerSettings); - String LWTTopic = getLWT_topic(ControllerSettings); - String LWTMessageDisconnect = getLWT_messageDisconnect(ControllerSettings); - bool MQTTresult = false; - uint8_t willQos = 0; - bool willRetain = ControllerSettings.mqtt_willRetain() && ControllerSettings.mqtt_sendLWT(); - bool cleanSession = ControllerSettings.mqtt_cleanSession(); // As suggested here: + const String LWTTopic = getLWT_topic(ControllerSettings); + const String LWTMessageDisconnect = getLWT_messageDisconnect(ControllerSettings); + bool MQTTresult = false; + const uint8_t willQos = 0; + const bool willRetain = ControllerSettings.mqtt_willRetain() && ControllerSettings.mqtt_sendLWT(); + const bool cleanSession = ControllerSettings.mqtt_cleanSession(); // As suggested here: if (MQTTclient_should_reconnect) { addLog(LOG_LEVEL_ERROR, F("MQTT : Intentional reconnect")); @@ -247,10 +247,7 @@ bool MQTTConnect(controllerIndex_t controller_idx) } delay(0); - - uint8_t controller_number = Settings.Protocol[controller_idx]; - - count_connection_results(MQTTresult, F("MQTT : Broker "), controller_number); + count_connection_results(MQTTresult, F("MQTT : Broker "), Settings.Protocol[controller_idx]); if (!MQTTresult) { MQTTclient.disconnect(); @@ -259,8 +256,8 @@ bool MQTTConnect(controllerIndex_t controller_idx) return false; } if (loglevelActiveFor(LOG_LEVEL_INFO)) { - String log = F("MQTT : Connected to broker with client ID: "); - + String log; + log += F("MQTT : Connected to broker with client ID: "); log += clientid; addLogMove(LOG_LEVEL_INFO, log); } @@ -460,6 +457,11 @@ bool SourceNeedsStatusUpdate(EventValueSource::Enum eventSource) return false; } +void SendStatus(struct EventStruct *event, const __FlashStringHelper * status) +{ + SendStatus(event, String(status)); +} + void SendStatus(struct EventStruct *event, const String& status) { if (status.isEmpty()) { return; } diff --git a/src/src/ESPEasyCore/Controller.h b/src/src/ESPEasyCore/Controller.h index e451c4091..3222db340 100644 --- a/src/src/ESPEasyCore/Controller.h +++ b/src/src/ESPEasyCore/Controller.h @@ -54,6 +54,7 @@ void SendStatusOnlyIfNeeded(struct EventStruct *event, bool param1, uint32_t key bool SourceNeedsStatusUpdate(EventValueSource::Enum eventSource); +void SendStatus(struct EventStruct *event, const __FlashStringHelper * status); void SendStatus(struct EventStruct *event, const String& status); #if FEATURE_MQTT diff --git a/src/src/ESPEasyCore/ESPEasyGPIO.cpp b/src/src/ESPEasyCore/ESPEasyGPIO.cpp index e3bc0aaf1..e754674f3 100644 --- a/src/src/ESPEasyCore/ESPEasyGPIO.cpp +++ b/src/src/ESPEasyCore/ESPEasyGPIO.cpp @@ -86,6 +86,7 @@ bool GPIO_Read_Switch_State(int pin, uint8_t pinMode) { return digitalRead(pin) == HIGH; } +#ifdef USES_P009 //******************************************************************************** // MCP23017 PIN read //******************************************************************************** @@ -287,7 +288,9 @@ bool setMCPOutputMode(uint8_t Par1) } return success; } +#endif +#ifdef USES_P019 //******************************************************************************** // PCF8574 read pin //******************************************************************************** @@ -406,6 +409,9 @@ bool setPCFInputMode(uint8_t pin) } else return false; } +#endif + + //********************************************************* // GPIO_Monitor10xSec: // What it does: @@ -433,12 +439,16 @@ void GPIO_Monitor10xSec() eventString = F("GPIO"); break; case PLUGIN_MCP: +#ifdef USES_P009 currentState = GPIO_MCP_Read(gpioPort); eventString = F("MCP"); +#endif break; case PLUGIN_PCF: +#ifdef USES_P019 currentState = GPIO_PCF_Read(gpioPort); eventString = F("PCF"); +#endif break; default: caseFound=false; @@ -519,10 +529,14 @@ bool GPIO_Write(pluginID_t pluginID, int port, uint8_t value, uint8_t pinMode) success=false; break; case PLUGIN_MCP: +#ifdef USES_P009 GPIO_MCP_Write(port, value); +#endif break; case PLUGIN_PCF: +#ifdef USES_P019 GPIO_PCF_Write(port, value); +#endif break; default: success=false; @@ -539,10 +553,14 @@ bool GPIO_Read(pluginID_t pluginID, int port, int8_t &value) value = GPIO_Internal_Read(port); break; case PLUGIN_MCP: +#ifdef USES_P009 value = GPIO_MCP_Read(port); +#endif break; case PLUGIN_PCF: +#ifdef USES_P019 value = GPIO_PCF_Read(port); +#endif break; default: success=false; diff --git a/src/src/ESPEasyCore/ESPEasyGPIO.h b/src/src/ESPEasyCore/ESPEasyGPIO.h index 47119777d..10f41033c 100644 --- a/src/src/ESPEasyCore/ESPEasyGPIO.h +++ b/src/src/ESPEasyCore/ESPEasyGPIO.h @@ -26,6 +26,7 @@ bool GPIO_Internal_Read(int pin); bool GPIO_Read_Switch_State(struct EventStruct *event); bool GPIO_Read_Switch_State(int pinNumber, uint8_t pinMode); +#ifdef USES_P009 //******************************************************************************** // MCP23017 read //******************************************************************************** @@ -41,7 +42,9 @@ void GPIO_MCP_WriteRegister(uint8_t mcpAddr, uint8_t regAddr, uint8_t regValue); //******************************************************************************** // MCP23017 pullUP //******************************************************************************** +#endif +#ifdef USES_P019 //******************************************************************************** // PCF8574 read //******************************************************************************** @@ -54,6 +57,7 @@ bool GPIO_PCF_ReadAllPins(uint8_t address, uint8_t *retValue); //******************************************************************************** bool GPIO_PCF_Write(int Par1, uint8_t Par2); void GPIO_PCF_WriteAllPins(uint8_t Par1, uint8_t Par2); +#endif //********************************************************* // GPIO_Monitor10xSec: diff --git a/src/src/ESPEasyCore/ESPEasy_setup.cpp b/src/src/ESPEasyCore/ESPEasy_setup.cpp index 0d3c93b27..435e37d90 100644 --- a/src/src/ESPEasyCore/ESPEasy_setup.cpp +++ b/src/src/ESPEasyCore/ESPEasy_setup.cpp @@ -4,6 +4,7 @@ #include "../../ESPEasy-Globals.h" #include "../../_Plugin_Helper.h" +#include "../CustomBuild/CompiletimeDefines.h" #include "../ESPEasyCore/ESPEasyNetwork.h" #include "../ESPEasyCore/ESPEasyRules.h" #include "../ESPEasyCore/ESPEasyWifi.h" @@ -27,7 +28,7 @@ #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" #include "../Helpers/StringGenerator_System.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #ifdef USE_RTOS_MULTITASKING @@ -359,7 +360,7 @@ void ESPEasy_setup() #endif - if (Settings.Build != BUILD) { + if (Settings.Build != get_build_nr()) { BuildFixes(); } diff --git a/src/src/Globals/Plugins.cpp b/src/src/Globals/Plugins.cpp index 93f2f2161..3110ca521 100644 --- a/src/src/Globals/Plugins.cpp +++ b/src/src/Globals/Plugins.cpp @@ -428,7 +428,7 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) int dotPos = command.indexOf('.'); // Find first period if (Function == PLUGIN_WRITE // Only applicable on PLUGIN_WRITE function && dotPos > -1) { // First precondition is just a quick check for a period (fail-fast strategy) - String arg0 = parseString(command, 1); // Get first argument + const String arg0 = parseString(command, 1); // Get first argument dotPos = arg0.indexOf('.'); if (dotPos > -1) { String thisTaskName = parseString(arg0, 1, '.'); // Extract taskname prefix @@ -518,9 +518,7 @@ bool PluginCall(uint8_t Function, struct EventStruct *event, String& str) { for (taskIndex_t taskIndex = 0; taskIndex < TASKS_MAX; taskIndex++) { - bool retval = PluginCallForTask(taskIndex, Function, &TempEvent, str); - - if (retval) { + if (PluginCallForTask(taskIndex, Function, &TempEvent, str)) { #ifndef BUILD_NO_RAM_TRACKER checkRAM(F("PluginCallUDP"), taskIndex); #endif diff --git a/src/src/Globals/Services.cpp b/src/src/Globals/Services.cpp index f3971e2a4..f8a7cd4e8 100644 --- a/src/src/Globals/Services.cpp +++ b/src/src/Globals/Services.cpp @@ -13,8 +13,6 @@ #endif #ifdef ESP32 - #include - #include WebServer web_server(80); #ifndef NO_HTTP_UPDATER ESP32HTTPUpdateServer httpUpdater(true); @@ -23,7 +21,6 @@ #if FEATURE_DNS_SERVER - #include DNSServer dnsServer; bool dnsServerActive = false; #endif // if FEATURE_DNS_SERVER diff --git a/src/src/Globals/Services.h b/src/src/Globals/Services.h index 7d4197e51..6db7783ec 100644 --- a/src/src/Globals/Services.h +++ b/src/src/Globals/Services.h @@ -32,6 +32,7 @@ #ifdef ESP32 #include + #include #include extern WebServer web_server; diff --git a/src/src/Helpers/AdafruitGFX_helper.cpp b/src/src/Helpers/AdafruitGFX_helper.cpp index 9274eca5d..0fa825331 100644 --- a/src/src/Helpers/AdafruitGFX_helper.cpp +++ b/src/src/Helpers/AdafruitGFX_helper.cpp @@ -10,40 +10,67 @@ # endif // if FEATURE_SD && defined(ADAGFX_ENABLE_BMP_DISPLAY) # if ADAGFX_FONTS_INCLUDED -# include "src/Static/Fonts/Seven_Segment24pt7b.h" -# include "src/Static/Fonts/Seven_Segment18pt7b.h" -# include "src/Static/Fonts/FreeSans9pt7b.h" +# include "../Static/Fonts/Seven_Segment24pt7b.h" +# include "../Static/Fonts/Seven_Segment18pt7b.h" +# include "../Static/Fonts/FreeSans9pt7b.h" # ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED -# include "src/Static/Fonts/angelina8pt7b.h" -# include "src/Static/Fonts/NovaMono8pt7b.h" -# include "src/Static/Fonts/unispace8pt7b.h" -# include "src/Static/Fonts/unispace_italic8pt7b.h" -# include "src/Static/Fonts/whitrabt8pt7b.h" +# include "../Static/Fonts/angelina8pt7b.h" +# include "../Static/Fonts/NovaMono8pt7b.h" +# include "../Static/Fonts/unispace8pt7b.h" +# include "../Static/Fonts/unispace_italic8pt7b.h" +# include "../Static/Fonts/whitrabt8pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO +# include "../Static/Fonts/Roboto_Regular8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO +# ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED +# include "../Static/Fonts/RobotoCondensed_Regular8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED +# ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO +# include "../Static/Fonts/RobotoMono_Regular8pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED -# include "src/Static/Fonts/angelina12pt7b.h" -# include "src/Static/Fonts/NovaMono12pt7b.h" -# include "src/Static/Fonts/RepetitionScrolling12pt7b.h" -# include "src/Static/Fonts/unispace12pt7b.h" -# include "src/Static/Fonts/unispace_italic12pt7b.h" -# include "src/Static/Fonts/whitrabt12pt7b.h" +# include "../Static/Fonts/angelina12pt7b.h" +# include "../Static/Fonts/NovaMono12pt7b.h" +# include "../Static/Fonts/RepetitionScrolling12pt7b.h" +# include "../Static/Fonts/unispace12pt7b.h" +# include "../Static/Fonts/unispace_italic12pt7b.h" +# include "../Static/Fonts/whitrabt12pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO +# include "../Static/Fonts/Roboto_Regular12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO +# ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED +# include "../Static/Fonts/RobotoCondensed_Regular12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED +# ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO +# include "../Static/Fonts/RobotoMono_Regular12pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED -# include "src/Static/Fonts/AmerikaSans16pt7b.h" -# include "src/Static/Fonts/whitrabt16pt7b.h" +# include "../Static/Fonts/AmerikaSans16pt7b.h" +# include "../Static/Fonts/whitrabt16pt7b.h" +# ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO +# include "../Static/Fonts/Roboto_Regular16pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO +# ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED +# include "../Static/Fonts/RobotoCondensed_Regular16pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED +# ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO +# include "../Static/Fonts/RobotoMono_Regular16pt7b.h" +# endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED -# include "src/Static/Fonts/whitrabt18pt7b.h" +# include "../Static/Fonts/whitrabt18pt7b.h" # endif // ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED -# include "src/Static/Fonts/whitrabt20pt7b.h" +# include "../Static/Fonts/whitrabt20pt7b.h" # endif // ifdef ADAGFX_FONTS_EXTRA_20PT_INCLUDED # endif // if ADAGFX_FONTS_INCLUDED /****************************************************************************************** * get the display text for a 'text print mode' enum value *****************************************************************************************/ -const __FlashStringHelper* toString(AdaGFXTextPrintMode mode) { +const __FlashStringHelper* toString(const AdaGFXTextPrintMode& mode) { switch (mode) { case AdaGFXTextPrintMode::ContinueToNextLine: return F("Continue to next line"); case AdaGFXTextPrintMode::TruncateExceedingMessage: return F("Truncate exceeding message"); @@ -57,7 +84,7 @@ const __FlashStringHelper* toString(AdaGFXTextPrintMode mode) { /****************************************************************************************** * get the display text for a color depth enum value *****************************************************************************************/ -const __FlashStringHelper* toString(AdaGFXColorDepth colorDepth) { +const __FlashStringHelper* toString(const AdaGFXColorDepth& colorDepth) { switch (colorDepth) { case AdaGFXColorDepth::Monochrome: return F("Monochrome"); case AdaGFXColorDepth::BlackWhiteRed: return F("Monochrome + 1 color"); @@ -65,13 +92,58 @@ const __FlashStringHelper* toString(AdaGFXColorDepth colorDepth) { # if ADAGFX_SUPPORT_7COLOR case AdaGFXColorDepth::SevenColor: return F("eInk - 7 colors"); # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::EightColor: return F("TFT - 8 colors"); case AdaGFXColorDepth::SixteenColor: return F("TFT - 16 colors"); + # endif // if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::FullColor: return F("Full color - 65535 colors"); } return F("None"); } +# if ADAGFX_ENABLE_BUTTON_DRAW + +/****************************************************************************************** + * get the display text for a button type enum value + *****************************************************************************************/ +const __FlashStringHelper* toString(const Button_type_e button) { + switch (button) { + case Button_type_e::None: return F("None"); + case Button_type_e::Square: return F("Square"); + case Button_type_e::Rounded: return F("Rounded"); + case Button_type_e::Circle: return F("Circle"); + case Button_type_e::ArrowLeft: return F("Arrow, left"); + case Button_type_e::ArrowUp: return F("Arrow, up"); + case Button_type_e::ArrowRight: return F("Arrow, right"); + case Button_type_e::ArrowDown: return F("Arrow, down"); + case Button_type_e::Button_MAX: break; + } + return F("Unsupported!"); +} + +/****************************************************************************************** + * get the display text for a button layout enum value + *****************************************************************************************/ +const __FlashStringHelper* toString(const Button_layout_e layout) { + switch (layout) { + case Button_layout_e::CenterAligned: return F("Centered"); + case Button_layout_e::LeftAligned: return F("Left-aligned"); + case Button_layout_e::TopAligned: return F("Top-aligned"); + case Button_layout_e::RightAligned: return F("Right-aligned"); + case Button_layout_e::BottomAligned: return F("Bottom-aligned"); + case Button_layout_e::LeftTopAligned: return F("Left-Top-aligned"); + case Button_layout_e::RightTopAligned: return F("Right-Top-aligned"); + case Button_layout_e::RightBottomAligned: return F("Right-Bottom-aligned"); + case Button_layout_e::LeftBottomAligned: return F("Left-Bottom-aligned"); + case Button_layout_e::NoCaption: return F("No Caption"); + case Button_layout_e::Bitmap: return F("Bitmap image"); + case Button_layout_e::Alignment_MAX: break; + } + return F("Unsupported!"); +} + +# endif // if ADAGFX_ENABLE_BUTTON_DRAW + /***************************************************************************************** * Show a selector for all available 'Text print mode' options, for use in PLUGIN_WEBFORM_LOAD ****************************************************************************************/ @@ -98,9 +170,17 @@ void AdaGFXFormColorDepth(const __FlashStringHelper *id, uint16_t selectedIndex, bool enabled) { # if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR const int colorDepthCount = 7 + 1; + # else // if ADAGFX_SUPPORT_8and16COLOR + const int colorDepthCount = 5 + 1; + # endif // if ADAGFX_SUPPORT_8and16COLOR # else // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR const int colorDepthCount = 6 + 1; + # else // if ADAGFX_SUPPORT_8and16COLOR + const int colorDepthCount = 4 + 1; + # endif // if ADAGFX_SUPPORT_8and16COLOR # endif // if ADAGFX_SUPPORT_7COLOR const __FlashStringHelper *colorDepths[colorDepthCount] = { // Be sure to use all available modes from enum! toString(static_cast(0)), // include None @@ -110,8 +190,10 @@ void AdaGFXFormColorDepth(const __FlashStringHelper *id, # if ADAGFX_SUPPORT_7COLOR toString(AdaGFXColorDepth::SevenColor), # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR toString(AdaGFXColorDepth::EightColor), toString(AdaGFXColorDepth::SixteenColor), + # endif // if ADAGFX_SUPPORT_8and16COLOR toString(AdaGFXColorDepth::FullColor) }; const int colorDepthOptions[colorDepthCount] = { @@ -122,8 +204,10 @@ void AdaGFXFormColorDepth(const __FlashStringHelper *id, # if ADAGFX_SUPPORT_7COLOR static_cast(AdaGFXColorDepth::SevenColor), # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR static_cast(AdaGFXColorDepth::EightColor), static_cast(AdaGFXColorDepth::SixteenColor), + # endif // if ADAGFX_SUPPORT_8and16COLOR static_cast(AdaGFXColorDepth::FullColor) }; @@ -148,7 +232,9 @@ void AdaGFXFormRotation(const __FlashStringHelper *id, void AdaGFXFormTextBackgroundFill(const __FlashStringHelper *id, uint8_t selectedIndex) { addFormCheckBox(F("Background-fill for text"), id, selectedIndex); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Fill entire line-height with background color.")); + # endif // ifndef LIMIT_BUILD_SIZE } /***************************************************************************************** @@ -157,7 +243,9 @@ void AdaGFXFormTextBackgroundFill(const __FlashStringHelper *id, void AdaGFXFormTextColRowMode(const __FlashStringHelper *id, bool selectedState) { addFormCheckBox(F("Text Coordinates in col/row"), id, selectedState); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Unchecked: Coordinates in pixels. Applies only to 'txp', 'txz' and 'txtfull' subcommands.")); + # endif // ifndef LIMIT_BUILD_SIZE } /***************************************************************************************** @@ -166,7 +254,9 @@ void AdaGFXFormTextColRowMode(const __FlashStringHelper *id, void AdaGFXFormOnePixelCompatibilityOption(const __FlashStringHelper *id, uint8_t selectedIndex) { addFormCheckBox(F("Use -1px offset for txp & txtfull"), id, selectedIndex); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("This is for compatibility with the original plugin implementation.")); + # endif // ifndef LIMIT_BUILD_SIZE } /***************************************************************************************** @@ -177,14 +267,17 @@ void AdaGFXFormForeAndBackColors(const __FlashStringHelper *foregroundId, const __FlashStringHelper *backgroundId, uint16_t backgroundColor, AdaGFXColorDepth colorDepth) { - String color; + String color = AdaGFXcolorToString(foregroundColor, colorDepth); - color = AdaGFXcolorToString(foregroundColor, colorDepth); addFormTextBox(F("Foreground color"), foregroundId, color, 11); color = AdaGFXcolorToString(backgroundColor, colorDepth); addFormTextBox(F("Background color"), backgroundId, color, 11); + # ifndef LIMIT_BUILD_SIZE addFormNote(F("Use Color name, '#RGB565' (# + 1..4 hex nibbles) or '#RRGGBB' (# + 6 hex nibbles RGB color).")); addFormNote(F("NB: Colors stored as RGB565 value!")); + # else // ifndef LIMIT_BUILD_SIZE + addFormNote(F("Use Color name, # + 1..4 hex RGB565 or # + 6 hex nibbles RGB color.")); + # endif // ifndef LIMIT_BUILD_SIZE } /***************************************************************************************** @@ -234,12 +327,9 @@ void AdaGFXFormFontScaling(const __FlashStringHelper *fontScalingId, /**************************************************************************** * AdaGFXparseTemplate: Replace variables and adjust unicode special characters to Adafruit font ***************************************************************************/ -String AdaGFXparseTemplate(String & tmpString, - uint8_t lineSize, +String AdaGFXparseTemplate(const String & tmpString, + const uint8_t lineSize, AdafruitGFX_helper *gfxHelper) { - // Änderung WDS: Tabelle vorerst Abgeschaltet !!!! - // Perform some specific changes for LCD display - // https://www.letscontrolit.com/forum/viewtopic.php?t=2368 # if ADAGFX_PARSE_SUBCOMMAND String result = tmpString; @@ -341,6 +431,23 @@ String AdaGFXparseTemplate(String & tmpString, const char quart[3] = { 0xc2, 0xbc, 0 }; // Unicode quart 1/4 symbol const char quart_ascii[2] = { 0xac, 0 }; // quart 1/4 symbol result.replace(quart, quart_ascii); + + const char sup2[3] = { 0xc2, 0xb2, 0 }; // Unicode superscript 2 symbol + const char sup2_ascii[2] = { 0xfc, 0 }; // superscript 2 symbol + result.replace(sup2, sup2_ascii); + + // Unsupported characters, replace by something useful + const char sup1[3] = { 0xc2, 0xb9, 0 }; // Unicode superscript 1 symbol + const char sup1_ascii[2] = { 0x31, 0 }; // regular 1 (missing from font) + result.replace(sup1, sup1_ascii); + + const char sup3[3] = { 0xc2, 0xb3, 0 }; // Unicode superscript 3 symbol + const char sup3_ascii[2] = { 0x33, 0 }; // regular 3 (missing from font) + result.replace(sup3, sup3_ascii); + + const char frac34[3] = { 0xc2, 0xbe, 0 }; // Unicode fraction 3/4 symbol + const char frac34_ascii[2] = { 0x5c, 0 }; // regular \ (missing from font) + result.replace(frac34, frac34_ascii); delay(0); } @@ -378,11 +485,42 @@ String AdaGFXparseTemplate(String & tmpString, result.replace(divide_uni, divide_ascii); const char umlaut_sz_uni[3] = { 0xc3, 0x9f, 0 }; // Unicode Umlaute sz - const char umlaut_sz_ascii[2] = { 0xe0, 0 }; // Umlaute + const char umlaut_sz_ascii[2] = { 0xe0, 0 }; // Umlaute B result.replace(umlaut_sz_uni, umlaut_sz_ascii); + + // Unsupported characters, replace by something useful + const char times[3] = { 0xc3, 0x97, 0 }; // Unicode multiplication symbol + const char times_ascii[2] = { 0x78, 0 }; // regular x (missing from font) + result.replace(times, times_ascii); delay(0); } + // Handle '{0xNN...}' hex values in template, where NN can be any hex value from 01..FF (practically 20..FF). + int16_t hexPrefix = 0; + int16_t hexPostfix; + const String hexSeparators = F(" ,.:;-"); + + while (((hexPrefix = result.indexOf(F("{0x"), hexPrefix)) > -1) && + ((hexPostfix = result.indexOf('}', hexPrefix)) > -1)) { + String replace; + + for (int16_t ci = hexPrefix + 3; ci < hexPostfix - 1; ci += 2) { // Multiple of 2 only + uint32_t hexValue = hexToUL(result.substring(ci, ci + 2)); + + if (hexValue > 0) { + replace += static_cast(hexValue); + } + + while (hexSeparators.indexOf(result.substring(ci + 2, ci + 3)) > -1 && ci < hexPostfix) { + ci++; + } + } + + if (!replace.isEmpty()) { + result.replace(result.substring(hexPrefix, hexPostfix + 1), replace); + } + } + for (uint16_t l = result.length(); l > 0 && isSpace(result[l - 1]); l--) { // Right-trim result.remove(l - 1); } @@ -406,17 +544,17 @@ String AdaGFXparseTemplate(String & tmpString, /**************************************************************************** * parameterized constructors ***************************************************************************/ -AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_GFX *display, - const String & trigger, - uint16_t res_x, - uint16_t res_y, - AdaGFXColorDepth colorDepth, - AdaGFXTextPrintMode textPrintMode, - uint8_t fontscaling, - uint16_t fgcolor, - uint16_t bgcolor, - bool useValidation, - bool textBackFill) +AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_GFX *display, + const String & trigger, + const uint16_t res_x, + const uint16_t res_y, + const AdaGFXColorDepth & colorDepth, + const AdaGFXTextPrintMode& textPrintMode, + const uint8_t fontscaling, + const uint16_t fgcolor, + const uint16_t bgcolor, + const bool useValidation, + const bool textBackFill) : _display(display), _trigger(trigger), _res_x(res_x), _res_y(res_y), _colorDepth(colorDepth), _textPrintMode(textPrintMode), _fontscaling(fontscaling), _fgcolor(fgcolor), _bgcolor(bgcolor), _useValidation(useValidation), _textBackFill(textBackFill) @@ -425,28 +563,31 @@ AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_GFX *display, initialize(); } -# ifdef ADAGFX_ENABLE_BMP_DISPLAY -AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_SPITFT *display, - const String & trigger, - uint16_t res_x, - uint16_t res_y, - AdaGFXColorDepth colorDepth, - AdaGFXTextPrintMode textPrintMode, - uint8_t fontscaling, - uint16_t fgcolor, - uint16_t bgcolor, - bool useValidation, - bool textBackFill) +# if ADAGFX_ENABLE_BMP_DISPLAY +AdafruitGFX_helper::AdafruitGFX_helper(Adafruit_SPITFT *display, + const String & trigger, + const uint16_t res_x, + const uint16_t res_y, + const AdaGFXColorDepth & colorDepth, + const AdaGFXTextPrintMode& textPrintMode, + const uint8_t fontscaling, + const uint16_t fgcolor, + const uint16_t bgcolor, + const bool useValidation, + const bool textBackFill) : _tft(display), _trigger(trigger), _res_x(res_x), _res_y(res_y), _colorDepth(colorDepth), _textPrintMode(textPrintMode), _fontscaling(fontscaling), _fgcolor(fgcolor), _bgcolor(bgcolor), _useValidation(useValidation), _textBackFill(textBackFill) { _display = _tft; - addLog(LOG_LEVEL_INFO, F("AdaGFX_helper: TFT Init.")); + String log = F("AdaGFX_helper: TFT Init. "); + + log += getFeatures(); + addLog(LOG_LEVEL_INFO, log); initialize(); } -# endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY +# endif // if ADAGFX_ENABLE_BMP_DISPLAY /**************************************************************************** * common initialization, called from constructors @@ -466,6 +607,8 @@ void AdafruitGFX_helper::initialize() { log += static_cast(_colorDepth); log += F(", trigger: "); log += _trigger; + log += F(", "); + log += getFeatures(); addLogMove(ADAGFX_LOG_LEVEL, log); } # endif // ifndef BUILD_NO_DEBUG @@ -473,6 +616,10 @@ void AdafruitGFX_helper::initialize() { _display_x = _res_x; // Store initial resolution _display_y = _res_y; + # if ADAGFX_ENABLE_FRAMED_WINDOW + defineWindow(0, 0, _res_x, _res_y, 0, 0); // Add window 0 at rotation 0 + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + if (_fontscaling < 1) { _fontscaling = 1; } if (nullptr != _display) { @@ -482,6 +629,37 @@ void AdafruitGFX_helper::initialize() { } } +/**************************************************************************** + * Show enabled features of the helper + ***************************************************************************/ +String AdafruitGFX_helper::getFeatures() { + String log = F("Features:"); + + # if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) + log += F(" asciitable,"); + # endif // if (defined(ADAGFX_USE_ASCIITABLE) && ADAGFX_USE_ASCIITABLE) + # if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) + log += F(" lm/lmr,"); + # endif // if (defined(ADAGFX_ENABLE_EXTRA_CMDS) && ADAGFX_ENABLE_EXTRA_CMDS) + # if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) + log += F(" bmp,"); + # endif // if (defined(ADAGFX_ENABLE_BMP_DISPLAY) && ADAGFX_ENABLE_BMP_DISPLAY) + # if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW) + log += F(" btn,"); + # endif // if (defined(ADAGFX_ENABLE_BUTTON_DRAW) && ADAGFX_ENABLE_BUTTON_DRAW)` + # if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) + log += F(" win,"); + # endif // if (defined(ADAGFX_ENABLE_FRAMED_WINDOW) && ADAGFX_ENABLE_FRAMED_WINDOW) + # if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) + log += F(" getconf,"); + # endif // if (defined(ADAGFX_ENABLE_GET_CONFIG_VALUE) && ADAGFX_ENABLE_GET_CONFIG_VALUE) + + if (log.endsWith(F(","))) { + log.remove(log.length() - 1); + } + return log; +} + /**************************************************************************** * getCursorXY: get the current (text) cursor coordinates, either in pixels or cols/rows, depending on related setting ***************************************************************************/ @@ -505,19 +683,31 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if ((nullptr == _display) || _trigger.isEmpty()) { return success; } - String cmd = parseString(string, 1); // lower case - String subcommand = parseString(string, 2); + String cmd = parseString(string, 1); // lower case + String subcommand = parseString(string, 2); + uint16_t res_x = _res_x; + uint16_t res_y = _res_y; + uint16_t _xo = 0; + uint16_t _yo = 0; - if (!cmd.equals(_trigger) || subcommand.isEmpty()) { return success; } // Only support own trigger, and at least a non=empty subcommand + # if ADAGFX_ENABLE_FRAMED_WINDOW + getWindowLimits(res_x, res_y); + getWindowOffsets(_xo, _yo); + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + + if (!(cmd.equals(_trigger) || + isAdaGFXTrigger(cmd)) || + subcommand.isEmpty()) { return success; } // Only support own trigger, and at least a non=empty subcommand String log; - String sParams[ADAGFX_PARSE_MAX_ARGS + 1]; - int nParams[ADAGFX_PARSE_MAX_ARGS + 1]; - int argCount = 0; - bool loop = true; + std::vector sParams; + std::vector nParams; + int argCount = 0; + bool loop = true; - while (argCount <= ADAGFX_PARSE_MAX_ARGS && loop) { - sParams[argCount] = parseStringKeepCase(string, argCount + 3); // 0-offset + 1st and 2nd argument used by trigger/subcommand + while (loop) { // Process all provided arguments + sParams.push_back(parseStringKeepCase(string, argCount + 3)); // 0-offset + 1st and 2nd argument used by trigger/subcommand + nParams.push_back(0); validIntFromString(sParams[argCount], nParams[argCount]); loop = !sParams[argCount].isEmpty(); @@ -534,6 +724,15 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if (loop) { argCount++; } } + { // Guarantee minimal nParams/sParams size + int args = argCount; + + while (args <= ADAGFX_PARSE_MAX_ARGS) { + sParams.push_back(EMPTY_STRING); + nParams.push_back(0); + args++; + } + } success = true; // If we get this far, we'll flip the flag if something wrong is found # ifndef BUILD_NO_DEBUG @@ -565,9 +764,9 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # endif // if ADAGFX_ARGUMENT_VALIDATION { if (_columnRowMode) { - _display->setCursor(nParams[0] * _fontwidth, nParams[1] * _fontheight); + _display->setCursor(nParams[0] * _fontwidth + _xo, nParams[1] * _fontheight + _yo); } else { - _display->setCursor(nParams[0] - _p095_compensation, nParams[1] - _p095_compensation); + _display->setCursor(nParams[0] + _xo - _p095_compensation, nParams[1] + _yo - _p095_compensation); } } } @@ -581,9 +780,9 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # endif // if ADAGFX_ARGUMENT_VALIDATION { if (_columnRowMode) { - _display->setCursor(nParams[0] * _fontwidth, nParams[1] * _fontheight); + _display->setCursor(nParams[0] * _fontwidth + _xo, nParams[1] * _fontheight + _yo); } else { - _display->setCursor(nParams[0], nParams[1]); + _display->setCursor(nParams[0] + _xo, nParams[1] + _yo); } _display->println(parseStringToEndKeepCase(string, 5)); // Print entire rest of provided line } @@ -718,11 +917,22 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else if (subcommand.equals(F("clear"))) // Clear display { - if (argCount >= 1) { - _display->fillScreen(AdaGFXparseColor(sParams[0], _colorDepth)); - } else { - _display->fillScreen(_bgcolor); + # if ADAGFX_ENABLE_FRAMED_WINDOW + + if (_window == 0) + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + { + _display->fillScreen(argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); } + # if ADAGFX_ENABLE_FRAMED_WINDOW + else { + // logWindows(F("clear ")); // Use for debugging only + uint16_t _w = 0, _h = 0; + getWindowLimits(_w, _h); + _display->fillRect(_xo, _yo, _w, _h, + argCount == 0 ? _bgcolor : AdaGFXparseColor(sParams[0], _colorDepth)); + } + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW } else if (subcommand.equals(F("rot")) && (argCount == 1)) // Rotation { @@ -744,10 +954,10 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_USE_ASCIITABLE else if (subcommand.equals(F("asciitable"))) // Show ASCII table { - String line; - int16_t start = 0x80 + (argCount >= 1 && nParams[0] >= -4 && nParams[0] < 4 ? nParams[0] * 0x20 : 0); - uint8_t scale = (argCount == 2 && nParams[1] > 0 && nParams[1] <= 10 ? nParams[1] : 2); - uint8_t currentScale = _fontscaling; + String line; + const int16_t start = 0x80 + (argCount >= 1 && nParams[0] >= -4 && nParams[0] < 4 ? nParams[0] * 0x20 : 0); + const uint8_t scale = (argCount == 2 && nParams[1] > 0 && nParams[1] <= 10 ? nParams[1] : 2); + const uint8_t currentScale = _fontscaling; if (_fontscaling != scale) { // Set fontscaling _fontscaling = scale; @@ -756,8 +966,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } line.reserve(_textcols); _display->setCursor(0, 0); - int16_t row = 0; - bool colMode = _columnRowMode; + int16_t row = 0; + const bool colMode = _columnRowMode; _columnRowMode = true; for (int16_t i = start; i <= 0xFF && row < _textrows; i++) { @@ -831,6 +1041,21 @@ bool AdafruitGFX_helper::processCommand(const String& string) { _display->setFont(&whitrabt8pt7b); calculateTextMetrics(10, 16, 12); # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + } else if (sParams[0].equals(F("roboto8pt"))) { // Proportional font! + _display->setFont(&Roboto_Regular8pt7b); + calculateTextMetrics(10, 16, 12, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + } else if (sParams[0].equals(F("robotocond8pt"))) { // Proportional font! + _display->setFont(&RobotoCondensed_Regular8pt7b); + calculateTextMetrics(9, 16, 12, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + } else if (sParams[0].equals(F("robotomono8pt"))) { + _display->setFont(&RobotoMono_Regular8pt7b); + calculateTextMetrics(10, 16, 12); + # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_8PT_INCLUDED // Extra 12pt fonts: # ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED @@ -864,6 +1089,21 @@ bool AdafruitGFX_helper::processCommand(const String& string) { _display->setFont(&whitrabt12pt7b); calculateTextMetrics(13, 20, 16); # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + } else if (sParams[0].equals(F("roboto12pt"))) { // Proportional font! + _display->setFont(&Roboto_Regular12pt7b); + calculateTextMetrics(13, 20, 16, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + } else if (sParams[0].equals(F("robotocond12pt"))) { // Proportional font! + _display->setFont(&RobotoCondensed_Regular12pt7b); + calculateTextMetrics(13, 20, 16, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + } else if (sParams[0].equals(F("robotomono12pt"))) { + _display->setFont(&RobotoMono_Regular12pt7b); + calculateTextMetrics(13, 20, 16); + # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_12PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS @@ -876,6 +1116,21 @@ bool AdafruitGFX_helper::processCommand(const String& string) { _display->setFont(&whitrabt16pt7b); calculateTextMetrics(18, 26, 22); # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + } else if (sParams[0].equals(F("roboto16pt"))) { // Proportional font! + _display->setFont(&Roboto_Regular16pt7b); + calculateTextMetrics(18, 27, 23, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTO + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + } else if (sParams[0].equals(F("robotocond16pt"))) { // Proportional font! + _display->setFont(&RobotoCondensed_Regular16pt7b); + calculateTextMetrics(18, 27, 23, true); + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED + # ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + } else if (sParams[0].equals(F("robotomono16pt"))) { + _display->setFont(&RobotoMono_Regular16pt7b); + calculateTextMetrics(18, 27, 23); + # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO # endif // ifdef ADAGFX_FONTS_EXTRA_16PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_INCLUDED # ifdef ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT @@ -910,29 +1165,29 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawLine(nParams[0], nParams[1], nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); + _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, AdaGFXparseColor(sParams[4], _colorDepth)); } } else if (subcommand.equals(F("lh")) && (argCount == 3)) { // lh: Horizontal line # if ADAGFX_ARGUMENT_VALIDATION - if ((nParams[0] < 0) || (nParams[0] > _res_x)) { + if ((nParams[0] < 0) || (nParams[0] > res_x)) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawFastHLine(0, nParams[0], nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + _display->drawFastHLine(_xo, nParams[0] + _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); } } else if (subcommand.equals(F("lv")) && (argCount == 3)) { // lv: Vertical line # if ADAGFX_ARGUMENT_VALIDATION - if ((nParams[0] < 0) || (nParams[0] > _res_y)) { + if ((nParams[0] < 0) || (nParams[0] > res_y)) { success = false; } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawFastVLine(nParams[0], 0, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + _display->drawFastVLine(nParams[0] + _xo, _yo, nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); } } # if ADAGFX_ENABLE_EXTRA_CMDS @@ -998,7 +1253,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { log += AdaGFXcolorToString(mcolor, _colorDepth); addLog(LOG_LEVEL_INFO, log); # endif // ifndef BUILD_NO_DEBUG - _display->drawLine(nParams[0], nParams[1], nParams[2], nParams[3], mcolor); + _display->drawLine(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, mcolor); if ((cx == -1) && (cy == -1)) { cx = nParams[0]; @@ -1021,7 +1276,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawRect(nParams[0], nParams[1], nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); + _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); } } else if (subcommand.equals(F("rf")) && (argCount == 6)) { // rf: Rectangled, filled @@ -1033,8 +1288,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillRect(nParams[0], nParams[1], nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); - _display->drawRect(nParams[0], nParams[1], nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); + _display->fillRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[5], _colorDepth)); + _display->drawRect(nParams[0] + _xo, nParams[1] + _yo, nParams[2], nParams[3], AdaGFXparseColor(sParams[4], _colorDepth)); } } else if (subcommand.equals(F("c")) && (argCount == 4)) { // c: Circle @@ -1046,7 +1301,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawCircle(nParams[0], nParams[1], nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); + _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); } } else if (subcommand.equals(F("cf")) && (argCount == 5)) { // cf: Circle, filled @@ -1058,8 +1313,8 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillCircle(nParams[0], nParams[1], nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); - _display->drawCircle(nParams[0], nParams[1], nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); + _display->fillCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[4], _colorDepth)); + _display->drawCircle(nParams[0] + _xo, nParams[1] + _yo, nParams[2], AdaGFXparseColor(sParams[3], _colorDepth)); } } else if (subcommand.equals(F("t")) && (argCount == 7)) { // t: Triangle @@ -1072,7 +1327,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawTriangle(nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], nParams[5], + _display->drawTriangle(nParams[0] + _xo, nParams[1] + _yo, nParams[2] + _xo, nParams[3] + _yo, nParams[4] + _xo, nParams[5] + _yo, AdaGFXparseColor(sParams[6], _colorDepth)); } } @@ -1086,19 +1341,19 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillTriangle(nParams[0], - nParams[1], - nParams[2], - nParams[3], - nParams[4], - nParams[5], + _display->fillTriangle(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2] + _xo, + nParams[3] + _yo, + nParams[4] + _xo, + nParams[5] + _yo, AdaGFXparseColor(sParams[7], _colorDepth)); - _display->drawTriangle(nParams[0], - nParams[1], - nParams[2], - nParams[3], - nParams[4], - nParams[5], + _display->drawTriangle(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2] + _xo, + nParams[3] + _yo, + nParams[4] + _xo, + nParams[5] + _yo, AdaGFXparseColor(sParams[6], _colorDepth)); } } @@ -1112,7 +1367,12 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawRoundRect(nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], AdaGFXparseColor(sParams[5], _colorDepth)); + _display->drawRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[5], _colorDepth)); } } else if (subcommand.equals(F("rrf")) && (argCount == 7)) { // rrf: Rounded rectangle, filled @@ -1125,8 +1385,18 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->fillRoundRect(nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], AdaGFXparseColor(sParams[6], _colorDepth)); - _display->drawRoundRect(nParams[0], nParams[1], nParams[2], nParams[3], nParams[4], AdaGFXparseColor(sParams[5], _colorDepth)); + _display->fillRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[6], _colorDepth)); + _display->drawRoundRect(nParams[0] + _xo, + nParams[1] + _yo, + nParams[2], + nParams[3], + nParams[4], + AdaGFXparseColor(sParams[5], _colorDepth)); } } else if (subcommand.equals(F("px")) && (argCount == 3)) { // px: Pixel @@ -1137,7 +1407,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { } else # endif // if ADAGFX_ARGUMENT_VALIDATION { - _display->drawPixel(nParams[0], nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + _display->drawPixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); } } else if ((subcommand.equals(F("pxh")) || subcommand.equals(F("pxv"))) && (argCount > 2)) { // pxh/pxv: Pixels, hor./vert. incremented @@ -1149,7 +1419,7 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # endif // if ADAGFX_ARGUMENT_VALIDATION { _display->startWrite(); - _display->writePixel(nParams[0], nParams[1], AdaGFXparseColor(sParams[2], _colorDepth)); + _display->writePixel(nParams[0] + _xo, nParams[1] + _yo, AdaGFXparseColor(sParams[2], _colorDepth)); loop = true; uint8_t h = 0; uint8_t v = 0; @@ -1166,12 +1436,12 @@ bool AdafruitGFX_helper::processCommand(const String& string) { if (color.isEmpty() # if ADAGFX_ARGUMENT_VALIDATION - || invalidCoordinates(nParams[0] + h, nParams[1] + v) + || invalidCoordinates(nParams[0] + h + _xo, nParams[1] + v + _yo) # endif // if ADAGFX_ARGUMENT_VALIDATION ) { loop = false; } else { - _display->writePixel(nParams[0] + h, nParams[1] + v, AdaGFXparseColor(color, _colorDepth)); + _display->writePixel(nParams[0] + h + _xo, nParams[1] + v + _yo, AdaGFXparseColor(color, _colorDepth)); if (isPxh) { h++; @@ -1187,12 +1457,264 @@ bool AdafruitGFX_helper::processCommand(const String& string) { # if ADAGFX_ENABLE_BMP_DISPLAY else if (subcommand.equals(F("bmp")) && (argCount == 3)) { // bmp,x,y,filename.bmp : show bmp from file if (!sParams[2].isEmpty()) { - success = showBmp(sParams[2], nParams[0], nParams[1]); + success = showBmp(sParams[2], nParams[0] + _xo, nParams[1] + _yo); } else { success = false; } } # endif // if ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BUTTON_DRAW + else if (subcommand.equals(F("btn")) && (argCount >= 8) && (nParams[7] != 0)) + { // btn,state,m,x,y,w,h,id,type[,ONclr,OFFclr,Captionclr,fontscale,ONcaption,OFFcapt,Borderclr,DisabClr,DisabCaptclr],TaskIndex,Group,SelGrp,objectname + // ev: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17,18,19,20,21 + // nP: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,17,18,19,20 + // : Draw a button + // m=mode: -2 = disabled, -1 = initial, 0 = default + // state: 0 = off, 1 = on, -2 = off + disabled, -1 = on + disabled + // id: < 0 = clear area + // type & 0x0F: 0 = none, 1 = rectangle, 2 = rounded rect., 3 = circle, + // type & 0xF0 = CenterAligned, LeftAligned, TopAligned, RightAligned, BottomAligned, LeftTopAligned, RightTopAligned, + // RightBottomAligned, LeftBottomAligned, NoCaption + // (*clr = color, TaskIndex, Group and SelGrp are ignored) + # if ADAGFX_ARGUMENT_VALIDATION + + if (invalidCoordinates(nParams[2], nParams[3]) || + invalidCoordinates(nParams[2] + nParams[4], nParams[3] + nParams[5])) { + success = false; + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + // All checked out OK + // Default values + uint16_t onColor = ADAGFX_BLUE; + uint16_t offColor = ADAGFX_RED; + uint16_t captionColor = ADAGFX_WHITE; + uint8_t fontScale = 0; + uint16_t borderColor = ADAGFX_WHITE; + uint16_t disabledColor = 0x9410; // Medium grey + uint16_t disabledCaptionColor = 0x5A69; // Dark grey + + if (!sParams[8].isEmpty()) { onColor = AdaGFXparseColor(sParams[8], _colorDepth); } + + if (!sParams[9].isEmpty()) { offColor = AdaGFXparseColor(sParams[9], _colorDepth); } + + if (!sParams[10].isEmpty()) { captionColor = AdaGFXparseColor(sParams[10], _colorDepth); } + + if ((nParams[11] > 0) && (nParams[11] <= 10)) { fontScale = nParams[11]; } + + if (!sParams[14].isEmpty()) { borderColor = AdaGFXparseColor(sParams[14], _colorDepth); } + + if (!sParams[15].isEmpty()) { disabledColor = AdaGFXparseColor(sParams[15], _colorDepth); } + + if (!sParams[16].isEmpty()) { disabledCaptionColor = AdaGFXparseColor(sParams[16], _colorDepth); } + + uint16_t fillColor = onColor; + uint16_t textColor = captionColor; + bool clearArea = nParams[7] < 0; + nParams[7] = std::abs(nParams[7]); + + Button_type_e buttonType = static_cast(nParams[7] & 0x0F); + Button_layout_e buttonLayout = static_cast(nParams[7] & 0xF0); + + // Check mode & state: -2, -1, 0, 1 to select used colors + if (nParams[0] == 0) { + fillColor = offColor; + } + + if ((nParams[1] == -2) || (nParams[0] < 0)) { + fillColor = disabledColor; + textColor = disabledCaptionColor; + } else if (clearArea) { + fillColor = _bgcolor; // + borderColor = _bgcolor; + } + + // Clear the area? + if ((buttonType != Button_type_e::None) || + clearArea) { + drawButtonShape(buttonType, + nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], + _bgcolor, _bgcolor); + } + + // Check button-type bits (mask: 0x0F) to draw correct shape + if (!clearArea) { + drawButtonShape(buttonType, + nParams[2] + _xo, nParams[3] + _yo, nParams[4], nParams[5], + fillColor, borderColor); + } + + // Display caption? (or bitmap) + if (!clearArea && + (buttonLayout != Button_layout_e::NoCaption)) { + int16_t x1, y1; + uint16_t w1, h1, w2, h2; + String newString; + + // Determine alignment parameters + if ((nParams[0] == 1) || (nParams[0] == -1)) { // 1 = on+enabled, -1 = on+disabled + newString = sParams[12].isEmpty() ? sParams[6] : sParams[12]; + } else { + newString = sParams[13].isEmpty() ? sParams[6] : sParams[13]; + } + newString = AdaGFXparseTemplate(newString, 20); + + _display->setTextSize(fontScale); // set scaling + _display->getTextBounds(newString, 0, 0, &x1, &y1, &w1, &h1); // get caption length and height in pixels + _display->getTextBounds(F(" "), 0, 0, &x1, &y1, &w2, &h2); // measure space width for little margins + + // Check button-alignment bits (mask 0xF0) for caption placement, modifies the x/y arguments passed! + // Little margin is: from left/right: half of the width of a space, from top/bottom: half of height of the font used + + switch (buttonLayout) { + case Button_layout_e::CenterAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::LeftAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::TopAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += (nParams[5] / 2 - h1 / 2); // center vertically + break; + case Button_layout_e::BottomAligned: + nParams[2] += (nParams[4] / 2 - w1 / 2); // center horizontically + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::LeftTopAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightTopAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += h1 / 2; // A little margin from top + break; + case Button_layout_e::RightBottomAligned: + nParams[2] += (nParams[4] - w1) - w2 / 2; // right-align + a little margin + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::LeftBottomAligned: + nParams[2] += w2 / 2; // A little margin from left + nParams[3] += (nParams[5] - h1 * 1.5); // bottom align + a little margin + break; + case Button_layout_e::Bitmap: + { // Use ON/OFF caption to specify (full) bitmap filename + # if ADAGFX_ENABLE_BMP_DISPLAY + + if (!newString.isEmpty()) { + int offX = 0; // Allow optional arguments for x and y offset values, usage: + int offY = 0; // [x,[y,]]filename.bmp + + if (newString.indexOf(',') > -1) { + String tmp = parseString(newString, 1); + validIntFromString(tmp, offX); + newString = parseStringToEndKeepCase(newString, 2); + + if (newString.indexOf(',') > -1) { + tmp = parseString(newString, 1); + validIntFromString(tmp, offY); + newString = parseStringToEndKeepCase(newString, 2); + } + } + success = showBmp(newString, nParams[2] + _xo + offX, nParams[3] + _yo + offY); + } else + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + { + success = false; + } + break; + } + case Button_layout_e::NoCaption: + case Button_layout_e::Alignment_MAX: + break; + } + + if ((buttonLayout != Button_layout_e::NoCaption) && + (buttonLayout != Button_layout_e::Bitmap)) { + // Set position and colors, then print + _display->setCursor(nParams[2] + _xo, nParams[3] + _yo); + _display->setTextColor(textColor, textColor); // transparent bg results in button color + _display->print(newString); + + // restore colors + _display->setTextColor(_fgcolor, _bgcolor); + } + + // restore font scaling + _display->setTextSize(_fontscaling); + } + } + } + # endif // if ADAGFX_ENABLE_BUTTON_DRAW + # if ADAGFX_ENABLE_FRAMED_WINDOW + else if (subcommand.equals(F("win")) && (argCount >= 1) && (argCount <= 2)) { // win: select window by id + success = selectWindow(nParams[0], nParams[1]); + } + else if (subcommand.equals(F("defwin")) && (argCount >= 5) && (argCount <= 6)) { // defwin: define window + const int8_t rot = _rotation; + # if ADAGFX_ARGUMENT_VALIDATION + const int16_t curWin = getWindow(); + + if (curWin != 0) { selectWindow(0); } // Validate against raw window coordinates + + if (argCount == 6) { setRotation(nParams[5]); } // Use requested rotation + + if (invalidCoordinates(nParams[0], nParams[1]) || + invalidCoordinates(nParams[0] + nParams[2], nParams[1] + nParams[3])) { + success = false; + + if (curWin != 0) { selectWindow(curWin); } // restore current window + + if (rot != _rotation) { setRotation(rot); } // Restore rotation + } else + # endif // if ADAGFX_ARGUMENT_VALIDATION + { + # if ADAGFX_ARGUMENT_VALIDATION + + if (curWin != 0) { selectWindow(curWin); } // restore current window + # endif // if ADAGFX_ARGUMENT_VALIDATION + + if (nParams[4] > 0) { // Window 0 is the raw window, having the full size, created at initialization of this helper instance + # ifndef BUILD_NO_DEBUG + int16_t win = // avoid compiler warning + # endif // ifndef BUILD_NO_DEBUG + defineWindow(nParams[0], + nParams[1], + nParams[2], + nParams[3], + nParams[4], + argCount == 6 ? nParams[5] : _rotation); + # ifndef BUILD_NO_DEBUG + + if (loglevelActiveFor(LOG_LEVEL_INFO)) { + String log = F("AdaGFX defined window id: "); + log += win; + addLogMove(LOG_LEVEL_INFO, log); + } + # endif // ifndef BUILD_NO_DEBUG + + if (rot != _rotation) { setRotation(rot); } // Restore rotation, also update new window + } else { + success = false; + } + + // logWindows(F(" deFwin ")); // Use for debugging only? + } + } + else if (subcommand.equals(F("delwin")) && (argCount == 1)) { // delwin: delete window + // logWindows(F(" deLwin ")); // use for debugging only + + if (nParams[0] > 0) { // don't delete window 0 + success = deleteWindow(nParams[0]); + } + } + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW else { success = false; } @@ -1200,25 +1722,175 @@ bool AdafruitGFX_helper::processCommand(const String& string) { return success; } +/**************************************************************************** + * Get a config value from the plugin + ***************************************************************************/ +# if ADAGFX_ENABLE_GET_CONFIG_VALUE +bool AdafruitGFX_helper::pluginGetConfigValue(String& string) { + bool success = false; + String command = parseString(string, 1); + + if (command == F("win")) { // win: get current window id + # if ADAGFX_ENABLE_FRAMED_WINDOW // if feature enabled + string = getWindow(); + success = true; + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + } else if (command == F("iswin")) { // iswin: check if windows exists + # if ADAGFX_ENABLE_FRAMED_WINDOW // if feature enabled + command = parseString(string, 2); + int win = 0; + + if (validIntFromString(command, win)) { + string = validWindow(static_cast(win)); + } else { + string = '0'; + } + success = true; // Always correct, just return 'false' if wrong + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + } else if ((command == F("width")) || // width/height: get window width or height + (command == F("height"))) { + # if ADAGFX_ENABLE_FRAMED_WINDOW // if feature enabled + uint16_t w = 0, h = 0; + getWindowLimits(w, h); + + if (command == F("width")) { + string = w; + } else { + string = h; + } + success = true; + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + } else if ((command == F("length")) || // length/textheight: get text length or height + (command == F("textheight"))) { + int16_t x1, y1; + uint16_t w1, h1; + String newString = AdaGFXparseTemplate(parseStringToEndKeepCase(string, 2), 0); + _display->getTextBounds(newString, 0, 0, &x1, &y1, &w1, &h1); // Count length and height + + if (command == F("length")) { + string = w1; + } else { + string = h1; + } + success = true; + } else if (command == F("rot")) { // rot: get current rotation setting + string = _rotation; + success = true; + } else if (command == F("txs")) { // txs: get current text scaling setting + string = _fontscaling; + success = true; + } else if (command == F("tpm")) { // tpm: get current text print mode setting + string = static_cast(_textPrintMode); + success = true; + } + + return success; +} + +# endif // if ADAGFX_ENABLE_GET_CONFIG_VALUE + +/**************************************************************************** + * draw a button shape with provided color, can also clear a previously drawn button + ***************************************************************************/ +void AdafruitGFX_helper::drawButtonShape(const Button_type_e& buttonType, + const int & x, + const int & y, + const int & w, + const int & h, + const uint16_t & fillColor, + const uint16_t & borderColor) { + switch (buttonType) { + case Button_type_e::Square: // Rectangle + { + _display->fillRect(x, y, w, h, fillColor); + _display->drawRect(x, y, w, h, borderColor); + break; + } + case Button_type_e::Rounded: // Rounded Rectangle + { + int16_t radius = (w + h) / 20; // average 10 % corner radius w/h + _display->fillRoundRect(x, y, w, h, radius, fillColor); + _display->drawRoundRect(x, y, w, h, radius, borderColor); + break; + } + case Button_type_e::Circle: // Circle + { + int16_t radius = (w + h) / 4; // average radius + _display->fillCircle(x + (w / 2), y + (h / 2), radius, fillColor); + _display->drawCircle(x + (w / 2), y + (h / 2), radius, borderColor); + break; + } + case Button_type_e::ArrowLeft: + { // draw: left-center, right-top, right-bottom + _display->fillTriangle(x, y + h / 2, x + w, y, + x + w, y + h, fillColor); + _display->drawTriangle(x, y + h / 2, x + w, y, + x + w, y + h, borderColor); + break; + } + case Button_type_e::ArrowUp: + { // draw: top-center, right-bottom, left-bottom + _display->fillTriangle(x + w / 2, y, x + w, y + h, + x, y + h, fillColor); + _display->drawTriangle(x + w / 2, y, x + w, y + h, + x, y + h, borderColor); + break; + } + case Button_type_e::ArrowRight: + { // draw: left-top, right-center, left-bottom + _display->fillTriangle(x, y, x + w, y + h / 2, + x, y + h, fillColor); + _display->drawTriangle(x, y, x + w, y + h / 2, + x, y + h, borderColor); + break; + } + case Button_type_e::ArrowDown: + { // draw: left-top, right-top, bottom-center + _display->fillTriangle(x, y, x + w, y, + x + w / 2, y + h, fillColor); + _display->drawTriangle(x, y, x + w, y, + x + w / 2, y + h, borderColor); + break; + } + case Button_type_e::None: + case Button_type_e::Button_MAX: + break; + } +} + /**************************************************************************** * printText: Print text on display at a specific pixel or column/row location ***************************************************************************/ -void AdafruitGFX_helper::printText(const char *string, - int16_t X, - int16_t Y, - uint8_t textSize, - uint16_t color, - uint16_t bkcolor, - uint16_t maxWidth) { - int16_t _x = X; - int16_t _y = Y + (_heightOffset * textSize); - uint16_t _w = 0; - int16_t x1 = 0, y1 = 0; - uint16_t w1 = 0, h1 = 0; - int16_t ot = 0, ob = 0, ol = 0; +void AdafruitGFX_helper::printText(const char *string, + const int16_t & X, + const int16_t & Y, + const uint8_t & textSize, + const uint16_t& color, + uint16_t bkcolor, + const uint16_t& maxWidth) { + int16_t _x = X; + int16_t _y = Y + (_heightOffset * textSize); + uint16_t _w = 0; + int16_t xText = 0; + int16_t yText = 0; + uint16_t wText = 0; + uint16_t hText = 0; + int16_t oTop = 0; + int16_t oBottom = 0; + int16_t oLeft = 0; uint16_t res_x = _res_x; + uint16_t res_y = _res_y; + uint16_t xOffset = 0; + uint16_t yOffset = 0; String newString = string; + # if ADAGFX_ENABLE_FRAMED_WINDOW + getWindowLimits(res_x, res_y); + getWindowOffsets(xOffset, yOffset); + _x += xOffset; + _y += yOffset; + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + if (_columnRowMode) { _x = X * (_fontwidth * textSize); // We need this multiple times _y = (Y * (_fontheight * textSize)) + (_heightOffset * textSize); @@ -1229,39 +1901,32 @@ void AdafruitGFX_helper::printText(const char *string, _display->setTextSize(textSize); if (_textPrintMode != AdaGFXTextPrintMode::ContinueToNextLine) { - if (_isProportional) { // Proportional font. This is rather slow! - _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Count length + _display->getTextBounds(newString, _x, _y, &xText, &yText, &wText, &hText); // Count length - while ((newString.length() > 0) && ((_x + w1) > res_x)) { - newString.remove(newString.length() - 1); // Cut last character off - _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Re-count length - } - } - else { // Fixed width font - if (newString.length() > static_cast(_textcols - (_x / (_fontwidth * textSize)))) { - newString = newString.substring(0, _textcols - (_x / (_fontwidth * textSize))); - } + while ((newString.length() > 0) && (((_x - xOffset) + wText) > res_x)) { + newString.remove(newString.length() - 1); // Cut last character off + _display->getTextBounds(newString, _x, _y, &xText, &yText, &wText, &hText); // Re-count length } } - _display->getTextBounds(newString, _x, _y, &x1, &y1, &w1, &h1); // Count length + _display->getTextBounds(newString, _x, _y, &xText, &yText, &wText, &hText); // Count length - if ((maxWidth > 0) && (_x + maxWidth <= _res_x)) { - res_x = _x + maxWidth; + if ((maxWidth > 0) && ((_x - xOffset) + maxWidth <= res_x)) { + res_x = (_x - xOffset) + maxWidth; _w = maxWidth; if ((_textPrintMode == AdaGFXTextPrintMode::TruncateExceedingCentered) && - (maxWidth > w1)) { - ol = (_w - (w1 + 2 * (x1 - _x))) / 2; + (maxWidth > wText)) { + oLeft = (_w - (wText + 2 * (xText - _x))) / 2; } } else { - _w = w1 + 2 * (x1 - _x); + _w = wText + 2 * (xText - _x); } if (_textBackFill && (color != bkcolor)) { // Fill extra space above and below text - ot -= textSize; - ob += textSize; - _y += textSize; + oTop -= textSize; + oBottom += textSize; + _y += textSize; } if ((_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) || @@ -1271,16 +1936,20 @@ void AdafruitGFX_helper::printText(const char *string, if (loglevelActiveFor(LOG_LEVEL_DEBUG)) { String log = F("printText: clear: _x:"); log += _x; + log += F(", oTop:"); + log += oTop; log += F(", _y:"); log += _y; - log += F(", x1:"); - log += x1; - log += F(", y1:"); - log += y1; - log += F(", w1:"); - log += w1; - log += F(", h1:"); - log += h1; + log += F(", xTx:"); + log += xText; + log += F(", yTx:"); + log += yText; + log += F(", wTx:"); + log += wText; + log += F(", hTx:"); + log += hText; + log += F(", oBot:"); + log += oBottom; log += F(", _res_x/max:"); log += _res_x; log += '/'; @@ -1291,16 +1960,19 @@ void AdafruitGFX_helper::printText(const char *string, } # endif // ifndef BUILD_NO_DEBUG - if (_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) { - _display->fillRect(_x + ot, y1, res_x - _x, h1 + ob, bkcolor); // Clear text area to right edge of screen + if (bkcolor == color) { bkcolor = _bgcolor; } // To get at least the text readable + + if (_textPrintMode == AdaGFXTextPrintMode::ClearThenTruncate) { // oTop is negative so subtract to add... + _display->fillRect(_x + oTop, yText, res_x - (_x - xOffset), hText + oBottom - oTop, bkcolor); // Clear text area to right edge of + // screen } else { - _display->fillRect(_x + ot, y1, _w, h1 + ob, bkcolor); // Clear text area + _display->fillRect(_x + oTop, yText, _w, hText + oBottom - oTop, bkcolor); // Clear text area } delay(0); } - _display->setCursor(_x + ol, _y); // add left offset to center, _y may be updated + _display->setCursor(_x + oLeft, _y); // add left offset to center, _y may be updated _display->print(newString); } @@ -1320,7 +1992,9 @@ uint16_t AdafruitGFX_helper::getTextSize(const String& text, /**************************************************************************** * color565: convert r, g, b colors to rgb565 (by bit-shifting) ***************************************************************************/ -uint16_t color565(uint8_t red, uint8_t green, uint8_t blue) { +uint16_t color565(const uint8_t& red, + const uint8_t& green, + const uint8_t& blue) { return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); } @@ -1334,7 +2008,9 @@ uint16_t color565(uint8_t red, uint8_t green, uint8_t blue) { // Param [in] colorDepth: The requiresed color depth, default: FullColor // param [in] defaultWhite: Return White color if empty, default: true // return : color (default ADAGFX_WHITE) -uint16_t AdaGFXparseColor(String& s, AdaGFXColorDepth colorDepth, bool emptyIsBlack) { +uint16_t AdaGFXparseColor(String & s, + const AdaGFXColorDepth& colorDepth, + const bool emptyIsBlack) { s.toLowerCase(); int32_t result = -1; // No result yet @@ -1422,7 +2098,7 @@ uint16_t AdaGFXparseColor(String& s, AdaGFXColorDepth colorDepth, bool emptyIsBl // Parse default hex #RRGGBB string (must be 6 hex nibbles!) if ((result == -1) && (s.length() == 7) && (s[0] == '#')) { // convrt to long value in base16, then split up into r, g, b values - uint32_t number = hexToUL(&s[1]); + const uint32_t number = hexToUL(&s[1]); // uint32_t r = number >> 16 & 0xFF; // uint32_t g = number >> 8 & 0xFF; @@ -1432,13 +2108,17 @@ uint16_t AdaGFXparseColor(String& s, AdaGFXColorDepth colorDepth, bool emptyIsBl } if ((result == -1) || (result == ADAGFX_WHITE)) { // Default & don't convert white + # if ADAGFX_SUPPORT_8and16COLOR + if ( # if ADAGFX_SUPPORT_7COLOR (colorDepth >= AdaGFXColorDepth::SevenColor) && # endif // if ADAGFX_SUPPORT_7COLOR (colorDepth <= AdaGFXColorDepth::SixteenColor)) { result = static_cast(AdaGFXMonoRedGreyscaleColors::ADAGFXEPD_BLACK); // Monochrome fallback, compatible 7-color - } else { + } else + # endif // if ADAGFX_SUPPORT_8and16COLOR + { if (emptyIsBlack) { result = ADAGFX_BLACK; } else { @@ -1458,23 +2138,25 @@ uint16_t AdaGFXparseColor(String& s, AdaGFXColorDepth colorDepth, bool emptyIsBl result = AdaGFXrgb565ToColor7(result); // Convert break; # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::EightColor: result = color565((result >> 11 & 0x1F) / 4, (result >> 5 & 0x3F) / 4, (result & 0x1F) / 4); // reduce colors factor 4 break; case AdaGFXColorDepth::SixteenColor: result = color565((result >> 11 & 0x1F) / 2, (result >> 5 & 0x3F) / 2, (result & 0x1F) / 2); // reduce colors factor 2 break; + # endif // if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::FullColor: // No color reduction break; } } - return result; + return static_cast(result); } -const __FlashStringHelper* AdaGFXcolorToString_internal(uint16_t color, - AdaGFXColorDepth colorDepth, - bool blackIsEmpty); +const __FlashStringHelper* AdaGFXcolorToString_internal(const uint16_t & color, + const AdaGFXColorDepth& colorDepth, + bool blackIsEmpty); // Add a single optionvalue of a color to a datalist (internal/private) void AdaGFXaddHtmlDataListColorOptionValue(uint16_t color, @@ -1494,7 +2176,7 @@ void AdaGFXaddHtmlDataListColorOptionValue(uint16_t color, * Generate a html 'datalist' of the colors available for selected colorDepth, with id provided ****************************************************************************************/ void AdaGFXHtmlColorDepthDataList(const __FlashStringHelper *id, - AdaGFXColorDepth colorDepth) { + const AdaGFXColorDepth & colorDepth) { addHtml(F("")); @@ -1523,8 +2205,10 @@ void AdaGFXHtmlColorDepthDataList(const __FlashStringHelper *id, break; } # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::EightColor: // TODO: Sort out the actual 8/16 color options case AdaGFXColorDepth::SixteenColor: + # endif // if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::FullColor: { AdaGFXaddHtmlDataListColorOptionValue(ADAGFX_BLACK, colorDepth); @@ -1555,9 +2239,9 @@ void AdaGFXHtmlColorDepthDataList(const __FlashStringHelper *id, /***************************************************************************************** * Convert an RGB565 color (number) to it's name or the #rgb565 hex string, based on depth ****************************************************************************************/ -String AdaGFXcolorToString(uint16_t color, - AdaGFXColorDepth colorDepth, - bool blackIsEmpty) { +String AdaGFXcolorToString(const uint16_t & color, + const AdaGFXColorDepth& colorDepth, + bool blackIsEmpty) { String result = AdaGFXcolorToString_internal(color, colorDepth, blackIsEmpty); if (result.equals(F("*"))) { @@ -1568,9 +2252,9 @@ String AdaGFXcolorToString(uint16_t color, return result; } -const __FlashStringHelper* AdaGFXcolorToString_internal(uint16_t color, - AdaGFXColorDepth colorDepth, - bool blackIsEmpty) { +const __FlashStringHelper* AdaGFXcolorToString_internal(const uint16_t & color, + const AdaGFXColorDepth& colorDepth, + bool blackIsEmpty) { switch (colorDepth) { case AdaGFXColorDepth::Monochrome: case AdaGFXColorDepth::BlackWhiteRed: @@ -1607,8 +2291,10 @@ const __FlashStringHelper* AdaGFXcolorToString_internal(uint16_t color, break; } # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::EightColor: case AdaGFXColorDepth::SixteenColor: + # endif // if ADAGFX_SUPPORT_8and16COLOR case AdaGFXColorDepth::FullColor: { switch (color) { @@ -1646,18 +2332,17 @@ const __FlashStringHelper* AdaGFXcolorToString_internal(uint16_t color, * AdaGFXrgb565ToColor7: Convert a rgb565 color to the 7 colors supported by 7-color eInk displays * Borrowed from https://github.com/ZinggJM/GxEPD2 color7() routine ***************************************************************************/ -uint16_t AdaGFXrgb565ToColor7(uint16_t color) { - uint16_t cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_WHITE); // Default = white - - uint16_t red = (color & 0xF800); - uint16_t green = (color & 0x07E0) << 5; - uint16_t blue = (color & 0x001F) << 11; +uint16_t AdaGFXrgb565ToColor7(const uint16_t& color) { + const uint16_t red = (color & 0xF800); + const uint16_t green = (color & 0x07E0) << 5; + const uint16_t blue = (color & 0x001F) << 11; + uint16_t cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_WHITE); // Default = white if ((red < 0x8000) && (green < 0x8000) && (blue < 0x8000)) { - cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_BLACK); // black + cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_BLACK); // black } else if ((red >= 0x8000) && (green >= 0x8000) && (blue >= 0x8000)) { - cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_WHITE); // white + cv7 = static_cast(AdaGFX7Colors::ADAGFX7C_WHITE); // white } else if ((red >= 0x8000) && (blue >= 0x8000)) { if (red > blue) { @@ -1713,8 +2398,12 @@ void AdafruitGFX_helper::getTextMetrics(uint16_t& textcols, fontheight = _fontheight; fontscaling = _fontscaling; heightOffset = _heightOffset; - xpix = _res_x; - ypix = _res_y; + # if ADAGFX_ENABLE_FRAMED_WINDOW + getWindowLimits(xpix, ypix); + # else // if ADAGFX_ENABLE_FRAMED_WINDOW + xpix = _res_x; + ypix = _res_y; + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW } /**************************************************************************** @@ -1729,16 +2418,23 @@ void AdafruitGFX_helper::getColors(uint16_t& fgcolor, /**************************************************************************** * calculateTextMetrics: Recalculate the text mertics based on supplied font parameters ***************************************************************************/ -void AdafruitGFX_helper::calculateTextMetrics(uint8_t fontwidth, - uint8_t fontheight, - int8_t heightOffset, - bool isProportional) { +void AdafruitGFX_helper::calculateTextMetrics(const uint8_t fontwidth, + const uint8_t fontheight, + const int8_t heightOffset, + const bool isProportional) { + uint16_t res_x = _res_x; + uint16_t res_y = _res_y; + + # if ADAGFX_ENABLE_FRAMED_WINDOW + getWindowLimits(res_x, res_y); + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + _fontwidth = fontwidth; _fontheight = fontheight; _heightOffset = heightOffset; _isProportional = isProportional; - _textcols = _res_x / (_fontwidth * _fontscaling); - _textrows = _res_y / ((_fontheight + _heightOffset) * _fontscaling); + _textcols = res_x / (_fontwidth * _fontscaling); + _textrows = res_y / ((_fontheight + _heightOffset) * _fontscaling); # ifndef BUILD_NO_DEBUG @@ -1752,9 +2448,9 @@ void AdafruitGFX_helper::calculateTextMetrics(uint8_t fontwidth, log += _trigger; } log += F(" x: "); - log += _res_x; + log += res_x; log += F(", y: "); - log += _res_y; + log += res_y; log += F(", text columns: "); log += _textcols; log += F(" rows: "); @@ -1772,9 +2468,16 @@ void AdafruitGFX_helper::calculateTextMetrics(uint8_t fontwidth, * If Y == 0 then X is allowed the max. value of the display size. * *** Returns TRUE when invalid !! *** ***************************************************************************/ -bool AdafruitGFX_helper::invalidCoordinates(int X, - int Y, - bool colRowMode) { +bool AdafruitGFX_helper::invalidCoordinates(const int X, + const int Y, + const bool colRowMode) { + uint16_t res_x = _res_x; + uint16_t res_y = _res_y; + + # if ADAGFX_ENABLE_FRAMED_WINDOW + getWindowLimits(res_x, res_y); + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW + # ifndef BUILD_NO_DEBUG if (loglevelActiveFor(ADAGFX_LOG_LEVEL)) { @@ -1784,11 +2487,11 @@ bool AdafruitGFX_helper::invalidCoordinates(int X, log += F("invalidCoordinates: X:"); log += X; log += '/'; - log += (colRowMode ? _textcols : _res_x); + log += (colRowMode ? _textcols : res_x); log += F(" Y:"); log += Y; log += '/'; - log += (colRowMode ? _textrows : _res_y); + log += (colRowMode ? _textrows : res_y); addLogMove(ADAGFX_LOG_LEVEL, log); } # endif // ifndef BUILD_NO_DEBUG @@ -1800,10 +2503,10 @@ bool AdafruitGFX_helper::invalidCoordinates(int X, (Y >= 0) && (Y <= _textrows)); } else { if (Y == 0) { // Y == 0: Accept largest x/y size value for x - return !((X >= 0) && (X <= std::max(_res_x, _res_y))); + return !((X >= 0) && (X <= std::max(res_x, res_y))); } else { - return !((X >= 0) && (X <= _res_x) && - (Y >= 0) && (Y <= _res_y)); + return !((X >= 0) && (X <= res_x) && + (Y >= 0) && (Y <= res_y)); } } } @@ -1814,10 +2517,14 @@ void AdafruitGFX_helper::setValidation(const bool& state) { _useValidation = state; } +/**************************************************************************** + * rotate the display (and all windows) + ***************************************************************************/ void AdafruitGFX_helper::setRotation(uint8_t m) { - uint8_t rotation = m & 3; + const uint8_t rotation = m & 3; _display->setRotation(m); // Set rotation 0/1/2/3 + _rotation = rotation; switch (rotation) { case 0: @@ -1831,51 +2538,92 @@ void AdafruitGFX_helper::setRotation(uint8_t m) { _res_y = _display_x; break; } + # if ADAGFX_ENABLE_FRAMED_WINDOW + + for (uint8_t i = 0; i < _windows.size(); i++) { // Swap x/y for all matching windows + switch (rotation) { + case 0: // 0 degrees + _windows[i].top_left.x = _windows[i].org_top_left.x; // All original + _windows[i].top_left.y = _windows[i].org_top_left.y; + _windows[i].width_height.x = _windows[i].org_width_height.x; + _windows[i].width_height.y = _windows[i].org_width_height.y; + break; + case 1: // +90 degrees + _windows[i].top_left.x = _windows[i].org_top_left.y; + _windows[i].top_left.y = _display_x - (_windows[i].org_top_left.x + _windows[i].org_width_height.x); + _windows[i].width_height.x = _windows[i].org_width_height.y; // swapped width/height + _windows[i].width_height.y = _windows[i].org_width_height.x; + break; + case 2: // +180 degrees + _windows[i].top_left.x = _display_x - (_windows[i].org_top_left.x + _windows[i].org_width_height.x); + _windows[i].top_left.y = _display_y - (_windows[i].org_top_left.y + _windows[i].org_width_height.y); + _windows[i].width_height.x = _windows[i].org_width_height.x; + _windows[i].width_height.y = _windows[i].org_width_height.y; + break; + case 3: // +270 degrees + _windows[i].top_left.x = _display_y - (_windows[i].org_top_left.y + _windows[i].org_width_height.y); + _windows[i].top_left.y = _windows[i].org_top_left.x; + _windows[i].width_height.x = _windows[i].org_width_height.y; // swapped width/height + _windows[i].width_height.y = _windows[i].org_width_height.x; + break; + } + _windows[i].rotation = rotation; + } + + // logWindows(F("rot ")); // For debugging only + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW calculateTextMetrics(_fontwidth, _fontheight, _heightOffset, _isProportional); } # if ADAGFX_ENABLE_BMP_DISPLAY -/** +/**************************************************************************** * CPA (Copy/paste/adapt) from Adafruit_ImageReader::coreBMP() * Changes: * - No 'load to memory' feature * - No special handling of SD Filesystem/FAT, but File only * - Adds support for non-SPI displays (like NeoPixel Matrix, and possibly I2C displays, once supported) - */ + ***************************************************************************/ bool AdafruitGFX_helper::showBmp(const String& filename, int16_t x, int16_t y) { - bool transact = true; // Enable transaction support to work proper with SD czrd, when enabled - bool status = false; // IMAGE_SUCCESS on valid file + uint32_t offset; // Start of image data in file + uint32_t headerSize; // Indicates BMP version + uint32_t compression = 0; // BMP compression mode + uint32_t colors = 0; // Number of colors in palette + uint32_t rowSize; // >bmpWidth if scanline padding + uint8_t sdbuf[3 * BUFPIXELS]; // BMP read buf (R+G+B/pixel) + + uint32_t destidx = 0; + uint32_t bmpPos = 0; // Next pixel position in file + int bmpWidth; // BMP width & height in pixels + int bmpHeight; + int loadWidth; + int loadHeight; // Region being loaded (clipped) + int loadX; + int loadY; // " + int row; // Current pixel pos. + int col; + uint16_t *quantized = NULL; // 16-bit 5/6/5 color palette uint16_t tftbuf[BUFPIXELS]; - uint16_t *dest = tftbuf; // TFT working buffer, or NULL if to canvas - uint32_t offset; // Start of image data in file - uint32_t headerSize; // Indicates BMP version - uint8_t planes; // BMP planes - uint8_t depth; // BMP bit depth - uint32_t compression = 0; // BMP compression mode - uint32_t colors = 0; // Number of colors in palette - uint16_t *quantized = NULL; // 16-bit 5/6/5 color palette - uint32_t rowSize; // >bmpWidth if scanline padding - uint8_t sdbuf[3 * BUFPIXELS]; // BMP read buf (R+G+B/pixel) - int bmpWidth, bmpHeight; // BMP width & height in pixels + uint16_t *dest = tftbuf; // TFT working buffer, or NULL if to canvas + int16_t drow = 0; + int16_t dcol = 0; + uint8_t planes; // BMP planes + uint8_t depth; // BMP bit depth + uint8_t r; // Current pixel colors + uint8_t g; + uint8_t b; + uint8_t bitIn = 0; // Bit number for 1-bit data in # if ((3 * BUFPIXELS) <= 255) - uint8_t srcidx = sizeof sdbuf; // Current position in sdbuf + uint8_t srcidx = sizeof sdbuf; // Current position in sdbuf # else // if ((3 * BUFPIXELS) <= 255) uint16_t srcidx = sizeof sdbuf; # endif // if ((3 * BUFPIXELS) <= 255) - uint32_t destidx = 0; - bool flip = true; // BMP is stored bottom-to-top - uint32_t bmpPos = 0; // Next pixel position in file - int loadWidth, loadHeight, // Region being loaded (clipped) - loadX, loadY; // " - int row, col; // Current pixel pos. - uint8_t r, g, b; // Current pixel color - uint8_t bitIn = 0; // Bit number for 1-bit data in - int16_t drow = 0; - int16_t dcol = 0; + bool flip = true; // BMP is stored bottom-to-top + bool transact = true; // Enable transaction support to work proper with SD czrd, when enabled + bool status = false; // IMAGE_SUCCESS on valid file bool canTransact = (nullptr != _tft); @@ -1992,7 +2740,7 @@ bool AdafruitGFX_helper::showBmp(const String& filename, if (loglevelActiveFor(LOG_LEVEL_INFO)) { log.clear(); - log += F("showBmp: x: "); + log += F("showBmp: x:"); log += x; log += F(", y:"); log += y; @@ -2196,4 +2944,180 @@ uint32_t AdafruitGFX_helper::readLE32(void) { # endif // if ADAGFX_ENABLE_BMP_DISPLAY +# if ADAGFX_ENABLE_FRAMED_WINDOW + +/**************************************************************************** + * Check if the requested id is a valid window id + ***************************************************************************/ +bool AdafruitGFX_helper::validWindow(const uint8_t& windowId) { + return getWindowIndex(windowId) != -1; +} + +/**************************************************************************** + * Select this window id as the default + ***************************************************************************/ +bool AdafruitGFX_helper::selectWindow(const uint8_t& windowId, + const int8_t & rotation) { + const int16_t result = getWindowIndex(windowId); + + if (result != -1) { + _windowIndex = result; + _window = windowId; + } + return result != -1; +} + +/**************************************************************************** + * Return the index of the windowId in _windows, -1 if not found + ***************************************************************************/ +int16_t AdafruitGFX_helper::getWindowIndex(const int16_t& windowId) { + size_t result = 0; + + for (auto win = _windows.begin(); win != _windows.end(); win++, result++) { + if ((*win).id == windowId) { + break; + } + } + return result == _windows.size() ? -1 : result; +} + +/**************************************************************************** + * Get the offset for the currently active window + ***************************************************************************/ +void AdafruitGFX_helper::getWindowOffsets(uint16_t& xOffset, + uint16_t& yOffset) { + xOffset = _windows[_windowIndex].top_left.x; + yOffset = _windows[_windowIndex].top_left.y; +} + +/**************************************************************************** + * Get the limits for the currently active window + ***************************************************************************/ +void AdafruitGFX_helper::getWindowLimits(uint16_t& xLimit, + uint16_t& yLimit) { + xLimit = _windows[_windowIndex].width_height.x; + yLimit = _windows[_windowIndex].width_height.y; +} + +/**************************************************************************** + * Define a window and return the ID + ***************************************************************************/ +uint8_t AdafruitGFX_helper::defineWindow(const int16_t& x, + const int16_t& y, + const int16_t& w, + const int16_t& h, + int16_t windowId, + const int8_t & rotation) { + int16_t result = getWindowIndex(windowId); + + if (result < 0) { + result = _windows.size(); // previous size + _windows.push_back(tWindowObject()); // add new + + if (windowId < 0) { + windowId = 0; + + for (auto it = _windows.begin(); it != _windows.end(); it++) { + if ((*it).id == windowId) { windowId++; } // Generate a new window id + } + } + _windows[result].id = windowId; + } + _windows[result].top_left.x = x; + _windows[result].top_left.y = y; + _windows[result].width_height.x = w; + _windows[result].width_height.y = h; + + if (rotation >= 0) { + _windows[result].rotation = rotation & 3; + } else { + _windows[result].rotation = _rotation; + } + + // Adjust original coordinate/sizes based on rotation + switch (_windows[result].rotation) { + case 0: // 0 degrees + _windows[result].org_top_left.x = x; // All original + _windows[result].org_top_left.y = y; + _windows[result].org_width_height.x = w; + _windows[result].org_width_height.y = h; + break; + case 1: // +90 degrees + _windows[result].org_top_left.x = _display_x - (y + h); // swapped x/y + _windows[result].org_top_left.y = x; + _windows[result].org_width_height.x = h; // swapped width/height + _windows[result].org_width_height.y = w; + break; + case 2: // +180 degrees + _windows[result].org_top_left.x = _display_x - (x + w); + _windows[result].org_top_left.y = _display_y - (y + h); + _windows[result].org_width_height.x = w; // unchanged + _windows[result].org_width_height.y = h; + break; + case 3: // +270 degrees + _windows[result].org_top_left.x = y; + _windows[result].org_top_left.y = _display_x - (x + w); + _windows[result].org_width_height.x = h; // swapped width/height + _windows[result].org_width_height.y = w; + break; + } + + return _windows[result].id; +} + +/**************************************************************************** + * Remove a window definition + ***************************************************************************/ +bool AdafruitGFX_helper::deleteWindow(const uint8_t& windowId) { + const int16_t result = getWindowIndex(windowId); + + if (result > -1) { + _windows.erase(_windows.begin() + result); + return true; + } + return false; +} + +/**************************************************************************** + * log all current known window definitions + ***************************************************************************/ +void AdafruitGFX_helper::logWindows(const String& prefix) { + # ifndef BUILD_NO_DEBUG + String log; + + log.reserve(50); + + for (auto it = _windows.begin(); it != _windows.end(); it++) { + log.clear(); + log += F("AdaGFX window "); + log += prefix; + log += F(": "); + log += (*it).id; + log += F(", x:"); + log += (*it).top_left.x; + log += F(", y:"); + log += (*it).top_left.y; + log += F(", w:"); + log += (*it).width_height.x; + log += F(", h:"); + log += (*it).width_height.y; + log += F(", rot:"); + log += (*it).rotation; + log += F(", current: "); + log += getWindow(); + log += F(", org x:"); + log += (*it).org_top_left.x; + log += F(", y:"); + log += (*it).org_top_left.y; + log += F(", w:"); + log += (*it).org_width_height.x; + log += F(", h:"); + log += (*it).org_width_height.y; + addLogMove(LOG_LEVEL_INFO, log); + } + # endif // ifndef BUILD_NO_DEBUG +} + +# endif // if ADAGFX_ENABLE_FRAMED_WINDOW + #endif // ifdef PLUGIN_USES_ADAFRUITGFX diff --git a/src/src/Helpers/AdafruitGFX_helper.h b/src/src/Helpers/AdafruitGFX_helper.h index ea90be9d4..768b13129 100644 --- a/src/src/Helpers/AdafruitGFX_helper.h +++ b/src/src/Helpers/AdafruitGFX_helper.h @@ -10,10 +10,28 @@ /**************************************************************************** * helper class and functions for displays that use Adafruit_GFX library ***************************************************************************/ +/************ + * Changelog: + * 2022-06-07 tonhuisman: Code improvements in initialization, move offset calculation to printText() function + * 2022-06-06 tonhuisman: Process any special characters for lenght and textheight values for correct sizing + * 2022-06-05 tonhuisman: Add support for getting config values: win (current window id), iswin (exists?), width & height (current window), + * (text)length and textheight of a provided text, rot (current rotation), txs (fontscaling), tpm (textprintmode) + * 2022-06-04 tonhuisman: Add Window support for drawing and printing within confined areas (windows) + * Always use exact font calculation for determining allowable text length + * 2022-06-02 tonhuisman: Leave out some Notes from UI to save a few bytes from size limited builds + * 2022-05-27 tonhuisman: Change btn subcommand to split state and mode arguments, state = 0/1, -2/-1, mode = -2, -1, 0 + * 2022-05-27 tonhuisman: Fix a few character mappings in AdaGFXparseTemplate, add surrogates for chars not in font + * Add support for {0xNN...} to insert any ascii character in template, supports multiple 2-digit hex values > 00 + * space, comma, dot, colon, semicolon or dash (' ,.:;-') as separators in hex value are allowed + * 2022-05-23 tonhuisman: Fix cast for returned value from AdaGFXparseColor + * Make 8 and 16 color support optional to squeeze a few bytes from size limited builds + * 2022-05-23 tonhuisman: Add changelog, older changes have not been logged. + ***************************************************************************/ # include # include # include # include +# include // Used for bmp support # define BUFPIXELS 200 ///< 200 * 5 = 1000 bytes @@ -30,24 +48,38 @@ # define ADAGFX_USE_ASCIITABLE 1 // Enable 'asciitable' command (useful for debugging/development) # endif // ifndef ADAGFX_USE_ASCIITABLE # ifndef ADAGFX_SUPPORT_7COLOR -# define ADAGFX_SUPPORT_7COLOR 1 // Do we support 7-Color displays? + +// # define ADAGFX_SUPPORT_7COLOR 1 // Do we support 7-Color displays? # endif // ifndef ADAGFX_SUPPORT_7COLOR +# ifndef ADAGFX_SUPPORT_8and16COLOR + +// # define ADAGFX_SUPPORT_8and16COLOR 1 // Do we support 8 and 16-Color displays? +# endif // ifndef ADAGFX_SUPPORT_8and16COLOR # ifndef ADAGFX_FONTS_INCLUDED -# define ADAGFX_FONTS_INCLUDED 1 // 3 extra fonts, also controls enable/disable of below 8pt/12pt fonts +# define ADAGFX_FONTS_INCLUDED 1 // 3 extra fonts, also controls enable/disable of below 8pt/12pt fonts # endif // ifndef ADAGFX_FONTS_INCLUDED # ifndef ADAGFX_PARSE_SUBCOMMAND -# define ADAGFX_PARSE_SUBCOMMAND 1 // Enable parsing of subcommands (pre/postfix below) to be executed by the helper +# define ADAGFX_PARSE_SUBCOMMAND 1 // Enable parsing of subcommands (pre/postfix below) to be executed by the helper # endif // ifndef ADAGFX_PARSE_SUBCOMMAND # ifndef ADAGFX_ENABLE_EXTRA_CMDS -# define ADAGFX_ENABLE_EXTRA_CMDS 1 // Enable extra subcommands like lm (line-multi) and lmr (line-multi, relative) +# define ADAGFX_ENABLE_EXTRA_CMDS 1 // Enable extra subcommands like lm (line-multi) and lmr (line-multi, relative) # endif // ifndef ADAGFX_ENABLE_EXTRA_CMDS # ifndef ADAGFX_ENABLE_BMP_DISPLAY -# define ADAGFX_ENABLE_BMP_DISPLAY 1 // Enable subcommands for displaying .bmp files on supported displays (color) +# define ADAGFX_ENABLE_BMP_DISPLAY 1 // Enable subcommands for displaying .bmp files on supported displays (color) # endif // ifndef ADAGFX_ENABLE_BMP_DISPLAY +# ifndef ADAGFX_ENABLE_BUTTON_DRAW +# define ADAGFX_ENABLE_BUTTON_DRAW 1 // Enable subcommands for displaying button-like shapes +# endif // ifndef ADAGFX_ENABLE_BUTTON_DRAW +# ifndef ADAGFX_ENABLE_FRAMED_WINDOW +# define ADAGFX_ENABLE_FRAMED_WINDOW 1 // Enable framed window features +# endif // ifndef ADAGFX_ENABLE_BUTTON_DRAW +# ifndef ADAGFX_ENABLE_GET_CONFIG_VALUE +# define ADAGFX_ENABLE_GET_CONFIG_VALUE 1 // Enable getting values features +# endif // ifndef ADAGFX_ENABLE_GET_CONFIG_VALUE -// # define ADAGFX_FONTS_EXTRA_8PT_INCLUDED // 5 extra 8pt fonts, should probably only be enabled in a private custom build, adds ~10,4 kB -// # define ADAGFX_FONTS_EXTRA_12PT_INCLUDED // 6 extra 12pt fonts, should probably only be enabled in a private custom build, adds ~19,8 kB -// # define ADAGFX_FONTS_EXTRA_16PT_INCLUDED // 2 extra 16pt fonts, should probably only be enabled in a private custom build, adds ~7.7 kB +// # define ADAGFX_FONTS_EXTRA_8PT_INCLUDED // 8 extra 8pt fonts, should probably only be enabled in a private custom build, adds ~15.4 kB +// # define ADAGFX_FONTS_EXTRA_12PT_INCLUDED // 9 extra 12pt fonts, should probably only be enabled in a private custom build, adds ~28 kB +// # define ADAGFX_FONTS_EXTRA_16PT_INCLUDED // 5 extra 16pt fonts, should probably only be enabled in a private custom build, adds ~19.9 kB // # define ADAGFX_FONTS_EXTRA_18PT_INCLUDED // 1 extra 18pt fonts, should probably only be enabled in a private custom build, adds ~4.3 kB // # define ADAGFX_FONTS_EXTRA_20PT_INCLUDED // 1 extra 20pt fonts, should probably only be enabled in a private custom build, adds ~5.3 kB @@ -58,6 +90,10 @@ # define ADAGFX_FONTS_EXTRA_8PT_UNISPACEITALIC # define ADAGFX_FONTS_EXTRA_8PT_WHITERABBiT +// # define ADAGFX_FONTS_EXTRA_8PT_ROBOTO // This font is proportinally spaced! +// # define ADAGFX_FONTS_EXTRA_8PT_ROBOTOCONDENSED // This font is proportinally spaced! +# define ADAGFX_FONTS_EXTRA_8PT_ROBOTOMONO + // To enable/disable 12pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_12PT_INCLUDED is defined) # define ADAGFX_FONTS_EXTRA_12PT_ANGELINA // This font is proportinally spaced! # define ADAGFX_FONTS_EXTRA_12PT_NOVAMONO @@ -66,10 +102,18 @@ # define ADAGFX_FONTS_EXTRA_12PT_UNISPACEITALIC # define ADAGFX_FONTS_EXTRA_12PT_WHITERABBiT +// # define ADAGFX_FONTS_EXTRA_12PT_ROBOTO // This font is proportinally spaced! +// # define ADAGFX_FONTS_EXTRA_12PT_ROBOTOCONDENSED // This font is proportinally spaced! +# define ADAGFX_FONTS_EXTRA_12PT_ROBOTOMONO + // To enable/disable 16pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_16PT_INCLUDED is defined) # define ADAGFX_FONTS_EXTRA_16PT_AMERIKASANS // This font is proportinally spaced! # define ADAGFX_FONTS_EXTRA_16PT_WHITERABBiT +// # define ADAGFX_FONTS_EXTRA_16PT_ROBOTO // This font is proportinally spaced! +// # define ADAGFX_FONTS_EXTRA_16PT_ROBOTOCONDENSED // This font is proportinally spaced! +# define ADAGFX_FONTS_EXTRA_16PT_ROBOTOMONO + // To enable/disable 18pt fonts separately: (will only be enabled if ADAGFX_FONTS_EXTRA_18PT_INCLUDED is defined) # define ADAGFX_FONTS_EXTRA_18PT_WHITERABBiT @@ -86,9 +130,21 @@ # ifdef ADAGFX_USE_ASCIITABLE # undef ADAGFX_USE_ASCIITABLE # endif // ifdef ADAGFX_USE_ASCIITABLE +# ifdef ADAGFX_SUPPORT_8and16COLOR +# undef ADAGFX_SUPPORT_8and16COLOR +# endif // ifdef ADAGFX_SUPPORT_8and16COLOR // # ifdef ADAGFX_ENABLE_BMP_DISPLAY // # undef ADAGFX_ENABLE_BMP_DISPLAY // # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY +// # ifdef ADAGFX_ENABLE_BUTTON_DRAW +// # undef ADAGFX_ENABLE_BUTTON_DRAW +// # endif // ifdef ADAGFX_ENABLE_BUTTON_DRAW +// # ifdef ADAGFX_ENABLE_FRAMED_WINDOW +// # undef ADAGFX_ENABLE_FRAMED_WINDOW +// # endif // ifdef ADAGFX_ENABLE_FRAMED_WINDOW +// # ifdef ADAGFX_ENABLE_GET_CONFIG_VALUE +// # undef ADAGFX_ENABLE_GET_CONFIG_VALUE +// # endif // ifdef ADAGFX_ENABLE_GET_CONFIG_VALUE # endif // ifdef LIMIT_BUILD_SIZE # ifdef PLUGIN_SET_MAX // Include all fonts in MAX builds @@ -107,6 +163,12 @@ # ifndef ADAGFX_FONTS_EXTRA_20PT_INCLUDED # define ADAGFX_FONTS_EXTRA_20PT_INCLUDED # endif // ifndef ADAGFX_FONTS_EXTRA_20PT_INCLUDED +# ifndef ADAGFX_SUPPORT_7COLOR +# define ADAGFX_SUPPORT_7COLOR 1 +# endif // ifndef ADAGFX_SUPPORT_7COLOR +# ifndef ADAGFX_SUPPORT_8and16COLOR +# define ADAGFX_SUPPORT_8and16COLOR 1 +# endif // ifndef ADAGFX_SUPPORT_8and16COLOR # endif // ifdef PLUGIN_SET_MAX # define ADAGFX_PARSE_PREFIX F("~") // Subcommand-trigger prefix and postfix strings @@ -114,7 +176,7 @@ # define ADAGFX_PARSE_POSTFIX F("~") // Will be removed before the normal template parsing is done # define ADAGFX_PARSE_POSTFIX_LEN 1 -# define ADAGFX_UNIVERSAL_TRIGGER F("adagfx_write") // Universal command trigger +# define ADAGFX_UNIVERSAL_TRIGGER F("adagfx_trigger") // Universal command trigger // Color definitions, borrowed from Adafruit_ILI9341.h @@ -169,11 +231,21 @@ enum class AdaGFXTextPrintMode : uint8_t { }; # if ADAGFX_SUPPORT_7COLOR +# if ADAGFX_SUPPORT_8and16COLOR # define ADAGFX_COLORDEPTH_COUNT 7 # define ADAGFX_MONOCOLORS_COUNT 4 +# else // if ADAGFX_SUPPORT_8and16COLOR +# define ADAGFX_COLORDEPTH_COUNT 5 +# define ADAGFX_MONOCOLORS_COUNT 4 +# endif // if ADAGFX_SUPPORT_8and16COLOR # else // if ADAGFX_SUPPORT_7COLOR +# if ADAGFX_SUPPORT_8and16COLOR # define ADAGFX_COLORDEPTH_COUNT 6 # define ADAGFX_MONOCOLORS_COUNT 3 +# else // if ADAGFX_SUPPORT_8and16COLOR +# define ADAGFX_COLORDEPTH_COUNT 4 +# define ADAGFX_MONOCOLORS_COUNT 3 +# endif // if ADAGFX_SUPPORT_8and16COLOR # endif // if ADAGFX_SUPPORT_7COLOR enum class AdaGFXColorDepth : uint16_t { Monochrome = 2u, // Black & white @@ -182,16 +254,72 @@ enum class AdaGFXColorDepth : uint16_t { # if ADAGFX_SUPPORT_7COLOR SevenColor = 7u, // Black, white, red, yellow, blue, green, orange # endif // if ADAGFX_SUPPORT_7COLOR + # if ADAGFX_SUPPORT_8and16COLOR EightColor = 8u, // 8 regular colors SixteenColor = 16u, // 16 colors + # endif // if ADAGFX_SUPPORT_8and16COLOR FullColor = 65535u // 65535 colors (max. supported by RGB565) }; -class AdafruitGFX_helper; // Forward declaration +# if ADAGFX_ENABLE_BUTTON_DRAW + +// Only bits 0..3 can be used, masked with: 0x0F +// stored combined with Button_layout_e value +enum class Button_type_e : uint8_t { + None = 0x00, + Square = 0x01, + Rounded = 0x02, + Circle = 0x03, + ArrowLeft = 0x04, + ArrowUp = 0x05, + ArrowRight = 0x06, + ArrowDown = 0x07, + Button_MAX = 8u // must be last value in enum, max possible values: 16 +}; + +// Only bits 4..7 can be used, masked with: 0xF0 +// stored combined with Button_type_e value +enum class Button_layout_e : uint8_t { + CenterAligned = 0x00, + LeftAligned = 0x10, + TopAligned = 0x20, + RightAligned = 0x30, + BottomAligned = 0x40, + LeftTopAligned = 0x50, + RightTopAligned = 0x60, + RightBottomAligned = 0x70, + LeftBottomAligned = 0x80, + NoCaption = 0x90, + Bitmap = 0xA0, + Alignment_MAX = 11u // options-count, max possible values: 16 +}; + +const __FlashStringHelper* toString(const Button_type_e button); +const __FlashStringHelper* toString(const Button_layout_e layout); + +# endif // if ADAGFX_ENABLE_BUTTON_DRAW + +# if ADAGFX_ENABLE_FRAMED_WINDOW + +struct tWindowPoint { + uint16_t x = 0; + uint16_t y = 0; +}; +struct tWindowObject { + tWindowPoint top_left; + tWindowPoint width_height; + tWindowPoint org_top_left; + tWindowPoint org_width_height; + uint8_t id = 0u; + int8_t rotation = 0; +}; +# endif // if ADAGFX_ENABLE_FRAMED_WINDOW + +class AdafruitGFX_helper; // Forward declaration // Some generic AdafruitGFX_helper support functions -const __FlashStringHelper* toString(AdaGFXTextPrintMode mode); -const __FlashStringHelper* toString(AdaGFXColorDepth colorDepth); +const __FlashStringHelper* toString(const AdaGFXTextPrintMode& mode); +const __FlashStringHelper* toString(const AdaGFXColorDepth& colorDepth); void AdaGFXFormTextPrintMode(const __FlashStringHelper *id, uint8_t selectedIndex); void AdaGFXFormColorDepth(const __FlashStringHelper *id, @@ -223,64 +351,71 @@ void AdaGFXFormDisplayButton(const __FlashStringHelper *buttonPinId, void AdaGFXFormFontScaling(const __FlashStringHelper *fontScalingId, uint8_t fontScaling, uint8_t maxScale = 10); -String AdaGFXparseTemplate(String & tmpString, - uint8_t lineSize, +String AdaGFXparseTemplate(const String & tmpString, + const uint8_t lineSize, AdafruitGFX_helper *gfxHelper = nullptr); -uint16_t AdaGFXparseColor(String & s, - AdaGFXColorDepth colorDepth = AdaGFXColorDepth::FullColor, - bool emptyIsBlack = false); // Parse either a color by name, 6 digit hex rrggbb color, or 1..4 digit - // #rgb565 color (hex with # prefix) +uint16_t AdaGFXparseColor(String & s, + const AdaGFXColorDepth& colorDepth = AdaGFXColorDepth::FullColor, + const bool emptyIsBlack = false); // Parse either a color by name, 6 digit hex rrggbb color, + // or 1..4 digit + // #rgb565 color (hex with # prefix) void AdaGFXHtmlColorDepthDataList(const __FlashStringHelper *id, - AdaGFXColorDepth colorDepth); -String AdaGFXcolorToString(uint16_t color, - AdaGFXColorDepth colorDepth = AdaGFXColorDepth::FullColor, - bool blackIsEmpty = false); + const AdaGFXColorDepth & colorDepth); +String AdaGFXcolorToString(const uint16_t & color, + const AdaGFXColorDepth& colorDepth = AdaGFXColorDepth::FullColor, + bool blackIsEmpty = false); # if ADAGFX_SUPPORT_7COLOR -uint16_t AdaGFXrgb565ToColor7(uint16_t color); // Convert rgb565 color to 7-color +uint16_t AdaGFXrgb565ToColor7(const uint16_t& color); // Convert rgb565 color to 7-color # endif // if ADAGFX_SUPPORT_7COLOR class AdafruitGFX_helper { public: - AdafruitGFX_helper(Adafruit_GFX *display, - const String & trigger, - uint16_t res_x, - uint16_t res_y, - AdaGFXColorDepth colorDepth = AdaGFXColorDepth::FullColor, - AdaGFXTextPrintMode textPrintMode = AdaGFXTextPrintMode::ContinueToNextLine, - uint8_t fontscaling = 1, - uint16_t fgcolor = ADAGFX_WHITE, - uint16_t bgcolor = ADAGFX_BLACK, - bool useValidation = true, - bool textBackFill = false); - # ifdef ADAGFX_ENABLE_BMP_DISPLAY - AdafruitGFX_helper(Adafruit_SPITFT *display, - const String & trigger, - uint16_t res_x, - uint16_t res_y, - AdaGFXColorDepth colorDepth = AdaGFXColorDepth::FullColor, - AdaGFXTextPrintMode textPrintMode = AdaGFXTextPrintMode::ContinueToNextLine, - uint8_t fontscaling = 1, - uint16_t fgcolor = ADAGFX_WHITE, - uint16_t bgcolor = ADAGFX_BLACK, - bool useValidation = true, - bool textBackFill = false); - # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY + AdafruitGFX_helper(Adafruit_GFX *display, + const String & trigger, + const uint16_t res_x, + const uint16_t res_y, + const AdaGFXColorDepth & colorDepth = AdaGFXColorDepth::FullColor, + const AdaGFXTextPrintMode& textPrintMode = AdaGFXTextPrintMode::ContinueToNextLine, + const uint8_t fontscaling = 1, + const uint16_t fgcolor = ADAGFX_WHITE, + const uint16_t bgcolor = ADAGFX_BLACK, + const bool useValidation = true, + const bool textBackFill = false); + # if ADAGFX_ENABLE_BMP_DISPLAY + AdafruitGFX_helper(Adafruit_SPITFT *display, + const String & trigger, + const uint16_t res_x, + const uint16_t res_y, + const AdaGFXColorDepth & colorDepth = AdaGFXColorDepth::FullColor, + const AdaGFXTextPrintMode& textPrintMode = AdaGFXTextPrintMode::ContinueToNextLine, + const uint8_t fontscaling = 1, + const uint16_t fgcolor = ADAGFX_WHITE, + const uint16_t bgcolor = ADAGFX_BLACK, + const bool useValidation = true, + const bool textBackFill = false); + # endif // if ADAGFX_ENABLE_BMP_DISPLAY virtual ~AdafruitGFX_helper() {} - bool processCommand(const String& string); // Parse the string for recognized commands and apply them on the graphics display + String getFeatures(); - void printText(const char *string, - int16_t X, - int16_t Y, - uint8_t textSize = 0, - uint16_t color = ADAGFX_WHITE, - uint16_t bkcolor = ADAGFX_BLACK, - uint16_t maxWidth = 0); - void calculateTextMetrics(uint8_t fontwidth, - uint8_t fontheight, - int8_t heightOffset = 0, - bool isProportional = false); + bool processCommand(const String& string); // Parse the string for recognized commands and apply them on the graphics display + + # if ADAGFX_ENABLE_GET_CONFIG_VALUE + bool pluginGetConfigValue(String& string); // Get a config value from the plugin + # endif // if ADAGFX_ENABLE_GET_CONFIG_VALUE + + void printText(const char *string, + const int16_t & X, + const int16_t & Y, + const uint8_t & textSize = 0, + const uint16_t& color = ADAGFX_WHITE, + uint16_t bkcolor = ADAGFX_BLACK, + const uint16_t& maxWidth = 0); + void calculateTextMetrics(const uint8_t fontwidth, + const uint8_t fontheight, + const int8_t heightOffset = 0, + const bool isProportional = false); void getTextMetrics(uint16_t& textcols, uint16_t& textrows, uint8_t & fontwidth, @@ -312,11 +447,28 @@ public: return trigger.equalsIgnoreCase(ADAGFX_UNIVERSAL_TRIGGER); } - # ifdef ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BMP_DISPLAY bool showBmp(const String& filename, int16_t x, int16_t y); - # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + + # if ADAGFX_ENABLE_FRAMED_WINDOW + uint8_t getWindow() { + return _window; + } + + bool validWindow(const uint8_t& windowId); + bool selectWindow(const uint8_t& windowId, + const int8_t & rotation = -1); + uint8_t defineWindow(const int16_t& x, + const int16_t& y, + const int16_t& w, + const int16_t& h, + int16_t windowId = -1, + const int8_t & rotation = -1); + bool deleteWindow(const uint8_t& windowId); + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW uint16_t getTextSize(const String& text, uint16_t & h); // return length and height in pixels using current font @@ -331,10 +483,19 @@ private: void initialize(); # if ADAGFX_ARGUMENT_VALIDATION - bool invalidCoordinates(int X, - int Y, - bool colRowMode = false); + bool invalidCoordinates(const int X, + const int Y, + const bool colRowMode = false); # endif // if ADAGFX_ARGUMENT_VALIDATION + # if ADAGFX_ENABLE_BUTTON_DRAW + void drawButtonShape(const Button_type_e& buttonType, + const int & x, + const int & y, + const int & w, + const int & h, + const uint16_t & fillColor, + const uint16_t & borderColor); + # endif // if ADAGFX_ENABLE_BUTTON_DRAW Adafruit_GFX *_display = nullptr; Adafruit_SPITFT *_tft = nullptr; @@ -358,14 +519,26 @@ private: bool _isProportional = false; uint8_t _p095_compensation = 0; bool _columnRowMode = false; + int8_t _rotation = 0; uint16_t _display_x; uint16_t _display_y; - # ifdef ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_BMP_DISPLAY uint16_t readLE16(void); uint32_t readLE32(void); fs::File file; - # endif // ifdef ADAGFX_ENABLE_BMP_DISPLAY + # endif // if ADAGFX_ENABLE_BMP_DISPLAY + # if ADAGFX_ENABLE_FRAMED_WINDOW + int16_t getWindowIndex(const int16_t& windowId); + void logWindows(const String& prefix = EMPTY_STRING); + void getWindowOffsets(uint16_t& xOffset, + uint16_t& yOffset); + void getWindowLimits(uint16_t& xLimit, + uint16_t& yLimit); + std::vector_windows; + uint8_t _window = 0; // current window + uint8_t _windowIndex = 0; // current window Index + # endif // if ADAGFX_ENABLE_FRAMED_WINDOW }; #endif // ifdef PLUGIN_USES_ADAFRUITGFX diff --git a/src/src/Helpers/Convert.cpp b/src/src/Helpers/Convert.cpp index c0c4c023f..a2393465c 100644 --- a/src/src/Helpers/Convert.cpp +++ b/src/src/Helpers/Convert.cpp @@ -1,5 +1,7 @@ #include "../Helpers/Convert.h" + + /*********************************************************************************************\ Convert bearing in degree to bearing string \*********************************************************************************************/ diff --git a/src/src/Helpers/ESPEasyStatistics.cpp b/src/src/Helpers/ESPEasyStatistics.cpp index a013fd7b4..8f9c897d4 100644 --- a/src/src/Helpers/ESPEasyStatistics.cpp +++ b/src/src/Helpers/ESPEasyStatistics.cpp @@ -4,7 +4,7 @@ #if FEATURE_TIMING_STATS #include "../DataStructs/TimingStats.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../Globals/Protocol.h" #include "../Helpers/Convert.h" diff --git a/src/src/Helpers/ESPEasy_FactoryDefault.cpp b/src/src/Helpers/ESPEasy_FactoryDefault.cpp index 491d35259..2695c43cb 100644 --- a/src/src/Helpers/ESPEasy_FactoryDefault.cpp +++ b/src/src/Helpers/ESPEasy_FactoryDefault.cpp @@ -3,6 +3,7 @@ #include "../../ESPEasy_common.h" #include "../../_Plugin_Helper.h" +#include "../CustomBuild/CompiletimeDefines.h" #include "../CustomBuild/StorageLayout.h" #include "../DataStructs/ControllerSettingsStruct.h" @@ -19,6 +20,7 @@ #include "../Helpers/_CPlugin_Helper.h" #include "../Helpers/ESPEasyRTC.h" +#include "../Helpers/FS_Helper.h" #include "../Helpers/Hardware.h" #include "../Helpers/Misc.h" @@ -183,7 +185,7 @@ void ResetFactory() Settings.PID = ESP_PROJECT_PID; Settings.Version = VERSION; - Settings.Build = BUILD; + Settings.Build = get_build_nr(); // Settings.IP_Octet = DEFAULT_IP_OCTET; Settings.Delay = DEFAULT_DELAY; diff --git a/src/src/Helpers/ESPEasy_Storage.cpp b/src/src/Helpers/ESPEasy_Storage.cpp index 611c8f794..3b546e209 100644 --- a/src/src/Helpers/ESPEasy_Storage.cpp +++ b/src/src/Helpers/ESPEasy_Storage.cpp @@ -2,6 +2,7 @@ #include "../../ESPEasy_common.h" +#include "../CustomBuild/CompiletimeDefines.h" #include "../CustomBuild/StorageLayout.h" #include "../DataStructs/TimingStats.h" @@ -319,8 +320,12 @@ String BuildFixes() } #endif + // Starting 2022/08/18 + // Use get_build_nr() value for settings transitions. + // This value will also be shown when building using PlatformIO, when showing the Compile time defines - Settings.Build = BUILD; + + Settings.Build = get_build_nr(); return SaveSettings(); } diff --git a/src/src/Helpers/ESPEasy_Storage.h b/src/src/Helpers/ESPEasy_Storage.h index fc3dbd323..9ac92f042 100644 --- a/src/src/Helpers/ESPEasy_Storage.h +++ b/src/src/Helpers/ESPEasy_Storage.h @@ -4,7 +4,7 @@ #include "../../ESPEasy_common.h" -#include +#include "../Helpers/FS_Helper.h" #include "../DataStructs/ProvisioningStruct.h" #include "../DataTypes/ESPEasyFileType.h" diff --git a/src/src/Helpers/ESPEasy_time.cpp b/src/src/Helpers/ESPEasy_time.cpp index 181f8108e..b2ebf6525 100644 --- a/src/src/Helpers/ESPEasy_time.cpp +++ b/src/src/Helpers/ESPEasy_time.cpp @@ -51,40 +51,6 @@ struct tm ESPEasy_time::addSeconds(const struct tm& ts, int seconds, bool toLoca return result; } -void ESPEasy_time::breakTime(unsigned long timeInput, struct tm& tm) { - uint32_t time = (uint32_t)timeInput; - tm.tm_sec = time % 60; - time /= 60; // now it is minutes - tm.tm_min = time % 60; - time /= 60; // now it is hours - tm.tm_hour = time % 24; - time /= 24; // now it is days - tm.tm_wday = ((time + 4) % 7) + 1; // Sunday is day 1 - - int year = 1970; - unsigned long days = 0; - while ((unsigned)(days += (isLeapYear(year) ? 366 : 365)) <= time) { - year++; - } - tm.tm_year = year - 1900; // tm_year starts at 1900 - - days -= isLeapYear(year) ? 366 : 365; - time -= days; // now it is days in this year, starting at 0 - - uint8_t month = 0; - for (month = 0; month < 12; month++) { - const uint8_t monthLength = getMonthDays(year, month); - if (time >= monthLength) { - time -= monthLength; - } else { - break; - } - } - tm.tm_mon = month; // Jan is month 0 - tm.tm_mday = time + 1; // day of month start at 1 -} - - void ESPEasy_time::restoreFromRTC() { static bool firstCall = true; @@ -482,82 +448,30 @@ bool ESPEasy_time::getNtpTime(double& unixTime_d) \*********************************************************************************************/ String ESPEasy_time::getDateString(char delimiter) const { - return getDateString(tm, delimiter); + return formatDateString(tm, delimiter); } -String ESPEasy_time::getDateString(const struct tm& ts, char delimiter) { - // time format example with ':' delimiter: 23:59:59 (HH:MM:SS) - char DateString[20]; // 19 digits plus the null char - const int year = 1900 + ts.tm_year; - - sprintf_P(DateString, PSTR("%4d%c%02d%c%02d"), year, delimiter, ts.tm_mon + 1, delimiter, ts.tm_mday); - return DateString; -} String ESPEasy_time::getTimeString(char delimiter, bool show_seconds /*=true*/, char hour_prefix /*='\0'*/) const { - return getTimeString(tm, delimiter, false, show_seconds, hour_prefix); + return formatTimeString(tm, delimiter, false, show_seconds, hour_prefix); } String ESPEasy_time::getTimeString_ampm(char delimiter, bool show_seconds /*=true*/, char hour_prefix /*='\0'*/) const { - return getTimeString(tm, delimiter, true, show_seconds, hour_prefix); + return formatTimeString(tm, delimiter, true, show_seconds, hour_prefix); } -// returns the current Time separated by the given delimiter -// time format example with ':' delimiter: 23:59:59 (HH:MM:SS) -String ESPEasy_time::getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix /*='\0'*/) -{ - char TimeString[20]; // 19 digits plus the null char - char hour_prefix_s[2] = { 0 }; - if (am_pm) { - uint8_t hour(ts.tm_hour % 12); - - if (hour == 0) { hour = 12; } - const char a_or_p = ts.tm_hour < 12 ? 'A' : 'P'; - if (hour < 10) { hour_prefix_s[0] = hour_prefix; } - - if (show_seconds) { - sprintf_P(TimeString, PSTR("%s%d%c%02d%c%02d %cM"), - hour_prefix_s, hour, delimiter, ts.tm_min, delimiter, ts.tm_sec, a_or_p); - } else { - sprintf_P(TimeString, PSTR("%s%d%c%02d %cM"), - hour_prefix_s, hour, delimiter, ts.tm_min, a_or_p); - } - } else { - if (show_seconds) { - sprintf_P(TimeString, PSTR("%02d%c%02d%c%02d"), - ts.tm_hour, delimiter, ts.tm_min, delimiter, ts.tm_sec); - } else { - if (ts.tm_hour < 10) { hour_prefix_s[0] = hour_prefix; } - sprintf_P(TimeString, PSTR("%s%d%c%02d"), - hour_prefix_s, ts.tm_hour, delimiter, ts.tm_min); - } - } - return TimeString; -} String ESPEasy_time::getDateTimeString(char dateDelimiter, char timeDelimiter, char dateTimeDelimiter) const { - return getDateTimeString(tm, dateDelimiter, timeDelimiter, dateTimeDelimiter, false); + return formatDateTimeString(tm, dateDelimiter, timeDelimiter, dateTimeDelimiter, false); } String ESPEasy_time::getDateTimeString_ampm(char dateDelimiter, char timeDelimiter, char dateTimeDelimiter) const { - return getDateTimeString(tm, dateDelimiter, timeDelimiter, dateTimeDelimiter, true); + return formatDateTimeString(tm, dateDelimiter, timeDelimiter, dateTimeDelimiter, true); } -String ESPEasy_time::getDateTimeString(const struct tm& ts, char dateDelimiter, char timeDelimiter, char dateTimeDelimiter, bool am_pm) -{ - // if called like this: getDateTimeString('\0', '\0', '\0'); - // it will give back this: 20161231235959 (YYYYMMDDHHMMSS) - String ret = getDateString(ts, dateDelimiter); - - if (dateTimeDelimiter != '\0') { - ret += dateTimeDelimiter; - } - ret += getTimeString(ts, timeDelimiter, am_pm, true); - return ret; -} /********************************************************************************************\ Get current time/date @@ -624,25 +538,25 @@ int ESPEasy_time::getSecOffset(const String& format) { } String ESPEasy_time::getSunriseTimeString(char delimiter) const { - return getTimeString(sunRise, delimiter, false, false); + return formatTimeString(sunRise, delimiter, false, false); } String ESPEasy_time::getSunsetTimeString(char delimiter) const { - return getTimeString(sunSet, delimiter, false, false); + return formatTimeString(sunSet, delimiter, false, false); } String ESPEasy_time::getSunriseTimeString(char delimiter, int secOffset) const { if (secOffset == 0) { return getSunriseTimeString(delimiter); } - return getTimeString(getSunRise(secOffset), delimiter, false, false); + return formatTimeString(getSunRise(secOffset), delimiter, false, false); } String ESPEasy_time::getSunsetTimeString(char delimiter, int secOffset) const { if (secOffset == 0) { return getSunsetTimeString(delimiter); } - return getTimeString(getSunSet(secOffset), delimiter, false, false); + return formatTimeString(getSunSet(secOffset), delimiter, false, false); } float ESPEasy_time::sunDeclination(int doy) { diff --git a/src/src/Helpers/ESPEasy_time.h b/src/src/Helpers/ESPEasy_time.h index 73f5b4ae9..7c98fb2b9 100644 --- a/src/src/Helpers/ESPEasy_time.h +++ b/src/src/Helpers/ESPEasy_time.h @@ -18,8 +18,6 @@ public: struct tm addSeconds(const struct tm& ts, int seconds, bool toLocalTime) const; - static void breakTime(unsigned long timeInput, - struct tm & tm); // Restore the last known system time // This may be useful to get some idea of what time it is. @@ -63,30 +61,17 @@ public: // Default date format example: 20161231 (YYYYMMDD) String getDateString(char delimiter = '\0') const; -// Format given Date separated by the given delimiter -// date format example with '-' delimiter: 2016-12-31 (YYYY-MM-DD) -static String getDateString(const struct tm& ts, char delimiter); - // Formats the current Time // Default time format example: 235959 (HHMMSS) String getTimeString(char delimiter = '\0', bool show_seconds = true, char hour_prefix = '\0') const; String getTimeString_ampm(char delimiter = '\0', bool show_seconds = true, char hour_prefix = '\0') const; -// returns the current Time separated by the given delimiter -// time format example with ':' delimiter: 23:59:59 (HH:MM:SS) -static String getTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix = '\0'); - - String getDateTimeString(char dateDelimiter = '-', char timeDelimiter = ':', char dateTimeDelimiter = ' ') const; String getDateTimeString_ampm(char dateDelimiter = '-', char timeDelimiter = ':', char dateTimeDelimiter = ' ') const; -// returns the current Date and Time separated by the given delimiter -// if called like this: getDateTimeString('\0', '\0', '\0'); -// it will give back this: 20161231235959 (YYYYMMDDHHMMSS) -static String getDateTimeString(const struct tm& ts, char dateDelimiter = '-', char timeDelimiter = ':', char dateTimeDelimiter = ' ', bool am_pm = false); /********************************************************************************************\ diff --git a/src/src/Helpers/ESPEasy_time_calc.cpp b/src/src/Helpers/ESPEasy_time_calc.cpp index c22fa24b2..fdccbba13 100644 --- a/src/src/Helpers/ESPEasy_time_calc.cpp +++ b/src/src/Helpers/ESPEasy_time_calc.cpp @@ -65,6 +65,120 @@ uint32_t makeTime(const struct tm& tm) { return seconds; } +void breakTime(unsigned long timeInput, struct tm& tm) { + uint32_t time = (uint32_t)timeInput; + tm.tm_sec = time % 60; + time /= 60; // now it is minutes + tm.tm_min = time % 60; + time /= 60; // now it is hours + tm.tm_hour = time % 24; + time /= 24; // now it is days + tm.tm_wday = ((time + 4) % 7) + 1; // Sunday is day 1 + + int year = 1970; + unsigned long days = 0; + while ((unsigned)(days += (isLeapYear(year) ? 366 : 365)) <= time) { + year++; + } + tm.tm_year = year - 1900; // tm_year starts at 1900 + + days -= isLeapYear(year) ? 366 : 365; + time -= days; // now it is days in this year, starting at 0 + + uint8_t month = 0; + for (month = 0; month < 12; month++) { + const uint8_t monthLength = getMonthDays(year, month); + if (time >= monthLength) { + time -= monthLength; + } else { + break; + } + } + tm.tm_mon = month; // Jan is month 0 + tm.tm_mday = time + 1; // day of month start at 1 +} + + +String formatDateString(const struct tm& ts, char delimiter) { + // time format example with ':' delimiter: 23:59:59 (HH:MM:SS) + char DateString[20]; // 19 digits plus the null char + const int year = 1900 + ts.tm_year; + if (delimiter == '\0') { + sprintf_P(DateString, PSTR("%4d%02d%02d"), year, ts.tm_mon + 1, ts.tm_mday); + } else { + sprintf_P(DateString, PSTR("%4d%c%02d%c%02d"), year, delimiter, ts.tm_mon + 1, delimiter, ts.tm_mday); + } + return DateString; +} + + +// returns the current Time separated by the given delimiter +// time format example with ':' delimiter: 23:59:59 (HH:MM:SS) +String formatTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix /*='\0'*/) +{ + char TimeString[20]; // 19 digits plus the null char + char hour_prefix_s[2] = { 0 }; + + if (am_pm) { + uint8_t hour(ts.tm_hour % 12); + + if (hour == 0) { hour = 12; } + const char a_or_p = ts.tm_hour < 12 ? 'A' : 'P'; + if (hour < 10) { hour_prefix_s[0] = hour_prefix; } + + if (show_seconds) { + if (delimiter == '\0') { + sprintf_P(TimeString, PSTR("%s%d%02d%02d %cM"), + hour_prefix_s, hour, ts.tm_min, ts.tm_sec, a_or_p); + } else { + sprintf_P(TimeString, PSTR("%s%d%c%02d%c%02d %cM"), + hour_prefix_s, hour, delimiter, ts.tm_min, delimiter, ts.tm_sec, a_or_p); + } + } else { + if (delimiter == '\0') { + sprintf_P(TimeString, PSTR("%s%d%02d %cM"), + hour_prefix_s, hour, ts.tm_min, a_or_p); + } else { + sprintf_P(TimeString, PSTR("%s%d%c%02d %cM"), + hour_prefix_s, hour, delimiter, ts.tm_min, a_or_p); + } + } + } else { + if (show_seconds) { + if (delimiter == '\0') { + sprintf_P(TimeString, PSTR("%02d%02d%02d"), + ts.tm_hour, ts.tm_min, ts.tm_sec); + } else { + sprintf_P(TimeString, PSTR("%02d%c%02d%c%02d"), + ts.tm_hour, delimiter, ts.tm_min, delimiter, ts.tm_sec); + } + } else { + if (ts.tm_hour < 10) { hour_prefix_s[0] = hour_prefix; } + if (delimiter == '\0') { + sprintf_P(TimeString, PSTR("%s%d%02d"), + hour_prefix_s, ts.tm_hour, ts.tm_min); + } else { + sprintf_P(TimeString, PSTR("%s%d%c%02d"), + hour_prefix_s, ts.tm_hour, delimiter, ts.tm_min); + } + } + } + return TimeString; +} + + +String formatDateTimeString(const struct tm& ts, char dateDelimiter, char timeDelimiter, char dateTimeDelimiter, bool am_pm) +{ + // if called like this: getDateTimeString('\0', '\0', '\0'); + // it will give back this: 20161231235959 (YYYYMMDDHHMMSS) + String ret = formatDateString(ts, dateDelimiter); + + if (dateTimeDelimiter != '\0') { + ret += dateTimeDelimiter; + } + ret += formatTimeString(ts, timeDelimiter, am_pm, true); + return ret; +} /********************************************************************************************\ Time computations for rules. diff --git a/src/src/Helpers/ESPEasy_time_calc.h b/src/src/Helpers/ESPEasy_time_calc.h index 1b2eb714e..d71fbfc46 100644 --- a/src/src/Helpers/ESPEasy_time_calc.h +++ b/src/src/Helpers/ESPEasy_time_calc.h @@ -69,6 +69,26 @@ uint8_t getMonthDays(int year, uint8_t month); uint32_t makeTime(const struct tm& tm); +void breakTime(unsigned long timeInput, struct tm& tm); + +/********************************************************************************************\ + Unix Time formatting + \*********************************************************************************************/ + +// Format given Date separated by the given delimiter +// date format example with '-' delimiter: 2016-12-31 (YYYY-MM-DD) +String formatDateString(const struct tm& ts, char delimiter); + +// returns the current Time separated by the given delimiter +// time format example with ':' delimiter: 23:59:59 (HH:MM:SS) +String formatTimeString(const struct tm& ts, char delimiter, bool am_pm, bool show_seconds, char hour_prefix = '\0'); + +// returns the current Date and Time separated by the given delimiter +// if called like this: getDateTimeString('\0', '\0', '\0'); +// it will give back this: 20161231235959 (YYYYMMDDHHMMSS) +String formatDateTimeString(const struct tm& ts, char dateDelimiter = '-', char timeDelimiter = ':', char dateTimeDelimiter = ' ', bool am_pm = false); + + /********************************************************************************************\ Time computations for rules. \*********************************************************************************************/ diff --git a/src/src/Helpers/ESPEasy_time_zone.cpp b/src/src/Helpers/ESPEasy_time_zone.cpp index e6202e3e9..bb56c1ceb 100644 --- a/src/src/Helpers/ESPEasy_time_zone.cpp +++ b/src/src/Helpers/ESPEasy_time_zone.cpp @@ -62,8 +62,8 @@ void ESPEasy_time_zone::logTimeZoneInfo() { if (m_dstLoc != 0) { struct tm tmp; - ESPEasy_time::breakTime(m_dstLoc, tmp); - log += ESPEasy_time::getDateTimeString(tmp, '-', ':', ' ', false); + breakTime(m_dstLoc, tmp); + log += formatDateTimeString(tmp, '-', ':', ' ', false); } log += F(" offset: "); log += m_dst.offset; @@ -75,8 +75,8 @@ void ESPEasy_time_zone::logTimeZoneInfo() { if (m_stdLoc != 0) { struct tm tmp; - ESPEasy_time::breakTime(m_stdLoc, tmp); - log += ESPEasy_time::getDateTimeString(tmp, '-', ':', ' ', false); + breakTime(m_stdLoc, tmp); + log += formatDateTimeString(tmp, '-', ':', ' ', false); } log += F(" offset: "); log += m_std.offset; diff --git a/src/src/Helpers/FS_Helper.h b/src/src/Helpers/FS_Helper.h index 2a982b4d6..4d491ae63 100644 --- a/src/src/Helpers/FS_Helper.h +++ b/src/src/Helpers/FS_Helper.h @@ -8,9 +8,35 @@ // Macro used to make file system operations a bit more readable. #define SPIFFS_CHECK(result, fname) if (!(result)) { return(FileError(__LINE__, fname)); } -#ifndef FS_NO_GLOBALS - #define FS_NO_GLOBALS +#ifdef USE_LITTLEFS + #ifdef ESP32 + #if ESP_IDF_VERSION_MAJOR >= 4 + #include + #define ESPEASY_FS LittleFS + #else + #include + #define ESPEASY_FS LITTLEFS + #endif + #else + #include + #define ESPEASY_FS LittleFS + #endif +#else + #ifdef ESP32 + #include + #endif + #define ESPEASY_FS SPIFFS #endif + + +#include +#if FEATURE_SD +#include +#else +using namespace fs; +#endif + + #if defined(ESP8266) extern "C" { #include diff --git a/src/src/Helpers/Hardware.cpp b/src/src/Helpers/Hardware.cpp index a6bafe1b7..c4fa6f72c 100644 --- a/src/src/Helpers/Hardware.cpp +++ b/src/src/Helpers/Hardware.cpp @@ -19,6 +19,13 @@ #include "../Helpers/StringConverter.h" +#if defined(ESP8266) + # include +#endif // if defined(ESP8266) +#if defined(ESP32) + # include +#endif // if defined(ESP32) + // #include "../../ESPEasy-Globals.h" #ifdef ESP32 @@ -49,6 +56,10 @@ # include #endif // if FEATURE_SD + +#include +#include + /********************************************************************************************\ * Initialize specific hardware settings (only global ones, others are set through devices) \*********************************************************************************************/ diff --git a/src/src/Helpers/Networking.cpp b/src/src/Helpers/Networking.cpp index c43d8e459..bb15ddc2e 100644 --- a/src/src/Helpers/Networking.cpp +++ b/src/src/Helpers/Networking.cpp @@ -1223,7 +1223,7 @@ String get_user_agent_string() { userAgent.reserve(agent_size); userAgent += F("ESP Easy/"); - userAgent += BUILD; + userAgent += get_build_nr(); userAgent += '/'; userAgent += get_build_date(); userAgent += ' '; diff --git a/src/src/Helpers/OTA.cpp b/src/src/Helpers/OTA.cpp index 624bea983..fba3e3335 100644 --- a/src/src/Helpers/OTA.cpp +++ b/src/src/Helpers/OTA.cpp @@ -5,6 +5,7 @@ #include "../Globals/SecuritySettings.h" #include "../Globals/Services.h" #include "../Globals/Settings.h" +#include "../Helpers/FS_Helper.h" #include "../Helpers/Hardware.h" #include "../Helpers/Misc.h" diff --git a/src/src/Helpers/PeriodicalActions.cpp b/src/src/Helpers/PeriodicalActions.cpp index 31543222b..4557f3e16 100644 --- a/src/src/Helpers/PeriodicalActions.cpp +++ b/src/src/Helpers/PeriodicalActions.cpp @@ -28,6 +28,7 @@ #include "../Globals/Statistics.h" #include "../Globals/WiFi_AP_Candidates.h" #include "../Helpers/ESPEasyRTC.h" +#include "../Helpers/FS_Helper.h" #include "../Helpers/Hardware.h" #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" diff --git a/src/src/Helpers/Scheduler.cpp b/src/src/Helpers/Scheduler.cpp index 730749d06..f0d95df1e 100644 --- a/src/src/Helpers/Scheduler.cpp +++ b/src/src/Helpers/Scheduler.cpp @@ -915,9 +915,7 @@ void ESPEasy_Scheduler::process_gpio_timer(unsigned long id) { uint8_t pinNumber = static_cast((id >> 8) & 0xFF); uint8_t pinStateValue = static_cast((id >> 16) & 0xFF); - bool success = true; - - uint8_t pluginID; + uint8_t pluginID = PLUGIN_GPIO; switch (GPIOType) { @@ -925,35 +923,37 @@ void ESPEasy_Scheduler::process_gpio_timer(unsigned long id) { GPIO_Internal_Write(pinNumber, pinStateValue); pluginID = PLUGIN_GPIO; break; +#ifdef USES_P009 case GPIO_TYPE_MCP: GPIO_MCP_Write(pinNumber, pinStateValue); pluginID = PLUGIN_MCP; break; +#endif +#ifdef USES_P019 case GPIO_TYPE_PCF: GPIO_PCF_Write(pinNumber, pinStateValue); pluginID = PLUGIN_PCF; break; +#endif default: - success = false; + return; } - if (success) { - const uint32_t key = createKey(pluginID, pinNumber); + const uint32_t key = createKey(pluginID, pinNumber); - // WARNING: operator [] creates an entry in the map if key does not exist - portStatusStruct tempStatus = globalMapPortStatus[key]; + // WARNING: operator [] creates an entry in the map if key does not exist + portStatusStruct tempStatus = globalMapPortStatus[key]; - tempStatus.mode = PIN_MODE_OUTPUT; - tempStatus.command = 1; // set to 1 in order to display the status in the PinStatus page + tempStatus.mode = PIN_MODE_OUTPUT; + tempStatus.command = 1; // set to 1 in order to display the status in the PinStatus page - if (tempStatus.state != pinStateValue) { - tempStatus.state = pinStateValue; - tempStatus.output = pinStateValue; - tempStatus.forceEvent = 1; - tempStatus.forceMonitor = 1; - } - savePortStatus(key, tempStatus); + if (tempStatus.state != pinStateValue) { + tempStatus.state = pinStateValue; + tempStatus.output = pinStateValue; + tempStatus.forceEvent = 1; + tempStatus.forceMonitor = 1; } + savePortStatus(key, tempStatus); } /*********************************************************************************************\ diff --git a/src/src/Helpers/StringGenerator_System.cpp b/src/src/Helpers/StringGenerator_System.cpp index 98a7ddaf7..cea5fb7cb 100644 --- a/src/src/Helpers/StringGenerator_System.cpp +++ b/src/src/Helpers/StringGenerator_System.cpp @@ -1,10 +1,12 @@ #include "../Helpers/StringGenerator_System.h" +#include "../Helpers/ESPEasy_time_calc.h" /*********************************************************************************************\ ESPEasy specific strings \*********************************************************************************************/ +#include "../CustomBuild/CompiletimeDefines.h" #if FEATURE_MQTT @@ -138,7 +140,7 @@ String getResetReasonString(uint8_t icore) { return reason; } - return getUnknownString(); + return F("Unknown"); } #endif // ifdef ESP32 @@ -158,12 +160,21 @@ String getResetReasonString() { } String getSystemBuildString() { - String result; + return formatSystemBuildNr(get_build_nr()); +} - result += BUILD; - result += ' '; - result += F(BUILD_NOTES); - return result; +String formatSystemBuildNr(uint16_t buildNr) { + if (buildNr < 20200) return String(buildNr); + + // Build NR is used as a "revision" nr for settings + // As of 2022-08-18, it is the nr of days since 2022-08-18 + 20200 + const uint32_t seconds_since_start = (buildNr - 20200) * 86400; + const uint32_t unix_time_start = 1660780800; // Thu Aug 18 2022 00:00:00 GMT+0000 + struct tm build_time; + breakTime(unix_time_start + seconds_since_start, build_time); + + String res = formatDateString(build_time, '\0'); + return res; } String getPluginDescriptionString() { @@ -231,3 +242,4 @@ String getLWIPversion() { } #endif // ifdef ESP8266 + diff --git a/src/src/Helpers/StringGenerator_System.h b/src/src/Helpers/StringGenerator_System.h index b16c744ac..aa3ff622f 100644 --- a/src/src/Helpers/StringGenerator_System.h +++ b/src/src/Helpers/StringGenerator_System.h @@ -29,6 +29,8 @@ String getResetReasonString(); String getSystemBuildString(); +String formatSystemBuildNr(uint16_t buildNr); + String getPluginDescriptionString(); String getSystemLibraryString(); diff --git a/src/src/Helpers/StringParser.cpp b/src/src/Helpers/StringParser.cpp index e133d9839..0ef9fe3fd 100644 --- a/src/src/Helpers/StringParser.cpp +++ b/src/src/Helpers/StringParser.cpp @@ -391,10 +391,10 @@ void transformValue( break; } case 'F': // FLOOR (round down) - value = static_cast(floorf(valFloat)); + value = static_cast(floor(valFloat)); break; case 'E': // CEILING (round up) - value = static_cast(ceilf(valFloat)); + value = static_cast(ceil(valFloat)); break; default: value = F("ERR"); diff --git a/src/src/Helpers/StringProvider.cpp b/src/src/Helpers/StringProvider.cpp index 8f3a63371..b0fa5648c 100644 --- a/src/src/Helpers/StringProvider.cpp +++ b/src/src/Helpers/StringProvider.cpp @@ -308,20 +308,20 @@ String getValue(LabelType::Enum label) { case LabelType::WIFI_CONNECTION: break; case LabelType::WIFI_RSSI: return String(WiFi.RSSI()); - case LabelType::IP_CONFIG: return useStaticIP() ? getLabel(LabelType::IP_CONFIG_STATIC) : getLabel( - LabelType::IP_CONFIG_DYNAMIC); + case LabelType::IP_CONFIG: return String(useStaticIP() ? getLabel(LabelType::IP_CONFIG_STATIC) : getLabel( + LabelType::IP_CONFIG_DYNAMIC)); case LabelType::IP_CONFIG_STATIC: break; case LabelType::IP_CONFIG_DYNAMIC: break; case LabelType::IP_ADDRESS: return NetworkLocalIP().toString(); case LabelType::IP_SUBNET: return NetworkSubnetMask().toString(); - case LabelType::IP_ADDRESS_SUBNET: return String(getValue(LabelType::IP_ADDRESS) + F(" / ") + getValue(LabelType::IP_SUBNET)); + case LabelType::IP_ADDRESS_SUBNET: return getValue(LabelType::IP_ADDRESS) + F(" / ") + getValue(LabelType::IP_SUBNET); case LabelType::GATEWAY: return NetworkGatewayIP().toString(); case LabelType::CLIENT_IP: return formatIP(web_server.client().remoteIP()); #if FEATURE_MDNS - case LabelType::M_DNS: return String(NetworkGetHostname()) + F(".local"); + case LabelType::M_DNS: return NetworkGetHostname() + F(".local"); #endif // if FEATURE_MDNS - case LabelType::DNS: return String(getValue(LabelType::DNS_1) + F(" / ") + getValue(LabelType::DNS_2)); + case LabelType::DNS: return getValue(LabelType::DNS_1) + F(" / ") + getValue(LabelType::DNS_2); case LabelType::DNS_1: return NetworkDnsIP(0).toString(); case LabelType::DNS_2: return NetworkDnsIP(1).toString(); case LabelType::ALLOWED_IP_RANGE: return describeAllowedIPrange(); @@ -361,7 +361,7 @@ String getValue(LabelType::Enum label) { case LabelType::PERIODICAL_GRAT_ARP: return jsonBool(Settings.gratuitousARP()); case LabelType::CONNECTION_FAIL_THRESH: return String(Settings.ConnectionFailuresThreshold); - case LabelType::BUILD_DESC: return String(BUILD); + case LabelType::BUILD_DESC: return getSystemBuildString(); case LabelType::GIT_BUILD: { const String res(F(BUILD_GIT)); diff --git a/src/src/Helpers/SystemVariables.cpp b/src/src/Helpers/SystemVariables.cpp index 73293653d..083db4228 100644 --- a/src/src/Helpers/SystemVariables.cpp +++ b/src/src/Helpers/SystemVariables.cpp @@ -31,6 +31,14 @@ #include "../Helpers/StringProvider.h" +#if defined(ESP8266) + # include +#endif // if defined(ESP8266) +#if defined(ESP32) + # include +#endif // if defined(ESP32) + + String getReplacementString(const String& format, String& s) { int startpos = s.indexOf(format); int endpos = s.indexOf('%', startpos + 1); diff --git a/src/src/Helpers/WiFi_AP_CandidatesList.cpp b/src/src/Helpers/WiFi_AP_CandidatesList.cpp index a42703e2a..c5642383a 100644 --- a/src/src/Helpers/WiFi_AP_CandidatesList.cpp +++ b/src/src/Helpers/WiFi_AP_CandidatesList.cpp @@ -7,6 +7,13 @@ #include "../Helpers/Misc.h" +#if defined(ESP8266) + # include +#endif // if defined(ESP8266) +#if defined(ESP32) + # include +#endif // if defined(ESP32) + #define WIFI_CUSTOM_DEPLOYMENT_KEY_INDEX 3 #define WIFI_CUSTOM_SUPPORT_KEY_INDEX 4 #define WIFI_CREDENTIALS_FALLBACK_SSID_INDEX 5 @@ -18,6 +25,13 @@ WiFi_AP_CandidatesList::WiFi_AP_CandidatesList() { load_knownCredentials(); } +WiFi_AP_CandidatesList::~WiFi_AP_CandidatesList() { + candidates.clear(); + known.clear(); + scanned.clear(); + scanned_new.clear(); +} + void WiFi_AP_CandidatesList::load_knownCredentials() { if (!_mustLoadCredentials) { return; } _mustLoadCredentials = false; diff --git a/src/src/Helpers/WiFi_AP_CandidatesList.h b/src/src/Helpers/WiFi_AP_CandidatesList.h index b2ea571ef..609b61334 100644 --- a/src/src/Helpers/WiFi_AP_CandidatesList.h +++ b/src/src/Helpers/WiFi_AP_CandidatesList.h @@ -12,6 +12,8 @@ typedef std::list::const_iterator WiFi_AP_Candidate_const_ite struct WiFi_AP_CandidatesList { WiFi_AP_CandidatesList(); + ~WiFi_AP_CandidatesList(); + // Load the known credentials from the settings void load_knownCredentials(); diff --git a/src/src/Helpers/_CPlugin_Helper_webform.cpp b/src/src/Helpers/_CPlugin_Helper_webform.cpp index c8840c25e..e651860aa 100644 --- a/src/src/Helpers/_CPlugin_Helper_webform.cpp +++ b/src/src/Helpers/_CPlugin_Helper_webform.cpp @@ -9,7 +9,7 @@ #include "../Globals/Settings.h" #include "../Helpers/_CPlugin_Helper.h" #include "../Helpers/Networking.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Forms.h" diff --git a/src/src/PluginStructs/P012_data_struct.cpp b/src/src/PluginStructs/P012_data_struct.cpp index 22eae2065..c5955bc06 100644 --- a/src/src/PluginStructs/P012_data_struct.cpp +++ b/src/src/PluginStructs/P012_data_struct.cpp @@ -1,10 +1,11 @@ #include "../PluginStructs/P012_data_struct.h" +#ifdef USES_P012 + // Needed also here for PlatformIO's library finder as the .h file // is in a directory which is excluded in the src_filter #include -#ifdef USES_P012 P012_data_struct::P012_data_struct(uint8_t addr, uint8_t lcd_size, diff --git a/src/src/PluginStructs/P037_data_struct.cpp b/src/src/PluginStructs/P037_data_struct.cpp index ad5ae5a0c..aeaf7f38d 100644 --- a/src/src/PluginStructs/P037_data_struct.cpp +++ b/src/src/PluginStructs/P037_data_struct.cpp @@ -6,7 +6,7 @@ # include "../Helpers/Numerical.h" # include "../Helpers/RulesMatcher.h" # include "../WebServer/Markup_Forms.h" -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../WebServer/Markup.h" # include "../WebServer/HTML_wrappers.h" # include "../ESPEasyCore/ESPEasyRules.h" @@ -989,7 +989,7 @@ bool P037_data_struct::parseJSONMessage(const String& message) { } if (nullptr != root) { - deserializeJson(*root, message.c_str()); + deserializeJson(*root, message); if (!root->isNull()) { result = true; diff --git a/src/src/PluginStructs/P057_data_struct.cpp b/src/src/PluginStructs/P057_data_struct.cpp index 9737765e3..19a8d2b4f 100644 --- a/src/src/PluginStructs/P057_data_struct.cpp +++ b/src/src/PluginStructs/P057_data_struct.cpp @@ -1,11 +1,11 @@ #include "../PluginStructs/P057_data_struct.h" +#ifdef USES_P057 // Needed also here for PlatformIO's library finder as the .h file // is in a directory which is excluded in the src_filter # include -#ifdef USES_P057 P057_data_struct::P057_data_struct(uint8_t i2c_addr) : i2cAddress(i2c_addr) { ledMatrix.Init(i2cAddress); diff --git a/src/src/PluginStructs/P058_data_struct.cpp b/src/src/PluginStructs/P058_data_struct.cpp index 4dd3ed53b..4c0a8f0eb 100644 --- a/src/src/PluginStructs/P058_data_struct.cpp +++ b/src/src/PluginStructs/P058_data_struct.cpp @@ -1,11 +1,12 @@ #include "../PluginStructs/P058_data_struct.h" +#ifdef USES_P058 + // Needed also here for PlatformIO's library finder as the .h file // is in a directory which is excluded in the src_filter # include -#ifdef USES_P058 P058_data_struct::P058_data_struct(uint8_t i2c_addr) { keyPad.Init(i2c_addr); diff --git a/src/src/PluginStructs/P064_data_struct.cpp b/src/src/PluginStructs/P064_data_struct.cpp index 304048797..6c97f5b58 100644 --- a/src/src/PluginStructs/P064_data_struct.cpp +++ b/src/src/PluginStructs/P064_data_struct.cpp @@ -1,11 +1,11 @@ #include "../PluginStructs/P064_data_struct.h" +#ifdef USES_P064 + // Needed also here for PlatformIO's library finder as the .h file // is in a directory which is excluded in the src_filter #include // Lib is modified to work with ESP -#ifdef USES_P064 - P064_data_struct::P064_data_struct() {} diff --git a/src/src/PluginStructs/P081_data_struct.cpp b/src/src/PluginStructs/P081_data_struct.cpp index 468badec3..5cb54b7a4 100644 --- a/src/src/PluginStructs/P081_data_struct.cpp +++ b/src/src/PluginStructs/P081_data_struct.cpp @@ -175,7 +175,7 @@ String P081_formatExecTime(taskIndex_t taskIndex, uint8_t varNr) { time_t exec_time = P081_getCronExecTime(taskIndex, varNr); if (exec_time != CRON_INVALID_INSTANT) { - return ESPEasy_time::getDateTimeString(*gmtime(&exec_time)); + return formatDateTimeString(*gmtime(&exec_time)); } return F("-"); } diff --git a/src/src/PluginStructs/P083_data_struct.cpp b/src/src/PluginStructs/P083_data_struct.cpp index 7bea9beb7..ad43c8e00 100644 --- a/src/src/PluginStructs/P083_data_struct.cpp +++ b/src/src/PluginStructs/P083_data_struct.cpp @@ -1,13 +1,11 @@ #include "../PluginStructs/P083_data_struct.h" +#ifdef USES_P083 // Needed also here for PlatformIO's library finder as the .h file // is in a directory which is excluded in the src_filter #include - -#ifdef USES_P083 - P083_data_struct::P083_data_struct() { initialized = sgp.begin(); init_time = millis(); diff --git a/src/src/PluginStructs/P095_data_struct.cpp b/src/src/PluginStructs/P095_data_struct.cpp index 9308e1265..ec7c71a27 100644 --- a/src/src/PluginStructs/P095_data_struct.cpp +++ b/src/src/PluginStructs/P095_data_struct.cpp @@ -6,7 +6,7 @@ /**************************************************************************** * ILI9xxx_type_toString: Display-value for the device selected ***************************************************************************/ -const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { +const __FlashStringHelper* ILI9xxx_type_toString(const ILI9xxx_type_e& device) { switch (device) { case ILI9xxx_type_e::ILI9341_240x320: return F("ILI9341 240 x 320px"); case ILI9xxx_type_e::ILI9342_240x320: return F("ILI9342 240 x 320px (M5Stack)"); @@ -34,7 +34,9 @@ const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device) { /**************************************************************************** * ILI9xxx_type_toResolution: X and Y resolution for the selected type ***************************************************************************/ -void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) { +void ILI9xxx_type_toResolution(const ILI9xxx_type_e& device, + uint16_t & x, + uint16_t & y) { switch (device) { case ILI9xxx_type_e::ILI9341_240x320: case ILI9xxx_type_e::ILI9342_240x320: @@ -64,7 +66,7 @@ void ILI9xxx_type_toResolution(ILI9xxx_type_e device, uint16_t& x, uint16_t& y) /**************************************************************************** * P095_CommandTrigger_toString: return the command string selected ***************************************************************************/ -const __FlashStringHelper* P095_CommandTrigger_toString(P095_CommandTrigger cmd) { +const __FlashStringHelper* P095_CommandTrigger_toString(const P095_CommandTrigger& cmd) { switch (cmd) { case P095_CommandTrigger::tft: return F("tft"); case P095_CommandTrigger::ili9341: return F("ili9341"); @@ -414,6 +416,23 @@ bool P095_data_struct::plugin_write(struct EventStruct *event, const String& str return success; } +# if ADAGFX_ENABLE_GET_CONFIG_VALUE + +/**************************************************************************** + * plugin_get_config_value: Retrieve values like [#] + ***************************************************************************/ +bool P095_data_struct::plugin_get_config_value(struct EventStruct *event, + String & string) { + bool success = false; + + if (gfxHelper != nullptr) { + success = gfxHelper->pluginGetConfigValue(string); + } + return success; +} + +# endif // if ADAGFX_ENABLE_GET_CONFIG_VALUE + /**************************************************************************** * displayOnOff: Turn display on or off ***************************************************************************/ @@ -434,7 +453,8 @@ void P095_data_struct::displayOnOff(bool state) { /**************************************************************************** * registerButtonState: the button has been pressed, apply some debouncing ***************************************************************************/ -void P095_data_struct::registerButtonState(uint8_t newButtonState, bool bPin3Invers) { +void P095_data_struct::registerButtonState(const uint8_t& newButtonState, + const bool & bPin3Invers) { if ((ButtonLastState == 0xFF) || (bPin3Invers != (!!newButtonState))) { ButtonLastState = newButtonState; DebounceCounter++; diff --git a/src/src/PluginStructs/P095_data_struct.h b/src/src/PluginStructs/P095_data_struct.h index 2a7347885..72d3caed6 100644 --- a/src/src/PluginStructs/P095_data_struct.h +++ b/src/src/PluginStructs/P095_data_struct.h @@ -101,11 +101,11 @@ enum class P095_CommandTrigger : uint8_t { MAX // Keep as last item! }; -const __FlashStringHelper* ILI9xxx_type_toString(ILI9xxx_type_e device); -const __FlashStringHelper* P095_CommandTrigger_toString(P095_CommandTrigger cmd); -void ILI9xxx_type_toResolution(ILI9xxx_type_e device, - uint16_t & x, - uint16_t & y); +const __FlashStringHelper* ILI9xxx_type_toString(const ILI9xxx_type_e& device); +const __FlashStringHelper* P095_CommandTrigger_toString(const P095_CommandTrigger& cmd); +void ILI9xxx_type_toResolution(const ILI9xxx_type_e& device, + uint16_t & x, + uint16_t & y); struct P095_data_struct : public PluginTaskData_base { public: @@ -128,11 +128,15 @@ public: bool plugin_read(struct EventStruct *event); bool plugin_write(struct EventStruct *event, const String & string); + # if ADAGFX_ENABLE_GET_CONFIG_VALUE + bool plugin_get_config_value(struct EventStruct *event, + String & string); + # endif // if ADAGFX_ENABLE_GET_CONFIG_VALUE bool plugin_ten_per_second(struct EventStruct *event); bool plugin_once_a_second(struct EventStruct *event); - void registerButtonState(uint8_t newButtonState, - bool bPin3Invers); + void registerButtonState(const uint8_t& newButtonState, + const bool & bPin3Invers); void markButtonStateProcessed(); bool getButtonState() { return ButtonState; diff --git a/src/src/PluginStructs/P104_data_struct.cpp b/src/src/PluginStructs/P104_data_struct.cpp index 3d2f0f75a..32756c824 100644 --- a/src/src/PluginStructs/P104_data_struct.cpp +++ b/src/src/PluginStructs/P104_data_struct.cpp @@ -5,7 +5,7 @@ # include "../Helpers/ESPEasy_Storage.h" # include "../Helpers/Numerical.h" # include "../WebServer/Markup_Forms.h" -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../WebServer/Markup.h" # include "../WebServer/HTML_wrappers.h" # include "../ESPEasyCore/ESPEasyRules.h" diff --git a/src/src/Static/Fonts/AmerikaSans16pt7b.h b/src/src/Static/Fonts/AmerikaSans16pt7b.h index d98ffd03f..138bb4538 100644 --- a/src/src/Static/Fonts/AmerikaSans16pt7b.h +++ b/src/src/Static/Fonts/AmerikaSans16pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_AMERIKASANS16PT7B_H +#define FONTS_AMERIKASANS16PT7B_H const uint8_t AmerikaSans16pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0xE6, 0x66, 0x66, 0x66, 0x66, 0x66, 0xFF, 0x60, 0xE7, 0x66, 0x66, 0x66, 0x66, 0x66, 0x62, 0x03, 0x0C, 0x02, 0x08, @@ -302,105 +304,106 @@ const uint8_t AmerikaSans16pt7bBitmaps[] PROGMEM = { 0x3E, 0x0B, 0xFF, 0xF0, 0x7C, 0x01, 0xC0 }; const GFXglyph AmerikaSans16pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 11, 0, 0 }, // 0x20 ' ' - { 1, 4, 23, 7, 2, -22 }, // 0x21 '!' - { 13, 8, 7, 9, 1, -22 }, // 0x22 '"' - { 20, 16, 15, 18, 1, -22 }, // 0x23 '#' - { 50, 13, 23, 15, 1, -22 }, // 0x24 '$' - { 88, 24, 23, 27, 2, -22 }, // 0x25 '%' - { 157, 17, 23, 19, 2, -22 }, // 0x26 '&' - { 206, 3, 7, 5, 1, -22 }, // 0x27 ''' - { 209, 10, 27, 10, 1, -24 }, // 0x28 '(' - { 243, 10, 27, 10, -1, -24 }, // 0x29 ')' - { 277, 10, 11, 13, 2, -22 }, // 0x2A '*' - { 291, 14, 14, 16, 1, -17 }, // 0x2B '+' - { 316, 4, 8, 7, 2, -3 }, // 0x2C ',' - { 320, 8, 2, 12, 2, -8 }, // 0x2D '-' - { 322, 4, 4, 6, 1, -3 }, // 0x2E '.' - { 324, 18, 26, 15, -1, -23 }, // 0x2F '/' - { 383, 18, 23, 21, 2, -22 }, // 0x30 '0' - { 435, 7, 23, 9, 1, -22 }, // 0x31 '1' - { 456, 16, 23, 18, 1, -22 }, // 0x32 '2' - { 502, 14, 23, 17, 2, -22 }, // 0x33 '3' - { 543, 17, 23, 19, 1, -22 }, // 0x34 '4' - { 592, 15, 23, 16, 1, -22 }, // 0x35 '5' - { 636, 16, 23, 19, 2, -22 }, // 0x36 '6' - { 682, 14, 23, 17, 2, -22 }, // 0x37 '7' - { 723, 16, 23, 19, 2, -22 }, // 0x38 '8' - { 769, 16, 23, 19, 2, -22 }, // 0x39 '9' - { 815, 4, 12, 6, 1, -11 }, // 0x3A ':' - { 821, 4, 16, 6, 1, -11 }, // 0x3B ';' - { 829, 15, 14, 16, 1, -15 }, // 0x3C '<' - { 856, 12, 8, 13, 1, -13 }, // 0x3D '=' - { 868, 15, 14, 16, 1, -15 }, // 0x3E '>' - { 895, 15, 23, 17, 1, -22 }, // 0x3F '?' - { 939, 27, 27, 30, 2, -22 }, // 0x40 '@' - { 1031, 18, 23, 21, 2, -22 }, // 0x41 'A' - { 1083, 16, 23, 17, 1, -22 }, // 0x42 'B' - { 1129, 21, 23, 23, 2, -22 }, // 0x43 'C' - { 1190, 18, 23, 20, 1, -22 }, // 0x44 'D' - { 1242, 16, 23, 18, 1, -22 }, // 0x45 'E' - { 1288, 12, 23, 14, 2, -22 }, // 0x46 'F' - { 1323, 19, 29, 22, 2, -22 }, // 0x47 'G' - { 1392, 15, 23, 17, 1, -22 }, // 0x48 'H' - { 1436, 4, 23, 6, 1, -22 }, // 0x49 'I' - { 1448, 10, 29, 7, -4, -22 }, // 0x4A 'J' - { 1485, 17, 23, 19, 1, -22 }, // 0x4B 'K' - { 1534, 16, 23, 18, 1, -22 }, // 0x4C 'L' - { 1580, 24, 26, 26, 1, -25 }, // 0x4D 'M' - { 1658, 19, 23, 21, 1, -22 }, // 0x4E 'N' - { 1713, 19, 23, 21, 1, -22 }, // 0x4F 'O' - { 1768, 19, 23, 20, 1, -22 }, // 0x50 'P' - { 1823, 19, 29, 21, 1, -22 }, // 0x51 'Q' - { 1892, 20, 23, 22, 1, -22 }, // 0x52 'R' - { 1950, 16, 23, 18, 1, -22 }, // 0x53 'S' - { 1996, 20, 23, 20, 0, -22 }, // 0x54 'T' - { 2054, 19, 23, 21, 1, -22 }, // 0x55 'U' - { 2109, 21, 23, 22, 1, -22 }, // 0x56 'V' - { 2170, 24, 23, 26, 1, -22 }, // 0x57 'W' - { 2239, 16, 23, 19, 2, -22 }, // 0x58 'X' - { 2285, 19, 23, 21, 1, -22 }, // 0x59 'Y' - { 2340, 21, 23, 22, 1, -22 }, // 0x5A 'Z' - { 2401, 9, 23, 11, 2, -22 }, // 0x5B '[' - { 2427, 18, 27, 15, -1, -24 }, // 0x5C '\' - { 2488, 9, 23, 11, 1, -22 }, // 0x5D ']' - { 2514, 12, 8, 13, 1, -21 }, // 0x5E '^' - { 2526, 12, 2, 13, 1, 0 }, // 0x5F '_' - { 2529, 8, 5, 20, 6, -30 }, // 0x60 '`' - { 2534, 17, 16, 18, 1, -15 }, // 0x61 'a' - { 2568, 16, 23, 18, 2, -22 }, // 0x62 'b' - { 2614, 14, 16, 17, 2, -15 }, // 0x63 'c' - { 2642, 17, 23, 18, 1, -22 }, // 0x64 'd' - { 2691, 15, 15, 18, 2, -14 }, // 0x65 'e' - { 2720, 12, 29, 14, 1, -22 }, // 0x66 'f' - { 2764, 19, 21, 21, 1, -14 }, // 0x67 'g' - { 2814, 15, 23, 18, 2, -22 }, // 0x68 'h' - { 2858, 5, 23, 7, 2, -22 }, // 0x69 'i' - { 2873, 10, 29, 7, -3, -22 }, // 0x6A 'j' - { 2910, 17, 29, 20, 2, -22 }, // 0x6B 'k' - { 2972, 9, 23, 10, 2, -22 }, // 0x6C 'l' - { 2998, 28, 16, 30, 1, -15 }, // 0x6D 'm' - { 3054, 16, 15, 18, 1, -14 }, // 0x6E 'n' - { 3084, 17, 16, 18, 1, -15 }, // 0x6F 'o' - { 3118, 17, 22, 18, 1, -15 }, // 0x70 'p' - { 3165, 19, 21, 21, 1, -14 }, // 0x71 'q' - { 3215, 11, 16, 12, 1, -15 }, // 0x72 'r' - { 3237, 11, 16, 13, 1, -15 }, // 0x73 's' - { 3259, 12, 23, 11, 0, -22 }, // 0x74 't' - { 3294, 16, 16, 18, 1, -15 }, // 0x75 'u' - { 3326, 15, 16, 16, 1, -15 }, // 0x76 'v' - { 3356, 28, 16, 30, 1, -15 }, // 0x77 'w' - { 3412, 13, 16, 16, 2, -15 }, // 0x78 'x' - { 3438, 16, 22, 18, 1, -15 }, // 0x79 'y' - { 3482, 15, 16, 17, 1, -15 }, // 0x7A 'z' - { 3512, 13, 23, 15, 1, -22 }, // 0x7B '{' - { 3550, 3, 31, 7, 2, -26 }, // 0x7C '|' - { 3562, 13, 23, 15, 1, -22 }, // 0x7D '}' - { 3600, 13, 4, 15, 1, -18 } }; // 0x7E '~' + { 0, 1, 1, 11, 0, 0 }, // 0x20 ' ' + { 1, 4, 23, 7, 2, -22 }, // 0x21 '!' + { 13, 8, 7, 9, 1, -22 }, // 0x22 '"' + { 20, 16, 15, 18, 1, -22 }, // 0x23 '#' + { 50, 13, 23, 15, 1, -22 }, // 0x24 '$' + { 88, 24, 23, 27, 2, -22 }, // 0x25 '%' + { 157, 17, 23, 19, 2, -22 }, // 0x26 '&' + { 206, 3, 7, 5, 1, -22 }, // 0x27 ''' + { 209, 10, 27, 10, 1, -24 }, // 0x28 '(' + { 243, 10, 27, 10, -1, -24 }, // 0x29 ')' + { 277, 10, 11, 13, 2, -22 }, // 0x2A '*' + { 291, 14, 14, 16, 1, -17 }, // 0x2B '+' + { 316, 4, 8, 7, 2, -3 }, // 0x2C ',' + { 320, 8, 2, 12, 2, -8 }, // 0x2D '-' + { 322, 4, 4, 6, 1, -3 }, // 0x2E '.' + { 324, 18, 26, 15, -1, -23 }, // 0x2F '/' + { 383, 18, 23, 21, 2, -22 }, // 0x30 '0' + { 435, 7, 23, 9, 1, -22 }, // 0x31 '1' + { 456, 16, 23, 18, 1, -22 }, // 0x32 '2' + { 502, 14, 23, 17, 2, -22 }, // 0x33 '3' + { 543, 17, 23, 19, 1, -22 }, // 0x34 '4' + { 592, 15, 23, 16, 1, -22 }, // 0x35 '5' + { 636, 16, 23, 19, 2, -22 }, // 0x36 '6' + { 682, 14, 23, 17, 2, -22 }, // 0x37 '7' + { 723, 16, 23, 19, 2, -22 }, // 0x38 '8' + { 769, 16, 23, 19, 2, -22 }, // 0x39 '9' + { 815, 4, 12, 6, 1, -11 }, // 0x3A ':' + { 821, 4, 16, 6, 1, -11 }, // 0x3B ';' + { 829, 15, 14, 16, 1, -15 }, // 0x3C '<' + { 856, 12, 8, 13, 1, -13 }, // 0x3D '=' + { 868, 15, 14, 16, 1, -15 }, // 0x3E '>' + { 895, 15, 23, 17, 1, -22 }, // 0x3F '?' + { 939, 27, 27, 30, 2, -22 }, // 0x40 '@' + { 1031, 18, 23, 21, 2, -22 }, // 0x41 'A' + { 1083, 16, 23, 17, 1, -22 }, // 0x42 'B' + { 1129, 21, 23, 23, 2, -22 }, // 0x43 'C' + { 1190, 18, 23, 20, 1, -22 }, // 0x44 'D' + { 1242, 16, 23, 18, 1, -22 }, // 0x45 'E' + { 1288, 12, 23, 14, 2, -22 }, // 0x46 'F' + { 1323, 19, 29, 22, 2, -22 }, // 0x47 'G' + { 1392, 15, 23, 17, 1, -22 }, // 0x48 'H' + { 1436, 4, 23, 6, 1, -22 }, // 0x49 'I' + { 1448, 10, 29, 7, -4, -22 }, // 0x4A 'J' + { 1485, 17, 23, 19, 1, -22 }, // 0x4B 'K' + { 1534, 16, 23, 18, 1, -22 }, // 0x4C 'L' + { 1580, 24, 26, 26, 1, -25 }, // 0x4D 'M' + { 1658, 19, 23, 21, 1, -22 }, // 0x4E 'N' + { 1713, 19, 23, 21, 1, -22 }, // 0x4F 'O' + { 1768, 19, 23, 20, 1, -22 }, // 0x50 'P' + { 1823, 19, 29, 21, 1, -22 }, // 0x51 'Q' + { 1892, 20, 23, 22, 1, -22 }, // 0x52 'R' + { 1950, 16, 23, 18, 1, -22 }, // 0x53 'S' + { 1996, 20, 23, 20, 0, -22 }, // 0x54 'T' + { 2054, 19, 23, 21, 1, -22 }, // 0x55 'U' + { 2109, 21, 23, 22, 1, -22 }, // 0x56 'V' + { 2170, 24, 23, 26, 1, -22 }, // 0x57 'W' + { 2239, 16, 23, 19, 2, -22 }, // 0x58 'X' + { 2285, 19, 23, 21, 1, -22 }, // 0x59 'Y' + { 2340, 21, 23, 22, 1, -22 }, // 0x5A 'Z' + { 2401, 9, 23, 11, 2, -22 }, // 0x5B '[' + { 2427, 18, 27, 15, -1, -24 }, // 0x5C '\' + { 2488, 9, 23, 11, 1, -22 }, // 0x5D ']' + { 2514, 12, 8, 13, 1, -21 }, // 0x5E '^' + { 2526, 12, 2, 13, 1, 0 }, // 0x5F '_' + { 2529, 8, 5, 20, 6, -30 }, // 0x60 '`' + { 2534, 17, 16, 18, 1, -15 }, // 0x61 'a' + { 2568, 16, 23, 18, 2, -22 }, // 0x62 'b' + { 2614, 14, 16, 17, 2, -15 }, // 0x63 'c' + { 2642, 17, 23, 18, 1, -22 }, // 0x64 'd' + { 2691, 15, 15, 18, 2, -14 }, // 0x65 'e' + { 2720, 12, 29, 14, 1, -22 }, // 0x66 'f' + { 2764, 19, 21, 21, 1, -14 }, // 0x67 'g' + { 2814, 15, 23, 18, 2, -22 }, // 0x68 'h' + { 2858, 5, 23, 7, 2, -22 }, // 0x69 'i' + { 2873, 10, 29, 7, -3, -22 }, // 0x6A 'j' + { 2910, 17, 29, 20, 2, -22 }, // 0x6B 'k' + { 2972, 9, 23, 10, 2, -22 }, // 0x6C 'l' + { 2998, 28, 16, 30, 1, -15 }, // 0x6D 'm' + { 3054, 16, 15, 18, 1, -14 }, // 0x6E 'n' + { 3084, 17, 16, 18, 1, -15 }, // 0x6F 'o' + { 3118, 17, 22, 18, 1, -15 }, // 0x70 'p' + { 3165, 19, 21, 21, 1, -14 }, // 0x71 'q' + { 3215, 11, 16, 12, 1, -15 }, // 0x72 'r' + { 3237, 11, 16, 13, 1, -15 }, // 0x73 's' + { 3259, 12, 23, 11, 0, -22 }, // 0x74 't' + { 3294, 16, 16, 18, 1, -15 }, // 0x75 'u' + { 3326, 15, 16, 16, 1, -15 }, // 0x76 'v' + { 3356, 28, 16, 30, 1, -15 }, // 0x77 'w' + { 3412, 13, 16, 16, 2, -15 }, // 0x78 'x' + { 3438, 16, 22, 18, 1, -15 }, // 0x79 'y' + { 3482, 15, 16, 17, 1, -15 }, // 0x7A 'z' + { 3512, 13, 23, 15, 1, -22 }, // 0x7B '{' + { 3550, 3, 31, 7, 2, -26 }, // 0x7C '|' + { 3562, 13, 23, 15, 1, -22 }, // 0x7D '}' + { 3600, 13, 4, 15, 1, -18 } }; // 0x7E '~' const GFXfont AmerikaSans16pt7b PROGMEM = { (uint8_t *)AmerikaSans16pt7bBitmaps, (GFXglyph *)AmerikaSans16pt7bGlyphs, - 0x20, 0x7E, 40 }; + 0x20, 0x7E, 40 }; // Approx. 4279 bytes +#endif // ifndef FONTS_AMERIKASANS16PT7B_H diff --git a/src/src/Static/Fonts/FreeSans9pt7b.h b/src/src/Static/Fonts/FreeSans9pt7b.h index f151f326d..ea02fce7c 100644 --- a/src/src/Static/Fonts/FreeSans9pt7b.h +++ b/src/src/Static/Fonts/FreeSans9pt7b.h @@ -1,200 +1,203 @@ +#ifndef FONTS_FREESANS9PT7B_H +#define FONTS_FREESANS9PT7B_H const uint8_t FreeSans9pt7bBitmaps[] PROGMEM = { - 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, - 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, - 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, - 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, - 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, - 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, - 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, - 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, - 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, - 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, - 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, - 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, - 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, - 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, - 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, - 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, - 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, - 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, - 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, - 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, - 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, - 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, - 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, - 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, - 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, - 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, - 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, - 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, - 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, - 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, - 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, - 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, - 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, - 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, - 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, - 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, - 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, - 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, - 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, - 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, - 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, - 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, - 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, - 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, - 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, - 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, - 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, - 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, - 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, - 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, - 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, - 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, - 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, - 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, - 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, - 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, - 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, - 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, - 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, - 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, - 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, - 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, - 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, - 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, - 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, - 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, - 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, - 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, - 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, - 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, - 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, - 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, - 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, - 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, - 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, - 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, - 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, - 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, - 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, - 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, - 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, - 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, - 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, - 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, - 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, - 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, - 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, - 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, - 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, - 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, - 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, - 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38}; + 0xFF, 0xFF, 0xF8, 0xC0, 0xDE, 0xF7, 0x20, 0x09, 0x86, 0x41, 0x91, 0xFF, + 0x13, 0x04, 0xC3, 0x20, 0xC8, 0xFF, 0x89, 0x82, 0x61, 0x90, 0x10, 0x1F, + 0x14, 0xDA, 0x3D, 0x1E, 0x83, 0x40, 0x78, 0x17, 0x08, 0xF4, 0x7A, 0x35, + 0x33, 0xF0, 0x40, 0x20, 0x38, 0x10, 0xEC, 0x20, 0xC6, 0x20, 0xC6, 0x40, + 0xC6, 0x40, 0x6C, 0x80, 0x39, 0x00, 0x01, 0x3C, 0x02, 0x77, 0x02, 0x63, + 0x04, 0x63, 0x04, 0x77, 0x08, 0x3C, 0x0E, 0x06, 0x60, 0xCC, 0x19, 0x81, + 0xE0, 0x18, 0x0F, 0x03, 0x36, 0xC2, 0xD8, 0x73, 0x06, 0x31, 0xE3, 0xC4, + 0xFE, 0x13, 0x26, 0x6C, 0xCC, 0xCC, 0xC4, 0x66, 0x23, 0x10, 0x8C, 0x46, + 0x63, 0x33, 0x33, 0x32, 0x66, 0x4C, 0x80, 0x25, 0x7E, 0xA5, 0x00, 0x30, + 0xC3, 0x3F, 0x30, 0xC3, 0x0C, 0xD6, 0xF0, 0xC0, 0x08, 0x44, 0x21, 0x10, + 0x84, 0x42, 0x11, 0x08, 0x00, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0x42, 0x66, 0x3C, 0x11, 0x3F, 0x33, 0x33, 0x33, 0x33, + 0x30, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x1C, 0x1C, 0x1C, 0x18, 0x18, + 0x10, 0x08, 0x07, 0xF8, 0x3C, 0x66, 0xC3, 0xC3, 0x03, 0x06, 0x1C, 0x07, + 0x03, 0xC3, 0xC3, 0x66, 0x3C, 0x0C, 0x18, 0x71, 0x62, 0xC9, 0xA3, 0x46, + 0xFE, 0x18, 0x30, 0x60, 0xC0, 0x7F, 0x20, 0x10, 0x08, 0x08, 0x07, 0xF3, + 0x8C, 0x03, 0x01, 0x80, 0xF0, 0x6C, 0x63, 0xE0, 0x1E, 0x31, 0x98, 0x78, + 0x0C, 0x06, 0xF3, 0x8D, 0x83, 0xC1, 0xE0, 0xD0, 0x6C, 0x63, 0xE0, 0xFF, + 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x18, 0x10, 0x30, 0x30, + 0x3E, 0x31, 0xB0, 0x78, 0x3C, 0x1B, 0x18, 0xF8, 0xC6, 0xC1, 0xE0, 0xF0, + 0x6C, 0x63, 0xE0, 0x3C, 0x66, 0xC2, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x03, + 0x03, 0xC2, 0x66, 0x3C, 0xC0, 0x00, 0x30, 0xC0, 0x00, 0x00, 0x64, 0xA0, + 0x00, 0x81, 0xC7, 0x8E, 0x0C, 0x07, 0x80, 0x70, 0x0E, 0x01, 0x80, 0xFF, + 0x80, 0x00, 0x1F, 0xF0, 0x00, 0x70, 0x0E, 0x01, 0xC0, 0x18, 0x38, 0x71, + 0xC0, 0x80, 0x00, 0x3E, 0x31, 0xB0, 0x78, 0x30, 0x18, 0x18, 0x38, 0x18, + 0x18, 0x0C, 0x00, 0x00, 0x01, 0x80, 0x03, 0xF0, 0x06, 0x0E, 0x06, 0x01, + 0x86, 0x00, 0x66, 0x1D, 0xBB, 0x31, 0xCF, 0x18, 0xC7, 0x98, 0x63, 0xCC, + 0x31, 0xE6, 0x11, 0xB3, 0x99, 0xCC, 0xF7, 0x86, 0x00, 0x01, 0x80, 0x00, + 0x70, 0x40, 0x0F, 0xE0, 0x06, 0x00, 0xF0, 0x0F, 0x00, 0x90, 0x19, 0x81, + 0x98, 0x10, 0x83, 0x0C, 0x3F, 0xC2, 0x04, 0x60, 0x66, 0x06, 0xC0, 0x30, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0x3F, 0xC6, 0x06, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x6F, 0xF8, 0x1F, 0x86, 0x19, 0x81, 0xA0, 0x3C, + 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x68, 0x0D, 0x83, 0x18, 0x61, 0xF0, + 0xFF, 0x18, 0x33, 0x03, 0x60, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x78, 0x0F, 0x03, 0x60, 0xCF, 0xF0, 0xFF, 0xE0, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0xFD, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0F, 0xF8, 0xFF, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xFE, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x0F, 0x83, + 0x0E, 0x60, 0x66, 0x03, 0xC0, 0x0C, 0x00, 0xC1, 0xFC, 0x03, 0xC0, 0x36, + 0x03, 0x60, 0x73, 0x0F, 0x0F, 0x10, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x07, 0x80, 0xFF, 0xFE, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x06, + 0xFF, 0xFF, 0xFF, 0xC0, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, + 0x8F, 0x1E, 0x27, 0x80, 0xC0, 0xD8, 0x33, 0x0C, 0x63, 0x0C, 0xC1, 0xB8, + 0x3F, 0x07, 0x30, 0xC3, 0x18, 0x63, 0x06, 0x60, 0x6C, 0x0C, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xE0, + 0x3F, 0x01, 0xFC, 0x1F, 0xE0, 0xFD, 0x05, 0xEC, 0x6F, 0x63, 0x79, 0x13, + 0xCD, 0x9E, 0x6C, 0xF1, 0x47, 0x8E, 0x3C, 0x71, 0x80, 0xE0, 0x7C, 0x0F, + 0xC1, 0xE8, 0x3D, 0x87, 0x98, 0xF1, 0x1E, 0x33, 0xC3, 0x78, 0x6F, 0x07, + 0xE0, 0x7C, 0x0E, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, 0x6C, 0x01, 0xE0, + 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x0C, 0x60, 0xC0, 0xF8, + 0x00, 0xFF, 0x30, 0x6C, 0x0F, 0x03, 0xC0, 0xF0, 0x6F, 0xF3, 0x00, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xC0, + 0x6C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, 0xC0, 0x1B, 0x01, 0x98, 0x6C, + 0x60, 0xC0, 0xFB, 0x00, 0x08, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, + 0x6C, 0x0C, 0xFF, 0x8C, 0x0E, 0xC0, 0x6C, 0x06, 0xC0, 0x6C, 0x06, 0xC0, + 0x70, 0x3F, 0x18, 0x6C, 0x0F, 0x03, 0xC0, 0x1E, 0x01, 0xF0, 0x0E, 0x00, + 0xF0, 0x3C, 0x0D, 0x86, 0x3F, 0x00, 0xFF, 0x86, 0x03, 0x01, 0x80, 0xC0, + 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x78, 0x0F, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, + 0xB0, 0x61, 0xF0, 0xC0, 0x6C, 0x0D, 0x81, 0x10, 0x63, 0x0C, 0x61, 0x04, + 0x60, 0xCC, 0x19, 0x01, 0x60, 0x3C, 0x07, 0x00, 0x60, 0xC1, 0x81, 0x30, + 0xE1, 0x98, 0x70, 0xCC, 0x28, 0x66, 0x26, 0x21, 0x13, 0x30, 0xC8, 0x98, + 0x6C, 0x4C, 0x14, 0x34, 0x0A, 0x1A, 0x07, 0x07, 0x03, 0x03, 0x80, 0x81, + 0x80, 0x60, 0x63, 0x0C, 0x30, 0xC1, 0x98, 0x0F, 0x00, 0xE0, 0x06, 0x00, + 0xF0, 0x19, 0x01, 0x98, 0x30, 0xC6, 0x0E, 0x60, 0x60, 0xC0, 0x36, 0x06, + 0x30, 0xC3, 0x0C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xC0, 0x60, 0x30, 0x0C, 0x06, 0x03, + 0x01, 0xC0, 0x60, 0x30, 0x18, 0x06, 0x03, 0x00, 0xFF, 0xC0, 0xFB, 0x6D, + 0xB6, 0xDB, 0x6D, 0xB6, 0xE0, 0x84, 0x10, 0x84, 0x10, 0x84, 0x10, 0x84, + 0x10, 0x80, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDB, 0xE0, 0x30, 0x60, 0xA2, + 0x44, 0xD8, 0xA1, 0x80, 0xFF, 0xC0, 0xC6, 0x30, 0x7E, 0x71, 0xB0, 0xC0, + 0x60, 0xF3, 0xDB, 0x0D, 0x86, 0xC7, 0x3D, 0xC0, 0xC0, 0x60, 0x30, 0x1B, + 0xCE, 0x36, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x7C, 0x6D, 0xE0, 0x3C, + 0x66, 0xC3, 0xC0, 0xC0, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x03, 0x03, 0x03, + 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, 0x3B, 0x3C, 0x66, + 0xC3, 0xC3, 0xFF, 0xC0, 0xC0, 0xC3, 0x66, 0x3C, 0x36, 0x6F, 0x66, 0x66, + 0x66, 0x66, 0x60, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x67, + 0x3B, 0x03, 0x03, 0xC6, 0x7C, 0xC0, 0xC0, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xC0, 0x30, 0x03, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x4C, + 0x46, 0x63, 0x61, 0xF0, 0xEC, 0x62, 0x31, 0x98, 0x6C, 0x30, 0xFF, 0xFF, + 0xFF, 0xC0, 0xDE, 0xF7, 0x1C, 0xF0, 0xC7, 0x86, 0x3C, 0x31, 0xE1, 0x8F, + 0x0C, 0x78, 0x63, 0xC3, 0x1E, 0x18, 0xC0, 0xDE, 0xE3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0x66, 0x3C, 0xDE, 0x71, 0xB0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xE3, 0x6F, 0x30, 0x18, 0x0C, 0x00, 0x3B, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0x67, 0x3B, 0x03, 0x03, 0x03, 0xDF, 0x31, 0x8C, 0x63, 0x18, + 0xC6, 0x00, 0x3E, 0xE3, 0xC0, 0xC0, 0xE0, 0x3C, 0x07, 0xC3, 0xE3, 0x7E, + 0x66, 0xF6, 0x66, 0x66, 0x66, 0x67, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC3, 0xC7, 0x7B, 0xC1, 0xA0, 0x98, 0xCC, 0x42, 0x21, 0xB0, 0xD0, + 0x28, 0x1C, 0x0C, 0x00, 0xC6, 0x1E, 0x38, 0x91, 0xC4, 0xCA, 0x66, 0xD3, + 0x16, 0xD0, 0xA6, 0x87, 0x1C, 0x38, 0xC0, 0xC6, 0x00, 0x43, 0x62, 0x36, + 0x1C, 0x18, 0x1C, 0x3C, 0x26, 0x62, 0x43, 0xC1, 0x21, 0x98, 0xCC, 0x42, + 0x61, 0xB0, 0xD0, 0x38, 0x1C, 0x0C, 0x06, 0x03, 0x01, 0x03, 0x00, 0xFE, + 0x0C, 0x30, 0xC1, 0x86, 0x18, 0x20, 0xC1, 0xFC, 0x36, 0x66, 0x66, 0x6E, + 0xCE, 0x66, 0x66, 0x66, 0x30, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0xC6, 0x66, + 0x66, 0x67, 0x37, 0x66, 0x66, 0x66, 0xC0, 0x61, 0x24, 0x38 }; const GFXglyph FreeSans9pt7bGlyphs[] PROGMEM = { - {0, 0, 0, 5, 0, 1}, // 0x20 ' ' - {0, 2, 13, 6, 2, -12}, // 0x21 '!' - {4, 5, 4, 6, 1, -12}, // 0x22 '"' - {7, 10, 12, 10, 0, -11}, // 0x23 '#' - {22, 9, 16, 10, 1, -13}, // 0x24 '$' - {40, 16, 13, 16, 1, -12}, // 0x25 '%' - {66, 11, 13, 12, 1, -12}, // 0x26 '&' - {84, 2, 4, 4, 1, -12}, // 0x27 ''' - {85, 4, 17, 6, 1, -12}, // 0x28 '(' - {94, 4, 17, 6, 1, -12}, // 0x29 ')' - {103, 5, 5, 7, 1, -12}, // 0x2A '*' - {107, 6, 8, 11, 3, -7}, // 0x2B '+' - {113, 2, 4, 5, 2, 0}, // 0x2C ',' - {114, 4, 1, 6, 1, -4}, // 0x2D '-' - {115, 2, 1, 5, 1, 0}, // 0x2E '.' - {116, 5, 13, 5, 0, -12}, // 0x2F '/' - {125, 8, 13, 10, 1, -12}, // 0x30 '0' - {138, 4, 13, 10, 3, -12}, // 0x31 '1' - {145, 9, 13, 10, 1, -12}, // 0x32 '2' - {160, 8, 13, 10, 1, -12}, // 0x33 '3' - {173, 7, 13, 10, 2, -12}, // 0x34 '4' - {185, 9, 13, 10, 1, -12}, // 0x35 '5' - {200, 9, 13, 10, 1, -12}, // 0x36 '6' - {215, 8, 13, 10, 0, -12}, // 0x37 '7' - {228, 9, 13, 10, 1, -12}, // 0x38 '8' - {243, 8, 13, 10, 1, -12}, // 0x39 '9' - {256, 2, 10, 5, 1, -9}, // 0x3A ':' - {259, 3, 12, 5, 1, -8}, // 0x3B ';' - {264, 9, 9, 11, 1, -8}, // 0x3C '<' - {275, 9, 4, 11, 1, -5}, // 0x3D '=' - {280, 9, 9, 11, 1, -8}, // 0x3E '>' - {291, 9, 13, 10, 1, -12}, // 0x3F '?' - {306, 17, 16, 18, 1, -12}, // 0x40 '@' - {340, 12, 13, 12, 0, -12}, // 0x41 'A' - {360, 11, 13, 12, 1, -12}, // 0x42 'B' - {378, 11, 13, 13, 1, -12}, // 0x43 'C' - {396, 11, 13, 13, 1, -12}, // 0x44 'D' - {414, 9, 13, 11, 1, -12}, // 0x45 'E' - {429, 8, 13, 11, 1, -12}, // 0x46 'F' - {442, 12, 13, 14, 1, -12}, // 0x47 'G' - {462, 11, 13, 13, 1, -12}, // 0x48 'H' - {480, 2, 13, 5, 2, -12}, // 0x49 'I' - {484, 7, 13, 10, 1, -12}, // 0x4A 'J' - {496, 11, 13, 12, 1, -12}, // 0x4B 'K' - {514, 8, 13, 10, 1, -12}, // 0x4C 'L' - {527, 13, 13, 15, 1, -12}, // 0x4D 'M' - {549, 11, 13, 13, 1, -12}, // 0x4E 'N' - {567, 13, 13, 14, 1, -12}, // 0x4F 'O' - {589, 10, 13, 12, 1, -12}, // 0x50 'P' - {606, 13, 14, 14, 1, -12}, // 0x51 'Q' - {629, 12, 13, 13, 1, -12}, // 0x52 'R' - {649, 10, 13, 12, 1, -12}, // 0x53 'S' - {666, 9, 13, 11, 1, -12}, // 0x54 'T' - {681, 11, 13, 13, 1, -12}, // 0x55 'U' - {699, 11, 13, 12, 0, -12}, // 0x56 'V' - {717, 17, 13, 17, 0, -12}, // 0x57 'W' - {745, 12, 13, 12, 0, -12}, // 0x58 'X' - {765, 12, 13, 12, 0, -12}, // 0x59 'Y' - {785, 10, 13, 11, 1, -12}, // 0x5A 'Z' - {802, 3, 17, 5, 1, -12}, // 0x5B '[' - {809, 5, 13, 5, 0, -12}, // 0x5C '\' - {818, 3, 17, 5, 0, -12}, // 0x5D ']' - {825, 7, 7, 8, 1, -12}, // 0x5E '^' - {832, 10, 1, 10, 0, 3}, // 0x5F '_' - {834, 4, 3, 5, 0, -12}, // 0x60 '`' - {836, 9, 10, 10, 1, -9}, // 0x61 'a' - {848, 9, 13, 10, 1, -12}, // 0x62 'b' - {863, 8, 10, 9, 1, -9}, // 0x63 'c' - {873, 8, 13, 10, 1, -12}, // 0x64 'd' - {886, 8, 10, 10, 1, -9}, // 0x65 'e' - {896, 4, 13, 5, 1, -12}, // 0x66 'f' - {903, 8, 14, 10, 1, -9}, // 0x67 'g' - {917, 8, 13, 10, 1, -12}, // 0x68 'h' - {930, 2, 13, 4, 1, -12}, // 0x69 'i' - {934, 4, 17, 4, 0, -12}, // 0x6A 'j' - {943, 9, 13, 9, 1, -12}, // 0x6B 'k' - {958, 2, 13, 4, 1, -12}, // 0x6C 'l' - {962, 13, 10, 15, 1, -9}, // 0x6D 'm' - {979, 8, 10, 10, 1, -9}, // 0x6E 'n' - {989, 8, 10, 10, 1, -9}, // 0x6F 'o' - {999, 9, 13, 10, 1, -9}, // 0x70 'p' - {1014, 8, 13, 10, 1, -9}, // 0x71 'q' - {1027, 5, 10, 6, 1, -9}, // 0x72 'r' - {1034, 8, 10, 9, 1, -9}, // 0x73 's' - {1044, 4, 12, 5, 1, -11}, // 0x74 't' - {1050, 8, 10, 10, 1, -9}, // 0x75 'u' - {1060, 9, 10, 9, 0, -9}, // 0x76 'v' - {1072, 13, 10, 13, 0, -9}, // 0x77 'w' - {1089, 8, 10, 9, 0, -9}, // 0x78 'x' - {1099, 9, 14, 9, 0, -9}, // 0x79 'y' - {1115, 7, 10, 9, 1, -9}, // 0x7A 'z' - {1124, 4, 17, 6, 1, -12}, // 0x7B '{' - {1133, 2, 17, 4, 2, -12}, // 0x7C '|' - {1138, 4, 17, 6, 1, -12}, // 0x7D '}' - {1147, 7, 3, 9, 1, -7}}; // 0x7E '~' + { 0, 0, 0, 5, 0, 1 }, // 0x20 ' ' + { 0, 2, 13, 6, 2, -12 }, // 0x21 '!' + { 4, 5, 4, 6, 1, -12 }, // 0x22 '"' + { 7, 10, 12, 10, 0, -11 }, // 0x23 '#' + { 22, 9, 16, 10, 1, -13 }, // 0x24 '$' + { 40, 16, 13, 16, 1, -12 }, // 0x25 '%' + { 66, 11, 13, 12, 1, -12 }, // 0x26 '&' + { 84, 2, 4, 4, 1, -12 }, // 0x27 ''' + { 85, 4, 17, 6, 1, -12 }, // 0x28 '(' + { 94, 4, 17, 6, 1, -12 }, // 0x29 ')' + { 103, 5, 5, 7, 1, -12 }, // 0x2A '*' + { 107, 6, 8, 11, 3, -7 }, // 0x2B '+' + { 113, 2, 4, 5, 2, 0 }, // 0x2C ',' + { 114, 4, 1, 6, 1, -4 }, // 0x2D '-' + { 115, 2, 1, 5, 1, 0 }, // 0x2E '.' + { 116, 5, 13, 5, 0, -12 }, // 0x2F '/' + { 125, 8, 13, 10, 1, -12 }, // 0x30 '0' + { 138, 4, 13, 10, 3, -12 }, // 0x31 '1' + { 145, 9, 13, 10, 1, -12 }, // 0x32 '2' + { 160, 8, 13, 10, 1, -12 }, // 0x33 '3' + { 173, 7, 13, 10, 2, -12 }, // 0x34 '4' + { 185, 9, 13, 10, 1, -12 }, // 0x35 '5' + { 200, 9, 13, 10, 1, -12 }, // 0x36 '6' + { 215, 8, 13, 10, 0, -12 }, // 0x37 '7' + { 228, 9, 13, 10, 1, -12 }, // 0x38 '8' + { 243, 8, 13, 10, 1, -12 }, // 0x39 '9' + { 256, 2, 10, 5, 1, -9 }, // 0x3A ':' + { 259, 3, 12, 5, 1, -8 }, // 0x3B ';' + { 264, 9, 9, 11, 1, -8 }, // 0x3C '<' + { 275, 9, 4, 11, 1, -5 }, // 0x3D '=' + { 280, 9, 9, 11, 1, -8 }, // 0x3E '>' + { 291, 9, 13, 10, 1, -12 }, // 0x3F '?' + { 306, 17, 16, 18, 1, -12 }, // 0x40 '@' + { 340, 12, 13, 12, 0, -12 }, // 0x41 'A' + { 360, 11, 13, 12, 1, -12 }, // 0x42 'B' + { 378, 11, 13, 13, 1, -12 }, // 0x43 'C' + { 396, 11, 13, 13, 1, -12 }, // 0x44 'D' + { 414, 9, 13, 11, 1, -12 }, // 0x45 'E' + { 429, 8, 13, 11, 1, -12 }, // 0x46 'F' + { 442, 12, 13, 14, 1, -12 }, // 0x47 'G' + { 462, 11, 13, 13, 1, -12 }, // 0x48 'H' + { 480, 2, 13, 5, 2, -12 }, // 0x49 'I' + { 484, 7, 13, 10, 1, -12 }, // 0x4A 'J' + { 496, 11, 13, 12, 1, -12 }, // 0x4B 'K' + { 514, 8, 13, 10, 1, -12 }, // 0x4C 'L' + { 527, 13, 13, 15, 1, -12 }, // 0x4D 'M' + { 549, 11, 13, 13, 1, -12 }, // 0x4E 'N' + { 567, 13, 13, 14, 1, -12 }, // 0x4F 'O' + { 589, 10, 13, 12, 1, -12 }, // 0x50 'P' + { 606, 13, 14, 14, 1, -12 }, // 0x51 'Q' + { 629, 12, 13, 13, 1, -12 }, // 0x52 'R' + { 649, 10, 13, 12, 1, -12 }, // 0x53 'S' + { 666, 9, 13, 11, 1, -12 }, // 0x54 'T' + { 681, 11, 13, 13, 1, -12 }, // 0x55 'U' + { 699, 11, 13, 12, 0, -12 }, // 0x56 'V' + { 717, 17, 13, 17, 0, -12 }, // 0x57 'W' + { 745, 12, 13, 12, 0, -12 }, // 0x58 'X' + { 765, 12, 13, 12, 0, -12 }, // 0x59 'Y' + { 785, 10, 13, 11, 1, -12 }, // 0x5A 'Z' + { 802, 3, 17, 5, 1, -12 }, // 0x5B '[' + { 809, 5, 13, 5, 0, -12 }, // 0x5C '\' + { 818, 3, 17, 5, 0, -12 }, // 0x5D ']' + { 825, 7, 7, 8, 1, -12 }, // 0x5E '^' + { 832, 10, 1, 10, 0, 3 }, // 0x5F '_' + { 834, 4, 3, 5, 0, -12 }, // 0x60 '`' + { 836, 9, 10, 10, 1, -9 }, // 0x61 'a' + { 848, 9, 13, 10, 1, -12 }, // 0x62 'b' + { 863, 8, 10, 9, 1, -9 }, // 0x63 'c' + { 873, 8, 13, 10, 1, -12 }, // 0x64 'd' + { 886, 8, 10, 10, 1, -9 }, // 0x65 'e' + { 896, 4, 13, 5, 1, -12 }, // 0x66 'f' + { 903, 8, 14, 10, 1, -9 }, // 0x67 'g' + { 917, 8, 13, 10, 1, -12 }, // 0x68 'h' + { 930, 2, 13, 4, 1, -12 }, // 0x69 'i' + { 934, 4, 17, 4, 0, -12 }, // 0x6A 'j' + { 943, 9, 13, 9, 1, -12 }, // 0x6B 'k' + { 958, 2, 13, 4, 1, -12 }, // 0x6C 'l' + { 962, 13, 10, 15, 1, -9 }, // 0x6D 'm' + { 979, 8, 10, 10, 1, -9 }, // 0x6E 'n' + { 989, 8, 10, 10, 1, -9 }, // 0x6F 'o' + { 999, 9, 13, 10, 1, -9 }, // 0x70 'p' + { 1014, 8, 13, 10, 1, -9 }, // 0x71 'q' + { 1027, 5, 10, 6, 1, -9 }, // 0x72 'r' + { 1034, 8, 10, 9, 1, -9 }, // 0x73 's' + { 1044, 4, 12, 5, 1, -11 }, // 0x74 't' + { 1050, 8, 10, 10, 1, -9 }, // 0x75 'u' + { 1060, 9, 10, 9, 0, -9 }, // 0x76 'v' + { 1072, 13, 10, 13, 0, -9 }, // 0x77 'w' + { 1089, 8, 10, 9, 0, -9 }, // 0x78 'x' + { 1099, 9, 14, 9, 0, -9 }, // 0x79 'y' + { 1115, 7, 10, 9, 1, -9 }, // 0x7A 'z' + { 1124, 4, 17, 6, 1, -12 }, // 0x7B '{' + { 1133, 2, 17, 4, 2, -12 }, // 0x7C '|' + { 1138, 4, 17, 6, 1, -12 }, // 0x7D '}' + { 1147, 7, 3, 9, 1, -7 } }; // 0x7E '~' -const GFXfont FreeSans9pt7b PROGMEM = {(uint8_t *)FreeSans9pt7bBitmaps, - (GFXglyph *)FreeSans9pt7bGlyphs, 0x20, - 0x7E, 22}; +const GFXfont FreeSans9pt7b PROGMEM = { (uint8_t *)FreeSans9pt7bBitmaps, + (GFXglyph *)FreeSans9pt7bGlyphs,0x20, + 0x7E, 22 }; // Approx. 1822 bytes +#endif // ifndef FONTS_FREESANS9PT7B_H diff --git a/src/src/Static/Fonts/NovaMono12pt7b.h b/src/src/Static/Fonts/NovaMono12pt7b.h index c3c818419..f6adbad8d 100644 --- a/src/src/Static/Fonts/NovaMono12pt7b.h +++ b/src/src/Static/Fonts/NovaMono12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_NOVAMONO12PT7B_H +#define FONTS_NOVAMONO12PT7B_H const uint8_t NovaMono12pt7bBitmaps[] PROGMEM = { 0x00, 0x5B, 0x6D, 0xB6, 0xDB, 0x6D, 0x06, 0xF8, 0x47, 0x3C, 0xF3, 0xCE, 0x20, 0x19, 0x81, 0x98, 0x19, 0x8F, 0xFF, 0xFF, 0xF1, 0x98, 0x19, 0x8F, @@ -159,105 +161,106 @@ const uint8_t NovaMono12pt7bBitmaps[] PROGMEM = { 0x00, 0x38, 0x2F, 0xCD, 0x9F, 0x61, 0xC0 }; const GFXglyph NovaMono12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' - { 1, 3, 18, 13, 5, -17 }, // 0x21 '!' - { 8, 6, 6, 13, 4, -17 }, // 0x22 '"' - { 13, 12, 12, 13, 1, -14 }, // 0x23 '#' - { 31, 11, 26, 13, 1, -21 }, // 0x24 '$' - { 67, 12, 18, 13, 1, -17 }, // 0x25 '%' - { 94, 13, 18, 13, 0, -17 }, // 0x26 '&' - { 124, 2, 6, 13, 6, -17 }, // 0x27 ''' - { 126, 6, 26, 13, 5, -21 }, // 0x28 '(' - { 146, 6, 26, 13, 2, -21 }, // 0x29 ')' - { 166, 10, 10, 13, 2, -17 }, // 0x2A '*' - { 179, 10, 10, 13, 2, -13 }, // 0x2B '+' - { 192, 3, 6, 13, 5, -2 }, // 0x2C ',' - { 195, 10, 2, 13, 2, -9 }, // 0x2D '-' - { 198, 3, 3, 13, 5, -2 }, // 0x2E '.' - { 200, 12, 26, 13, 1, -21 }, // 0x2F '/' - { 239, 11, 18, 13, 1, -17 }, // 0x30 '0' - { 264, 6, 18, 13, 2, -17 }, // 0x31 '1' - { 278, 11, 18, 13, 1, -17 }, // 0x32 '2' - { 303, 11, 18, 13, 1, -17 }, // 0x33 '3' - { 328, 12, 18, 13, 1, -17 }, // 0x34 '4' - { 355, 11, 18, 13, 1, -17 }, // 0x35 '5' - { 380, 11, 18, 13, 1, -17 }, // 0x36 '6' - { 405, 11, 18, 13, 1, -17 }, // 0x37 '7' - { 430, 11, 18, 13, 1, -17 }, // 0x38 '8' - { 455, 11, 18, 13, 1, -17 }, // 0x39 '9' - { 480, 3, 10, 13, 5, -9 }, // 0x3A ':' - { 484, 3, 13, 13, 5, -9 }, // 0x3B ';' - { 489, 10, 10, 13, 2, -13 }, // 0x3C '<' - { 502, 10, 6, 13, 2, -11 }, // 0x3D '=' - { 510, 10, 10, 13, 2, -13 }, // 0x3E '>' - { 523, 11, 18, 13, 1, -17 }, // 0x3F '?' - { 548, 10, 18, 13, 2, -12 }, // 0x40 '@' - { 571, 11, 18, 13, 1, -17 }, // 0x41 'A' - { 596, 11, 18, 13, 1, -17 }, // 0x42 'B' - { 621, 11, 18, 13, 1, -17 }, // 0x43 'C' - { 646, 11, 18, 13, 1, -17 }, // 0x44 'D' - { 671, 10, 18, 13, 2, -17 }, // 0x45 'E' - { 694, 9, 18, 13, 2, -17 }, // 0x46 'F' - { 715, 11, 18, 13, 1, -17 }, // 0x47 'G' - { 740, 11, 18, 13, 1, -17 }, // 0x48 'H' - { 765, 10, 18, 13, 2, -17 }, // 0x49 'I' - { 788, 11, 18, 13, 1, -17 }, // 0x4A 'J' - { 813, 11, 18, 13, 1, -17 }, // 0x4B 'K' - { 838, 10, 18, 13, 2, -17 }, // 0x4C 'L' - { 861, 11, 18, 13, 1, -17 }, // 0x4D 'M' - { 886, 11, 18, 13, 1, -17 }, // 0x4E 'N' - { 911, 11, 18, 13, 1, -17 }, // 0x4F 'O' - { 936, 11, 18, 13, 1, -17 }, // 0x50 'P' - { 961, 11, 20, 13, 1, -17 }, // 0x51 'Q' - { 989, 11, 18, 13, 1, -17 }, // 0x52 'R' - { 1014, 11, 18, 13, 1, -17 }, // 0x53 'S' - { 1039, 12, 18, 13, 1, -17 }, // 0x54 'T' - { 1066, 11, 18, 13, 1, -17 }, // 0x55 'U' - { 1091, 12, 18, 13, 1, -17 }, // 0x56 'V' - { 1118, 11, 18, 13, 1, -17 }, // 0x57 'W' - { 1143, 11, 18, 13, 1, -17 }, // 0x58 'X' - { 1168, 11, 18, 13, 1, -17 }, // 0x59 'Y' - { 1193, 11, 18, 13, 1, -17 }, // 0x5A 'Z' - { 1218, 6, 26, 13, 5, -21 }, // 0x5B '[' - { 1238, 12, 26, 13, 1, -21 }, // 0x5C '\' - { 1277, 6, 26, 13, 2, -21 }, // 0x5D ']' - { 1297, 9, 5, 13, 2, -17 }, // 0x5E '^' - { 1303, 10, 2, 13, 2, -1 }, // 0x5F '_' - { 1306, 5, 6, 13, 4, -17 }, // 0x60 '`' - { 1310, 9, 13, 13, 2, -12 }, // 0x61 'a' - { 1325, 9, 18, 13, 2, -17 }, // 0x62 'b' - { 1346, 9, 13, 13, 2, -12 }, // 0x63 'c' - { 1361, 9, 18, 13, 2, -17 }, // 0x64 'd' - { 1382, 9, 13, 13, 2, -12 }, // 0x65 'e' - { 1397, 10, 18, 13, 1, -17 }, // 0x66 'f' - { 1420, 9, 18, 13, 2, -12 }, // 0x67 'g' - { 1441, 9, 18, 13, 2, -17 }, // 0x68 'h' - { 1462, 9, 18, 13, 2, -17 }, // 0x69 'i' - { 1483, 10, 23, 13, 2, -17 }, // 0x6A 'j' - { 1512, 9, 18, 13, 2, -17 }, // 0x6B 'k' - { 1533, 9, 18, 13, 2, -17 }, // 0x6C 'l' - { 1554, 11, 13, 13, 1, -12 }, // 0x6D 'm' - { 1572, 9, 13, 13, 2, -12 }, // 0x6E 'n' - { 1587, 9, 13, 13, 2, -12 }, // 0x6F 'o' - { 1602, 9, 18, 13, 2, -12 }, // 0x70 'p' - { 1623, 12, 18, 13, 2, -12 }, // 0x71 'q' - { 1650, 9, 13, 13, 2, -12 }, // 0x72 'r' - { 1665, 9, 13, 13, 2, -12 }, // 0x73 's' - { 1680, 10, 18, 13, 1, -17 }, // 0x74 't' - { 1703, 9, 13, 13, 2, -12 }, // 0x75 'u' - { 1718, 12, 13, 13, 1, -12 }, // 0x76 'v' - { 1738, 11, 13, 13, 1, -12 }, // 0x77 'w' - { 1756, 11, 13, 13, 1, -12 }, // 0x78 'x' - { 1774, 9, 18, 13, 2, -12 }, // 0x79 'y' - { 1795, 10, 13, 13, 2, -12 }, // 0x7A 'z' - { 1812, 10, 26, 13, 1, -21 }, // 0x7B '{' - { 1845, 2, 26, 13, 6, -21 }, // 0x7C '|' - { 1852, 10, 26, 13, 2, -21 }, // 0x7D '}' - { 1885, 11, 4, 13, 1, -10 } }; // 0x7E '~' + { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' + { 1, 3, 18, 13, 5, -17 }, // 0x21 '!' + { 8, 6, 6, 13, 4, -17 }, // 0x22 '"' + { 13, 12, 12, 13, 1, -14 }, // 0x23 '#' + { 31, 11, 26, 13, 1, -21 }, // 0x24 '$' + { 67, 12, 18, 13, 1, -17 }, // 0x25 '%' + { 94, 13, 18, 13, 0, -17 }, // 0x26 '&' + { 124, 2, 6, 13, 6, -17 }, // 0x27 ''' + { 126, 6, 26, 13, 5, -21 }, // 0x28 '(' + { 146, 6, 26, 13, 2, -21 }, // 0x29 ')' + { 166, 10, 10, 13, 2, -17 }, // 0x2A '*' + { 179, 10, 10, 13, 2, -13 }, // 0x2B '+' + { 192, 3, 6, 13, 5, -2 }, // 0x2C ',' + { 195, 10, 2, 13, 2, -9 }, // 0x2D '-' + { 198, 3, 3, 13, 5, -2 }, // 0x2E '.' + { 200, 12, 26, 13, 1, -21 }, // 0x2F '/' + { 239, 11, 18, 13, 1, -17 }, // 0x30 '0' + { 264, 6, 18, 13, 2, -17 }, // 0x31 '1' + { 278, 11, 18, 13, 1, -17 }, // 0x32 '2' + { 303, 11, 18, 13, 1, -17 }, // 0x33 '3' + { 328, 12, 18, 13, 1, -17 }, // 0x34 '4' + { 355, 11, 18, 13, 1, -17 }, // 0x35 '5' + { 380, 11, 18, 13, 1, -17 }, // 0x36 '6' + { 405, 11, 18, 13, 1, -17 }, // 0x37 '7' + { 430, 11, 18, 13, 1, -17 }, // 0x38 '8' + { 455, 11, 18, 13, 1, -17 }, // 0x39 '9' + { 480, 3, 10, 13, 5, -9 }, // 0x3A ':' + { 484, 3, 13, 13, 5, -9 }, // 0x3B ';' + { 489, 10, 10, 13, 2, -13 }, // 0x3C '<' + { 502, 10, 6, 13, 2, -11 }, // 0x3D '=' + { 510, 10, 10, 13, 2, -13 }, // 0x3E '>' + { 523, 11, 18, 13, 1, -17 }, // 0x3F '?' + { 548, 10, 18, 13, 2, -12 }, // 0x40 '@' + { 571, 11, 18, 13, 1, -17 }, // 0x41 'A' + { 596, 11, 18, 13, 1, -17 }, // 0x42 'B' + { 621, 11, 18, 13, 1, -17 }, // 0x43 'C' + { 646, 11, 18, 13, 1, -17 }, // 0x44 'D' + { 671, 10, 18, 13, 2, -17 }, // 0x45 'E' + { 694, 9, 18, 13, 2, -17 }, // 0x46 'F' + { 715, 11, 18, 13, 1, -17 }, // 0x47 'G' + { 740, 11, 18, 13, 1, -17 }, // 0x48 'H' + { 765, 10, 18, 13, 2, -17 }, // 0x49 'I' + { 788, 11, 18, 13, 1, -17 }, // 0x4A 'J' + { 813, 11, 18, 13, 1, -17 }, // 0x4B 'K' + { 838, 10, 18, 13, 2, -17 }, // 0x4C 'L' + { 861, 11, 18, 13, 1, -17 }, // 0x4D 'M' + { 886, 11, 18, 13, 1, -17 }, // 0x4E 'N' + { 911, 11, 18, 13, 1, -17 }, // 0x4F 'O' + { 936, 11, 18, 13, 1, -17 }, // 0x50 'P' + { 961, 11, 20, 13, 1, -17 }, // 0x51 'Q' + { 989, 11, 18, 13, 1, -17 }, // 0x52 'R' + { 1014, 11, 18, 13, 1, -17 }, // 0x53 'S' + { 1039, 12, 18, 13, 1, -17 }, // 0x54 'T' + { 1066, 11, 18, 13, 1, -17 }, // 0x55 'U' + { 1091, 12, 18, 13, 1, -17 }, // 0x56 'V' + { 1118, 11, 18, 13, 1, -17 }, // 0x57 'W' + { 1143, 11, 18, 13, 1, -17 }, // 0x58 'X' + { 1168, 11, 18, 13, 1, -17 }, // 0x59 'Y' + { 1193, 11, 18, 13, 1, -17 }, // 0x5A 'Z' + { 1218, 6, 26, 13, 5, -21 }, // 0x5B '[' + { 1238, 12, 26, 13, 1, -21 }, // 0x5C '\' + { 1277, 6, 26, 13, 2, -21 }, // 0x5D ']' + { 1297, 9, 5, 13, 2, -17 }, // 0x5E '^' + { 1303, 10, 2, 13, 2, -1 }, // 0x5F '_' + { 1306, 5, 6, 13, 4, -17 }, // 0x60 '`' + { 1310, 9, 13, 13, 2, -12 }, // 0x61 'a' + { 1325, 9, 18, 13, 2, -17 }, // 0x62 'b' + { 1346, 9, 13, 13, 2, -12 }, // 0x63 'c' + { 1361, 9, 18, 13, 2, -17 }, // 0x64 'd' + { 1382, 9, 13, 13, 2, -12 }, // 0x65 'e' + { 1397, 10, 18, 13, 1, -17 }, // 0x66 'f' + { 1420, 9, 18, 13, 2, -12 }, // 0x67 'g' + { 1441, 9, 18, 13, 2, -17 }, // 0x68 'h' + { 1462, 9, 18, 13, 2, -17 }, // 0x69 'i' + { 1483, 10, 23, 13, 2, -17 }, // 0x6A 'j' + { 1512, 9, 18, 13, 2, -17 }, // 0x6B 'k' + { 1533, 9, 18, 13, 2, -17 }, // 0x6C 'l' + { 1554, 11, 13, 13, 1, -12 }, // 0x6D 'm' + { 1572, 9, 13, 13, 2, -12 }, // 0x6E 'n' + { 1587, 9, 13, 13, 2, -12 }, // 0x6F 'o' + { 1602, 9, 18, 13, 2, -12 }, // 0x70 'p' + { 1623, 12, 18, 13, 2, -12 }, // 0x71 'q' + { 1650, 9, 13, 13, 2, -12 }, // 0x72 'r' + { 1665, 9, 13, 13, 2, -12 }, // 0x73 's' + { 1680, 10, 18, 13, 1, -17 }, // 0x74 't' + { 1703, 9, 13, 13, 2, -12 }, // 0x75 'u' + { 1718, 12, 13, 13, 1, -12 }, // 0x76 'v' + { 1738, 11, 13, 13, 1, -12 }, // 0x77 'w' + { 1756, 11, 13, 13, 1, -12 }, // 0x78 'x' + { 1774, 9, 18, 13, 2, -12 }, // 0x79 'y' + { 1795, 10, 13, 13, 2, -12 }, // 0x7A 'z' + { 1812, 10, 26, 13, 1, -21 }, // 0x7B '{' + { 1845, 2, 26, 13, 6, -21 }, // 0x7C '|' + { 1852, 10, 26, 13, 2, -21 }, // 0x7D '}' + { 1885, 11, 4, 13, 1, -10 } }; // 0x7E '~' const GFXfont NovaMono12pt7b PROGMEM = { (uint8_t *)NovaMono12pt7bBitmaps, (GFXglyph *)NovaMono12pt7bGlyphs, - 0x20, 0x7E, 33 }; + 0x20, 0x7E, 33 }; // Approx. 2563 bytes +#endif // ifndef FONTS_NOVAMONO12PT7B_H diff --git a/src/src/Static/Fonts/NovaMono8pt7b.h b/src/src/Static/Fonts/NovaMono8pt7b.h index aca048532..c5598b61c 100644 --- a/src/src/Static/Fonts/NovaMono8pt7b.h +++ b/src/src/Static/Fonts/NovaMono8pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_NOVAMONO8PT7B_H +#define FONTS_NOVAMONO8PT7B_H const uint8_t NovaMono8pt7bBitmaps[] PROGMEM = { 0x00, 0x55, 0x55, 0x4F, 0xB6, 0xD0, 0x28, 0x53, 0xF9, 0x42, 0x9F, 0xCA, 0x14, 0x00, 0x20, 0x41, 0x87, 0xD2, 0xA4, 0x68, 0x78, 0x38, 0x4C, 0x99, @@ -69,105 +71,106 @@ const uint8_t NovaMono8pt7bBitmaps[] PROGMEM = { 0x40, 0x81, 0x02, 0x04, 0x18, 0xE0, 0x73, 0x38 }; const GFXglyph NovaMono8pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' - { 1, 2, 12, 9, 3, -11 }, // 0x21 '!' - { 4, 3, 4, 9, 3, -11 }, // 0x22 '"' - { 6, 7, 8, 9, 1, -9 }, // 0x23 '#' - { 13, 7, 18, 9, 1, -14 }, // 0x24 '$' - { 29, 8, 12, 9, 0, -11 }, // 0x25 '%' - { 41, 9, 11, 9, 0, -10 }, // 0x26 '&' - { 54, 1, 4, 9, 4, -11 }, // 0x27 ''' - { 55, 3, 18, 9, 3, -14 }, // 0x28 '(' - { 62, 3, 18, 9, 2, -14 }, // 0x29 ')' - { 69, 7, 7, 9, 1, -11 }, // 0x2A '*' - { 76, 7, 7, 9, 1, -8 }, // 0x2B '+' - { 83, 2, 4, 9, 3, -1 }, // 0x2C ',' - { 84, 7, 1, 9, 1, -5 }, // 0x2D '-' - { 85, 2, 2, 9, 3, -1 }, // 0x2E '.' - { 86, 9, 18, 9, 0, -14 }, // 0x2F '/' - { 107, 7, 12, 9, 1, -11 }, // 0x30 '0' - { 118, 4, 12, 9, 1, -11 }, // 0x31 '1' - { 124, 7, 12, 9, 1, -11 }, // 0x32 '2' - { 135, 7, 11, 9, 1, -10 }, // 0x33 '3' - { 145, 7, 12, 9, 1, -11 }, // 0x34 '4' - { 156, 7, 11, 9, 1, -10 }, // 0x35 '5' - { 166, 7, 12, 9, 1, -11 }, // 0x36 '6' - { 177, 7, 11, 9, 1, -10 }, // 0x37 '7' - { 187, 7, 12, 9, 1, -11 }, // 0x38 '8' - { 198, 7, 12, 9, 1, -11 }, // 0x39 '9' - { 209, 2, 7, 9, 3, -6 }, // 0x3A ':' - { 211, 2, 9, 9, 3, -6 }, // 0x3B ';' - { 214, 7, 6, 9, 1, -8 }, // 0x3C '<' - { 220, 7, 4, 9, 1, -7 }, // 0x3D '=' - { 224, 7, 6, 9, 1, -8 }, // 0x3E '>' - { 230, 7, 12, 9, 1, -11 }, // 0x3F '?' - { 241, 6, 12, 9, 1, -8 }, // 0x40 '@' - { 250, 7, 12, 9, 1, -11 }, // 0x41 'A' - { 261, 7, 11, 9, 1, -10 }, // 0x42 'B' - { 271, 7, 12, 9, 1, -11 }, // 0x43 'C' - { 282, 7, 11, 9, 1, -10 }, // 0x44 'D' - { 292, 7, 11, 9, 2, -10 }, // 0x45 'E' - { 302, 6, 11, 9, 2, -10 }, // 0x46 'F' - { 311, 7, 12, 9, 1, -11 }, // 0x47 'G' - { 322, 7, 12, 9, 1, -11 }, // 0x48 'H' - { 333, 7, 11, 9, 1, -10 }, // 0x49 'I' - { 343, 7, 11, 9, 1, -10 }, // 0x4A 'J' - { 353, 7, 12, 9, 1, -11 }, // 0x4B 'K' - { 364, 7, 12, 9, 1, -11 }, // 0x4C 'L' - { 375, 7, 12, 9, 1, -11 }, // 0x4D 'M' - { 386, 7, 12, 9, 1, -11 }, // 0x4E 'N' - { 397, 7, 12, 9, 1, -11 }, // 0x4F 'O' - { 408, 7, 11, 9, 1, -10 }, // 0x50 'P' - { 418, 7, 13, 9, 1, -11 }, // 0x51 'Q' - { 430, 7, 11, 9, 1, -10 }, // 0x52 'R' - { 440, 7, 12, 9, 1, -11 }, // 0x53 'S' - { 451, 9, 11, 9, 0, -10 }, // 0x54 'T' - { 464, 7, 12, 9, 1, -11 }, // 0x55 'U' - { 475, 9, 12, 9, 0, -11 }, // 0x56 'V' - { 489, 7, 12, 9, 1, -11 }, // 0x57 'W' - { 500, 7, 12, 9, 1, -11 }, // 0x58 'X' - { 511, 7, 12, 9, 1, -11 }, // 0x59 'Y' - { 522, 7, 11, 9, 1, -10 }, // 0x5A 'Z' - { 532, 4, 17, 9, 3, -13 }, // 0x5B '[' - { 541, 9, 18, 9, 0, -14 }, // 0x5C '\' - { 562, 4, 17, 9, 1, -13 }, // 0x5D ']' - { 571, 7, 3, 9, 1, -11 }, // 0x5E '^' - { 574, 7, 1, 9, 1, 0 }, // 0x5F '_' - { 575, 3, 4, 9, 3, -11 }, // 0x60 '`' - { 577, 5, 9, 9, 2, -8 }, // 0x61 'a' - { 583, 5, 12, 9, 2, -11 }, // 0x62 'b' - { 591, 5, 9, 9, 2, -8 }, // 0x63 'c' - { 597, 5, 12, 9, 2, -11 }, // 0x64 'd' - { 605, 5, 9, 9, 2, -8 }, // 0x65 'e' - { 611, 6, 12, 9, 1, -11 }, // 0x66 'f' - { 620, 5, 12, 9, 2, -8 }, // 0x67 'g' - { 628, 5, 12, 9, 2, -11 }, // 0x68 'h' - { 636, 6, 12, 9, 1, -11 }, // 0x69 'i' - { 645, 5, 15, 9, 2, -11 }, // 0x6A 'j' - { 655, 5, 12, 9, 2, -11 }, // 0x6B 'k' - { 663, 5, 12, 9, 2, -11 }, // 0x6C 'l' - { 671, 7, 9, 9, 1, -8 }, // 0x6D 'm' - { 679, 5, 9, 9, 2, -8 }, // 0x6E 'n' - { 685, 5, 9, 9, 2, -8 }, // 0x6F 'o' - { 691, 5, 12, 9, 2, -8 }, // 0x70 'p' - { 699, 7, 12, 9, 2, -8 }, // 0x71 'q' - { 710, 5, 9, 9, 2, -8 }, // 0x72 'r' - { 716, 6, 9, 9, 1, -8 }, // 0x73 's' - { 723, 6, 12, 9, 1, -11 }, // 0x74 't' - { 732, 5, 9, 9, 2, -8 }, // 0x75 'u' - { 738, 7, 9, 9, 1, -8 }, // 0x76 'v' - { 746, 7, 9, 9, 1, -8 }, // 0x77 'w' - { 754, 7, 9, 9, 1, -8 }, // 0x78 'x' - { 762, 5, 12, 9, 2, -8 }, // 0x79 'y' - { 770, 7, 8, 9, 1, -7 }, // 0x7A 'z' - { 777, 7, 17, 9, 0, -13 }, // 0x7B '{' - { 792, 1, 18, 9, 4, -14 }, // 0x7C '|' - { 795, 7, 17, 9, 1, -13 }, // 0x7D '}' - { 810, 7, 2, 9, 1, -6 } }; // 0x7E '~' + { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' + { 1, 2, 12, 9, 3, -11 }, // 0x21 '!' + { 4, 3, 4, 9, 3, -11 }, // 0x22 '"' + { 6, 7, 8, 9, 1, -9 }, // 0x23 '#' + { 13, 7, 18, 9, 1, -14 }, // 0x24 '$' + { 29, 8, 12, 9, 0, -11 }, // 0x25 '%' + { 41, 9, 11, 9, 0, -10 }, // 0x26 '&' + { 54, 1, 4, 9, 4, -11 }, // 0x27 ''' + { 55, 3, 18, 9, 3, -14 }, // 0x28 '(' + { 62, 3, 18, 9, 2, -14 }, // 0x29 ')' + { 69, 7, 7, 9, 1, -11 }, // 0x2A '*' + { 76, 7, 7, 9, 1, -8 }, // 0x2B '+' + { 83, 2, 4, 9, 3, -1 }, // 0x2C ',' + { 84, 7, 1, 9, 1, -5 }, // 0x2D '-' + { 85, 2, 2, 9, 3, -1 }, // 0x2E '.' + { 86, 9, 18, 9, 0, -14 }, // 0x2F '/' + { 107, 7, 12, 9, 1, -11 }, // 0x30 '0' + { 118, 4, 12, 9, 1, -11 }, // 0x31 '1' + { 124, 7, 12, 9, 1, -11 }, // 0x32 '2' + { 135, 7, 11, 9, 1, -10 }, // 0x33 '3' + { 145, 7, 12, 9, 1, -11 }, // 0x34 '4' + { 156, 7, 11, 9, 1, -10 }, // 0x35 '5' + { 166, 7, 12, 9, 1, -11 }, // 0x36 '6' + { 177, 7, 11, 9, 1, -10 }, // 0x37 '7' + { 187, 7, 12, 9, 1, -11 }, // 0x38 '8' + { 198, 7, 12, 9, 1, -11 }, // 0x39 '9' + { 209, 2, 7, 9, 3, -6 }, // 0x3A ':' + { 211, 2, 9, 9, 3, -6 }, // 0x3B ';' + { 214, 7, 6, 9, 1, -8 }, // 0x3C '<' + { 220, 7, 4, 9, 1, -7 }, // 0x3D '=' + { 224, 7, 6, 9, 1, -8 }, // 0x3E '>' + { 230, 7, 12, 9, 1, -11 }, // 0x3F '?' + { 241, 6, 12, 9, 1, -8 }, // 0x40 '@' + { 250, 7, 12, 9, 1, -11 }, // 0x41 'A' + { 261, 7, 11, 9, 1, -10 }, // 0x42 'B' + { 271, 7, 12, 9, 1, -11 }, // 0x43 'C' + { 282, 7, 11, 9, 1, -10 }, // 0x44 'D' + { 292, 7, 11, 9, 2, -10 }, // 0x45 'E' + { 302, 6, 11, 9, 2, -10 }, // 0x46 'F' + { 311, 7, 12, 9, 1, -11 }, // 0x47 'G' + { 322, 7, 12, 9, 1, -11 }, // 0x48 'H' + { 333, 7, 11, 9, 1, -10 }, // 0x49 'I' + { 343, 7, 11, 9, 1, -10 }, // 0x4A 'J' + { 353, 7, 12, 9, 1, -11 }, // 0x4B 'K' + { 364, 7, 12, 9, 1, -11 }, // 0x4C 'L' + { 375, 7, 12, 9, 1, -11 }, // 0x4D 'M' + { 386, 7, 12, 9, 1, -11 }, // 0x4E 'N' + { 397, 7, 12, 9, 1, -11 }, // 0x4F 'O' + { 408, 7, 11, 9, 1, -10 }, // 0x50 'P' + { 418, 7, 13, 9, 1, -11 }, // 0x51 'Q' + { 430, 7, 11, 9, 1, -10 }, // 0x52 'R' + { 440, 7, 12, 9, 1, -11 }, // 0x53 'S' + { 451, 9, 11, 9, 0, -10 }, // 0x54 'T' + { 464, 7, 12, 9, 1, -11 }, // 0x55 'U' + { 475, 9, 12, 9, 0, -11 }, // 0x56 'V' + { 489, 7, 12, 9, 1, -11 }, // 0x57 'W' + { 500, 7, 12, 9, 1, -11 }, // 0x58 'X' + { 511, 7, 12, 9, 1, -11 }, // 0x59 'Y' + { 522, 7, 11, 9, 1, -10 }, // 0x5A 'Z' + { 532, 4, 17, 9, 3, -13 }, // 0x5B '[' + { 541, 9, 18, 9, 0, -14 }, // 0x5C '\' + { 562, 4, 17, 9, 1, -13 }, // 0x5D ']' + { 571, 7, 3, 9, 1, -11 }, // 0x5E '^' + { 574, 7, 1, 9, 1, 0 }, // 0x5F '_' + { 575, 3, 4, 9, 3, -11 }, // 0x60 '`' + { 577, 5, 9, 9, 2, -8 }, // 0x61 'a' + { 583, 5, 12, 9, 2, -11 }, // 0x62 'b' + { 591, 5, 9, 9, 2, -8 }, // 0x63 'c' + { 597, 5, 12, 9, 2, -11 }, // 0x64 'd' + { 605, 5, 9, 9, 2, -8 }, // 0x65 'e' + { 611, 6, 12, 9, 1, -11 }, // 0x66 'f' + { 620, 5, 12, 9, 2, -8 }, // 0x67 'g' + { 628, 5, 12, 9, 2, -11 }, // 0x68 'h' + { 636, 6, 12, 9, 1, -11 }, // 0x69 'i' + { 645, 5, 15, 9, 2, -11 }, // 0x6A 'j' + { 655, 5, 12, 9, 2, -11 }, // 0x6B 'k' + { 663, 5, 12, 9, 2, -11 }, // 0x6C 'l' + { 671, 7, 9, 9, 1, -8 }, // 0x6D 'm' + { 679, 5, 9, 9, 2, -8 }, // 0x6E 'n' + { 685, 5, 9, 9, 2, -8 }, // 0x6F 'o' + { 691, 5, 12, 9, 2, -8 }, // 0x70 'p' + { 699, 7, 12, 9, 2, -8 }, // 0x71 'q' + { 710, 5, 9, 9, 2, -8 }, // 0x72 'r' + { 716, 6, 9, 9, 1, -8 }, // 0x73 's' + { 723, 6, 12, 9, 1, -11 }, // 0x74 't' + { 732, 5, 9, 9, 2, -8 }, // 0x75 'u' + { 738, 7, 9, 9, 1, -8 }, // 0x76 'v' + { 746, 7, 9, 9, 1, -8 }, // 0x77 'w' + { 754, 7, 9, 9, 1, -8 }, // 0x78 'x' + { 762, 5, 12, 9, 2, -8 }, // 0x79 'y' + { 770, 7, 8, 9, 1, -7 }, // 0x7A 'z' + { 777, 7, 17, 9, 0, -13 }, // 0x7B '{' + { 792, 1, 18, 9, 4, -14 }, // 0x7C '|' + { 795, 7, 17, 9, 1, -13 }, // 0x7D '}' + { 810, 7, 2, 9, 1, -6 } }; // 0x7E '~' const GFXfont NovaMono8pt7b PROGMEM = { (uint8_t *)NovaMono8pt7bBitmaps, (GFXglyph *)NovaMono8pt7bGlyphs, - 0x20, 0x7E, 22 }; + 0x20, 0x7E, 22 }; // Approx. 1484 bytes +#endif // ifndef FONTS_NOVAMONO8PT7B_H diff --git a/src/src/Static/Fonts/RepetitionScrolling12pt7b.h b/src/src/Static/Fonts/RepetitionScrolling12pt7b.h index 776c23890..58f400ef6 100644 --- a/src/src/Static/Fonts/RepetitionScrolling12pt7b.h +++ b/src/src/Static/Fonts/RepetitionScrolling12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_REPETITIONSCROLLING12PT7B_H +#define FONTS_REPETITIONSCROLLING12PT7B_H const uint8_t RepetitionScrolling12pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0x3F, 0xFC, 0x0F, 0xC7, 0x8F, 0x1E, 0x30, 0x31, 0x86, 0x30, 0xC6, 0x18, 0xC0, 0x01, 0xEB, 0xFD, 0x79, 0x8C, 0x31, 0x9E, 0xBF, 0xD7, @@ -134,105 +136,106 @@ const uint8_t RepetitionScrolling12pt7bBitmaps[] PROGMEM = { 0xCF, 0x1E, 0x63, 0xC0 }; const GFXglyph RepetitionScrolling12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' - { 1, 2, 16, 13, 5, -15 }, // 0x21 '!' - { 5, 7, 4, 13, 3, -15 }, // 0x22 '"' - { 9, 11, 16, 13, 1, -15 }, // 0x23 '#' - { 31, 11, 16, 13, 1, -15 }, // 0x24 '$' - { 53, 11, 16, 13, 1, -15 }, // 0x25 '%' - { 75, 11, 16, 13, 1, -15 }, // 0x26 '&' - { 97, 2, 4, 13, 5, -15 }, // 0x27 ''' - { 98, 6, 16, 13, 3, -15 }, // 0x28 '(' - { 110, 6, 16, 13, 3, -15 }, // 0x29 ')' - { 122, 6, 7, 13, 3, -15 }, // 0x2A '*' - { 128, 11, 11, 13, 1, -10 }, // 0x2B '+' - { 144, 4, 7, 13, 4, -6 }, // 0x2C ',' - { 148, 6, 2, 13, 3, -6 }, // 0x2D '-' - { 150, 4, 4, 13, 4, -3 }, // 0x2E '.' - { 152, 11, 16, 13, 1, -15 }, // 0x2F '/' - { 174, 11, 16, 13, 1, -15 }, // 0x30 '0' - { 196, 7, 16, 13, 3, -15 }, // 0x31 '1' - { 210, 11, 16, 13, 1, -15 }, // 0x32 '2' - { 232, 11, 16, 13, 1, -15 }, // 0x33 '3' - { 254, 11, 16, 13, 1, -15 }, // 0x34 '4' - { 276, 11, 16, 13, 1, -15 }, // 0x35 '5' - { 298, 11, 16, 13, 1, -15 }, // 0x36 '6' - { 320, 11, 16, 13, 1, -15 }, // 0x37 '7' - { 342, 11, 16, 13, 1, -15 }, // 0x38 '8' - { 364, 11, 16, 13, 1, -15 }, // 0x39 '9' - { 386, 4, 11, 13, 4, -10 }, // 0x3A ':' - { 392, 4, 14, 13, 4, -13 }, // 0x3B ';' - { 399, 9, 16, 13, 2, -15 }, // 0x3C '<' - { 417, 11, 7, 13, 1, -8 }, // 0x3D '=' - { 427, 9, 16, 13, 3, -15 }, // 0x3E '>' - { 445, 11, 16, 13, 1, -15 }, // 0x3F '?' - { 467, 11, 16, 13, 1, -15 }, // 0x40 '@' - { 489, 11, 16, 13, 1, -15 }, // 0x41 'A' - { 511, 11, 16, 13, 1, -15 }, // 0x42 'B' - { 533, 11, 16, 13, 1, -15 }, // 0x43 'C' - { 555, 11, 16, 13, 1, -15 }, // 0x44 'D' - { 577, 11, 16, 13, 1, -15 }, // 0x45 'E' - { 599, 11, 16, 13, 1, -15 }, // 0x46 'F' - { 621, 11, 16, 13, 1, -15 }, // 0x47 'G' - { 643, 11, 16, 13, 1, -15 }, // 0x48 'H' - { 665, 7, 16, 13, 3, -15 }, // 0x49 'I' - { 679, 11, 16, 13, 1, -15 }, // 0x4A 'J' - { 701, 11, 16, 13, 1, -15 }, // 0x4B 'K' - { 723, 11, 16, 13, 1, -15 }, // 0x4C 'L' - { 745, 11, 16, 13, 1, -15 }, // 0x4D 'M' - { 767, 11, 16, 13, 1, -15 }, // 0x4E 'N' - { 789, 11, 16, 13, 1, -15 }, // 0x4F 'O' - { 811, 11, 16, 13, 1, -15 }, // 0x50 'P' - { 833, 11, 16, 13, 1, -15 }, // 0x51 'Q' - { 855, 11, 16, 13, 1, -15 }, // 0x52 'R' - { 877, 11, 16, 13, 1, -15 }, // 0x53 'S' - { 899, 11, 16, 13, 1, -15 }, // 0x54 'T' - { 921, 11, 16, 13, 1, -15 }, // 0x55 'U' - { 943, 11, 16, 13, 1, -15 }, // 0x56 'V' - { 965, 11, 16, 13, 1, -15 }, // 0x57 'W' - { 987, 11, 16, 13, 1, -15 }, // 0x58 'X' - { 1009, 11, 16, 13, 1, -15 }, // 0x59 'Y' - { 1031, 11, 16, 13, 1, -15 }, // 0x5A 'Z' - { 1053, 7, 16, 13, 3, -15 }, // 0x5B '[' - { 1067, 11, 16, 13, 1, -15 }, // 0x5C '\' - { 1089, 7, 16, 13, 3, -15 }, // 0x5D ']' - { 1103, 11, 7, 13, 1, -15 }, // 0x5E '^' - { 1113, 11, 2, 13, 1, -1 }, // 0x5F '_' - { 1116, 4, 4, 13, 4, -15 }, // 0x60 '`' - { 1118, 11, 11, 13, 1, -10 }, // 0x61 'a' - { 1134, 11, 16, 13, 1, -15 }, // 0x62 'b' - { 1156, 11, 11, 13, 1, -10 }, // 0x63 'c' - { 1172, 11, 16, 13, 1, -15 }, // 0x64 'd' - { 1194, 11, 11, 13, 1, -10 }, // 0x65 'e' - { 1210, 11, 16, 13, 1, -15 }, // 0x66 'f' - { 1232, 11, 11, 13, 1, -10 }, // 0x67 'g' - { 1248, 11, 16, 13, 1, -15 }, // 0x68 'h' - { 1270, 2, 16, 13, 5, -15 }, // 0x69 'i' - { 1274, 9, 16, 13, 2, -15 }, // 0x6A 'j' - { 1292, 9, 16, 13, 1, -15 }, // 0x6B 'k' - { 1310, 2, 16, 13, 5, -15 }, // 0x6C 'l' - { 1314, 11, 11, 13, 1, -10 }, // 0x6D 'm' - { 1330, 11, 11, 13, 1, -10 }, // 0x6E 'n' - { 1346, 11, 11, 13, 1, -10 }, // 0x6F 'o' - { 1362, 11, 11, 13, 1, -10 }, // 0x70 'p' - { 1378, 11, 11, 13, 1, -10 }, // 0x71 'q' - { 1394, 11, 11, 13, 1, -10 }, // 0x72 'r' - { 1410, 11, 11, 13, 1, -10 }, // 0x73 's' - { 1426, 11, 14, 13, 1, -13 }, // 0x74 't' - { 1446, 11, 11, 13, 1, -10 }, // 0x75 'u' - { 1462, 11, 11, 13, 1, -10 }, // 0x76 'v' - { 1478, 11, 11, 13, 1, -10 }, // 0x77 'w' - { 1494, 11, 11, 13, 1, -10 }, // 0x78 'x' - { 1510, 11, 11, 13, 1, -10 }, // 0x79 'y' - { 1526, 11, 11, 13, 1, -10 }, // 0x7A 'z' - { 1542, 9, 16, 13, 1, -15 }, // 0x7B '{' - { 1560, 2, 16, 13, 5, -15 }, // 0x7C '|' - { 1564, 9, 16, 13, 3, -15 }, // 0x7D '}' - { 1582, 11, 4, 13, 1, -15 } }; // 0x7E '~' + { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' + { 1, 2, 16, 13, 5, -15 }, // 0x21 '!' + { 5, 7, 4, 13, 3, -15 }, // 0x22 '"' + { 9, 11, 16, 13, 1, -15 }, // 0x23 '#' + { 31, 11, 16, 13, 1, -15 }, // 0x24 '$' + { 53, 11, 16, 13, 1, -15 }, // 0x25 '%' + { 75, 11, 16, 13, 1, -15 }, // 0x26 '&' + { 97, 2, 4, 13, 5, -15 }, // 0x27 ''' + { 98, 6, 16, 13, 3, -15 }, // 0x28 '(' + { 110, 6, 16, 13, 3, -15 }, // 0x29 ')' + { 122, 6, 7, 13, 3, -15 }, // 0x2A '*' + { 128, 11, 11, 13, 1, -10 }, // 0x2B '+' + { 144, 4, 7, 13, 4, -6 }, // 0x2C ',' + { 148, 6, 2, 13, 3, -6 }, // 0x2D '-' + { 150, 4, 4, 13, 4, -3 }, // 0x2E '.' + { 152, 11, 16, 13, 1, -15 }, // 0x2F '/' + { 174, 11, 16, 13, 1, -15 }, // 0x30 '0' + { 196, 7, 16, 13, 3, -15 }, // 0x31 '1' + { 210, 11, 16, 13, 1, -15 }, // 0x32 '2' + { 232, 11, 16, 13, 1, -15 }, // 0x33 '3' + { 254, 11, 16, 13, 1, -15 }, // 0x34 '4' + { 276, 11, 16, 13, 1, -15 }, // 0x35 '5' + { 298, 11, 16, 13, 1, -15 }, // 0x36 '6' + { 320, 11, 16, 13, 1, -15 }, // 0x37 '7' + { 342, 11, 16, 13, 1, -15 }, // 0x38 '8' + { 364, 11, 16, 13, 1, -15 }, // 0x39 '9' + { 386, 4, 11, 13, 4, -10 }, // 0x3A ':' + { 392, 4, 14, 13, 4, -13 }, // 0x3B ';' + { 399, 9, 16, 13, 2, -15 }, // 0x3C '<' + { 417, 11, 7, 13, 1, -8 }, // 0x3D '=' + { 427, 9, 16, 13, 3, -15 }, // 0x3E '>' + { 445, 11, 16, 13, 1, -15 }, // 0x3F '?' + { 467, 11, 16, 13, 1, -15 }, // 0x40 '@' + { 489, 11, 16, 13, 1, -15 }, // 0x41 'A' + { 511, 11, 16, 13, 1, -15 }, // 0x42 'B' + { 533, 11, 16, 13, 1, -15 }, // 0x43 'C' + { 555, 11, 16, 13, 1, -15 }, // 0x44 'D' + { 577, 11, 16, 13, 1, -15 }, // 0x45 'E' + { 599, 11, 16, 13, 1, -15 }, // 0x46 'F' + { 621, 11, 16, 13, 1, -15 }, // 0x47 'G' + { 643, 11, 16, 13, 1, -15 }, // 0x48 'H' + { 665, 7, 16, 13, 3, -15 }, // 0x49 'I' + { 679, 11, 16, 13, 1, -15 }, // 0x4A 'J' + { 701, 11, 16, 13, 1, -15 }, // 0x4B 'K' + { 723, 11, 16, 13, 1, -15 }, // 0x4C 'L' + { 745, 11, 16, 13, 1, -15 }, // 0x4D 'M' + { 767, 11, 16, 13, 1, -15 }, // 0x4E 'N' + { 789, 11, 16, 13, 1, -15 }, // 0x4F 'O' + { 811, 11, 16, 13, 1, -15 }, // 0x50 'P' + { 833, 11, 16, 13, 1, -15 }, // 0x51 'Q' + { 855, 11, 16, 13, 1, -15 }, // 0x52 'R' + { 877, 11, 16, 13, 1, -15 }, // 0x53 'S' + { 899, 11, 16, 13, 1, -15 }, // 0x54 'T' + { 921, 11, 16, 13, 1, -15 }, // 0x55 'U' + { 943, 11, 16, 13, 1, -15 }, // 0x56 'V' + { 965, 11, 16, 13, 1, -15 }, // 0x57 'W' + { 987, 11, 16, 13, 1, -15 }, // 0x58 'X' + { 1009, 11, 16, 13, 1, -15 }, // 0x59 'Y' + { 1031, 11, 16, 13, 1, -15 }, // 0x5A 'Z' + { 1053, 7, 16, 13, 3, -15 }, // 0x5B '[' + { 1067, 11, 16, 13, 1, -15 }, // 0x5C '\' + { 1089, 7, 16, 13, 3, -15 }, // 0x5D ']' + { 1103, 11, 7, 13, 1, -15 }, // 0x5E '^' + { 1113, 11, 2, 13, 1, -1 }, // 0x5F '_' + { 1116, 4, 4, 13, 4, -15 }, // 0x60 '`' + { 1118, 11, 11, 13, 1, -10 }, // 0x61 'a' + { 1134, 11, 16, 13, 1, -15 }, // 0x62 'b' + { 1156, 11, 11, 13, 1, -10 }, // 0x63 'c' + { 1172, 11, 16, 13, 1, -15 }, // 0x64 'd' + { 1194, 11, 11, 13, 1, -10 }, // 0x65 'e' + { 1210, 11, 16, 13, 1, -15 }, // 0x66 'f' + { 1232, 11, 11, 13, 1, -10 }, // 0x67 'g' + { 1248, 11, 16, 13, 1, -15 }, // 0x68 'h' + { 1270, 2, 16, 13, 5, -15 }, // 0x69 'i' + { 1274, 9, 16, 13, 2, -15 }, // 0x6A 'j' + { 1292, 9, 16, 13, 1, -15 }, // 0x6B 'k' + { 1310, 2, 16, 13, 5, -15 }, // 0x6C 'l' + { 1314, 11, 11, 13, 1, -10 }, // 0x6D 'm' + { 1330, 11, 11, 13, 1, -10 }, // 0x6E 'n' + { 1346, 11, 11, 13, 1, -10 }, // 0x6F 'o' + { 1362, 11, 11, 13, 1, -10 }, // 0x70 'p' + { 1378, 11, 11, 13, 1, -10 }, // 0x71 'q' + { 1394, 11, 11, 13, 1, -10 }, // 0x72 'r' + { 1410, 11, 11, 13, 1, -10 }, // 0x73 's' + { 1426, 11, 14, 13, 1, -13 }, // 0x74 't' + { 1446, 11, 11, 13, 1, -10 }, // 0x75 'u' + { 1462, 11, 11, 13, 1, -10 }, // 0x76 'v' + { 1478, 11, 11, 13, 1, -10 }, // 0x77 'w' + { 1494, 11, 11, 13, 1, -10 }, // 0x78 'x' + { 1510, 11, 11, 13, 1, -10 }, // 0x79 'y' + { 1526, 11, 11, 13, 1, -10 }, // 0x7A 'z' + { 1542, 9, 16, 13, 1, -15 }, // 0x7B '{' + { 1560, 2, 16, 13, 5, -15 }, // 0x7C '|' + { 1564, 9, 16, 13, 3, -15 }, // 0x7D '}' + { 1582, 11, 4, 13, 1, -15 } }; // 0x7E '~' const GFXfont RepetitionScrolling12pt7b PROGMEM = { (uint8_t *)RepetitionScrolling12pt7bBitmaps, (GFXglyph *)RepetitionScrolling12pt7bGlyphs, - 0x20, 0x7E, 24 }; + 0x20, 0x7E, 24 }; // Approx. 2260 bytes +#endif // ifndef FONTS_REPETITIONSCROLLING12PT7B_H diff --git a/src/src/Static/Fonts/RobotoCondensed_Regular12pt7b.h b/src/src/Static/Fonts/RobotoCondensed_Regular12pt7b.h new file mode 100644 index 000000000..8eb1158bf --- /dev/null +++ b/src/src/Static/Fonts/RobotoCondensed_Regular12pt7b.h @@ -0,0 +1,250 @@ +#ifndef FONTS_ROBOTOCONDENSED_REGULAR12PT7B_H +#define FONTS_ROBOTOCONDENSED_REGULAR12PT7B_H +const uint8_t RobotoCondensed_Regular12pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0xDE, 0xF7, 0xB9, 0xC8, 0x0C, 0x81, + 0x30, 0x66, 0x0C, 0xCF, 0xFF, 0xFF, 0xC4, 0x40, 0x98, 0x33, 0x06, 0x63, + 0xFF, 0x7F, 0xE3, 0x20, 0x44, 0x09, 0x83, 0x30, 0x66, 0x00, 0x0C, 0x03, + 0x00, 0xC0, 0x78, 0x3F, 0x1C, 0xE6, 0x19, 0x87, 0x60, 0x1C, 0x03, 0xC0, + 0x7C, 0x07, 0x80, 0x60, 0x1F, 0x07, 0xE1, 0xD8, 0xE7, 0xF8, 0xF8, 0x0C, + 0x03, 0x00, 0x38, 0x01, 0xF0, 0x0C, 0xC6, 0x31, 0x10, 0xC4, 0xC3, 0x32, + 0x07, 0xD8, 0x0E, 0x40, 0x03, 0x00, 0x09, 0xC0, 0x6F, 0x81, 0x33, 0x0D, + 0x8C, 0x26, 0x31, 0x8C, 0xC4, 0x3E, 0x00, 0x70, 0x1E, 0x03, 0xF0, 0x73, + 0x86, 0x18, 0x63, 0x87, 0x30, 0x36, 0x03, 0xC0, 0x3C, 0x07, 0xE3, 0xE6, + 0x3C, 0x76, 0xC3, 0xEC, 0x1E, 0xE1, 0xC7, 0xFE, 0x3E, 0x70, 0xFF, 0xA0, + 0x08, 0x31, 0x8C, 0x31, 0x86, 0x18, 0x63, 0x8E, 0x38, 0xE3, 0x8E, 0x18, + 0x61, 0x86, 0x0C, 0x30, 0x60, 0x83, 0x43, 0x06, 0x0C, 0x30, 0x61, 0x86, + 0x18, 0x71, 0xC3, 0x1C, 0x71, 0xC6, 0x18, 0x61, 0x8C, 0x31, 0x84, 0x30, + 0x0C, 0x06, 0x03, 0x0D, 0xBF, 0xF8, 0xE0, 0x70, 0x6C, 0x33, 0x31, 0x00, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x3F, 0xFF, 0xFC, 0x30, 0x0C, 0x03, + 0x00, 0xC0, 0x30, 0xFF, 0x6D, 0x00, 0xFF, 0xC0, 0xF0, 0x03, 0x06, 0x06, + 0x06, 0x0C, 0x0C, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x30, 0x30, 0x20, 0x60, + 0x60, 0x40, 0xC0, 0x1E, 0x0F, 0xC7, 0x39, 0x86, 0xE1, 0xB8, 0x7E, 0x1F, + 0x87, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0x98, 0x67, 0x38, 0xFC, 0x1E, + 0x00, 0x1F, 0xFE, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, + 0x3E, 0x1F, 0xC6, 0x3B, 0x86, 0xC1, 0x80, 0x60, 0x18, 0x0E, 0x07, 0x01, + 0x80, 0xE0, 0x70, 0x38, 0x0C, 0x07, 0x03, 0xFF, 0xFF, 0xC0, 0x3E, 0x3F, + 0xB8, 0xFC, 0x3C, 0x18, 0x0C, 0x0E, 0x3E, 0x1F, 0x01, 0xC0, 0x60, 0x3C, + 0x1E, 0x0F, 0x8E, 0xFE, 0x3E, 0x00, 0x03, 0x01, 0xC0, 0xF0, 0x3C, 0x1B, + 0x06, 0xC3, 0x30, 0xCC, 0x63, 0x18, 0xCC, 0x33, 0xFF, 0xFF, 0xC0, 0xC0, + 0x30, 0x0C, 0x03, 0x00, 0x7F, 0x9F, 0xE6, 0x01, 0x80, 0x60, 0x18, 0x06, + 0xE1, 0xFE, 0x63, 0x88, 0x60, 0x1C, 0x07, 0xE1, 0xF8, 0x67, 0x39, 0xFC, + 0x1E, 0x00, 0x0F, 0x0F, 0xE7, 0x11, 0x80, 0xE0, 0x38, 0x0E, 0xF3, 0xFE, + 0xE3, 0xB8, 0x7E, 0x1F, 0x83, 0xE1, 0xD8, 0x77, 0x38, 0xFE, 0x1E, 0x00, + 0xFF, 0xFF, 0xF0, 0x18, 0x0E, 0x03, 0x01, 0x80, 0x60, 0x38, 0x0C, 0x03, + 0x01, 0xC0, 0x70, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x00, 0x1E, 0x1F, + 0xC7, 0x3B, 0x86, 0xE1, 0x98, 0x67, 0x38, 0xFC, 0x3F, 0x18, 0xEE, 0x1B, + 0x07, 0xC1, 0xF8, 0x7E, 0x39, 0xFE, 0x1E, 0x00, 0x1E, 0x3F, 0x98, 0xFC, + 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xE1, 0xB1, 0xDF, 0xE7, 0xB0, 0x18, 0x0C, + 0x0E, 0xFE, 0x3E, 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x6C, 0x00, 0x00, 0x01, + 0xB7, 0xB6, 0x03, 0x0F, 0x1E, 0x78, 0xE0, 0xE0, 0x78, 0x1E, 0x0F, 0x03, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x78, 0x0F, 0x01, 0xE0, + 0x38, 0x1C, 0x3C, 0x78, 0xF0, 0x60, 0x00, 0x3C, 0xFE, 0xE7, 0xC3, 0x03, + 0x03, 0x03, 0x07, 0x0E, 0x0C, 0x18, 0x18, 0x38, 0x00, 0x00, 0x38, 0x38, + 0x03, 0xF0, 0x07, 0xFE, 0x07, 0x03, 0x87, 0x00, 0xE3, 0x00, 0x33, 0x0F, + 0x09, 0x8F, 0xC6, 0x86, 0x63, 0xC6, 0x31, 0xE3, 0x18, 0x71, 0x8C, 0x38, + 0x86, 0x3C, 0xC3, 0x1E, 0x61, 0x8F, 0x19, 0xCD, 0x8F, 0xFE, 0x63, 0x9C, + 0x30, 0x00, 0x0C, 0x00, 0x07, 0x82, 0x01, 0xFF, 0x00, 0x3F, 0x00, 0x07, + 0x00, 0x38, 0x01, 0xE0, 0x1F, 0x00, 0xD8, 0x06, 0xE0, 0x33, 0x03, 0x98, + 0x18, 0xC0, 0xC7, 0x0E, 0x18, 0x7F, 0xC3, 0xFF, 0x38, 0x19, 0xC0, 0xCC, + 0x07, 0xE0, 0x38, 0xFE, 0x3F, 0xEC, 0x3B, 0x06, 0xC1, 0xF0, 0x6C, 0x3B, + 0xFC, 0xFF, 0xB0, 0x6C, 0x1F, 0x03, 0xC0, 0xF0, 0x7C, 0x1F, 0xFE, 0xFF, + 0x00, 0x1F, 0x07, 0xF9, 0xC7, 0x70, 0x7E, 0x0F, 0x80, 0x30, 0x06, 0x00, + 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0E, 0x0E, 0xC1, 0xDC, 0x71, 0xFE, 0x1F, + 0x00, 0xFE, 0x1F, 0xE3, 0x0E, 0x60, 0xEC, 0x0D, 0x81, 0xB0, 0x36, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0x60, 0x6C, 0x0D, 0x83, 0xB0, 0xE7, 0xF8, 0xFE, + 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xFE, 0xFF, 0x60, + 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF0, + 0x18, 0x0C, 0x06, 0x03, 0x01, 0xFE, 0xFF, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0x01, 0x80, 0xC0, 0x00, 0x1F, 0x87, 0xF9, 0xC3, 0xB0, 0x3E, 0x07, + 0xC0, 0x38, 0x07, 0x00, 0xE3, 0xFC, 0x7F, 0x81, 0xF0, 0x3E, 0x06, 0xC0, + 0xDC, 0x39, 0xFE, 0x0F, 0x80, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, + 0x80, 0xF0, 0x1F, 0xFF, 0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x1E, 0x03, 0xC0, 0x60, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x01, 0x80, + 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x3C, + 0x1E, 0x1F, 0x8C, 0xFE, 0x3E, 0x00, 0xC0, 0xF8, 0x3B, 0x0E, 0x61, 0x8C, + 0x71, 0x9C, 0x33, 0x07, 0xE0, 0xFC, 0x19, 0x83, 0x18, 0x63, 0x8C, 0x31, + 0x87, 0x30, 0x76, 0x0E, 0xC0, 0xE0, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, + 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0xFF, + 0xFF, 0x80, 0xE0, 0x1F, 0x80, 0xFE, 0x03, 0xFC, 0x0F, 0xF0, 0x6F, 0xC1, + 0xBD, 0x86, 0xF6, 0x17, 0xD8, 0xDF, 0x23, 0x7C, 0xCD, 0xF3, 0x67, 0xCD, + 0x9F, 0x1E, 0x7C, 0x71, 0xF1, 0xC7, 0xC3, 0x1C, 0xC0, 0x7C, 0x0F, 0x81, + 0xF8, 0x3F, 0x07, 0xB0, 0xF6, 0x1E, 0x63, 0xCC, 0x78, 0xCF, 0x19, 0xE1, + 0xBC, 0x37, 0x83, 0xF0, 0x7E, 0x07, 0xC0, 0xE0, 0x1F, 0x03, 0xFC, 0x70, + 0xEE, 0x06, 0xE0, 0x6C, 0x06, 0xC0, 0x7C, 0x07, 0xC0, 0x7C, 0x07, 0xC0, + 0x7C, 0x06, 0xE0, 0x6E, 0x06, 0x70, 0xE3, 0xFC, 0x1F, 0x00, 0xFF, 0x3F, + 0xEC, 0x1F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x07, 0xFF, 0xBF, 0xCC, 0x03, + 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x00, 0x1F, 0x01, 0xFE, 0x1C, + 0x38, 0xC0, 0xCE, 0x06, 0x60, 0x3B, 0x01, 0xD8, 0x0E, 0xC0, 0x76, 0x03, + 0xB0, 0x1D, 0x80, 0xEE, 0x06, 0x70, 0x31, 0xC3, 0x87, 0xF8, 0x1F, 0xE0, + 0x03, 0x80, 0x0E, 0xFF, 0x1F, 0xF3, 0x07, 0x60, 0xEC, 0x0D, 0x81, 0xB0, + 0x76, 0x0C, 0xFF, 0x1F, 0xF3, 0x07, 0x60, 0xEC, 0x0D, 0x81, 0xB0, 0x36, + 0x06, 0xC0, 0xE0, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7E, 0x0F, 0xC0, 0x1C, + 0x01, 0xF0, 0x1F, 0x80, 0x78, 0x03, 0x00, 0x7C, 0x0F, 0xC1, 0xDC, 0x73, + 0xFE, 0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0x06, 0x00, 0x60, 0x06, 0x00, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, + 0xC0, 0xF8, 0x1F, 0x03, 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x06, 0xC1, + 0xDC, 0x39, 0xFE, 0x1F, 0x00, 0xE0, 0x3B, 0x01, 0x98, 0x0C, 0xE0, 0xE3, + 0x06, 0x18, 0x30, 0xE1, 0x83, 0x1C, 0x18, 0xC0, 0xC6, 0x07, 0x30, 0x1B, + 0x00, 0xD8, 0x06, 0xC0, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0xE0, 0xC1, 0xD8, + 0x30, 0x66, 0x1E, 0x19, 0x87, 0x86, 0x71, 0xE3, 0x8C, 0x78, 0xE3, 0x1F, + 0x30, 0xCC, 0xCC, 0x33, 0x33, 0x0E, 0xCD, 0xC1, 0xB3, 0xF0, 0x78, 0x78, + 0x1E, 0x1E, 0x07, 0x87, 0x81, 0xE1, 0xE0, 0x30, 0x38, 0x0C, 0x0C, 0x00, + 0xE0, 0xEE, 0x0E, 0x71, 0xC3, 0x1C, 0x39, 0x81, 0xB8, 0x1B, 0x00, 0xE0, + 0x0E, 0x00, 0xF0, 0x1B, 0x03, 0xB8, 0x31, 0x87, 0x1C, 0x70, 0xCE, 0x0E, + 0xE0, 0xF0, 0xE0, 0x3B, 0x83, 0x9C, 0x18, 0x61, 0xC3, 0x8E, 0x0C, 0x60, + 0x77, 0x01, 0xB0, 0x0F, 0x80, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, + 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0xFF, 0xFF, 0xF0, 0x18, 0x0E, 0x03, + 0x01, 0xC0, 0x60, 0x38, 0x0C, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0E, + 0x03, 0xFF, 0xFF, 0xC0, 0xFF, 0xF9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0xFF, 0xE0, 0x30, 0x18, 0x0E, 0x03, + 0x01, 0x80, 0xE0, 0x30, 0x18, 0x0E, 0x03, 0x01, 0x80, 0xE0, 0x30, 0x18, + 0x0E, 0x03, 0x01, 0xC0, 0xFF, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0xFF, 0x30, 0x70, 0xE3, 0x46, 0xCD, 0xB1, 0x63, 0xC6, + 0xFF, 0xFF, 0xC0, 0xE3, 0x8E, 0x3E, 0x3F, 0xB8, 0xFC, 0x70, 0x39, 0xFD, + 0xFF, 0xC7, 0xC3, 0xE1, 0xF8, 0xEF, 0xB3, 0x98, 0xE0, 0x38, 0x0E, 0x03, + 0x80, 0xE0, 0x38, 0x0E, 0xF3, 0xFE, 0xF3, 0xB8, 0x6E, 0x1F, 0x87, 0xE1, + 0xF8, 0x7E, 0x1F, 0x87, 0xF3, 0xBF, 0xEC, 0xF0, 0x3E, 0x3F, 0x98, 0xFC, + 0x3C, 0x1E, 0x03, 0x01, 0x80, 0xC0, 0x70, 0xD8, 0xEF, 0xE3, 0xE0, 0x01, + 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0xF6, 0xFF, 0x63, 0xF0, 0xF0, 0x78, + 0x3C, 0x1E, 0x0F, 0x07, 0xC3, 0x63, 0xBF, 0xCF, 0x60, 0x1E, 0x3F, 0x98, + 0xFC, 0x3C, 0x1F, 0xFF, 0xFF, 0x80, 0xC0, 0x70, 0x1C, 0x4F, 0xF1, 0xE0, + 0x1C, 0xF7, 0x1C, 0x71, 0xCF, 0xFF, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x00, 0x3D, 0xBF, 0xD8, 0xFC, 0x3C, 0x1E, 0x0F, 0x07, 0x83, + 0xC1, 0xF0, 0xF8, 0xEF, 0xF3, 0xD8, 0x0C, 0x06, 0x87, 0x7F, 0x1F, 0x00, + 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xBD, 0xFF, 0xF3, 0xF0, 0xF8, + 0x7C, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xF8, 0x60, 0xF0, 0x3F, + 0xFF, 0xFF, 0xF0, 0x18, 0xC0, 0x00, 0x0C, 0x63, 0x18, 0xC6, 0x31, 0x8C, + 0x63, 0x18, 0xC6, 0x33, 0xFB, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, + 0x38, 0x0E, 0x3B, 0x8C, 0xE7, 0x39, 0x8E, 0xC3, 0xF0, 0xFC, 0x3B, 0x8E, + 0x63, 0x9C, 0xE3, 0x38, 0xEE, 0x1C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xEE, + 0x3C, 0xFF, 0x7E, 0xE3, 0xCE, 0xE1, 0x86, 0xE1, 0x86, 0xE1, 0x87, 0xE1, + 0x87, 0xE1, 0x87, 0xE1, 0x87, 0xE1, 0x87, 0xE1, 0x87, 0xE1, 0x87, 0xE1, + 0x87, 0xEF, 0x7F, 0xFC, 0xFC, 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, + 0xF8, 0x7C, 0x3E, 0x18, 0x1E, 0x1F, 0xC6, 0x3B, 0x86, 0xC1, 0xF0, 0x7C, + 0x1F, 0x07, 0xC1, 0xF8, 0x66, 0x39, 0xFC, 0x1E, 0x00, 0xEE, 0x3F, 0xEF, + 0x3B, 0x86, 0xE1, 0xF8, 0x7E, 0x1F, 0x87, 0xE1, 0xF8, 0x7E, 0x3B, 0xFE, + 0xEF, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x00, 0x3D, 0xBF, 0xD8, 0xFC, + 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xF0, 0xF8, 0xEF, 0xF3, 0xD8, 0x0C, + 0x06, 0x03, 0x01, 0x80, 0xC0, 0xEF, 0xFE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, + 0x8E, 0x38, 0xE0, 0x3E, 0x3F, 0xB8, 0xD8, 0x7E, 0x03, 0xC0, 0xF8, 0x0E, + 0x03, 0xE1, 0xF8, 0xCF, 0xE3, 0xE0, 0x30, 0x60, 0xC7, 0xEF, 0xC6, 0x0C, + 0x18, 0x30, 0x60, 0xC1, 0x83, 0x07, 0x0F, 0x8F, 0xE1, 0xF0, 0xF8, 0x7C, + 0x3E, 0x1F, 0x0F, 0x87, 0xC3, 0xE1, 0xF0, 0xD8, 0xEF, 0xF3, 0xD8, 0xE0, + 0xD8, 0x76, 0x19, 0xC6, 0x31, 0x8C, 0xE3, 0x30, 0x6C, 0x1B, 0x07, 0x81, + 0xE0, 0x38, 0x0C, 0x00, 0xE1, 0x8E, 0xC7, 0x19, 0x8E, 0x33, 0x1C, 0x67, + 0x3C, 0xC6, 0xDB, 0x8D, 0xB6, 0x1B, 0x2C, 0x36, 0x78, 0x38, 0xF0, 0x71, + 0xC0, 0xE1, 0x81, 0xC3, 0x00, 0x61, 0xDC, 0x63, 0x38, 0xEC, 0x1F, 0x07, + 0x80, 0xE0, 0x78, 0x1F, 0x0E, 0xC3, 0x39, 0xC6, 0xE1, 0xC0, 0xE1, 0xD8, + 0x76, 0x19, 0xC6, 0x33, 0x8C, 0xE3, 0x30, 0x6C, 0x1F, 0x07, 0x81, 0xE0, + 0x38, 0x0C, 0x03, 0x00, 0xC0, 0x70, 0x78, 0x1C, 0x00, 0xFF, 0xFF, 0x07, + 0x06, 0x0C, 0x1C, 0x18, 0x38, 0x30, 0x60, 0xE0, 0xFF, 0xFF, 0x08, 0x73, + 0x0C, 0x30, 0xC3, 0x0C, 0x71, 0xCE, 0x30, 0x61, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0x30, 0x60, 0xC0, 0xFF, 0xFF, 0xF0, 0x43, 0x83, 0x0C, 0x30, 0xC3, + 0x0C, 0x30, 0xE1, 0xC3, 0x18, 0xE3, 0x0C, 0x30, 0xC3, 0x0C, 0x31, 0x8C, + 0x00, 0x38, 0x4F, 0x87, 0x39, 0xE3, 0xF0, 0x1C }; + +const GFXglyph RobotoCondensed_Regular12pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 5, 0, 0 }, // 0x20 ' ' + { 1, 2, 17, 6, 2, -16 }, // 0x21 '!' + { 6, 5, 6, 7, 1, -18 }, // 0x22 '"' + { 10, 11, 17, 13, 1, -16 }, // 0x23 '#' + { 34, 10, 22, 12, 1, -19 }, // 0x24 '$' + { 62, 14, 17, 16, 1, -16 }, // 0x25 '%' + { 92, 12, 17, 14, 1, -16 }, // 0x26 '&' + { 118, 2, 6, 4, 1, -18 }, // 0x27 ''' + { 120, 6, 24, 7, 1, -18 }, // 0x28 '(' + { 138, 6, 24, 7, 0, -18 }, // 0x29 ')' + { 156, 9, 10, 9, 0, -16 }, // 0x2A '*' + { 168, 10, 12, 12, 1, -13 }, // 0x2B '+' + { 183, 3, 6, 5, 1, -2 }, // 0x2C ',' + { 186, 5, 2, 7, 1, -7 }, // 0x2D '-' + { 188, 2, 2, 6, 2, -1 }, // 0x2E '.' + { 189, 8, 18, 8, 0, -16 }, // 0x2F '/' + { 207, 10, 17, 12, 1, -16 }, // 0x30 '0' + { 229, 5, 17, 12, 2, -16 }, // 0x31 '1' + { 240, 10, 17, 12, 1, -16 }, // 0x32 '2' + { 262, 9, 17, 12, 1, -16 }, // 0x33 '3' + { 282, 10, 17, 12, 1, -16 }, // 0x34 '4' + { 304, 10, 17, 12, 1, -16 }, // 0x35 '5' + { 326, 10, 17, 12, 1, -16 }, // 0x36 '6' + { 348, 10, 17, 12, 1, -16 }, // 0x37 '7' + { 370, 10, 17, 12, 1, -16 }, // 0x38 '8' + { 392, 9, 17, 12, 1, -16 }, // 0x39 '9' + { 412, 2, 13, 6, 2, -12 }, // 0x3A ':' + { 416, 3, 16, 6, 1, -12 }, // 0x3B ';' + { 422, 8, 10, 11, 1, -10 }, // 0x3C '<' + { 432, 8, 7, 12, 2, -10 }, // 0x3D '=' + { 439, 9, 10, 11, 1, -10 }, // 0x3E '>' + { 451, 8, 17, 10, 1, -16 }, // 0x3F '?' + { 468, 17, 22, 19, 1, -16 }, // 0x40 '@' + { 515, 13, 17, 13, 0, -16 }, // 0x41 'A' + { 543, 10, 17, 13, 2, -16 }, // 0x42 'B' + { 565, 11, 17, 13, 1, -16 }, // 0x43 'C' + { 589, 11, 17, 14, 2, -16 }, // 0x44 'D' + { 613, 9, 17, 12, 2, -16 }, // 0x45 'E' + { 633, 9, 17, 12, 2, -16 }, // 0x46 'F' + { 653, 11, 17, 14, 1, -16 }, // 0x47 'G' + { 677, 11, 17, 15, 2, -16 }, // 0x48 'H' + { 701, 2, 17, 6, 2, -16 }, // 0x49 'I' + { 706, 9, 17, 12, 1, -16 }, // 0x4A 'J' + { 726, 11, 17, 13, 2, -16 }, // 0x4B 'K' + { 750, 9, 17, 11, 2, -16 }, // 0x4C 'L' + { 770, 14, 17, 17, 2, -16 }, // 0x4D 'M' + { 800, 11, 17, 15, 2, -16 }, // 0x4E 'N' + { 824, 12, 17, 14, 1, -16 }, // 0x4F 'O' + { 850, 10, 17, 13, 2, -16 }, // 0x50 'P' + { 872, 13, 19, 14, 1, -16 }, // 0x51 'Q' + { 903, 11, 17, 14, 2, -16 }, // 0x52 'R' + { 927, 11, 17, 13, 1, -16 }, // 0x53 'S' + { 951, 12, 17, 12, 0, -16 }, // 0x54 'T' + { 977, 11, 17, 14, 1, -16 }, // 0x55 'U' + { 1001, 13, 17, 13, 0, -16 }, // 0x56 'V' + { 1029, 18, 17, 18, 0, -16 }, // 0x57 'W' + { 1068, 12, 17, 13, 1, -16 }, // 0x58 'X' + { 1094, 13, 17, 13, 0, -16 }, // 0x59 'Y' + { 1122, 10, 17, 12, 1, -16 }, // 0x5A 'Z' + { 1144, 5, 24, 6, 1, -19 }, // 0x5B '[' + { 1159, 9, 18, 9, 0, -16 }, // 0x5C '\' + { 1180, 4, 24, 6, 0, -19 }, // 0x5D ']' + { 1192, 7, 9, 9, 1, -16 }, // 0x5E '^' + { 1200, 9, 2, 9, 0, 1 }, // 0x5F '_' + { 1203, 5, 3, 7, 1, -16 }, // 0x60 '`' + { 1205, 9, 13, 11, 1, -12 }, // 0x61 'a' + { 1220, 10, 19, 12, 1, -18 }, // 0x62 'b' + { 1244, 9, 13, 11, 1, -12 }, // 0x63 'c' + { 1259, 9, 19, 12, 1, -18 }, // 0x64 'd' + { 1281, 9, 13, 11, 1, -12 }, // 0x65 'e' + { 1296, 6, 19, 7, 1, -18 }, // 0x66 'f' + { 1311, 9, 18, 12, 1, -12 }, // 0x67 'g' + { 1332, 9, 19, 12, 1, -18 }, // 0x68 'h' + { 1354, 2, 18, 5, 2, -17 }, // 0x69 'i' + { 1359, 5, 23, 5, -1, -17 }, // 0x6A 'j' + { 1374, 10, 19, 11, 1, -18 }, // 0x6B 'k' + { 1398, 2, 19, 5, 2, -18 }, // 0x6C 'l' + { 1403, 16, 13, 18, 1, -12 }, // 0x6D 'm' + { 1429, 9, 13, 12, 1, -12 }, // 0x6E 'n' + { 1444, 10, 13, 12, 1, -12 }, // 0x6F 'o' + { 1461, 10, 18, 12, 1, -12 }, // 0x70 'p' + { 1484, 9, 18, 12, 1, -12 }, // 0x71 'q' + { 1505, 6, 13, 7, 1, -12 }, // 0x72 'r' + { 1515, 9, 13, 10, 1, -12 }, // 0x73 's' + { 1530, 7, 16, 7, 0, -15 }, // 0x74 't' + { 1544, 9, 13, 12, 1, -12 }, // 0x75 'u' + { 1559, 10, 13, 10, 0, -12 }, // 0x76 'v' + { 1576, 15, 13, 15, 0, -12 }, // 0x77 'w' + { 1601, 10, 13, 10, 0, -12 }, // 0x78 'x' + { 1618, 10, 18, 10, 0, -12 }, // 0x79 'y' + { 1641, 8, 13, 10, 1, -12 }, // 0x7A 'z' + { 1654, 6, 23, 7, 1, -18 }, // 0x7B '{' + { 1672, 1, 20, 5, 2, -16 }, // 0x7C '|' + { 1675, 6, 23, 7, 0, -18 }, // 0x7D '}' + { 1693, 11, 5, 14, 1, -9 } }; // 0x7E '~' + +const GFXfont RobotoCondensed_Regular12pt7b PROGMEM = { + (uint8_t *)RobotoCondensed_Regular12pt7bBitmaps, + (GFXglyph *)RobotoCondensed_Regular12pt7bGlyphs, + 0x20, 0x7E, 31 }; + +// Approx. 2372 bytes +#endif // ifndef FONTS_ROBOTOCONDENSED_REGULAR12PT7B_H diff --git a/src/src/Static/Fonts/RobotoCondensed_Regular16pt7b.h b/src/src/Static/Fonts/RobotoCondensed_Regular16pt7b.h new file mode 100644 index 000000000..1e86de1f1 --- /dev/null +++ b/src/src/Static/Fonts/RobotoCondensed_Regular16pt7b.h @@ -0,0 +1,343 @@ +#ifndef FONTS_ROBOTOCONDENSED_REGULAR16PT7B_H +#define FONTS_ROBOTOCONDENSED_REGULAR16PT7B_H +const uint8_t RobotoCondensed_Regular16pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xC0, 0xEF, 0xDF, + 0xBF, 0x7C, 0xF9, 0xB3, 0x66, 0x06, 0x30, 0x18, 0xC0, 0x63, 0x01, 0x8C, + 0x06, 0x30, 0x39, 0xC7, 0xFF, 0xDF, 0xFF, 0x0C, 0x60, 0x31, 0x80, 0xC6, + 0x03, 0x18, 0x18, 0xC0, 0x63, 0x0F, 0xFF, 0xBF, 0xFE, 0x18, 0xC0, 0x63, + 0x03, 0x9C, 0x0C, 0x60, 0x31, 0x80, 0xC6, 0x00, 0x03, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x00, 0xF8, 0x0F, 0xF0, 0xE3, 0xCF, 0x0E, 0x70, 0x73, 0x83, + 0xDC, 0x0E, 0xE0, 0x03, 0x80, 0x1E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xE0, + 0x07, 0x80, 0x1D, 0xC0, 0x7F, 0x03, 0xB8, 0x3D, 0xC1, 0xCF, 0x1E, 0x3F, + 0xE0, 0x7E, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x00, 0x1E, 0x00, 0x1F, 0xC0, + 0x06, 0x30, 0xC1, 0x8E, 0x30, 0xE3, 0x9C, 0x38, 0xE6, 0x06, 0x3B, 0x01, + 0x8C, 0xC0, 0x7F, 0x60, 0x07, 0x98, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x01, + 0x8F, 0x00, 0x67, 0xE0, 0x33, 0x9C, 0x0C, 0xC3, 0x06, 0x30, 0xC3, 0x8C, + 0x30, 0xC3, 0x0C, 0x30, 0xE7, 0x00, 0x1F, 0x80, 0x03, 0xC0, 0x0F, 0x80, + 0x1F, 0xC0, 0x3C, 0xE0, 0x38, 0x60, 0x38, 0x60, 0x38, 0x60, 0x38, 0xE0, + 0x39, 0xE0, 0x1F, 0xC0, 0x1F, 0x00, 0x0E, 0x00, 0x3F, 0x00, 0x7F, 0x86, + 0x73, 0xC6, 0xE1, 0xC6, 0xE0, 0xEE, 0xE0, 0xFE, 0xE0, 0x7C, 0xF0, 0x38, + 0x78, 0x7C, 0x3F, 0xFE, 0x1F, 0x8F, 0xFF, 0xFD, 0xB6, 0x04, 0x1C, 0x30, + 0xC3, 0x86, 0x1C, 0x38, 0x61, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, + 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x30, 0x70, 0xE0, 0xC1, 0xC1, 0x81, 0x83, + 0x82, 0x41, 0xC1, 0xC1, 0x83, 0x83, 0x07, 0x0E, 0x0C, 0x1C, 0x38, 0x70, + 0xE1, 0xC1, 0x83, 0x06, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x86, 0x1C, 0x38, + 0x61, 0xC3, 0x0E, 0x38, 0x20, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x66, + 0x67, 0xFF, 0xBF, 0xC0, 0xF0, 0x0F, 0x01, 0x98, 0x39, 0xC3, 0x0C, 0x10, + 0x80, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, + 0x1F, 0xFF, 0xFF, 0xF8, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, + 0x1C, 0x00, 0xE0, 0x77, 0x76, 0xEC, 0xC0, 0xFF, 0xFC, 0xFF, 0x80, 0x01, + 0xC0, 0x60, 0x18, 0x0E, 0x03, 0x00, 0xC0, 0x70, 0x1C, 0x06, 0x01, 0x80, + 0xE0, 0x30, 0x0C, 0x07, 0x01, 0x80, 0x60, 0x38, 0x0E, 0x03, 0x01, 0xC0, + 0x70, 0x18, 0x06, 0x03, 0x80, 0x0F, 0x80, 0xFE, 0x0E, 0x38, 0xE0, 0xE7, + 0x07, 0x38, 0x39, 0xC0, 0xFE, 0x07, 0xF0, 0x3F, 0x81, 0xFC, 0x0F, 0xE0, + 0x7F, 0x03, 0xF8, 0x1F, 0xC0, 0xEE, 0x07, 0x70, 0x73, 0x83, 0x9C, 0x1C, + 0x71, 0xC1, 0xFC, 0x07, 0xC0, 0x0F, 0xFF, 0xFF, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, + 0x0F, 0x0F, 0x0F, 0x0F, 0x81, 0xFF, 0x1E, 0x38, 0xE0, 0xEF, 0x07, 0x70, + 0x3B, 0x81, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03, 0x80, 0x3C, + 0x01, 0xC0, 0x1C, 0x01, 0xC0, 0x1E, 0x01, 0xE0, 0x0E, 0x00, 0xF0, 0x07, + 0xFF, 0xBF, 0xFC, 0x0F, 0x81, 0xFE, 0x1E, 0x38, 0xE0, 0xEF, 0x07, 0x70, + 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x07, 0x03, 0xF0, 0x1F, 0x80, 0x0E, + 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xE0, 0x7F, 0x03, 0x9C, 0x1C, 0xF1, 0xE3, + 0xFE, 0x07, 0xC0, 0x00, 0xE0, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x7E, 0x03, + 0x70, 0x3B, 0x81, 0x9C, 0x1C, 0xE0, 0xC7, 0x0E, 0x38, 0xE1, 0xC7, 0x0E, + 0x70, 0x73, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0x7F, 0xE7, 0xFE, 0x70, 0x07, 0x00, 0x70, 0x06, 0x00, + 0x60, 0x06, 0x00, 0xEF, 0x8F, 0xFC, 0xF1, 0xEE, 0x0E, 0x00, 0xE0, 0x07, + 0x00, 0x70, 0x07, 0xE0, 0x7E, 0x0E, 0xE0, 0xE7, 0x1E, 0x7F, 0xC1, 0xF0, + 0x0F, 0xC1, 0xFC, 0x38, 0x47, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0xF8, + 0xFF, 0xCF, 0x1E, 0xE0, 0xEE, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, + 0xE0, 0x7E, 0x07, 0x70, 0xE7, 0x9E, 0x3F, 0xC0, 0xF0, 0xFF, 0xFF, 0xFF, + 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03, 0x80, + 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x0F, 0x81, 0xFF, + 0x0E, 0x38, 0xE0, 0xE7, 0x07, 0x38, 0x39, 0xC1, 0xCE, 0x0E, 0x70, 0x71, + 0xC7, 0x07, 0xF0, 0x3F, 0x83, 0x8E, 0x38, 0x39, 0xC0, 0xFC, 0x07, 0xE0, + 0x3F, 0x81, 0xDC, 0x1C, 0xF1, 0xE3, 0xFE, 0x07, 0xC0, 0x0F, 0x80, 0xFE, + 0x0E, 0x38, 0xE0, 0xE7, 0x07, 0x70, 0x3B, 0x81, 0xDC, 0x0F, 0xE0, 0x7F, + 0x03, 0xDC, 0x1E, 0xE0, 0xF7, 0x8F, 0x9F, 0xFC, 0x7D, 0xE0, 0x0E, 0x00, + 0x70, 0x03, 0x80, 0x3C, 0x43, 0xC3, 0xFC, 0x0F, 0x80, 0xFF, 0x80, 0x00, + 0x00, 0x00, 0x3F, 0xE0, 0x77, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, + 0x77, 0x66, 0xE0, 0x00, 0x20, 0x1C, 0x07, 0x83, 0xE1, 0xF0, 0xF8, 0x3C, + 0x07, 0x80, 0x7C, 0x03, 0xE0, 0x1F, 0x00, 0xF0, 0x0E, 0x00, 0x40, 0xFF, + 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x80, 0x18, + 0x03, 0xC0, 0x7E, 0x01, 0xF0, 0x0F, 0x80, 0x78, 0x0F, 0x07, 0xC3, 0xE3, + 0xF0, 0x78, 0x0C, 0x01, 0x00, 0x00, 0x1F, 0x0F, 0xF3, 0xC7, 0x70, 0x7E, + 0x0F, 0xC1, 0xC0, 0x38, 0x07, 0x01, 0xE0, 0x38, 0x0E, 0x03, 0xC0, 0xF0, + 0x1C, 0x03, 0x80, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x01, 0xE0, 0x3C, + 0x00, 0x00, 0x7E, 0x00, 0x07, 0xFF, 0x80, 0x1E, 0x07, 0x80, 0x70, 0x03, + 0x81, 0xC0, 0x03, 0x03, 0x00, 0x03, 0x0E, 0x00, 0x06, 0x18, 0x1E, 0x06, + 0x70, 0x7F, 0x0C, 0xC1, 0xC6, 0x19, 0x87, 0x0C, 0x33, 0x0C, 0x18, 0x6E, + 0x18, 0x30, 0xDC, 0x70, 0xE1, 0xB8, 0xE1, 0xC3, 0x71, 0xC3, 0x86, 0xE3, + 0x86, 0x0D, 0xC7, 0x0C, 0x1B, 0x8E, 0x18, 0x63, 0x1C, 0x79, 0xC6, 0x1F, + 0xBF, 0x0C, 0x1E, 0x3C, 0x1C, 0x00, 0x00, 0x18, 0x00, 0x00, 0x38, 0x00, + 0x00, 0x38, 0x00, 0x00, 0x3C, 0x0C, 0x00, 0x3F, 0xF8, 0x00, 0x1F, 0xC0, + 0x00, 0x01, 0xC0, 0x00, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3F, 0x00, + 0x3B, 0x80, 0x1D, 0xC0, 0x0E, 0x60, 0x06, 0x38, 0x07, 0x1C, 0x03, 0x8E, + 0x01, 0xC3, 0x81, 0xC1, 0xC0, 0xE0, 0xE0, 0x7F, 0xF8, 0x7F, 0xFC, 0x38, + 0x0E, 0x1C, 0x03, 0x9C, 0x01, 0xCE, 0x00, 0xE7, 0x00, 0x77, 0x80, 0x1C, + 0xFF, 0x83, 0xFF, 0x8E, 0x0F, 0x38, 0x1C, 0xE0, 0x3B, 0x80, 0xEE, 0x03, + 0xB8, 0x0E, 0xE0, 0x73, 0x83, 0xCF, 0xFE, 0x3F, 0xFC, 0xE0, 0x7B, 0x80, + 0xEE, 0x03, 0xB8, 0x07, 0xE0, 0x1F, 0x80, 0xEE, 0x03, 0xB8, 0x1E, 0xFF, + 0xF3, 0xFF, 0x00, 0x07, 0xE0, 0x7F, 0xC3, 0xC7, 0x9E, 0x07, 0x70, 0x1D, + 0xC0, 0x7F, 0x01, 0xF8, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, + 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x3C, 0x07, 0x70, 0x1D, 0xC0, 0x77, 0x81, + 0xCF, 0x0E, 0x1F, 0xF0, 0x1F, 0x80, 0xFF, 0x83, 0xFF, 0x8E, 0x0F, 0x38, + 0x1E, 0xE0, 0x3B, 0x80, 0xFE, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x3F, + 0x80, 0xEE, 0x07, 0xB8, 0x3C, 0xFF, 0xE3, 0xFE, 0x00, 0xFF, 0xFF, 0xFF, + 0xF8, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0x00, 0x3F, 0xF9, 0xFF, 0xCE, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, + 0xF8, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0x00, 0x3F, 0xF9, 0xFF, 0xCE, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x00, 0x0F, 0xC0, 0xFF, + 0xC7, 0x87, 0xBC, 0x0E, 0xE0, 0x1F, 0x80, 0x7E, 0x00, 0x38, 0x00, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x38, 0x7F, 0xE1, 0xFF, 0x80, 0x7E, 0x01, 0xF8, + 0x07, 0xE0, 0x1F, 0x80, 0x7F, 0x01, 0xDE, 0x0E, 0x3F, 0xF0, 0x3F, 0x80, + 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, + 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x7E, 0x00, + 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, + 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xC0, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, + 0x00, 0x70, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0xE7, 0x1E, 0x3F, 0xC1, 0xF0, + 0xE0, 0x1F, 0xC0, 0x7B, 0x81, 0xE7, 0x03, 0x8E, 0x0F, 0x1C, 0x1C, 0x38, + 0x70, 0x71, 0xE0, 0xE3, 0x81, 0xCE, 0x03, 0xFC, 0x07, 0xF8, 0x0E, 0x38, + 0x1C, 0x78, 0x38, 0x70, 0x70, 0xF0, 0xE0, 0xF1, 0xC0, 0xE3, 0x81, 0xE7, + 0x01, 0xCE, 0x03, 0xDC, 0x03, 0xC0, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, + 0xFF, 0xFF, 0xFF, 0xF0, 0x03, 0xFC, 0x00, 0xFF, 0x80, 0x3F, 0xE0, 0x1F, + 0xF8, 0x07, 0xFF, 0x01, 0xBF, 0xC0, 0x6F, 0xB0, 0x3B, 0xEC, 0x0D, 0xFB, + 0x83, 0x7E, 0x61, 0xDF, 0x98, 0x77, 0xE7, 0x19, 0xF8, 0xC6, 0x7E, 0x33, + 0x9F, 0x8C, 0xC7, 0xE3, 0xB1, 0xF8, 0x7C, 0x7E, 0x1E, 0x1F, 0x87, 0x87, + 0xE0, 0xE1, 0xF8, 0x30, 0x70, 0xE0, 0x0F, 0xE0, 0x1F, 0xC0, 0x3F, 0xC0, + 0x7F, 0xC0, 0xFF, 0x81, 0xFB, 0x83, 0xF7, 0x07, 0xE7, 0x0F, 0xCE, 0x1F, + 0x8E, 0x3F, 0x1C, 0x7E, 0x1C, 0xFC, 0x39, 0xF8, 0x3B, 0xF0, 0x77, 0xE0, + 0x7F, 0xC0, 0xFF, 0x80, 0xFF, 0x01, 0xFE, 0x01, 0xFC, 0x03, 0xC0, 0x07, + 0xE0, 0x3F, 0xE0, 0xF0, 0xE3, 0xC0, 0xE7, 0x00, 0xEE, 0x01, 0xFC, 0x03, + 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, 0xFC, + 0x01, 0xF8, 0x03, 0xF0, 0x07, 0x70, 0x0E, 0xE0, 0x1D, 0xE0, 0x71, 0xE1, + 0xC1, 0xFF, 0x00, 0xFC, 0x00, 0xFF, 0xC3, 0xFF, 0xCE, 0x07, 0xB8, 0x0E, + 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0xEE, 0x07, + 0xBF, 0xFC, 0xFF, 0xC3, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x00, 0x07, 0xE0, 0x0F, 0xF8, + 0x0F, 0x0E, 0x0F, 0x03, 0x87, 0x00, 0xE3, 0x80, 0x73, 0xC0, 0x39, 0xC0, + 0x1C, 0xE0, 0x0E, 0x70, 0x07, 0x38, 0x03, 0x9C, 0x01, 0xCE, 0x00, 0xE7, + 0x00, 0x73, 0xC0, 0x39, 0xE0, 0x1C, 0x70, 0x0E, 0x38, 0x07, 0x1E, 0x07, + 0x07, 0x87, 0x81, 0xFF, 0xC0, 0x3F, 0xF0, 0x00, 0x3C, 0x00, 0x0F, 0x00, + 0x02, 0x00, 0xFF, 0xC3, 0xFF, 0xCE, 0x07, 0xB8, 0x0E, 0xE0, 0x3B, 0x80, + 0xFE, 0x03, 0xF8, 0x0E, 0xE0, 0x3B, 0x81, 0xCF, 0xFE, 0x3F, 0xFC, 0xE0, + 0x7B, 0x80, 0xEE, 0x03, 0xB8, 0x0F, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, + 0x07, 0xE0, 0x1F, 0x80, 0x70, 0x07, 0xC0, 0x7F, 0xC3, 0x87, 0x9C, 0x0F, + 0x70, 0x1D, 0xC0, 0x77, 0x00, 0x1C, 0x00, 0x78, 0x00, 0xF8, 0x01, 0xF8, + 0x01, 0xF8, 0x00, 0xF8, 0x00, 0xE0, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0xC0, + 0x77, 0x01, 0xCE, 0x0E, 0x1F, 0xF0, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0xE0, + 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, + 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0xEF, 0x03, 0x9E, 0x1C, 0x3F, 0xE0, + 0x3F, 0x00, 0xF0, 0x07, 0xB8, 0x03, 0x9C, 0x01, 0xCF, 0x01, 0xE3, 0x80, + 0xE1, 0xC0, 0x70, 0xE0, 0x38, 0x38, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x03, + 0x06, 0x01, 0xC7, 0x00, 0xE3, 0x80, 0x71, 0xC0, 0x18, 0xC0, 0x0E, 0xE0, + 0x07, 0x70, 0x01, 0xB0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x1C, 0x00, 0x0E, + 0x00, 0xE0, 0x70, 0x1F, 0x81, 0xC0, 0xEE, 0x07, 0x83, 0xB8, 0x1E, 0x0E, + 0x60, 0xF8, 0x39, 0xC3, 0xE0, 0xE7, 0x0F, 0x83, 0x1C, 0x37, 0x1C, 0x71, + 0xDC, 0x70, 0xC7, 0x71, 0xC3, 0x9C, 0xC7, 0x0E, 0x63, 0x98, 0x3B, 0x8E, + 0xE0, 0xEE, 0x3B, 0x81, 0xB8, 0x6E, 0x07, 0xC1, 0xF8, 0x1F, 0x07, 0xC0, + 0x7C, 0x1F, 0x01, 0xF0, 0x3C, 0x03, 0xC0, 0xF0, 0x0E, 0x03, 0xC0, 0x38, + 0x0E, 0x00, 0xF0, 0x1E, 0xE0, 0x39, 0xE0, 0xF1, 0xC1, 0xC3, 0xC7, 0x83, + 0x8E, 0x07, 0x3C, 0x07, 0x70, 0x0F, 0xE0, 0x0F, 0x80, 0x1F, 0x00, 0x3E, + 0x00, 0x7C, 0x01, 0xDC, 0x03, 0xB8, 0x0E, 0x38, 0x1C, 0x70, 0x70, 0xF0, + 0xE0, 0xE3, 0xC1, 0xE7, 0x01, 0xDE, 0x03, 0xC0, 0xF0, 0x07, 0x70, 0x0F, + 0x78, 0x0E, 0x38, 0x1E, 0x3C, 0x1C, 0x1C, 0x1C, 0x1E, 0x38, 0x0E, 0x38, + 0x0E, 0x70, 0x07, 0x70, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x01, 0xC0, + 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0x01, 0xC0, + 0x01, 0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0x00, 0xE0, 0x0F, + 0x00, 0x70, 0x07, 0x80, 0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, 0x00, + 0xE0, 0x07, 0x00, 0x70, 0x03, 0x80, 0x38, 0x01, 0xC0, 0x1C, 0x00, 0xE0, + 0x0F, 0xFF, 0xFF, 0xFC, 0xFF, 0xF9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, + 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCF, 0xFC, 0xF0, + 0x0E, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x70, 0x0E, 0x00, 0xE0, 0x1C, 0x03, + 0x80, 0x38, 0x07, 0x00, 0xE0, 0x0E, 0x01, 0xC0, 0x38, 0x03, 0x80, 0x70, + 0x0E, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x38, 0x07, 0xFF, 0xF1, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0xFF, 0xF0, 0x1C, 0x07, 0x01, 0xE0, 0xF8, + 0x36, 0x0D, 0xC7, 0x31, 0xCC, 0x63, 0xB8, 0x6E, 0x1C, 0xFF, 0xFF, 0xFF, + 0xF1, 0xE3, 0x87, 0x0F, 0x83, 0xFC, 0x78, 0xE7, 0x0E, 0x70, 0x70, 0x07, + 0x00, 0x71, 0xFF, 0x3F, 0xF7, 0x87, 0xF0, 0x7E, 0x07, 0xE0, 0x7F, 0x0F, + 0x71, 0xF7, 0xF7, 0x1E, 0x70, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, + 0x0E, 0x00, 0xE0, 0x0E, 0xF8, 0xFF, 0xCF, 0x1E, 0xE0, 0xEE, 0x0F, 0xE0, + 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, + 0xEF, 0x1E, 0xFF, 0xCC, 0xF8, 0x0F, 0x83, 0xFC, 0x78, 0xE7, 0x07, 0x70, + 0x7E, 0x07, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x07, 0x70, + 0x77, 0x07, 0x78, 0xE3, 0xFC, 0x0F, 0x80, 0x00, 0x70, 0x07, 0x00, 0x70, + 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0xF7, 0x3F, 0xF3, 0x8F, 0x70, 0x77, + 0x07, 0xF0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x77, + 0x07, 0x70, 0x77, 0x8F, 0x3F, 0xF1, 0xF7, 0x0F, 0x83, 0xFC, 0x38, 0xE7, + 0x0F, 0x70, 0x7E, 0x07, 0xE0, 0x7F, 0xFF, 0xFF, 0xFE, 0x00, 0xE0, 0x0E, + 0x00, 0x70, 0x07, 0x02, 0x38, 0x63, 0xFF, 0x0F, 0xC0, 0x0F, 0x8F, 0x8F, + 0x07, 0x03, 0x81, 0xC0, 0xE1, 0xFE, 0xFF, 0x1C, 0x0E, 0x07, 0x03, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, + 0x1F, 0x33, 0xFF, 0x78, 0xF7, 0x07, 0x70, 0x7E, 0x07, 0xE0, 0x7E, 0x07, + 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xF0, 0x77, 0x07, 0x78, 0xF3, 0xFF, + 0x1F, 0x70, 0x07, 0x00, 0x70, 0x07, 0x30, 0xE3, 0xFC, 0x1F, 0x80, 0xE0, + 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x3C, 0xEF, 0xDE, + 0x3F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, + 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xFF, 0x80, 0x07, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1C, 0x71, 0xC0, 0x00, 0x00, 0x07, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xCF, 0xFB, 0xC0, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, + 0x00, 0xE0, 0x0E, 0x1E, 0xE1, 0xCE, 0x3C, 0xE3, 0x8E, 0x78, 0xE7, 0x0E, + 0xE0, 0xFE, 0x0F, 0xE0, 0xEF, 0x0E, 0x70, 0xE7, 0x8E, 0x38, 0xE1, 0xCE, + 0x1E, 0xE0, 0xEE, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE7, 0x87, 0x9F, 0xF9, 0xFB, 0xC7, 0x47, 0xF0, 0x78, 0x7E, 0x0E, + 0x0F, 0xC1, 0xC1, 0xF8, 0x38, 0x3F, 0x07, 0x07, 0xE0, 0xE0, 0xFC, 0x1C, + 0x1F, 0x83, 0x83, 0xF0, 0x70, 0x7E, 0x0E, 0x0F, 0xC1, 0xC1, 0xF8, 0x38, + 0x3F, 0x07, 0x07, 0xE0, 0xE0, 0xE0, 0xE7, 0x9D, 0xFB, 0xC7, 0xF0, 0x7E, + 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, + 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xE0, 0x0F, 0x81, 0xFF, 0x0E, 0x38, 0xE0, + 0xE7, 0x07, 0x70, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, + 0xC0, 0x77, 0x07, 0x38, 0x38, 0xE3, 0xC7, 0xFC, 0x0F, 0x80, 0xEF, 0x8F, + 0xFC, 0xF1, 0xEE, 0x0E, 0xE0, 0xEE, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, + 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0xFE, 0x0E, 0xF1, 0xEF, 0xFC, 0xEF, 0x8E, + 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x00, 0x1F, 0x73, 0xFF, + 0x78, 0xF7, 0x07, 0x70, 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07, + 0xE0, 0x7E, 0x07, 0xF0, 0x77, 0x07, 0x78, 0xF3, 0xFF, 0x1F, 0x70, 0x07, + 0x00, 0x70, 0x07, 0x00, 0x70, 0x07, 0x00, 0x70, 0xEF, 0xFF, 0xFF, 0x8E, + 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x1F, + 0x07, 0xF9, 0xC7, 0xB8, 0x7E, 0x0E, 0xE0, 0x1E, 0x01, 0xE0, 0x1F, 0x80, + 0xF8, 0x07, 0x80, 0x7E, 0x0F, 0xC1, 0xDC, 0x79, 0xFE, 0x1F, 0x80, 0x1C, + 0x0E, 0x07, 0x03, 0x8F, 0xF7, 0xF8, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, + 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xF0, 0xF8, 0xE0, + 0xFC, 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xF8, 0x3F, 0x07, 0xE0, 0xFC, + 0x1F, 0x83, 0xF0, 0x7E, 0x0F, 0xC1, 0xFC, 0x7B, 0xFF, 0x3E, 0x60, 0xE0, + 0x7E, 0x07, 0xE0, 0xE7, 0x0E, 0x70, 0xE7, 0x0C, 0x71, 0xC3, 0x1C, 0x39, + 0xC3, 0x98, 0x1B, 0x81, 0xB8, 0x1F, 0x01, 0xF0, 0x0F, 0x00, 0xF0, 0x0E, + 0x00, 0xE0, 0xC1, 0xF8, 0x70, 0x7E, 0x1E, 0x1F, 0x87, 0x86, 0x61, 0xE3, + 0x9C, 0xF8, 0xE7, 0x3F, 0x39, 0xCD, 0xCC, 0x73, 0x33, 0x0D, 0xCD, 0xC3, + 0xF3, 0xF0, 0xF8, 0xFC, 0x3E, 0x1E, 0x07, 0x87, 0x81, 0xE1, 0xE0, 0x70, + 0x78, 0x1C, 0x0C, 0x00, 0xE0, 0xFF, 0x0E, 0x71, 0xE7, 0x9C, 0x3B, 0xC1, + 0xB8, 0x1F, 0x00, 0xF0, 0x0F, 0x01, 0xF0, 0x1F, 0x83, 0xB8, 0x39, 0xC7, + 0x1C, 0x71, 0xEF, 0x0E, 0xE0, 0xF0, 0xF0, 0x3B, 0x83, 0xDC, 0x1C, 0xF0, + 0xE3, 0x87, 0x1C, 0x78, 0xE3, 0x83, 0x9C, 0x1C, 0xE0, 0xEE, 0x03, 0x70, + 0x1F, 0x80, 0xF8, 0x03, 0xC0, 0x1E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x1C, 0x00, 0xE0, 0x1E, 0x01, 0xE0, 0x00, 0xFF, 0xFF, 0xFC, 0x07, + 0x01, 0xE0, 0x38, 0x0F, 0x01, 0xC0, 0x78, 0x0E, 0x03, 0xC0, 0x70, 0x1C, + 0x03, 0x80, 0xE0, 0x3C, 0x07, 0xFF, 0xFF, 0xE0, 0x02, 0x0E, 0x1C, 0x1C, + 0x18, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0xF0, 0xE0, 0x60, + 0x30, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x18, 0x1C, 0x0C, + 0x0F, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x40, 0x70, 0xB8, + 0x38, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1E, 0x0F, 0x0F, + 0x06, 0x0C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0x38, 0x38, + 0x30, 0xF0, 0x40, 0x38, 0x01, 0xF8, 0x3E, 0x70, 0xF0, 0xE6, 0xC1, 0xF8, + 0x03, 0xC0 }; + +const GFXglyph RobotoCondensed_Regular16pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 7, 0, 0 }, // 0x20 ' ' + { 1, 3, 22, 7, 2, -21 }, // 0x21 '!' + { 10, 7, 8, 9, 1, -23 }, // 0x22 '"' + { 17, 14, 22, 16, 1, -21 }, // 0x23 '#' + { 56, 13, 29, 15, 1, -25 }, // 0x24 '$' + { 104, 18, 22, 20, 1, -21 }, // 0x25 '%' + { 154, 16, 22, 18, 1, -21 }, // 0x26 '&' + { 198, 3, 8, 5, 1, -23 }, // 0x27 ''' + { 201, 7, 32, 9, 2, -24 }, // 0x28 '(' + { 229, 7, 32, 9, 0, -24 }, // 0x29 ')' + { 257, 12, 13, 12, 0, -21 }, // 0x2A '*' + { 277, 13, 16, 15, 1, -18 }, // 0x2B '+' + { 303, 4, 7, 6, 1, -2 }, // 0x2C ',' + { 307, 7, 2, 9, 1, -10 }, // 0x2D '-' + { 309, 3, 3, 8, 2, -2 }, // 0x2E '.' + { 311, 10, 24, 10, 0, -21 }, // 0x2F '/' + { 341, 13, 22, 15, 1, -21 }, // 0x30 '0' + { 377, 8, 22, 15, 2, -21 }, // 0x31 '1' + { 399, 13, 22, 15, 1, -21 }, // 0x32 '2' + { 435, 13, 22, 15, 1, -21 }, // 0x33 '3' + { 471, 13, 22, 15, 1, -21 }, // 0x34 '4' + { 507, 12, 22, 15, 2, -21 }, // 0x35 '5' + { 540, 12, 22, 15, 2, -21 }, // 0x36 '6' + { 573, 13, 22, 15, 1, -21 }, // 0x37 '7' + { 609, 13, 22, 15, 1, -21 }, // 0x38 '8' + { 645, 13, 22, 15, 1, -21 }, // 0x39 '9' + { 681, 3, 17, 7, 2, -16 }, // 0x3A ':' + { 688, 4, 21, 7, 1, -16 }, // 0x3B ';' + { 699, 11, 14, 14, 1, -15 }, // 0x3C '<' + { 719, 11, 8, 15, 2, -13 }, // 0x3D '=' + { 730, 11, 14, 14, 2, -15 }, // 0x3E '>' + { 750, 11, 22, 13, 1, -21 }, // 0x3F '?' + { 781, 23, 29, 25, 1, -21 }, // 0x40 '@' + { 865, 17, 22, 17, 0, -21 }, // 0x41 'A' + { 912, 14, 22, 17, 2, -21 }, // 0x42 'B' + { 951, 14, 22, 16, 1, -21 }, // 0x43 'C' + { 990, 14, 22, 17, 2, -21 }, // 0x44 'D' + { 1029, 13, 22, 15, 2, -21 }, // 0x45 'E' + { 1065, 13, 22, 15, 2, -21 }, // 0x46 'F' + { 1101, 14, 22, 18, 2, -21 }, // 0x47 'G' + { 1140, 15, 22, 19, 2, -21 }, // 0x48 'H' + { 1182, 3, 22, 8, 2, -21 }, // 0x49 'I' + { 1191, 12, 22, 15, 1, -21 }, // 0x4A 'J' + { 1224, 15, 22, 17, 2, -21 }, // 0x4B 'K' + { 1266, 12, 22, 14, 2, -21 }, // 0x4C 'L' + { 1299, 18, 22, 22, 2, -21 }, // 0x4D 'M' + { 1349, 15, 22, 19, 2, -21 }, // 0x4E 'N' + { 1391, 15, 22, 18, 1, -21 }, // 0x4F 'O' + { 1433, 14, 22, 17, 2, -21 }, // 0x50 'P' + { 1472, 17, 25, 18, 1, -21 }, // 0x51 'Q' + { 1526, 14, 22, 18, 2, -21 }, // 0x52 'R' + { 1565, 14, 22, 16, 1, -21 }, // 0x53 'S' + { 1604, 14, 22, 15, 1, -21 }, // 0x54 'T' + { 1643, 14, 22, 18, 2, -21 }, // 0x55 'U' + { 1682, 17, 22, 17, 0, -21 }, // 0x56 'V' + { 1729, 22, 22, 23, 1, -21 }, // 0x57 'W' + { 1790, 15, 22, 17, 1, -21 }, // 0x58 'X' + { 1832, 16, 22, 17, 0, -21 }, // 0x59 'Y' + { 1876, 13, 22, 15, 1, -21 }, // 0x5A 'Z' + { 1912, 5, 30, 8, 2, -24 }, // 0x5B '[' + { 1931, 11, 24, 11, 0, -21 }, // 0x5C '\' + { 1964, 6, 30, 8, 0, -24 }, // 0x5D ']' + { 1987, 10, 11, 11, 1, -21 }, // 0x5E '^' + { 2001, 12, 2, 12, 0, 1 }, // 0x5F '_' + { 2004, 6, 4, 9, 1, -21 }, // 0x60 '`' + { 2007, 12, 17, 14, 1, -16 }, // 0x61 'a' + { 2033, 12, 24, 15, 2, -23 }, // 0x62 'b' + { 2069, 12, 17, 14, 1, -16 }, // 0x63 'c' + { 2095, 12, 24, 15, 1, -23 }, // 0x64 'd' + { 2131, 12, 17, 14, 1, -16 }, // 0x65 'e' + { 2157, 9, 24, 9, 1, -23 }, // 0x66 'f' + { 2184, 12, 23, 15, 1, -16 }, // 0x67 'g' + { 2219, 11, 24, 15, 2, -23 }, // 0x68 'h' + { 2252, 3, 24, 7, 2, -23 }, // 0x69 'i' + { 2261, 6, 30, 7, -1, -23 }, // 0x6A 'j' + { 2284, 12, 24, 14, 2, -23 }, // 0x6B 'k' + { 2320, 3, 24, 7, 2, -23 }, // 0x6C 'l' + { 2329, 19, 17, 23, 2, -16 }, // 0x6D 'm' + { 2370, 11, 17, 15, 2, -16 }, // 0x6E 'n' + { 2394, 13, 17, 15, 1, -16 }, // 0x6F 'o' + { 2422, 12, 23, 15, 2, -16 }, // 0x70 'p' + { 2457, 12, 23, 15, 1, -16 }, // 0x71 'q' + { 2492, 7, 17, 10, 2, -16 }, // 0x72 'r' + { 2507, 11, 17, 13, 1, -16 }, // 0x73 's' + { 2531, 9, 21, 10, 0, -20 }, // 0x74 't' + { 2555, 11, 17, 15, 2, -16 }, // 0x75 'u' + { 2579, 12, 17, 14, 1, -16 }, // 0x76 'v' + { 2605, 18, 17, 20, 1, -16 }, // 0x77 'w' + { 2644, 12, 17, 14, 1, -16 }, // 0x78 'x' + { 2670, 13, 23, 14, 0, -16 }, // 0x79 'y' + { 2708, 11, 17, 13, 1, -16 }, // 0x7A 'z' + { 2732, 8, 30, 9, 1, -23 }, // 0x7B '{' + { 2762, 2, 26, 7, 2, -21 }, // 0x7C '|' + { 2769, 8, 30, 9, 0, -23 }, // 0x7D '}' + { 2799, 14, 6, 18, 2, -11 } }; // 0x7E '~' + +const GFXfont RobotoCondensed_Regular16pt7b PROGMEM = { + (uint8_t *)RobotoCondensed_Regular16pt7bBitmaps, + (GFXglyph *)RobotoCondensed_Regular16pt7bGlyphs, + 0x20, 0x7E, 41 }; + +// Approx. 3482 bytes +#endif // ifndef FONTS_ROBOTOCONDENSED_REGULAR16PT7B_H diff --git a/src/src/Static/Fonts/RobotoCondensed_Regular8pt7b.h b/src/src/Static/Fonts/RobotoCondensed_Regular8pt7b.h new file mode 100644 index 000000000..e5f923c4c --- /dev/null +++ b/src/src/Static/Fonts/RobotoCondensed_Regular8pt7b.h @@ -0,0 +1,175 @@ +#ifndef FONTS_ROBOTOCONDENSED_REGULAR8PT7B_H +#define FONTS_ROBOTOCONDENSED_REGULAR8PT7B_H +const uint8_t RobotoCondensed_Regular8pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0x0F, 0xB6, 0xD0, 0x12, 0x12, 0x12, 0x14, 0x7F, 0x14, + 0x24, 0x24, 0xFE, 0x2C, 0x28, 0x68, 0x11, 0xEC, 0xF3, 0xCF, 0x06, 0x0E, + 0x0E, 0x38, 0xF3, 0x78, 0x82, 0x00, 0xE0, 0x48, 0x24, 0x92, 0x8E, 0x40, + 0x40, 0x20, 0x2E, 0x14, 0x92, 0x59, 0x20, 0xE0, 0x78, 0x48, 0xC8, 0xC8, + 0x78, 0x70, 0x70, 0xDA, 0x9A, 0x8E, 0xCE, 0x7B, 0xF0, 0x25, 0x2D, 0xA4, + 0x92, 0x6C, 0x91, 0x20, 0x84, 0x62, 0x23, 0x33, 0x33, 0x33, 0x22, 0x64, + 0x80, 0x10, 0x4D, 0x5E, 0x31, 0xA4, 0x80, 0x30, 0xC3, 0x3F, 0x30, 0xC3, + 0x0C, 0x56, 0xE0, 0xF0, 0x08, 0xC4, 0x21, 0x10, 0x84, 0x62, 0x10, 0x88, + 0x00, 0x7B, 0x2C, 0xE3, 0x8E, 0x38, 0xE3, 0x8F, 0x3C, 0x9E, 0x3F, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x7B, 0x28, 0xE3, 0x0C, 0x21, 0x8C, 0x21, 0x8C, + 0x3F, 0x7B, 0x38, 0xC3, 0x08, 0xC0, 0xC3, 0x0E, 0x3C, 0x9E, 0x0C, 0x18, + 0x50, 0xA3, 0x44, 0x99, 0x22, 0xFE, 0x08, 0x10, 0x20, 0x7D, 0x0C, 0x30, + 0xFB, 0x30, 0xC3, 0x0F, 0x3C, 0xDE, 0x39, 0x0C, 0x20, 0xBB, 0x38, 0x61, + 0x87, 0x14, 0xCE, 0xFC, 0x30, 0x86, 0x10, 0x43, 0x08, 0x20, 0x82, 0x18, + 0x7B, 0x3C, 0xF3, 0xC8, 0xCC, 0xE3, 0x86, 0x3C, 0xDE, 0x73, 0x28, 0xE3, + 0x8E, 0x3C, 0xDF, 0x0C, 0x38, 0xBC, 0xF0, 0x03, 0xC0, 0xF0, 0x03, 0xE8, + 0x04, 0x77, 0x30, 0x70, 0x70, 0x40, 0xFC, 0x00, 0x3F, 0x83, 0x83, 0x83, + 0x3B, 0x88, 0x00, 0x79, 0x3C, 0x41, 0x0C, 0x61, 0x0C, 0x00, 0x03, 0x0C, + 0x1F, 0x06, 0x11, 0x01, 0x27, 0x19, 0x93, 0x22, 0x64, 0xCC, 0x99, 0x92, + 0x32, 0x6A, 0x77, 0x40, 0x04, 0x00, 0xC2, 0x07, 0x80, 0x08, 0x0E, 0x05, + 0x02, 0x83, 0x61, 0xB0, 0x88, 0x44, 0x7F, 0x31, 0x90, 0x58, 0x30, 0xF9, + 0x8B, 0x1E, 0x3C, 0x5F, 0x31, 0xE3, 0xC7, 0x8F, 0x1F, 0xE0, 0x79, 0x8B, + 0x1C, 0x38, 0x10, 0x20, 0x40, 0x87, 0x8F, 0x13, 0xC0, 0xF9, 0x8B, 0x1E, + 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x8F, 0x17, 0xC0, 0xFF, 0x83, 0x06, 0x0C, + 0x1F, 0xB0, 0x60, 0xC1, 0x83, 0x07, 0xF0, 0xFF, 0x83, 0x06, 0x0C, 0x1F, + 0xB0, 0x60, 0xC1, 0x83, 0x06, 0x00, 0x3C, 0x8F, 0x0C, 0x08, 0x10, 0x23, + 0xC1, 0x83, 0x85, 0x19, 0xE0, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xC3, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF, 0xFF, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0xC1, 0x83, 0x07, 0x8D, 0x91, 0xC0, 0xC7, 0xC6, 0xCC, 0xC8, 0xD8, + 0xF0, 0xD0, 0xC8, 0xCC, 0xC4, 0xC6, 0xC3, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, + 0x30, 0xC3, 0x0C, 0x3F, 0xC1, 0xF8, 0x7E, 0x1F, 0x87, 0xE3, 0xFC, 0xBD, + 0x2F, 0x5B, 0xD4, 0xF3, 0x3C, 0xCF, 0x23, 0xC3, 0xC3, 0xE3, 0xE3, 0xF3, + 0xD3, 0xDB, 0xCB, 0xCF, 0xC7, 0xC7, 0xC3, 0x39, 0x8F, 0x0C, 0x18, 0x30, + 0x60, 0xC1, 0x83, 0x87, 0x19, 0xC0, 0xFD, 0x8F, 0x0E, 0x1C, 0x38, 0xFF, + 0x60, 0xC1, 0x83, 0x06, 0x00, 0x3C, 0x46, 0xC2, 0x82, 0x82, 0x82, 0x82, + 0x82, 0x82, 0xC2, 0xC6, 0x3E, 0x03, 0x02, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, + 0xC6, 0xFC, 0xC6, 0xC6, 0xC6, 0xC6, 0xC3, 0x79, 0x8B, 0x1E, 0x3C, 0x0C, + 0x07, 0x03, 0x87, 0x0F, 0x1B, 0xE0, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, + 0xC1, 0x83, 0x8F, 0x19, 0xE0, 0xC1, 0xA0, 0x90, 0xCC, 0x66, 0x21, 0x10, + 0x98, 0x68, 0x14, 0x0A, 0x07, 0x03, 0x00, 0xC6, 0x34, 0x62, 0x46, 0x24, + 0x62, 0x6F, 0x66, 0xD6, 0x29, 0x62, 0x94, 0x29, 0xC3, 0x9C, 0x30, 0xC1, + 0x0C, 0xE3, 0x63, 0x26, 0x36, 0x1C, 0x1C, 0x1C, 0x14, 0x36, 0x26, 0x63, + 0xC3, 0xC3, 0x63, 0x62, 0x26, 0x34, 0x1C, 0x1C, 0x18, 0x18, 0x18, 0x18, + 0x18, 0xFC, 0x30, 0x86, 0x10, 0xC3, 0x18, 0x63, 0x0C, 0x3F, 0xFB, 0x6D, + 0xB6, 0xDB, 0x6D, 0xB7, 0xC1, 0x06, 0x18, 0x20, 0x83, 0x04, 0x10, 0x61, + 0x82, 0x0C, 0xED, 0xB6, 0xDB, 0x6D, 0xB6, 0xDF, 0x30, 0xC3, 0x16, 0x4B, + 0x30, 0xFC, 0xCC, 0x73, 0x28, 0xC3, 0x7F, 0x38, 0xE7, 0xEC, 0xC3, 0x0C, + 0x3E, 0xCF, 0x3C, 0x71, 0xC7, 0x3C, 0xEE, 0x73, 0x28, 0xE0, 0x82, 0x08, + 0xF2, 0x70, 0x0C, 0x30, 0xDF, 0xCE, 0x38, 0xE3, 0x8E, 0x3C, 0xDF, 0x73, + 0x28, 0xE3, 0xFE, 0x08, 0x32, 0x7C, 0x39, 0x19, 0xF6, 0x31, 0x8C, 0x63, + 0x18, 0xC0, 0x7F, 0x38, 0xE3, 0x8E, 0x38, 0xF3, 0x7C, 0x38, 0xE2, 0x70, + 0x82, 0x08, 0x2E, 0xCE, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0xF0, 0xFF, 0xFF, + 0xC0, 0x33, 0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0xE0, 0xC3, 0x0C, + 0x33, 0xDB, 0x4F, 0x3C, 0xF3, 0x6C, 0xB3, 0xFF, 0xFF, 0xFF, 0xBB, 0xB3, + 0x38, 0xCE, 0x33, 0x8C, 0xE3, 0x38, 0xCE, 0x33, 0x8C, 0xC0, 0xBB, 0x38, + 0xE3, 0x8E, 0x38, 0xE3, 0x8C, 0x7B, 0x38, 0xE1, 0x86, 0x18, 0xF3, 0x78, + 0xBB, 0x3C, 0xF1, 0xC7, 0x1C, 0xF3, 0xFB, 0x0C, 0x30, 0xC0, 0x7F, 0x38, + 0xE3, 0x8E, 0x38, 0xF3, 0x7C, 0x30, 0xC3, 0x0C, 0xBC, 0xCC, 0xCC, 0xCC, + 0xC0, 0x39, 0xB4, 0x58, 0x38, 0x34, 0x51, 0x38, 0x63, 0x3C, 0xC6, 0x31, + 0x8C, 0x63, 0x0E, 0x8E, 0x38, 0xE3, 0x8E, 0x3C, 0xF3, 0x7C, 0xC6, 0x89, + 0x13, 0x62, 0x85, 0x0A, 0x1C, 0x10, 0xCC, 0xD3, 0x34, 0xC9, 0x3A, 0x7A, + 0x8C, 0xE3, 0x30, 0xCC, 0x31, 0x00, 0xC6, 0xD8, 0xA1, 0xC1, 0x07, 0x0A, + 0x36, 0xC6, 0xC6, 0x89, 0x33, 0x66, 0xC5, 0x0A, 0x1C, 0x10, 0x20, 0xC1, + 0x86, 0x00, 0xF8, 0xCC, 0x66, 0x33, 0x18, 0xF8, 0x13, 0x22, 0x26, 0xE4, + 0x22, 0x22, 0x23, 0x10, 0xFF, 0xFC, 0xC6, 0x66, 0x66, 0x32, 0x26, 0x66, + 0x64, 0x80, 0x63, 0x26, 0x30 }; + +const GFXglyph RobotoCondensed_Regular8pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 3, 0, 0 }, // 0x20 ' ' + { 1, 2, 12, 4, 1, -11 }, // 0x21 '!' + { 4, 3, 4, 5, 1, -11 }, // 0x22 '"' + { 6, 8, 12, 8, 0, -11 }, // 0x23 '#' + { 18, 6, 15, 8, 1, -12 }, // 0x24 '$' + { 30, 9, 12, 11, 1, -11 }, // 0x25 '%' + { 44, 8, 12, 9, 1, -11 }, // 0x26 '&' + { 56, 1, 4, 3, 1, -11 }, // 0x27 ''' + { 57, 3, 17, 5, 1, -12 }, // 0x28 '(' + { 64, 4, 17, 5, 0, -12 }, // 0x29 ')' + { 73, 6, 7, 6, 0, -11 }, // 0x2A '*' + { 79, 6, 8, 8, 1, -8 }, // 0x2B '+' + { 85, 2, 4, 3, 0, -1 }, // 0x2C ',' + { 86, 3, 1, 5, 1, -4 }, // 0x2D '-' + { 87, 2, 2, 4, 1, -1 }, // 0x2E '.' + { 88, 5, 13, 5, 0, -11 }, // 0x2F '/' + { 97, 6, 12, 8, 1, -11 }, // 0x30 '0' + { 106, 4, 12, 8, 1, -11 }, // 0x31 '1' + { 112, 6, 12, 8, 1, -11 }, // 0x32 '2' + { 121, 6, 12, 8, 1, -11 }, // 0x33 '3' + { 130, 7, 12, 8, 0, -11 }, // 0x34 '4' + { 141, 6, 12, 8, 1, -11 }, // 0x35 '5' + { 150, 6, 12, 8, 1, -11 }, // 0x36 '6' + { 159, 6, 12, 8, 1, -11 }, // 0x37 '7' + { 168, 6, 12, 8, 1, -11 }, // 0x38 '8' + { 177, 6, 12, 8, 1, -11 }, // 0x39 '9' + { 186, 2, 9, 4, 1, -8 }, // 0x3A ':' + { 189, 2, 11, 4, 1, -8 }, // 0x3B ';' + { 192, 6, 7, 7, 0, -7 }, // 0x3C '<' + { 198, 6, 4, 8, 1, -6 }, // 0x3D '=' + { 201, 6, 7, 7, 1, -7 }, // 0x3E '>' + { 207, 6, 12, 7, 0, -11 }, // 0x3F '?' + { 216, 11, 15, 13, 1, -10 }, // 0x40 '@' + { 237, 9, 12, 9, 0, -11 }, // 0x41 'A' + { 251, 7, 12, 9, 1, -11 }, // 0x42 'B' + { 262, 7, 12, 8, 1, -11 }, // 0x43 'C' + { 273, 7, 12, 9, 1, -11 }, // 0x44 'D' + { 284, 7, 12, 8, 1, -11 }, // 0x45 'E' + { 295, 7, 12, 8, 1, -11 }, // 0x46 'F' + { 306, 7, 12, 9, 1, -11 }, // 0x47 'G' + { 317, 8, 12, 10, 1, -11 }, // 0x48 'H' + { 329, 2, 12, 4, 1, -11 }, // 0x49 'I' + { 332, 7, 12, 8, 0, -11 }, // 0x4A 'J' + { 343, 8, 12, 9, 1, -11 }, // 0x4B 'K' + { 355, 6, 12, 7, 1, -11 }, // 0x4C 'L' + { 364, 10, 12, 12, 1, -11 }, // 0x4D 'M' + { 379, 8, 12, 10, 1, -11 }, // 0x4E 'N' + { 391, 7, 12, 9, 1, -11 }, // 0x4F 'O' + { 402, 7, 12, 9, 1, -11 }, // 0x50 'P' + { 413, 8, 14, 9, 1, -11 }, // 0x51 'Q' + { 427, 8, 12, 9, 1, -11 }, // 0x52 'R' + { 439, 7, 12, 9, 1, -11 }, // 0x53 'S' + { 450, 8, 12, 8, 0, -11 }, // 0x54 'T' + { 462, 7, 12, 9, 1, -11 }, // 0x55 'U' + { 473, 9, 12, 9, 0, -11 }, // 0x56 'V' + { 487, 12, 12, 12, 0, -11 }, // 0x57 'W' + { 505, 8, 12, 9, 0, -11 }, // 0x58 'X' + { 517, 8, 12, 9, 0, -11 }, // 0x59 'Y' + { 529, 6, 12, 8, 1, -11 }, // 0x5A 'Z' + { 538, 3, 16, 4, 1, -12 }, // 0x5B '[' + { 544, 6, 13, 6, 0, -11 }, // 0x5C '\' + { 554, 3, 16, 4, 0, -12 }, // 0x5D ']' + { 560, 6, 6, 6, 0, -11 }, // 0x5E '^' + { 565, 6, 1, 6, 0, 1 }, // 0x5F '_' + { 566, 3, 2, 5, 1, -11 }, // 0x60 '`' + { 567, 6, 9, 7, 1, -8 }, // 0x61 'a' + { 574, 6, 12, 8, 1, -11 }, // 0x62 'b' + { 583, 6, 9, 7, 1, -8 }, // 0x63 'c' + { 590, 6, 12, 8, 1, -11 }, // 0x64 'd' + { 599, 6, 9, 7, 1, -8 }, // 0x65 'e' + { 606, 5, 12, 5, 0, -11 }, // 0x66 'f' + { 614, 6, 13, 8, 1, -8 }, // 0x67 'g' + { 624, 6, 12, 8, 1, -11 }, // 0x68 'h' + { 633, 2, 13, 4, 1, -12 }, // 0x69 'i' + { 637, 4, 17, 4, -1, -12 }, // 0x6A 'j' + { 646, 6, 12, 7, 1, -11 }, // 0x6B 'k' + { 655, 2, 12, 4, 1, -11 }, // 0x6C 'l' + { 658, 10, 9, 12, 1, -8 }, // 0x6D 'm' + { 670, 6, 9, 8, 1, -8 }, // 0x6E 'n' + { 677, 6, 9, 8, 1, -8 }, // 0x6F 'o' + { 684, 6, 13, 8, 1, -8 }, // 0x70 'p' + { 694, 6, 13, 8, 1, -8 }, // 0x71 'q' + { 704, 4, 9, 5, 1, -8 }, // 0x72 'r' + { 709, 6, 9, 7, 0, -8 }, // 0x73 's' + { 716, 5, 11, 5, 0, -10 }, // 0x74 't' + { 723, 6, 9, 8, 1, -8 }, // 0x75 'u' + { 730, 7, 9, 7, 0, -8 }, // 0x76 'v' + { 738, 10, 9, 10, 0, -8 }, // 0x77 'w' + { 750, 7, 9, 7, 0, -8 }, // 0x78 'x' + { 758, 7, 13, 7, 0, -8 }, // 0x79 'y' + { 770, 5, 9, 7, 1, -8 }, // 0x7A 'z' + { 776, 4, 15, 5, 0, -11 }, // 0x7B '{' + { 784, 1, 14, 3, 1, -11 }, // 0x7C '|' + { 786, 4, 15, 5, 0, -11 }, // 0x7D '}' + { 794, 7, 3, 9, 1, -5 } }; // 0x7E '~' + +const GFXfont RobotoCondensed_Regular8pt7b PROGMEM = { + (uint8_t *)RobotoCondensed_Regular8pt7bBitmaps, + (GFXglyph *)RobotoCondensed_Regular8pt7bGlyphs, + 0x20, 0x7E, 21 }; + +// Approx. 1469 bytes +#endif // ifndef FONTS_ROBOTOCONDENSED_REGULAR8PT7B_H diff --git a/src/src/Static/Fonts/RobotoMono_Regular12pt7b.h b/src/src/Static/Fonts/RobotoMono_Regular12pt7b.h new file mode 100644 index 000000000..3e0db9a30 --- /dev/null +++ b/src/src/Static/Fonts/RobotoMono_Regular12pt7b.h @@ -0,0 +1,268 @@ +#ifndef FONTS_ROBOTOMONO_REGULAR12PT7B_H +#define FONTS_ROBOTOMONO_REGULAR12PT7B_H +const uint8_t RobotoMono_Regular12pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0xC0, 0xCF, 0x3C, 0xF3, 0xCF, 0x30, 0x06, + 0x20, 0x23, 0x03, 0x18, 0x18, 0xC0, 0xC6, 0x3F, 0xFD, 0xFF, 0xE3, 0x18, + 0x18, 0xC0, 0xC4, 0x3F, 0xFD, 0xFF, 0xE3, 0x18, 0x18, 0xC0, 0xC6, 0x06, + 0x20, 0x23, 0x00, 0x06, 0x00, 0xC0, 0x38, 0x1F, 0xC7, 0x1C, 0xC1, 0x98, + 0x3B, 0x07, 0x60, 0x0F, 0x00, 0xF8, 0x07, 0xC0, 0x3C, 0x01, 0xC0, 0x1E, + 0x03, 0xC0, 0xEC, 0x39, 0xFE, 0x0F, 0x80, 0x40, 0x08, 0x00, 0x70, 0x07, + 0xC0, 0x23, 0x11, 0x19, 0x88, 0xC8, 0x7C, 0xC1, 0xE4, 0x00, 0x60, 0x06, + 0x00, 0x37, 0x03, 0x7C, 0x13, 0x31, 0x91, 0x98, 0x8C, 0x04, 0x60, 0x3E, + 0x00, 0xE0, 0x0F, 0x01, 0xFC, 0x0C, 0x60, 0x61, 0x83, 0x18, 0x19, 0xC0, + 0x7C, 0x03, 0xC0, 0x3E, 0x03, 0xB0, 0xD8, 0xCD, 0xC7, 0x6C, 0x1F, 0x70, + 0x71, 0x83, 0x8F, 0xFE, 0x1F, 0x38, 0xFF, 0xE0, 0x04, 0x31, 0x8C, 0x31, + 0x86, 0x18, 0x63, 0x0C, 0x30, 0xC3, 0x0C, 0x38, 0x61, 0x86, 0x0C, 0x30, + 0x60, 0xC3, 0x04, 0x83, 0x06, 0x0C, 0x30, 0x61, 0x86, 0x1C, 0x30, 0xC3, + 0x0C, 0x30, 0xC7, 0x18, 0x61, 0x8C, 0x31, 0x86, 0x30, 0x80, 0x0E, 0x00, + 0x80, 0x10, 0x42, 0x1F, 0x4E, 0xFF, 0xC3, 0x80, 0xD0, 0x1B, 0x06, 0x31, + 0xC7, 0x00, 0x80, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, + 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x77, + 0x76, 0x6C, 0x40, 0xFF, 0xFF, 0xC0, 0xFF, 0x80, 0x01, 0x81, 0x80, 0xC0, + 0x60, 0x60, 0x30, 0x18, 0x18, 0x0C, 0x0C, 0x06, 0x03, 0x03, 0x01, 0x81, + 0x80, 0xC0, 0x60, 0x60, 0x00, 0x1F, 0x0F, 0xF1, 0x87, 0x60, 0x6C, 0x0F, + 0x81, 0xF0, 0x7E, 0x3B, 0xCE, 0x7B, 0x0F, 0xC1, 0xF0, 0x3C, 0x0F, 0x81, + 0x98, 0x73, 0xFC, 0x1F, 0x00, 0x06, 0x3F, 0xFF, 0x30, 0x60, 0xC1, 0x83, + 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x1F, 0x07, 0xFC, 0x60, + 0xCC, 0x0E, 0xC0, 0x60, 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x30, 0x06, + 0x00, 0xC0, 0x1C, 0x03, 0x80, 0x70, 0x0F, 0xFF, 0xFF, 0xF0, 0x1F, 0x0F, + 0xF9, 0x83, 0x70, 0x70, 0x0E, 0x01, 0xC0, 0x30, 0x7C, 0x0F, 0x80, 0x38, + 0x03, 0x80, 0x3C, 0x07, 0xC1, 0xD8, 0x33, 0xFE, 0x1F, 0x00, 0x01, 0xC0, + 0x1C, 0x03, 0xC0, 0x6C, 0x06, 0xC0, 0xCC, 0x18, 0xC1, 0x8C, 0x30, 0xC6, + 0x0C, 0x60, 0xCF, 0xFF, 0xFF, 0xF0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, + 0x3F, 0xC7, 0xF9, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x1F, 0xC3, 0xFE, 0x61, + 0xC0, 0x1C, 0x01, 0x80, 0x3C, 0x07, 0xC1, 0xD8, 0x31, 0xFE, 0x1F, 0x00, + 0x07, 0x07, 0xC3, 0x81, 0x80, 0x60, 0x33, 0x8F, 0xFB, 0xC7, 0xC0, 0xF0, + 0x3C, 0x0F, 0x03, 0xC0, 0xF8, 0x36, 0x1D, 0xFE, 0x1F, 0x00, 0xFF, 0xFF, + 0xFF, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x18, 0x03, 0x80, + 0x30, 0x07, 0x00, 0x60, 0x06, 0x00, 0xC0, 0x0C, 0x01, 0x80, 0x38, 0x00, + 0x1F, 0x0F, 0xF1, 0x83, 0x30, 0x6E, 0x0E, 0xC1, 0x9C, 0x71, 0xFC, 0x3F, + 0x8C, 0x1B, 0x83, 0xE0, 0x3C, 0x07, 0xC1, 0xD8, 0x33, 0xFE, 0x1F, 0x00, + 0x1E, 0x1F, 0xEE, 0x1B, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xE1, 0xDF, + 0xF3, 0xEC, 0x03, 0x00, 0xC0, 0x60, 0x38, 0xFC, 0x3C, 0x00, 0x6F, 0x60, + 0x00, 0x00, 0x00, 0x6F, 0x60, 0x6F, 0x60, 0x00, 0x00, 0x00, 0x66, 0x66, + 0xEC, 0x40, 0x00, 0x40, 0x70, 0xFC, 0xF8, 0xF8, 0x30, 0x07, 0x80, 0x7C, + 0x07, 0xC0, 0x70, 0x04, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x01, 0xFF, + 0xFF, 0xF8, 0x80, 0x3C, 0x07, 0xC0, 0x7C, 0x03, 0xC0, 0x30, 0x7C, 0x78, + 0xF8, 0x38, 0x08, 0x00, 0x1F, 0x1F, 0xE6, 0x1F, 0x03, 0x00, 0xC0, 0x30, + 0x1C, 0x0E, 0x07, 0x03, 0x80, 0xC0, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x30, + 0x0C, 0x00, 0x0F, 0x80, 0xFF, 0x0C, 0x18, 0xC6, 0x64, 0x79, 0x66, 0x4B, + 0x62, 0x73, 0x13, 0x98, 0x9C, 0xCC, 0xA6, 0x65, 0x3D, 0xEC, 0xEE, 0x20, + 0x01, 0x80, 0x07, 0xF0, 0x0F, 0x00, 0x06, 0x00, 0x38, 0x01, 0xC0, 0x1E, + 0x00, 0xD8, 0x06, 0xC0, 0x66, 0x03, 0x18, 0x18, 0xC1, 0xC6, 0x0C, 0x38, + 0x7F, 0xC7, 0xFE, 0x30, 0x39, 0x80, 0xDC, 0x06, 0xC0, 0x38, 0xFF, 0x1F, + 0xF3, 0x03, 0x60, 0x7C, 0x0F, 0x81, 0xF0, 0x77, 0xFC, 0xFF, 0x98, 0x1B, + 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x37, 0xFE, 0xFF, 0x00, 0x0F, 0x83, + 0xFC, 0x30, 0x66, 0x07, 0x60, 0x3E, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, + 0x00, 0xC0, 0x0E, 0x00, 0x60, 0x36, 0x07, 0x30, 0x63, 0xFC, 0x0F, 0x80, + 0xFE, 0x1F, 0xF3, 0x07, 0x60, 0x6C, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, + 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x0F, 0x81, 0xB0, 0x77, 0xFC, 0xFE, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFC, 0xFF, + 0x98, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, + 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xFF, + 0xDF, 0xFB, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, + 0x0F, 0x83, 0xFC, 0x30, 0x66, 0x07, 0x60, 0x3E, 0x00, 0xC0, 0x0C, 0x00, + 0xC1, 0xFC, 0x1F, 0xC0, 0x3E, 0x03, 0x60, 0x36, 0x03, 0x30, 0x71, 0xFE, + 0x0F, 0x80, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1F, + 0xFF, 0xFF, 0xF8, 0x0F, 0x01, 0xE0, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x60, 0xFF, 0xFF, 0xF0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC3, 0xFF, 0xFF, 0xC0, + 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x01, 0x80, 0x3C, 0x07, 0xC0, 0xDC, 0x31, 0xFE, 0x1F, 0x00, + 0xC0, 0xFC, 0x0C, 0xC1, 0xCC, 0x38, 0xC7, 0x0C, 0x60, 0xCC, 0x0D, 0xC0, + 0xFC, 0x0F, 0xE0, 0xE7, 0x0C, 0x30, 0xC3, 0x8C, 0x1C, 0xC0, 0xCC, 0x0E, + 0xC0, 0x70, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, + 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, + 0xFF, 0xE0, 0xE0, 0xFC, 0x1F, 0x87, 0xF8, 0xFF, 0x17, 0xE6, 0xF6, 0xDE, + 0xD3, 0xDE, 0x79, 0xCF, 0x31, 0xE6, 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, + 0xC0, 0x60, 0xC0, 0x7C, 0x0F, 0x81, 0xF8, 0x3F, 0x07, 0xF0, 0xF6, 0x3E, + 0x67, 0xCC, 0xF8, 0xDF, 0x1B, 0xE1, 0xFC, 0x3F, 0x83, 0xF0, 0x7E, 0x07, + 0xC0, 0xE0, 0x0F, 0x83, 0xFC, 0x30, 0xE6, 0x06, 0x60, 0x3E, 0x03, 0xC0, + 0x3C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3E, 0x03, 0x60, 0x36, 0x06, 0x30, + 0xE3, 0xFC, 0x0F, 0x80, 0xFF, 0x1F, 0xFB, 0x03, 0xE0, 0x3C, 0x07, 0x80, + 0xF0, 0x1E, 0x07, 0xFF, 0xDF, 0xE3, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, + 0x06, 0x00, 0xC0, 0x00, 0x0F, 0x81, 0xFE, 0x0C, 0x38, 0xC0, 0xC6, 0x03, + 0x70, 0x1B, 0x00, 0xD8, 0x06, 0xC0, 0x36, 0x01, 0xB0, 0x0D, 0x80, 0x66, + 0x03, 0x30, 0x30, 0xC3, 0x87, 0xF8, 0x0F, 0xC0, 0x03, 0x80, 0x0E, 0x00, + 0x20, 0xFF, 0x1F, 0xF3, 0x03, 0x60, 0x7C, 0x07, 0x80, 0xF0, 0x3E, 0x06, + 0xFF, 0x9F, 0xE3, 0x0C, 0x61, 0xCC, 0x19, 0x83, 0xB0, 0x36, 0x07, 0xC0, + 0x60, 0x0F, 0x83, 0xFE, 0x70, 0x66, 0x07, 0x60, 0x36, 0x00, 0x70, 0x03, + 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0x70, 0x03, 0xE0, 0x36, 0x03, 0x70, 0x73, + 0xFE, 0x0F, 0x80, 0xFF, 0xFF, 0xFF, 0xC1, 0x80, 0x0C, 0x00, 0x60, 0x03, + 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x03, 0x00, 0x18, 0x00, 0xC0, 0x06, 0x00, 0xC0, 0x78, 0x0F, 0x01, 0xE0, + 0x3C, 0x07, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0x78, 0x0F, 0x01, 0xE0, 0x3C, + 0x0F, 0x81, 0x98, 0x73, 0xFC, 0x1F, 0x00, 0xC0, 0x3E, 0x03, 0x60, 0x76, + 0x06, 0x60, 0x63, 0x06, 0x30, 0xC3, 0x0C, 0x18, 0xC1, 0x98, 0x19, 0x81, + 0xD8, 0x0F, 0x80, 0xF0, 0x0F, 0x00, 0x70, 0x06, 0x00, 0xC6, 0x1E, 0x38, + 0xF1, 0xC7, 0x8E, 0x6C, 0x73, 0x26, 0x99, 0xB4, 0xCD, 0xB6, 0x6D, 0xB3, + 0x4D, 0x9A, 0x6C, 0xF1, 0x47, 0x8E, 0x1C, 0x70, 0xE3, 0x86, 0x1C, 0x30, + 0xE0, 0xE0, 0x3B, 0x83, 0x8C, 0x18, 0x71, 0xC1, 0x8C, 0x0E, 0xC0, 0x3E, + 0x00, 0xE0, 0x07, 0x00, 0x78, 0x03, 0x60, 0x3B, 0x01, 0x8C, 0x1C, 0x71, + 0xC1, 0x8C, 0x0E, 0xE0, 0x38, 0xC0, 0x3E, 0x07, 0x60, 0x67, 0x0E, 0x30, + 0xC3, 0x9C, 0x19, 0x81, 0xD8, 0x0F, 0x00, 0xF0, 0x06, 0x00, 0x60, 0x06, + 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0xFF, 0xEF, 0xFE, 0x00, 0xE0, + 0x0C, 0x01, 0xC0, 0x38, 0x03, 0x00, 0x70, 0x06, 0x00, 0xC0, 0x1C, 0x01, + 0x80, 0x38, 0x07, 0x00, 0x60, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xF1, 0x8C, + 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x8C, 0x7F, 0xE0, + 0xC0, 0x60, 0x18, 0x0C, 0x06, 0x01, 0x80, 0xC0, 0x30, 0x18, 0x0C, 0x03, + 0x01, 0x80, 0x40, 0x30, 0x18, 0x06, 0x03, 0x01, 0xC0, 0xFF, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0xF0, 0x18, 0x0E, 0x0F, + 0x07, 0x83, 0x63, 0x31, 0x8D, 0x86, 0xC3, 0x80, 0xFF, 0xFF, 0xFC, 0xE3, + 0x8E, 0x1F, 0x0F, 0xF3, 0x87, 0x60, 0x60, 0x0C, 0x3F, 0x9F, 0xF7, 0x06, + 0xC0, 0xD8, 0x1B, 0x87, 0x3F, 0xE3, 0xEE, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0x0C, 0x01, 0x9E, 0x3F, 0xE7, 0x0E, 0xC0, 0xD8, 0x1F, 0x01, 0xE0, 0x3C, + 0x07, 0x81, 0xF0, 0x37, 0x0E, 0xFF, 0x99, 0xE0, 0x1F, 0x0F, 0xF1, 0x83, + 0x60, 0x6C, 0x07, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x1D, 0x83, 0x3F, + 0xC1, 0xF0, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC7, 0xB7, 0xFD, 0x87, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0D, 0x87, 0x7F, 0xC7, + 0xB0, 0x1F, 0x07, 0xF1, 0x87, 0x60, 0x6C, 0x07, 0xFF, 0xFF, 0xFE, 0x00, + 0xC0, 0x1C, 0x09, 0x83, 0xBF, 0xE1, 0xF0, 0x03, 0xC0, 0xFC, 0x38, 0x0E, + 0x01, 0x80, 0x30, 0x3F, 0xF7, 0xFE, 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, + 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x03, 0x00, 0x60, 0x00, 0x1E, 0xDF, + 0xF6, 0x1F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36, 0x1D, + 0xFF, 0x1E, 0xC0, 0x34, 0x0F, 0x87, 0x7F, 0x8F, 0xC0, 0xC0, 0x18, 0x03, + 0x00, 0x60, 0x0C, 0x01, 0x9E, 0x37, 0xF7, 0x06, 0xC0, 0xD8, 0x1B, 0x03, + 0xE0, 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xF8, 0x1C, 0x06, 0x01, + 0xC0, 0x18, 0x00, 0x0F, 0xE1, 0xFC, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, + 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x87, 0xFF, 0xFF, 0xE0, 0x03, 0x07, + 0x03, 0x00, 0x7F, 0x7F, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x07, 0x06, 0x7E, 0xF8, 0xC0, 0x18, 0x03, 0x00, + 0x60, 0x0C, 0x01, 0x83, 0xB0, 0xE6, 0x38, 0xCE, 0x1B, 0x83, 0x60, 0x7E, + 0x0E, 0xE1, 0x8E, 0x30, 0xE6, 0x0C, 0xC1, 0xD8, 0x1C, 0xFE, 0x1F, 0xC0, + 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0xFF, 0xFF, 0xFC, 0xDC, 0xEF, + 0xFF, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, + 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xCF, 0x37, 0xFE, 0x0F, 0x03, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0x0F, + 0x83, 0xFC, 0x70, 0xE6, 0x06, 0x60, 0x3E, 0x03, 0xE0, 0x3E, 0x03, 0x60, + 0x36, 0x06, 0x70, 0xE3, 0xFC, 0x0F, 0x80, 0xDF, 0x1F, 0xF3, 0x87, 0x60, + 0x6C, 0x0F, 0x80, 0xF0, 0x1E, 0x03, 0xC0, 0xF8, 0x1B, 0x87, 0x7F, 0xCD, + 0xF1, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, 0x00, 0x1E, 0xDF, 0xF6, 0x1F, + 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x36, 0x1D, 0xFF, 0x1E, + 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xCF, 0xFF, 0xB8, 0x1C, 0x0C, + 0x06, 0x03, 0x01, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x00, 0x1F, 0x0F, + 0xF9, 0x83, 0x70, 0x76, 0x00, 0xF0, 0x07, 0xE0, 0x1E, 0x00, 0xF8, 0x1F, + 0x83, 0x3F, 0xE1, 0xF0, 0x18, 0x06, 0x01, 0x83, 0xFF, 0xFF, 0xC6, 0x01, + 0x80, 0x60, 0x18, 0x06, 0x01, 0x80, 0x60, 0x18, 0x07, 0x00, 0xFC, 0x1F, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, + 0x36, 0x1D, 0xFF, 0x3E, 0xC0, 0xE0, 0x36, 0x07, 0x60, 0x63, 0x06, 0x30, + 0xC3, 0x0C, 0x18, 0xC1, 0x98, 0x0D, 0x80, 0xD0, 0x0F, 0x00, 0x70, 0x06, + 0x00, 0xC6, 0x1E, 0x30, 0xF1, 0xC5, 0x8E, 0x6C, 0xF3, 0x26, 0x99, 0xB6, + 0xCD, 0x34, 0x79, 0xA1, 0xC7, 0x0E, 0x38, 0x61, 0xC3, 0x0C, 0x00, 0xE0, + 0x73, 0x06, 0x38, 0xC1, 0x9C, 0x0F, 0x80, 0xF0, 0x07, 0x00, 0xF0, 0x0D, + 0x81, 0x9C, 0x38, 0xC7, 0x06, 0xE0, 0x70, 0xC0, 0x3F, 0x01, 0x98, 0x18, + 0xE0, 0xC3, 0x0E, 0x1C, 0x60, 0x63, 0x03, 0x30, 0x0D, 0x80, 0x78, 0x03, + 0xC0, 0x0E, 0x00, 0x60, 0x03, 0x00, 0x30, 0x03, 0x80, 0x78, 0x03, 0x80, + 0x00, 0xFF, 0xDF, 0xF8, 0x07, 0x01, 0xC0, 0x70, 0x0C, 0x03, 0x00, 0xE0, + 0x38, 0x0E, 0x01, 0x80, 0x7F, 0xFF, 0xFE, 0x07, 0x0F, 0x0C, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x38, 0xF0, 0xE0, 0x30, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x1C, 0x0C, 0x0F, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, + 0xC0, 0xE0, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x38, 0x18, 0x0F, 0x0F, + 0x1C, 0x18, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x70, 0xE0, 0xC0, 0x30, + 0x07, 0xE0, 0xF1, 0x87, 0x07, 0xE0, 0x1E, 0x00 }; + +const GFXglyph RobotoMono_Regular12pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 14, 0, 0 }, // 0x20 ' ' + { 1, 2, 17, 14, 6, -16 }, // 0x21 '!' + { 6, 6, 6, 14, 4, -17 }, // 0x22 '"' + { 11, 13, 17, 14, 1, -16 }, // 0x23 '#' + { 39, 11, 22, 14, 2, -19 }, // 0x24 '$' + { 70, 13, 17, 14, 1, -16 }, // 0x25 '%' + { 98, 13, 17, 14, 1, -16 }, // 0x26 '&' + { 126, 2, 6, 14, 6, -17 }, // 0x27 ''' + { 128, 6, 25, 14, 4, -18 }, // 0x28 '(' + { 147, 6, 25, 14, 4, -18 }, // 0x29 ')' + { 166, 11, 12, 14, 2, -13 }, // 0x2A '*' + { 183, 12, 13, 14, 1, -14 }, // 0x2B '+' + { 203, 4, 7, 14, 4, -2 }, // 0x2C ',' + { 207, 9, 2, 14, 3, -8 }, // 0x2D '-' + { 210, 3, 3, 14, 6, -2 }, // 0x2E '.' + { 212, 9, 18, 14, 3, -16 }, // 0x2F '/' + { 233, 11, 17, 14, 2, -16 }, // 0x30 '0' + { 257, 7, 17, 14, 2, -16 }, // 0x31 '1' + { 272, 12, 17, 14, 1, -16 }, // 0x32 '2' + { 298, 11, 17, 14, 1, -16 }, // 0x33 '3' + { 322, 12, 17, 14, 1, -16 }, // 0x34 '4' + { 348, 11, 17, 14, 2, -16 }, // 0x35 '5' + { 372, 10, 17, 14, 2, -16 }, // 0x36 '6' + { 394, 12, 17, 14, 1, -16 }, // 0x37 '7' + { 420, 11, 17, 14, 2, -16 }, // 0x38 '8' + { 444, 10, 17, 14, 2, -16 }, // 0x39 '9' + { 466, 4, 13, 14, 6, -12 }, // 0x3A ':' + { 473, 4, 17, 14, 6, -12 }, // 0x3B ';' + { 482, 10, 11, 14, 2, -12 }, // 0x3C '<' + { 496, 11, 7, 14, 2, -10 }, // 0x3D '=' + { 506, 10, 11, 14, 2, -12 }, // 0x3E '>' + { 520, 10, 17, 14, 2, -16 }, // 0x3F '?' + { 542, 13, 17, 14, 1, -16 }, // 0x40 '@' + { 570, 13, 17, 14, 1, -16 }, // 0x41 'A' + { 598, 11, 17, 14, 2, -16 }, // 0x42 'B' + { 622, 12, 17, 14, 1, -16 }, // 0x43 'C' + { 648, 11, 17, 14, 2, -16 }, // 0x44 'D' + { 672, 11, 17, 14, 2, -16 }, // 0x45 'E' + { 696, 11, 17, 14, 2, -16 }, // 0x46 'F' + { 720, 12, 17, 14, 1, -16 }, // 0x47 'G' + { 746, 11, 17, 14, 2, -16 }, // 0x48 'H' + { 770, 10, 17, 14, 2, -16 }, // 0x49 'I' + { 792, 11, 17, 14, 1, -16 }, // 0x4A 'J' + { 816, 12, 17, 14, 2, -16 }, // 0x4B 'K' + { 842, 11, 17, 14, 2, -16 }, // 0x4C 'L' + { 866, 11, 17, 14, 2, -16 }, // 0x4D 'M' + { 890, 11, 17, 14, 2, -16 }, // 0x4E 'N' + { 914, 12, 17, 14, 1, -16 }, // 0x4F 'O' + { 940, 11, 17, 14, 2, -16 }, // 0x50 'P' + { 964, 13, 20, 14, 1, -16 }, // 0x51 'Q' + { 997, 11, 17, 14, 2, -16 }, // 0x52 'R' + { 1021, 12, 17, 14, 1, -16 }, // 0x53 'S' + { 1047, 13, 17, 14, 1, -16 }, // 0x54 'T' + { 1075, 11, 17, 14, 2, -16 }, // 0x55 'U' + { 1099, 12, 17, 14, 1, -16 }, // 0x56 'V' + { 1125, 13, 17, 14, 1, -16 }, // 0x57 'W' + { 1153, 13, 17, 14, 1, -16 }, // 0x58 'X' + { 1181, 12, 17, 14, 1, -16 }, // 0x59 'Y' + { 1207, 12, 17, 14, 1, -16 }, // 0x5A 'Z' + { 1233, 5, 23, 14, 5, -18 }, // 0x5B '[' + { 1248, 9, 18, 14, 3, -16 }, // 0x5C '\' + { 1269, 4, 23, 14, 5, -18 }, // 0x5D ']' + { 1281, 9, 9, 14, 3, -16 }, // 0x5E '^' + { 1292, 11, 2, 14, 2, 1 }, // 0x5F '_' + { 1295, 5, 3, 14, 5, -17 }, // 0x60 '`' + { 1297, 11, 13, 14, 2, -12 }, // 0x61 'a' + { 1315, 11, 18, 14, 2, -17 }, // 0x62 'b' + { 1340, 11, 13, 14, 2, -12 }, // 0x63 'c' + { 1358, 10, 18, 14, 2, -17 }, // 0x64 'd' + { 1381, 11, 13, 14, 2, -12 }, // 0x65 'e' + { 1399, 11, 19, 14, 2, -18 }, // 0x66 'f' + { 1426, 10, 18, 14, 2, -12 }, // 0x67 'g' + { 1449, 11, 18, 14, 2, -17 }, // 0x68 'h' + { 1474, 11, 17, 14, 2, -16 }, // 0x69 'i' + { 1498, 8, 22, 14, 2, -16 }, // 0x6A 'j' + { 1520, 11, 18, 14, 2, -17 }, // 0x6B 'k' + { 1545, 11, 18, 14, 2, -17 }, // 0x6C 'l' + { 1570, 12, 13, 14, 1, -12 }, // 0x6D 'm' + { 1590, 10, 13, 14, 2, -12 }, // 0x6E 'n' + { 1607, 12, 13, 14, 1, -12 }, // 0x6F 'o' + { 1627, 11, 18, 14, 2, -12 }, // 0x70 'p' + { 1652, 10, 18, 14, 2, -12 }, // 0x71 'q' + { 1675, 9, 13, 14, 4, -12 }, // 0x72 'r' + { 1690, 11, 13, 14, 2, -12 }, // 0x73 's' + { 1708, 10, 16, 14, 2, -15 }, // 0x74 't' + { 1728, 10, 13, 14, 2, -12 }, // 0x75 'u' + { 1745, 12, 13, 14, 1, -12 }, // 0x76 'v' + { 1765, 13, 13, 14, 1, -12 }, // 0x77 'w' + { 1787, 12, 13, 14, 1, -12 }, // 0x78 'x' + { 1807, 13, 18, 14, 1, -12 }, // 0x79 'y' + { 1837, 11, 13, 14, 2, -12 }, // 0x7A 'z' + { 1855, 8, 23, 14, 4, -18 }, // 0x7B '{' + { 1878, 2, 22, 14, 6, -16 }, // 0x7C '|' + { 1884, 8, 23, 14, 4, -18 }, // 0x7D '}' + { 1907, 13, 5, 14, 1, -9 } }; // 0x7E '~' + +const GFXfont RobotoMono_Regular12pt7b PROGMEM = { + (uint8_t *)RobotoMono_Regular12pt7bBitmaps, + (GFXglyph *)RobotoMono_Regular12pt7bGlyphs, + 0x20, 0x7E, 31 }; + +// Approx. 2588 bytes +#endif // ifndef FONTS_ROBOTOMONO_REGULAR12PT7B_H diff --git a/src/src/Static/Fonts/RobotoMono_Regular16pt7b.h b/src/src/Static/Fonts/RobotoMono_Regular16pt7b.h new file mode 100644 index 000000000..1e3839188 --- /dev/null +++ b/src/src/Static/Fonts/RobotoMono_Regular16pt7b.h @@ -0,0 +1,372 @@ +#ifndef FONTS_ROBOTOMONO_REGULAR16PT7B_H +#define FONTS_ROBOTOMONO_REGULAR16PT7B_H +const uint8_t RobotoMono_Regular16pt7bBitmaps[] PROGMEM = { + 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x60, 0x00, 0x06, 0xF6, + 0xE3, 0xE3, 0xE3, 0xE3, 0xC3, 0xC3, 0xC3, 0x01, 0x86, 0x01, 0x87, 0x00, + 0xC3, 0x00, 0x61, 0x80, 0x30, 0xC0, 0x38, 0x61, 0xFF, 0xFE, 0xFF, 0xFF, + 0x06, 0x18, 0x03, 0x0C, 0x01, 0x86, 0x01, 0xC7, 0x00, 0xC3, 0x80, 0x61, + 0x83, 0xFF, 0xFD, 0xFF, 0xFE, 0x1C, 0x30, 0x0C, 0x38, 0x06, 0x18, 0x03, + 0x0C, 0x01, 0x86, 0x01, 0xC7, 0x00, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, + 0x0C, 0x00, 0xFF, 0x03, 0xFF, 0x0F, 0x0E, 0x1C, 0x0E, 0x70, 0x1C, 0xE0, + 0x39, 0xC0, 0x31, 0xC0, 0x03, 0xC0, 0x03, 0xE0, 0x03, 0xF0, 0x03, 0xF8, + 0x00, 0xF8, 0x00, 0x78, 0x00, 0x70, 0x00, 0x6E, 0x00, 0xEE, 0x01, 0x9C, + 0x07, 0x3C, 0x1E, 0x3F, 0xF8, 0x1F, 0xE0, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x3C, 0x00, 0x7F, 0x00, 0x39, 0xC0, 0x18, 0x61, 0x8C, 0x31, 0x86, + 0x19, 0xC3, 0x9C, 0xC1, 0xFC, 0xC0, 0x3C, 0x60, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x30, 0x00, 0x39, 0xE0, 0x19, 0xF8, 0x19, 0xCE, 0x0C, 0xC3, 0x0C, + 0x61, 0x8E, 0x30, 0xC2, 0x18, 0x60, 0x0E, 0x70, 0x03, 0xF0, 0x00, 0xF0, + 0x0F, 0x80, 0x1F, 0xE0, 0x3C, 0xE0, 0x38, 0x70, 0x30, 0x70, 0x30, 0x70, + 0x38, 0xE0, 0x39, 0xE0, 0x1F, 0xC0, 0x1F, 0x00, 0x0E, 0x00, 0x3F, 0x00, + 0x7F, 0x86, 0xF3, 0xC6, 0xE1, 0xC6, 0xE0, 0xEE, 0xC0, 0x7C, 0xE0, 0x7C, + 0xE0, 0x3C, 0x79, 0xFC, 0x7F, 0xEE, 0x1F, 0x8F, 0xFF, 0xFF, 0xF8, 0x01, + 0x03, 0x06, 0x0E, 0x1C, 0x18, 0x38, 0x38, 0x30, 0x70, 0x70, 0x70, 0x60, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x60, 0x60, 0x70, 0x70, 0x70, 0x30, 0x38, + 0x38, 0x18, 0x1C, 0x0E, 0x06, 0x03, 0x01, 0xC0, 0xE0, 0x70, 0x30, 0x38, + 0x18, 0x1C, 0x0C, 0x0E, 0x0E, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x06, 0x06, 0x0E, 0x0E, 0x0C, 0x1C, 0x18, 0x38, 0x30, + 0x60, 0xE0, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x06, 0x00, 0x0C, 0x04, 0x18, + 0x4E, 0x33, 0xFF, 0xFF, 0x8F, 0xFC, 0x03, 0x80, 0x0F, 0x80, 0x3B, 0x80, + 0x63, 0x81, 0xC7, 0x07, 0x07, 0x02, 0x0C, 0x00, 0x03, 0x80, 0x07, 0x00, + 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x7F, 0xFF, 0xFF, + 0xFE, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, + 0x01, 0xC0, 0x39, 0xCE, 0x73, 0xB9, 0xDC, 0x20, 0xFF, 0xFF, 0xFF, 0xEF, + 0xFE, 0x00, 0x70, 0x0E, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x18, 0x01, 0x80, + 0x38, 0x03, 0x00, 0x70, 0x07, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0x0C, 0x01, + 0xC0, 0x18, 0x03, 0x80, 0x38, 0x03, 0x00, 0x70, 0x06, 0x00, 0x60, 0x0E, + 0x00, 0x0F, 0xC0, 0x7F, 0xC3, 0xCF, 0x9C, 0x0E, 0x70, 0x1F, 0x80, 0x7E, + 0x00, 0xF8, 0x0F, 0xE0, 0x7F, 0x83, 0xBE, 0x3C, 0xF9, 0xE3, 0xEE, 0x0F, + 0xF0, 0x3F, 0x00, 0xF8, 0x07, 0xE0, 0x1D, 0xC0, 0x77, 0x03, 0x8F, 0x3E, + 0x1F, 0xF0, 0x3F, 0x00, 0x03, 0x87, 0xDF, 0xFF, 0x7E, 0x38, 0x1C, 0x0E, + 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, + 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x07, 0xC0, 0x3F, 0xE0, 0xF3, 0xE3, 0x81, + 0xE7, 0x01, 0xDC, 0x03, 0xB8, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x07, 0xFF, 0xEF, 0xFF, 0xC0, 0x0F, + 0xC0, 0x7F, 0xC3, 0xC7, 0x9C, 0x07, 0x70, 0x1D, 0x80, 0x70, 0x01, 0xC0, + 0x07, 0x00, 0x78, 0x1F, 0xC0, 0x7F, 0x00, 0x3E, 0x00, 0x3C, 0x00, 0x70, + 0x00, 0xC0, 0x03, 0xE0, 0x1D, 0xC0, 0x77, 0x01, 0xCF, 0x1E, 0x1F, 0xF0, + 0x3F, 0x00, 0x00, 0x38, 0x00, 0x78, 0x00, 0xF8, 0x00, 0xF8, 0x01, 0xF8, + 0x03, 0xB8, 0x03, 0xB8, 0x07, 0x38, 0x06, 0x38, 0x0E, 0x38, 0x1C, 0x38, + 0x18, 0x38, 0x38, 0x38, 0x70, 0x38, 0x60, 0x38, 0xFF, 0xFF, 0xFF, 0xFF, + 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x3F, 0xF8, + 0xFF, 0xE7, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0xF0, + 0x7F, 0xE1, 0xE7, 0xC6, 0x07, 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, 0x01, + 0xC0, 0x07, 0xE0, 0x1F, 0x80, 0xE7, 0x03, 0x9F, 0x3C, 0x3F, 0xE0, 0x3F, + 0x00, 0x01, 0xE0, 0x1F, 0x81, 0xF8, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x07, + 0x00, 0x19, 0xF0, 0xEF, 0xF3, 0xF3, 0xEF, 0x03, 0xBC, 0x07, 0xE0, 0x1F, + 0x80, 0x7E, 0x01, 0xF8, 0x07, 0x60, 0x1D, 0xC0, 0x77, 0x83, 0x8F, 0x3E, + 0x1F, 0xF0, 0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x30, 0x00, 0xE0, + 0x01, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x60, 0x01, 0xC0, 0x03, + 0x80, 0x0E, 0x00, 0x1C, 0x00, 0x70, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, + 0x0C, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x03, 0x80, 0x00, 0x0F, 0xC0, + 0xFF, 0x87, 0x8F, 0x1C, 0x0E, 0xE0, 0x3B, 0x80, 0xEE, 0x03, 0x9C, 0x0E, + 0x78, 0x70, 0xFF, 0x81, 0xFE, 0x1F, 0x3C, 0x70, 0x3B, 0x80, 0xEE, 0x01, + 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0xEF, 0x03, 0x9F, 0x3C, 0x3F, 0xE0, 0x3F, + 0x00, 0x0F, 0xC0, 0x7F, 0x83, 0xCF, 0x1C, 0x0E, 0x70, 0x3B, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1D, 0x80, 0x77, 0x03, 0xDE, 0x1F, 0x3F, 0xFC, + 0x7F, 0x70, 0x01, 0xC0, 0x06, 0x00, 0x38, 0x00, 0xE0, 0x0F, 0x01, 0xF8, + 0x1F, 0xC0, 0x7C, 0x00, 0x77, 0xFE, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3B, 0xFF, 0x70, 0x39, 0xE7, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0x8E, 0x38, 0xE3, 0x9C, 0x73, 0x82, 0x00, 0x00, 0x10, 0x07, + 0x01, 0xF0, 0x7E, 0x1F, 0x8F, 0xC0, 0xF0, 0x0F, 0x00, 0xFC, 0x01, 0xF8, + 0x07, 0xE0, 0x1F, 0x00, 0x70, 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF8, 0x80, 0x07, 0x00, + 0x3E, 0x00, 0xFE, 0x00, 0xFC, 0x01, 0xF8, 0x01, 0xE0, 0x0F, 0x03, 0xF0, + 0x7E, 0x1F, 0xC1, 0xF0, 0x0E, 0x00, 0x40, 0x00, 0x1F, 0x81, 0xFF, 0x1E, + 0x3D, 0xC0, 0xFE, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x70, 0x07, + 0x80, 0x78, 0x07, 0x80, 0x78, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0C, 0x00, 0xF0, 0x03, 0x80, 0x03, 0xF0, 0x03, 0xFC, + 0x07, 0x8F, 0x03, 0x00, 0xC3, 0x0E, 0x33, 0x9F, 0x99, 0x8E, 0xCC, 0xCC, + 0x62, 0xC6, 0x31, 0xE3, 0x18, 0xF3, 0x0C, 0x79, 0x86, 0x2C, 0xC3, 0x16, + 0x61, 0x1B, 0x39, 0xCD, 0x8F, 0xFC, 0x67, 0x9C, 0x30, 0x00, 0x1C, 0x00, + 0x07, 0xC6, 0x01, 0xFF, 0x00, 0x3F, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x00, + 0x70, 0x00, 0x7C, 0x00, 0x36, 0x00, 0x1B, 0x00, 0x1D, 0xC0, 0x0C, 0x60, + 0x06, 0x30, 0x07, 0x1C, 0x03, 0x8E, 0x01, 0x83, 0x01, 0xC1, 0xC0, 0xE0, + 0xE0, 0x7F, 0xF0, 0x7F, 0xFC, 0x38, 0x0E, 0x18, 0x03, 0x1C, 0x01, 0xCE, + 0x00, 0xE6, 0x00, 0x77, 0x00, 0x1C, 0xFF, 0x83, 0xFF, 0x8C, 0x0F, 0x30, + 0x0E, 0xC0, 0x3B, 0x00, 0xEC, 0x03, 0xB0, 0x0E, 0xC0, 0x73, 0xFF, 0x8F, + 0xFE, 0x30, 0x3C, 0xC0, 0x3B, 0x00, 0x7C, 0x01, 0xF0, 0x07, 0xC0, 0x1F, + 0x00, 0x7C, 0x03, 0xB0, 0x3E, 0xFF, 0xF3, 0xFF, 0x00, 0x07, 0xC0, 0x3F, + 0xE0, 0xF3, 0xE3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xF8, 0x03, 0xF0, 0x00, + 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x38, + 0x00, 0x70, 0x07, 0xE0, 0x0E, 0xE0, 0x39, 0xC0, 0x71, 0xE3, 0xC1, 0xFF, + 0x00, 0xF8, 0x00, 0xFF, 0x81, 0xFF, 0xC3, 0x87, 0xC7, 0x01, 0xCE, 0x01, + 0xDC, 0x03, 0xB8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, + 0x00, 0x7E, 0x00, 0xFC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x1D, 0xC0, + 0x3B, 0x80, 0xE7, 0x0F, 0x8F, 0xFE, 0x1F, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, + 0xF8, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0xFF, 0xBF, 0xFD, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, + 0xF8, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, + 0x00, 0x3F, 0xFD, 0xFF, 0xEE, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x00, 0x07, 0xC0, 0x3F, + 0xE0, 0xF1, 0xE3, 0x80, 0xE7, 0x01, 0xDC, 0x01, 0xF8, 0x00, 0x70, 0x00, + 0xC0, 0x01, 0x80, 0x03, 0x00, 0x06, 0x07, 0xFC, 0x0F, 0xF8, 0x01, 0xF8, + 0x03, 0xF0, 0x07, 0xE0, 0x0E, 0xE0, 0x1D, 0xE0, 0x39, 0xF1, 0xE1, 0xFF, + 0x80, 0xFC, 0x00, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, + 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0x03, + 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, + 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x30, 0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0x0E, + 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, + 0xC0, 0x0E, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0xF0, 0x07, + 0x60, 0x0E, 0xE0, 0x39, 0xE0, 0x71, 0xF3, 0xC1, 0xFF, 0x00, 0xF8, 0x00, + 0xC0, 0x1D, 0x80, 0x73, 0x01, 0xE6, 0x07, 0x8C, 0x1E, 0x18, 0x38, 0x30, + 0xE0, 0x63, 0xC0, 0xCF, 0x01, 0x9C, 0x03, 0x78, 0x07, 0xF8, 0x0F, 0x78, + 0x1E, 0x70, 0x38, 0x70, 0x60, 0xF0, 0xC0, 0xE1, 0x80, 0xE3, 0x01, 0xE6, + 0x01, 0xCC, 0x01, 0xD8, 0x03, 0xC0, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, + 0x80, 0x0E, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0x1F, 0xE0, + 0x3F, 0xE0, 0xFF, 0xC1, 0xFF, 0x83, 0xFF, 0x0F, 0xFF, 0x1B, 0xF6, 0x37, + 0xEC, 0xEF, 0xDD, 0x9F, 0x9F, 0x3F, 0x3E, 0x7E, 0x78, 0xFC, 0x71, 0xF8, + 0xE3, 0xF1, 0x87, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, 0x3F, 0x00, 0x7E, 0x00, + 0xFC, 0x01, 0xC0, 0xE0, 0x0F, 0xC0, 0x3F, 0x00, 0xFE, 0x03, 0xF8, 0x0F, + 0xF0, 0x3F, 0xC0, 0xFB, 0x83, 0xEE, 0x0F, 0x9C, 0x3E, 0x30, 0xF8, 0xE3, + 0xE1, 0xCF, 0x87, 0x3E, 0x0E, 0xF8, 0x3B, 0xE0, 0x7F, 0x81, 0xFE, 0x03, + 0xF8, 0x0F, 0xE0, 0x1F, 0x80, 0x70, 0x07, 0xC0, 0x3F, 0xE0, 0xF3, 0xE3, + 0x81, 0xC7, 0x01, 0xDC, 0x03, 0xB8, 0x03, 0xF0, 0x07, 0xC0, 0x0F, 0x80, + 0x1F, 0x00, 0x3E, 0x00, 0x7C, 0x00, 0xF8, 0x01, 0xF8, 0x03, 0xF0, 0x07, + 0xE0, 0x1C, 0xE0, 0x39, 0xC0, 0xE1, 0xE7, 0xC1, 0xFF, 0x00, 0xF8, 0x00, + 0xFF, 0xC3, 0xFF, 0xCE, 0x0F, 0xB8, 0x0F, 0xE0, 0x1F, 0x80, 0x7E, 0x00, + 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0xFE, 0x0F, 0xBF, 0xFC, 0xFF, 0xC3, 0x80, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, + 0x03, 0x80, 0x00, 0x03, 0xE0, 0x07, 0xFC, 0x07, 0x9F, 0x07, 0x03, 0x83, + 0x00, 0xE3, 0x80, 0x31, 0xC0, 0x1C, 0xC0, 0x0E, 0xE0, 0x07, 0x70, 0x03, + 0xB8, 0x01, 0xDC, 0x00, 0xEE, 0x00, 0x73, 0x00, 0x39, 0x80, 0x1C, 0xE0, + 0x0E, 0x70, 0x06, 0x18, 0x07, 0x0E, 0x07, 0x83, 0xCF, 0x80, 0xFF, 0x80, + 0x1F, 0xE0, 0x00, 0x78, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFF, + 0x83, 0xFF, 0x8E, 0x1F, 0x38, 0x0E, 0xE0, 0x3B, 0x80, 0x7E, 0x01, 0xF8, + 0x07, 0xE0, 0x3B, 0x80, 0xEE, 0x1F, 0x3F, 0xF8, 0xFF, 0xC3, 0x87, 0x0E, + 0x0E, 0x38, 0x38, 0xE0, 0x73, 0x81, 0xCE, 0x03, 0xB8, 0x0E, 0xE0, 0x1F, + 0x80, 0x70, 0x07, 0xC0, 0x3F, 0xE0, 0xF1, 0xE3, 0x80, 0xE7, 0x00, 0xFC, + 0x01, 0xF8, 0x00, 0x38, 0x00, 0x78, 0x00, 0x7E, 0x00, 0x7F, 0x00, 0x3F, + 0x80, 0x0F, 0xC0, 0x07, 0x80, 0x03, 0x80, 0x07, 0xE0, 0x0F, 0xC0, 0x1D, + 0xC0, 0x7B, 0xE3, 0xE1, 0xFF, 0x80, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xC0, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, + 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, + 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, + 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0xE0, 0x0D, 0xC0, 0x1B, 0x80, + 0x37, 0x00, 0x6E, 0x00, 0xDC, 0x01, 0xB8, 0x03, 0x70, 0x06, 0xE0, 0x0D, + 0xC0, 0x1B, 0x80, 0x37, 0x00, 0x6E, 0x00, 0xDC, 0x01, 0xB8, 0x03, 0xF0, + 0x06, 0xE0, 0x1C, 0xE0, 0x39, 0xC0, 0xE1, 0xE7, 0xC1, 0xFF, 0x01, 0xF8, + 0x00, 0xE0, 0x07, 0x70, 0x07, 0x70, 0x07, 0x70, 0x0E, 0x70, 0x0E, 0x38, + 0x0E, 0x38, 0x1C, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x18, 0x1C, 0x38, 0x0C, + 0x38, 0x0E, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x07, 0x70, 0x07, 0x60, 0x03, + 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x01, 0xC0, 0xE1, 0xC3, 0xF0, + 0xE1, 0xF8, 0x70, 0xEC, 0x38, 0x66, 0x3E, 0x33, 0x1F, 0x19, 0x8D, 0x8C, + 0xE6, 0xCE, 0x73, 0x67, 0x39, 0xB3, 0x9D, 0xDD, 0xC6, 0xE6, 0xE3, 0x63, + 0x61, 0xB1, 0xB0, 0xD8, 0xD8, 0x6C, 0x6C, 0x3E, 0x3E, 0x1E, 0x0F, 0x0F, + 0x07, 0x87, 0x83, 0xC1, 0xC1, 0xC0, 0xE0, 0xE0, 0xF0, 0x07, 0xBC, 0x07, + 0x8E, 0x03, 0x83, 0x83, 0x81, 0xC1, 0xC0, 0x71, 0xC0, 0x38, 0xE0, 0x0E, + 0xE0, 0x07, 0x70, 0x01, 0xF0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x3E, 0x00, + 0x3B, 0x80, 0x1D, 0xC0, 0x1C, 0x70, 0x0E, 0x38, 0x0E, 0x0E, 0x0F, 0x07, + 0x87, 0x01, 0xC7, 0x00, 0x77, 0x80, 0x3C, 0xE0, 0x07, 0x70, 0x0F, 0x70, + 0x0E, 0x38, 0x0E, 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0x0E, 0x38, 0x0E, + 0x70, 0x06, 0x70, 0x07, 0xE0, 0x03, 0xE0, 0x03, 0xC0, 0x01, 0xC0, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x0E, 0x00, 0x70, + 0x01, 0xC0, 0x0E, 0x00, 0x78, 0x01, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xC0, + 0x0E, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0x00, 0x38, 0x01, 0xC0, 0x07, 0x00, + 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFE, 0x38, 0xE3, 0x8E, 0x38, + 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, + 0xE3, 0x8E, 0x38, 0xFF, 0xF0, 0xE0, 0x07, 0x00, 0x70, 0x03, 0x00, 0x38, + 0x01, 0x80, 0x18, 0x01, 0xC0, 0x0C, 0x00, 0xE0, 0x0E, 0x00, 0x60, 0x07, + 0x00, 0x30, 0x03, 0x00, 0x38, 0x01, 0x80, 0x1C, 0x01, 0xC0, 0x0C, 0x00, + 0xE0, 0x06, 0x00, 0x60, 0x07, 0xFF, 0xF1, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, + 0x71, 0xC7, 0xFF, 0xF0, 0x06, 0x00, 0x70, 0x0F, 0x00, 0xF8, 0x0F, 0x81, + 0xD8, 0x19, 0xC3, 0x8C, 0x38, 0xE7, 0x0E, 0x70, 0x7E, 0x07, 0xFF, 0xFF, + 0xFF, 0xF0, 0xF0, 0xE1, 0x83, 0x0F, 0xC0, 0xFF, 0xC7, 0xCF, 0x9C, 0x0E, + 0x70, 0x1C, 0x00, 0x70, 0x01, 0xC7, 0xFF, 0x3F, 0xFD, 0xE0, 0x77, 0x01, + 0xF8, 0x07, 0xE0, 0x1D, 0xC0, 0xF7, 0x8F, 0xCF, 0xF7, 0x1F, 0x9C, 0xC0, + 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0xF8, 0x37, + 0xF8, 0xF8, 0xF3, 0x81, 0xEE, 0x03, 0xB0, 0x0E, 0xC0, 0x1B, 0x00, 0x6C, + 0x01, 0xF0, 0x07, 0xC0, 0x1B, 0x00, 0xEE, 0x03, 0xB8, 0x1E, 0xF9, 0xF3, + 0x7F, 0x8C, 0xF8, 0x00, 0x07, 0xC0, 0x7F, 0xC3, 0xC7, 0x9E, 0x07, 0x70, + 0x1F, 0x80, 0x3E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x03, 0x70, 0x1D, 0xE0, 0x73, 0xC7, 0x87, 0xFC, 0x07, 0xC0, 0x00, 0x1C, + 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0xF9, 0xC7, 0xFF, + 0x3C, 0x7D, 0xC0, 0xF7, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, + 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x77, 0x01, 0xDC, 0x0F, 0x3E, 0x7C, 0x7F, + 0xF0, 0xF9, 0xC0, 0x07, 0xC0, 0x3F, 0xE0, 0xFB, 0xE3, 0xC1, 0xE7, 0x01, + 0xDC, 0x03, 0xB8, 0x03, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x03, 0x80, 0x07, + 0x00, 0x07, 0x00, 0x8F, 0x01, 0x8F, 0x8F, 0x0F, 0xFC, 0x07, 0xE0, 0x00, + 0xFE, 0x07, 0xFC, 0x0E, 0x08, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, + 0x7F, 0xFE, 0xFF, 0xFC, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, + 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x0F, 0x9C, 0x7F, 0xF3, + 0xC7, 0xDC, 0x0F, 0x70, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, + 0x80, 0x7E, 0x01, 0xF8, 0x07, 0x70, 0x1D, 0xC0, 0xF3, 0xE7, 0xC7, 0xFF, + 0x0F, 0x9C, 0x00, 0x70, 0x01, 0xC8, 0x0E, 0x78, 0xF8, 0xFF, 0xC0, 0xFC, + 0x00, 0xC0, 0x06, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, 0x03, 0x1F, + 0x19, 0xFE, 0xD8, 0xF7, 0x81, 0xF8, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, + 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, + 0x1F, 0x00, 0xE0, 0x03, 0x00, 0x1E, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, + 0xFC, 0x0F, 0xF0, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, + 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xC0, 0x70, 0x1C, 0x00, 0x00, + 0x0F, 0xF3, 0xFC, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, + 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, + 0x03, 0x81, 0xEF, 0xF3, 0xF0, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, + 0xC0, 0x03, 0x00, 0x0C, 0x07, 0xB0, 0x3C, 0xC1, 0xE3, 0x0F, 0x0C, 0x78, + 0x33, 0xC0, 0xCE, 0x03, 0x78, 0x0F, 0xF0, 0x3D, 0xC0, 0xE3, 0x83, 0x0F, + 0x0C, 0x1E, 0x30, 0x38, 0xC0, 0x73, 0x01, 0xEC, 0x03, 0xC0, 0xFF, 0x03, + 0xFC, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, + 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, + 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x03, 0xFF, + 0xFF, 0xFF, 0xC0, 0xEF, 0x3C, 0xFF, 0xFF, 0xFB, 0xE7, 0xE1, 0xC7, 0xE1, + 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, + 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, 0xC3, 0xE1, + 0xC3, 0xC7, 0xC6, 0xFF, 0xB6, 0x3D, 0xE0, 0x7E, 0x03, 0xE0, 0x1F, 0x00, + 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, + 0x00, 0xF8, 0x07, 0xC0, 0x38, 0x07, 0xC0, 0x3F, 0xE0, 0xF1, 0xE3, 0x81, + 0xE7, 0x01, 0xDC, 0x03, 0xB8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, + 0x80, 0x3F, 0x00, 0xE7, 0x01, 0xCE, 0x07, 0x8F, 0xBE, 0x0F, 0xF8, 0x07, + 0xC0, 0xCF, 0x86, 0xFF, 0x3E, 0x7D, 0xC0, 0xEC, 0x03, 0xE0, 0x1F, 0x00, + 0xF8, 0x03, 0xC0, 0x1E, 0x00, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xF0, 0x3B, + 0xE7, 0xDB, 0xFC, 0xCF, 0xC6, 0x00, 0x30, 0x01, 0x80, 0x0C, 0x00, 0x60, + 0x03, 0x00, 0x00, 0x0F, 0x9C, 0x7F, 0xF3, 0xC7, 0xDE, 0x0F, 0x70, 0x1F, + 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, + 0x70, 0x1D, 0xE0, 0xF3, 0xE7, 0xC7, 0xFF, 0x0F, 0x9C, 0x00, 0x70, 0x01, + 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0xE3, 0xFD, 0xFF, 0xF0, + 0xF8, 0x0F, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, + 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x00, 0x0F, 0xC1, 0xFF, 0x1E, + 0x3D, 0xC0, 0x7E, 0x03, 0xF0, 0x01, 0xC0, 0x0F, 0xE0, 0x1F, 0xE0, 0x1F, + 0x80, 0x1E, 0x00, 0x7E, 0x03, 0xF0, 0x1D, 0xE3, 0xE7, 0xFE, 0x0F, 0xC0, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xF0, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x78, 0xC0, 0xFF, 0x01, + 0xF8, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x1F, 0x80, + 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, 0x3D, + 0xE7, 0xEF, 0xFF, 0x1F, 0x38, 0xF0, 0x07, 0x70, 0x06, 0x70, 0x0E, 0x38, + 0x0E, 0x38, 0x0C, 0x18, 0x1C, 0x1C, 0x18, 0x1C, 0x38, 0x0C, 0x38, 0x0E, + 0x30, 0x06, 0x70, 0x07, 0x70, 0x07, 0x60, 0x03, 0xE0, 0x03, 0xC0, 0x01, + 0xC0, 0x01, 0xC0, 0xC1, 0x83, 0xE0, 0xE1, 0xF8, 0x70, 0xFC, 0x38, 0x66, + 0x3C, 0x33, 0x1B, 0x19, 0x8D, 0x9C, 0xE6, 0xCE, 0x77, 0x66, 0x1B, 0x3B, + 0x0D, 0x8D, 0x86, 0xC6, 0xC3, 0x63, 0xC1, 0xE1, 0xE0, 0x70, 0x70, 0x38, + 0x38, 0x1C, 0x1C, 0x00, 0xE0, 0x1E, 0xE0, 0x38, 0xE0, 0xE1, 0xE3, 0xC1, + 0xC7, 0x01, 0xDC, 0x01, 0xF0, 0x03, 0xE0, 0x03, 0x80, 0x0F, 0x80, 0x3F, + 0x00, 0x77, 0x01, 0xC7, 0x07, 0x07, 0x1E, 0x0E, 0x38, 0x0E, 0xE0, 0x0E, + 0xE0, 0x07, 0xB8, 0x03, 0x9C, 0x03, 0x87, 0x01, 0xC3, 0x80, 0xE1, 0xC0, + 0xE0, 0x70, 0x70, 0x38, 0x70, 0x0E, 0x38, 0x07, 0x18, 0x01, 0xDC, 0x00, + 0xEC, 0x00, 0x3E, 0x00, 0x1F, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0x80, + 0x01, 0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x03, 0xE0, 0x03, 0xE0, 0x01, 0xE0, + 0x00, 0x7F, 0xFD, 0xFF, 0xF0, 0x03, 0x80, 0x1E, 0x00, 0xF0, 0x03, 0x80, + 0x1C, 0x00, 0xF0, 0x07, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3C, 0x01, + 0xE0, 0x07, 0x00, 0x3F, 0xFF, 0xFF, 0xFC, 0x01, 0xC0, 0xF0, 0x70, 0x1C, + 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x1C, 0x1F, + 0x0F, 0x03, 0xE0, 0x3C, 0x07, 0x00, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, + 0x38, 0x0E, 0x03, 0x80, 0x70, 0x1F, 0x03, 0xC0, 0x30, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x3C, 0x03, 0x80, 0xE0, 0x1C, 0x07, 0x01, + 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x0E, 0x03, 0xE0, 0x3C, 0x1F, + 0x0F, 0x03, 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, + 0x03, 0x83, 0xE0, 0xF0, 0x30, 0x00, 0x3E, 0x00, 0x3F, 0x80, 0xF9, 0xF0, + 0xF8, 0x3E, 0xEC, 0x0F, 0xF0, 0x01, 0xE0 }; + +const GFXglyph RobotoMono_Regular16pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 19, 0, 0 }, // 0x20 ' ' + { 1, 4, 22, 19, 7, -21 }, // 0x21 '!' + { 12, 8, 7, 19, 5, -22 }, // 0x22 '"' + { 19, 17, 22, 19, 1, -21 }, // 0x23 '#' + { 66, 15, 29, 19, 2, -25 }, // 0x24 '$' + { 121, 17, 22, 19, 1, -21 }, // 0x25 '%' + { 168, 16, 22, 19, 2, -21 }, // 0x26 '&' + { 212, 3, 7, 19, 7, -22 }, // 0x27 ''' + { 215, 8, 32, 19, 5, -24 }, // 0x28 '(' + { 247, 8, 32, 19, 5, -24 }, // 0x29 ')' + { 279, 15, 15, 19, 2, -18 }, // 0x2A '*' + { 308, 15, 16, 19, 2, -17 }, // 0x2B '+' + { 338, 5, 9, 19, 5, -2 }, // 0x2C ',' + { 344, 12, 2, 19, 3, -10 }, // 0x2D '-' + { 347, 4, 4, 19, 8, -3 }, // 0x2E '.' + { 349, 12, 24, 19, 4, -21 }, // 0x2F '/' + { 385, 14, 22, 19, 2, -21 }, // 0x30 '0' + { 424, 9, 22, 19, 3, -21 }, // 0x31 '1' + { 449, 15, 22, 19, 1, -21 }, // 0x32 '2' + { 491, 14, 22, 19, 1, -21 }, // 0x33 '3' + { 530, 16, 22, 19, 1, -21 }, // 0x34 '4' + { 574, 14, 22, 19, 3, -21 }, // 0x35 '5' + { 613, 14, 22, 19, 2, -21 }, // 0x36 '6' + { 652, 15, 22, 19, 2, -21 }, // 0x37 '7' + { 694, 14, 22, 19, 3, -21 }, // 0x38 '8' + { 733, 14, 22, 19, 2, -21 }, // 0x39 '9' + { 772, 5, 17, 19, 8, -16 }, // 0x3A ':' + { 783, 6, 23, 19, 7, -16 }, // 0x3B ';' + { 801, 12, 14, 19, 3, -16 }, // 0x3C '<' + { 822, 13, 9, 19, 3, -14 }, // 0x3D '=' + { 837, 13, 14, 19, 3, -16 }, // 0x3E '>' + { 860, 13, 22, 19, 3, -21 }, // 0x3F '?' + { 896, 17, 22, 19, 1, -21 }, // 0x40 '@' + { 943, 17, 22, 19, 1, -21 }, // 0x41 'A' + { 990, 14, 22, 19, 3, -21 }, // 0x42 'B' + { 1029, 15, 22, 19, 2, -21 }, // 0x43 'C' + { 1071, 15, 22, 19, 2, -21 }, // 0x44 'D' + { 1113, 13, 22, 19, 3, -21 }, // 0x45 'E' + { 1149, 13, 22, 19, 3, -21 }, // 0x46 'F' + { 1185, 15, 22, 19, 2, -21 }, // 0x47 'G' + { 1227, 14, 22, 19, 2, -21 }, // 0x48 'H' + { 1266, 13, 22, 19, 3, -21 }, // 0x49 'I' + { 1302, 15, 22, 19, 1, -21 }, // 0x4A 'J' + { 1344, 15, 22, 19, 3, -21 }, // 0x4B 'K' + { 1386, 14, 22, 19, 3, -21 }, // 0x4C 'L' + { 1425, 15, 22, 19, 2, -21 }, // 0x4D 'M' + { 1467, 14, 22, 19, 2, -21 }, // 0x4E 'N' + { 1506, 15, 22, 19, 2, -21 }, // 0x4F 'O' + { 1548, 14, 22, 19, 3, -21 }, // 0x50 'P' + { 1587, 17, 26, 19, 1, -21 }, // 0x51 'Q' + { 1643, 14, 22, 19, 3, -21 }, // 0x52 'R' + { 1682, 15, 22, 19, 2, -21 }, // 0x53 'S' + { 1724, 17, 22, 19, 1, -21 }, // 0x54 'T' + { 1771, 15, 22, 19, 2, -21 }, // 0x55 'U' + { 1813, 16, 22, 19, 1, -21 }, // 0x56 'V' + { 1857, 17, 22, 19, 1, -21 }, // 0x57 'W' + { 1904, 17, 22, 19, 1, -21 }, // 0x58 'X' + { 1951, 16, 22, 19, 1, -21 }, // 0x59 'Y' + { 1995, 14, 22, 19, 2, -21 }, // 0x5A 'Z' + { 2034, 6, 30, 19, 6, -24 }, // 0x5B '[' + { 2057, 12, 24, 19, 3, -21 }, // 0x5C '\' + { 2093, 6, 30, 19, 6, -24 }, // 0x5D ']' + { 2116, 12, 12, 19, 3, -21 }, // 0x5E '^' + { 2134, 14, 2, 19, 2, 1 }, // 0x5F '_' + { 2138, 6, 4, 19, 6, -22 }, // 0x60 '`' + { 2141, 14, 17, 19, 2, -16 }, // 0x61 'a' + { 2171, 14, 23, 19, 3, -22 }, // 0x62 'b' + { 2212, 14, 17, 19, 2, -16 }, // 0x63 'c' + { 2242, 14, 23, 19, 2, -22 }, // 0x64 'd' + { 2283, 15, 17, 19, 2, -16 }, // 0x65 'e' + { 2315, 15, 24, 19, 2, -23 }, // 0x66 'f' + { 2360, 14, 23, 19, 2, -16 }, // 0x67 'g' + { 2401, 13, 23, 19, 3, -22 }, // 0x68 'h' + { 2439, 14, 22, 19, 3, -21 }, // 0x69 'i' + { 2478, 10, 28, 19, 3, -21 }, // 0x6A 'j' + { 2513, 14, 23, 19, 3, -22 }, // 0x6B 'k' + { 2554, 14, 23, 19, 3, -22 }, // 0x6C 'l' + { 2595, 16, 17, 19, 1, -16 }, // 0x6D 'm' + { 2629, 13, 17, 19, 3, -16 }, // 0x6E 'n' + { 2657, 15, 17, 19, 2, -16 }, // 0x6F 'o' + { 2689, 13, 23, 19, 3, -16 }, // 0x70 'p' + { 2727, 14, 23, 19, 2, -16 }, // 0x71 'q' + { 2768, 11, 17, 19, 5, -16 }, // 0x72 'r' + { 2792, 13, 17, 19, 3, -16 }, // 0x73 's' + { 2820, 14, 21, 19, 2, -20 }, // 0x74 't' + { 2857, 13, 17, 19, 3, -16 }, // 0x75 'u' + { 2885, 16, 17, 19, 1, -16 }, // 0x76 'v' + { 2919, 17, 17, 19, 1, -16 }, // 0x77 'w' + { 2956, 15, 17, 19, 2, -16 }, // 0x78 'x' + { 2988, 17, 23, 19, 1, -16 }, // 0x79 'y' + { 3037, 14, 17, 19, 2, -16 }, // 0x7A 'z' + { 3067, 10, 30, 19, 5, -23 }, // 0x7B '{' + { 3105, 2, 28, 19, 8, -21 }, // 0x7C '|' + { 3112, 10, 30, 19, 5, -23 }, // 0x7D '}' + { 3150, 17, 6, 19, 1, -11 } }; // 0x7E '~' + +const GFXfont RobotoMono_Regular16pt7b PROGMEM = { + (uint8_t *)RobotoMono_Regular16pt7bBitmaps, + (GFXglyph *)RobotoMono_Regular16pt7bGlyphs, + 0x20, 0x7E, 41 }; + +// Approx. 3835 bytes +#endif // ifndef FONTS_ROBOTOMONO_REGULAR16PT7B_H diff --git a/src/src/Static/Fonts/RobotoMono_Regular8pt7b.h b/src/src/Static/Fonts/RobotoMono_Regular8pt7b.h new file mode 100644 index 000000000..289e09500 --- /dev/null +++ b/src/src/Static/Fonts/RobotoMono_Regular8pt7b.h @@ -0,0 +1,183 @@ +#ifndef FONTS_ROBOTOMONO_REGULAR8PT7B_H +#define FONTS_ROBOTOMONO_REGULAR8PT7B_H +const uint8_t RobotoMono_Regular8pt7bBitmaps[] PROGMEM = { + 0x00, 0xAA, 0xAA, 0x03, 0x99, 0x99, 0x09, 0x04, 0x86, 0x4F, 0xF1, 0x20, + 0x90, 0x49, 0xFF, 0x26, 0x12, 0x09, 0x04, 0x80, 0x18, 0x18, 0x3C, 0x66, + 0x42, 0x40, 0x60, 0x3C, 0x06, 0x02, 0xC3, 0x42, 0x7E, 0x18, 0x18, 0x70, + 0x68, 0x26, 0xDA, 0x47, 0x40, 0x20, 0x20, 0x17, 0x14, 0x9A, 0x41, 0x20, + 0x70, 0x38, 0x6C, 0x44, 0x44, 0x68, 0x30, 0x70, 0xD9, 0x8F, 0x86, 0xC6, + 0x7B, 0xF0, 0x32, 0x44, 0xC8, 0x88, 0x88, 0x8C, 0xC4, 0x62, 0x10, 0xC3, + 0x08, 0x61, 0x08, 0x63, 0x18, 0xC4, 0x21, 0x18, 0x88, 0x80, 0x18, 0x18, + 0x99, 0xFF, 0x18, 0x3C, 0x64, 0x26, 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, + 0x18, 0x18, 0x18, 0xFE, 0x80, 0xFC, 0xF0, 0x04, 0x20, 0x86, 0x10, 0x43, + 0x08, 0x21, 0x84, 0x10, 0x80, 0x3C, 0x66, 0xC2, 0xC2, 0xC6, 0xCB, 0xF3, + 0xE2, 0xC2, 0xC2, 0x66, 0x3C, 0x1F, 0x91, 0x11, 0x11, 0x11, 0x11, 0x79, + 0x9A, 0x1C, 0x30, 0x60, 0x82, 0x0C, 0x30, 0xC3, 0x07, 0xF0, 0x79, 0x8A, + 0x18, 0x30, 0x47, 0x03, 0x03, 0x07, 0x0F, 0x13, 0xC0, 0x0C, 0x0C, 0x1C, + 0x14, 0x24, 0x64, 0x44, 0x84, 0xFF, 0x04, 0x04, 0x04, 0x7E, 0x60, 0x60, + 0x40, 0x7C, 0x66, 0x02, 0x03, 0x83, 0x42, 0x66, 0x3C, 0x1C, 0x61, 0x82, + 0x0F, 0xDC, 0xF0, 0xE1, 0xC3, 0x85, 0x99, 0xE0, 0xFF, 0x02, 0x06, 0x04, + 0x04, 0x0C, 0x08, 0x18, 0x10, 0x30, 0x20, 0x60, 0x3C, 0x66, 0x42, 0x42, + 0x66, 0x3C, 0x66, 0x42, 0xC3, 0xC3, 0x66, 0x3C, 0x3C, 0xCB, 0x1E, 0x1C, + 0x38, 0x51, 0xBD, 0x02, 0x0C, 0x31, 0xC0, 0xF8, 0x00, 0x07, 0xC0, 0xF0, + 0x03, 0xFA, 0x02, 0x1C, 0xE6, 0x07, 0x03, 0x81, 0x80, 0xFE, 0x00, 0x07, + 0xF0, 0x81, 0xE0, 0x70, 0x30, 0xEF, 0x30, 0x00, 0x3C, 0xCF, 0x08, 0x10, + 0x60, 0x83, 0x0C, 0x10, 0x00, 0x00, 0xC0, 0x1E, 0x19, 0x9B, 0xAB, 0x55, + 0x2A, 0x95, 0x4A, 0xA9, 0x5B, 0x20, 0x08, 0x83, 0xC0, 0x18, 0x18, 0x18, + 0x3C, 0x2C, 0x24, 0x64, 0x66, 0x7E, 0xC2, 0xC3, 0x81, 0xFC, 0xC6, 0xC2, + 0xC2, 0xC6, 0xFC, 0xC6, 0xC3, 0xC3, 0xC3, 0xC6, 0xFC, 0x3C, 0x66, 0xC2, + 0x83, 0x80, 0x80, 0x80, 0x80, 0x83, 0xC2, 0x66, 0x3C, 0xF8, 0xCE, 0xC2, + 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC2, 0xCE, 0xF8, 0xFF, 0x83, 0x06, + 0x0C, 0x1F, 0xF0, 0x60, 0xC1, 0x83, 0x07, 0xF0, 0xFF, 0x83, 0x06, 0x0C, + 0x18, 0x3F, 0xE0, 0xC1, 0x83, 0x06, 0x00, 0x3C, 0x66, 0xC3, 0x83, 0x80, + 0x80, 0x8F, 0x83, 0xC3, 0xC3, 0x63, 0x3C, 0x83, 0x83, 0x83, 0x83, 0x83, + 0xFF, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, 0xFE, 0x30, 0x60, 0xC1, 0x83, + 0x06, 0x0C, 0x18, 0x30, 0x67, 0xF0, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, + 0x81, 0x83, 0x0F, 0x11, 0xC0, 0xC3, 0xC6, 0xCC, 0xC8, 0xD8, 0xF0, 0xF8, + 0xC8, 0xCC, 0xC6, 0xC2, 0xC3, 0x81, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, + 0x81, 0x02, 0x07, 0xF0, 0xC3, 0xC7, 0xE7, 0xA7, 0xAF, 0xFB, 0xDB, 0xDB, + 0xD3, 0xC3, 0xC3, 0xC3, 0xC3, 0x87, 0x8F, 0x1F, 0x3A, 0x76, 0xE5, 0xCF, + 0x8F, 0x1E, 0x10, 0x3C, 0x66, 0xC2, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0xC2, 0x66, 0x3C, 0xFC, 0xC6, 0xC3, 0xC3, 0xC3, 0xC2, 0xFE, 0xC0, 0xC0, + 0xC0, 0xC0, 0xC0, 0x3C, 0x66, 0xC2, 0x83, 0x83, 0x83, 0x83, 0x83, 0x83, + 0xC2, 0x66, 0x3C, 0x03, 0x01, 0xFC, 0xC6, 0xC2, 0xC3, 0xC3, 0xC6, 0xFC, + 0xCC, 0xC4, 0xC6, 0xC2, 0xC3, 0x3C, 0x66, 0xC3, 0xC0, 0x60, 0x78, 0x1E, + 0x03, 0x83, 0xC3, 0x66, 0x3C, 0xFF, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x83, 0x83, 0x83, 0x83, 0xC3, 0xC3, 0xC3, + 0xC3, 0xC2, 0xC2, 0x66, 0x3C, 0x83, 0xC3, 0xC2, 0x46, 0x46, 0x64, 0x24, + 0x2C, 0x38, 0x38, 0x18, 0x18, 0x99, 0x99, 0x99, 0x99, 0x9B, 0xBF, 0xEE, + 0xE6, 0x66, 0x66, 0x66, 0x66, 0xC3, 0x42, 0x66, 0x2C, 0x3C, 0x18, 0x18, + 0x3C, 0x24, 0x66, 0x42, 0xC3, 0xC1, 0xB0, 0x88, 0xC6, 0x41, 0x60, 0xE0, + 0x30, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0xFE, 0x0C, 0x10, 0x60, 0x83, + 0x0C, 0x10, 0x60, 0x83, 0x07, 0xF0, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB7, + 0x83, 0x04, 0x10, 0x60, 0x82, 0x04, 0x10, 0x60, 0x82, 0x0C, 0xE4, 0x92, + 0x49, 0x24, 0x92, 0x4F, 0x20, 0xC7, 0x16, 0x4B, 0x30, 0xFE, 0xC4, 0x3D, + 0x8C, 0x09, 0xF6, 0x38, 0x70, 0xA7, 0x7A, 0xC0, 0xC0, 0xC0, 0xFC, 0xE6, + 0xC2, 0xC2, 0xC3, 0xC2, 0xC2, 0xE6, 0xFC, 0x3C, 0xCF, 0x0E, 0x0C, 0x18, + 0x30, 0xB3, 0x3C, 0x02, 0x04, 0x09, 0xD6, 0x78, 0x70, 0xE1, 0xC3, 0x85, + 0x99, 0xD0, 0x3C, 0x66, 0xC2, 0xC2, 0xFF, 0xC0, 0xC0, 0x62, 0x3C, 0x0F, + 0x19, 0x10, 0x10, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x3A, 0xCF, 0x0E, 0x1C, 0x38, 0x70, 0xB3, 0x3A, 0x05, 0x19, 0xE0, 0xC1, + 0x83, 0x06, 0xEE, 0x78, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x10, 0x30, 0x00, + 0x07, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC7, 0xF0, 0x18, 0x01, 0xF1, + 0x8C, 0x63, 0x18, 0xC6, 0x31, 0x9B, 0x80, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, + 0xD8, 0xF0, 0xF0, 0xD8, 0xCC, 0xC6, 0xC3, 0xF0, 0x60, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x60, 0xC7, 0xF0, 0xF6, 0x9B, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0xDD, 0xCF, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC2, 0x3C, + 0x66, 0xC2, 0x83, 0x83, 0x83, 0xC2, 0x66, 0x3C, 0xFC, 0xE6, 0xC2, 0xC2, + 0xC3, 0xC2, 0xC2, 0xE6, 0xFC, 0xC0, 0xC0, 0xC0, 0x3A, 0xCF, 0x0E, 0x1C, + 0x38, 0x70, 0xB3, 0x3A, 0x04, 0x08, 0x10, 0xBE, 0x21, 0x08, 0x42, 0x10, + 0x80, 0x3C, 0xCD, 0x0B, 0x03, 0xC0, 0xF0, 0xB3, 0x3C, 0x30, 0x63, 0xF9, + 0x83, 0x06, 0x0C, 0x18, 0x30, 0x20, 0x78, 0xC3, 0x87, 0x0E, 0x1C, 0x38, + 0x50, 0xB3, 0x3A, 0x83, 0xC2, 0x46, 0x44, 0x24, 0x2C, 0x38, 0x18, 0x18, + 0xC8, 0xA6, 0x53, 0x29, 0xB5, 0x53, 0x98, 0xCC, 0x66, 0x23, 0x00, 0xC3, + 0x66, 0x2C, 0x38, 0x18, 0x38, 0x24, 0x66, 0xC3, 0x83, 0xC2, 0x46, 0x66, + 0x24, 0x2C, 0x38, 0x18, 0x10, 0x30, 0x20, 0xE0, 0xFE, 0x0C, 0x30, 0x41, + 0x86, 0x18, 0x20, 0xFE, 0x19, 0x88, 0x42, 0x10, 0x8C, 0xC3, 0x08, 0x42, + 0x10, 0xC3, 0xFF, 0xFE, 0x86, 0x10, 0xC6, 0x31, 0x84, 0x19, 0x18, 0xC6, + 0x31, 0x18, 0x70, 0xA6, 0x61, 0xC0 }; + +const GFXglyph RobotoMono_Regular8pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 10, 0, 0 }, // 0x20 ' ' + { 1, 2, 12, 10, 4, -11 }, // 0x21 '!' + { 4, 4, 4, 10, 3, -11 }, // 0x22 '"' + { 6, 9, 12, 10, 0, -11 }, // 0x23 '#' + { 20, 8, 15, 10, 1, -12 }, // 0x24 '$' + { 35, 9, 12, 10, 0, -11 }, // 0x25 '%' + { 49, 8, 12, 10, 1, -11 }, // 0x26 '&' + { 61, 1, 4, 10, 4, -11 }, // 0x27 ''' + { 62, 4, 17, 10, 3, -12 }, // 0x28 '(' + { 71, 5, 17, 10, 2, -12 }, // 0x29 ')' + { 82, 8, 8, 10, 1, -9 }, // 0x2A '*' + { 90, 8, 9, 10, 1, -9 }, // 0x2B '+' + { 99, 2, 5, 10, 3, -1 }, // 0x2C ',' + { 101, 6, 1, 10, 2, -5 }, // 0x2D '-' + { 102, 2, 2, 10, 4, -1 }, // 0x2E '.' + { 103, 6, 13, 10, 2, -11 }, // 0x2F '/' + { 113, 8, 12, 10, 1, -11 }, // 0x30 '0' + { 125, 4, 12, 10, 2, -11 }, // 0x31 '1' + { 131, 7, 12, 10, 1, -11 }, // 0x32 '2' + { 142, 7, 12, 10, 1, -11 }, // 0x33 '3' + { 153, 8, 12, 10, 1, -11 }, // 0x34 '4' + { 165, 8, 12, 10, 1, -11 }, // 0x35 '5' + { 177, 7, 12, 10, 1, -11 }, // 0x36 '6' + { 188, 8, 12, 10, 1, -11 }, // 0x37 '7' + { 200, 8, 12, 10, 1, -11 }, // 0x38 '8' + { 212, 7, 12, 10, 1, -11 }, // 0x39 '9' + { 223, 3, 9, 10, 4, -8 }, // 0x3A ':' + { 227, 2, 12, 10, 4, -8 }, // 0x3B ';' + { 230, 7, 7, 10, 1, -8 }, // 0x3C '<' + { 237, 7, 4, 10, 1, -6 }, // 0x3D '=' + { 241, 7, 7, 10, 1, -8 }, // 0x3E '>' + { 248, 7, 12, 10, 1, -11 }, // 0x3F '?' + { 259, 9, 12, 10, 0, -11 }, // 0x40 '@' + { 273, 8, 12, 10, 1, -11 }, // 0x41 'A' + { 285, 8, 12, 10, 1, -11 }, // 0x42 'B' + { 297, 8, 12, 10, 1, -11 }, // 0x43 'C' + { 309, 8, 12, 10, 1, -11 }, // 0x44 'D' + { 321, 7, 12, 10, 1, -11 }, // 0x45 'E' + { 332, 7, 12, 10, 1, -11 }, // 0x46 'F' + { 343, 8, 12, 10, 1, -11 }, // 0x47 'G' + { 355, 8, 12, 10, 1, -11 }, // 0x48 'H' + { 367, 7, 12, 10, 1, -11 }, // 0x49 'I' + { 378, 7, 12, 10, 1, -11 }, // 0x4A 'J' + { 389, 8, 12, 10, 1, -11 }, // 0x4B 'K' + { 401, 7, 12, 10, 2, -11 }, // 0x4C 'L' + { 412, 8, 12, 10, 1, -11 }, // 0x4D 'M' + { 424, 7, 12, 10, 1, -11 }, // 0x4E 'N' + { 435, 8, 12, 10, 1, -11 }, // 0x4F 'O' + { 447, 8, 12, 10, 1, -11 }, // 0x50 'P' + { 459, 8, 14, 10, 1, -11 }, // 0x51 'Q' + { 473, 8, 12, 10, 1, -11 }, // 0x52 'R' + { 485, 8, 12, 10, 1, -11 }, // 0x53 'S' + { 497, 8, 12, 10, 1, -11 }, // 0x54 'T' + { 509, 8, 12, 10, 1, -11 }, // 0x55 'U' + { 521, 8, 12, 10, 1, -11 }, // 0x56 'V' + { 533, 8, 12, 10, 1, -11 }, // 0x57 'W' + { 545, 8, 12, 10, 1, -11 }, // 0x58 'X' + { 557, 9, 12, 10, 0, -11 }, // 0x59 'Y' + { 571, 7, 12, 10, 1, -11 }, // 0x5A 'Z' + { 582, 3, 16, 10, 3, -13 }, // 0x5B '[' + { 588, 6, 13, 10, 2, -11 }, // 0x5C '\' + { 598, 3, 16, 10, 3, -13 }, // 0x5D ']' + { 604, 6, 6, 10, 2, -11 }, // 0x5E '^' + { 609, 7, 1, 10, 1, 1 }, // 0x5F '_' + { 610, 3, 2, 10, 3, -11 }, // 0x60 '`' + { 611, 7, 9, 10, 1, -8 }, // 0x61 'a' + { 619, 8, 12, 10, 1, -11 }, // 0x62 'b' + { 631, 7, 9, 10, 1, -8 }, // 0x63 'c' + { 639, 7, 12, 10, 1, -11 }, // 0x64 'd' + { 650, 8, 9, 10, 1, -8 }, // 0x65 'e' + { 659, 8, 13, 10, 1, -12 }, // 0x66 'f' + { 672, 7, 12, 10, 1, -8 }, // 0x67 'g' + { 683, 7, 12, 10, 1, -11 }, // 0x68 'h' + { 694, 7, 12, 10, 2, -11 }, // 0x69 'i' + { 705, 5, 15, 10, 2, -11 }, // 0x6A 'j' + { 715, 8, 12, 10, 1, -11 }, // 0x6B 'k' + { 727, 7, 12, 10, 2, -11 }, // 0x6C 'l' + { 738, 8, 9, 10, 1, -8 }, // 0x6D 'm' + { 747, 7, 9, 10, 1, -8 }, // 0x6E 'n' + { 755, 8, 9, 10, 1, -8 }, // 0x6F 'o' + { 764, 8, 12, 10, 1, -8 }, // 0x70 'p' + { 776, 7, 12, 10, 1, -8 }, // 0x71 'q' + { 787, 5, 9, 10, 3, -8 }, // 0x72 'r' + { 793, 7, 9, 10, 1, -8 }, // 0x73 's' + { 801, 7, 11, 10, 1, -10 }, // 0x74 't' + { 811, 7, 9, 10, 1, -8 }, // 0x75 'u' + { 819, 8, 9, 10, 1, -8 }, // 0x76 'v' + { 828, 9, 9, 10, 0, -8 }, // 0x77 'w' + { 839, 8, 9, 10, 1, -8 }, // 0x78 'x' + { 848, 8, 12, 10, 1, -8 }, // 0x79 'y' + { 860, 7, 9, 10, 1, -8 }, // 0x7A 'z' + { 868, 5, 16, 10, 3, -12 }, // 0x7B '{' + { 878, 1, 15, 10, 4, -11 }, // 0x7C '|' + { 880, 5, 16, 10, 3, -12 }, // 0x7D '}' + { 890, 9, 3, 10, 0, -6 } }; // 0x7E '~' + +const GFXfont RobotoMono_Regular8pt7b PROGMEM = { + (uint8_t *)RobotoMono_Regular8pt7bBitmaps, + (GFXglyph *)RobotoMono_Regular8pt7bGlyphs, + 0x20, 0x7E, 21 }; + +// Approx. 1566 bytes +#endif // ifndef FONTS_ROBOTOMONO_REGULAR8PT7B_H diff --git a/src/src/Static/Fonts/Roboto_Regular12pt7b.h b/src/src/Static/Fonts/Roboto_Regular12pt7b.h new file mode 100644 index 000000000..edba45710 --- /dev/null +++ b/src/src/Static/Fonts/Roboto_Regular12pt7b.h @@ -0,0 +1,268 @@ +#ifndef FONTS_ROBOTO_REGULAR12PT7B_H +#define FONTS_ROBOTO_REGULAR12PT7B_H +const uint8_t Roboto_Regular12pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFC, 0x03, 0xC0, 0xCF, 0x3C, 0xF3, 0xCA, 0x20, 0x06, + 0x30, 0x23, 0x01, 0x18, 0x18, 0xC0, 0xC6, 0x3F, 0xFD, 0xFF, 0xE1, 0x18, + 0x18, 0xC0, 0xC6, 0x06, 0x31, 0xFF, 0xEF, 0xFF, 0x18, 0xC0, 0xC6, 0x06, + 0x30, 0x33, 0x00, 0x06, 0x00, 0xC0, 0x18, 0x0F, 0x83, 0xFC, 0xE1, 0x98, + 0x3B, 0x03, 0x60, 0x6E, 0x00, 0xF0, 0x0F, 0xC0, 0x3C, 0x01, 0xC0, 0x1F, + 0x03, 0x60, 0x6E, 0x1C, 0xFF, 0x0F, 0xC0, 0x60, 0x0C, 0x00, 0x3C, 0x00, + 0x66, 0x00, 0xC6, 0x10, 0xC2, 0x38, 0xC2, 0x30, 0xC6, 0x60, 0x66, 0x40, + 0x3C, 0xC0, 0x01, 0x80, 0x01, 0x3C, 0x03, 0x66, 0x06, 0x42, 0x06, 0xC3, + 0x0C, 0xC3, 0x08, 0x42, 0x18, 0x66, 0x00, 0x3C, 0x1F, 0x01, 0xFC, 0x1C, + 0x70, 0xE1, 0x87, 0x1C, 0x18, 0xC0, 0xFC, 0x03, 0xC0, 0x3C, 0x03, 0xF0, + 0xF9, 0xC7, 0x87, 0x3C, 0x1F, 0x60, 0x7B, 0x83, 0x8F, 0xFE, 0x3F, 0x38, + 0xFF, 0xE0, 0x04, 0x71, 0x8C, 0x61, 0x8E, 0x30, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0x30, 0xC3, 0x86, 0x18, 0x30, 0x61, 0xC1, 0x83, 0x06, 0x0C, 0x38, + 0x61, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x71, 0x86, 0x31, + 0x8E, 0x20, 0x0C, 0x03, 0x00, 0xC1, 0xB3, 0xFF, 0xC7, 0x81, 0xE0, 0xEC, + 0x33, 0x18, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0x06, 0x0F, 0xFF, + 0xFF, 0xF0, 0x60, 0x06, 0x00, 0x60, 0x06, 0x00, 0x60, 0xFF, 0xED, 0x00, + 0xFF, 0xF0, 0xF0, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x20, 0x30, 0x18, 0x18, + 0x0C, 0x06, 0x06, 0x03, 0x03, 0x01, 0x80, 0xC0, 0xC0, 0x60, 0x60, 0x00, + 0x1F, 0x07, 0xF9, 0xC7, 0x30, 0x7E, 0x07, 0xC0, 0xF8, 0x1F, 0x03, 0xE0, + 0x7C, 0x0F, 0x81, 0xF0, 0x3E, 0x06, 0xC1, 0xDC, 0x71, 0xFE, 0x1F, 0x00, + 0x1F, 0xFF, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, 0x0C, 0x30, 0xC3, + 0x0C, 0x1F, 0x07, 0xF9, 0xC7, 0x70, 0x7C, 0x06, 0x01, 0xC0, 0x30, 0x06, + 0x01, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0xFF, 0xFF, + 0xE0, 0x1F, 0x07, 0xF9, 0xC7, 0x70, 0x7E, 0x0E, 0x01, 0xC0, 0x70, 0x7C, + 0x0F, 0x80, 0x18, 0x03, 0x80, 0x3C, 0x07, 0xC1, 0xDC, 0x73, 0xFE, 0x1F, + 0x00, 0x01, 0xC0, 0x3C, 0x03, 0xC0, 0x7C, 0x0F, 0xC0, 0xDC, 0x19, 0xC3, + 0x9C, 0x31, 0xC6, 0x1C, 0xC1, 0xCF, 0xFF, 0xFF, 0xF0, 0x1C, 0x01, 0xC0, + 0x1C, 0x01, 0xC0, 0x7F, 0xDF, 0xF6, 0x01, 0x80, 0x60, 0x38, 0x0D, 0xF3, + 0xFE, 0xE1, 0xF0, 0x70, 0x0C, 0x03, 0xC0, 0xF0, 0x7E, 0x1D, 0xFE, 0x3E, + 0x00, 0x1F, 0x87, 0xF1, 0xC2, 0x70, 0x0C, 0x01, 0x80, 0x37, 0xC7, 0xFC, + 0xE1, 0xD8, 0x1B, 0x03, 0xE0, 0x7C, 0x0F, 0xC1, 0x9C, 0x73, 0xFC, 0x1F, + 0x00, 0xFF, 0xFF, 0xFC, 0x01, 0x80, 0x60, 0x1C, 0x03, 0x00, 0xC0, 0x18, + 0x06, 0x00, 0xC0, 0x38, 0x06, 0x00, 0xC0, 0x18, 0x07, 0x00, 0xE0, 0x1C, + 0x00, 0x1F, 0x07, 0xF9, 0xC7, 0x30, 0x76, 0x06, 0xC1, 0xDC, 0x31, 0xFC, + 0x3F, 0x8E, 0x19, 0x81, 0xF0, 0x3E, 0x07, 0xC0, 0xDC, 0x3B, 0xFE, 0x1F, + 0x00, 0x1F, 0x07, 0xF1, 0xC7, 0x70, 0x7C, 0x07, 0x80, 0xF0, 0x1F, 0x03, + 0x71, 0xEF, 0xFC, 0x79, 0x80, 0x30, 0x0E, 0x01, 0x90, 0x71, 0xFC, 0x7F, + 0x00, 0xF0, 0x00, 0x03, 0xC0, 0x6C, 0x00, 0x00, 0x01, 0xB6, 0xF6, 0x01, + 0x83, 0xC7, 0xCF, 0x8E, 0x07, 0x01, 0xF0, 0x3E, 0x07, 0x80, 0xC0, 0xFF, + 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFC, 0xC0, 0x3C, 0x07, 0xC0, + 0x3E, 0x03, 0xC0, 0xF0, 0xF9, 0xF0, 0xF0, 0x30, 0x00, 0x3E, 0x3F, 0xB8, + 0xF8, 0x30, 0x18, 0x0C, 0x0E, 0x06, 0x07, 0x07, 0x07, 0x03, 0x81, 0x80, + 0x00, 0x00, 0x38, 0x1C, 0x00, 0x01, 0xFC, 0x00, 0x70, 0x70, 0x0C, 0x01, + 0x81, 0x80, 0x0C, 0x30, 0x00, 0x42, 0x0F, 0x86, 0x61, 0x8C, 0x66, 0x10, + 0xC2, 0x43, 0x0C, 0x2C, 0x30, 0xC2, 0xC3, 0x0C, 0x2C, 0x60, 0x82, 0xC6, + 0x18, 0x6C, 0x71, 0x86, 0x43, 0x18, 0xC4, 0x3E, 0xFC, 0x61, 0xCF, 0x06, + 0x00, 0x00, 0x30, 0x00, 0x01, 0x80, 0x00, 0x0E, 0x0C, 0x00, 0x3F, 0x80, + 0x01, 0x80, 0x07, 0x00, 0x0F, 0x00, 0x3E, 0x00, 0x6E, 0x00, 0xCC, 0x03, + 0x98, 0x06, 0x38, 0x0C, 0x30, 0x30, 0x60, 0x60, 0xE1, 0xFF, 0xC3, 0xFF, + 0xC6, 0x01, 0x9C, 0x03, 0x30, 0x07, 0xE0, 0x06, 0xFF, 0x8F, 0xFC, 0xC0, + 0xEC, 0x06, 0xC0, 0x6C, 0x06, 0xC0, 0xEF, 0xFC, 0xFF, 0xCC, 0x06, 0xC0, + 0x7C, 0x03, 0xC0, 0x3C, 0x07, 0xC0, 0xFF, 0xFE, 0xFF, 0x80, 0x0F, 0xC0, + 0xFF, 0x0E, 0x1C, 0xE0, 0x76, 0x01, 0xF0, 0x0F, 0x80, 0x1C, 0x00, 0xE0, + 0x07, 0x00, 0x38, 0x00, 0xC0, 0x36, 0x01, 0xB8, 0x1C, 0xE1, 0xC3, 0xFC, + 0x0F, 0xC0, 0xFF, 0x07, 0xFE, 0x30, 0x39, 0x80, 0xEC, 0x03, 0x60, 0x1F, + 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0x60, + 0x3B, 0x03, 0x9F, 0xF8, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, + 0x01, 0x80, 0x30, 0x07, 0xFE, 0xFF, 0xD8, 0x03, 0x00, 0x60, 0x0C, 0x01, + 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0x60, 0x0C, + 0x01, 0x80, 0x30, 0x07, 0xFE, 0xFF, 0xD8, 0x03, 0x00, 0x60, 0x0C, 0x01, + 0x80, 0x30, 0x06, 0x00, 0xC0, 0x00, 0x0F, 0xC0, 0xFF, 0x8E, 0x1E, 0xE0, + 0x36, 0x01, 0xF0, 0x03, 0x80, 0x1C, 0x00, 0xE0, 0x07, 0x0F, 0xF8, 0x7E, + 0xC0, 0x36, 0x01, 0xB8, 0x0C, 0xE0, 0xE3, 0xFF, 0x07, 0xE0, 0xC0, 0x1E, + 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x7F, 0xFF, 0xFF, + 0xFE, 0x00, 0xF0, 0x07, 0x80, 0x3C, 0x01, 0xE0, 0x0F, 0x00, 0x78, 0x03, + 0xC0, 0x18, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x0C, 0x03, + 0xC0, 0xF0, 0x3E, 0x1D, 0xFE, 0x3F, 0x00, 0xC0, 0x3E, 0x03, 0xB0, 0x39, + 0x83, 0x8C, 0x38, 0x63, 0x83, 0x18, 0x1F, 0xC0, 0xFE, 0x06, 0x38, 0x30, + 0xC1, 0x87, 0x0C, 0x1C, 0x60, 0x73, 0x01, 0x98, 0x0E, 0xC0, 0x38, 0xC0, + 0x18, 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x00, 0xC0, 0x18, + 0x03, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x07, 0xFF, 0xFF, 0xE0, 0xE0, + 0x03, 0xF8, 0x03, 0xFC, 0x01, 0xFE, 0x00, 0xFD, 0x80, 0xDE, 0xC0, 0x6F, + 0x70, 0x77, 0x98, 0x33, 0xCC, 0x19, 0xE3, 0x18, 0xF1, 0x8C, 0x78, 0x6E, + 0x3C, 0x36, 0x1E, 0x1B, 0x0F, 0x07, 0x07, 0x83, 0x83, 0xC0, 0xC1, 0x80, + 0xE0, 0x1F, 0x00, 0xFC, 0x07, 0xF0, 0x3D, 0x81, 0xEE, 0x0F, 0x38, 0x78, + 0xC3, 0xC7, 0x1E, 0x18, 0xF0, 0x67, 0x83, 0xBC, 0x0D, 0xE0, 0x3F, 0x01, + 0xF8, 0x07, 0xC0, 0x38, 0x0F, 0xC0, 0x7F, 0xC3, 0x87, 0x9C, 0x06, 0x60, + 0x1F, 0x80, 0x3E, 0x00, 0xF8, 0x03, 0xE0, 0x0F, 0x80, 0x3E, 0x00, 0xF8, + 0x03, 0x60, 0x1D, 0xC0, 0x63, 0x87, 0x87, 0xFC, 0x0F, 0xC0, 0xFF, 0x8F, + 0xFE, 0xC0, 0x7C, 0x03, 0xC0, 0x3C, 0x03, 0xC0, 0x3C, 0x07, 0xFF, 0xEF, + 0xF8, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x0C, 0x00, 0xC0, 0x00, + 0x0F, 0xC0, 0x3F, 0xE0, 0xE1, 0xE3, 0x80, 0xC6, 0x01, 0xDC, 0x01, 0xB8, + 0x03, 0x70, 0x06, 0xE0, 0x0D, 0xC0, 0x1B, 0x80, 0x37, 0x00, 0x66, 0x01, + 0xCE, 0x03, 0x0E, 0x1C, 0x0F, 0xF8, 0x0F, 0xF8, 0x00, 0x38, 0x00, 0x38, + 0xFF, 0x87, 0xFF, 0x30, 0x3D, 0x80, 0xEC, 0x03, 0x60, 0x1B, 0x01, 0xD8, + 0x1C, 0xFF, 0xC7, 0xFF, 0x30, 0x39, 0x80, 0xEC, 0x03, 0x60, 0x1B, 0x00, + 0xD8, 0x06, 0xC0, 0x38, 0x0F, 0x81, 0xFF, 0x1C, 0x1C, 0xC0, 0x66, 0x03, + 0xB0, 0x01, 0xC0, 0x07, 0xC0, 0x1F, 0xC0, 0x1F, 0x00, 0x1C, 0x00, 0x7E, + 0x03, 0xF0, 0x1D, 0xC1, 0xC7, 0xFC, 0x0F, 0xC0, 0xFF, 0xFF, 0xFF, 0xF0, + 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, + 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x00, 0xC0, + 0x03, 0x00, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0xE0, 0x1F, + 0x00, 0xF8, 0x07, 0xC0, 0x3E, 0x01, 0xF0, 0x0F, 0x80, 0x7C, 0x03, 0x70, + 0x19, 0xC3, 0xCF, 0xFC, 0x1F, 0x80, 0xE0, 0x0E, 0xC0, 0x19, 0xC0, 0x31, + 0x80, 0xE3, 0x01, 0x87, 0x03, 0x06, 0x0E, 0x0C, 0x18, 0x1C, 0x70, 0x18, + 0xC0, 0x31, 0x80, 0x37, 0x00, 0x6C, 0x00, 0xD8, 0x00, 0xF0, 0x01, 0xC0, + 0x03, 0x80, 0xC0, 0xE0, 0x78, 0x1C, 0x0F, 0x83, 0x81, 0xF0, 0x78, 0x76, + 0x1B, 0x0C, 0xC3, 0x61, 0x98, 0x6C, 0x33, 0x9C, 0xCE, 0x33, 0x19, 0x86, + 0x63, 0x30, 0xCC, 0x76, 0x1F, 0x06, 0xC1, 0xE0, 0xF0, 0x3C, 0x1E, 0x07, + 0x81, 0xC0, 0xE0, 0x38, 0x0C, 0x06, 0x00, 0xE0, 0x39, 0xC0, 0xC7, 0x07, + 0x0E, 0x38, 0x18, 0xE0, 0x77, 0x00, 0xF8, 0x01, 0xE0, 0x07, 0x00, 0x1E, + 0x00, 0xF8, 0x07, 0x70, 0x18, 0xE0, 0xE1, 0x87, 0x07, 0x18, 0x0E, 0xE0, + 0x3C, 0xE0, 0x0D, 0xC0, 0x73, 0x03, 0x8E, 0x0E, 0x18, 0x70, 0x71, 0x80, + 0xCE, 0x03, 0xB0, 0x07, 0xC0, 0x1E, 0x00, 0x38, 0x00, 0xC0, 0x03, 0x00, + 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x60, + 0x0E, 0x01, 0xC0, 0x18, 0x03, 0x80, 0x70, 0x06, 0x00, 0xE0, 0x1C, 0x01, + 0x80, 0x30, 0x07, 0x00, 0x60, 0x0F, 0xFF, 0xFF, 0xF0, 0xFF, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFF, 0xE0, 0x18, 0x07, + 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x70, 0x0C, 0x03, 0x00, 0x60, 0x18, + 0x07, 0x00, 0xC0, 0x30, 0x06, 0x01, 0x80, 0x70, 0xFF, 0xCE, 0x73, 0x9C, + 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F, 0xFF, 0x18, + 0x18, 0x3C, 0x3C, 0x66, 0x66, 0x66, 0xC3, 0xC3, 0xFF, 0xFF, 0xFC, 0xE3, + 0x8E, 0x1F, 0x07, 0xF9, 0xC7, 0x00, 0x60, 0x0E, 0x3F, 0xDF, 0xFB, 0x87, + 0xE0, 0xFC, 0x1F, 0x87, 0xBF, 0xF3, 0xEE, 0xC0, 0x18, 0x03, 0x00, 0x60, + 0x0C, 0x01, 0xBE, 0x3F, 0xE7, 0x0E, 0xC1, 0xD8, 0x1B, 0x03, 0x60, 0x6C, + 0x0F, 0x81, 0xB0, 0x37, 0x0E, 0xFF, 0x9B, 0xE0, 0x1F, 0x07, 0xF9, 0xC3, + 0x30, 0x7E, 0x07, 0xC0, 0x30, 0x06, 0x00, 0xE0, 0x0C, 0x0D, 0xC3, 0x1F, + 0xE1, 0xF0, 0x00, 0x60, 0x0C, 0x01, 0x80, 0x30, 0x06, 0x3C, 0xCF, 0xDB, + 0x8F, 0x60, 0xFC, 0x0F, 0x81, 0xE0, 0x3C, 0x07, 0xC0, 0xD8, 0x3B, 0x8F, + 0x3F, 0xE3, 0xCC, 0x1F, 0x07, 0xF1, 0xC7, 0x30, 0x7E, 0x0F, 0xFF, 0xFF, + 0xFF, 0x00, 0xE0, 0x0C, 0x01, 0xC3, 0x1F, 0xE1, 0xF8, 0x0E, 0x7C, 0xE1, + 0x83, 0x06, 0x3F, 0xFF, 0x30, 0x60, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, + 0x60, 0xC0, 0x1F, 0x67, 0xFD, 0xC3, 0xB0, 0x3E, 0x07, 0xC0, 0xF0, 0x1E, + 0x03, 0xE0, 0x6C, 0x1D, 0xC3, 0x9F, 0xF1, 0xE6, 0x00, 0xC0, 0x39, 0x06, + 0x3F, 0xC3, 0xE0, 0xC0, 0x30, 0x0C, 0x03, 0x00, 0xC0, 0x33, 0xCF, 0xFB, + 0x87, 0xC1, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, + 0xF0, 0x30, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x18, 0xC0, 0x00, 0x0C, 0x63, + 0x18, 0xC6, 0x31, 0x8C, 0x63, 0x18, 0xC6, 0x31, 0xFF, 0xC0, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x7C, 0x3B, 0x1C, 0xCE, 0x33, 0x0F, 0xC3, + 0xF0, 0xCE, 0x31, 0x8C, 0x73, 0x0E, 0xC1, 0xB0, 0x70, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0xDF, 0x1E, 0x7F, 0xDF, 0xB8, 0xF8, 0xF8, 0x38, 0x3C, 0x1C, + 0x1E, 0x0E, 0x0F, 0x07, 0x07, 0x83, 0x83, 0xC1, 0xC1, 0xE0, 0xE0, 0xF0, + 0x70, 0x78, 0x38, 0x3C, 0x1C, 0x18, 0xDF, 0x3F, 0xEE, 0x1F, 0x07, 0xC0, + 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xC0, 0x1F, + 0x03, 0xFC, 0x70, 0xC6, 0x0E, 0xE0, 0x6E, 0x06, 0xC0, 0x7C, 0x06, 0xE0, + 0x66, 0x0E, 0x70, 0xE3, 0xFC, 0x1F, 0x00, 0xDF, 0x3F, 0xEE, 0x3F, 0x07, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3E, 0x1F, 0xFE, 0xDF, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0x00, 0x1F, 0x67, 0xFD, 0xC7, 0xB0, 0x7E, + 0x0F, 0xC1, 0xF0, 0x3E, 0x07, 0xE0, 0xEC, 0x1D, 0xC7, 0x9F, 0xF1, 0xEE, + 0x01, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C, 0xDF, 0xFE, 0x30, 0xC3, 0x0C, + 0x30, 0xC3, 0x0C, 0x30, 0xC0, 0x1F, 0x0F, 0xE7, 0x1D, 0x83, 0x60, 0x1E, + 0x03, 0xF0, 0x1F, 0x00, 0xF8, 0x36, 0x1D, 0xFE, 0x1F, 0x00, 0x38, 0x70, + 0xE7, 0xFF, 0xE7, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x07, 0x87, + 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, 0x3C, 0x0F, 0x03, 0xC0, 0xF0, + 0x7E, 0x3D, 0xFB, 0x3C, 0xC0, 0xC0, 0xF8, 0x1B, 0x83, 0x30, 0xC6, 0x18, + 0x63, 0x0C, 0xC1, 0x98, 0x1B, 0x03, 0xC0, 0x78, 0x07, 0x00, 0xC0, 0xC1, + 0x83, 0xE0, 0xC1, 0xB0, 0xF0, 0xCC, 0x78, 0xE6, 0x3C, 0x63, 0x33, 0x31, + 0x99, 0x98, 0x6C, 0xD8, 0x34, 0x3C, 0x1E, 0x1E, 0x0F, 0x0F, 0x03, 0x83, + 0x01, 0x81, 0x80, 0xE1, 0xD8, 0x67, 0x38, 0xCC, 0x1E, 0x07, 0x80, 0xC0, + 0x78, 0x3F, 0x0C, 0xC7, 0x39, 0x87, 0xE0, 0xC0, 0x60, 0x76, 0x06, 0x70, + 0xE3, 0x0C, 0x30, 0xC3, 0x9C, 0x19, 0x81, 0x98, 0x0F, 0x80, 0xF0, 0x0F, + 0x00, 0x70, 0x06, 0x00, 0x60, 0x0E, 0x00, 0xC0, 0x78, 0x07, 0x00, 0xFF, + 0xFF, 0xF0, 0x18, 0x0C, 0x07, 0x03, 0x80, 0xC0, 0x60, 0x38, 0x1C, 0x06, + 0x03, 0xFF, 0xFF, 0xC0, 0x06, 0x1C, 0x61, 0xC3, 0x87, 0x0E, 0x1C, 0x30, + 0x61, 0xC7, 0x0F, 0x0E, 0x0C, 0x1C, 0x38, 0x70, 0xE1, 0xC1, 0x83, 0xC1, + 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x41, 0xC0, 0xC1, 0xC1, 0x83, 0x06, + 0x0C, 0x18, 0x30, 0x70, 0x31, 0xE3, 0x86, 0x0C, 0x18, 0x30, 0x61, 0xC3, + 0x0E, 0x30, 0x00, 0x3C, 0x01, 0xFC, 0x36, 0x39, 0xD0, 0x7E, 0x80, 0xF0 }; + +const GFXglyph Roboto_Regular12pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' + { 1, 2, 17, 6, 2, -16 }, // 0x21 '!' + { 6, 6, 6, 8, 1, -17 }, // 0x22 '"' + { 11, 13, 17, 15, 1, -16 }, // 0x23 '#' + { 39, 11, 22, 14, 1, -19 }, // 0x24 '$' + { 70, 16, 17, 18, 1, -16 }, // 0x25 '%' + { 104, 13, 17, 15, 1, -16 }, // 0x26 '&' + { 132, 2, 6, 4, 1, -17 }, // 0x27 ''' + { 134, 6, 24, 8, 2, -18 }, // 0x28 '(' + { 152, 6, 24, 8, 0, -18 }, // 0x29 ')' + { 170, 10, 10, 10, 0, -16 }, // 0x2A '*' + { 183, 12, 12, 14, 1, -13 }, // 0x2B '+' + { 201, 3, 6, 5, 1, -2 }, // 0x2C ',' + { 204, 6, 2, 7, 0, -7 }, // 0x2D '-' + { 206, 2, 2, 6, 2, -1 }, // 0x2E '.' + { 207, 9, 18, 10, 0, -16 }, // 0x2F '/' + { 228, 11, 17, 14, 1, -16 }, // 0x30 '0' + { 252, 6, 17, 14, 2, -16 }, // 0x31 '1' + { 265, 11, 17, 14, 1, -16 }, // 0x32 '2' + { 289, 11, 17, 14, 1, -16 }, // 0x33 '3' + { 313, 12, 17, 14, 1, -16 }, // 0x34 '4' + { 339, 10, 17, 14, 2, -16 }, // 0x35 '5' + { 361, 11, 17, 14, 2, -16 }, // 0x36 '6' + { 385, 11, 17, 14, 1, -16 }, // 0x37 '7' + { 409, 11, 17, 14, 1, -16 }, // 0x38 '8' + { 433, 11, 17, 14, 1, -16 }, // 0x39 '9' + { 457, 2, 13, 6, 2, -12 }, // 0x3A ':' + { 461, 3, 16, 6, 1, -12 }, // 0x3B ';' + { 467, 9, 10, 12, 1, -10 }, // 0x3C '<' + { 479, 10, 7, 14, 2, -11 }, // 0x3D '=' + { 488, 10, 10, 13, 2, -10 }, // 0x3E '>' + { 501, 9, 17, 11, 1, -16 }, // 0x3F '?' + { 521, 20, 22, 21, 1, -16 }, // 0x40 '@' + { 576, 15, 17, 16, 0, -16 }, // 0x41 'A' + { 608, 12, 17, 15, 2, -16 }, // 0x42 'B' + { 634, 13, 17, 15, 1, -16 }, // 0x43 'C' + { 662, 13, 17, 16, 2, -16 }, // 0x44 'D' + { 690, 11, 17, 14, 2, -16 }, // 0x45 'E' + { 714, 11, 17, 14, 2, -16 }, // 0x46 'F' + { 738, 13, 17, 16, 1, -16 }, // 0x47 'G' + { 766, 13, 17, 17, 2, -16 }, // 0x48 'H' + { 794, 3, 17, 7, 2, -16 }, // 0x49 'I' + { 801, 10, 17, 13, 1, -16 }, // 0x4A 'J' + { 823, 13, 17, 15, 2, -16 }, // 0x4B 'K' + { 851, 11, 17, 13, 2, -16 }, // 0x4C 'L' + { 875, 17, 17, 21, 2, -16 }, // 0x4D 'M' + { 912, 13, 17, 17, 2, -16 }, // 0x4E 'N' + { 940, 14, 17, 16, 1, -16 }, // 0x4F 'O' + { 970, 12, 17, 15, 2, -16 }, // 0x50 'P' + { 996, 15, 19, 16, 1, -16 }, // 0x51 'Q' + { 1032, 13, 17, 16, 2, -16 }, // 0x52 'R' + { 1060, 13, 17, 15, 1, -16 }, // 0x53 'S' + { 1088, 14, 17, 14, 0, -16 }, // 0x54 'T' + { 1118, 13, 17, 16, 2, -16 }, // 0x55 'U' + { 1146, 15, 17, 15, 0, -16 }, // 0x56 'V' + { 1178, 19, 17, 21, 1, -16 }, // 0x57 'W' + { 1219, 14, 17, 15, 1, -16 }, // 0x58 'X' + { 1249, 14, 17, 15, 0, -16 }, // 0x59 'Y' + { 1279, 12, 17, 14, 1, -16 }, // 0x5A 'Z' + { 1305, 4, 24, 6, 2, -19 }, // 0x5B '[' + { 1317, 10, 18, 10, 0, -16 }, // 0x5C '\' + { 1340, 5, 24, 6, 0, -19 }, // 0x5D ']' + { 1355, 8, 9, 10, 1, -16 }, // 0x5E '^' + { 1364, 11, 2, 11, 0, 1 }, // 0x5F '_' + { 1367, 5, 3, 8, 1, -17 }, // 0x60 '`' + { 1369, 11, 13, 13, 1, -12 }, // 0x61 'a' + { 1387, 11, 18, 14, 2, -17 }, // 0x62 'b' + { 1412, 11, 13, 13, 1, -12 }, // 0x63 'c' + { 1430, 11, 18, 14, 1, -17 }, // 0x64 'd' + { 1455, 11, 13, 13, 1, -12 }, // 0x65 'e' + { 1473, 7, 19, 8, 1, -18 }, // 0x66 'f' + { 1490, 11, 18, 14, 1, -12 }, // 0x67 'g' + { 1515, 10, 18, 14, 2, -17 }, // 0x68 'h' + { 1538, 2, 18, 6, 2, -17 }, // 0x69 'i' + { 1543, 5, 23, 6, -1, -17 }, // 0x6A 'j' + { 1558, 10, 18, 12, 2, -17 }, // 0x6B 'k' + { 1581, 2, 18, 6, 2, -17 }, // 0x6C 'l' + { 1586, 17, 13, 21, 2, -12 }, // 0x6D 'm' + { 1614, 10, 13, 14, 2, -12 }, // 0x6E 'n' + { 1631, 12, 13, 14, 1, -12 }, // 0x6F 'o' + { 1651, 10, 18, 14, 2, -12 }, // 0x70 'p' + { 1674, 11, 18, 14, 1, -12 }, // 0x71 'q' + { 1699, 6, 13, 8, 2, -12 }, // 0x72 'r' + { 1709, 10, 13, 13, 1, -12 }, // 0x73 's' + { 1726, 7, 16, 8, 0, -15 }, // 0x74 't' + { 1740, 10, 13, 14, 2, -12 }, // 0x75 'u' + { 1757, 11, 13, 12, 1, -12 }, // 0x76 'v' + { 1775, 17, 13, 18, 1, -12 }, // 0x77 'w' + { 1803, 10, 13, 12, 1, -12 }, // 0x78 'x' + { 1820, 12, 18, 12, 0, -12 }, // 0x79 'y' + { 1847, 10, 13, 12, 1, -12 }, // 0x7A 'z' + { 1864, 7, 23, 8, 1, -18 }, // 0x7B '{' + { 1885, 2, 20, 6, 2, -16 }, // 0x7C '|' + { 1890, 7, 23, 8, 0, -18 }, // 0x7D '}' + { 1911, 14, 5, 16, 1, -8 } }; // 0x7E '~' + +const GFXfont Roboto_Regular12pt7b PROGMEM = { + (uint8_t *)Roboto_Regular12pt7bBitmaps, + (GFXglyph *)Roboto_Regular12pt7bGlyphs, + 0x20, 0x7E, 31 }; + +// Approx. 2592 bytes +#endif // ifndef FONTS_ROBOTO_REGULAR12PT7B_H diff --git a/src/src/Static/Fonts/Roboto_Regular16pt7b.h b/src/src/Static/Fonts/Roboto_Regular16pt7b.h new file mode 100644 index 000000000..14fdb35fb --- /dev/null +++ b/src/src/Static/Fonts/Roboto_Regular16pt7b.h @@ -0,0 +1,374 @@ +#ifndef FONTS_ROBOTO_REGULAR16PT7B_H +#define FONTS_ROBOTO_REGULAR16PT7B_H +const uint8_t Roboto_Regular16pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x7F, 0xC0, 0xE7, 0xE7, + 0xE7, 0xE7, 0xE7, 0xE6, 0xC6, 0xC6, 0x01, 0x86, 0x01, 0xC3, 0x00, 0xE3, + 0x80, 0x61, 0x80, 0x30, 0xC0, 0x18, 0x61, 0xFF, 0xFE, 0xFF, 0xFF, 0x06, + 0x18, 0x03, 0x0C, 0x01, 0x86, 0x01, 0xC3, 0x00, 0xE3, 0x80, 0x61, 0xC3, + 0xFF, 0xFD, 0xFF, 0xFE, 0x0C, 0x30, 0x0E, 0x38, 0x06, 0x1C, 0x03, 0x0C, + 0x01, 0x86, 0x01, 0xC3, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x30, 0x03, 0xF0, + 0x3F, 0xF1, 0xE1, 0xE7, 0x03, 0x9C, 0x0E, 0x70, 0x1D, 0xC0, 0x77, 0x00, + 0x1E, 0x00, 0x3E, 0x00, 0x7F, 0x00, 0xFE, 0x00, 0x7E, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0xE7, 0x87, 0x9F, 0xFC, 0x1F, + 0xC0, 0x0C, 0x00, 0x30, 0x00, 0xC0, 0x3C, 0x00, 0x0F, 0xE0, 0x03, 0x8C, + 0x08, 0x61, 0xC3, 0x8C, 0x38, 0xE1, 0x87, 0x18, 0x30, 0xE6, 0x07, 0x18, + 0xC0, 0x7F, 0x30, 0x07, 0x8E, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x1C, + 0x78, 0x03, 0x3F, 0x80, 0xC6, 0x38, 0x39, 0xC3, 0x06, 0x30, 0x61, 0xC6, + 0x0C, 0x30, 0xE1, 0x8C, 0x0C, 0x70, 0x01, 0xFC, 0x00, 0x0F, 0x00, 0x07, + 0xC0, 0x07, 0xF8, 0x03, 0xC7, 0x00, 0xE0, 0xE0, 0x38, 0x38, 0x0E, 0x0E, + 0x03, 0x87, 0x00, 0xF3, 0xC0, 0x1D, 0xE0, 0x03, 0xE0, 0x00, 0xF0, 0x00, + 0xFE, 0x00, 0x7B, 0xC3, 0x9C, 0x78, 0xEE, 0x0F, 0x3B, 0x81, 0xCE, 0xE0, + 0x3F, 0x38, 0x0F, 0xC7, 0x01, 0xE1, 0xE0, 0xFC, 0x3F, 0xFF, 0x03, 0xF0, + 0xF0, 0xFF, 0xFF, 0xB6, 0x01, 0x07, 0x06, 0x0E, 0x1C, 0x38, 0x38, 0x70, + 0x70, 0x70, 0x60, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0x60, 0x70, 0x70, 0x70, 0x38, 0x38, 0x1C, 0x0C, 0x06, 0x07, 0x01, + 0xC0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x1C, 0x0E, 0x0E, 0x0E, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x0E, + 0x0E, 0x1C, 0x1C, 0x38, 0x30, 0x70, 0xE0, 0xC0, 0x07, 0x00, 0x18, 0x00, + 0xC0, 0x06, 0x07, 0x33, 0x3F, 0xFE, 0xFF, 0xC0, 0xE0, 0x0F, 0x80, 0xEE, + 0x06, 0x30, 0x71, 0xC1, 0x04, 0x00, 0x03, 0x80, 0x07, 0x00, 0x0E, 0x00, + 0x1C, 0x00, 0x38, 0x00, 0x70, 0x3F, 0xFF, 0xFF, 0xFF, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x00, 0x77, + 0x76, 0xEC, 0xC0, 0xFF, 0xFC, 0xFF, 0x80, 0x00, 0x70, 0x06, 0x00, 0xE0, + 0x0E, 0x00, 0xC0, 0x1C, 0x01, 0x80, 0x18, 0x03, 0x80, 0x30, 0x07, 0x00, + 0x70, 0x06, 0x00, 0xE0, 0x0C, 0x01, 0xC0, 0x1C, 0x01, 0x80, 0x38, 0x03, + 0x80, 0x30, 0x07, 0x00, 0x60, 0x0E, 0x00, 0x0F, 0x80, 0xFF, 0x87, 0x87, + 0x1C, 0x0E, 0xE0, 0x3B, 0x80, 0x6E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, + 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, + 0x1B, 0x80, 0xE7, 0x03, 0x9E, 0x1C, 0x3F, 0xE0, 0x3F, 0x00, 0x0F, 0xFF, + 0xF8, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, + 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC0, 0x07, 0xE0, 0x3F, 0xE0, 0xE0, 0xE3, + 0x80, 0xE7, 0x01, 0xCC, 0x03, 0xB8, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xE0, 0x07, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x0F, 0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x07, 0xFF, 0xEF, 0xFF, 0xC0, + 0x0F, 0xC0, 0x7F, 0xC3, 0x87, 0x9C, 0x07, 0x70, 0x1D, 0xC0, 0x70, 0x01, + 0xC0, 0x07, 0x00, 0x18, 0x00, 0xE0, 0x7E, 0x01, 0xFC, 0x00, 0x38, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0xE0, 0x1D, 0xC0, 0x77, 0x01, 0xCE, 0x0E, 0x1F, + 0xF0, 0x3F, 0x80, 0x00, 0x78, 0x00, 0x78, 0x00, 0xF8, 0x01, 0xF8, 0x01, + 0xF8, 0x03, 0xB8, 0x07, 0x38, 0x07, 0x38, 0x0E, 0x38, 0x0E, 0x38, 0x1C, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x70, 0x38, 0xE0, 0x38, 0xFF, 0xFF, 0xFF, + 0xFF, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x3F, + 0xF8, 0xFF, 0xE3, 0x00, 0x0C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, + 0x00, 0x77, 0xC1, 0xFF, 0xC7, 0x87, 0x9C, 0x0E, 0x60, 0x38, 0x00, 0x70, + 0x01, 0xC0, 0x07, 0xE0, 0x1F, 0x80, 0xE7, 0x03, 0x9E, 0x1C, 0x3F, 0xF0, + 0x3F, 0x00, 0x07, 0xF0, 0x3F, 0xC3, 0xC1, 0x0E, 0x00, 0x70, 0x01, 0x80, + 0x0E, 0x00, 0x39, 0xF8, 0xFF, 0xF3, 0xE1, 0xEF, 0x03, 0xF8, 0x07, 0xE0, + 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1D, 0xC0, 0x77, 0x03, 0x8F, + 0x1E, 0x1F, 0xF0, 0x1F, 0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x38, 0x00, + 0xE0, 0x03, 0x80, 0x06, 0x00, 0x1C, 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, + 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0x70, 0x00, 0xE0, 0x03, 0x80, 0x07, + 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x70, 0x01, 0xC0, 0x00, 0x0F, + 0xC0, 0xFF, 0x87, 0x8F, 0x1C, 0x0E, 0xE0, 0x3B, 0x80, 0xEE, 0x03, 0xB8, + 0x0E, 0x70, 0x39, 0xE1, 0xC1, 0xFE, 0x07, 0xF8, 0x78, 0x73, 0x80, 0xEE, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x03, 0x9E, 0x1E, 0x3F, 0xF0, + 0x7F, 0x00, 0x07, 0xC0, 0x3F, 0xE0, 0xF1, 0xE3, 0x81, 0xE7, 0x01, 0xDC, + 0x03, 0xB8, 0x07, 0x70, 0x0E, 0xE0, 0x0F, 0xC0, 0x1D, 0xC0, 0x7B, 0x80, + 0xF3, 0x87, 0xE3, 0xFD, 0xC3, 0xF7, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x38, + 0x00, 0xE1, 0x03, 0xC3, 0xFF, 0x03, 0xF8, 0x00, 0xFF, 0x80, 0x00, 0x00, + 0x00, 0x3F, 0xE0, 0x73, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE7, 0x7B, 0x9C, 0xCE, 0x00, 0x00, 0x10, 0x03, 0x00, 0xF0, 0x7F, 0x1F, + 0xC7, 0xE0, 0xF8, 0x0F, 0x00, 0x7E, 0x01, 0xF8, 0x07, 0xF0, 0x0F, 0x00, + 0x30, 0x01, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xFF, 0xFF, 0xFF, 0x80, 0x07, 0x00, 0x3E, 0x00, 0xFC, 0x01, 0xFC, 0x01, + 0xF8, 0x01, 0xE0, 0x1F, 0x03, 0xF0, 0xFE, 0x1F, 0x81, 0xF0, 0x0E, 0x00, + 0x40, 0x00, 0x1F, 0x87, 0xFE, 0xF0, 0xFE, 0x07, 0xE0, 0x70, 0x07, 0x00, + 0x70, 0x07, 0x00, 0xF0, 0x0E, 0x01, 0xC0, 0x3C, 0x07, 0x80, 0x70, 0x0E, + 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x0E, 0x00, 0xE0, 0x00, + 0x3F, 0x80, 0x00, 0x7F, 0xF8, 0x00, 0xF0, 0x1E, 0x00, 0xE0, 0x03, 0x80, + 0xE0, 0x00, 0xE0, 0xE0, 0x00, 0x38, 0x60, 0x00, 0x0C, 0x70, 0x3E, 0x06, + 0x30, 0x3F, 0xC1, 0x98, 0x38, 0x60, 0xDC, 0x18, 0x30, 0x6C, 0x1C, 0x18, + 0x36, 0x0C, 0x0C, 0x1B, 0x0E, 0x0E, 0x0D, 0x87, 0x07, 0x06, 0xC3, 0x83, + 0x83, 0x61, 0xC1, 0xC1, 0xB0, 0xE0, 0xC0, 0xD8, 0x70, 0x60, 0xCC, 0x1C, + 0x78, 0xC7, 0x0F, 0xEF, 0xE1, 0x83, 0xC3, 0xC0, 0xC0, 0x00, 0x00, 0x70, + 0x00, 0x00, 0x1C, 0x00, 0x00, 0x07, 0x00, 0x00, 0x01, 0xE0, 0x30, 0x00, + 0x7F, 0xF8, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x70, 0x00, 0x0F, 0x00, 0x00, + 0xF0, 0x00, 0x1F, 0x80, 0x01, 0xF8, 0x00, 0x19, 0x80, 0x03, 0x9C, 0x00, + 0x39, 0xC0, 0x03, 0x0E, 0x00, 0x70, 0xE0, 0x07, 0x06, 0x00, 0xE0, 0x70, + 0x0E, 0x07, 0x00, 0xE0, 0x38, 0x1F, 0xFF, 0x81, 0xFF, 0xF8, 0x38, 0x01, + 0xC3, 0x80, 0x1C, 0x38, 0x00, 0xC7, 0x00, 0x0E, 0x70, 0x00, 0xEF, 0x00, + 0x07, 0xFF, 0xC1, 0xFF, 0xE3, 0x81, 0xE7, 0x00, 0xEE, 0x01, 0xDC, 0x03, + 0xB8, 0x07, 0x70, 0x0E, 0xE0, 0x39, 0xFF, 0xE3, 0xFF, 0xC7, 0x01, 0xCE, + 0x01, 0xDC, 0x01, 0xF8, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, 0x1F, 0x80, + 0x7F, 0x01, 0xEF, 0xFF, 0x9F, 0xFC, 0x00, 0x07, 0xF0, 0x1F, 0xFC, 0x3C, + 0x1E, 0x78, 0x0F, 0x70, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x00, 0xE0, + 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, + 0x00, 0xE0, 0x07, 0xE0, 0x07, 0x70, 0x07, 0x78, 0x0F, 0x3C, 0x1E, 0x1F, + 0xFC, 0x07, 0xF0, 0xFF, 0xC0, 0xFF, 0xF0, 0xE0, 0x78, 0xE0, 0x1C, 0xE0, + 0x0E, 0xE0, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, + 0x0E, 0xE0, 0x0E, 0xE0, 0x1C, 0xE0, 0x78, 0xFF, 0xF0, 0xFF, 0xC0, 0xFF, + 0xFF, 0xFF, 0xFE, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0xFF, 0xEF, 0xFF, 0xB8, 0x00, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xFF, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, + 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0F, 0xFF, 0xBF, 0xFE, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x00, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0x07, 0x8F, + 0x01, 0xE7, 0x00, 0x77, 0x00, 0x3B, 0x80, 0x0F, 0xC0, 0x00, 0xE0, 0x00, + 0x70, 0x00, 0x38, 0x00, 0x1C, 0x0F, 0xFE, 0x07, 0xFF, 0x00, 0x1F, 0x80, + 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xB8, 0x01, 0xDE, 0x00, 0xE7, 0x81, 0xE0, + 0xFF, 0xE0, 0x1F, 0xC0, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x1C, 0x00, + 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, + 0x1C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0x07, 0xE0, 0x1F, 0x80, 0xEF, 0x03, 0x9E, 0x1C, 0x3F, 0xE0, 0x7F, 0x00, + 0xE0, 0x0F, 0x70, 0x07, 0x38, 0x07, 0x1C, 0x07, 0x8E, 0x07, 0x87, 0x03, + 0x83, 0x83, 0x81, 0xC3, 0x80, 0xE3, 0xC0, 0x73, 0xC0, 0x3F, 0xC0, 0x1F, + 0xE0, 0x0E, 0x38, 0x07, 0x1E, 0x03, 0x87, 0x81, 0xC1, 0xE0, 0xE0, 0x70, + 0x70, 0x1C, 0x38, 0x0F, 0x1C, 0x03, 0xCE, 0x00, 0xF7, 0x00, 0x3C, 0xE0, + 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, 0x00, + 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0x80, 0x1C, + 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0F, 0xFF, 0xFF, 0xFC, 0xF0, + 0x00, 0x7F, 0x80, 0x03, 0xFE, 0x00, 0x1F, 0xF0, 0x01, 0xFD, 0x80, 0x0F, + 0xEE, 0x00, 0xEF, 0x70, 0x07, 0x7D, 0x80, 0x33, 0xEE, 0x03, 0x9F, 0x30, + 0x1C, 0xF9, 0xC0, 0xC7, 0xCE, 0x0E, 0x3E, 0x30, 0x61, 0xF1, 0xC7, 0x0F, + 0x86, 0x38, 0x7C, 0x39, 0x83, 0xE1, 0xDC, 0x1F, 0x06, 0xC0, 0xF8, 0x3E, + 0x07, 0xC0, 0xF0, 0x3E, 0x07, 0x01, 0xF0, 0x38, 0x0C, 0xE0, 0x07, 0xF0, + 0x07, 0xF0, 0x07, 0xF8, 0x07, 0xFC, 0x07, 0xFC, 0x07, 0xEE, 0x07, 0xEE, + 0x07, 0xE7, 0x07, 0xE3, 0x87, 0xE3, 0x87, 0xE1, 0xC7, 0xE1, 0xE7, 0xE0, + 0xE7, 0xE0, 0x77, 0xE0, 0x77, 0xE0, 0x3F, 0xE0, 0x1F, 0xE0, 0x1F, 0xE0, + 0x0F, 0xE0, 0x0F, 0xE0, 0x07, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0x07, 0x8F, + 0x01, 0xE7, 0x00, 0x77, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, + 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, + 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xB8, 0x03, 0x9E, 0x03, 0xC7, 0x83, 0xC1, + 0xFF, 0xC0, 0x3F, 0x00, 0xFF, 0xE0, 0xFF, 0xF8, 0xE0, 0x3C, 0xE0, 0x0E, + 0xE0, 0x0E, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x07, 0xE0, 0x0E, 0xE0, 0x0E, + 0xE0, 0x3C, 0xFF, 0xF8, 0xFF, 0xE0, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, 0xE0, 0x00, + 0x07, 0xF0, 0x07, 0xFF, 0x03, 0xC1, 0xE1, 0xE0, 0x3C, 0x70, 0x07, 0x38, + 0x00, 0xEE, 0x00, 0x3B, 0x80, 0x0E, 0xE0, 0x03, 0xB8, 0x00, 0xEE, 0x00, + 0x3B, 0x80, 0x0E, 0xE0, 0x03, 0xB8, 0x00, 0xEE, 0x00, 0x3B, 0x80, 0x0E, + 0xE0, 0x03, 0x9C, 0x01, 0xC7, 0x80, 0xF0, 0xF0, 0x78, 0x1F, 0xFE, 0x01, + 0xFF, 0xC0, 0x00, 0x78, 0x00, 0x0F, 0x00, 0x01, 0x80, 0xFF, 0xE0, 0xFF, + 0xF8, 0xE0, 0x3C, 0xE0, 0x1E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, + 0x0E, 0xE0, 0x1E, 0xE0, 0x3C, 0xFF, 0xF8, 0xFF, 0xF8, 0xE0, 0x3C, 0xE0, + 0x1E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, 0x0E, 0xE0, + 0x0E, 0xE0, 0x0E, 0xE0, 0x07, 0x07, 0xF0, 0x0F, 0xFE, 0x0F, 0x07, 0x87, + 0x00, 0xE7, 0x00, 0x73, 0x80, 0x1D, 0xC0, 0x00, 0x70, 0x00, 0x3C, 0x00, + 0x0F, 0xC0, 0x01, 0xFC, 0x00, 0x1F, 0x80, 0x01, 0xE0, 0x00, 0x78, 0x00, + 0x1C, 0x00, 0x07, 0x60, 0x03, 0xB8, 0x01, 0xDC, 0x01, 0xC7, 0x81, 0xE1, + 0xFF, 0xC0, 0x3F, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x70, 0x00, 0x38, + 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, 0x03, 0x80, 0x01, 0xC0, 0x00, + 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, 0x00, 0x0E, 0x00, 0x07, 0x00, + 0x03, 0x80, 0x01, 0xC0, 0x00, 0xE0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1C, + 0x00, 0x0E, 0x00, 0xE0, 0x03, 0xF0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x7E, + 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, 0x07, 0xE0, 0x03, 0xF0, 0x01, + 0xF8, 0x00, 0xFC, 0x00, 0x7E, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0x0F, 0xC0, + 0x07, 0xE0, 0x03, 0xB8, 0x03, 0x9C, 0x01, 0xC7, 0x83, 0xC1, 0xFF, 0xC0, + 0x3F, 0x80, 0xF0, 0x00, 0xEE, 0x00, 0x1D, 0xC0, 0x07, 0x1C, 0x00, 0xE3, + 0x80, 0x3C, 0x70, 0x07, 0x07, 0x00, 0xE0, 0xE0, 0x38, 0x1E, 0x07, 0x01, + 0xC0, 0xE0, 0x38, 0x38, 0x03, 0x87, 0x00, 0x70, 0xE0, 0x0E, 0x38, 0x00, + 0xE7, 0x00, 0x1C, 0xE0, 0x03, 0xB8, 0x00, 0x3F, 0x00, 0x07, 0xC0, 0x00, + 0x78, 0x00, 0x0F, 0x00, 0x01, 0xC0, 0x00, 0xE0, 0x1C, 0x03, 0xF0, 0x0E, + 0x01, 0xF8, 0x07, 0x80, 0xEE, 0x07, 0xC0, 0x77, 0x03, 0xE0, 0x73, 0x81, + 0xB0, 0x39, 0xC1, 0xDC, 0x1C, 0x70, 0xEE, 0x0E, 0x38, 0x73, 0x0E, 0x1C, + 0x31, 0xC7, 0x0E, 0x38, 0xE3, 0x83, 0x1C, 0x71, 0xC1, 0xCE, 0x18, 0xC0, + 0xEE, 0x0E, 0xE0, 0x77, 0x07, 0x70, 0x1B, 0x81, 0xB8, 0x0D, 0x80, 0xD8, + 0x07, 0xC0, 0x7C, 0x03, 0xE0, 0x3E, 0x00, 0xF0, 0x0F, 0x00, 0x70, 0x07, + 0x00, 0x38, 0x03, 0x80, 0xF0, 0x03, 0xDE, 0x01, 0xE3, 0x80, 0xF0, 0xF0, + 0x38, 0x1C, 0x1E, 0x03, 0x87, 0x00, 0xF3, 0x80, 0x1D, 0xE0, 0x03, 0xF0, + 0x00, 0xFC, 0x00, 0x1E, 0x00, 0x07, 0x80, 0x03, 0xF0, 0x01, 0xFC, 0x00, + 0x73, 0x80, 0x3C, 0xF0, 0x0E, 0x1C, 0x07, 0x07, 0x83, 0xC0, 0xE0, 0xE0, + 0x1C, 0x78, 0x07, 0xBC, 0x00, 0xF0, 0xF0, 0x01, 0xEE, 0x00, 0x78, 0xE0, + 0x0E, 0x1C, 0x03, 0xC1, 0xC0, 0x70, 0x3C, 0x1E, 0x03, 0x83, 0x80, 0x78, + 0xF0, 0x07, 0x1C, 0x00, 0xF7, 0x80, 0x0E, 0xE0, 0x00, 0xF8, 0x00, 0x1F, + 0x00, 0x01, 0xC0, 0x00, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C, + 0x00, 0x03, 0x80, 0x00, 0x70, 0x00, 0x0E, 0x00, 0x01, 0xC0, 0x00, 0x7F, + 0xFF, 0x7F, 0xFF, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, + 0x78, 0x00, 0x70, 0x00, 0xE0, 0x01, 0xE0, 0x01, 0xC0, 0x03, 0x80, 0x07, + 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x38, 0x00, 0x38, + 0x00, 0x70, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x38, 0xE3, 0x8E, + 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, + 0x38, 0xE3, 0x8E, 0x38, 0xFF, 0xF0, 0xE0, 0x0E, 0x00, 0x60, 0x07, 0x00, + 0x70, 0x03, 0x80, 0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0C, 0x00, 0xE0, + 0x0E, 0x00, 0x70, 0x07, 0x00, 0x30, 0x03, 0x80, 0x38, 0x01, 0xC0, 0x1C, + 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x07, 0xFF, 0xF1, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, + 0x1C, 0x71, 0xC7, 0xFF, 0xF0, 0x0E, 0x01, 0xC0, 0x7C, 0x0F, 0x81, 0xB0, + 0x77, 0x0C, 0xE3, 0x8E, 0x71, 0xCC, 0x1B, 0x83, 0x80, 0xFF, 0xFF, 0xFF, + 0xF0, 0xF0, 0xE1, 0x83, 0x0F, 0xC1, 0xFF, 0x1E, 0x3C, 0xE0, 0xFE, 0x03, + 0x80, 0x1C, 0x00, 0xE3, 0xFF, 0x7F, 0xFF, 0x81, 0xF8, 0x0F, 0xC0, 0x7E, + 0x03, 0xF0, 0x3F, 0xC3, 0xEF, 0xF7, 0x3E, 0x38, 0xE0, 0x03, 0x80, 0x0E, + 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x39, 0xF0, 0xEF, 0xF3, + 0xE1, 0xEF, 0x03, 0xB8, 0x0E, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, + 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xF0, 0x3B, 0xE1, 0xEF, 0xFF, + 0x39, 0xF0, 0x07, 0xE0, 0x7F, 0xE3, 0xC3, 0x8E, 0x07, 0x70, 0x1D, 0xC0, + 0x37, 0x00, 0x3C, 0x00, 0xE0, 0x03, 0x80, 0x07, 0x00, 0x1C, 0x00, 0x70, + 0x1C, 0xE0, 0x73, 0xC3, 0x87, 0xFC, 0x07, 0xE0, 0x00, 0x1C, 0x00, 0x70, + 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC3, 0xE7, 0x1F, 0xFC, + 0xF0, 0xF3, 0x81, 0xDC, 0x07, 0x70, 0x1D, 0xC0, 0x77, 0x01, 0xF8, 0x07, + 0xE0, 0x1D, 0xC0, 0x77, 0x01, 0xDC, 0x07, 0x78, 0x1C, 0xF0, 0xF1, 0xFE, + 0xC3, 0xF3, 0x07, 0xC0, 0x7F, 0xC3, 0xC7, 0x8E, 0x0E, 0x70, 0x1D, 0xC0, + 0x77, 0x01, 0xDF, 0xFF, 0xFF, 0xFD, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, + 0x00, 0xE0, 0x23, 0xC1, 0x87, 0xFF, 0x07, 0xE0, 0x07, 0xC3, 0xF1, 0xC0, + 0x70, 0x38, 0x0E, 0x03, 0x83, 0xFE, 0xFF, 0x8E, 0x03, 0x80, 0xE0, 0x38, + 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03, + 0x80, 0xE0, 0x0F, 0x99, 0xFE, 0xDE, 0x1E, 0xE0, 0x7E, 0x03, 0xF0, 0x1F, + 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF8, + 0x1D, 0xE1, 0xE7, 0xFF, 0x1F, 0xB8, 0x01, 0xC0, 0x0E, 0x00, 0x72, 0x07, + 0x1F, 0xF1, 0x7F, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, + 0x03, 0x80, 0x0E, 0x00, 0x38, 0xF8, 0xEF, 0xF3, 0xE1, 0xEF, 0x03, 0xB8, + 0x0E, 0xE0, 0x3B, 0x80, 0x6E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, + 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xFF, 0x80, + 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0E, 0x1C, 0x38, 0x00, 0x00, + 0x00, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, + 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x70, 0xEF, 0x9E, 0x00, 0xE0, 0x03, + 0x80, 0x0E, 0x00, 0x38, 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x38, 0x1E, + 0xE0, 0x73, 0x83, 0x8E, 0x1E, 0x38, 0x70, 0xE3, 0x83, 0x9C, 0x0F, 0xF0, + 0x3F, 0xC0, 0xE7, 0x83, 0x8E, 0x0E, 0x1C, 0x38, 0x78, 0xE0, 0xE3, 0x81, + 0xCE, 0x07, 0xB8, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xE7, 0xC1, 0xF1, 0xDF, 0xE7, 0xF3, 0xE3, 0xD8, 0xF7, 0x83, 0xE0, + 0xEE, 0x03, 0x80, 0xFC, 0x07, 0x01, 0xF8, 0x0E, 0x03, 0xF0, 0x1C, 0x07, + 0xE0, 0x38, 0x0F, 0xC0, 0x70, 0x1F, 0x80, 0xE0, 0x3F, 0x01, 0xC0, 0x7E, + 0x03, 0x80, 0xFC, 0x07, 0x01, 0xF8, 0x0E, 0x03, 0xF0, 0x1C, 0x07, 0xE0, + 0x38, 0x0E, 0xE7, 0xC7, 0x7F, 0xBE, 0x1F, 0xE0, 0x7E, 0x03, 0xF0, 0x1F, + 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, 0x7E, 0x03, 0xF0, + 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x38, 0x07, 0xE0, 0x3F, 0xE0, 0xF0, 0xE1, + 0xC0, 0xE7, 0x01, 0xCE, 0x01, 0xDC, 0x03, 0xF0, 0x07, 0xE0, 0x0F, 0xC0, + 0x1D, 0xC0, 0x3B, 0x80, 0x77, 0x01, 0xC7, 0x03, 0x8F, 0x0E, 0x0F, 0xF8, + 0x07, 0xE0, 0xE7, 0xC3, 0xFF, 0xCF, 0x87, 0x3C, 0x0E, 0xE0, 0x3B, 0x80, + 0x7E, 0x01, 0xF8, 0x07, 0xE0, 0x1F, 0x80, 0x7E, 0x01, 0xF8, 0x07, 0xE0, + 0x3F, 0xC0, 0xEF, 0x87, 0xBB, 0xFC, 0xE7, 0xC3, 0x80, 0x0E, 0x00, 0x38, + 0x00, 0xE0, 0x03, 0x80, 0x0E, 0x00, 0x00, 0x0F, 0xCC, 0x7F, 0xB3, 0xC3, + 0xCE, 0x07, 0x70, 0x1D, 0xC0, 0x77, 0x01, 0xDC, 0x07, 0xE0, 0x1F, 0x80, + 0x77, 0x01, 0xDC, 0x07, 0x70, 0x1D, 0xE0, 0x73, 0xC3, 0xC7, 0xFF, 0x0F, + 0x9C, 0x00, 0x70, 0x01, 0xC0, 0x07, 0x00, 0x1C, 0x00, 0x70, 0x01, 0xC0, + 0xE7, 0xEF, 0xFF, 0xF8, 0xF0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, + 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0x1F, 0x81, 0xFF, 0x1C, 0x3D, 0xC0, 0xEE, + 0x07, 0x70, 0x01, 0xC0, 0x07, 0xE0, 0x1F, 0xC0, 0x0F, 0x80, 0x1C, 0x00, + 0x7E, 0x03, 0xF0, 0x39, 0xC3, 0xCF, 0xFC, 0x1F, 0x80, 0x38, 0x38, 0x38, + 0x38, 0xFF, 0xFF, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x3C, 0x1F, 0x0F, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, 0xC0, + 0x7E, 0x03, 0xF0, 0x1F, 0x80, 0xFC, 0x07, 0xE0, 0x3F, 0x01, 0xF8, 0x0F, + 0xC0, 0x7E, 0x03, 0xB8, 0x1D, 0xC1, 0xE7, 0xFB, 0x1F, 0x18, 0xE0, 0x1F, + 0x80, 0x77, 0x03, 0x9C, 0x0E, 0x70, 0x38, 0xE1, 0xC3, 0x87, 0x0E, 0x18, + 0x18, 0xE0, 0x73, 0x81, 0xCC, 0x03, 0x70, 0x0F, 0xC0, 0x1E, 0x00, 0x78, + 0x01, 0xE0, 0x03, 0x00, 0xE0, 0x70, 0x1F, 0x81, 0xC0, 0xEE, 0x07, 0x83, + 0x9C, 0x3E, 0x0E, 0x70, 0xD8, 0x31, 0xC3, 0x71, 0xC3, 0x0D, 0xC7, 0x0E, + 0x73, 0x1C, 0x39, 0x8C, 0x60, 0xE6, 0x3B, 0x81, 0xB8, 0x6E, 0x06, 0xC1, + 0xB8, 0x1F, 0x06, 0xC0, 0x7C, 0x1F, 0x00, 0xF0, 0x3C, 0x03, 0x80, 0xE0, + 0x0E, 0x03, 0x80, 0xF0, 0x3D, 0xC1, 0xE7, 0x87, 0x0E, 0x38, 0x1C, 0xE0, + 0x77, 0x00, 0xFC, 0x01, 0xE0, 0x07, 0x00, 0x3E, 0x00, 0xFC, 0x07, 0x70, + 0x1C, 0xE0, 0xE3, 0xC7, 0x87, 0x1C, 0x0E, 0xE0, 0x3C, 0xF0, 0x0E, 0xE0, + 0x3D, 0xE0, 0x71, 0xC0, 0xE3, 0x83, 0xC7, 0x87, 0x07, 0x0E, 0x0E, 0x38, + 0x0E, 0x70, 0x1C, 0xE0, 0x3B, 0x80, 0x37, 0x00, 0x7E, 0x00, 0x78, 0x00, + 0xF0, 0x01, 0xC0, 0x03, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x38, 0x00, 0xE0, + 0x07, 0xC0, 0x0E, 0x00, 0x00, 0x7F, 0xFB, 0xFF, 0xC0, 0x1C, 0x01, 0xE0, + 0x0E, 0x00, 0xE0, 0x0F, 0x00, 0x70, 0x07, 0x00, 0x78, 0x03, 0x80, 0x38, + 0x03, 0xC0, 0x1C, 0x01, 0xC0, 0x1F, 0xFF, 0xFF, 0xF8, 0x01, 0x83, 0xC3, + 0xC1, 0xC1, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x81, 0xC1, + 0xC3, 0xC1, 0xE0, 0x38, 0x0E, 0x07, 0x03, 0x81, 0xC0, 0xE0, 0x70, 0x38, + 0x1C, 0x0E, 0x03, 0x81, 0xE0, 0x78, 0x0C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xF0, 0x40, 0x3C, 0x03, 0x80, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, + 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x0E, 0x03, 0xC0, 0x7C, 0x1F, 0x0F, 0x03, + 0x81, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, + 0xE0, 0xF0, 0x10, 0x00, 0x3E, 0x00, 0x3F, 0x80, 0xF8, 0xF0, 0x78, 0x3C, + 0x6C, 0x07, 0xF0, 0x01, 0xF0 }; + +const GFXglyph Roboto_Regular16pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 8, 0, 0 }, // 0x20 ' ' + { 1, 3, 22, 8, 3, -21 }, // 0x21 '!' + { 10, 8, 8, 10, 1, -23 }, // 0x22 '"' + { 18, 17, 22, 19, 1, -21 }, // 0x23 '#' + { 65, 14, 28, 17, 2, -24 }, // 0x24 '$' + { 114, 19, 22, 23, 2, -21 }, // 0x25 '%' + { 167, 18, 22, 19, 1, -21 }, // 0x26 '&' + { 217, 3, 8, 5, 1, -23 }, // 0x27 ''' + { 220, 8, 32, 10, 2, -24 }, // 0x28 '(' + { 252, 8, 32, 10, 0, -24 }, // 0x29 ')' + { 284, 13, 13, 13, 0, -21 }, // 0x2A '*' + { 306, 15, 15, 18, 1, -17 }, // 0x2B '+' + { 335, 4, 7, 6, 1, -2 }, // 0x2C ',' + { 339, 7, 2, 8, 1, -9 }, // 0x2D '-' + { 341, 3, 3, 8, 2, -2 }, // 0x2E '.' + { 343, 12, 24, 13, 0, -21 }, // 0x2F '/' + { 379, 14, 22, 17, 2, -21 }, // 0x30 '0' + { 418, 7, 22, 17, 3, -21 }, // 0x31 '1' + { 438, 15, 22, 17, 1, -21 }, // 0x32 '2' + { 480, 14, 22, 17, 1, -21 }, // 0x33 '3' + { 519, 16, 22, 17, 1, -21 }, // 0x34 '4' + { 563, 14, 22, 17, 2, -21 }, // 0x35 '5' + { 602, 14, 22, 17, 2, -21 }, // 0x36 '6' + { 641, 15, 22, 17, 1, -21 }, // 0x37 '7' + { 683, 14, 22, 17, 2, -21 }, // 0x38 '8' + { 722, 15, 22, 17, 1, -21 }, // 0x39 '9' + { 764, 3, 17, 8, 2, -16 }, // 0x3A ':' + { 771, 5, 21, 8, 1, -16 }, // 0x3B ';' + { 785, 12, 14, 16, 1, -14 }, // 0x3C '<' + { 806, 13, 8, 17, 2, -14 }, // 0x3D '=' + { 819, 13, 14, 16, 2, -14 }, // 0x3E '>' + { 842, 12, 22, 15, 1, -21 }, // 0x3F '?' + { 875, 25, 29, 28, 1, -21 }, // 0x40 '@' + { 966, 20, 22, 20, 0, -21 }, // 0x41 'A' + { 1021, 15, 22, 20, 3, -21 }, // 0x42 'B' + { 1063, 16, 22, 20, 2, -21 }, // 0x43 'C' + { 1107, 16, 22, 20, 3, -21 }, // 0x44 'D' + { 1151, 14, 22, 18, 3, -21 }, // 0x45 'E' + { 1190, 14, 22, 18, 3, -21 }, // 0x46 'F' + { 1229, 17, 22, 21, 2, -21 }, // 0x47 'G' + { 1276, 16, 22, 22, 3, -21 }, // 0x48 'H' + { 1320, 3, 22, 9, 3, -21 }, // 0x49 'I' + { 1329, 14, 22, 17, 1, -21 }, // 0x4A 'J' + { 1368, 17, 22, 20, 3, -21 }, // 0x4B 'K' + { 1415, 13, 22, 17, 3, -21 }, // 0x4C 'L' + { 1451, 21, 22, 27, 3, -21 }, // 0x4D 'M' + { 1509, 16, 22, 22, 3, -21 }, // 0x4E 'N' + { 1553, 17, 22, 21, 2, -21 }, // 0x4F 'O' + { 1600, 16, 22, 20, 3, -21 }, // 0x50 'P' + { 1644, 18, 25, 21, 2, -21 }, // 0x51 'Q' + { 1701, 16, 22, 21, 3, -21 }, // 0x52 'R' + { 1745, 17, 22, 19, 1, -21 }, // 0x53 'S' + { 1792, 17, 22, 18, 1, -21 }, // 0x54 'T' + { 1839, 17, 22, 21, 2, -21 }, // 0x55 'U' + { 1886, 19, 22, 20, 0, -21 }, // 0x56 'V' + { 1939, 25, 22, 27, 1, -21 }, // 0x57 'W' + { 2008, 18, 22, 20, 1, -21 }, // 0x58 'X' + { 2058, 19, 22, 19, 0, -21 }, // 0x59 'Y' + { 2111, 16, 22, 19, 1, -21 }, // 0x5A 'Z' + { 2155, 6, 30, 8, 2, -24 }, // 0x5B '[' + { 2178, 12, 24, 13, 1, -21 }, // 0x5C '\' + { 2214, 6, 30, 8, 0, -24 }, // 0x5D ']' + { 2237, 11, 11, 13, 1, -21 }, // 0x5E '^' + { 2253, 14, 2, 14, 0, 1 }, // 0x5F '_' + { 2257, 6, 4, 10, 1, -22 }, // 0x60 '`' + { 2260, 13, 17, 17, 2, -16 }, // 0x61 'a' + { 2288, 14, 24, 18, 2, -23 }, // 0x62 'b' + { 2330, 14, 17, 16, 1, -16 }, // 0x63 'c' + { 2360, 14, 24, 18, 1, -23 }, // 0x64 'd' + { 2402, 14, 17, 16, 1, -16 }, // 0x65 'e' + { 2432, 10, 24, 11, 1, -23 }, // 0x66 'f' + { 2462, 13, 23, 18, 2, -16 }, // 0x67 'g' + { 2500, 14, 24, 18, 2, -23 }, // 0x68 'h' + { 2542, 3, 24, 8, 2, -23 }, // 0x69 'i' + { 2551, 7, 30, 8, -1, -23 }, // 0x6A 'j' + { 2578, 14, 24, 16, 2, -23 }, // 0x6B 'k' + { 2620, 3, 24, 8, 2, -23 }, // 0x6C 'l' + { 2629, 23, 17, 27, 2, -16 }, // 0x6D 'm' + { 2678, 13, 17, 18, 2, -16 }, // 0x6E 'n' + { 2706, 15, 17, 18, 1, -16 }, // 0x6F 'o' + { 2738, 14, 23, 18, 2, -16 }, // 0x70 'p' + { 2779, 14, 23, 18, 1, -16 }, // 0x71 'q' + { 2820, 8, 17, 11, 2, -16 }, // 0x72 'r' + { 2837, 13, 17, 16, 2, -16 }, // 0x73 's' + { 2865, 8, 21, 11, 1, -20 }, // 0x74 't' + { 2886, 13, 17, 18, 2, -16 }, // 0x75 'u' + { 2914, 14, 17, 16, 1, -16 }, // 0x76 'v' + { 2944, 22, 17, 23, 1, -16 }, // 0x77 'w' + { 2991, 14, 17, 16, 1, -16 }, // 0x78 'x' + { 3021, 15, 23, 16, 0, -16 }, // 0x79 'y' + { 3065, 13, 17, 16, 1, -16 }, // 0x7A 'z' + { 3093, 9, 30, 11, 1, -23 }, // 0x7B '{' + { 3127, 2, 26, 8, 3, -21 }, // 0x7C '|' + { 3134, 10, 30, 11, 0, -23 }, // 0x7D '}' + { 3172, 17, 6, 21, 2, -11 } }; // 0x7E '~' + +const GFXfont Roboto_Regular16pt7b PROGMEM = { + (uint8_t *)Roboto_Regular16pt7bBitmaps, + (GFXglyph *)Roboto_Regular16pt7bGlyphs, + 0x20, 0x7E, 41 }; + +// Approx. 3857 bytes +#endif // ifndef FONTS_ROBOTO_REGULAR16PT7B_H diff --git a/src/src/Static/Fonts/Roboto_Regular8pt7b.h b/src/src/Static/Fonts/Roboto_Regular8pt7b.h new file mode 100644 index 000000000..03719bdeb --- /dev/null +++ b/src/src/Static/Fonts/Roboto_Regular8pt7b.h @@ -0,0 +1,186 @@ +#ifndef FONTS_ROBOTO_REGULAR8PT7B_H +#define FONTS_ROBOTO_REGULAR8PT7B_H +const uint8_t Roboto_Regular8pt7bBitmaps[] PROGMEM = { + 0x00, 0xFF, 0xFF, 0x0F, 0xBB, 0xAA, 0x12, 0x12, 0x12, 0x32, 0xFF, 0x24, + 0x24, 0x24, 0xFF, 0x4C, 0x48, 0x48, 0x10, 0x20, 0xF2, 0x3C, 0x78, 0x10, + 0x38, 0x1C, 0x0C, 0x0C, 0x1C, 0x6F, 0x84, 0x00, 0x70, 0x24, 0x09, 0x92, + 0x48, 0x72, 0x01, 0x00, 0xC0, 0x2E, 0x16, 0x4D, 0x12, 0x64, 0x0E, 0x1C, + 0x09, 0x82, 0x21, 0x98, 0x3C, 0x06, 0x06, 0x89, 0x32, 0x46, 0xB0, 0xE6, + 0x38, 0xF3, 0xF0, 0x13, 0x24, 0x4C, 0xCC, 0xCC, 0xCC, 0x44, 0x23, 0x10, + 0x84, 0x62, 0x33, 0x11, 0x11, 0x13, 0x32, 0x64, 0x80, 0x10, 0x23, 0x53, + 0xF3, 0x8D, 0x13, 0x00, 0x10, 0x20, 0x47, 0xF1, 0x02, 0x04, 0x08, 0x57, + 0xF0, 0xF0, 0x04, 0x30, 0x82, 0x18, 0x43, 0x08, 0x21, 0x84, 0x10, 0xC0, + 0x38, 0x8B, 0x1C, 0x18, 0x30, 0x60, 0xC1, 0x83, 0x8D, 0x11, 0xC0, 0x3F, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x79, 0x8A, 0x1C, 0x30, 0x61, 0x82, 0x0C, + 0x30, 0xC3, 0x07, 0xF0, 0x79, 0x8A, 0x18, 0x30, 0x67, 0x81, 0x03, 0x07, + 0x0F, 0x13, 0xC0, 0x06, 0x03, 0x02, 0x83, 0x41, 0x21, 0x11, 0x88, 0x84, + 0xFF, 0x81, 0x00, 0x80, 0x40, 0x7E, 0x81, 0x02, 0x04, 0x0F, 0xB1, 0x83, + 0x03, 0x8D, 0x19, 0xE0, 0x3C, 0xC1, 0x06, 0x0F, 0xD8, 0xF0, 0xE1, 0xC3, + 0x85, 0x99, 0xE0, 0xFE, 0x0C, 0x10, 0x60, 0x83, 0x04, 0x08, 0x30, 0x60, + 0x81, 0x00, 0x7D, 0x8F, 0x1E, 0x34, 0x47, 0x11, 0x61, 0x83, 0x07, 0x1B, + 0xE0, 0x79, 0x8A, 0x1C, 0x38, 0x70, 0xF1, 0xBF, 0x06, 0x0C, 0x33, 0xC0, + 0xF0, 0x03, 0xC0, 0xF0, 0x03, 0xE8, 0x04, 0x77, 0x20, 0x70, 0x70, 0x40, + 0xFE, 0x00, 0x07, 0xF0, 0x81, 0xC0, 0x70, 0x33, 0xDC, 0x20, 0x00, 0x3C, + 0x8F, 0x18, 0x30, 0x61, 0x86, 0x08, 0x00, 0x00, 0x40, 0x80, 0x0F, 0x81, + 0x83, 0x08, 0x0C, 0x8E, 0x2C, 0xC9, 0x44, 0x4A, 0x66, 0x33, 0x32, 0x99, + 0x94, 0xCC, 0xA3, 0xB9, 0x80, 0x04, 0x00, 0x18, 0x40, 0x7C, 0x00, 0x0C, + 0x03, 0x00, 0xA0, 0x68, 0x12, 0x04, 0xC3, 0x10, 0x86, 0x7F, 0x98, 0x24, + 0x0F, 0x03, 0xFC, 0xC3, 0xC3, 0xC3, 0xC3, 0xFC, 0xC3, 0xC1, 0xC1, 0xC1, + 0xC3, 0xFE, 0x3E, 0x31, 0xB0, 0x58, 0x28, 0x04, 0x02, 0x01, 0x00, 0xC1, + 0x60, 0x98, 0xC7, 0xC0, 0xFC, 0x61, 0xB0, 0x58, 0x3C, 0x1E, 0x0F, 0x07, + 0x83, 0xC1, 0xE0, 0xB0, 0xDF, 0x80, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFF, 0xFF, 0xC0, 0xC0, 0xC0, 0xC0, 0xFE, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x3E, 0x31, 0xB0, 0x58, 0x18, 0x04, + 0x02, 0x1F, 0x03, 0xC1, 0xE0, 0xD8, 0x47, 0xC0, 0xC1, 0xE0, 0xF0, 0x78, + 0x3C, 0x1F, 0xFF, 0x07, 0x83, 0xC1, 0xE0, 0xF0, 0x78, 0x30, 0xFF, 0xFF, + 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x42, 0x66, + 0x3C, 0xC1, 0xE1, 0xB1, 0x99, 0x8C, 0x87, 0xC3, 0x21, 0x98, 0xC6, 0x61, + 0x30, 0xD8, 0x30, 0xC1, 0x83, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC1, 0x83, + 0x07, 0xF0, 0xE0, 0x7E, 0x07, 0xE0, 0x7D, 0x0B, 0xD0, 0xBD, 0x0B, 0xC9, + 0x3C, 0x93, 0xC9, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC1, 0xF0, 0xF8, 0x7A, + 0x3D, 0x1E, 0x4F, 0x37, 0x8B, 0xC3, 0xE1, 0xF0, 0x78, 0x30, 0x3E, 0x31, + 0xB0, 0x58, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xC1, 0xE0, 0x98, 0xC7, 0xC0, + 0xFE, 0x61, 0xB0, 0x58, 0x3C, 0x16, 0x1B, 0xF9, 0x80, 0xC0, 0x60, 0x30, + 0x18, 0x00, 0x3E, 0x31, 0xB0, 0x58, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0xC1, + 0xE0, 0xD8, 0xC7, 0xE0, 0x18, 0x04, 0xFE, 0x61, 0xB0, 0x58, 0x2C, 0x16, + 0x1B, 0xF9, 0x86, 0xC1, 0x60, 0xB0, 0x58, 0x30, 0x3C, 0x43, 0xC3, 0xC0, + 0x40, 0x38, 0x0E, 0x03, 0x01, 0x81, 0xC3, 0x3C, 0xFF, 0x84, 0x02, 0x01, + 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, 0xC1, 0xE0, + 0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE0, 0xD8, 0xC7, 0xC0, + 0xC0, 0xD0, 0x26, 0x09, 0x86, 0x21, 0x0C, 0x43, 0x30, 0x48, 0x12, 0x03, + 0x80, 0xC0, 0x30, 0xC3, 0x0D, 0x0C, 0x24, 0x30, 0x98, 0xE6, 0x64, 0x98, + 0x92, 0x42, 0x49, 0x09, 0x24, 0x38, 0x70, 0x61, 0x81, 0x86, 0x06, 0x18, + 0xC3, 0xA1, 0x99, 0x84, 0x83, 0xC0, 0xC0, 0x60, 0x68, 0x26, 0x31, 0x30, + 0xD8, 0x30, 0xC0, 0xD8, 0x66, 0x10, 0xCC, 0x12, 0x05, 0x80, 0xC0, 0x30, + 0x0C, 0x03, 0x00, 0xC0, 0x30, 0xFF, 0x02, 0x06, 0x0C, 0x08, 0x18, 0x10, + 0x30, 0x60, 0x40, 0xC0, 0xFF, 0xFB, 0x6D, 0xB6, 0xDB, 0x6D, 0xB8, 0xC0, + 0x81, 0x81, 0x02, 0x06, 0x04, 0x0C, 0x18, 0x10, 0x30, 0x20, 0x60, 0xE4, + 0x92, 0x49, 0x24, 0x92, 0x78, 0x10, 0xC2, 0x9A, 0x4F, 0x10, 0xFE, 0xCC, + 0x38, 0x8B, 0x18, 0x37, 0xF8, 0xE1, 0xE7, 0x76, 0xC1, 0x83, 0x07, 0xEC, + 0x78, 0xF0, 0xE1, 0xC3, 0x87, 0x1D, 0xE0, 0x3C, 0x8F, 0x1C, 0x08, 0x10, + 0x31, 0xA3, 0x3C, 0x06, 0x0C, 0x1B, 0xF4, 0x78, 0xE1, 0xC3, 0x87, 0x8F, + 0x1B, 0xD0, 0x38, 0x8B, 0x1C, 0x3F, 0xF0, 0x30, 0x22, 0x3E, 0x1C, 0x82, + 0x3E, 0x20, 0x82, 0x08, 0x20, 0x82, 0x08, 0x7A, 0x8F, 0x1C, 0x38, 0x70, + 0xF1, 0xE3, 0x7E, 0x0C, 0x1C, 0x27, 0x80, 0xC1, 0x83, 0x07, 0xEC, 0x78, + 0xF1, 0xE3, 0xC7, 0x8F, 0x1E, 0x30, 0xF0, 0xFF, 0xFF, 0xC0, 0x33, 0x00, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xE0, 0xC1, 0x83, 0x06, 0x3C, 0xD9, + 0x36, 0x78, 0xD9, 0x93, 0x36, 0x30, 0xFF, 0xFF, 0xFF, 0xFD, 0xEC, 0x62, + 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x3C, 0x63, 0xC6, 0x30, 0xFD, + 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC6, 0x38, 0x8F, 0x1C, 0x18, 0x30, + 0x71, 0xA3, 0x38, 0xBD, 0x8F, 0x1E, 0x1C, 0x38, 0x70, 0xE3, 0xFD, 0x83, + 0x06, 0x0C, 0x00, 0x7A, 0x8F, 0x1C, 0x38, 0x70, 0xF1, 0xE3, 0x7E, 0x0C, + 0x18, 0x30, 0x60, 0xFC, 0xCC, 0xCC, 0xCC, 0xC0, 0x79, 0x9B, 0x16, 0x03, + 0x80, 0xA1, 0xE2, 0x78, 0x21, 0x3E, 0x42, 0x10, 0x84, 0x21, 0x0E, 0xC7, + 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xA3, 0x7A, 0xC3, 0x42, 0x62, 0x26, 0x24, + 0x34, 0x1C, 0x18, 0x18, 0xC6, 0x34, 0x62, 0x46, 0x26, 0xD6, 0x29, 0x42, + 0x94, 0x29, 0x43, 0x0C, 0x10, 0x80, 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x18, + 0x24, 0x66, 0xC3, 0xC3, 0x42, 0x66, 0x66, 0x24, 0x24, 0x3C, 0x18, 0x18, + 0x18, 0x10, 0x30, 0x60, 0xFC, 0x31, 0x84, 0x31, 0x86, 0x30, 0xFC, 0x08, + 0x8C, 0x63, 0x18, 0x98, 0x21, 0x8C, 0x63, 0x08, 0x20, 0xFF, 0xFF, 0xFF, + 0xF0, 0xC3, 0x08, 0x42, 0x10, 0xC3, 0x31, 0x08, 0x42, 0x33, 0x00, 0x70, + 0xC4, 0xE1, 0xC0 }; + +const GFXglyph Roboto_Regular8pt7bGlyphs[] PROGMEM = { + { 0, 1, 1, 4, 0, 0 }, // 0x20 ' ' + { 1, 2, 12, 4, 1, -11 }, // 0x21 '!' + { 4, 4, 4, 5, 1, -11 }, // 0x22 '"' + { 6, 8, 12, 10, 1, -11 }, // 0x23 '#' + { 18, 7, 15, 9, 1, -13 }, // 0x24 '$' + { 32, 10, 12, 12, 1, -11 }, // 0x25 '%' + { 47, 10, 12, 10, 0, -11 }, // 0x26 '&' + { 62, 1, 4, 3, 1, -11 }, // 0x27 ''' + { 63, 4, 17, 5, 1, -12 }, // 0x28 '(' + { 72, 4, 17, 5, 0, -12 }, // 0x29 ')' + { 81, 7, 7, 7, 0, -11 }, // 0x2A '*' + { 88, 7, 8, 9, 1, -8 }, // 0x2B '+' + { 95, 2, 4, 3, 0, -1 }, // 0x2C ',' + { 96, 4, 1, 4, 0, -4 }, // 0x2D '-' + { 97, 2, 2, 4, 1, -1 }, // 0x2E '.' + { 98, 6, 13, 7, 0, -11 }, // 0x2F '/' + { 108, 7, 12, 9, 1, -11 }, // 0x30 '0' + { 119, 4, 12, 9, 1, -11 }, // 0x31 '1' + { 125, 7, 12, 9, 1, -11 }, // 0x32 '2' + { 136, 7, 12, 9, 1, -11 }, // 0x33 '3' + { 147, 9, 12, 9, 0, -11 }, // 0x34 '4' + { 161, 7, 12, 9, 1, -11 }, // 0x35 '5' + { 172, 7, 12, 9, 1, -11 }, // 0x36 '6' + { 183, 7, 12, 9, 1, -11 }, // 0x37 '7' + { 194, 7, 12, 9, 1, -11 }, // 0x38 '8' + { 205, 7, 12, 9, 1, -11 }, // 0x39 '9' + { 216, 2, 9, 4, 1, -8 }, // 0x3A ':' + { 219, 2, 11, 4, 1, -8 }, // 0x3B ';' + { 222, 6, 7, 8, 1, -7 }, // 0x3C '<' + { 228, 7, 4, 9, 1, -6 }, // 0x3D '=' + { 232, 7, 7, 8, 1, -7 }, // 0x3E '>' + { 239, 7, 12, 8, 0, -11 }, // 0x3F '?' + { 250, 13, 15, 14, 1, -10 }, // 0x40 '@' + { 275, 10, 12, 10, 0, -11 }, // 0x41 'A' + { 290, 8, 12, 10, 1, -11 }, // 0x42 'B' + { 302, 9, 12, 10, 1, -11 }, // 0x43 'C' + { 316, 9, 12, 11, 1, -11 }, // 0x44 'D' + { 330, 8, 12, 9, 1, -11 }, // 0x45 'E' + { 342, 8, 12, 9, 1, -11 }, // 0x46 'F' + { 354, 9, 12, 11, 1, -11 }, // 0x47 'G' + { 368, 9, 12, 11, 1, -11 }, // 0x48 'H' + { 382, 2, 12, 5, 1, -11 }, // 0x49 'I' + { 385, 8, 12, 9, 0, -11 }, // 0x4A 'J' + { 397, 9, 12, 10, 1, -11 }, // 0x4B 'K' + { 411, 7, 12, 9, 1, -11 }, // 0x4C 'L' + { 422, 12, 12, 14, 1, -11 }, // 0x4D 'M' + { 440, 9, 12, 11, 1, -11 }, // 0x4E 'N' + { 454, 9, 12, 11, 1, -11 }, // 0x4F 'O' + { 468, 9, 12, 10, 1, -11 }, // 0x50 'P' + { 482, 9, 14, 11, 1, -11 }, // 0x51 'Q' + { 498, 9, 12, 11, 1, -11 }, // 0x52 'R' + { 512, 8, 12, 10, 1, -11 }, // 0x53 'S' + { 524, 9, 12, 9, 0, -11 }, // 0x54 'T' + { 538, 9, 12, 11, 1, -11 }, // 0x55 'U' + { 552, 10, 12, 10, 0, -11 }, // 0x56 'V' + { 567, 14, 12, 14, 0, -11 }, // 0x57 'W' + { 588, 9, 12, 10, 1, -11 }, // 0x58 'X' + { 602, 10, 12, 10, 0, -11 }, // 0x59 'Y' + { 617, 8, 12, 10, 1, -11 }, // 0x5A 'Z' + { 629, 3, 15, 4, 1, -12 }, // 0x5B '[' + { 635, 7, 13, 7, 0, -11 }, // 0x5C '\' + { 647, 3, 15, 4, 0, -12 }, // 0x5D ']' + { 653, 6, 6, 7, 0, -11 }, // 0x5E '^' + { 658, 7, 1, 7, 0, 1 }, // 0x5F '_' + { 659, 3, 2, 5, 1, -11 }, // 0x60 '`' + { 660, 7, 9, 9, 1, -8 }, // 0x61 'a' + { 668, 7, 12, 9, 1, -11 }, // 0x62 'b' + { 679, 7, 9, 9, 1, -8 }, // 0x63 'c' + { 687, 7, 12, 9, 1, -11 }, // 0x64 'd' + { 698, 7, 9, 8, 1, -8 }, // 0x65 'e' + { 706, 6, 12, 6, 0, -11 }, // 0x66 'f' + { 715, 7, 13, 9, 1, -8 }, // 0x67 'g' + { 727, 7, 12, 9, 1, -11 }, // 0x68 'h' + { 738, 2, 13, 4, 1, -12 }, // 0x69 'i' + { 742, 4, 17, 4, -1, -12 }, // 0x6A 'j' + { 751, 7, 12, 8, 1, -11 }, // 0x6B 'k' + { 762, 2, 12, 4, 1, -11 }, // 0x6C 'l' + { 765, 12, 9, 14, 1, -8 }, // 0x6D 'm' + { 779, 7, 9, 9, 1, -8 }, // 0x6E 'n' + { 787, 7, 9, 9, 1, -8 }, // 0x6F 'o' + { 795, 7, 13, 9, 1, -8 }, // 0x70 'p' + { 807, 7, 13, 9, 1, -8 }, // 0x71 'q' + { 819, 4, 9, 5, 1, -8 }, // 0x72 'r' + { 824, 7, 9, 8, 1, -8 }, // 0x73 's' + { 832, 5, 11, 6, 0, -10 }, // 0x74 't' + { 839, 7, 9, 9, 1, -8 }, // 0x75 'u' + { 847, 8, 9, 8, 0, -8 }, // 0x76 'v' + { 856, 12, 9, 12, 0, -8 }, // 0x77 'w' + { 870, 8, 9, 8, 0, -8 }, // 0x78 'x' + { 879, 8, 13, 8, 0, -8 }, // 0x79 'y' + { 892, 6, 9, 8, 1, -8 }, // 0x7A 'z' + { 899, 5, 15, 5, 0, -11 }, // 0x7B '{' + { 909, 2, 14, 4, 1, -11 }, // 0x7C '|' + { 913, 5, 15, 5, 0, -11 }, // 0x7D '}' + { 923, 9, 3, 11, 1, -5 } }; // 0x7E '~' + +const GFXfont Roboto_Regular8pt7b PROGMEM = { + (uint8_t *)Roboto_Regular8pt7bBitmaps, + (GFXglyph *)Roboto_Regular8pt7bGlyphs, + 0x20, 0x7E, 21 }; + +// Approx. 1599 bytes +#endif // ifndef FONTS_ROBOTO_REGULAR8PT7B_H diff --git a/src/src/Static/Fonts/Seven_Segment18pt7b.h b/src/src/Static/Fonts/Seven_Segment18pt7b.h index f70351a4e..4a6d48b5b 100644 --- a/src/src/Static/Fonts/Seven_Segment18pt7b.h +++ b/src/src/Static/Fonts/Seven_Segment18pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_SEVEN_SEGMENT18PT7B_H +#define FONTS_SEVEN_SEGMENT18PT7B_H const uint8_t Seven_Segment18pt7bBitmaps[] PROGMEM = { 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x40, 0x4B, 0x74, 0x80, 0x00, 0x08, 0x03, 0x30, 0x0E, 0x60, 0x19, 0xC0, 0x33, 0x0F, 0xFF, 0x9F, 0xFF, 0x07, @@ -297,105 +299,106 @@ const uint8_t Seven_Segment18pt7bBitmaps[] PROGMEM = { 0x0C, 0x07, 0xFE }; const GFXglyph Seven_Segment18pt7bGlyphs[] PROGMEM = { - { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' - { 0, 2, 25, 6, 2, -24 }, // 0x21 '!' - { 7, 6, 3, 10, 2, -23 }, // 0x22 '"' - { 10, 15, 16, 19, 2, -15 }, // 0x23 '#' - { 40, 13, 31, 18, 2, -27 }, // 0x24 '$' - { 91, 20, 25, 25, 2, -24 }, // 0x25 '%' - { 154, 79, 25, 83, 2, -24 }, // 0x26 '&' - { 401, 9, 23, 13, 1, -22 }, // 0x27 ''' - { 427, 9, 25, 13, 2, -24 }, // 0x28 '(' - { 456, 9, 25, 13, 2, -24 }, // 0x29 ')' - { 485, 10, 11, 14, 2, -28 }, // 0x2A '*' - { 499, 19, 18, 23, 2, -19 }, // 0x2B '+' - { 542, 4, 4, 8, 2, -3 }, // 0x2C ',' - { 544, 10, 2, 14, 2, -12 }, // 0x2D '-' - { 547, 2, 3, 6, 2, -2 }, // 0x2E '.' - { 548, 15, 24, 19, 2, -23 }, // 0x2F '/' - { 593, 13, 25, 18, 2, -24 }, // 0x30 '0' - { 634, 2, 25, 6, 2, -24 }, // 0x31 '1' - { 641, 13, 25, 18, 2, -24 }, // 0x32 '2' - { 682, 12, 25, 16, 2, -24 }, // 0x33 '3' - { 720, 13, 25, 18, 2, -24 }, // 0x34 '4' - { 761, 13, 25, 18, 2, -24 }, // 0x35 '5' - { 802, 13, 25, 18, 2, -24 }, // 0x36 '6' - { 843, 12, 25, 16, 2, -24 }, // 0x37 '7' - { 881, 13, 25, 18, 2, -24 }, // 0x38 '8' - { 922, 13, 25, 18, 2, -24 }, // 0x39 '9' - { 963, 2, 10, 6, 2, -9 }, // 0x3A ':' - { 966, 9, 23, 13, 1, -22 }, // 0x3B ';' - { 992, 6, 25, 10, 2, -24 }, // 0x3C '<' - { 1011, 15, 9, 19, 2, -13 }, // 0x3D '=' - { 1028, 6, 25, 10, 2, -24 }, // 0x3E '>' - { 1047, 13, 25, 18, 2, -24 }, // 0x3F '?' - { 1088, 13, 25, 18, 2, -24 }, // 0x40 '@' - { 1129, 13, 25, 18, 2, -24 }, // 0x41 'A' - { 1170, 13, 25, 18, 2, -24 }, // 0x42 'B' - { 1211, 12, 25, 16, 2, -24 }, // 0x43 'C' - { 1249, 13, 25, 18, 2, -24 }, // 0x44 'D' - { 1290, 12, 25, 16, 2, -24 }, // 0x45 'E' - { 1328, 12, 25, 16, 2, -24 }, // 0x46 'F' - { 1366, 13, 25, 18, 2, -24 }, // 0x47 'G' - { 1407, 13, 25, 18, 2, -24 }, // 0x48 'H' - { 1448, 2, 25, 6, 2, -24 }, // 0x49 'I' - { 1455, 13, 25, 18, 2, -24 }, // 0x4A 'J' - { 1496, 13, 25, 18, 2, -24 }, // 0x4B 'K' - { 1537, 12, 25, 16, 2, -24 }, // 0x4C 'L' - { 1575, 20, 25, 24, 2, -24 }, // 0x4D 'M' - { 1638, 13, 25, 18, 2, -24 }, // 0x4E 'N' - { 1679, 13, 25, 18, 2, -24 }, // 0x4F 'O' - { 1720, 13, 25, 18, 2, -24 }, // 0x50 'P' - { 1761, 13, 25, 18, 2, -24 }, // 0x51 'Q' - { 1802, 13, 25, 18, 2, -24 }, // 0x52 'R' - { 1843, 13, 25, 18, 2, -24 }, // 0x53 'S' - { 1884, 16, 25, 20, 2, -24 }, // 0x54 'T' - { 1934, 13, 25, 18, 2, -24 }, // 0x55 'U' - { 1975, 13, 25, 18, 2, -24 }, // 0x56 'V' - { 2016, 20, 25, 24, 2, -24 }, // 0x57 'W' - { 2079, 13, 25, 18, 2, -24 }, // 0x58 'X' - { 2120, 13, 25, 18, 2, -24 }, // 0x59 'Y' - { 2161, 13, 25, 18, 2, -24 }, // 0x5A 'Z' - { 2202, 9, 25, 13, 2, -24 }, // 0x5B '[' - { 2231, 15, 24, 19, 2, -23 }, // 0x5C '\' - { 2276, 9, 25, 13, 2, -24 }, // 0x5D ']' - { 2305, 25, 6, 29, 2, -16 }, // 0x5E '^' - { 2324, 18, 2, 22, 2, -1 }, // 0x5F '_' - { 2329, 9, 23, 13, 1, -22 }, // 0x60 '`' - { 2355, 13, 25, 18, 2, -24 }, // 0x61 'a' - { 2396, 13, 25, 18, 2, -24 }, // 0x62 'b' - { 2437, 12, 25, 16, 2, -24 }, // 0x63 'c' - { 2475, 13, 25, 18, 2, -24 }, // 0x64 'd' - { 2516, 12, 25, 16, 2, -24 }, // 0x65 'e' - { 2554, 12, 25, 16, 2, -24 }, // 0x66 'f' - { 2592, 13, 25, 18, 2, -24 }, // 0x67 'g' - { 2633, 13, 25, 18, 2, -24 }, // 0x68 'h' - { 2674, 2, 25, 6, 2, -24 }, // 0x69 'i' - { 2681, 13, 25, 18, 2, -24 }, // 0x6A 'j' - { 2722, 13, 25, 18, 2, -24 }, // 0x6B 'k' - { 2763, 12, 25, 16, 2, -24 }, // 0x6C 'l' - { 2801, 20, 25, 24, 2, -24 }, // 0x6D 'm' - { 2864, 13, 25, 18, 2, -24 }, // 0x6E 'n' - { 2905, 13, 25, 18, 2, -24 }, // 0x6F 'o' - { 2946, 13, 25, 18, 2, -24 }, // 0x70 'p' - { 2987, 13, 25, 18, 2, -24 }, // 0x71 'q' - { 3028, 13, 25, 18, 2, -24 }, // 0x72 'r' - { 3069, 13, 25, 18, 2, -24 }, // 0x73 's' - { 3110, 16, 25, 20, 2, -24 }, // 0x74 't' - { 3160, 13, 25, 18, 2, -24 }, // 0x75 'u' - { 3201, 13, 25, 18, 2, -24 }, // 0x76 'v' - { 3242, 20, 25, 24, 2, -24 }, // 0x77 'w' - { 3305, 13, 25, 18, 2, -24 }, // 0x78 'x' - { 3346, 13, 25, 18, 2, -24 }, // 0x79 'y' - { 3387, 13, 25, 18, 2, -24 }, // 0x7A 'z' - { 3428, 13, 25, 17, 2, -24 }, // 0x7B '{' - { 3469, 2, 27, 6, 2, -26 }, // 0x7C '|' - { 3476, 13, 25, 17, 2, -24 }, // 0x7D '}' - { 3517, 9, 23, 13, 1, -22 } }; // 0x7E '~' + { 0, 0, 0, 11, 0, 1 }, // 0x20 ' ' + { 0, 2, 25, 6, 2, -24 }, // 0x21 '!' + { 7, 6, 3, 10, 2, -23 }, // 0x22 '"' + { 10, 15, 16, 19, 2, -15 }, // 0x23 '#' + { 40, 13, 31, 18, 2, -27 }, // 0x24 '$' + { 91, 20, 25, 25, 2, -24 }, // 0x25 '%' + { 154, 79, 25, 83, 2, -24 }, // 0x26 '&' + { 401, 9, 23, 13, 1, -22 }, // 0x27 ''' + { 427, 9, 25, 13, 2, -24 }, // 0x28 '(' + { 456, 9, 25, 13, 2, -24 }, // 0x29 ')' + { 485, 10, 11, 14, 2, -28 }, // 0x2A '*' + { 499, 19, 18, 23, 2, -19 }, // 0x2B '+' + { 542, 4, 4, 8, 2, -3 }, // 0x2C ',' + { 544, 10, 2, 14, 2, -12 }, // 0x2D '-' + { 547, 2, 3, 6, 2, -2 }, // 0x2E '.' + { 548, 15, 24, 19, 2, -23 }, // 0x2F '/' + { 593, 13, 25, 18, 2, -24 }, // 0x30 '0' + { 634, 2, 25, 6, 2, -24 }, // 0x31 '1' + { 641, 13, 25, 18, 2, -24 }, // 0x32 '2' + { 682, 12, 25, 16, 2, -24 }, // 0x33 '3' + { 720, 13, 25, 18, 2, -24 }, // 0x34 '4' + { 761, 13, 25, 18, 2, -24 }, // 0x35 '5' + { 802, 13, 25, 18, 2, -24 }, // 0x36 '6' + { 843, 12, 25, 16, 2, -24 }, // 0x37 '7' + { 881, 13, 25, 18, 2, -24 }, // 0x38 '8' + { 922, 13, 25, 18, 2, -24 }, // 0x39 '9' + { 963, 2, 10, 6, 2, -9 }, // 0x3A ':' + { 966, 9, 23, 13, 1, -22 }, // 0x3B ';' + { 992, 6, 25, 10, 2, -24 }, // 0x3C '<' + { 1011, 15, 9, 19, 2, -13 }, // 0x3D '=' + { 1028, 6, 25, 10, 2, -24 }, // 0x3E '>' + { 1047, 13, 25, 18, 2, -24 }, // 0x3F '?' + { 1088, 13, 25, 18, 2, -24 }, // 0x40 '@' + { 1129, 13, 25, 18, 2, -24 }, // 0x41 'A' + { 1170, 13, 25, 18, 2, -24 }, // 0x42 'B' + { 1211, 12, 25, 16, 2, -24 }, // 0x43 'C' + { 1249, 13, 25, 18, 2, -24 }, // 0x44 'D' + { 1290, 12, 25, 16, 2, -24 }, // 0x45 'E' + { 1328, 12, 25, 16, 2, -24 }, // 0x46 'F' + { 1366, 13, 25, 18, 2, -24 }, // 0x47 'G' + { 1407, 13, 25, 18, 2, -24 }, // 0x48 'H' + { 1448, 2, 25, 6, 2, -24 }, // 0x49 'I' + { 1455, 13, 25, 18, 2, -24 }, // 0x4A 'J' + { 1496, 13, 25, 18, 2, -24 }, // 0x4B 'K' + { 1537, 12, 25, 16, 2, -24 }, // 0x4C 'L' + { 1575, 20, 25, 24, 2, -24 }, // 0x4D 'M' + { 1638, 13, 25, 18, 2, -24 }, // 0x4E 'N' + { 1679, 13, 25, 18, 2, -24 }, // 0x4F 'O' + { 1720, 13, 25, 18, 2, -24 }, // 0x50 'P' + { 1761, 13, 25, 18, 2, -24 }, // 0x51 'Q' + { 1802, 13, 25, 18, 2, -24 }, // 0x52 'R' + { 1843, 13, 25, 18, 2, -24 }, // 0x53 'S' + { 1884, 16, 25, 20, 2, -24 }, // 0x54 'T' + { 1934, 13, 25, 18, 2, -24 }, // 0x55 'U' + { 1975, 13, 25, 18, 2, -24 }, // 0x56 'V' + { 2016, 20, 25, 24, 2, -24 }, // 0x57 'W' + { 2079, 13, 25, 18, 2, -24 }, // 0x58 'X' + { 2120, 13, 25, 18, 2, -24 }, // 0x59 'Y' + { 2161, 13, 25, 18, 2, -24 }, // 0x5A 'Z' + { 2202, 9, 25, 13, 2, -24 }, // 0x5B '[' + { 2231, 15, 24, 19, 2, -23 }, // 0x5C '\' + { 2276, 9, 25, 13, 2, -24 }, // 0x5D ']' + { 2305, 25, 6, 29, 2, -16 }, // 0x5E '^' + { 2324, 18, 2, 22, 2, -1 }, // 0x5F '_' + { 2329, 9, 23, 13, 1, -22 }, // 0x60 '`' + { 2355, 13, 25, 18, 2, -24 }, // 0x61 'a' + { 2396, 13, 25, 18, 2, -24 }, // 0x62 'b' + { 2437, 12, 25, 16, 2, -24 }, // 0x63 'c' + { 2475, 13, 25, 18, 2, -24 }, // 0x64 'd' + { 2516, 12, 25, 16, 2, -24 }, // 0x65 'e' + { 2554, 12, 25, 16, 2, -24 }, // 0x66 'f' + { 2592, 13, 25, 18, 2, -24 }, // 0x67 'g' + { 2633, 13, 25, 18, 2, -24 }, // 0x68 'h' + { 2674, 2, 25, 6, 2, -24 }, // 0x69 'i' + { 2681, 13, 25, 18, 2, -24 }, // 0x6A 'j' + { 2722, 13, 25, 18, 2, -24 }, // 0x6B 'k' + { 2763, 12, 25, 16, 2, -24 }, // 0x6C 'l' + { 2801, 20, 25, 24, 2, -24 }, // 0x6D 'm' + { 2864, 13, 25, 18, 2, -24 }, // 0x6E 'n' + { 2905, 13, 25, 18, 2, -24 }, // 0x6F 'o' + { 2946, 13, 25, 18, 2, -24 }, // 0x70 'p' + { 2987, 13, 25, 18, 2, -24 }, // 0x71 'q' + { 3028, 13, 25, 18, 2, -24 }, // 0x72 'r' + { 3069, 13, 25, 18, 2, -24 }, // 0x73 's' + { 3110, 16, 25, 20, 2, -24 }, // 0x74 't' + { 3160, 13, 25, 18, 2, -24 }, // 0x75 'u' + { 3201, 13, 25, 18, 2, -24 }, // 0x76 'v' + { 3242, 20, 25, 24, 2, -24 }, // 0x77 'w' + { 3305, 13, 25, 18, 2, -24 }, // 0x78 'x' + { 3346, 13, 25, 18, 2, -24 }, // 0x79 'y' + { 3387, 13, 25, 18, 2, -24 }, // 0x7A 'z' + { 3428, 13, 25, 17, 2, -24 }, // 0x7B '{' + { 3469, 2, 27, 6, 2, -26 }, // 0x7C '|' + { 3476, 13, 25, 17, 2, -24 }, // 0x7D '}' + { 3517, 9, 23, 13, 1, -22 } }; // 0x7E '~' const GFXfont Seven_Segment18pt7b PROGMEM = { (uint8_t *)Seven_Segment18pt7bBitmaps, (GFXglyph *)Seven_Segment18pt7bGlyphs, - 0x20, 0x7E, 36 }; + 0x20, 0x7E, 36 }; // Approx. 4215 bytes +#endif // ifndef FONTS_SEVEN_SEGMENT18PT7B_H diff --git a/src/src/Static/Fonts/Seven_Segment24pt7b.h b/src/src/Static/Fonts/Seven_Segment24pt7b.h index 0e59a6df6..1046b4dbc 100644 --- a/src/src/Static/Fonts/Seven_Segment24pt7b.h +++ b/src/src/Static/Fonts/Seven_Segment24pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_SEVEN_SEGMENT24PT7B_H +#define FONTS_SEVEN_SEGMENT24PT7B_H const uint8_t Seven_Segment24pt7bBitmaps[] PROGMEM = { 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x01, 0xBF, 0x40, 0x45, 0xDF, 0xBF, 0x34, 0x40, 0x00, 0x61, 0x80, 0x07, 0x3C, 0x00, @@ -532,105 +534,106 @@ const uint8_t Seven_Segment24pt7bBitmaps[] PROGMEM = { 0x03, 0x80, 0x38, 0x03, 0xFF, 0xFF, 0xFF }; const GFXglyph Seven_Segment24pt7bGlyphs[] PROGMEM = { - { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' - { 0, 3, 33, 9, 3, -32 }, // 0x21 '!' - { 13, 7, 5, 13, 3, -32 }, // 0x22 '"' - { 18, 20, 22, 26, 3, -21 }, // 0x23 '#' - { 73, 18, 41, 24, 3, -36 }, // 0x24 '$' - { 166, 27, 33, 33, 3, -32 }, // 0x25 '%' - { 278, 105, 33, 111, 3, -32 }, // 0x26 '&' - { 712, 12, 32, 17, 2, -31 }, // 0x27 ''' - { 760, 12, 33, 18, 3, -32 }, // 0x28 '(' - { 810, 12, 33, 18, 3, -32 }, // 0x29 ')' - { 860, 14, 15, 19, 3, -38 }, // 0x2A '*' - { 887, 25, 25, 31, 3, -27 }, // 0x2B '+' - { 966, 5, 5, 11, 3, -4 }, // 0x2C ',' - { 970, 13, 3, 19, 3, -17 }, // 0x2D '-' - { 975, 3, 5, 9, 3, -4 }, // 0x2E '.' - { 977, 20, 32, 25, 3, -31 }, // 0x2F '/' - { 1057, 18, 33, 24, 3, -32 }, // 0x30 '0' - { 1132, 3, 33, 9, 3, -32 }, // 0x31 '1' - { 1145, 18, 33, 24, 3, -32 }, // 0x32 '2' - { 1220, 16, 33, 21, 3, -32 }, // 0x33 '3' - { 1286, 18, 33, 24, 3, -32 }, // 0x34 '4' - { 1361, 18, 33, 24, 3, -32 }, // 0x35 '5' - { 1436, 18, 33, 24, 3, -32 }, // 0x36 '6' - { 1511, 16, 33, 21, 3, -32 }, // 0x37 '7' - { 1577, 18, 33, 24, 3, -32 }, // 0x38 '8' - { 1652, 18, 33, 24, 3, -32 }, // 0x39 '9' - { 1727, 3, 14, 9, 3, -13 }, // 0x3A ':' - { 1733, 12, 32, 17, 2, -31 }, // 0x3B ';' - { 1781, 8, 33, 14, 3, -32 }, // 0x3C '<' - { 1814, 20, 11, 26, 3, -17 }, // 0x3D '=' - { 1842, 8, 33, 14, 3, -32 }, // 0x3E '>' - { 1875, 18, 33, 24, 3, -32 }, // 0x3F '?' - { 1950, 18, 33, 24, 3, -32 }, // 0x40 '@' - { 2025, 18, 33, 24, 3, -32 }, // 0x41 'A' - { 2100, 18, 33, 24, 3, -32 }, // 0x42 'B' - { 2175, 16, 33, 21, 3, -32 }, // 0x43 'C' - { 2241, 18, 33, 24, 3, -32 }, // 0x44 'D' - { 2316, 16, 33, 21, 3, -32 }, // 0x45 'E' - { 2382, 16, 33, 21, 3, -32 }, // 0x46 'F' - { 2448, 18, 33, 24, 3, -32 }, // 0x47 'G' - { 2523, 18, 33, 24, 3, -32 }, // 0x48 'H' - { 2598, 3, 33, 9, 3, -32 }, // 0x49 'I' - { 2611, 18, 33, 24, 3, -32 }, // 0x4A 'J' - { 2686, 18, 33, 24, 3, -32 }, // 0x4B 'K' - { 2761, 16, 33, 21, 3, -32 }, // 0x4C 'L' - { 2827, 26, 33, 32, 3, -32 }, // 0x4D 'M' - { 2935, 18, 33, 24, 3, -32 }, // 0x4E 'N' - { 3010, 18, 33, 24, 3, -32 }, // 0x4F 'O' - { 3085, 18, 33, 24, 3, -32 }, // 0x50 'P' - { 3160, 18, 33, 24, 3, -32 }, // 0x51 'Q' - { 3235, 18, 33, 24, 3, -32 }, // 0x52 'R' - { 3310, 18, 33, 24, 3, -32 }, // 0x53 'S' - { 3385, 22, 33, 28, 3, -32 }, // 0x54 'T' - { 3476, 18, 33, 24, 3, -32 }, // 0x55 'U' - { 3551, 18, 33, 24, 3, -32 }, // 0x56 'V' - { 3626, 26, 33, 32, 3, -32 }, // 0x57 'W' - { 3734, 18, 33, 24, 3, -32 }, // 0x58 'X' - { 3809, 18, 33, 24, 3, -32 }, // 0x59 'Y' - { 3884, 18, 33, 24, 3, -32 }, // 0x5A 'Z' - { 3959, 12, 33, 18, 3, -32 }, // 0x5B '[' - { 4009, 20, 32, 25, 3, -31 }, // 0x5C '\' - { 4089, 12, 33, 18, 3, -32 }, // 0x5D ']' - { 4139, 33, 8, 39, 3, -21 }, // 0x5E '^' - { 4172, 23, 3, 29, 3, -2 }, // 0x5F '_' - { 4181, 12, 32, 17, 2, -31 }, // 0x60 '`' - { 4229, 18, 33, 24, 3, -32 }, // 0x61 'a' - { 4304, 18, 33, 24, 3, -32 }, // 0x62 'b' - { 4379, 16, 33, 21, 3, -32 }, // 0x63 'c' - { 4445, 18, 33, 24, 3, -32 }, // 0x64 'd' - { 4520, 16, 33, 21, 3, -32 }, // 0x65 'e' - { 4586, 16, 33, 21, 3, -32 }, // 0x66 'f' - { 4652, 18, 33, 24, 3, -32 }, // 0x67 'g' - { 4727, 18, 33, 24, 3, -32 }, // 0x68 'h' - { 4802, 3, 33, 9, 3, -32 }, // 0x69 'i' - { 4815, 18, 33, 24, 3, -32 }, // 0x6A 'j' - { 4890, 18, 33, 24, 3, -32 }, // 0x6B 'k' - { 4965, 16, 33, 21, 3, -32 }, // 0x6C 'l' - { 5031, 26, 33, 32, 3, -32 }, // 0x6D 'm' - { 5139, 18, 33, 24, 3, -32 }, // 0x6E 'n' - { 5214, 18, 33, 24, 3, -32 }, // 0x6F 'o' - { 5289, 18, 33, 24, 3, -32 }, // 0x70 'p' - { 5364, 18, 33, 24, 3, -32 }, // 0x71 'q' - { 5439, 18, 33, 24, 3, -32 }, // 0x72 'r' - { 5514, 18, 33, 24, 3, -32 }, // 0x73 's' - { 5589, 22, 33, 28, 3, -32 }, // 0x74 't' - { 5680, 18, 33, 24, 3, -32 }, // 0x75 'u' - { 5755, 18, 33, 24, 3, -32 }, // 0x76 'v' - { 5830, 26, 33, 32, 3, -32 }, // 0x77 'w' - { 5938, 18, 33, 24, 3, -32 }, // 0x78 'x' - { 6013, 18, 33, 24, 3, -32 }, // 0x79 'y' - { 6088, 18, 33, 24, 3, -32 }, // 0x7A 'z' - { 6163, 17, 33, 23, 3, -32 }, // 0x7B '{' - { 6234, 3, 36, 9, 3, -35 }, // 0x7C '|' - { 6248, 17, 33, 23, 3, -32 }, // 0x7D '}' - { 6319, 12, 32, 17, 2, -31 } }; // 0x7E '~' + { 0, 0, 0, 14, 0, 1 }, // 0x20 ' ' + { 0, 3, 33, 9, 3, -32 }, // 0x21 '!' + { 13, 7, 5, 13, 3, -32 }, // 0x22 '"' + { 18, 20, 22, 26, 3, -21 }, // 0x23 '#' + { 73, 18, 41, 24, 3, -36 }, // 0x24 '$' + { 166, 27, 33, 33, 3, -32 }, // 0x25 '%' + { 278, 105, 33, 111, 3, -32 }, // 0x26 '&' + { 712, 12, 32, 17, 2, -31 }, // 0x27 ''' + { 760, 12, 33, 18, 3, -32 }, // 0x28 '(' + { 810, 12, 33, 18, 3, -32 }, // 0x29 ')' + { 860, 14, 15, 19, 3, -38 }, // 0x2A '*' + { 887, 25, 25, 31, 3, -27 }, // 0x2B '+' + { 966, 5, 5, 11, 3, -4 }, // 0x2C ',' + { 970, 13, 3, 19, 3, -17 }, // 0x2D '-' + { 975, 3, 5, 9, 3, -4 }, // 0x2E '.' + { 977, 20, 32, 25, 3, -31 }, // 0x2F '/' + { 1057, 18, 33, 24, 3, -32 }, // 0x30 '0' + { 1132, 3, 33, 9, 3, -32 }, // 0x31 '1' + { 1145, 18, 33, 24, 3, -32 }, // 0x32 '2' + { 1220, 16, 33, 21, 3, -32 }, // 0x33 '3' + { 1286, 18, 33, 24, 3, -32 }, // 0x34 '4' + { 1361, 18, 33, 24, 3, -32 }, // 0x35 '5' + { 1436, 18, 33, 24, 3, -32 }, // 0x36 '6' + { 1511, 16, 33, 21, 3, -32 }, // 0x37 '7' + { 1577, 18, 33, 24, 3, -32 }, // 0x38 '8' + { 1652, 18, 33, 24, 3, -32 }, // 0x39 '9' + { 1727, 3, 14, 9, 3, -13 }, // 0x3A ':' + { 1733, 12, 32, 17, 2, -31 }, // 0x3B ';' + { 1781, 8, 33, 14, 3, -32 }, // 0x3C '<' + { 1814, 20, 11, 26, 3, -17 }, // 0x3D '=' + { 1842, 8, 33, 14, 3, -32 }, // 0x3E '>' + { 1875, 18, 33, 24, 3, -32 }, // 0x3F '?' + { 1950, 18, 33, 24, 3, -32 }, // 0x40 '@' + { 2025, 18, 33, 24, 3, -32 }, // 0x41 'A' + { 2100, 18, 33, 24, 3, -32 }, // 0x42 'B' + { 2175, 16, 33, 21, 3, -32 }, // 0x43 'C' + { 2241, 18, 33, 24, 3, -32 }, // 0x44 'D' + { 2316, 16, 33, 21, 3, -32 }, // 0x45 'E' + { 2382, 16, 33, 21, 3, -32 }, // 0x46 'F' + { 2448, 18, 33, 24, 3, -32 }, // 0x47 'G' + { 2523, 18, 33, 24, 3, -32 }, // 0x48 'H' + { 2598, 3, 33, 9, 3, -32 }, // 0x49 'I' + { 2611, 18, 33, 24, 3, -32 }, // 0x4A 'J' + { 2686, 18, 33, 24, 3, -32 }, // 0x4B 'K' + { 2761, 16, 33, 21, 3, -32 }, // 0x4C 'L' + { 2827, 26, 33, 32, 3, -32 }, // 0x4D 'M' + { 2935, 18, 33, 24, 3, -32 }, // 0x4E 'N' + { 3010, 18, 33, 24, 3, -32 }, // 0x4F 'O' + { 3085, 18, 33, 24, 3, -32 }, // 0x50 'P' + { 3160, 18, 33, 24, 3, -32 }, // 0x51 'Q' + { 3235, 18, 33, 24, 3, -32 }, // 0x52 'R' + { 3310, 18, 33, 24, 3, -32 }, // 0x53 'S' + { 3385, 22, 33, 28, 3, -32 }, // 0x54 'T' + { 3476, 18, 33, 24, 3, -32 }, // 0x55 'U' + { 3551, 18, 33, 24, 3, -32 }, // 0x56 'V' + { 3626, 26, 33, 32, 3, -32 }, // 0x57 'W' + { 3734, 18, 33, 24, 3, -32 }, // 0x58 'X' + { 3809, 18, 33, 24, 3, -32 }, // 0x59 'Y' + { 3884, 18, 33, 24, 3, -32 }, // 0x5A 'Z' + { 3959, 12, 33, 18, 3, -32 }, // 0x5B '[' + { 4009, 20, 32, 25, 3, -31 }, // 0x5C '\' + { 4089, 12, 33, 18, 3, -32 }, // 0x5D ']' + { 4139, 33, 8, 39, 3, -21 }, // 0x5E '^' + { 4172, 23, 3, 29, 3, -2 }, // 0x5F '_' + { 4181, 12, 32, 17, 2, -31 }, // 0x60 '`' + { 4229, 18, 33, 24, 3, -32 }, // 0x61 'a' + { 4304, 18, 33, 24, 3, -32 }, // 0x62 'b' + { 4379, 16, 33, 21, 3, -32 }, // 0x63 'c' + { 4445, 18, 33, 24, 3, -32 }, // 0x64 'd' + { 4520, 16, 33, 21, 3, -32 }, // 0x65 'e' + { 4586, 16, 33, 21, 3, -32 }, // 0x66 'f' + { 4652, 18, 33, 24, 3, -32 }, // 0x67 'g' + { 4727, 18, 33, 24, 3, -32 }, // 0x68 'h' + { 4802, 3, 33, 9, 3, -32 }, // 0x69 'i' + { 4815, 18, 33, 24, 3, -32 }, // 0x6A 'j' + { 4890, 18, 33, 24, 3, -32 }, // 0x6B 'k' + { 4965, 16, 33, 21, 3, -32 }, // 0x6C 'l' + { 5031, 26, 33, 32, 3, -32 }, // 0x6D 'm' + { 5139, 18, 33, 24, 3, -32 }, // 0x6E 'n' + { 5214, 18, 33, 24, 3, -32 }, // 0x6F 'o' + { 5289, 18, 33, 24, 3, -32 }, // 0x70 'p' + { 5364, 18, 33, 24, 3, -32 }, // 0x71 'q' + { 5439, 18, 33, 24, 3, -32 }, // 0x72 'r' + { 5514, 18, 33, 24, 3, -32 }, // 0x73 's' + { 5589, 22, 33, 28, 3, -32 }, // 0x74 't' + { 5680, 18, 33, 24, 3, -32 }, // 0x75 'u' + { 5755, 18, 33, 24, 3, -32 }, // 0x76 'v' + { 5830, 26, 33, 32, 3, -32 }, // 0x77 'w' + { 5938, 18, 33, 24, 3, -32 }, // 0x78 'x' + { 6013, 18, 33, 24, 3, -32 }, // 0x79 'y' + { 6088, 18, 33, 24, 3, -32 }, // 0x7A 'z' + { 6163, 17, 33, 23, 3, -32 }, // 0x7B '{' + { 6234, 3, 36, 9, 3, -35 }, // 0x7C '|' + { 6248, 17, 33, 23, 3, -32 }, // 0x7D '}' + { 6319, 12, 32, 17, 2, -31 } }; // 0x7E '~' const GFXfont Seven_Segment24pt7b PROGMEM = { (uint8_t *)Seven_Segment24pt7bBitmaps, (GFXglyph *)Seven_Segment24pt7bGlyphs, - 0x20, 0x7E, 49 }; + 0x20, 0x7E, 49 }; // Approx. 7039 bytes +#endif // ifndef FONTS_SEVEN_SEGMENT24PT7B_H diff --git a/src/src/Static/Fonts/angelina12pt7b.h b/src/src/Static/Fonts/angelina12pt7b.h index 08ca96964..96fd12680 100644 --- a/src/src/Static/Fonts/angelina12pt7b.h +++ b/src/src/Static/Fonts/angelina12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_ANGELINA12PT7B_H +#define FONTS_ANGELINA12PT7B_H const uint8_t angelina12pt7bBitmaps[] PROGMEM = { 0x00, 0x5A, 0xAA, 0xA4, 0x10, 0x6F, 0x00, 0x00, 0x08, 0x01, 0x20, 0x04, 0x40, 0x3F, 0xE7, 0xA2, 0x10, 0x88, 0x01, 0x10, 0x07, 0xFF, 0xF8, 0x80, @@ -115,105 +117,106 @@ const uint8_t angelina12pt7bBitmaps[] PROGMEM = { 0xC0 }; const GFXglyph angelina12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' - { 1, 2, 14, 5, 1, -11 }, // 0x21 '!' - { 5, 3, 3, 5, 1, -9 }, // 0x22 '"' - { 7, 15, 14, 16, 0, -13 }, // 0x23 '#' - { 34, 6, 13, 6, 0, -14 }, // 0x24 '$' - { 44, 12, 14, 10, -1, -11 }, // 0x25 '%' - { 65, 10, 13, 12, 1, -10 }, // 0x26 '&' - { 82, 2, 3, 3, 0, -9 }, // 0x27 ''' - { 83, 5, 15, 5, 0, -12 }, // 0x28 '(' - { 93, 5, 15, 5, 0, -12 }, // 0x29 ')' - { 103, 1, 1, 29, 0, 0 }, // 0x2A '*' - { 104, 1, 1, 29, 0, 0 }, // 0x2B '+' - { 105, 3, 3, 5, 1, 0 }, // 0x2C ',' - { 107, 7, 2, 8, 1, -5 }, // 0x2D '-' - { 109, 1, 1, 3, 1, 0 }, // 0x2E '.' - { 110, 12, 14, 10, -1, -11 }, // 0x2F '/' - { 131, 9, 14, 10, 0, -11 }, // 0x30 '0' - { 147, 6, 14, 6, 0, -11 }, // 0x31 '1' - { 158, 10, 13, 10, 0, -10 }, // 0x32 '2' - { 175, 13, 14, 11, -1, -11 }, // 0x33 '3' - { 198, 11, 15, 10, -1, -11 }, // 0x34 '4' - { 219, 10, 14, 10, 0, -11 }, // 0x35 '5' - { 237, 9, 14, 9, 0, -11 }, // 0x36 '6' - { 253, 9, 14, 8, 0, -11 }, // 0x37 '7' - { 269, 11, 14, 10, -1, -11 }, // 0x38 '8' - { 289, 8, 15, 9, 0, -11 }, // 0x39 '9' - { 304, 2, 7, 3, 1, -5 }, // 0x3A ':' - { 306, 4, 8, 5, 0, -5 }, // 0x3B ';' - { 310, 1, 1, 29, 0, 0 }, // 0x3C '<' - { 311, 1, 1, 29, 0, 0 }, // 0x3D '=' - { 312, 1, 1, 29, 0, 0 }, // 0x3E '>' - { 313, 10, 14, 10, 0, -11 }, // 0x3F '?' - { 331, 10, 10, 12, 0, -9 }, // 0x40 '@' - { 344, 13, 16, 13, 0, -12 }, // 0x41 'A' - { 370, 14, 14, 13, -1, -11 }, // 0x42 'B' - { 395, 10, 15, 10, 0, -12 }, // 0x43 'C' - { 414, 14, 14, 14, -1, -11 }, // 0x44 'D' - { 439, 11, 14, 11, 0, -11 }, // 0x45 'E' - { 459, 11, 15, 7, -1, -12 }, // 0x46 'F' - { 480, 12, 16, 12, 0, -12 }, // 0x47 'G' - { 504, 15, 15, 15, -1, -12 }, // 0x48 'H' - { 533, 9, 15, 8, -1, -12 }, // 0x49 'I' - { 550, 13, 20, 8, -4, -13 }, // 0x4A 'J' - { 583, 11, 14, 9, -1, -11 }, // 0x4B 'K' - { 603, 12, 15, 10, -1, -12 }, // 0x4C 'L' - { 626, 20, 15, 19, -1, -12 }, // 0x4D 'M' - { 664, 13, 14, 13, 0, -11 }, // 0x4E 'N' - { 687, 10, 15, 11, 0, -12 }, // 0x4F 'O' - { 706, 14, 16, 13, -1, -13 }, // 0x50 'P' - { 734, 10, 15, 11, 0, -12 }, // 0x51 'Q' - { 753, 14, 16, 13, -1, -13 }, // 0x52 'R' - { 781, 10, 15, 10, -1, -12 }, // 0x53 'S' - { 800, 13, 15, 10, -1, -12 }, // 0x54 'T' - { 825, 12, 15, 12, 0, -12 }, // 0x55 'U' - { 848, 14, 15, 12, -1, -12 }, // 0x56 'V' - { 875, 18, 16, 18, -1, -13 }, // 0x57 'W' - { 911, 12, 16, 12, -1, -13 }, // 0x58 'X' - { 935, 13, 23, 10, -2, -13 }, // 0x59 'Y' - { 973, 14, 15, 11, -1, -12 }, // 0x5A 'Z' - { 1000, 7, 17, 8, 1, -14 }, // 0x5B '[' - { 1015, 1, 1, 29, 0, 0 }, // 0x5C '\' - { 1016, 7, 17, 8, 0, -14 }, // 0x5D ']' - { 1031, 1, 1, 29, 0, 0 }, // 0x5E '^' - { 1032, 1, 1, 29, 0, 0 }, // 0x5F '_' - { 1033, 4, 2, 7, 1, -10 }, // 0x60 '`' - { 1034, 9, 11, 8, 0, -8 }, // 0x61 'a' - { 1047, 10, 15, 10, 0, -12 }, // 0x62 'b' - { 1066, 7, 9, 8, 0, -7 }, // 0x63 'c' - { 1074, 10, 15, 10, 0, -12 }, // 0x64 'd' - { 1093, 7, 9, 7, 0, -7 }, // 0x65 'e' - { 1101, 7, 15, 6, 0, -12 }, // 0x66 'f' - { 1115, 8, 17, 9, 0, -8 }, // 0x67 'g' - { 1132, 8, 15, 8, 0, -12 }, // 0x68 'h' - { 1147, 3, 13, 4, 0, -10 }, // 0x69 'i' - { 1152, 9, 18, 4, -4, -9 }, // 0x6A 'j' - { 1173, 8, 15, 8, 0, -12 }, // 0x6B 'k' - { 1188, 3, 15, 4, 0, -12 }, // 0x6C 'l' - { 1194, 14, 8, 14, -1, -6 }, // 0x6D 'm' - { 1208, 9, 8, 8, 0, -6 }, // 0x6E 'n' - { 1217, 6, 9, 7, 0, -7 }, // 0x6F 'o' - { 1224, 7, 15, 8, 0, -7 }, // 0x70 'p' - { 1238, 9, 15, 8, -1, -7 }, // 0x71 'q' - { 1255, 5, 9, 6, 0, -7 }, // 0x72 'r' - { 1261, 6, 9, 6, 0, -7 }, // 0x73 's' - { 1268, 6, 11, 6, 0, -9 }, // 0x74 't' - { 1277, 8, 9, 8, 0, -7 }, // 0x75 'u' - { 1286, 9, 9, 7, 0, -7 }, // 0x76 'v' - { 1297, 11, 10, 12, 0, -8 }, // 0x77 'w' - { 1311, 9, 12, 9, 0, -9 }, // 0x78 'x' - { 1325, 9, 16, 8, -1, -8 }, // 0x79 'y' - { 1343, 9, 8, 9, 0, -6 }, // 0x7A 'z' - { 1352, 1, 1, 29, 0, 0 }, // 0x7B '{' - { 1353, 1, 1, 29, 0, 0 }, // 0x7C '|' - { 1354, 1, 1, 29, 0, 0 }, // 0x7D '}' - { 1355, 5, 2, 7, 1, -9 } }; // 0x7E '~' + { 0, 1, 1, 6, 0, 0 }, // 0x20 ' ' + { 1, 2, 14, 5, 1, -11 }, // 0x21 '!' + { 5, 3, 3, 5, 1, -9 }, // 0x22 '"' + { 7, 15, 14, 16, 0, -13 }, // 0x23 '#' + { 34, 6, 13, 6, 0, -14 }, // 0x24 '$' + { 44, 12, 14, 10, -1, -11 }, // 0x25 '%' + { 65, 10, 13, 12, 1, -10 }, // 0x26 '&' + { 82, 2, 3, 3, 0, -9 }, // 0x27 ''' + { 83, 5, 15, 5, 0, -12 }, // 0x28 '(' + { 93, 5, 15, 5, 0, -12 }, // 0x29 ')' + { 103, 1, 1, 29, 0, 0 }, // 0x2A '*' + { 104, 1, 1, 29, 0, 0 }, // 0x2B '+' + { 105, 3, 3, 5, 1, 0 }, // 0x2C ',' + { 107, 7, 2, 8, 1, -5 }, // 0x2D '-' + { 109, 1, 1, 3, 1, 0 }, // 0x2E '.' + { 110, 12, 14, 10, -1, -11 }, // 0x2F '/' + { 131, 9, 14, 10, 0, -11 }, // 0x30 '0' + { 147, 6, 14, 6, 0, -11 }, // 0x31 '1' + { 158, 10, 13, 10, 0, -10 }, // 0x32 '2' + { 175, 13, 14, 11, -1, -11 }, // 0x33 '3' + { 198, 11, 15, 10, -1, -11 }, // 0x34 '4' + { 219, 10, 14, 10, 0, -11 }, // 0x35 '5' + { 237, 9, 14, 9, 0, -11 }, // 0x36 '6' + { 253, 9, 14, 8, 0, -11 }, // 0x37 '7' + { 269, 11, 14, 10, -1, -11 }, // 0x38 '8' + { 289, 8, 15, 9, 0, -11 }, // 0x39 '9' + { 304, 2, 7, 3, 1, -5 }, // 0x3A ':' + { 306, 4, 8, 5, 0, -5 }, // 0x3B ';' + { 310, 1, 1, 29, 0, 0 }, // 0x3C '<' + { 311, 1, 1, 29, 0, 0 }, // 0x3D '=' + { 312, 1, 1, 29, 0, 0 }, // 0x3E '>' + { 313, 10, 14, 10, 0, -11 }, // 0x3F '?' + { 331, 10, 10, 12, 0, -9 }, // 0x40 '@' + { 344, 13, 16, 13, 0, -12 }, // 0x41 'A' + { 370, 14, 14, 13, -1, -11 }, // 0x42 'B' + { 395, 10, 15, 10, 0, -12 }, // 0x43 'C' + { 414, 14, 14, 14, -1, -11 }, // 0x44 'D' + { 439, 11, 14, 11, 0, -11 }, // 0x45 'E' + { 459, 11, 15, 7, -1, -12 }, // 0x46 'F' + { 480, 12, 16, 12, 0, -12 }, // 0x47 'G' + { 504, 15, 15, 15, -1, -12 }, // 0x48 'H' + { 533, 9, 15, 8, -1, -12 }, // 0x49 'I' + { 550, 13, 20, 8, -4, -13 }, // 0x4A 'J' + { 583, 11, 14, 9, -1, -11 }, // 0x4B 'K' + { 603, 12, 15, 10, -1, -12 }, // 0x4C 'L' + { 626, 20, 15, 19, -1, -12 }, // 0x4D 'M' + { 664, 13, 14, 13, 0, -11 }, // 0x4E 'N' + { 687, 10, 15, 11, 0, -12 }, // 0x4F 'O' + { 706, 14, 16, 13, -1, -13 }, // 0x50 'P' + { 734, 10, 15, 11, 0, -12 }, // 0x51 'Q' + { 753, 14, 16, 13, -1, -13 }, // 0x52 'R' + { 781, 10, 15, 10, -1, -12 }, // 0x53 'S' + { 800, 13, 15, 10, -1, -12 }, // 0x54 'T' + { 825, 12, 15, 12, 0, -12 }, // 0x55 'U' + { 848, 14, 15, 12, -1, -12 }, // 0x56 'V' + { 875, 18, 16, 18, -1, -13 }, // 0x57 'W' + { 911, 12, 16, 12, -1, -13 }, // 0x58 'X' + { 935, 13, 23, 10, -2, -13 }, // 0x59 'Y' + { 973, 14, 15, 11, -1, -12 }, // 0x5A 'Z' + { 1000, 7, 17, 8, 1, -14 }, // 0x5B '[' + { 1015, 1, 1, 29, 0, 0 }, // 0x5C '\' + { 1016, 7, 17, 8, 0, -14 }, // 0x5D ']' + { 1031, 1, 1, 29, 0, 0 }, // 0x5E '^' + { 1032, 1, 1, 29, 0, 0 }, // 0x5F '_' + { 1033, 4, 2, 7, 1, -10 }, // 0x60 '`' + { 1034, 9, 11, 8, 0, -8 }, // 0x61 'a' + { 1047, 10, 15, 10, 0, -12 }, // 0x62 'b' + { 1066, 7, 9, 8, 0, -7 }, // 0x63 'c' + { 1074, 10, 15, 10, 0, -12 }, // 0x64 'd' + { 1093, 7, 9, 7, 0, -7 }, // 0x65 'e' + { 1101, 7, 15, 6, 0, -12 }, // 0x66 'f' + { 1115, 8, 17, 9, 0, -8 }, // 0x67 'g' + { 1132, 8, 15, 8, 0, -12 }, // 0x68 'h' + { 1147, 3, 13, 4, 0, -10 }, // 0x69 'i' + { 1152, 9, 18, 4, -4, -9 }, // 0x6A 'j' + { 1173, 8, 15, 8, 0, -12 }, // 0x6B 'k' + { 1188, 3, 15, 4, 0, -12 }, // 0x6C 'l' + { 1194, 14, 8, 14, -1, -6 }, // 0x6D 'm' + { 1208, 9, 8, 8, 0, -6 }, // 0x6E 'n' + { 1217, 6, 9, 7, 0, -7 }, // 0x6F 'o' + { 1224, 7, 15, 8, 0, -7 }, // 0x70 'p' + { 1238, 9, 15, 8, -1, -7 }, // 0x71 'q' + { 1255, 5, 9, 6, 0, -7 }, // 0x72 'r' + { 1261, 6, 9, 6, 0, -7 }, // 0x73 's' + { 1268, 6, 11, 6, 0, -9 }, // 0x74 't' + { 1277, 8, 9, 8, 0, -7 }, // 0x75 'u' + { 1286, 9, 9, 7, 0, -7 }, // 0x76 'v' + { 1297, 11, 10, 12, 0, -8 }, // 0x77 'w' + { 1311, 9, 12, 9, 0, -9 }, // 0x78 'x' + { 1325, 9, 16, 8, -1, -8 }, // 0x79 'y' + { 1343, 9, 8, 9, 0, -6 }, // 0x7A 'z' + { 1352, 1, 1, 29, 0, 0 }, // 0x7B '{' + { 1353, 1, 1, 29, 0, 0 }, // 0x7C '|' + { 1354, 1, 1, 29, 0, 0 }, // 0x7D '}' + { 1355, 5, 2, 7, 1, -9 } }; // 0x7E '~' const GFXfont angelina12pt7b PROGMEM = { (uint8_t *)angelina12pt7bBitmaps, (GFXglyph *)angelina12pt7bGlyphs, - 0x20, 0x7E, 25 }; + 0x20, 0x7E, 25 }; // Approx. 2029 bytes +#endif // ifndef FONTS_ANGELINA12PT7B_H diff --git a/src/src/Static/Fonts/angelina8pt7b.h b/src/src/Static/Fonts/angelina8pt7b.h index eff391dac..732c59679 100644 --- a/src/src/Static/Fonts/angelina8pt7b.h +++ b/src/src/Static/Fonts/angelina8pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_ANGELINA8PT7B_H +#define FONTS_ANGELINA8PT7B_H const uint8_t angelina8pt7bBitmaps[] PROGMEM = { 0x00, 0xAA, 0xA8, 0x80, 0x5C, 0x00, 0x81, 0x40, 0xA0, 0xFF, 0x54, 0x07, 0xFE, 0x40, 0xA0, 0x40, 0x00, 0x00, 0x23, 0x4C, 0xF3, 0xAE, 0x11, 0x1E, @@ -53,105 +55,106 @@ const uint8_t angelina8pt7bBitmaps[] PROGMEM = { 0x27, 0x00, 0x7C, 0x21, 0x08, 0xDF, 0x90, 0x00, 0x00, 0x00, 0xE0 }; const GFXglyph angelina8pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 4, 0, 0 }, // 0x20 ' ' - { 1, 2, 9, 3, 1, -7 }, // 0x21 '!' - { 4, 2, 3, 3, 0, -6 }, // 0x22 '"' - { 5, 10, 10, 10, 0, -9 }, // 0x23 '#' - { 18, 4, 8, 4, 0, -9 }, // 0x24 '$' - { 22, 8, 9, 7, 0, -7 }, // 0x25 '%' - { 31, 7, 8, 8, 0, -6 }, // 0x26 '&' - { 38, 1, 3, 2, 0, -6 }, // 0x27 ''' - { 39, 3, 9, 4, 0, -7 }, // 0x28 '(' - { 43, 3, 9, 4, 0, -7 }, // 0x29 ')' - { 47, 1, 1, 20, 0, 0 }, // 0x2A '*' - { 48, 1, 1, 20, 0, 0 }, // 0x2B '+' - { 49, 2, 2, 3, 0, 0 }, // 0x2C ',' - { 50, 4, 1, 5, 0, -3 }, // 0x2D '-' - { 51, 1, 1, 2, 1, 0 }, // 0x2E '.' - { 52, 8, 9, 7, 0, -7 }, // 0x2F '/' - { 61, 6, 9, 6, 0, -7 }, // 0x30 '0' - { 68, 4, 9, 4, 0, -7 }, // 0x31 '1' - { 73, 7, 9, 7, 0, -7 }, // 0x32 '2' - { 81, 8, 9, 7, -1, -7 }, // 0x33 '3' - { 90, 7, 10, 7, 0, -7 }, // 0x34 '4' - { 99, 7, 9, 7, 0, -7 }, // 0x35 '5' - { 107, 6, 9, 6, 0, -7 }, // 0x36 '6' - { 114, 6, 9, 6, 0, -7 }, // 0x37 '7' - { 121, 7, 9, 6, 0, -7 }, // 0x38 '8' - { 129, 5, 10, 6, 0, -7 }, // 0x39 '9' - { 136, 1, 4, 2, 1, -3 }, // 0x3A ':' - { 137, 3, 5, 3, 0, -3 }, // 0x3B ';' - { 139, 1, 1, 20, 0, 0 }, // 0x3C '<' - { 140, 1, 1, 20, 0, 0 }, // 0x3D '=' - { 141, 1, 1, 20, 0, 0 }, // 0x3E '>' - { 142, 7, 9, 7, 0, -7 }, // 0x3F '?' - { 150, 7, 7, 8, 0, -6 }, // 0x40 '@' - { 157, 9, 10, 9, 0, -7 }, // 0x41 'A' - { 169, 9, 9, 9, 0, -7 }, // 0x42 'B' - { 180, 7, 10, 6, 0, -8 }, // 0x43 'C' - { 189, 9, 9, 9, 0, -7 }, // 0x44 'D' - { 200, 8, 9, 7, 0, -7 }, // 0x45 'E' - { 209, 7, 9, 5, 0, -7 }, // 0x46 'F' - { 217, 8, 11, 8, 0, -8 }, // 0x47 'G' - { 228, 10, 10, 10, -1, -8 }, // 0x48 'H' - { 241, 6, 10, 6, 0, -8 }, // 0x49 'I' - { 249, 9, 13, 5, -2, -8 }, // 0x4A 'J' - { 264, 7, 9, 6, 0, -7 }, // 0x4B 'K' - { 272, 8, 10, 7, 0, -8 }, // 0x4C 'L' - { 282, 14, 10, 13, -1, -8 }, // 0x4D 'M' - { 300, 8, 9, 9, 0, -7 }, // 0x4E 'N' - { 309, 7, 10, 7, 0, -8 }, // 0x4F 'O' - { 318, 9, 11, 9, 0, -9 }, // 0x50 'P' - { 331, 7, 10, 7, 0, -8 }, // 0x51 'Q' - { 340, 9, 10, 8, -1, -8 }, // 0x52 'R' - { 352, 7, 10, 6, 0, -8 }, // 0x53 'S' - { 361, 9, 10, 7, -1, -8 }, // 0x54 'T' - { 373, 8, 9, 8, 0, -7 }, // 0x55 'U' - { 382, 9, 9, 8, -1, -7 }, // 0x56 'V' - { 393, 12, 11, 12, 0, -9 }, // 0x57 'W' - { 410, 8, 10, 8, 0, -8 }, // 0x58 'X' - { 420, 8, 16, 7, 0, -9 }, // 0x59 'Y' - { 436, 9, 10, 7, 0, -8 }, // 0x5A 'Z' - { 448, 4, 11, 6, 1, -9 }, // 0x5B '[' - { 454, 1, 1, 20, 0, 0 }, // 0x5C '\' - { 455, 5, 11, 6, 1, -9 }, // 0x5D ']' - { 462, 1, 1, 20, 0, 0 }, // 0x5E '^' - { 463, 1, 1, 20, 0, 0 }, // 0x5F '_' - { 464, 3, 1, 5, 1, -6 }, // 0x60 '`' - { 465, 6, 7, 6, 0, -5 }, // 0x61 'a' - { 471, 6, 9, 7, 0, -7 }, // 0x62 'b' - { 478, 5, 7, 5, 0, -5 }, // 0x63 'c' - { 483, 6, 10, 7, 0, -8 }, // 0x64 'd' - { 491, 5, 7, 5, 0, -5 }, // 0x65 'e' - { 496, 4, 10, 4, 1, -8 }, // 0x66 'f' - { 501, 6, 11, 6, 0, -5 }, // 0x67 'g' - { 510, 5, 10, 5, 0, -8 }, // 0x68 'h' - { 517, 2, 8, 2, 0, -6 }, // 0x69 'i' - { 519, 6, 12, 3, -3, -6 }, // 0x6A 'j' - { 528, 5, 10, 5, 0, -8 }, // 0x6B 'k' - { 535, 2, 10, 3, 0, -8 }, // 0x6C 'l' - { 538, 9, 6, 9, 0, -4 }, // 0x6D 'm' - { 545, 6, 6, 5, 0, -4 }, // 0x6E 'n' - { 550, 4, 7, 5, 0, -5 }, // 0x6F 'o' - { 554, 5, 11, 5, 0, -5 }, // 0x70 'p' - { 561, 6, 11, 5, 0, -5 }, // 0x71 'q' - { 570, 4, 7, 4, 0, -5 }, // 0x72 'r' - { 574, 4, 7, 4, 0, -5 }, // 0x73 's' - { 578, 4, 8, 4, 0, -6 }, // 0x74 't' - { 582, 6, 6, 5, 0, -4 }, // 0x75 'u' - { 587, 6, 6, 5, 0, -4 }, // 0x76 'v' - { 592, 7, 7, 8, 0, -5 }, // 0x77 'w' - { 599, 6, 7, 6, 0, -5 }, // 0x78 'x' - { 605, 6, 11, 5, -1, -5 }, // 0x79 'y' - { 614, 6, 6, 6, 0, -4 }, // 0x7A 'z' - { 619, 1, 1, 20, 0, 0 }, // 0x7B '{' - { 620, 1, 1, 20, 0, 0 }, // 0x7C '|' - { 621, 1, 1, 20, 0, 0 }, // 0x7D '}' - { 622, 3, 1, 5, 1, -5 } }; // 0x7E '~' + { 0, 1, 1, 4, 0, 0 }, // 0x20 ' ' + { 1, 2, 9, 3, 1, -7 }, // 0x21 '!' + { 4, 2, 3, 3, 0, -6 }, // 0x22 '"' + { 5, 10, 10, 10, 0, -9 }, // 0x23 '#' + { 18, 4, 8, 4, 0, -9 }, // 0x24 '$' + { 22, 8, 9, 7, 0, -7 }, // 0x25 '%' + { 31, 7, 8, 8, 0, -6 }, // 0x26 '&' + { 38, 1, 3, 2, 0, -6 }, // 0x27 ''' + { 39, 3, 9, 4, 0, -7 }, // 0x28 '(' + { 43, 3, 9, 4, 0, -7 }, // 0x29 ')' + { 47, 1, 1, 20, 0, 0 }, // 0x2A '*' + { 48, 1, 1, 20, 0, 0 }, // 0x2B '+' + { 49, 2, 2, 3, 0, 0 }, // 0x2C ',' + { 50, 4, 1, 5, 0, -3 }, // 0x2D '-' + { 51, 1, 1, 2, 1, 0 }, // 0x2E '.' + { 52, 8, 9, 7, 0, -7 }, // 0x2F '/' + { 61, 6, 9, 6, 0, -7 }, // 0x30 '0' + { 68, 4, 9, 4, 0, -7 }, // 0x31 '1' + { 73, 7, 9, 7, 0, -7 }, // 0x32 '2' + { 81, 8, 9, 7, -1, -7 }, // 0x33 '3' + { 90, 7, 10, 7, 0, -7 }, // 0x34 '4' + { 99, 7, 9, 7, 0, -7 }, // 0x35 '5' + { 107, 6, 9, 6, 0, -7 }, // 0x36 '6' + { 114, 6, 9, 6, 0, -7 }, // 0x37 '7' + { 121, 7, 9, 6, 0, -7 }, // 0x38 '8' + { 129, 5, 10, 6, 0, -7 }, // 0x39 '9' + { 136, 1, 4, 2, 1, -3 }, // 0x3A ':' + { 137, 3, 5, 3, 0, -3 }, // 0x3B ';' + { 139, 1, 1, 20, 0, 0 }, // 0x3C '<' + { 140, 1, 1, 20, 0, 0 }, // 0x3D '=' + { 141, 1, 1, 20, 0, 0 }, // 0x3E '>' + { 142, 7, 9, 7, 0, -7 }, // 0x3F '?' + { 150, 7, 7, 8, 0, -6 }, // 0x40 '@' + { 157, 9, 10, 9, 0, -7 }, // 0x41 'A' + { 169, 9, 9, 9, 0, -7 }, // 0x42 'B' + { 180, 7, 10, 6, 0, -8 }, // 0x43 'C' + { 189, 9, 9, 9, 0, -7 }, // 0x44 'D' + { 200, 8, 9, 7, 0, -7 }, // 0x45 'E' + { 209, 7, 9, 5, 0, -7 }, // 0x46 'F' + { 217, 8, 11, 8, 0, -8 }, // 0x47 'G' + { 228, 10, 10, 10, -1, -8 }, // 0x48 'H' + { 241, 6, 10, 6, 0, -8 }, // 0x49 'I' + { 249, 9, 13, 5, -2, -8 }, // 0x4A 'J' + { 264, 7, 9, 6, 0, -7 }, // 0x4B 'K' + { 272, 8, 10, 7, 0, -8 }, // 0x4C 'L' + { 282, 14, 10, 13, -1, -8 }, // 0x4D 'M' + { 300, 8, 9, 9, 0, -7 }, // 0x4E 'N' + { 309, 7, 10, 7, 0, -8 }, // 0x4F 'O' + { 318, 9, 11, 9, 0, -9 }, // 0x50 'P' + { 331, 7, 10, 7, 0, -8 }, // 0x51 'Q' + { 340, 9, 10, 8, -1, -8 }, // 0x52 'R' + { 352, 7, 10, 6, 0, -8 }, // 0x53 'S' + { 361, 9, 10, 7, -1, -8 }, // 0x54 'T' + { 373, 8, 9, 8, 0, -7 }, // 0x55 'U' + { 382, 9, 9, 8, -1, -7 }, // 0x56 'V' + { 393, 12, 11, 12, 0, -9 }, // 0x57 'W' + { 410, 8, 10, 8, 0, -8 }, // 0x58 'X' + { 420, 8, 16, 7, 0, -9 }, // 0x59 'Y' + { 436, 9, 10, 7, 0, -8 }, // 0x5A 'Z' + { 448, 4, 11, 6, 1, -9 }, // 0x5B '[' + { 454, 1, 1, 20, 0, 0 }, // 0x5C '\' + { 455, 5, 11, 6, 1, -9 }, // 0x5D ']' + { 462, 1, 1, 20, 0, 0 }, // 0x5E '^' + { 463, 1, 1, 20, 0, 0 }, // 0x5F '_' + { 464, 3, 1, 5, 1, -6 }, // 0x60 '`' + { 465, 6, 7, 6, 0, -5 }, // 0x61 'a' + { 471, 6, 9, 7, 0, -7 }, // 0x62 'b' + { 478, 5, 7, 5, 0, -5 }, // 0x63 'c' + { 483, 6, 10, 7, 0, -8 }, // 0x64 'd' + { 491, 5, 7, 5, 0, -5 }, // 0x65 'e' + { 496, 4, 10, 4, 1, -8 }, // 0x66 'f' + { 501, 6, 11, 6, 0, -5 }, // 0x67 'g' + { 510, 5, 10, 5, 0, -8 }, // 0x68 'h' + { 517, 2, 8, 2, 0, -6 }, // 0x69 'i' + { 519, 6, 12, 3, -3, -6 }, // 0x6A 'j' + { 528, 5, 10, 5, 0, -8 }, // 0x6B 'k' + { 535, 2, 10, 3, 0, -8 }, // 0x6C 'l' + { 538, 9, 6, 9, 0, -4 }, // 0x6D 'm' + { 545, 6, 6, 5, 0, -4 }, // 0x6E 'n' + { 550, 4, 7, 5, 0, -5 }, // 0x6F 'o' + { 554, 5, 11, 5, 0, -5 }, // 0x70 'p' + { 561, 6, 11, 5, 0, -5 }, // 0x71 'q' + { 570, 4, 7, 4, 0, -5 }, // 0x72 'r' + { 574, 4, 7, 4, 0, -5 }, // 0x73 's' + { 578, 4, 8, 4, 0, -6 }, // 0x74 't' + { 582, 6, 6, 5, 0, -4 }, // 0x75 'u' + { 587, 6, 6, 5, 0, -4 }, // 0x76 'v' + { 592, 7, 7, 8, 0, -5 }, // 0x77 'w' + { 599, 6, 7, 6, 0, -5 }, // 0x78 'x' + { 605, 6, 11, 5, -1, -5 }, // 0x79 'y' + { 614, 6, 6, 6, 0, -4 }, // 0x7A 'z' + { 619, 1, 1, 20, 0, 0 }, // 0x7B '{' + { 620, 1, 1, 20, 0, 0 }, // 0x7C '|' + { 621, 1, 1, 20, 0, 0 }, // 0x7D '}' + { 622, 3, 1, 5, 1, -5 } }; // 0x7E '~' const GFXfont angelina8pt7b PROGMEM = { (uint8_t *)angelina8pt7bBitmaps, (GFXglyph *)angelina8pt7bGlyphs, - 0x20, 0x7E, 16 }; + 0x20, 0x7E, 16 }; // Approx. 1295 bytes +#endif // ifndef FONTS_ANGELINA8PT7B_H diff --git a/src/src/Static/Fonts/unispace12pt7b.h b/src/src/Static/Fonts/unispace12pt7b.h index 738d830d5..f5b4256d7 100644 --- a/src/src/Static/Fonts/unispace12pt7b.h +++ b/src/src/Static/Fonts/unispace12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_UNISPACE12PT7B_H +#define FONTS_UNISPACE12PT7B_H const uint8_t unispace12pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x0F, 0xFF, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x1C, 0x70, 0x71, 0xC1, @@ -314,105 +316,106 @@ const uint8_t unispace12pt7bBitmaps[] PROGMEM = { 0xEE, 0x1E, 0x00 }; const GFXglyph unispace12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' - { 1, 4, 24, 18, 7, -23 }, // 0x21 '!' - { 13, 8, 7, 18, 5, -24 }, // 0x22 '"' - { 20, 14, 24, 18, 2, -23 }, // 0x23 '#' - { 62, 17, 24, 19, 1, -23 }, // 0x24 '$' - { 113, 16, 24, 18, 1, -23 }, // 0x25 '%' - { 161, 17, 24, 18, 1, -23 }, // 0x26 '&' - { 212, 3, 7, 18, 8, -24 }, // 0x27 ''' - { 215, 9, 35, 18, 4, -27 }, // 0x28 '(' - { 255, 9, 35, 18, 5, -27 }, // 0x29 ')' - { 295, 13, 13, 18, 3, -23 }, // 0x2A '*' - { 317, 15, 12, 18, 2, -18 }, // 0x2B '+' - { 340, 4, 7, 18, 7, -1 }, // 0x2C ',' - { 344, 16, 2, 18, 1, -11 }, // 0x2D '-' - { 348, 4, 3, 18, 7, -2 }, // 0x2E '.' - { 350, 16, 24, 18, 1, -23 }, // 0x2F '/' - { 398, 17, 24, 19, 1, -23 }, // 0x30 '0' - { 449, 16, 24, 18, 1, -23 }, // 0x31 '1' - { 497, 16, 24, 18, 1, -23 }, // 0x32 '2' - { 545, 16, 24, 18, 1, -23 }, // 0x33 '3' - { 593, 17, 24, 19, 1, -23 }, // 0x34 '4' - { 644, 16, 24, 18, 1, -23 }, // 0x35 '5' - { 692, 16, 24, 18, 1, -23 }, // 0x36 '6' - { 740, 16, 24, 18, 1, -23 }, // 0x37 '7' - { 788, 17, 24, 19, 1, -23 }, // 0x38 '8' - { 839, 16, 24, 18, 1, -23 }, // 0x39 '9' - { 887, 4, 14, 18, 7, -13 }, // 0x3A ':' - { 894, 4, 19, 18, 7, -13 }, // 0x3B ';' - { 904, 10, 18, 18, 4, -21 }, // 0x3C '<' - { 927, 12, 8, 18, 3, -16 }, // 0x3D '=' - { 939, 10, 18, 18, 4, -21 }, // 0x3E '>' - { 962, 16, 24, 18, 1, -23 }, // 0x3F '?' - { 1010, 16, 24, 19, 1, -23 }, // 0x40 '@' - { 1058, 16, 24, 18, 1, -23 }, // 0x41 'A' - { 1106, 16, 24, 18, 1, -23 }, // 0x42 'B' - { 1154, 15, 24, 18, 2, -23 }, // 0x43 'C' - { 1199, 16, 24, 18, 1, -23 }, // 0x44 'D' - { 1247, 15, 24, 18, 2, -23 }, // 0x45 'E' - { 1292, 15, 24, 18, 1, -23 }, // 0x46 'F' - { 1337, 16, 24, 18, 1, -23 }, // 0x47 'G' - { 1385, 16, 24, 18, 1, -23 }, // 0x48 'H' - { 1433, 16, 24, 18, 1, -23 }, // 0x49 'I' - { 1481, 15, 24, 19, 2, -23 }, // 0x4A 'J' - { 1526, 16, 24, 18, 1, -23 }, // 0x4B 'K' - { 1574, 16, 24, 18, 1, -23 }, // 0x4C 'L' - { 1622, 16, 24, 18, 1, -23 }, // 0x4D 'M' - { 1670, 16, 24, 18, 1, -23 }, // 0x4E 'N' - { 1718, 16, 24, 18, 1, -23 }, // 0x4F 'O' - { 1766, 16, 24, 18, 1, -23 }, // 0x50 'P' - { 1814, 16, 28, 18, 1, -23 }, // 0x51 'Q' - { 1870, 16, 24, 18, 1, -23 }, // 0x52 'R' - { 1918, 16, 24, 18, 1, -23 }, // 0x53 'S' - { 1966, 15, 24, 18, 1, -23 }, // 0x54 'T' - { 2011, 16, 24, 18, 1, -23 }, // 0x55 'U' - { 2059, 16, 24, 18, 1, -23 }, // 0x56 'V' - { 2107, 18, 24, 18, 0, -23 }, // 0x57 'W' - { 2161, 16, 24, 18, 1, -23 }, // 0x58 'X' - { 2209, 16, 24, 18, 1, -23 }, // 0x59 'Y' - { 2257, 16, 24, 18, 1, -23 }, // 0x5A 'Z' - { 2305, 9, 35, 18, 4, -27 }, // 0x5B '[' - { 2345, 16, 24, 18, 1, -23 }, // 0x5C '\' - { 2393, 9, 35, 18, 5, -27 }, // 0x5D ']' - { 2433, 18, 11, 18, 0, -23 }, // 0x5E '^' - { 2458, 18, 2, 18, 0, 6 }, // 0x5F '_' - { 2463, 7, 3, 18, 6, -22 }, // 0x60 '`' - { 2466, 16, 19, 18, 1, -18 }, // 0x61 'a' - { 2504, 16, 25, 18, 1, -24 }, // 0x62 'b' - { 2554, 15, 19, 18, 1, -18 }, // 0x63 'c' - { 2590, 16, 25, 18, 1, -24 }, // 0x64 'd' - { 2640, 17, 19, 19, 1, -18 }, // 0x65 'e' - { 2681, 16, 25, 18, 1, -24 }, // 0x66 'f' - { 2731, 16, 26, 18, 1, -18 }, // 0x67 'g' - { 2783, 16, 25, 18, 1, -24 }, // 0x68 'h' - { 2833, 16, 25, 18, 1, -24 }, // 0x69 'i' - { 2883, 11, 32, 18, 4, -24 }, // 0x6A 'j' - { 2927, 16, 25, 18, 1, -24 }, // 0x6B 'k' - { 2977, 16, 25, 18, 1, -24 }, // 0x6C 'l' - { 3027, 16, 19, 18, 1, -18 }, // 0x6D 'm' - { 3065, 16, 19, 18, 1, -18 }, // 0x6E 'n' - { 3103, 16, 19, 18, 1, -18 }, // 0x6F 'o' - { 3141, 16, 26, 18, 1, -18 }, // 0x70 'p' - { 3193, 16, 26, 18, 1, -18 }, // 0x71 'q' - { 3245, 15, 19, 18, 2, -18 }, // 0x72 'r' - { 3281, 16, 19, 18, 1, -18 }, // 0x73 's' - { 3319, 16, 24, 18, 1, -23 }, // 0x74 't' - { 3367, 16, 19, 18, 1, -18 }, // 0x75 'u' - { 3405, 17, 19, 18, 1, -18 }, // 0x76 'v' - { 3446, 18, 19, 18, 0, -18 }, // 0x77 'w' - { 3489, 16, 19, 18, 1, -18 }, // 0x78 'x' - { 3527, 18, 26, 18, 0, -18 }, // 0x79 'y' - { 3586, 15, 19, 18, 2, -18 }, // 0x7A 'z' - { 3622, 12, 35, 18, 3, -27 }, // 0x7B '{' - { 3675, 3, 35, 18, 8, -27 }, // 0x7C '|' - { 3689, 11, 35, 18, 3, -27 }, // 0x7D '}' - { 3738, 13, 5, 19, 3, -14 } }; // 0x7E '~' + { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' + { 1, 4, 24, 18, 7, -23 }, // 0x21 '!' + { 13, 8, 7, 18, 5, -24 }, // 0x22 '"' + { 20, 14, 24, 18, 2, -23 }, // 0x23 '#' + { 62, 17, 24, 19, 1, -23 }, // 0x24 '$' + { 113, 16, 24, 18, 1, -23 }, // 0x25 '%' + { 161, 17, 24, 18, 1, -23 }, // 0x26 '&' + { 212, 3, 7, 18, 8, -24 }, // 0x27 ''' + { 215, 9, 35, 18, 4, -27 }, // 0x28 '(' + { 255, 9, 35, 18, 5, -27 }, // 0x29 ')' + { 295, 13, 13, 18, 3, -23 }, // 0x2A '*' + { 317, 15, 12, 18, 2, -18 }, // 0x2B '+' + { 340, 4, 7, 18, 7, -1 }, // 0x2C ',' + { 344, 16, 2, 18, 1, -11 }, // 0x2D '-' + { 348, 4, 3, 18, 7, -2 }, // 0x2E '.' + { 350, 16, 24, 18, 1, -23 }, // 0x2F '/' + { 398, 17, 24, 19, 1, -23 }, // 0x30 '0' + { 449, 16, 24, 18, 1, -23 }, // 0x31 '1' + { 497, 16, 24, 18, 1, -23 }, // 0x32 '2' + { 545, 16, 24, 18, 1, -23 }, // 0x33 '3' + { 593, 17, 24, 19, 1, -23 }, // 0x34 '4' + { 644, 16, 24, 18, 1, -23 }, // 0x35 '5' + { 692, 16, 24, 18, 1, -23 }, // 0x36 '6' + { 740, 16, 24, 18, 1, -23 }, // 0x37 '7' + { 788, 17, 24, 19, 1, -23 }, // 0x38 '8' + { 839, 16, 24, 18, 1, -23 }, // 0x39 '9' + { 887, 4, 14, 18, 7, -13 }, // 0x3A ':' + { 894, 4, 19, 18, 7, -13 }, // 0x3B ';' + { 904, 10, 18, 18, 4, -21 }, // 0x3C '<' + { 927, 12, 8, 18, 3, -16 }, // 0x3D '=' + { 939, 10, 18, 18, 4, -21 }, // 0x3E '>' + { 962, 16, 24, 18, 1, -23 }, // 0x3F '?' + { 1010, 16, 24, 19, 1, -23 }, // 0x40 '@' + { 1058, 16, 24, 18, 1, -23 }, // 0x41 'A' + { 1106, 16, 24, 18, 1, -23 }, // 0x42 'B' + { 1154, 15, 24, 18, 2, -23 }, // 0x43 'C' + { 1199, 16, 24, 18, 1, -23 }, // 0x44 'D' + { 1247, 15, 24, 18, 2, -23 }, // 0x45 'E' + { 1292, 15, 24, 18, 1, -23 }, // 0x46 'F' + { 1337, 16, 24, 18, 1, -23 }, // 0x47 'G' + { 1385, 16, 24, 18, 1, -23 }, // 0x48 'H' + { 1433, 16, 24, 18, 1, -23 }, // 0x49 'I' + { 1481, 15, 24, 19, 2, -23 }, // 0x4A 'J' + { 1526, 16, 24, 18, 1, -23 }, // 0x4B 'K' + { 1574, 16, 24, 18, 1, -23 }, // 0x4C 'L' + { 1622, 16, 24, 18, 1, -23 }, // 0x4D 'M' + { 1670, 16, 24, 18, 1, -23 }, // 0x4E 'N' + { 1718, 16, 24, 18, 1, -23 }, // 0x4F 'O' + { 1766, 16, 24, 18, 1, -23 }, // 0x50 'P' + { 1814, 16, 28, 18, 1, -23 }, // 0x51 'Q' + { 1870, 16, 24, 18, 1, -23 }, // 0x52 'R' + { 1918, 16, 24, 18, 1, -23 }, // 0x53 'S' + { 1966, 15, 24, 18, 1, -23 }, // 0x54 'T' + { 2011, 16, 24, 18, 1, -23 }, // 0x55 'U' + { 2059, 16, 24, 18, 1, -23 }, // 0x56 'V' + { 2107, 18, 24, 18, 0, -23 }, // 0x57 'W' + { 2161, 16, 24, 18, 1, -23 }, // 0x58 'X' + { 2209, 16, 24, 18, 1, -23 }, // 0x59 'Y' + { 2257, 16, 24, 18, 1, -23 }, // 0x5A 'Z' + { 2305, 9, 35, 18, 4, -27 }, // 0x5B '[' + { 2345, 16, 24, 18, 1, -23 }, // 0x5C '\' + { 2393, 9, 35, 18, 5, -27 }, // 0x5D ']' + { 2433, 18, 11, 18, 0, -23 }, // 0x5E '^' + { 2458, 18, 2, 18, 0, 6 }, // 0x5F '_' + { 2463, 7, 3, 18, 6, -22 }, // 0x60 '`' + { 2466, 16, 19, 18, 1, -18 }, // 0x61 'a' + { 2504, 16, 25, 18, 1, -24 }, // 0x62 'b' + { 2554, 15, 19, 18, 1, -18 }, // 0x63 'c' + { 2590, 16, 25, 18, 1, -24 }, // 0x64 'd' + { 2640, 17, 19, 19, 1, -18 }, // 0x65 'e' + { 2681, 16, 25, 18, 1, -24 }, // 0x66 'f' + { 2731, 16, 26, 18, 1, -18 }, // 0x67 'g' + { 2783, 16, 25, 18, 1, -24 }, // 0x68 'h' + { 2833, 16, 25, 18, 1, -24 }, // 0x69 'i' + { 2883, 11, 32, 18, 4, -24 }, // 0x6A 'j' + { 2927, 16, 25, 18, 1, -24 }, // 0x6B 'k' + { 2977, 16, 25, 18, 1, -24 }, // 0x6C 'l' + { 3027, 16, 19, 18, 1, -18 }, // 0x6D 'm' + { 3065, 16, 19, 18, 1, -18 }, // 0x6E 'n' + { 3103, 16, 19, 18, 1, -18 }, // 0x6F 'o' + { 3141, 16, 26, 18, 1, -18 }, // 0x70 'p' + { 3193, 16, 26, 18, 1, -18 }, // 0x71 'q' + { 3245, 15, 19, 18, 2, -18 }, // 0x72 'r' + { 3281, 16, 19, 18, 1, -18 }, // 0x73 's' + { 3319, 16, 24, 18, 1, -23 }, // 0x74 't' + { 3367, 16, 19, 18, 1, -18 }, // 0x75 'u' + { 3405, 17, 19, 18, 1, -18 }, // 0x76 'v' + { 3446, 18, 19, 18, 0, -18 }, // 0x77 'w' + { 3489, 16, 19, 18, 1, -18 }, // 0x78 'x' + { 3527, 18, 26, 18, 0, -18 }, // 0x79 'y' + { 3586, 15, 19, 18, 2, -18 }, // 0x7A 'z' + { 3622, 12, 35, 18, 3, -27 }, // 0x7B '{' + { 3675, 3, 35, 18, 8, -27 }, // 0x7C '|' + { 3689, 11, 35, 18, 3, -27 }, // 0x7D '}' + { 3738, 13, 5, 19, 3, -14 } }; // 0x7E '~' const GFXfont unispace12pt7b PROGMEM = { (uint8_t *)unispace12pt7bBitmaps, (GFXglyph *)unispace12pt7bGlyphs, - 0x20, 0x7E, 36 }; + 0x20, 0x7E, 36 }; // Approx. 4419 bytes +#endif // ifndef FONTS_UNISPACE12PT7B_H diff --git a/src/src/Static/Fonts/unispace8pt7b.h b/src/src/Static/Fonts/unispace8pt7b.h index f7257567d..e12aff7b7 100644 --- a/src/src/Static/Fonts/unispace8pt7b.h +++ b/src/src/Static/Fonts/unispace8pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_UNISPACE8PT7B_H +#define FONTS_UNISPACE8PT7B_H const uint8_t unispace8pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x07, 0x8C, 0x63, 0x18, 0x80, 0x21, 0x10, 0x88, 0x44, 0x22, 0x17, 0xFC, 0x84, 0x42, 0x21, 0x10, 0x88, 0x5F, @@ -143,105 +145,106 @@ const uint8_t unispace8pt7bBitmaps[] PROGMEM = { 0x18, 0x30, 0x60, 0xC1, 0x83, 0x0C, 0x70, 0x71, 0x99, 0x8E }; const GFXglyph unispace8pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' - { 1, 3, 16, 12, 5, -15 }, // 0x21 '!' - { 7, 5, 5, 12, 3, -16 }, // 0x22 '"' - { 11, 9, 16, 12, 1, -15 }, // 0x23 '#' - { 29, 12, 16, 13, 0, -15 }, // 0x24 '$' - { 53, 10, 16, 12, 1, -15 }, // 0x25 '%' - { 73, 9, 16, 12, 1, -15 }, // 0x26 '&' - { 91, 1, 5, 12, 6, -16 }, // 0x27 ''' - { 92, 6, 24, 12, 3, -18 }, // 0x28 '(' - { 110, 6, 24, 12, 3, -18 }, // 0x29 ')' - { 128, 8, 9, 12, 2, -15 }, // 0x2A '*' - { 137, 9, 8, 12, 2, -12 }, // 0x2B '+' - { 146, 2, 5, 12, 5, 0 }, // 0x2C ',' - { 148, 10, 1, 12, 1, -7 }, // 0x2D '-' - { 150, 3, 1, 12, 5, 0 }, // 0x2E '.' - { 151, 10, 16, 12, 1, -15 }, // 0x2F '/' - { 171, 11, 16, 13, 1, -15 }, // 0x30 '0' - { 193, 11, 16, 12, 1, -15 }, // 0x31 '1' - { 215, 11, 16, 13, 1, -15 }, // 0x32 '2' - { 237, 11, 16, 12, 0, -15 }, // 0x33 '3' - { 259, 12, 16, 12, 0, -15 }, // 0x34 '4' - { 283, 11, 16, 13, 1, -15 }, // 0x35 '5' - { 305, 11, 16, 13, 1, -15 }, // 0x36 '6' - { 327, 11, 16, 12, 1, -15 }, // 0x37 '7' - { 349, 11, 16, 12, 1, -15 }, // 0x38 '8' - { 371, 11, 16, 13, 1, -15 }, // 0x39 '9' - { 393, 3, 9, 12, 5, -8 }, // 0x3A ':' - { 397, 3, 13, 12, 5, -8 }, // 0x3B ';' - { 402, 7, 12, 12, 3, -13 }, // 0x3C '<' - { 413, 8, 5, 12, 2, -10 }, // 0x3D '=' - { 418, 8, 12, 12, 2, -13 }, // 0x3E '>' - { 430, 11, 16, 12, 0, -15 }, // 0x3F '?' - { 452, 10, 16, 12, 1, -15 }, // 0x40 '@' - { 472, 10, 16, 12, 1, -15 }, // 0x41 'A' - { 492, 11, 16, 12, 0, -15 }, // 0x42 'B' - { 514, 10, 16, 12, 1, -15 }, // 0x43 'C' - { 534, 11, 16, 13, 1, -15 }, // 0x44 'D' - { 556, 10, 16, 12, 1, -15 }, // 0x45 'E' - { 576, 11, 16, 12, 1, -15 }, // 0x46 'F' - { 598, 11, 16, 13, 1, -15 }, // 0x47 'G' - { 620, 11, 16, 13, 1, -15 }, // 0x48 'H' - { 642, 11, 16, 12, 1, -15 }, // 0x49 'I' - { 664, 11, 16, 12, 0, -15 }, // 0x4A 'J' - { 686, 11, 16, 12, 1, -15 }, // 0x4B 'K' - { 708, 11, 16, 12, 1, -15 }, // 0x4C 'L' - { 730, 9, 16, 11, 1, -15 }, // 0x4D 'M' - { 748, 10, 16, 12, 1, -15 }, // 0x4E 'N' - { 768, 11, 16, 13, 1, -15 }, // 0x4F 'O' - { 790, 11, 16, 13, 1, -15 }, // 0x50 'P' - { 812, 11, 18, 13, 1, -15 }, // 0x51 'Q' - { 837, 11, 16, 13, 1, -15 }, // 0x52 'R' - { 859, 11, 16, 13, 1, -15 }, // 0x53 'S' - { 881, 11, 16, 12, 1, -15 }, // 0x54 'T' - { 903, 11, 16, 13, 1, -15 }, // 0x55 'U' - { 925, 10, 16, 12, 1, -15 }, // 0x56 'V' - { 945, 12, 16, 12, 0, -15 }, // 0x57 'W' - { 969, 10, 16, 12, 1, -15 }, // 0x58 'X' - { 989, 11, 16, 12, 0, -15 }, // 0x59 'Y' - { 1011, 10, 16, 12, 1, -15 }, // 0x5A 'Z' - { 1031, 6, 24, 12, 3, -18 }, // 0x5B '[' - { 1049, 10, 16, 12, 1, -15 }, // 0x5C '\' - { 1069, 6, 24, 12, 3, -18 }, // 0x5D ']' - { 1087, 12, 7, 12, 0, -15 }, // 0x5E '^' - { 1098, 12, 1, 12, 0, 4 }, // 0x5F '_' - { 1100, 4, 3, 12, 4, -15 }, // 0x60 '`' - { 1102, 11, 13, 13, 1, -12 }, // 0x61 'a' - { 1120, 11, 17, 13, 1, -16 }, // 0x62 'b' - { 1144, 10, 13, 12, 1, -12 }, // 0x63 'c' - { 1161, 11, 17, 13, 1, -16 }, // 0x64 'd' - { 1185, 11, 13, 13, 1, -12 }, // 0x65 'e' - { 1203, 11, 17, 12, 1, -16 }, // 0x66 'f' - { 1227, 11, 18, 13, 1, -12 }, // 0x67 'g' - { 1252, 11, 17, 13, 1, -16 }, // 0x68 'h' - { 1276, 11, 17, 12, 1, -16 }, // 0x69 'i' - { 1300, 8, 22, 12, 2, -16 }, // 0x6A 'j' - { 1322, 11, 17, 12, 1, -16 }, // 0x6B 'k' - { 1346, 11, 17, 12, 0, -16 }, // 0x6C 'l' - { 1370, 12, 13, 13, 0, -12 }, // 0x6D 'm' - { 1390, 11, 13, 13, 1, -12 }, // 0x6E 'n' - { 1408, 11, 13, 13, 1, -12 }, // 0x6F 'o' - { 1426, 11, 18, 13, 1, -12 }, // 0x70 'p' - { 1451, 11, 18, 13, 1, -12 }, // 0x71 'q' - { 1476, 10, 13, 12, 1, -12 }, // 0x72 'r' - { 1493, 11, 13, 12, 1, -12 }, // 0x73 's' - { 1511, 10, 16, 12, 1, -15 }, // 0x74 't' - { 1531, 11, 13, 13, 1, -12 }, // 0x75 'u' - { 1549, 12, 13, 12, 0, -12 }, // 0x76 'v' - { 1569, 12, 13, 12, 0, -12 }, // 0x77 'w' - { 1589, 11, 13, 12, 1, -12 }, // 0x78 'x' - { 1607, 12, 18, 12, 0, -12 }, // 0x79 'y' - { 1634, 10, 13, 12, 1, -12 }, // 0x7A 'z' - { 1651, 8, 24, 12, 2, -18 }, // 0x7B '{' - { 1675, 1, 24, 12, 6, -18 }, // 0x7C '|' - { 1678, 7, 24, 12, 3, -18 }, // 0x7D '}' - { 1699, 8, 3, 12, 2, -9 } }; // 0x7E '~' + { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' + { 1, 3, 16, 12, 5, -15 }, // 0x21 '!' + { 7, 5, 5, 12, 3, -16 }, // 0x22 '"' + { 11, 9, 16, 12, 1, -15 }, // 0x23 '#' + { 29, 12, 16, 13, 0, -15 }, // 0x24 '$' + { 53, 10, 16, 12, 1, -15 }, // 0x25 '%' + { 73, 9, 16, 12, 1, -15 }, // 0x26 '&' + { 91, 1, 5, 12, 6, -16 }, // 0x27 ''' + { 92, 6, 24, 12, 3, -18 }, // 0x28 '(' + { 110, 6, 24, 12, 3, -18 }, // 0x29 ')' + { 128, 8, 9, 12, 2, -15 }, // 0x2A '*' + { 137, 9, 8, 12, 2, -12 }, // 0x2B '+' + { 146, 2, 5, 12, 5, 0 }, // 0x2C ',' + { 148, 10, 1, 12, 1, -7 }, // 0x2D '-' + { 150, 3, 1, 12, 5, 0 }, // 0x2E '.' + { 151, 10, 16, 12, 1, -15 }, // 0x2F '/' + { 171, 11, 16, 13, 1, -15 }, // 0x30 '0' + { 193, 11, 16, 12, 1, -15 }, // 0x31 '1' + { 215, 11, 16, 13, 1, -15 }, // 0x32 '2' + { 237, 11, 16, 12, 0, -15 }, // 0x33 '3' + { 259, 12, 16, 12, 0, -15 }, // 0x34 '4' + { 283, 11, 16, 13, 1, -15 }, // 0x35 '5' + { 305, 11, 16, 13, 1, -15 }, // 0x36 '6' + { 327, 11, 16, 12, 1, -15 }, // 0x37 '7' + { 349, 11, 16, 12, 1, -15 }, // 0x38 '8' + { 371, 11, 16, 13, 1, -15 }, // 0x39 '9' + { 393, 3, 9, 12, 5, -8 }, // 0x3A ':' + { 397, 3, 13, 12, 5, -8 }, // 0x3B ';' + { 402, 7, 12, 12, 3, -13 }, // 0x3C '<' + { 413, 8, 5, 12, 2, -10 }, // 0x3D '=' + { 418, 8, 12, 12, 2, -13 }, // 0x3E '>' + { 430, 11, 16, 12, 0, -15 }, // 0x3F '?' + { 452, 10, 16, 12, 1, -15 }, // 0x40 '@' + { 472, 10, 16, 12, 1, -15 }, // 0x41 'A' + { 492, 11, 16, 12, 0, -15 }, // 0x42 'B' + { 514, 10, 16, 12, 1, -15 }, // 0x43 'C' + { 534, 11, 16, 13, 1, -15 }, // 0x44 'D' + { 556, 10, 16, 12, 1, -15 }, // 0x45 'E' + { 576, 11, 16, 12, 1, -15 }, // 0x46 'F' + { 598, 11, 16, 13, 1, -15 }, // 0x47 'G' + { 620, 11, 16, 13, 1, -15 }, // 0x48 'H' + { 642, 11, 16, 12, 1, -15 }, // 0x49 'I' + { 664, 11, 16, 12, 0, -15 }, // 0x4A 'J' + { 686, 11, 16, 12, 1, -15 }, // 0x4B 'K' + { 708, 11, 16, 12, 1, -15 }, // 0x4C 'L' + { 730, 9, 16, 11, 1, -15 }, // 0x4D 'M' + { 748, 10, 16, 12, 1, -15 }, // 0x4E 'N' + { 768, 11, 16, 13, 1, -15 }, // 0x4F 'O' + { 790, 11, 16, 13, 1, -15 }, // 0x50 'P' + { 812, 11, 18, 13, 1, -15 }, // 0x51 'Q' + { 837, 11, 16, 13, 1, -15 }, // 0x52 'R' + { 859, 11, 16, 13, 1, -15 }, // 0x53 'S' + { 881, 11, 16, 12, 1, -15 }, // 0x54 'T' + { 903, 11, 16, 13, 1, -15 }, // 0x55 'U' + { 925, 10, 16, 12, 1, -15 }, // 0x56 'V' + { 945, 12, 16, 12, 0, -15 }, // 0x57 'W' + { 969, 10, 16, 12, 1, -15 }, // 0x58 'X' + { 989, 11, 16, 12, 0, -15 }, // 0x59 'Y' + { 1011, 10, 16, 12, 1, -15 }, // 0x5A 'Z' + { 1031, 6, 24, 12, 3, -18 }, // 0x5B '[' + { 1049, 10, 16, 12, 1, -15 }, // 0x5C '\' + { 1069, 6, 24, 12, 3, -18 }, // 0x5D ']' + { 1087, 12, 7, 12, 0, -15 }, // 0x5E '^' + { 1098, 12, 1, 12, 0, 4 }, // 0x5F '_' + { 1100, 4, 3, 12, 4, -15 }, // 0x60 '`' + { 1102, 11, 13, 13, 1, -12 }, // 0x61 'a' + { 1120, 11, 17, 13, 1, -16 }, // 0x62 'b' + { 1144, 10, 13, 12, 1, -12 }, // 0x63 'c' + { 1161, 11, 17, 13, 1, -16 }, // 0x64 'd' + { 1185, 11, 13, 13, 1, -12 }, // 0x65 'e' + { 1203, 11, 17, 12, 1, -16 }, // 0x66 'f' + { 1227, 11, 18, 13, 1, -12 }, // 0x67 'g' + { 1252, 11, 17, 13, 1, -16 }, // 0x68 'h' + { 1276, 11, 17, 12, 1, -16 }, // 0x69 'i' + { 1300, 8, 22, 12, 2, -16 }, // 0x6A 'j' + { 1322, 11, 17, 12, 1, -16 }, // 0x6B 'k' + { 1346, 11, 17, 12, 0, -16 }, // 0x6C 'l' + { 1370, 12, 13, 13, 0, -12 }, // 0x6D 'm' + { 1390, 11, 13, 13, 1, -12 }, // 0x6E 'n' + { 1408, 11, 13, 13, 1, -12 }, // 0x6F 'o' + { 1426, 11, 18, 13, 1, -12 }, // 0x70 'p' + { 1451, 11, 18, 13, 1, -12 }, // 0x71 'q' + { 1476, 10, 13, 12, 1, -12 }, // 0x72 'r' + { 1493, 11, 13, 12, 1, -12 }, // 0x73 's' + { 1511, 10, 16, 12, 1, -15 }, // 0x74 't' + { 1531, 11, 13, 13, 1, -12 }, // 0x75 'u' + { 1549, 12, 13, 12, 0, -12 }, // 0x76 'v' + { 1569, 12, 13, 12, 0, -12 }, // 0x77 'w' + { 1589, 11, 13, 12, 1, -12 }, // 0x78 'x' + { 1607, 12, 18, 12, 0, -12 }, // 0x79 'y' + { 1634, 10, 13, 12, 1, -12 }, // 0x7A 'z' + { 1651, 8, 24, 12, 2, -18 }, // 0x7B '{' + { 1675, 1, 24, 12, 6, -18 }, // 0x7C '|' + { 1678, 7, 24, 12, 3, -18 }, // 0x7D '}' + { 1699, 8, 3, 12, 2, -9 } }; // 0x7E '~' const GFXfont unispace8pt7b PROGMEM = { (uint8_t *)unispace8pt7bBitmaps, (GFXglyph *)unispace8pt7bGlyphs, - 0x20, 0x7E, 24 }; + 0x20, 0x7E, 24 }; // Approx. 2374 bytes +#endif // ifndef FONTS_UNISPACE8PT7B_H diff --git a/src/src/Static/Fonts/unispace_italic12pt7b.h b/src/src/Static/Fonts/unispace_italic12pt7b.h index f46046a5e..62c4f6cdc 100644 --- a/src/src/Static/Fonts/unispace_italic12pt7b.h +++ b/src/src/Static/Fonts/unispace_italic12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_UNISPACE_ITALIC12PT7B_H +#define FONTS_UNISPACE_ITALIC12PT7B_H const uint8_t unispace_italic12pt7bBitmaps[] PROGMEM = { 0x00, 0x07, 0x83, 0xC1, 0xE1, 0xE0, 0xF0, 0x78, 0x3C, 0x1E, 0x1E, 0x0F, 0x07, 0x83, 0xC1, 0xE1, 0xE0, 0xF0, 0x78, 0x3C, 0x20, 0x00, 0x00, 0x00, @@ -381,105 +383,106 @@ const uint8_t unispace_italic12pt7bBitmaps[] PROGMEM = { 0xB0, 0xFC, 0xC1, 0xE0 }; const GFXglyph unispace_italic12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' - { 1, 9, 24, 18, 7, -23 }, // 0x21 '!' - { 28, 10, 7, 18, 9, -24 }, // 0x22 '"' - { 37, 17, 24, 18, 3, -23 }, // 0x23 '#' - { 88, 19, 24, 19, 2, -23 }, // 0x24 '$' - { 145, 15, 24, 18, 4, -23 }, // 0x25 '%' - { 190, 17, 24, 18, 2, -23 }, // 0x26 '&' - { 241, 4, 7, 18, 12, -24 }, // 0x27 ''' - { 245, 17, 35, 18, 3, -27 }, // 0x28 '(' - { 320, 17, 35, 18, 2, -27 }, // 0x29 ')' - { 395, 13, 13, 18, 6, -23 }, // 0x2A '*' - { 417, 15, 12, 18, 5, -18 }, // 0x2B '+' - { 440, 5, 7, 18, 6, -1 }, // 0x2C ',' - { 445, 15, 2, 18, 4, -11 }, // 0x2D '-' - { 449, 5, 3, 18, 7, -2 }, // 0x2E '.' - { 451, 21, 24, 18, 1, -23 }, // 0x2F '/' - { 514, 19, 24, 18, 2, -23 }, // 0x30 '0' - { 571, 16, 24, 18, 1, -23 }, // 0x31 '1' - { 619, 20, 24, 18, 1, -23 }, // 0x32 '2' - { 679, 20, 24, 18, 1, -23 }, // 0x33 '3' - { 739, 18, 24, 18, 2, -23 }, // 0x34 '4' - { 793, 19, 24, 18, 1, -23 }, // 0x35 '5' - { 850, 17, 24, 18, 2, -23 }, // 0x36 '6' - { 901, 19, 24, 18, 3, -23 }, // 0x37 '7' - { 958, 19, 24, 19, 2, -23 }, // 0x38 '8' - { 1015, 18, 24, 18, 3, -23 }, // 0x39 '9' - { 1069, 7, 14, 18, 7, -13 }, // 0x3A ':' - { 1082, 8, 19, 18, 6, -13 }, // 0x3B ';' - { 1101, 10, 18, 18, 7, -21 }, // 0x3C '<' - { 1124, 12, 8, 18, 6, -16 }, // 0x3D '=' - { 1136, 10, 18, 18, 7, -21 }, // 0x3E '>' - { 1159, 17, 24, 18, 4, -23 }, // 0x3F '?' - { 1210, 19, 24, 18, 2, -23 }, // 0x40 '@' - { 1267, 17, 24, 18, 0, -23 }, // 0x41 'A' - { 1318, 20, 24, 18, 1, -23 }, // 0x42 'B' - { 1378, 19, 24, 18, 3, -23 }, // 0x43 'C' - { 1435, 20, 24, 18, 1, -23 }, // 0x44 'D' - { 1495, 20, 24, 18, 2, -23 }, // 0x45 'E' - { 1555, 21, 24, 18, 1, -23 }, // 0x46 'F' - { 1618, 19, 24, 18, 2, -23 }, // 0x47 'G' - { 1675, 21, 24, 18, 1, -23 }, // 0x48 'H' - { 1738, 20, 24, 18, 2, -23 }, // 0x49 'I' - { 1798, 20, 24, 18, 2, -23 }, // 0x4A 'J' - { 1858, 21, 24, 18, 1, -23 }, // 0x4B 'K' - { 1921, 16, 24, 18, 1, -23 }, // 0x4C 'L' - { 1969, 21, 24, 18, 1, -23 }, // 0x4D 'M' - { 2032, 21, 24, 18, 1, -23 }, // 0x4E 'N' - { 2095, 19, 24, 18, 2, -23 }, // 0x4F 'O' - { 2152, 20, 24, 18, 1, -23 }, // 0x50 'P' - { 2212, 19, 28, 18, 2, -23 }, // 0x51 'Q' - { 2279, 19, 24, 17, 1, -23 }, // 0x52 'R' - { 2336, 19, 24, 18, 2, -23 }, // 0x53 'S' - { 2393, 16, 24, 18, 6, -23 }, // 0x54 'T' - { 2441, 20, 24, 18, 2, -23 }, // 0x55 'U' - { 2501, 17, 24, 18, 6, -23 }, // 0x56 'V' - { 2552, 20, 24, 18, 3, -23 }, // 0x57 'W' - { 2612, 21, 24, 18, 1, -23 }, // 0x58 'X' - { 2675, 16, 24, 18, 6, -23 }, // 0x59 'Y' - { 2723, 21, 24, 18, 1, -23 }, // 0x5A 'Z' - { 2786, 17, 35, 18, 3, -27 }, // 0x5B '[' - { 2861, 11, 24, 18, 6, -23 }, // 0x5C '\' - { 2894, 17, 35, 18, 3, -27 }, // 0x5D ']' - { 2969, 18, 11, 18, 3, -23 }, // 0x5E '^' - { 2994, 19, 2, 18, -2, 6 }, // 0x5F '_' - { 2999, 7, 3, 18, 10, -22 }, // 0x60 '`' - { 3002, 18, 19, 18, 2, -18 }, // 0x61 'a' - { 3045, 19, 25, 18, 1, -24 }, // 0x62 'b' - { 3105, 18, 19, 18, 2, -18 }, // 0x63 'c' - { 3148, 20, 25, 18, 2, -24 }, // 0x64 'd' - { 3211, 19, 19, 19, 2, -18 }, // 0x65 'e' - { 3257, 17, 25, 18, 5, -24 }, // 0x66 'f' - { 3311, 19, 26, 18, 2, -18 }, // 0x67 'g' - { 3373, 19, 25, 18, 1, -24 }, // 0x68 'h' - { 3433, 16, 25, 18, 1, -24 }, // 0x69 'i' - { 3483, 18, 32, 18, 2, -24 }, // 0x6A 'j' - { 3555, 20, 25, 18, 1, -24 }, // 0x6B 'k' - { 3618, 16, 25, 18, 1, -24 }, // 0x6C 'l' - { 3668, 19, 19, 18, 1, -18 }, // 0x6D 'm' - { 3714, 19, 19, 18, 1, -18 }, // 0x6E 'n' - { 3760, 18, 19, 18, 2, -18 }, // 0x6F 'o' - { 3803, 21, 26, 18, -1, -18 }, // 0x70 'p' - { 3872, 19, 26, 18, 2, -18 }, // 0x71 'q' - { 3934, 18, 19, 18, 2, -18 }, // 0x72 'r' - { 3977, 20, 19, 18, 1, -18 }, // 0x73 's' - { 4025, 16, 24, 18, 5, -23 }, // 0x74 't' - { 4073, 19, 19, 18, 2, -18 }, // 0x75 'u' - { 4119, 17, 19, 18, 5, -18 }, // 0x76 'v' - { 4160, 19, 19, 18, 3, -18 }, // 0x77 'w' - { 4206, 20, 19, 18, 1, -18 }, // 0x78 'x' - { 4254, 19, 26, 18, 3, -18 }, // 0x79 'y' - { 4316, 19, 19, 18, 2, -18 }, // 0x7A 'z' - { 4362, 15, 35, 18, 6, -27 }, // 0x7B '{' - { 4428, 11, 35, 18, 6, -27 }, // 0x7C '|' - { 4477, 15, 35, 19, 2, -27 }, // 0x7D '}' - { 4543, 14, 5, 18, 5, -14 } }; // 0x7E '~' + { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' + { 1, 9, 24, 18, 7, -23 }, // 0x21 '!' + { 28, 10, 7, 18, 9, -24 }, // 0x22 '"' + { 37, 17, 24, 18, 3, -23 }, // 0x23 '#' + { 88, 19, 24, 19, 2, -23 }, // 0x24 '$' + { 145, 15, 24, 18, 4, -23 }, // 0x25 '%' + { 190, 17, 24, 18, 2, -23 }, // 0x26 '&' + { 241, 4, 7, 18, 12, -24 }, // 0x27 ''' + { 245, 17, 35, 18, 3, -27 }, // 0x28 '(' + { 320, 17, 35, 18, 2, -27 }, // 0x29 ')' + { 395, 13, 13, 18, 6, -23 }, // 0x2A '*' + { 417, 15, 12, 18, 5, -18 }, // 0x2B '+' + { 440, 5, 7, 18, 6, -1 }, // 0x2C ',' + { 445, 15, 2, 18, 4, -11 }, // 0x2D '-' + { 449, 5, 3, 18, 7, -2 }, // 0x2E '.' + { 451, 21, 24, 18, 1, -23 }, // 0x2F '/' + { 514, 19, 24, 18, 2, -23 }, // 0x30 '0' + { 571, 16, 24, 18, 1, -23 }, // 0x31 '1' + { 619, 20, 24, 18, 1, -23 }, // 0x32 '2' + { 679, 20, 24, 18, 1, -23 }, // 0x33 '3' + { 739, 18, 24, 18, 2, -23 }, // 0x34 '4' + { 793, 19, 24, 18, 1, -23 }, // 0x35 '5' + { 850, 17, 24, 18, 2, -23 }, // 0x36 '6' + { 901, 19, 24, 18, 3, -23 }, // 0x37 '7' + { 958, 19, 24, 19, 2, -23 }, // 0x38 '8' + { 1015, 18, 24, 18, 3, -23 }, // 0x39 '9' + { 1069, 7, 14, 18, 7, -13 }, // 0x3A ':' + { 1082, 8, 19, 18, 6, -13 }, // 0x3B ';' + { 1101, 10, 18, 18, 7, -21 }, // 0x3C '<' + { 1124, 12, 8, 18, 6, -16 }, // 0x3D '=' + { 1136, 10, 18, 18, 7, -21 }, // 0x3E '>' + { 1159, 17, 24, 18, 4, -23 }, // 0x3F '?' + { 1210, 19, 24, 18, 2, -23 }, // 0x40 '@' + { 1267, 17, 24, 18, 0, -23 }, // 0x41 'A' + { 1318, 20, 24, 18, 1, -23 }, // 0x42 'B' + { 1378, 19, 24, 18, 3, -23 }, // 0x43 'C' + { 1435, 20, 24, 18, 1, -23 }, // 0x44 'D' + { 1495, 20, 24, 18, 2, -23 }, // 0x45 'E' + { 1555, 21, 24, 18, 1, -23 }, // 0x46 'F' + { 1618, 19, 24, 18, 2, -23 }, // 0x47 'G' + { 1675, 21, 24, 18, 1, -23 }, // 0x48 'H' + { 1738, 20, 24, 18, 2, -23 }, // 0x49 'I' + { 1798, 20, 24, 18, 2, -23 }, // 0x4A 'J' + { 1858, 21, 24, 18, 1, -23 }, // 0x4B 'K' + { 1921, 16, 24, 18, 1, -23 }, // 0x4C 'L' + { 1969, 21, 24, 18, 1, -23 }, // 0x4D 'M' + { 2032, 21, 24, 18, 1, -23 }, // 0x4E 'N' + { 2095, 19, 24, 18, 2, -23 }, // 0x4F 'O' + { 2152, 20, 24, 18, 1, -23 }, // 0x50 'P' + { 2212, 19, 28, 18, 2, -23 }, // 0x51 'Q' + { 2279, 19, 24, 17, 1, -23 }, // 0x52 'R' + { 2336, 19, 24, 18, 2, -23 }, // 0x53 'S' + { 2393, 16, 24, 18, 6, -23 }, // 0x54 'T' + { 2441, 20, 24, 18, 2, -23 }, // 0x55 'U' + { 2501, 17, 24, 18, 6, -23 }, // 0x56 'V' + { 2552, 20, 24, 18, 3, -23 }, // 0x57 'W' + { 2612, 21, 24, 18, 1, -23 }, // 0x58 'X' + { 2675, 16, 24, 18, 6, -23 }, // 0x59 'Y' + { 2723, 21, 24, 18, 1, -23 }, // 0x5A 'Z' + { 2786, 17, 35, 18, 3, -27 }, // 0x5B '[' + { 2861, 11, 24, 18, 6, -23 }, // 0x5C '\' + { 2894, 17, 35, 18, 3, -27 }, // 0x5D ']' + { 2969, 18, 11, 18, 3, -23 }, // 0x5E '^' + { 2994, 19, 2, 18, -2, 6 }, // 0x5F '_' + { 2999, 7, 3, 18, 10, -22 }, // 0x60 '`' + { 3002, 18, 19, 18, 2, -18 }, // 0x61 'a' + { 3045, 19, 25, 18, 1, -24 }, // 0x62 'b' + { 3105, 18, 19, 18, 2, -18 }, // 0x63 'c' + { 3148, 20, 25, 18, 2, -24 }, // 0x64 'd' + { 3211, 19, 19, 19, 2, -18 }, // 0x65 'e' + { 3257, 17, 25, 18, 5, -24 }, // 0x66 'f' + { 3311, 19, 26, 18, 2, -18 }, // 0x67 'g' + { 3373, 19, 25, 18, 1, -24 }, // 0x68 'h' + { 3433, 16, 25, 18, 1, -24 }, // 0x69 'i' + { 3483, 18, 32, 18, 2, -24 }, // 0x6A 'j' + { 3555, 20, 25, 18, 1, -24 }, // 0x6B 'k' + { 3618, 16, 25, 18, 1, -24 }, // 0x6C 'l' + { 3668, 19, 19, 18, 1, -18 }, // 0x6D 'm' + { 3714, 19, 19, 18, 1, -18 }, // 0x6E 'n' + { 3760, 18, 19, 18, 2, -18 }, // 0x6F 'o' + { 3803, 21, 26, 18, -1, -18 }, // 0x70 'p' + { 3872, 19, 26, 18, 2, -18 }, // 0x71 'q' + { 3934, 18, 19, 18, 2, -18 }, // 0x72 'r' + { 3977, 20, 19, 18, 1, -18 }, // 0x73 's' + { 4025, 16, 24, 18, 5, -23 }, // 0x74 't' + { 4073, 19, 19, 18, 2, -18 }, // 0x75 'u' + { 4119, 17, 19, 18, 5, -18 }, // 0x76 'v' + { 4160, 19, 19, 18, 3, -18 }, // 0x77 'w' + { 4206, 20, 19, 18, 1, -18 }, // 0x78 'x' + { 4254, 19, 26, 18, 3, -18 }, // 0x79 'y' + { 4316, 19, 19, 18, 2, -18 }, // 0x7A 'z' + { 4362, 15, 35, 18, 6, -27 }, // 0x7B '{' + { 4428, 11, 35, 18, 6, -27 }, // 0x7C '|' + { 4477, 15, 35, 19, 2, -27 }, // 0x7D '}' + { 4543, 14, 5, 18, 5, -14 } }; // 0x7E '~' const GFXfont unispace_italic12pt7b PROGMEM = { (uint8_t *)unispace_italic12pt7bBitmaps, (GFXglyph *)unispace_italic12pt7bGlyphs, - 0x20, 0x7E, 36 }; + 0x20, 0x7E, 36 }; // Approx. 5224 bytes +#endif // ifndef FONTS_UNISPACE_ITALIC12PT7B_H diff --git a/src/src/Static/Fonts/unispace_italic8pt7b.h b/src/src/Static/Fonts/unispace_italic8pt7b.h index e23bf56ca..cc1fe79aa 100644 --- a/src/src/Static/Fonts/unispace_italic8pt7b.h +++ b/src/src/Static/Fonts/unispace_italic8pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_UNISPACE_ITALIC8PT7B_H +#define FONTS_UNISPACE_ITALIC8PT7B_H const uint8_t unispace_italic8pt7bBitmaps[] PROGMEM = { 0x00, 0x1C, 0x61, 0x8E, 0x38, 0xE3, 0x0C, 0x71, 0xC7, 0x18, 0x00, 0x00, 0x38, 0x6D, 0xBC, 0xF3, 0xD8, 0x0C, 0x61, 0x88, 0x31, 0x04, 0x60, 0x8C, @@ -176,105 +178,106 @@ const uint8_t unispace_italic8pt7bBitmaps[] PROGMEM = { 0x78, 0xA6, 0xF1, 0xC0 }; const GFXglyph unispace_italic8pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' - { 1, 6, 16, 12, 5, -15 }, // 0x21 '!' - { 13, 6, 5, 12, 6, -16 }, // 0x22 '"' - { 17, 11, 16, 12, 2, -15 }, // 0x23 '#' - { 39, 12, 16, 12, 2, -15 }, // 0x24 '$' - { 63, 10, 16, 11, 3, -15 }, // 0x25 '%' - { 83, 13, 16, 12, 1, -15 }, // 0x26 '&' - { 109, 3, 5, 12, 8, -16 }, // 0x27 ''' - { 111, 12, 24, 12, 2, -18 }, // 0x28 '(' - { 147, 12, 24, 12, 1, -18 }, // 0x29 ')' - { 183, 9, 9, 12, 4, -15 }, // 0x2A '*' - { 194, 9, 8, 12, 3, -12 }, // 0x2B '+' - { 203, 3, 5, 12, 4, 0 }, // 0x2C ',' - { 205, 11, 1, 12, 2, -7 }, // 0x2D '-' - { 207, 3, 1, 12, 5, 0 }, // 0x2E '.' - { 208, 14, 16, 12, 1, -15 }, // 0x2F '/' - { 236, 13, 16, 12, 1, -15 }, // 0x30 '0' - { 262, 11, 16, 12, 1, -15 }, // 0x31 '1' - { 284, 14, 16, 12, 0, -15 }, // 0x32 '2' - { 312, 14, 16, 13, 1, -15 }, // 0x33 '3' - { 340, 12, 16, 12, 1, -15 }, // 0x34 '4' - { 364, 14, 16, 12, 0, -15 }, // 0x35 '5' - { 392, 12, 16, 12, 1, -15 }, // 0x36 '6' - { 416, 13, 16, 12, 2, -15 }, // 0x37 '7' - { 442, 14, 16, 13, 1, -15 }, // 0x38 '8' - { 470, 13, 16, 12, 1, -15 }, // 0x39 '9' - { 496, 4, 9, 12, 5, -8 }, // 0x3A ':' - { 501, 5, 13, 12, 4, -8 }, // 0x3B ';' - { 510, 7, 12, 12, 4, -13 }, // 0x3C '<' - { 521, 8, 5, 12, 4, -10 }, // 0x3D '=' - { 526, 7, 12, 12, 4, -13 }, // 0x3E '>' - { 537, 11, 16, 12, 3, -15 }, // 0x3F '?' - { 559, 12, 16, 12, 2, -15 }, // 0x40 '@' - { 583, 11, 16, 13, 1, -15 }, // 0x41 'A' - { 605, 14, 16, 12, 1, -15 }, // 0x42 'B' - { 633, 13, 16, 12, 2, -15 }, // 0x43 'C' - { 659, 13, 16, 12, 1, -15 }, // 0x44 'D' - { 685, 13, 16, 12, 1, -15 }, // 0x45 'E' - { 711, 14, 16, 12, 1, -15 }, // 0x46 'F' - { 739, 13, 16, 12, 1, -15 }, // 0x47 'G' - { 765, 14, 16, 12, 1, -15 }, // 0x48 'H' - { 793, 13, 16, 12, 1, -15 }, // 0x49 'I' - { 819, 13, 16, 12, 1, -15 }, // 0x4A 'J' - { 845, 14, 16, 12, 1, -15 }, // 0x4B 'K' - { 873, 11, 16, 12, 1, -15 }, // 0x4C 'L' - { 895, 14, 16, 12, 1, -15 }, // 0x4D 'M' - { 923, 14, 16, 12, 1, -15 }, // 0x4E 'N' - { 951, 14, 16, 13, 1, -15 }, // 0x4F 'O' - { 979, 13, 16, 12, 1, -15 }, // 0x50 'P' - { 1005, 14, 18, 13, 1, -15 }, // 0x51 'Q' - { 1037, 14, 16, 11, 0, -15 }, // 0x52 'R' - { 1065, 13, 16, 12, 1, -15 }, // 0x53 'S' - { 1091, 10, 16, 12, 4, -15 }, // 0x54 'T' - { 1111, 14, 16, 12, 1, -15 }, // 0x55 'U' - { 1139, 11, 16, 12, 4, -15 }, // 0x56 'V' - { 1161, 13, 16, 12, 2, -15 }, // 0x57 'W' - { 1187, 14, 16, 12, 1, -15 }, // 0x58 'X' - { 1215, 11, 16, 12, 4, -15 }, // 0x59 'Y' - { 1237, 14, 16, 12, 1, -15 }, // 0x5A 'Z' - { 1265, 11, 24, 12, 2, -18 }, // 0x5B '[' - { 1298, 7, 16, 12, 4, -15 }, // 0x5C '\' - { 1312, 11, 24, 12, 2, -18 }, // 0x5D ']' - { 1345, 12, 7, 12, 2, -15 }, // 0x5E '^' - { 1356, 12, 1, 12, -1, 4 }, // 0x5F '_' - { 1358, 5, 3, 12, 7, -15 }, // 0x60 '`' - { 1360, 13, 13, 12, 1, -12 }, // 0x61 'a' - { 1382, 13, 17, 13, 1, -16 }, // 0x62 'b' - { 1410, 13, 13, 12, 1, -12 }, // 0x63 'c' - { 1432, 13, 17, 12, 1, -16 }, // 0x64 'd' - { 1460, 13, 13, 13, 1, -12 }, // 0x65 'e' - { 1482, 12, 17, 12, 3, -16 }, // 0x66 'f' - { 1508, 13, 18, 12, 1, -12 }, // 0x67 'g' - { 1538, 13, 17, 13, 1, -16 }, // 0x68 'h' - { 1566, 10, 17, 12, 1, -16 }, // 0x69 'i' - { 1588, 12, 22, 12, 1, -16 }, // 0x6A 'j' - { 1621, 13, 17, 12, 1, -16 }, // 0x6B 'k' - { 1649, 10, 17, 12, 1, -16 }, // 0x6C 'l' - { 1671, 13, 13, 12, 1, -12 }, // 0x6D 'm' - { 1693, 13, 13, 13, 1, -12 }, // 0x6E 'n' - { 1715, 13, 13, 12, 1, -12 }, // 0x6F 'o' - { 1737, 14, 18, 13, 0, -12 }, // 0x70 'p' - { 1769, 13, 18, 12, 1, -12 }, // 0x71 'q' - { 1799, 13, 13, 12, 1, -12 }, // 0x72 'r' - { 1821, 13, 13, 12, 1, -12 }, // 0x73 's' - { 1843, 11, 16, 12, 4, -15 }, // 0x74 't' - { 1865, 13, 13, 12, 1, -12 }, // 0x75 'u' - { 1887, 11, 13, 12, 3, -12 }, // 0x76 'v' - { 1905, 13, 13, 12, 2, -12 }, // 0x77 'w' - { 1927, 13, 13, 12, 1, -12 }, // 0x78 'x' - { 1949, 13, 18, 12, 2, -12 }, // 0x79 'y' - { 1979, 13, 13, 12, 1, -12 }, // 0x7A 'z' - { 2001, 11, 24, 12, 3, -18 }, // 0x7B '{' - { 2034, 7, 24, 12, 4, -18 }, // 0x7C '|' - { 2055, 11, 24, 13, 1, -18 }, // 0x7D '}' - { 2088, 9, 3, 12, 3, -9 } }; // 0x7E '~' + { 0, 1, 1, 12, 0, 0 }, // 0x20 ' ' + { 1, 6, 16, 12, 5, -15 }, // 0x21 '!' + { 13, 6, 5, 12, 6, -16 }, // 0x22 '"' + { 17, 11, 16, 12, 2, -15 }, // 0x23 '#' + { 39, 12, 16, 12, 2, -15 }, // 0x24 '$' + { 63, 10, 16, 11, 3, -15 }, // 0x25 '%' + { 83, 13, 16, 12, 1, -15 }, // 0x26 '&' + { 109, 3, 5, 12, 8, -16 }, // 0x27 ''' + { 111, 12, 24, 12, 2, -18 }, // 0x28 '(' + { 147, 12, 24, 12, 1, -18 }, // 0x29 ')' + { 183, 9, 9, 12, 4, -15 }, // 0x2A '*' + { 194, 9, 8, 12, 3, -12 }, // 0x2B '+' + { 203, 3, 5, 12, 4, 0 }, // 0x2C ',' + { 205, 11, 1, 12, 2, -7 }, // 0x2D '-' + { 207, 3, 1, 12, 5, 0 }, // 0x2E '.' + { 208, 14, 16, 12, 1, -15 }, // 0x2F '/' + { 236, 13, 16, 12, 1, -15 }, // 0x30 '0' + { 262, 11, 16, 12, 1, -15 }, // 0x31 '1' + { 284, 14, 16, 12, 0, -15 }, // 0x32 '2' + { 312, 14, 16, 13, 1, -15 }, // 0x33 '3' + { 340, 12, 16, 12, 1, -15 }, // 0x34 '4' + { 364, 14, 16, 12, 0, -15 }, // 0x35 '5' + { 392, 12, 16, 12, 1, -15 }, // 0x36 '6' + { 416, 13, 16, 12, 2, -15 }, // 0x37 '7' + { 442, 14, 16, 13, 1, -15 }, // 0x38 '8' + { 470, 13, 16, 12, 1, -15 }, // 0x39 '9' + { 496, 4, 9, 12, 5, -8 }, // 0x3A ':' + { 501, 5, 13, 12, 4, -8 }, // 0x3B ';' + { 510, 7, 12, 12, 4, -13 }, // 0x3C '<' + { 521, 8, 5, 12, 4, -10 }, // 0x3D '=' + { 526, 7, 12, 12, 4, -13 }, // 0x3E '>' + { 537, 11, 16, 12, 3, -15 }, // 0x3F '?' + { 559, 12, 16, 12, 2, -15 }, // 0x40 '@' + { 583, 11, 16, 13, 1, -15 }, // 0x41 'A' + { 605, 14, 16, 12, 1, -15 }, // 0x42 'B' + { 633, 13, 16, 12, 2, -15 }, // 0x43 'C' + { 659, 13, 16, 12, 1, -15 }, // 0x44 'D' + { 685, 13, 16, 12, 1, -15 }, // 0x45 'E' + { 711, 14, 16, 12, 1, -15 }, // 0x46 'F' + { 739, 13, 16, 12, 1, -15 }, // 0x47 'G' + { 765, 14, 16, 12, 1, -15 }, // 0x48 'H' + { 793, 13, 16, 12, 1, -15 }, // 0x49 'I' + { 819, 13, 16, 12, 1, -15 }, // 0x4A 'J' + { 845, 14, 16, 12, 1, -15 }, // 0x4B 'K' + { 873, 11, 16, 12, 1, -15 }, // 0x4C 'L' + { 895, 14, 16, 12, 1, -15 }, // 0x4D 'M' + { 923, 14, 16, 12, 1, -15 }, // 0x4E 'N' + { 951, 14, 16, 13, 1, -15 }, // 0x4F 'O' + { 979, 13, 16, 12, 1, -15 }, // 0x50 'P' + { 1005, 14, 18, 13, 1, -15 }, // 0x51 'Q' + { 1037, 14, 16, 11, 0, -15 }, // 0x52 'R' + { 1065, 13, 16, 12, 1, -15 }, // 0x53 'S' + { 1091, 10, 16, 12, 4, -15 }, // 0x54 'T' + { 1111, 14, 16, 12, 1, -15 }, // 0x55 'U' + { 1139, 11, 16, 12, 4, -15 }, // 0x56 'V' + { 1161, 13, 16, 12, 2, -15 }, // 0x57 'W' + { 1187, 14, 16, 12, 1, -15 }, // 0x58 'X' + { 1215, 11, 16, 12, 4, -15 }, // 0x59 'Y' + { 1237, 14, 16, 12, 1, -15 }, // 0x5A 'Z' + { 1265, 11, 24, 12, 2, -18 }, // 0x5B '[' + { 1298, 7, 16, 12, 4, -15 }, // 0x5C '\' + { 1312, 11, 24, 12, 2, -18 }, // 0x5D ']' + { 1345, 12, 7, 12, 2, -15 }, // 0x5E '^' + { 1356, 12, 1, 12, -1, 4 }, // 0x5F '_' + { 1358, 5, 3, 12, 7, -15 }, // 0x60 '`' + { 1360, 13, 13, 12, 1, -12 }, // 0x61 'a' + { 1382, 13, 17, 13, 1, -16 }, // 0x62 'b' + { 1410, 13, 13, 12, 1, -12 }, // 0x63 'c' + { 1432, 13, 17, 12, 1, -16 }, // 0x64 'd' + { 1460, 13, 13, 13, 1, -12 }, // 0x65 'e' + { 1482, 12, 17, 12, 3, -16 }, // 0x66 'f' + { 1508, 13, 18, 12, 1, -12 }, // 0x67 'g' + { 1538, 13, 17, 13, 1, -16 }, // 0x68 'h' + { 1566, 10, 17, 12, 1, -16 }, // 0x69 'i' + { 1588, 12, 22, 12, 1, -16 }, // 0x6A 'j' + { 1621, 13, 17, 12, 1, -16 }, // 0x6B 'k' + { 1649, 10, 17, 12, 1, -16 }, // 0x6C 'l' + { 1671, 13, 13, 12, 1, -12 }, // 0x6D 'm' + { 1693, 13, 13, 13, 1, -12 }, // 0x6E 'n' + { 1715, 13, 13, 12, 1, -12 }, // 0x6F 'o' + { 1737, 14, 18, 13, 0, -12 }, // 0x70 'p' + { 1769, 13, 18, 12, 1, -12 }, // 0x71 'q' + { 1799, 13, 13, 12, 1, -12 }, // 0x72 'r' + { 1821, 13, 13, 12, 1, -12 }, // 0x73 's' + { 1843, 11, 16, 12, 4, -15 }, // 0x74 't' + { 1865, 13, 13, 12, 1, -12 }, // 0x75 'u' + { 1887, 11, 13, 12, 3, -12 }, // 0x76 'v' + { 1905, 13, 13, 12, 2, -12 }, // 0x77 'w' + { 1927, 13, 13, 12, 1, -12 }, // 0x78 'x' + { 1949, 13, 18, 12, 2, -12 }, // 0x79 'y' + { 1979, 13, 13, 12, 1, -12 }, // 0x7A 'z' + { 2001, 11, 24, 12, 3, -18 }, // 0x7B '{' + { 2034, 7, 24, 12, 4, -18 }, // 0x7C '|' + { 2055, 11, 24, 13, 1, -18 }, // 0x7D '}' + { 2088, 9, 3, 12, 3, -9 } }; // 0x7E '~' const GFXfont unispace_italic8pt7b PROGMEM = { (uint8_t *)unispace_italic8pt7bBitmaps, (GFXglyph *)unispace_italic8pt7bGlyphs, - 0x20, 0x7E, 24 }; + 0x20, 0x7E, 24 }; // Approx. 2764 bytes +#endif // ifndef FONTS_UNISPACE_ITALIC8PT7B_H diff --git a/src/src/Static/Fonts/whitrabt12pt7b.h b/src/src/Static/Fonts/whitrabt12pt7b.h index 3515c6aaf..d9ab4b5fc 100644 --- a/src/src/Static/Fonts/whitrabt12pt7b.h +++ b/src/src/Static/Fonts/whitrabt12pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_WHITRABT12PT7B_H +#define FONTS_WHITRABT12PT7B_H const uint8_t whitrabt12pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xF0, 0xC7, 0x8F, 0x1E, 0x30, 0x33, 0x06, 0x60, 0xCC, 0x19, 0x8F, 0xFF, 0xFF, 0xCC, 0xC1, 0x98, @@ -132,105 +134,106 @@ const uint8_t whitrabt12pt7bBitmaps[] PROGMEM = { 0x3C, 0x63, 0xC6, 0x30, 0x3E, 0x01, 0xC0 }; const GFXglyph whitrabt12pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' - { 1, 4, 15, 13, 3, -14 }, // 0x21 '!' - { 9, 7, 4, 13, 3, -14 }, // 0x22 '"' - { 13, 11, 15, 13, 1, -14 }, // 0x23 '#' - { 34, 12, 15, 14, 1, -14 }, // 0x24 '$' - { 57, 10, 15, 12, 1, -14 }, // 0x25 '%' - { 76, 11, 15, 13, 1, -14 }, // 0x26 '&' - { 97, 2, 4, 14, 6, -14 }, // 0x27 ''' - { 98, 5, 15, 14, 6, -14 }, // 0x28 '(' - { 108, 4, 15, 13, 3, -14 }, // 0x29 ')' - { 116, 11, 11, 13, 1, -14 }, // 0x2A '*' - { 132, 11, 11, 13, 1, -12 }, // 0x2B '+' - { 148, 4, 6, 13, 3, -3 }, // 0x2C ',' - { 151, 11, 2, 13, 1, -8 }, // 0x2D '-' - { 154, 4, 4, 13, 3, -3 }, // 0x2E '.' - { 156, 11, 15, 13, 1, -14 }, // 0x2F '/' - { 177, 11, 15, 13, 1, -14 }, // 0x30 '0' - { 198, 7, 15, 13, 3, -14 }, // 0x31 '1' - { 212, 11, 15, 13, 1, -14 }, // 0x32 '2' - { 233, 11, 15, 13, 1, -14 }, // 0x33 '3' - { 254, 11, 15, 13, 1, -14 }, // 0x34 '4' - { 275, 11, 15, 13, 1, -14 }, // 0x35 '5' - { 296, 11, 15, 13, 1, -14 }, // 0x36 '6' - { 317, 11, 15, 13, 1, -14 }, // 0x37 '7' - { 338, 11, 15, 13, 1, -14 }, // 0x38 '8' - { 359, 11, 15, 13, 1, -14 }, // 0x39 '9' - { 380, 4, 13, 13, 3, -12 }, // 0x3A ':' - { 387, 4, 15, 13, 3, -12 }, // 0x3B ';' - { 395, 9, 15, 13, 1, -14 }, // 0x3C '<' - { 412, 11, 6, 13, 1, -10 }, // 0x3D '=' - { 421, 9, 15, 13, 3, -14 }, // 0x3E '>' - { 438, 12, 15, 14, 1, -14 }, // 0x3F '?' - { 461, 12, 15, 14, 1, -14 }, // 0x40 '@' - { 484, 11, 15, 13, 1, -14 }, // 0x41 'A' - { 505, 11, 15, 13, 1, -14 }, // 0x42 'B' - { 526, 11, 15, 13, 1, -14 }, // 0x43 'C' - { 547, 11, 15, 13, 1, -14 }, // 0x44 'D' - { 568, 11, 15, 13, 1, -14 }, // 0x45 'E' - { 589, 11, 15, 13, 1, -14 }, // 0x46 'F' - { 610, 11, 15, 13, 1, -14 }, // 0x47 'G' - { 631, 11, 15, 13, 1, -14 }, // 0x48 'H' - { 652, 7, 15, 13, 3, -14 }, // 0x49 'I' - { 666, 11, 15, 13, 1, -14 }, // 0x4A 'J' - { 687, 11, 15, 13, 1, -14 }, // 0x4B 'K' - { 708, 11, 15, 13, 1, -14 }, // 0x4C 'L' - { 729, 11, 15, 13, 1, -14 }, // 0x4D 'M' - { 750, 11, 15, 13, 1, -14 }, // 0x4E 'N' - { 771, 11, 15, 13, 1, -14 }, // 0x4F 'O' - { 792, 11, 15, 13, 1, -14 }, // 0x50 'P' - { 813, 11, 15, 13, 1, -14 }, // 0x51 'Q' - { 834, 11, 15, 13, 1, -14 }, // 0x52 'R' - { 855, 11, 15, 13, 1, -14 }, // 0x53 'S' - { 876, 11, 15, 13, 1, -14 }, // 0x54 'T' - { 897, 11, 15, 13, 1, -14 }, // 0x55 'U' - { 918, 11, 15, 13, 1, -14 }, // 0x56 'V' - { 939, 12, 15, 14, 1, -14 }, // 0x57 'W' - { 962, 11, 15, 13, 1, -14 }, // 0x58 'X' - { 983, 12, 15, 14, 1, -14 }, // 0x59 'Y' - { 1006, 11, 15, 13, 1, -14 }, // 0x5A 'Z' - { 1027, 5, 15, 14, 6, -14 }, // 0x5B '[' - { 1037, 11, 15, 13, 1, -14 }, // 0x5C '\' - { 1058, 4, 15, 13, 3, -14 }, // 0x5D ']' - { 1066, 11, 7, 13, 1, -15 }, // 0x5E '^' - { 1076, 11, 2, 13, 1, 1 }, // 0x5F '_' - { 1079, 5, 5, 14, 6, -15 }, // 0x60 '`' - { 1083, 11, 11, 13, 1, -10 }, // 0x61 'a' - { 1099, 11, 15, 13, 1, -14 }, // 0x62 'b' - { 1120, 11, 11, 13, 1, -10 }, // 0x63 'c' - { 1136, 11, 15, 13, 1, -14 }, // 0x64 'd' - { 1157, 11, 11, 13, 1, -10 }, // 0x65 'e' - { 1173, 9, 15, 13, 3, -14 }, // 0x66 'f' - { 1190, 11, 13, 13, 1, -10 }, // 0x67 'g' - { 1208, 11, 15, 13, 1, -14 }, // 0x68 'h' - { 1229, 7, 15, 13, 3, -14 }, // 0x69 'i' - { 1243, 9, 17, 13, 1, -14 }, // 0x6A 'j' - { 1263, 9, 15, 13, 3, -14 }, // 0x6B 'k' - { 1280, 7, 15, 13, 3, -14 }, // 0x6C 'l' - { 1294, 12, 11, 14, 1, -10 }, // 0x6D 'm' - { 1311, 11, 11, 13, 1, -10 }, // 0x6E 'n' - { 1327, 11, 11, 13, 1, -10 }, // 0x6F 'o' - { 1343, 11, 13, 13, 1, -10 }, // 0x70 'p' - { 1361, 11, 13, 13, 1, -10 }, // 0x71 'q' - { 1379, 9, 11, 13, 3, -10 }, // 0x72 'r' - { 1392, 11, 11, 13, 1, -10 }, // 0x73 's' - { 1408, 9, 15, 13, 3, -14 }, // 0x74 't' - { 1425, 11, 11, 13, 1, -10 }, // 0x75 'u' - { 1441, 11, 11, 13, 1, -10 }, // 0x76 'v' - { 1457, 12, 11, 14, 1, -10 }, // 0x77 'w' - { 1474, 11, 11, 13, 1, -10 }, // 0x78 'x' - { 1490, 11, 13, 13, 1, -10 }, // 0x79 'y' - { 1508, 11, 11, 13, 1, -10 }, // 0x7A 'z' - { 1524, 7, 15, 13, 3, -14 }, // 0x7B '{' - { 1538, 2, 15, 14, 6, -14 }, // 0x7C '|' - { 1542, 7, 15, 13, 3, -14 }, // 0x7D '}' - { 1556, 12, 7, 14, 1, -15 } }; // 0x7E '~' + { 0, 1, 1, 13, 0, 0 }, // 0x20 ' ' + { 1, 4, 15, 13, 3, -14 }, // 0x21 '!' + { 9, 7, 4, 13, 3, -14 }, // 0x22 '"' + { 13, 11, 15, 13, 1, -14 }, // 0x23 '#' + { 34, 12, 15, 14, 1, -14 }, // 0x24 '$' + { 57, 10, 15, 12, 1, -14 }, // 0x25 '%' + { 76, 11, 15, 13, 1, -14 }, // 0x26 '&' + { 97, 2, 4, 14, 6, -14 }, // 0x27 ''' + { 98, 5, 15, 14, 6, -14 }, // 0x28 '(' + { 108, 4, 15, 13, 3, -14 }, // 0x29 ')' + { 116, 11, 11, 13, 1, -14 }, // 0x2A '*' + { 132, 11, 11, 13, 1, -12 }, // 0x2B '+' + { 148, 4, 6, 13, 3, -3 }, // 0x2C ',' + { 151, 11, 2, 13, 1, -8 }, // 0x2D '-' + { 154, 4, 4, 13, 3, -3 }, // 0x2E '.' + { 156, 11, 15, 13, 1, -14 }, // 0x2F '/' + { 177, 11, 15, 13, 1, -14 }, // 0x30 '0' + { 198, 7, 15, 13, 3, -14 }, // 0x31 '1' + { 212, 11, 15, 13, 1, -14 }, // 0x32 '2' + { 233, 11, 15, 13, 1, -14 }, // 0x33 '3' + { 254, 11, 15, 13, 1, -14 }, // 0x34 '4' + { 275, 11, 15, 13, 1, -14 }, // 0x35 '5' + { 296, 11, 15, 13, 1, -14 }, // 0x36 '6' + { 317, 11, 15, 13, 1, -14 }, // 0x37 '7' + { 338, 11, 15, 13, 1, -14 }, // 0x38 '8' + { 359, 11, 15, 13, 1, -14 }, // 0x39 '9' + { 380, 4, 13, 13, 3, -12 }, // 0x3A ':' + { 387, 4, 15, 13, 3, -12 }, // 0x3B ';' + { 395, 9, 15, 13, 1, -14 }, // 0x3C '<' + { 412, 11, 6, 13, 1, -10 }, // 0x3D '=' + { 421, 9, 15, 13, 3, -14 }, // 0x3E '>' + { 438, 12, 15, 14, 1, -14 }, // 0x3F '?' + { 461, 12, 15, 14, 1, -14 }, // 0x40 '@' + { 484, 11, 15, 13, 1, -14 }, // 0x41 'A' + { 505, 11, 15, 13, 1, -14 }, // 0x42 'B' + { 526, 11, 15, 13, 1, -14 }, // 0x43 'C' + { 547, 11, 15, 13, 1, -14 }, // 0x44 'D' + { 568, 11, 15, 13, 1, -14 }, // 0x45 'E' + { 589, 11, 15, 13, 1, -14 }, // 0x46 'F' + { 610, 11, 15, 13, 1, -14 }, // 0x47 'G' + { 631, 11, 15, 13, 1, -14 }, // 0x48 'H' + { 652, 7, 15, 13, 3, -14 }, // 0x49 'I' + { 666, 11, 15, 13, 1, -14 }, // 0x4A 'J' + { 687, 11, 15, 13, 1, -14 }, // 0x4B 'K' + { 708, 11, 15, 13, 1, -14 }, // 0x4C 'L' + { 729, 11, 15, 13, 1, -14 }, // 0x4D 'M' + { 750, 11, 15, 13, 1, -14 }, // 0x4E 'N' + { 771, 11, 15, 13, 1, -14 }, // 0x4F 'O' + { 792, 11, 15, 13, 1, -14 }, // 0x50 'P' + { 813, 11, 15, 13, 1, -14 }, // 0x51 'Q' + { 834, 11, 15, 13, 1, -14 }, // 0x52 'R' + { 855, 11, 15, 13, 1, -14 }, // 0x53 'S' + { 876, 11, 15, 13, 1, -14 }, // 0x54 'T' + { 897, 11, 15, 13, 1, -14 }, // 0x55 'U' + { 918, 11, 15, 13, 1, -14 }, // 0x56 'V' + { 939, 12, 15, 14, 1, -14 }, // 0x57 'W' + { 962, 11, 15, 13, 1, -14 }, // 0x58 'X' + { 983, 12, 15, 14, 1, -14 }, // 0x59 'Y' + { 1006, 11, 15, 13, 1, -14 }, // 0x5A 'Z' + { 1027, 5, 15, 14, 6, -14 }, // 0x5B '[' + { 1037, 11, 15, 13, 1, -14 }, // 0x5C '\' + { 1058, 4, 15, 13, 3, -14 }, // 0x5D ']' + { 1066, 11, 7, 13, 1, -15 }, // 0x5E '^' + { 1076, 11, 2, 13, 1, 1 }, // 0x5F '_' + { 1079, 5, 5, 14, 6, -15 }, // 0x60 '`' + { 1083, 11, 11, 13, 1, -10 }, // 0x61 'a' + { 1099, 11, 15, 13, 1, -14 }, // 0x62 'b' + { 1120, 11, 11, 13, 1, -10 }, // 0x63 'c' + { 1136, 11, 15, 13, 1, -14 }, // 0x64 'd' + { 1157, 11, 11, 13, 1, -10 }, // 0x65 'e' + { 1173, 9, 15, 13, 3, -14 }, // 0x66 'f' + { 1190, 11, 13, 13, 1, -10 }, // 0x67 'g' + { 1208, 11, 15, 13, 1, -14 }, // 0x68 'h' + { 1229, 7, 15, 13, 3, -14 }, // 0x69 'i' + { 1243, 9, 17, 13, 1, -14 }, // 0x6A 'j' + { 1263, 9, 15, 13, 3, -14 }, // 0x6B 'k' + { 1280, 7, 15, 13, 3, -14 }, // 0x6C 'l' + { 1294, 12, 11, 14, 1, -10 }, // 0x6D 'm' + { 1311, 11, 11, 13, 1, -10 }, // 0x6E 'n' + { 1327, 11, 11, 13, 1, -10 }, // 0x6F 'o' + { 1343, 11, 13, 13, 1, -10 }, // 0x70 'p' + { 1361, 11, 13, 13, 1, -10 }, // 0x71 'q' + { 1379, 9, 11, 13, 3, -10 }, // 0x72 'r' + { 1392, 11, 11, 13, 1, -10 }, // 0x73 's' + { 1408, 9, 15, 13, 3, -14 }, // 0x74 't' + { 1425, 11, 11, 13, 1, -10 }, // 0x75 'u' + { 1441, 11, 11, 13, 1, -10 }, // 0x76 'v' + { 1457, 12, 11, 14, 1, -10 }, // 0x77 'w' + { 1474, 11, 11, 13, 1, -10 }, // 0x78 'x' + { 1490, 11, 13, 13, 1, -10 }, // 0x79 'y' + { 1508, 11, 11, 13, 1, -10 }, // 0x7A 'z' + { 1524, 7, 15, 13, 3, -14 }, // 0x7B '{' + { 1538, 2, 15, 14, 6, -14 }, // 0x7C '|' + { 1542, 7, 15, 13, 3, -14 }, // 0x7D '}' + { 1556, 12, 7, 14, 1, -15 } }; // 0x7E '~' const GFXfont whitrabt12pt7b PROGMEM = { (uint8_t *)whitrabt12pt7bBitmaps, (GFXglyph *)whitrabt12pt7bGlyphs, - 0x20, 0x7E, 18 }; + 0x20, 0x7E, 18 }; // Approx. 2239 bytes +#endif // ifndef FONTS_WHITRABT12PT7B_H diff --git a/src/src/Static/Fonts/whitrabt16pt7b.h b/src/src/Static/Fonts/whitrabt16pt7b.h index ee11bf99a..ced93d861 100644 --- a/src/src/Static/Fonts/whitrabt16pt7b.h +++ b/src/src/Static/Fonts/whitrabt16pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_WHITRABT16PT7B_H +#define FONTS_WHITRABT16PT7B_H const uint8_t whitrabt16pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0xE3, 0xF1, 0xF8, 0xFC, 0x7E, 0x3F, 0x1C, @@ -244,105 +246,106 @@ const uint8_t whitrabt16pt7bBitmaps[] PROGMEM = { 0x7E, 0x38, 0xFC, 0x71, 0xC0, 0xFF, 0x80, 0xFE, 0x00, 0x70 }; const GFXglyph whitrabt16pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' - { 1, 6, 21, 17, 4, -20 }, // 0x21 '!' - { 17, 9, 6, 17, 4, -20 }, // 0x22 '"' - { 24, 15, 21, 18, 1, -20 }, // 0x23 '#' - { 64, 15, 21, 18, 1, -20 }, // 0x24 '$' - { 104, 15, 21, 18, 1, -20 }, // 0x25 '%' - { 144, 15, 21, 18, 1, -20 }, // 0x26 '&' - { 184, 3, 6, 17, 7, -20 }, // 0x27 ''' - { 187, 6, 21, 17, 7, -20 }, // 0x28 '(' - { 203, 6, 21, 17, 4, -20 }, // 0x29 ')' - { 219, 15, 15, 18, 1, -20 }, // 0x2A '*' - { 248, 15, 15, 18, 1, -17 }, // 0x2B '+' - { 277, 6, 9, 17, 4, -5 }, // 0x2C ',' - { 284, 15, 3, 18, 1, -11 }, // 0x2D '-' - { 290, 6, 6, 17, 4, -5 }, // 0x2E '.' - { 295, 15, 21, 18, 1, -20 }, // 0x2F '/' - { 335, 15, 21, 18, 1, -20 }, // 0x30 '0' - { 375, 9, 21, 18, 4, -20 }, // 0x31 '1' - { 399, 15, 21, 18, 1, -20 }, // 0x32 '2' - { 439, 15, 21, 18, 1, -20 }, // 0x33 '3' - { 479, 15, 21, 18, 1, -20 }, // 0x34 '4' - { 519, 15, 21, 18, 1, -20 }, // 0x35 '5' - { 559, 15, 21, 18, 1, -20 }, // 0x36 '6' - { 599, 15, 21, 18, 1, -20 }, // 0x37 '7' - { 639, 15, 21, 18, 1, -20 }, // 0x38 '8' - { 679, 15, 21, 18, 1, -20 }, // 0x39 '9' - { 719, 6, 18, 17, 4, -17 }, // 0x3A ':' - { 733, 6, 21, 17, 4, -17 }, // 0x3B ';' - { 749, 12, 21, 17, 1, -20 }, // 0x3C '<' - { 781, 15, 9, 18, 1, -14 }, // 0x3D '=' - { 798, 12, 21, 18, 4, -20 }, // 0x3E '>' - { 830, 15, 21, 18, 1, -20 }, // 0x3F '?' - { 870, 15, 21, 18, 1, -20 }, // 0x40 '@' - { 910, 15, 21, 18, 1, -20 }, // 0x41 'A' - { 950, 15, 21, 18, 1, -20 }, // 0x42 'B' - { 990, 15, 21, 18, 1, -20 }, // 0x43 'C' - { 1030, 15, 21, 18, 1, -20 }, // 0x44 'D' - { 1070, 15, 21, 18, 1, -20 }, // 0x45 'E' - { 1110, 15, 21, 18, 1, -20 }, // 0x46 'F' - { 1150, 15, 21, 18, 1, -20 }, // 0x47 'G' - { 1190, 15, 21, 18, 1, -20 }, // 0x48 'H' - { 1230, 9, 21, 17, 4, -20 }, // 0x49 'I' - { 1254, 15, 21, 18, 1, -20 }, // 0x4A 'J' - { 1294, 15, 21, 18, 1, -20 }, // 0x4B 'K' - { 1334, 15, 21, 18, 1, -20 }, // 0x4C 'L' - { 1374, 15, 21, 18, 1, -20 }, // 0x4D 'M' - { 1414, 15, 21, 18, 1, -20 }, // 0x4E 'N' - { 1454, 15, 21, 18, 1, -20 }, // 0x4F 'O' - { 1494, 15, 21, 18, 1, -20 }, // 0x50 'P' - { 1534, 15, 21, 18, 1, -20 }, // 0x51 'Q' - { 1574, 15, 21, 18, 1, -20 }, // 0x52 'R' - { 1614, 15, 21, 18, 1, -20 }, // 0x53 'S' - { 1654, 15, 21, 18, 1, -20 }, // 0x54 'T' - { 1694, 15, 21, 18, 1, -20 }, // 0x55 'U' - { 1734, 15, 21, 18, 1, -20 }, // 0x56 'V' - { 1774, 15, 21, 18, 1, -20 }, // 0x57 'W' - { 1814, 15, 21, 18, 1, -20 }, // 0x58 'X' - { 1854, 15, 21, 18, 1, -20 }, // 0x59 'Y' - { 1894, 15, 21, 18, 1, -20 }, // 0x5A 'Z' - { 1934, 6, 21, 17, 7, -20 }, // 0x5B '[' - { 1950, 15, 21, 18, 1, -20 }, // 0x5C '\' - { 1990, 6, 21, 17, 4, -20 }, // 0x5D ']' - { 2006, 15, 9, 18, 1, -20 }, // 0x5E '^' - { 2023, 15, 3, 18, 1, 1 }, // 0x5F '_' - { 2029, 6, 6, 17, 7, -20 }, // 0x60 '`' - { 2034, 15, 15, 18, 1, -14 }, // 0x61 'a' - { 2063, 15, 21, 18, 1, -20 }, // 0x62 'b' - { 2103, 15, 15, 18, 1, -14 }, // 0x63 'c' - { 2132, 15, 21, 18, 1, -20 }, // 0x64 'd' - { 2172, 15, 15, 18, 1, -14 }, // 0x65 'e' - { 2201, 12, 21, 18, 4, -20 }, // 0x66 'f' - { 2233, 15, 18, 18, 1, -14 }, // 0x67 'g' - { 2267, 15, 21, 18, 1, -20 }, // 0x68 'h' - { 2307, 9, 21, 17, 4, -20 }, // 0x69 'i' - { 2331, 12, 24, 17, 1, -20 }, // 0x6A 'j' - { 2367, 12, 21, 18, 4, -20 }, // 0x6B 'k' - { 2399, 9, 21, 17, 4, -20 }, // 0x6C 'l' - { 2423, 15, 15, 18, 1, -14 }, // 0x6D 'm' - { 2452, 15, 15, 18, 1, -14 }, // 0x6E 'n' - { 2481, 15, 15, 18, 1, -14 }, // 0x6F 'o' - { 2510, 15, 18, 18, 1, -14 }, // 0x70 'p' - { 2544, 15, 18, 18, 1, -14 }, // 0x71 'q' - { 2578, 12, 15, 18, 4, -14 }, // 0x72 'r' - { 2601, 15, 15, 18, 1, -14 }, // 0x73 's' - { 2630, 12, 21, 18, 4, -20 }, // 0x74 't' - { 2662, 15, 15, 18, 1, -14 }, // 0x75 'u' - { 2691, 15, 15, 18, 1, -14 }, // 0x76 'v' - { 2720, 15, 15, 18, 1, -14 }, // 0x77 'w' - { 2749, 15, 15, 18, 1, -14 }, // 0x78 'x' - { 2778, 15, 18, 18, 1, -14 }, // 0x79 'y' - { 2812, 15, 15, 18, 1, -14 }, // 0x7A 'z' - { 2841, 9, 21, 17, 4, -20 }, // 0x7B '{' - { 2865, 3, 21, 17, 7, -20 }, // 0x7C '|' - { 2873, 9, 21, 17, 4, -20 }, // 0x7D '}' - { 2897, 15, 9, 18, 1, -20 } }; // 0x7E '~' + { 0, 1, 1, 18, 0, 0 }, // 0x20 ' ' + { 1, 6, 21, 17, 4, -20 }, // 0x21 '!' + { 17, 9, 6, 17, 4, -20 }, // 0x22 '"' + { 24, 15, 21, 18, 1, -20 }, // 0x23 '#' + { 64, 15, 21, 18, 1, -20 }, // 0x24 '$' + { 104, 15, 21, 18, 1, -20 }, // 0x25 '%' + { 144, 15, 21, 18, 1, -20 }, // 0x26 '&' + { 184, 3, 6, 17, 7, -20 }, // 0x27 ''' + { 187, 6, 21, 17, 7, -20 }, // 0x28 '(' + { 203, 6, 21, 17, 4, -20 }, // 0x29 ')' + { 219, 15, 15, 18, 1, -20 }, // 0x2A '*' + { 248, 15, 15, 18, 1, -17 }, // 0x2B '+' + { 277, 6, 9, 17, 4, -5 }, // 0x2C ',' + { 284, 15, 3, 18, 1, -11 }, // 0x2D '-' + { 290, 6, 6, 17, 4, -5 }, // 0x2E '.' + { 295, 15, 21, 18, 1, -20 }, // 0x2F '/' + { 335, 15, 21, 18, 1, -20 }, // 0x30 '0' + { 375, 9, 21, 18, 4, -20 }, // 0x31 '1' + { 399, 15, 21, 18, 1, -20 }, // 0x32 '2' + { 439, 15, 21, 18, 1, -20 }, // 0x33 '3' + { 479, 15, 21, 18, 1, -20 }, // 0x34 '4' + { 519, 15, 21, 18, 1, -20 }, // 0x35 '5' + { 559, 15, 21, 18, 1, -20 }, // 0x36 '6' + { 599, 15, 21, 18, 1, -20 }, // 0x37 '7' + { 639, 15, 21, 18, 1, -20 }, // 0x38 '8' + { 679, 15, 21, 18, 1, -20 }, // 0x39 '9' + { 719, 6, 18, 17, 4, -17 }, // 0x3A ':' + { 733, 6, 21, 17, 4, -17 }, // 0x3B ';' + { 749, 12, 21, 17, 1, -20 }, // 0x3C '<' + { 781, 15, 9, 18, 1, -14 }, // 0x3D '=' + { 798, 12, 21, 18, 4, -20 }, // 0x3E '>' + { 830, 15, 21, 18, 1, -20 }, // 0x3F '?' + { 870, 15, 21, 18, 1, -20 }, // 0x40 '@' + { 910, 15, 21, 18, 1, -20 }, // 0x41 'A' + { 950, 15, 21, 18, 1, -20 }, // 0x42 'B' + { 990, 15, 21, 18, 1, -20 }, // 0x43 'C' + { 1030, 15, 21, 18, 1, -20 }, // 0x44 'D' + { 1070, 15, 21, 18, 1, -20 }, // 0x45 'E' + { 1110, 15, 21, 18, 1, -20 }, // 0x46 'F' + { 1150, 15, 21, 18, 1, -20 }, // 0x47 'G' + { 1190, 15, 21, 18, 1, -20 }, // 0x48 'H' + { 1230, 9, 21, 17, 4, -20 }, // 0x49 'I' + { 1254, 15, 21, 18, 1, -20 }, // 0x4A 'J' + { 1294, 15, 21, 18, 1, -20 }, // 0x4B 'K' + { 1334, 15, 21, 18, 1, -20 }, // 0x4C 'L' + { 1374, 15, 21, 18, 1, -20 }, // 0x4D 'M' + { 1414, 15, 21, 18, 1, -20 }, // 0x4E 'N' + { 1454, 15, 21, 18, 1, -20 }, // 0x4F 'O' + { 1494, 15, 21, 18, 1, -20 }, // 0x50 'P' + { 1534, 15, 21, 18, 1, -20 }, // 0x51 'Q' + { 1574, 15, 21, 18, 1, -20 }, // 0x52 'R' + { 1614, 15, 21, 18, 1, -20 }, // 0x53 'S' + { 1654, 15, 21, 18, 1, -20 }, // 0x54 'T' + { 1694, 15, 21, 18, 1, -20 }, // 0x55 'U' + { 1734, 15, 21, 18, 1, -20 }, // 0x56 'V' + { 1774, 15, 21, 18, 1, -20 }, // 0x57 'W' + { 1814, 15, 21, 18, 1, -20 }, // 0x58 'X' + { 1854, 15, 21, 18, 1, -20 }, // 0x59 'Y' + { 1894, 15, 21, 18, 1, -20 }, // 0x5A 'Z' + { 1934, 6, 21, 17, 7, -20 }, // 0x5B '[' + { 1950, 15, 21, 18, 1, -20 }, // 0x5C '\' + { 1990, 6, 21, 17, 4, -20 }, // 0x5D ']' + { 2006, 15, 9, 18, 1, -20 }, // 0x5E '^' + { 2023, 15, 3, 18, 1, 1 }, // 0x5F '_' + { 2029, 6, 6, 17, 7, -20 }, // 0x60 '`' + { 2034, 15, 15, 18, 1, -14 }, // 0x61 'a' + { 2063, 15, 21, 18, 1, -20 }, // 0x62 'b' + { 2103, 15, 15, 18, 1, -14 }, // 0x63 'c' + { 2132, 15, 21, 18, 1, -20 }, // 0x64 'd' + { 2172, 15, 15, 18, 1, -14 }, // 0x65 'e' + { 2201, 12, 21, 18, 4, -20 }, // 0x66 'f' + { 2233, 15, 18, 18, 1, -14 }, // 0x67 'g' + { 2267, 15, 21, 18, 1, -20 }, // 0x68 'h' + { 2307, 9, 21, 17, 4, -20 }, // 0x69 'i' + { 2331, 12, 24, 17, 1, -20 }, // 0x6A 'j' + { 2367, 12, 21, 18, 4, -20 }, // 0x6B 'k' + { 2399, 9, 21, 17, 4, -20 }, // 0x6C 'l' + { 2423, 15, 15, 18, 1, -14 }, // 0x6D 'm' + { 2452, 15, 15, 18, 1, -14 }, // 0x6E 'n' + { 2481, 15, 15, 18, 1, -14 }, // 0x6F 'o' + { 2510, 15, 18, 18, 1, -14 }, // 0x70 'p' + { 2544, 15, 18, 18, 1, -14 }, // 0x71 'q' + { 2578, 12, 15, 18, 4, -14 }, // 0x72 'r' + { 2601, 15, 15, 18, 1, -14 }, // 0x73 's' + { 2630, 12, 21, 18, 4, -20 }, // 0x74 't' + { 2662, 15, 15, 18, 1, -14 }, // 0x75 'u' + { 2691, 15, 15, 18, 1, -14 }, // 0x76 'v' + { 2720, 15, 15, 18, 1, -14 }, // 0x77 'w' + { 2749, 15, 15, 18, 1, -14 }, // 0x78 'x' + { 2778, 15, 18, 18, 1, -14 }, // 0x79 'y' + { 2812, 15, 15, 18, 1, -14 }, // 0x7A 'z' + { 2841, 9, 21, 17, 4, -20 }, // 0x7B '{' + { 2865, 3, 21, 17, 7, -20 }, // 0x7C '|' + { 2873, 9, 21, 17, 4, -20 }, // 0x7D '}' + { 2897, 15, 9, 18, 1, -20 } }; // 0x7E '~' const GFXfont whitrabt16pt7b PROGMEM = { (uint8_t *)whitrabt16pt7bBitmaps, (GFXglyph *)whitrabt16pt7bGlyphs, - 0x20, 0x7E, 24 }; + 0x20, 0x7E, 24 }; // Approx. 3586 bytes +#endif // ifndef FONTS_WHITRABT16PT7B_H diff --git a/src/src/Static/Fonts/whitrabt18pt7b.h b/src/src/Static/Fonts/whitrabt18pt7b.h index e61363dd9..a76d52dc0 100644 --- a/src/src/Static/Fonts/whitrabt18pt7b.h +++ b/src/src/Static/Fonts/whitrabt18pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_WHITRABT18PT7B_H +#define FONTS_WHITRABT18PT7B_H const uint8_t whitrabt18pt7bBitmaps[] PROGMEM = { 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xC0, 0x00, 0x00, 0x00, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xBE, 0xE1, 0xF8, @@ -311,105 +313,106 @@ const uint8_t whitrabt18pt7bBitmaps[] PROGMEM = { 0x0E, 0x1F, 0x07, 0x9E, 0x01, 0xFE, 0x00, 0x7E, 0x00, 0x1E, 0x00 }; const GFXglyph whitrabt18pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 20, 0, 0 }, // 0x20 ' ' - { 1, 7, 24, 20, 5, -23 }, // 0x21 '!' - { 22, 10, 7, 20, 5, -23 }, // 0x22 '"' - { 31, 17, 24, 21, 2, -23 }, // 0x23 '#' - { 82, 17, 24, 21, 2, -23 }, // 0x24 '$' - { 133, 17, 24, 21, 2, -23 }, // 0x25 '%' - { 184, 17, 24, 21, 2, -23 }, // 0x26 '&' - { 235, 3, 7, 19, 8, -23 }, // 0x27 ''' - { 238, 7, 24, 20, 8, -23 }, // 0x28 '(' - { 259, 7, 24, 20, 5, -23 }, // 0x29 ')' - { 280, 17, 17, 21, 2, -23 }, // 0x2A '*' - { 317, 17, 17, 21, 2, -19 }, // 0x2B '+' - { 354, 7, 10, 20, 5, -6 }, // 0x2C ',' - { 363, 17, 3, 21, 2, -12 }, // 0x2D '-' - { 370, 7, 7, 20, 5, -6 }, // 0x2E '.' - { 377, 17, 24, 21, 2, -23 }, // 0x2F '/' - { 428, 17, 24, 20, 2, -23 }, // 0x30 '0' - { 479, 10, 24, 20, 5, -23 }, // 0x31 '1' - { 509, 17, 24, 20, 2, -23 }, // 0x32 '2' - { 560, 17, 24, 20, 2, -23 }, // 0x33 '3' - { 611, 17, 24, 20, 2, -23 }, // 0x34 '4' - { 662, 17, 24, 20, 2, -23 }, // 0x35 '5' - { 713, 17, 24, 20, 2, -23 }, // 0x36 '6' - { 764, 17, 24, 20, 1, -23 }, // 0x37 '7' - { 815, 17, 24, 20, 2, -23 }, // 0x38 '8' - { 866, 17, 24, 20, 2, -23 }, // 0x39 '9' - { 917, 7, 20, 20, 5, -19 }, // 0x3A ':' - { 935, 7, 24, 20, 5, -20 }, // 0x3B ';' - { 956, 14, 24, 21, 2, -23 }, // 0x3C '<' - { 998, 17, 10, 21, 2, -16 }, // 0x3D '=' - { 1020, 14, 24, 20, 5, -23 }, // 0x3E '>' - { 1062, 17, 24, 21, 2, -23 }, // 0x3F '?' - { 1113, 17, 24, 21, 2, -23 }, // 0x40 '@' - { 1164, 17, 24, 21, 2, -23 }, // 0x41 'A' - { 1215, 17, 24, 21, 2, -23 }, // 0x42 'B' - { 1266, 17, 24, 21, 2, -23 }, // 0x43 'C' - { 1317, 17, 24, 21, 2, -23 }, // 0x44 'D' - { 1368, 17, 24, 21, 2, -23 }, // 0x45 'E' - { 1419, 17, 24, 21, 2, -23 }, // 0x46 'F' - { 1470, 17, 24, 21, 2, -23 }, // 0x47 'G' - { 1521, 17, 24, 21, 2, -23 }, // 0x48 'H' - { 1572, 10, 24, 20, 5, -23 }, // 0x49 'I' - { 1602, 17, 24, 21, 2, -23 }, // 0x4A 'J' - { 1653, 17, 24, 21, 2, -23 }, // 0x4B 'K' - { 1704, 17, 24, 21, 2, -23 }, // 0x4C 'L' - { 1755, 17, 24, 21, 2, -23 }, // 0x4D 'M' - { 1806, 17, 24, 21, 2, -23 }, // 0x4E 'N' - { 1857, 17, 24, 21, 2, -23 }, // 0x4F 'O' - { 1908, 17, 24, 21, 2, -23 }, // 0x50 'P' - { 1959, 17, 24, 21, 2, -23 }, // 0x51 'Q' - { 2010, 17, 24, 21, 2, -23 }, // 0x52 'R' - { 2061, 17, 24, 21, 2, -23 }, // 0x53 'S' - { 2112, 17, 24, 21, 2, -23 }, // 0x54 'T' - { 2163, 17, 24, 21, 2, -23 }, // 0x55 'U' - { 2214, 17, 24, 21, 2, -23 }, // 0x56 'V' - { 2265, 17, 24, 21, 2, -23 }, // 0x57 'W' - { 2316, 17, 24, 21, 2, -23 }, // 0x58 'X' - { 2367, 17, 24, 21, 2, -23 }, // 0x59 'Y' - { 2418, 17, 24, 21, 2, -23 }, // 0x5A 'Z' - { 2469, 7, 24, 20, 8, -23 }, // 0x5B '[' - { 2490, 17, 24, 21, 2, -23 }, // 0x5C '\' - { 2541, 7, 24, 20, 5, -23 }, // 0x5D ']' - { 2562, 17, 10, 21, 2, -23 }, // 0x5E '^' - { 2584, 17, 3, 21, 2, 1 }, // 0x5F '_' - { 2591, 7, 7, 20, 8, -23 }, // 0x60 '`' - { 2598, 17, 17, 21, 2, -16 }, // 0x61 'a' - { 2635, 17, 24, 21, 2, -23 }, // 0x62 'b' - { 2686, 17, 17, 21, 2, -16 }, // 0x63 'c' - { 2723, 17, 24, 21, 2, -23 }, // 0x64 'd' - { 2774, 17, 17, 21, 2, -16 }, // 0x65 'e' - { 2811, 14, 24, 20, 5, -23 }, // 0x66 'f' - { 2853, 17, 20, 21, 2, -16 }, // 0x67 'g' - { 2896, 17, 24, 21, 2, -23 }, // 0x68 'h' - { 2947, 10, 24, 20, 5, -23 }, // 0x69 'i' - { 2977, 13, 27, 20, 2, -23 }, // 0x6A 'j' - { 3021, 14, 24, 20, 5, -23 }, // 0x6B 'k' - { 3063, 10, 24, 20, 5, -23 }, // 0x6C 'l' - { 3093, 17, 17, 21, 2, -16 }, // 0x6D 'm' - { 3130, 17, 17, 21, 2, -16 }, // 0x6E 'n' - { 3167, 17, 17, 21, 2, -16 }, // 0x6F 'o' - { 3204, 17, 20, 21, 2, -16 }, // 0x70 'p' - { 3247, 17, 20, 21, 2, -16 }, // 0x71 'q' - { 3290, 13, 17, 20, 5, -16 }, // 0x72 'r' - { 3318, 17, 17, 21, 2, -16 }, // 0x73 's' - { 3355, 13, 24, 20, 5, -23 }, // 0x74 't' - { 3394, 17, 17, 21, 2, -16 }, // 0x75 'u' - { 3431, 17, 17, 21, 2, -16 }, // 0x76 'v' - { 3468, 17, 17, 21, 2, -16 }, // 0x77 'w' - { 3505, 17, 17, 21, 2, -16 }, // 0x78 'x' - { 3542, 17, 20, 21, 2, -16 }, // 0x79 'y' - { 3585, 17, 17, 21, 2, -16 }, // 0x7A 'z' - { 3622, 11, 24, 21, 5, -23 }, // 0x7B '{' - { 3655, 3, 24, 19, 8, -23 }, // 0x7C '|' - { 3664, 11, 24, 21, 5, -23 }, // 0x7D '}' - { 3697, 17, 10, 21, 2, -23 } }; // 0x7E '~' + { 0, 1, 1, 20, 0, 0 }, // 0x20 ' ' + { 1, 7, 24, 20, 5, -23 }, // 0x21 '!' + { 22, 10, 7, 20, 5, -23 }, // 0x22 '"' + { 31, 17, 24, 21, 2, -23 }, // 0x23 '#' + { 82, 17, 24, 21, 2, -23 }, // 0x24 '$' + { 133, 17, 24, 21, 2, -23 }, // 0x25 '%' + { 184, 17, 24, 21, 2, -23 }, // 0x26 '&' + { 235, 3, 7, 19, 8, -23 }, // 0x27 ''' + { 238, 7, 24, 20, 8, -23 }, // 0x28 '(' + { 259, 7, 24, 20, 5, -23 }, // 0x29 ')' + { 280, 17, 17, 21, 2, -23 }, // 0x2A '*' + { 317, 17, 17, 21, 2, -19 }, // 0x2B '+' + { 354, 7, 10, 20, 5, -6 }, // 0x2C ',' + { 363, 17, 3, 21, 2, -12 }, // 0x2D '-' + { 370, 7, 7, 20, 5, -6 }, // 0x2E '.' + { 377, 17, 24, 21, 2, -23 }, // 0x2F '/' + { 428, 17, 24, 20, 2, -23 }, // 0x30 '0' + { 479, 10, 24, 20, 5, -23 }, // 0x31 '1' + { 509, 17, 24, 20, 2, -23 }, // 0x32 '2' + { 560, 17, 24, 20, 2, -23 }, // 0x33 '3' + { 611, 17, 24, 20, 2, -23 }, // 0x34 '4' + { 662, 17, 24, 20, 2, -23 }, // 0x35 '5' + { 713, 17, 24, 20, 2, -23 }, // 0x36 '6' + { 764, 17, 24, 20, 1, -23 }, // 0x37 '7' + { 815, 17, 24, 20, 2, -23 }, // 0x38 '8' + { 866, 17, 24, 20, 2, -23 }, // 0x39 '9' + { 917, 7, 20, 20, 5, -19 }, // 0x3A ':' + { 935, 7, 24, 20, 5, -20 }, // 0x3B ';' + { 956, 14, 24, 21, 2, -23 }, // 0x3C '<' + { 998, 17, 10, 21, 2, -16 }, // 0x3D '=' + { 1020, 14, 24, 20, 5, -23 }, // 0x3E '>' + { 1062, 17, 24, 21, 2, -23 }, // 0x3F '?' + { 1113, 17, 24, 21, 2, -23 }, // 0x40 '@' + { 1164, 17, 24, 21, 2, -23 }, // 0x41 'A' + { 1215, 17, 24, 21, 2, -23 }, // 0x42 'B' + { 1266, 17, 24, 21, 2, -23 }, // 0x43 'C' + { 1317, 17, 24, 21, 2, -23 }, // 0x44 'D' + { 1368, 17, 24, 21, 2, -23 }, // 0x45 'E' + { 1419, 17, 24, 21, 2, -23 }, // 0x46 'F' + { 1470, 17, 24, 21, 2, -23 }, // 0x47 'G' + { 1521, 17, 24, 21, 2, -23 }, // 0x48 'H' + { 1572, 10, 24, 20, 5, -23 }, // 0x49 'I' + { 1602, 17, 24, 21, 2, -23 }, // 0x4A 'J' + { 1653, 17, 24, 21, 2, -23 }, // 0x4B 'K' + { 1704, 17, 24, 21, 2, -23 }, // 0x4C 'L' + { 1755, 17, 24, 21, 2, -23 }, // 0x4D 'M' + { 1806, 17, 24, 21, 2, -23 }, // 0x4E 'N' + { 1857, 17, 24, 21, 2, -23 }, // 0x4F 'O' + { 1908, 17, 24, 21, 2, -23 }, // 0x50 'P' + { 1959, 17, 24, 21, 2, -23 }, // 0x51 'Q' + { 2010, 17, 24, 21, 2, -23 }, // 0x52 'R' + { 2061, 17, 24, 21, 2, -23 }, // 0x53 'S' + { 2112, 17, 24, 21, 2, -23 }, // 0x54 'T' + { 2163, 17, 24, 21, 2, -23 }, // 0x55 'U' + { 2214, 17, 24, 21, 2, -23 }, // 0x56 'V' + { 2265, 17, 24, 21, 2, -23 }, // 0x57 'W' + { 2316, 17, 24, 21, 2, -23 }, // 0x58 'X' + { 2367, 17, 24, 21, 2, -23 }, // 0x59 'Y' + { 2418, 17, 24, 21, 2, -23 }, // 0x5A 'Z' + { 2469, 7, 24, 20, 8, -23 }, // 0x5B '[' + { 2490, 17, 24, 21, 2, -23 }, // 0x5C '\' + { 2541, 7, 24, 20, 5, -23 }, // 0x5D ']' + { 2562, 17, 10, 21, 2, -23 }, // 0x5E '^' + { 2584, 17, 3, 21, 2, 1 }, // 0x5F '_' + { 2591, 7, 7, 20, 8, -23 }, // 0x60 '`' + { 2598, 17, 17, 21, 2, -16 }, // 0x61 'a' + { 2635, 17, 24, 21, 2, -23 }, // 0x62 'b' + { 2686, 17, 17, 21, 2, -16 }, // 0x63 'c' + { 2723, 17, 24, 21, 2, -23 }, // 0x64 'd' + { 2774, 17, 17, 21, 2, -16 }, // 0x65 'e' + { 2811, 14, 24, 20, 5, -23 }, // 0x66 'f' + { 2853, 17, 20, 21, 2, -16 }, // 0x67 'g' + { 2896, 17, 24, 21, 2, -23 }, // 0x68 'h' + { 2947, 10, 24, 20, 5, -23 }, // 0x69 'i' + { 2977, 13, 27, 20, 2, -23 }, // 0x6A 'j' + { 3021, 14, 24, 20, 5, -23 }, // 0x6B 'k' + { 3063, 10, 24, 20, 5, -23 }, // 0x6C 'l' + { 3093, 17, 17, 21, 2, -16 }, // 0x6D 'm' + { 3130, 17, 17, 21, 2, -16 }, // 0x6E 'n' + { 3167, 17, 17, 21, 2, -16 }, // 0x6F 'o' + { 3204, 17, 20, 21, 2, -16 }, // 0x70 'p' + { 3247, 17, 20, 21, 2, -16 }, // 0x71 'q' + { 3290, 13, 17, 20, 5, -16 }, // 0x72 'r' + { 3318, 17, 17, 21, 2, -16 }, // 0x73 's' + { 3355, 13, 24, 20, 5, -23 }, // 0x74 't' + { 3394, 17, 17, 21, 2, -16 }, // 0x75 'u' + { 3431, 17, 17, 21, 2, -16 }, // 0x76 'v' + { 3468, 17, 17, 21, 2, -16 }, // 0x77 'w' + { 3505, 17, 17, 21, 2, -16 }, // 0x78 'x' + { 3542, 17, 20, 21, 2, -16 }, // 0x79 'y' + { 3585, 17, 17, 21, 2, -16 }, // 0x7A 'z' + { 3622, 11, 24, 21, 5, -23 }, // 0x7B '{' + { 3655, 3, 24, 19, 8, -23 }, // 0x7C '|' + { 3664, 11, 24, 21, 5, -23 }, // 0x7D '}' + { 3697, 17, 10, 21, 2, -23 } }; // 0x7E '~' const GFXfont whitrabt18pt7b PROGMEM = { (uint8_t *)whitrabt18pt7bBitmaps, (GFXglyph *)whitrabt18pt7bGlyphs, - 0x20, 0x7E, 27 }; + 0x20, 0x7E, 27 }; // Approx. 4391 bytes +#endif // ifndef FONTS_WHITRABT18PT7B_H diff --git a/src/src/Static/Fonts/whitrabt20pt7b.h b/src/src/Static/Fonts/whitrabt20pt7b.h index 83f96984c..311b7f8b0 100644 --- a/src/src/Static/Fonts/whitrabt20pt7b.h +++ b/src/src/Static/Fonts/whitrabt20pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_WHITRABT20PT7B_H +#define FONTS_WHITRABT20PT7B_H const uint8_t whitrabt20pt7bBitmaps[] PROGMEM = { 0x00, 0x7D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x07, 0xDF, 0xFF, 0xFF, 0xFF, 0xFD, @@ -391,105 +393,106 @@ const uint8_t whitrabt20pt7bBitmaps[] PROGMEM = { 0x7C, 0x07, 0xFF, 0x00, 0xFF, 0x80, 0x1F, 0xC0, 0x03, 0xE0 }; const GFXglyph whitrabt20pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 22, 0, 0 }, // 0x20 ' ' - { 1, 7, 27, 22, 6, -26 }, // 0x21 '!' - { 25, 11, 7, 23, 6, -26 }, // 0x22 '"' - { 35, 19, 27, 23, 2, -26 }, // 0x23 '#' - { 100, 18, 27, 22, 2, -26 }, // 0x24 '$' - { 161, 18, 27, 22, 2, -26 }, // 0x25 '%' - { 222, 19, 27, 22, 2, -26 }, // 0x26 '&' - { 287, 4, 7, 22, 9, -26 }, // 0x27 ''' - { 291, 8, 27, 22, 9, -26 }, // 0x28 '(' - { 318, 8, 27, 22, 5, -26 }, // 0x29 ')' - { 345, 19, 20, 23, 2, -26 }, // 0x2A '*' - { 393, 19, 19, 23, 2, -22 }, // 0x2B '+' - { 439, 7, 11, 22, 6, -6 }, // 0x2C ',' - { 449, 19, 4, 23, 2, -14 }, // 0x2D '-' - { 459, 7, 7, 22, 6, -6 }, // 0x2E '.' - { 466, 19, 27, 23, 2, -26 }, // 0x2F '/' - { 531, 19, 27, 22, 2, -26 }, // 0x30 '0' - { 596, 11, 27, 22, 6, -26 }, // 0x31 '1' - { 634, 19, 27, 22, 2, -26 }, // 0x32 '2' - { 699, 19, 27, 22, 2, -26 }, // 0x33 '3' - { 764, 19, 27, 22, 2, -26 }, // 0x34 '4' - { 829, 19, 27, 22, 2, -26 }, // 0x35 '5' - { 894, 19, 27, 22, 2, -26 }, // 0x36 '6' - { 959, 19, 27, 22, 2, -26 }, // 0x37 '7' - { 1024, 19, 27, 22, 2, -26 }, // 0x38 '8' - { 1089, 19, 27, 22, 2, -26 }, // 0x39 '9' - { 1154, 7, 23, 22, 6, -22 }, // 0x3A ':' - { 1175, 7, 26, 22, 6, -21 }, // 0x3B ';' - { 1198, 15, 27, 23, 2, -26 }, // 0x3C '<' - { 1249, 19, 12, 23, 2, -18 }, // 0x3D '=' - { 1278, 15, 27, 23, 6, -26 }, // 0x3E '>' - { 1329, 18, 27, 22, 2, -26 }, // 0x3F '?' - { 1390, 18, 27, 22, 2, -26 }, // 0x40 '@' - { 1451, 19, 27, 23, 2, -26 }, // 0x41 'A' - { 1516, 19, 27, 23, 2, -26 }, // 0x42 'B' - { 1581, 19, 27, 23, 2, -26 }, // 0x43 'C' - { 1646, 19, 27, 23, 2, -26 }, // 0x44 'D' - { 1711, 19, 27, 22, 2, -26 }, // 0x45 'E' - { 1776, 19, 27, 22, 2, -26 }, // 0x46 'F' - { 1841, 19, 27, 23, 2, -26 }, // 0x47 'G' - { 1906, 19, 27, 23, 2, -26 }, // 0x48 'H' - { 1971, 11, 27, 23, 6, -26 }, // 0x49 'I' - { 2009, 19, 27, 23, 2, -26 }, // 0x4A 'J' - { 2074, 19, 27, 22, 2, -26 }, // 0x4B 'K' - { 2139, 19, 27, 22, 2, -26 }, // 0x4C 'L' - { 2204, 19, 27, 23, 2, -26 }, // 0x4D 'M' - { 2269, 19, 27, 23, 2, -26 }, // 0x4E 'N' - { 2334, 19, 27, 23, 2, -26 }, // 0x4F 'O' - { 2399, 19, 27, 23, 2, -26 }, // 0x50 'P' - { 2464, 19, 27, 23, 2, -26 }, // 0x51 'Q' - { 2529, 19, 27, 23, 2, -26 }, // 0x52 'R' - { 2594, 19, 27, 23, 2, -26 }, // 0x53 'S' - { 2659, 19, 27, 23, 2, -26 }, // 0x54 'T' - { 2724, 19, 27, 23, 2, -26 }, // 0x55 'U' - { 2789, 19, 27, 23, 2, -26 }, // 0x56 'V' - { 2854, 18, 27, 22, 2, -26 }, // 0x57 'W' - { 2915, 19, 27, 23, 2, -26 }, // 0x58 'X' - { 2980, 18, 27, 22, 2, -26 }, // 0x59 'Y' - { 3041, 19, 27, 23, 2, -26 }, // 0x5A 'Z' - { 3106, 8, 27, 22, 9, -26 }, // 0x5B '[' - { 3133, 19, 27, 23, 2, -26 }, // 0x5C '\' - { 3198, 8, 27, 22, 5, -26 }, // 0x5D ']' - { 3225, 19, 12, 23, 2, -26 }, // 0x5E '^' - { 3254, 19, 4, 23, 2, 1 }, // 0x5F '_' - { 3264, 8, 8, 22, 9, -26 }, // 0x60 '`' - { 3272, 19, 19, 23, 2, -18 }, // 0x61 'a' - { 3318, 19, 27, 23, 2, -26 }, // 0x62 'b' - { 3383, 19, 19, 23, 2, -18 }, // 0x63 'c' - { 3429, 19, 27, 23, 2, -26 }, // 0x64 'd' - { 3494, 19, 19, 23, 2, -18 }, // 0x65 'e' - { 3540, 15, 27, 23, 6, -26 }, // 0x66 'f' - { 3591, 19, 23, 23, 2, -18 }, // 0x67 'g' - { 3646, 19, 27, 23, 2, -26 }, // 0x68 'h' - { 3711, 11, 27, 23, 6, -26 }, // 0x69 'i' - { 3749, 15, 31, 23, 2, -26 }, // 0x6A 'j' - { 3808, 15, 27, 23, 6, -26 }, // 0x6B 'k' - { 3859, 11, 27, 23, 6, -26 }, // 0x6C 'l' - { 3897, 18, 19, 22, 2, -18 }, // 0x6D 'm' - { 3940, 19, 19, 23, 2, -18 }, // 0x6E 'n' - { 3986, 19, 19, 23, 2, -18 }, // 0x6F 'o' - { 4032, 19, 23, 23, 2, -18 }, // 0x70 'p' - { 4087, 19, 23, 23, 2, -18 }, // 0x71 'q' - { 4142, 15, 19, 23, 6, -18 }, // 0x72 'r' - { 4178, 19, 19, 23, 2, -18 }, // 0x73 's' - { 4224, 15, 27, 23, 6, -26 }, // 0x74 't' - { 4275, 19, 19, 23, 2, -18 }, // 0x75 'u' - { 4321, 19, 19, 23, 2, -18 }, // 0x76 'v' - { 4367, 18, 19, 22, 2, -18 }, // 0x77 'w' - { 4410, 19, 19, 23, 2, -18 }, // 0x78 'x' - { 4456, 19, 23, 23, 2, -18 }, // 0x79 'y' - { 4511, 19, 19, 23, 2, -18 }, // 0x7A 'z' - { 4557, 12, 27, 22, 5, -26 }, // 0x7B '{' - { 4598, 4, 27, 22, 9, -26 }, // 0x7C '|' - { 4612, 12, 27, 22, 5, -26 }, // 0x7D '}' - { 4653, 18, 11, 22, 2, -25 } }; // 0x7E '~' + { 0, 1, 1, 22, 0, 0 }, // 0x20 ' ' + { 1, 7, 27, 22, 6, -26 }, // 0x21 '!' + { 25, 11, 7, 23, 6, -26 }, // 0x22 '"' + { 35, 19, 27, 23, 2, -26 }, // 0x23 '#' + { 100, 18, 27, 22, 2, -26 }, // 0x24 '$' + { 161, 18, 27, 22, 2, -26 }, // 0x25 '%' + { 222, 19, 27, 22, 2, -26 }, // 0x26 '&' + { 287, 4, 7, 22, 9, -26 }, // 0x27 ''' + { 291, 8, 27, 22, 9, -26 }, // 0x28 '(' + { 318, 8, 27, 22, 5, -26 }, // 0x29 ')' + { 345, 19, 20, 23, 2, -26 }, // 0x2A '*' + { 393, 19, 19, 23, 2, -22 }, // 0x2B '+' + { 439, 7, 11, 22, 6, -6 }, // 0x2C ',' + { 449, 19, 4, 23, 2, -14 }, // 0x2D '-' + { 459, 7, 7, 22, 6, -6 }, // 0x2E '.' + { 466, 19, 27, 23, 2, -26 }, // 0x2F '/' + { 531, 19, 27, 22, 2, -26 }, // 0x30 '0' + { 596, 11, 27, 22, 6, -26 }, // 0x31 '1' + { 634, 19, 27, 22, 2, -26 }, // 0x32 '2' + { 699, 19, 27, 22, 2, -26 }, // 0x33 '3' + { 764, 19, 27, 22, 2, -26 }, // 0x34 '4' + { 829, 19, 27, 22, 2, -26 }, // 0x35 '5' + { 894, 19, 27, 22, 2, -26 }, // 0x36 '6' + { 959, 19, 27, 22, 2, -26 }, // 0x37 '7' + { 1024, 19, 27, 22, 2, -26 }, // 0x38 '8' + { 1089, 19, 27, 22, 2, -26 }, // 0x39 '9' + { 1154, 7, 23, 22, 6, -22 }, // 0x3A ':' + { 1175, 7, 26, 22, 6, -21 }, // 0x3B ';' + { 1198, 15, 27, 23, 2, -26 }, // 0x3C '<' + { 1249, 19, 12, 23, 2, -18 }, // 0x3D '=' + { 1278, 15, 27, 23, 6, -26 }, // 0x3E '>' + { 1329, 18, 27, 22, 2, -26 }, // 0x3F '?' + { 1390, 18, 27, 22, 2, -26 }, // 0x40 '@' + { 1451, 19, 27, 23, 2, -26 }, // 0x41 'A' + { 1516, 19, 27, 23, 2, -26 }, // 0x42 'B' + { 1581, 19, 27, 23, 2, -26 }, // 0x43 'C' + { 1646, 19, 27, 23, 2, -26 }, // 0x44 'D' + { 1711, 19, 27, 22, 2, -26 }, // 0x45 'E' + { 1776, 19, 27, 22, 2, -26 }, // 0x46 'F' + { 1841, 19, 27, 23, 2, -26 }, // 0x47 'G' + { 1906, 19, 27, 23, 2, -26 }, // 0x48 'H' + { 1971, 11, 27, 23, 6, -26 }, // 0x49 'I' + { 2009, 19, 27, 23, 2, -26 }, // 0x4A 'J' + { 2074, 19, 27, 22, 2, -26 }, // 0x4B 'K' + { 2139, 19, 27, 22, 2, -26 }, // 0x4C 'L' + { 2204, 19, 27, 23, 2, -26 }, // 0x4D 'M' + { 2269, 19, 27, 23, 2, -26 }, // 0x4E 'N' + { 2334, 19, 27, 23, 2, -26 }, // 0x4F 'O' + { 2399, 19, 27, 23, 2, -26 }, // 0x50 'P' + { 2464, 19, 27, 23, 2, -26 }, // 0x51 'Q' + { 2529, 19, 27, 23, 2, -26 }, // 0x52 'R' + { 2594, 19, 27, 23, 2, -26 }, // 0x53 'S' + { 2659, 19, 27, 23, 2, -26 }, // 0x54 'T' + { 2724, 19, 27, 23, 2, -26 }, // 0x55 'U' + { 2789, 19, 27, 23, 2, -26 }, // 0x56 'V' + { 2854, 18, 27, 22, 2, -26 }, // 0x57 'W' + { 2915, 19, 27, 23, 2, -26 }, // 0x58 'X' + { 2980, 18, 27, 22, 2, -26 }, // 0x59 'Y' + { 3041, 19, 27, 23, 2, -26 }, // 0x5A 'Z' + { 3106, 8, 27, 22, 9, -26 }, // 0x5B '[' + { 3133, 19, 27, 23, 2, -26 }, // 0x5C '\' + { 3198, 8, 27, 22, 5, -26 }, // 0x5D ']' + { 3225, 19, 12, 23, 2, -26 }, // 0x5E '^' + { 3254, 19, 4, 23, 2, 1 }, // 0x5F '_' + { 3264, 8, 8, 22, 9, -26 }, // 0x60 '`' + { 3272, 19, 19, 23, 2, -18 }, // 0x61 'a' + { 3318, 19, 27, 23, 2, -26 }, // 0x62 'b' + { 3383, 19, 19, 23, 2, -18 }, // 0x63 'c' + { 3429, 19, 27, 23, 2, -26 }, // 0x64 'd' + { 3494, 19, 19, 23, 2, -18 }, // 0x65 'e' + { 3540, 15, 27, 23, 6, -26 }, // 0x66 'f' + { 3591, 19, 23, 23, 2, -18 }, // 0x67 'g' + { 3646, 19, 27, 23, 2, -26 }, // 0x68 'h' + { 3711, 11, 27, 23, 6, -26 }, // 0x69 'i' + { 3749, 15, 31, 23, 2, -26 }, // 0x6A 'j' + { 3808, 15, 27, 23, 6, -26 }, // 0x6B 'k' + { 3859, 11, 27, 23, 6, -26 }, // 0x6C 'l' + { 3897, 18, 19, 22, 2, -18 }, // 0x6D 'm' + { 3940, 19, 19, 23, 2, -18 }, // 0x6E 'n' + { 3986, 19, 19, 23, 2, -18 }, // 0x6F 'o' + { 4032, 19, 23, 23, 2, -18 }, // 0x70 'p' + { 4087, 19, 23, 23, 2, -18 }, // 0x71 'q' + { 4142, 15, 19, 23, 6, -18 }, // 0x72 'r' + { 4178, 19, 19, 23, 2, -18 }, // 0x73 's' + { 4224, 15, 27, 23, 6, -26 }, // 0x74 't' + { 4275, 19, 19, 23, 2, -18 }, // 0x75 'u' + { 4321, 19, 19, 23, 2, -18 }, // 0x76 'v' + { 4367, 18, 19, 22, 2, -18 }, // 0x77 'w' + { 4410, 19, 19, 23, 2, -18 }, // 0x78 'x' + { 4456, 19, 23, 23, 2, -18 }, // 0x79 'y' + { 4511, 19, 19, 23, 2, -18 }, // 0x7A 'z' + { 4557, 12, 27, 22, 5, -26 }, // 0x7B '{' + { 4598, 4, 27, 22, 9, -26 }, // 0x7C '|' + { 4612, 12, 27, 22, 5, -26 }, // 0x7D '}' + { 4653, 18, 11, 22, 2, -25 } }; // 0x7E '~' const GFXfont whitrabt20pt7b PROGMEM = { (uint8_t *)whitrabt20pt7bBitmaps, (GFXglyph *)whitrabt20pt7bGlyphs, - 0x20, 0x7E, 30 }; + 0x20, 0x7E, 30 }; // Approx. 5350 bytes +#endif // ifndef FONTS_WHITRABT20PT7B_H diff --git a/src/src/Static/Fonts/whitrabt8pt7b.h b/src/src/Static/Fonts/whitrabt8pt7b.h index 3cc51e8ac..85748d59f 100644 --- a/src/src/Static/Fonts/whitrabt8pt7b.h +++ b/src/src/Static/Fonts/whitrabt8pt7b.h @@ -1,3 +1,5 @@ +#ifndef FONTS_WHITRABT8PT7B_H +#define FONTS_WHITRABT8PT7B_H const uint8_t whitrabt8pt7bBitmaps[] PROGMEM = { 0x00, 0xFF, 0xFF, 0xC0, 0xFF, 0x80, 0xDE, 0xF6, 0x6C, 0xD9, 0xB7, 0xF6, 0xCD, 0xBF, 0xB6, 0x6C, 0xD9, 0xB0, 0x18, 0x18, 0x7F, 0xD8, 0xD8, 0x7E, @@ -69,105 +71,106 @@ const uint8_t whitrabt8pt7bBitmaps[] PROGMEM = { 0xDB, 0xDB, 0xDB, 0x0E }; const GFXglyph whitrabt8pt7bGlyphs[] PROGMEM = { - { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' - { 1, 3, 11, 9, 2, -10 }, // 0x21 '!' - { 6, 5, 3, 9, 2, -10 }, // 0x22 '"' - { 8, 7, 11, 9, 1, -10 }, // 0x23 '#' - { 18, 8, 11, 10, 1, -10 }, // 0x24 '$' - { 29, 8, 11, 10, 1, -10 }, // 0x25 '%' - { 40, 8, 11, 9, 1, -10 }, // 0x26 '&' - { 51, 2, 3, 10, 4, -10 }, // 0x27 ''' - { 52, 3, 11, 9, 4, -10 }, // 0x28 '(' - { 57, 4, 11, 10, 2, -10 }, // 0x29 ')' - { 63, 7, 7, 9, 1, -10 }, // 0x2A '*' - { 70, 7, 8, 9, 1, -9 }, // 0x2B '+' - { 77, 3, 5, 9, 2, -2 }, // 0x2C ',' - { 79, 7, 1, 9, 1, -5 }, // 0x2D '-' - { 80, 3, 3, 9, 2, -2 }, // 0x2E '.' - { 82, 8, 11, 10, 1, -10 }, // 0x2F '/' - { 93, 8, 11, 9, 1, -10 }, // 0x30 '0' - { 104, 5, 11, 9, 1, -10 }, // 0x31 '1' - { 111, 8, 11, 9, 1, -10 }, // 0x32 '2' - { 122, 8, 11, 9, 1, -10 }, // 0x33 '3' - { 133, 7, 11, 9, 1, -10 }, // 0x34 '4' - { 143, 8, 11, 9, 1, -10 }, // 0x35 '5' - { 154, 8, 11, 9, 1, -10 }, // 0x36 '6' - { 165, 8, 11, 9, 1, -10 }, // 0x37 '7' - { 176, 8, 11, 9, 1, -10 }, // 0x38 '8' - { 187, 8, 11, 9, 1, -10 }, // 0x39 '9' - { 198, 3, 9, 9, 2, -8 }, // 0x3A ':' - { 202, 3, 11, 9, 2, -8 }, // 0x3B ';' - { 207, 6, 11, 9, 1, -10 }, // 0x3C '<' - { 216, 7, 4, 9, 1, -7 }, // 0x3D '=' - { 220, 6, 11, 9, 2, -10 }, // 0x3E '>' - { 229, 8, 11, 10, 1, -10 }, // 0x3F '?' - { 240, 8, 11, 10, 1, -10 }, // 0x40 '@' - { 251, 8, 11, 10, 1, -10 }, // 0x41 'A' - { 262, 8, 11, 10, 1, -10 }, // 0x42 'B' - { 273, 8, 11, 10, 1, -10 }, // 0x43 'C' - { 284, 8, 11, 10, 1, -10 }, // 0x44 'D' - { 295, 8, 11, 10, 1, -10 }, // 0x45 'E' - { 306, 8, 11, 10, 1, -10 }, // 0x46 'F' - { 317, 8, 11, 10, 1, -10 }, // 0x47 'G' - { 328, 8, 11, 10, 1, -10 }, // 0x48 'H' - { 339, 4, 11, 8, 2, -10 }, // 0x49 'I' - { 345, 8, 11, 10, 1, -10 }, // 0x4A 'J' - { 356, 8, 11, 10, 1, -10 }, // 0x4B 'K' - { 367, 8, 11, 10, 1, -10 }, // 0x4C 'L' - { 378, 8, 11, 10, 1, -10 }, // 0x4D 'M' - { 389, 8, 11, 10, 1, -10 }, // 0x4E 'N' - { 400, 8, 11, 10, 1, -10 }, // 0x4F 'O' - { 411, 8, 11, 10, 1, -10 }, // 0x50 'P' - { 422, 8, 11, 10, 1, -10 }, // 0x51 'Q' - { 433, 8, 11, 10, 1, -10 }, // 0x52 'R' - { 444, 8, 11, 10, 1, -10 }, // 0x53 'S' - { 455, 7, 11, 9, 1, -10 }, // 0x54 'T' - { 465, 8, 11, 10, 1, -10 }, // 0x55 'U' - { 476, 8, 11, 10, 1, -10 }, // 0x56 'V' - { 487, 8, 11, 10, 1, -10 }, // 0x57 'W' - { 498, 8, 11, 10, 1, -10 }, // 0x58 'X' - { 509, 8, 11, 10, 1, -10 }, // 0x59 'Y' - { 520, 8, 11, 10, 1, -10 }, // 0x5A 'Z' - { 531, 4, 11, 10, 4, -10 }, // 0x5B '[' - { 537, 8, 11, 10, 1, -10 }, // 0x5C '\' - { 548, 4, 11, 10, 2, -10 }, // 0x5D ']' - { 554, 7, 5, 9, 1, -10 }, // 0x5E '^' - { 559, 7, 1, 9, 1, 1 }, // 0x5F '_' - { 560, 3, 3, 9, 4, -10 }, // 0x60 '`' - { 562, 8, 8, 10, 1, -7 }, // 0x61 'a' - { 570, 8, 11, 10, 1, -10 }, // 0x62 'b' - { 581, 8, 8, 10, 1, -7 }, // 0x63 'c' - { 589, 8, 11, 10, 1, -10 }, // 0x64 'd' - { 600, 8, 8, 10, 1, -7 }, // 0x65 'e' - { 608, 6, 11, 9, 2, -10 }, // 0x66 'f' - { 617, 8, 10, 10, 1, -7 }, // 0x67 'g' - { 627, 8, 11, 10, 1, -10 }, // 0x68 'h' - { 638, 5, 11, 8, 1, -10 }, // 0x69 'i' - { 645, 6, 13, 9, 1, -10 }, // 0x6A 'j' - { 655, 6, 11, 9, 2, -10 }, // 0x6B 'k' - { 664, 5, 11, 8, 1, -10 }, // 0x6C 'l' - { 671, 8, 8, 10, 1, -7 }, // 0x6D 'm' - { 679, 8, 8, 10, 1, -7 }, // 0x6E 'n' - { 687, 8, 8, 10, 1, -7 }, // 0x6F 'o' - { 695, 8, 10, 10, 1, -7 }, // 0x70 'p' - { 705, 8, 10, 10, 1, -7 }, // 0x71 'q' - { 715, 6, 8, 9, 2, -7 }, // 0x72 'r' - { 721, 8, 8, 10, 1, -7 }, // 0x73 's' - { 729, 6, 11, 9, 2, -10 }, // 0x74 't' - { 738, 8, 8, 10, 1, -7 }, // 0x75 'u' - { 746, 8, 8, 10, 1, -7 }, // 0x76 'v' - { 754, 8, 8, 10, 1, -7 }, // 0x77 'w' - { 762, 7, 8, 9, 1, -7 }, // 0x78 'x' - { 769, 8, 10, 10, 1, -7 }, // 0x79 'y' - { 779, 7, 8, 9, 1, -7 }, // 0x7A 'z' - { 786, 5, 11, 9, 2, -10 }, // 0x7B '{' - { 793, 2, 11, 10, 4, -10 }, // 0x7C '|' - { 796, 5, 11, 9, 2, -10 }, // 0x7D '}' - { 803, 8, 5, 10, 1, -11 } }; // 0x7E '~' + { 0, 1, 1, 9, 0, 0 }, // 0x20 ' ' + { 1, 3, 11, 9, 2, -10 }, // 0x21 '!' + { 6, 5, 3, 9, 2, -10 }, // 0x22 '"' + { 8, 7, 11, 9, 1, -10 }, // 0x23 '#' + { 18, 8, 11, 10, 1, -10 }, // 0x24 '$' + { 29, 8, 11, 10, 1, -10 }, // 0x25 '%' + { 40, 8, 11, 9, 1, -10 }, // 0x26 '&' + { 51, 2, 3, 10, 4, -10 }, // 0x27 ''' + { 52, 3, 11, 9, 4, -10 }, // 0x28 '(' + { 57, 4, 11, 10, 2, -10 }, // 0x29 ')' + { 63, 7, 7, 9, 1, -10 }, // 0x2A '*' + { 70, 7, 8, 9, 1, -9 }, // 0x2B '+' + { 77, 3, 5, 9, 2, -2 }, // 0x2C ',' + { 79, 7, 1, 9, 1, -5 }, // 0x2D '-' + { 80, 3, 3, 9, 2, -2 }, // 0x2E '.' + { 82, 8, 11, 10, 1, -10 }, // 0x2F '/' + { 93, 8, 11, 9, 1, -10 }, // 0x30 '0' + { 104, 5, 11, 9, 1, -10 }, // 0x31 '1' + { 111, 8, 11, 9, 1, -10 }, // 0x32 '2' + { 122, 8, 11, 9, 1, -10 }, // 0x33 '3' + { 133, 7, 11, 9, 1, -10 }, // 0x34 '4' + { 143, 8, 11, 9, 1, -10 }, // 0x35 '5' + { 154, 8, 11, 9, 1, -10 }, // 0x36 '6' + { 165, 8, 11, 9, 1, -10 }, // 0x37 '7' + { 176, 8, 11, 9, 1, -10 }, // 0x38 '8' + { 187, 8, 11, 9, 1, -10 }, // 0x39 '9' + { 198, 3, 9, 9, 2, -8 }, // 0x3A ':' + { 202, 3, 11, 9, 2, -8 }, // 0x3B ';' + { 207, 6, 11, 9, 1, -10 }, // 0x3C '<' + { 216, 7, 4, 9, 1, -7 }, // 0x3D '=' + { 220, 6, 11, 9, 2, -10 }, // 0x3E '>' + { 229, 8, 11, 10, 1, -10 }, // 0x3F '?' + { 240, 8, 11, 10, 1, -10 }, // 0x40 '@' + { 251, 8, 11, 10, 1, -10 }, // 0x41 'A' + { 262, 8, 11, 10, 1, -10 }, // 0x42 'B' + { 273, 8, 11, 10, 1, -10 }, // 0x43 'C' + { 284, 8, 11, 10, 1, -10 }, // 0x44 'D' + { 295, 8, 11, 10, 1, -10 }, // 0x45 'E' + { 306, 8, 11, 10, 1, -10 }, // 0x46 'F' + { 317, 8, 11, 10, 1, -10 }, // 0x47 'G' + { 328, 8, 11, 10, 1, -10 }, // 0x48 'H' + { 339, 4, 11, 8, 2, -10 }, // 0x49 'I' + { 345, 8, 11, 10, 1, -10 }, // 0x4A 'J' + { 356, 8, 11, 10, 1, -10 }, // 0x4B 'K' + { 367, 8, 11, 10, 1, -10 }, // 0x4C 'L' + { 378, 8, 11, 10, 1, -10 }, // 0x4D 'M' + { 389, 8, 11, 10, 1, -10 }, // 0x4E 'N' + { 400, 8, 11, 10, 1, -10 }, // 0x4F 'O' + { 411, 8, 11, 10, 1, -10 }, // 0x50 'P' + { 422, 8, 11, 10, 1, -10 }, // 0x51 'Q' + { 433, 8, 11, 10, 1, -10 }, // 0x52 'R' + { 444, 8, 11, 10, 1, -10 }, // 0x53 'S' + { 455, 7, 11, 9, 1, -10 }, // 0x54 'T' + { 465, 8, 11, 10, 1, -10 }, // 0x55 'U' + { 476, 8, 11, 10, 1, -10 }, // 0x56 'V' + { 487, 8, 11, 10, 1, -10 }, // 0x57 'W' + { 498, 8, 11, 10, 1, -10 }, // 0x58 'X' + { 509, 8, 11, 10, 1, -10 }, // 0x59 'Y' + { 520, 8, 11, 10, 1, -10 }, // 0x5A 'Z' + { 531, 4, 11, 10, 4, -10 }, // 0x5B '[' + { 537, 8, 11, 10, 1, -10 }, // 0x5C '\' + { 548, 4, 11, 10, 2, -10 }, // 0x5D ']' + { 554, 7, 5, 9, 1, -10 }, // 0x5E '^' + { 559, 7, 1, 9, 1, 1 }, // 0x5F '_' + { 560, 3, 3, 9, 4, -10 }, // 0x60 '`' + { 562, 8, 8, 10, 1, -7 }, // 0x61 'a' + { 570, 8, 11, 10, 1, -10 }, // 0x62 'b' + { 581, 8, 8, 10, 1, -7 }, // 0x63 'c' + { 589, 8, 11, 10, 1, -10 }, // 0x64 'd' + { 600, 8, 8, 10, 1, -7 }, // 0x65 'e' + { 608, 6, 11, 9, 2, -10 }, // 0x66 'f' + { 617, 8, 10, 10, 1, -7 }, // 0x67 'g' + { 627, 8, 11, 10, 1, -10 }, // 0x68 'h' + { 638, 5, 11, 8, 1, -10 }, // 0x69 'i' + { 645, 6, 13, 9, 1, -10 }, // 0x6A 'j' + { 655, 6, 11, 9, 2, -10 }, // 0x6B 'k' + { 664, 5, 11, 8, 1, -10 }, // 0x6C 'l' + { 671, 8, 8, 10, 1, -7 }, // 0x6D 'm' + { 679, 8, 8, 10, 1, -7 }, // 0x6E 'n' + { 687, 8, 8, 10, 1, -7 }, // 0x6F 'o' + { 695, 8, 10, 10, 1, -7 }, // 0x70 'p' + { 705, 8, 10, 10, 1, -7 }, // 0x71 'q' + { 715, 6, 8, 9, 2, -7 }, // 0x72 'r' + { 721, 8, 8, 10, 1, -7 }, // 0x73 's' + { 729, 6, 11, 9, 2, -10 }, // 0x74 't' + { 738, 8, 8, 10, 1, -7 }, // 0x75 'u' + { 746, 8, 8, 10, 1, -7 }, // 0x76 'v' + { 754, 8, 8, 10, 1, -7 }, // 0x77 'w' + { 762, 7, 8, 9, 1, -7 }, // 0x78 'x' + { 769, 8, 10, 10, 1, -7 }, // 0x79 'y' + { 779, 7, 8, 9, 1, -7 }, // 0x7A 'z' + { 786, 5, 11, 9, 2, -10 }, // 0x7B '{' + { 793, 2, 11, 10, 4, -10 }, // 0x7C '|' + { 796, 5, 11, 9, 2, -10 }, // 0x7D '}' + { 803, 8, 5, 10, 1, -11 } }; // 0x7E '~' const GFXfont whitrabt8pt7b PROGMEM = { (uint8_t *)whitrabt8pt7bBitmaps, (GFXglyph *)whitrabt8pt7bGlyphs, - 0x20, 0x7E, 12 }; + 0x20, 0x7E, 12 }; // Approx. 1480 bytes +#endif // ifndef FONTS_WHITRABT8PT7B_H diff --git a/src/src/WebServer/404.cpp b/src/src/WebServer/404.cpp index 9fcd3f11b..4ded20b8b 100644 --- a/src/src/WebServer/404.cpp +++ b/src/src/WebServer/404.cpp @@ -1,6 +1,6 @@ #include "../WebServer/404.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/LoadFromFS.h" #include "../WebServer/Rules.h" diff --git a/src/src/WebServer/AdvancedConfigPage.cpp b/src/src/WebServer/AdvancedConfigPage.cpp index 3f78b64a4..1fd5da53f 100644 --- a/src/src/WebServer/AdvancedConfigPage.cpp +++ b/src/src/WebServer/AdvancedConfigPage.cpp @@ -6,7 +6,7 @@ #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" #include "../WebServer/Markup_Forms.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../ESPEasyCore/ESPEasyWifi.h" diff --git a/src/src/WebServer/CacheControllerPages.cpp b/src/src/WebServer/CacheControllerPages.cpp index 98fbc3276..ac8000711 100644 --- a/src/src/WebServer/CacheControllerPages.cpp +++ b/src/src/WebServer/CacheControllerPages.cpp @@ -2,7 +2,7 @@ #ifdef USES_C016 -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/JSON.h" diff --git a/src/src/WebServer/ConfigPage.cpp b/src/src/WebServer/ConfigPage.cpp index c38154d3d..db35d2a0f 100644 --- a/src/src/WebServer/ConfigPage.cpp +++ b/src/src/WebServer/ConfigPage.cpp @@ -7,7 +7,7 @@ #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" #include "../WebServer/Markup_Forms.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../ESPEasyCore/Controller.h" #include "../ESPEasyCore/ESPEasyNetwork.h" diff --git a/src/src/WebServer/ControlPage.cpp b/src/src/WebServer/ControlPage.cpp index cc3bb8e83..5848d7d48 100644 --- a/src/src/WebServer/ControlPage.cpp +++ b/src/src/WebServer/ControlPage.cpp @@ -5,7 +5,7 @@ # include "../WebServer/HTML_wrappers.h" -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../Helpers/WebServer_commandHelper.h" # include "../../ESPEasy-Globals.h" diff --git a/src/src/WebServer/ControllerPage.cpp b/src/src/WebServer/ControllerPage.cpp index 3a05985fb..ec1ddd439 100644 --- a/src/src/WebServer/ControllerPage.cpp +++ b/src/src/WebServer/ControllerPage.cpp @@ -3,7 +3,7 @@ #ifdef WEBSERVER_CONTROLLERS -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/CustomPage.cpp b/src/src/WebServer/CustomPage.cpp index aa6ca1755..9b7fc215f 100644 --- a/src/src/WebServer/CustomPage.cpp +++ b/src/src/WebServer/CustomPage.cpp @@ -1,6 +1,6 @@ #include "../WebServer/CustomPage.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" diff --git a/src/src/WebServer/DevicesPage.cpp b/src/src/WebServer/DevicesPage.cpp index 00a74aece..485804339 100644 --- a/src/src/WebServer/DevicesPage.cpp +++ b/src/src/WebServer/DevicesPage.cpp @@ -2,7 +2,7 @@ #ifdef WEBSERVER_DEVICES -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../WebServer/HTML_wrappers.h" # include "../WebServer/Markup.h" # include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/DownloadPage.cpp b/src/src/WebServer/DownloadPage.cpp index 004c29b4f..509d16448 100644 --- a/src/src/WebServer/DownloadPage.cpp +++ b/src/src/WebServer/DownloadPage.cpp @@ -2,10 +2,11 @@ #ifdef WEBSERVER_DOWNLOAD -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../Globals/ESPEasy_time.h" #include "../Globals/Settings.h" #include "../Helpers/ESPEasy_Storage.h" +#include "../Helpers/StringGenerator_System.h" // ******************************************************************************** @@ -35,7 +36,7 @@ void handle_download() str += F("_U"); str += Settings.Unit; str += F("_Build"); - str += BUILD; + str += getSystemBuildString(); str += '_'; if (node_time.systemTimePresent()) diff --git a/src/src/WebServer/WebServer.cpp b/src/src/WebServer/ESPEasy_WebServer.cpp similarity index 99% rename from src/src/WebServer/WebServer.cpp rename to src/src/WebServer/ESPEasy_WebServer.cpp index f1e1ef8ce..4dedcad27 100644 --- a/src/src/WebServer/WebServer.cpp +++ b/src/src/WebServer/ESPEasy_WebServer.cpp @@ -1,4 +1,4 @@ -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/404.h" #include "../WebServer/AccessControl.h" diff --git a/src/src/WebServer/WebServer.h b/src/src/WebServer/ESPEasy_WebServer.h similarity index 98% rename from src/src/WebServer/WebServer.h rename to src/src/WebServer/ESPEasy_WebServer.h index 68b598a2c..6bf46aac1 100644 --- a/src/src/WebServer/WebServer.h +++ b/src/src/WebServer/ESPEasy_WebServer.h @@ -1,5 +1,5 @@ -#ifndef WEBSERVER_WEBSERVER_H -#define WEBSERVER_WEBSERVER_H +#ifndef WEBSERVER_ESPEASY_WEBSERVER_H +#define WEBSERVER_ESPEASY_WEBSERVER_H #include "../WebServer/common.h" @@ -211,4 +211,4 @@ String webArg(const String& arg); String webArg(int i); #endif -#endif // ifndef WEBSERVER_WEBSERVER_H \ No newline at end of file +#endif // ifndef WEBSERVER_ESPEASY_WEBSERVER_H \ No newline at end of file diff --git a/src/src/WebServer/FactoryResetPage.cpp b/src/src/WebServer/FactoryResetPage.cpp index 3ced4bad6..6709e9aad 100644 --- a/src/src/WebServer/FactoryResetPage.cpp +++ b/src/src/WebServer/FactoryResetPage.cpp @@ -3,7 +3,7 @@ #ifdef WEBSERVER_FACTORY_RESET -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/JSON.h" #include "../WebServer/Markup.h" diff --git a/src/src/WebServer/Favicon.cpp b/src/src/WebServer/Favicon.cpp index f163b80cb..a0d670479 100644 --- a/src/src/WebServer/Favicon.cpp +++ b/src/src/WebServer/Favicon.cpp @@ -1,7 +1,7 @@ #include "../WebServer/Favicon.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/404.h" #include "../Globals/RamTracker.h" diff --git a/src/src/WebServer/FileList.cpp b/src/src/WebServer/FileList.cpp index 23e7ac01f..58ab6168e 100644 --- a/src/src/WebServer/FileList.cpp +++ b/src/src/WebServer/FileList.cpp @@ -1,6 +1,6 @@ #include "../WebServer/FileList.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/AccessControl.h" #include "../WebServer/Markup.h" diff --git a/src/src/WebServer/HTML_wrappers.cpp b/src/src/WebServer/HTML_wrappers.cpp index 6db6b7d3a..f72281e60 100644 --- a/src/src/WebServer/HTML_wrappers.cpp +++ b/src/src/WebServer/HTML_wrappers.cpp @@ -6,6 +6,7 @@ #include "../Helpers/StringConverter.h" +#include "../Globals/Settings.h" // ******************************************************************************** // HTML string re-use to keep the executable smaller diff --git a/src/src/WebServer/HardwarePage.cpp b/src/src/WebServer/HardwarePage.cpp index 1db17b82f..97b7c36bd 100644 --- a/src/src/WebServer/HardwarePage.cpp +++ b/src/src/WebServer/HardwarePage.cpp @@ -2,7 +2,7 @@ #ifdef WEBSERVER_HARDWARE -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/I2C_Scanner.cpp b/src/src/WebServer/I2C_Scanner.cpp index 5eb1cca27..089f42024 100644 --- a/src/src/WebServer/I2C_Scanner.cpp +++ b/src/src/WebServer/I2C_Scanner.cpp @@ -2,7 +2,7 @@ #ifdef WEBSERVER_I2C_SCANNER -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" diff --git a/src/src/WebServer/JSON.cpp b/src/src/WebServer/JSON.cpp index a720cbbfb..7381371e0 100644 --- a/src/src/WebServer/JSON.cpp +++ b/src/src/WebServer/JSON.cpp @@ -1,9 +1,11 @@ #include "../WebServer/JSON.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/JSON.h" #include "../WebServer/Markup_Forms.h" +#include "../CustomBuild/CompiletimeDefines.h" + #include "../Globals/Cache.h" #include "../Globals/Nodes.h" #include "../Globals/Device.h" @@ -16,6 +18,7 @@ #include "../Helpers/Numerical.h" #include "../Helpers/StringConverter.h" #include "../Helpers/StringProvider.h" +#include "../Helpers/StringGenerator_System.h" #include "../../_Plugin_Helper.h" #include "../../ESPEasy-Globals.h" @@ -312,7 +315,7 @@ void handle_json() (it->first != Settings.Unit) ? it->second.nodeName : Settings.Name); if (it->second.build) { - stream_next_json_object_value(F("build"), it->second.build); + stream_next_json_object_value(F("build"), formatSystemBuildNr(it->second.build)); } if (it->second.nodeType) { @@ -521,7 +524,7 @@ void handle_nodes_list_json() { json_number(F("first"), String(it->first)); json_prop(F("name"), isThisUnit ? Settings.Name : it->second.nodeName); - if (it->second.build) { json_prop(F("build"), String(it->second.build)); } + if (it->second.build) { json_prop(F("build"), formatSystemBuildNr(it->second.build)); } json_prop(F("type"), getNodeTypeDisplayString(it->second.nodeType)); json_prop(F("ip"), it->second.ip.toString()); json_number(F("age"), String(it->second.age)); diff --git a/src/src/WebServer/LoadFromFS.cpp b/src/src/WebServer/LoadFromFS.cpp index a1b1dd9b0..d79398afd 100644 --- a/src/src/WebServer/LoadFromFS.cpp +++ b/src/src/WebServer/LoadFromFS.cpp @@ -7,7 +7,7 @@ #include "../WebServer/CustomPage.h" #include "../WebServer/HTML_wrappers.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #if FEATURE_SD # include diff --git a/src/src/WebServer/Log.cpp b/src/src/WebServer/Log.cpp index de6026522..1315a6ffc 100644 --- a/src/src/WebServer/Log.cpp +++ b/src/src/WebServer/Log.cpp @@ -1,6 +1,6 @@ #include "../WebServer/Log.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/404.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/JSON.h" diff --git a/src/src/WebServer/Markup_Forms.cpp b/src/src/WebServer/Markup_Forms.cpp index 8f2886c88..e5e2b2b1e 100644 --- a/src/src/WebServer/Markup_Forms.cpp +++ b/src/src/WebServer/Markup_Forms.cpp @@ -1,6 +1,6 @@ #include "../WebServer/Markup_Forms.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/Markup.h" #include "../WebServer/HTML_wrappers.h" diff --git a/src/src/WebServer/Metrics.cpp b/src/src/WebServer/Metrics.cpp index 6a3394bc8..64f674c7b 100644 --- a/src/src/WebServer/Metrics.cpp +++ b/src/src/WebServer/Metrics.cpp @@ -1,5 +1,5 @@ # include "../WebServer/Metrics.h" -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../../ESPEasy-Globals.h" # include "../Commands/Diagnostic.h" # include "../ESPEasyCore/ESPEasyNetwork.h" diff --git a/src/src/WebServer/NotificationPage.cpp b/src/src/WebServer/NotificationPage.cpp index bf26c991d..3398cb581 100644 --- a/src/src/WebServer/NotificationPage.cpp +++ b/src/src/WebServer/NotificationPage.cpp @@ -2,7 +2,7 @@ #if FEATURE_NOTIFIER -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/PinStates.cpp b/src/src/WebServer/PinStates.cpp index d62a6f7e3..e27e1b914 100644 --- a/src/src/WebServer/PinStates.cpp +++ b/src/src/WebServer/PinStates.cpp @@ -1,6 +1,6 @@ #include "../WebServer/PinStates.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../DataStructs/PinMode.h" diff --git a/src/src/WebServer/RootPage.cpp b/src/src/WebServer/RootPage.cpp index 446392053..ae2a98fea 100644 --- a/src/src/WebServer/RootPage.cpp +++ b/src/src/WebServer/RootPage.cpp @@ -3,11 +3,12 @@ #ifdef WEBSERVER_ROOT -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/LoadFromFS.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" +#include "../WebServer/Markup_Forms.h" #include "../Commands/InternalCommands.h" #include "../ESPEasyCore/ESPEasyNetwork.h" @@ -21,6 +22,7 @@ #include "../Helpers/ESPEasy_Storage.h" #include "../Helpers/Memory.h" #include "../Helpers/Misc.h" +#include "../Helpers/StringGenerator_System.h" #include "../Helpers/WebServer_commandHelper.h" @@ -298,7 +300,7 @@ void handle_root() { if (MAIN_PAGE_SHOW_NODE_LIST_BUILD) { if (it->second.build) { - addHtmlInt(it->second.build); + addHtml(formatSystemBuildNr(it->second.build)); } html_TD(); } diff --git a/src/src/WebServer/Rules.cpp b/src/src/WebServer/Rules.cpp index fa2663494..6f2b5bc7e 100644 --- a/src/src/WebServer/Rules.cpp +++ b/src/src/WebServer/Rules.cpp @@ -2,7 +2,9 @@ #include "../WebServer/Rules.h" -#include "../WebServer/WebServer.h" +#ifdef WEBSERVER_RULES + +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/LoadFromFS.h" @@ -20,8 +22,6 @@ #include -#ifdef WEBSERVER_RULES - // ******************************************************************************** // Web Interface rules page // ******************************************************************************** @@ -73,9 +73,9 @@ void handle_rules() { addHtml(F("
")); { // Place combo box in its own scope to release these arrays as soon as possible - uint8_t choice = rulesSet; - String options[RULESETS_MAX]; - int optionValues[RULESETS_MAX]; + uint8_t choice = rulesSet; + String options[RULESETS_MAX]; + int optionValues[RULESETS_MAX]; for (uint8_t x = 0; x < RULESETS_MAX; x++) { @@ -85,13 +85,13 @@ void handle_rules() { } addSelector_reloadOnChange( - F("set"), - RULESETS_MAX, - options, - optionValues, - nullptr, - choice, - F("return rules_set_onchange(rulesselect)"), + F("set"), + RULESETS_MAX, + options, + optionValues, + nullptr, + choice, + F("return rules_set_onchange(rulesselect)"), true, F("wide")); addHelpButton(F("Tutorial_Rules")); @@ -172,68 +172,69 @@ void handle_rules_new() { // class StreamingBuffer buffer = TXBuffer; // Build table detail - int count = -1; - HandlerFileInfo renderDetail = [/*&buffer,*/ &count, endIdx](fileInfo fi) - { + int count = -1; + HandlerFileInfo renderDetail = + [/*&buffer,*/ &count, endIdx](fileInfo fi) + { # ifdef WEBSERVER_RULES_DEBUG - Serial.print(F("Start generation of: ")); - Serial.println(fi.Name); + Serial.print(F("Start generation of: ")); + Serial.println(fi.Name); # endif // ifdef WEBSERVER_RULES_DEBUG - if (fi.isDirectory) - { - html_TR_TD(); - } - else - { - count++; - addHtml(F("")); - } + if (fi.isDirectory) + { + html_TR_TD(); + } + else + { + count++; + addHtml(F("")); + } - // Event Name - addHtml(FileNameToEvent(fi.Name)); + // Event Name + addHtml(FileNameToEvent(fi.Name)); - if (fi.isDirectory) - { - addHtml(F("")); - addSaveButton(String(F("/rules/backup?directory=")) + URLEncode(fi.Name) - , F("Backup") - ); - } - else - { - String encodedPath = URLEncode(String(fi.Name + F(".txt"))); + if (fi.isDirectory) + { + addHtml(F("")); + addSaveButton(String(F("/rules/backup?directory=")) + URLEncode(fi.Name) + , F("Backup") + ); + } + else + { + String encodedPath = URLEncode(String(fi.Name + F(".txt"))); - // File Name - addHtml(F("")); - addHtml(String(fi.Name)); - addHtml(F(".txt")); + // File Name + addHtml(F("")); + addHtml(String(fi.Name)); + addHtml(F(".txt")); - // File size - html_TD(); - addHtmlInt(fi.Size); - addHtml(F("")); + // File size + html_TD(); + addHtmlInt(fi.Size); + addHtml(F("")); - // Actions - html_TD(); - addSaveButton(String(F("/rules/backup?fileName=")) + encodedPath - , F("Backup") - ); + // Actions + html_TD(); + addSaveButton(String(F("/rules/backup?fileName=")) + encodedPath + , F("Backup") + ); - addDeleteButton(String(F("/rules/delete?fileName=")) + encodedPath - , F("Delete") - ); - } - addHtml(F("")); + addDeleteButton(String(F("/rules/delete?fileName=")) + encodedPath + , F("Delete") + ); + } + addHtml(F("")); # ifdef WEBSERVER_RULES_DEBUG - Serial.print(F("End generation of: ")); - Serial.println(fi.Name); + Serial.print(F("End generation of: ")); + Serial.println(fi.Name); # endif // ifdef WEBSERVER_RULES_DEBUG - return count < endIdx; - }; + return count < endIdx; + }; bool hasMore = EnumerateFileAndDirectory(rootPath @@ -400,6 +401,7 @@ bool handle_rules_edit(String originalUri, bool isAddNew) { if (isAddNew || (originalUri.startsWith(F("/rules/")) && originalUri.endsWith(F(".txt")))) { if (!isLoggedIn() || !Settings.UseRules) { return false; } + if (Settings.OldRulesEngine()) { Goto_Rules_Root(); diff --git a/src/src/WebServer/SettingsArchive.cpp b/src/src/WebServer/SettingsArchive.cpp index 2ccf2b7d6..d1c08cf50 100644 --- a/src/src/WebServer/SettingsArchive.cpp +++ b/src/src/WebServer/SettingsArchive.cpp @@ -2,7 +2,7 @@ #if FEATURE_SETTINGS_ARCHIVE -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/SetupPage.cpp b/src/src/WebServer/SetupPage.cpp index edcea65a6..e03ee9304 100644 --- a/src/src/WebServer/SetupPage.cpp +++ b/src/src/WebServer/SetupPage.cpp @@ -3,7 +3,7 @@ #ifdef WEBSERVER_SETUP -# include "../WebServer/WebServer.h" +# include "../WebServer/ESPEasy_WebServer.h" # include "../WebServer/AccessControl.h" # include "../WebServer/HTML_wrappers.h" # include "../WebServer/Markup.h" diff --git a/src/src/WebServer/SysInfoPage.cpp b/src/src/WebServer/SysInfoPage.cpp index 32122b841..6f06319a7 100644 --- a/src/src/WebServer/SysInfoPage.cpp +++ b/src/src/WebServer/SysInfoPage.cpp @@ -2,7 +2,7 @@ #if defined(WEBSERVER_SYSINFO) || defined(SHOW_SYSINFO_JSON) -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" @@ -148,7 +148,7 @@ void handle_sysinfo_json() { # endif // if FEATURE_ETHERNET json_open(false, F("firmware")); - json_prop(F("build"), String(BUILD)); + json_prop(F("build"), getSystemBuildString()); json_prop(F("notes"), F(BUILD_NOTES)); json_prop(F("libraries"), getSystemLibraryString()); json_prop(F("git_version"), getValue(LabelType::GIT_BUILD)); @@ -200,7 +200,7 @@ void handle_sysinfo_json() { case FM_DIO: json_prop(F("mode"), F("DIO")); break; case FM_DOUT: json_prop(F("mode"), F("DOUT")); break; default: - json_prop(F("mode"), getUnknownString()); break; + json_prop(F("mode"), F("Unknown")); break; } json_number(F("writes"), String(RTC.flashDayCounter)); @@ -637,7 +637,7 @@ void handle_sysinfo_Storage() { case FM_DIO: addHtml(F("DIO")); break; case FM_DOUT: addHtml(F("DOUT")); break; default: - addHtml(getUnknownString()); break; + addHtml(F("Unknown")); break; } } diff --git a/src/src/WebServer/SysVarPage.cpp b/src/src/WebServer/SysVarPage.cpp index bedbdf369..b18234015 100644 --- a/src/src/WebServer/SysVarPage.cpp +++ b/src/src/WebServer/SysVarPage.cpp @@ -3,7 +3,7 @@ #ifdef WEBSERVER_SYSVARS -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Forms.h" diff --git a/src/src/WebServer/TimingStats.cpp b/src/src/WebServer/TimingStats.cpp index 93cd02ac7..3b0122fab 100644 --- a/src/src/WebServer/TimingStats.cpp +++ b/src/src/WebServer/TimingStats.cpp @@ -2,7 +2,7 @@ #if defined(WEBSERVER_TIMINGSTATS) && FEATURE_TIMING_STATS -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Forms.h" @@ -44,7 +44,7 @@ void handle_timingstats() { addFormHeader(F("Statistics")); addRowLabel(F("Start Period")); struct tm startPeriod = node_time.addSeconds(node_time.tm, -1.0f * timespan, false); - addHtml(ESPEasy_time::getDateTimeString(startPeriod, '-', ':', ' ', false)); + addHtml(formatDateTimeString(startPeriod, '-', ':', ' ', false)); addRowLabelValue(LabelType::LOCAL_TIME); addRowLabel(F("Time span")); addHtmlFloat(timespan); diff --git a/src/src/WebServer/ToolsPage.cpp b/src/src/WebServer/ToolsPage.cpp index 3a56f82b4..f205618a6 100644 --- a/src/src/WebServer/ToolsPage.cpp +++ b/src/src/WebServer/ToolsPage.cpp @@ -2,7 +2,7 @@ #ifdef WEBSERVER_TOOLS -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/HTML_wrappers.h" #include "../WebServer/Markup.h" #include "../WebServer/Markup_Buttons.h" diff --git a/src/src/WebServer/UploadPage.cpp b/src/src/WebServer/UploadPage.cpp index b3364472f..56af54015 100644 --- a/src/src/WebServer/UploadPage.cpp +++ b/src/src/WebServer/UploadPage.cpp @@ -1,6 +1,6 @@ #include "../WebServer/UploadPage.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" diff --git a/src/src/WebServer/WiFiScanner.cpp b/src/src/WebServer/WiFiScanner.cpp index f482eb709..14f1d8b0f 100644 --- a/src/src/WebServer/WiFiScanner.cpp +++ b/src/src/WebServer/WiFiScanner.cpp @@ -1,6 +1,6 @@ #include "../WebServer/WiFiScanner.h" -#include "../WebServer/WebServer.h" +#include "../WebServer/ESPEasy_WebServer.h" #include "../WebServer/AccessControl.h" #include "../WebServer/HTML_wrappers.h" diff --git a/src/src/WebServer/common.h b/src/src/WebServer/common.h index 2de0551e8..d12569cab 100644 --- a/src/src/WebServer/common.h +++ b/src/src/WebServer/common.h @@ -1,12 +1,24 @@ #ifndef WEBSERVER_WEBSERVER_COMMON_H #define WEBSERVER_WEBSERVER_COMMON_H + +#include +#include + +#ifdef ESP32 + #include + #include +#endif + +#ifdef ESP8266 + #include + #include +#endif + #include "../../ESPEasy_common.h" #include "../ESPEasyCore/ESPEasy_Log.h" #include "../Globals/Services.h" #include "../Globals/TXBuffer.h" #include "../Helpers/StringProvider.h" -#include - #endif \ No newline at end of file diff --git a/tools/pio/generate-compiletime-defines.py b/tools/pio/generate-compiletime-defines.py index 03b7ee931..2af365798 100644 --- a/tools/pio/generate-compiletime-defines.py +++ b/tools/pio/generate-compiletime-defines.py @@ -7,6 +7,13 @@ from datetime import date import json +def compute_version_date(): + d0 = date(2022, 8, 18) + today = date.today() + delta = today - d0 + return 20200 + delta.days + + def create_binary_filename(): today = date.today() d1 = today.strftime("%Y%m%d") @@ -22,7 +29,7 @@ def get_git_description(): from pygit2 import Repository try: repo = Repository('.') - return "'{0}_{1}'".format(repo.head.shorthand, repo.revparse_single('HEAD').short_id) + return "{0}_{1}".format(repo.head.shorthand, repo.revparse_single('HEAD').short_id) except: return 'No_.git_dir' except ImportError: @@ -56,10 +63,11 @@ def gen_compiletime_defines(node): return env.Object( node, CPPDEFINES=env["CPPDEFINES"] - + [("SET_BUILD_BINARY_FILENAME", create_binary_filename())] - + [("SET_BOARD_NAME", get_board_name())] - + [("SET_BUILD_PLATFORM", platform.platform())] - + [("SET_BUILD_GIT_HEAD", get_git_description())], + + [("SET_BUILD_BINARY_FILENAME", '\\"%s\\"' % create_binary_filename())] + + [("SET_BOARD_NAME", '\\"%s\\"' % get_board_name())] + + [("SET_BUILD_PLATFORM", '\\"%s\\"' % platform.platform())] + + [("SET_BUILD_GIT_HEAD", '\\"%s\\"' % get_git_description())] + + [("SET_BUILD_VERSION", compute_version_date())], CCFLAGS=env["CCFLAGS"] ) @@ -72,6 +80,7 @@ print("\u001b[33m PROGNAME: \u001b[0m {}".format(env['PROGNAME'])) print("\u001b[33m BOARD_NAME: \u001b[0m {}".format(get_board_name())) print("\u001b[33m BUILD_PLATFORM: \u001b[0m {}".format(platform.platform())) print("\u001b[33m GIT_HEAD: \u001b[0m {}".format(get_git_description())) +print("\u001b[33m BUILD_VERSION: \u001b[0m {}".format(compute_version_date())) print("\u001b[32m ------------------------------- \u001b[0m") print("\u001b[32m Flash configuration \u001b[0m")