Lulzbot ExtUI Western language support (#15208)

Fix #15134
2.0.x
Marcio Teixeira 5 years ago committed by Scott Lahteine
parent c590e8ac05
commit 47d19bab40

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -76,6 +76,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#ifdef TOUCH_UI_USE_UTF8
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Parental lock".
// This is a recommended for smaller displays.
//#define TOUCH_UI_PASSCODE
@ -90,7 +96,7 @@
//#define DEVELOPER_SCREENS
// Maximum feed rate for manual extrusion (mm/s)
//#define MAX_MANUAL_FEEDRATE 240
#define MAX_MANUAL_FEEDRATE {50*60, 50*60, 4*60, 60}
// Sets the SPI speed in Hz

@ -159,6 +159,7 @@ class CLCD::FontMetrics {
uint32_t height;
uint32_t ptr;
FontMetrics() {}
FontMetrics(uint8_t font) {load(font);}
void load(uint8_t font);

@ -67,14 +67,14 @@ class CommandProcessor : public CLCD::CommandFifo {
}
FORCEDINLINE void linear_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h, bool tracker = false) {
const uint16_t th = widget_thickness()/2;
const uint16_t th = widget_thickness() / 2;
if (w > h) {
x += tracker ? th * 2.5 : th;
y += h/2 - th/2;
y += (h - th) / 2;
w -= tracker ? th * 5.0 : th * 2;
h = th;
} else {
x += w/2 - th/2;
x += (w - th) / 2;
y += tracker ? th * 2.5 : th;
w = th;
h -= tracker ? th * 5.0 : th * 2;
@ -82,9 +82,9 @@ class CommandProcessor : public CLCD::CommandFifo {
}
FORCEDINLINE uint16_t circular_widget_box(int16_t &x, int16_t &y, int16_t &w, int16_t &h) {
const uint16_t r = min(w,h)/2;
x += w/2;
y += h/2;
const uint16_t r = min(w,h) / 2;
x += w / 2;
y += h / 2;
w = 1;
h = 1;
return r;
@ -200,22 +200,22 @@ class CommandProcessor : public CLCD::CommandFifo {
inline CommandProcessor& rectangle(int16_t x, int16_t y, int16_t w, int16_t h) {
using namespace FTDI;
CLCD::CommandFifo::cmd(BEGIN(RECTS));
CLCD::CommandFifo::cmd(VERTEX2F(x*16,y*16));
CLCD::CommandFifo::cmd(VERTEX2F((x+w)*16,(y+h)*16));
CLCD::CommandFifo::cmd(VERTEX2F(x * 16, y * 16));
CLCD::CommandFifo::cmd(VERTEX2F((x + w) * 16, (y + h) * 16));
return *this;
}
template<typename T>
FORCEDINLINE CommandProcessor& toggle(int16_t x, int16_t y, int16_t w, int16_t h, T text, bool state, uint16_t options = FTDI::OPT_3D) {
CLCD::FontMetrics fm(_font);
const int16_t widget_h = fm.height * 20.0/16;
const int16_t widget_h = fm.height * 20.0 / 16;
//const int16_t outer_bar_r = widget_h / 2;
//const int16_t knob_r = outer_bar_r - 1.5;
// The y coordinate of the toggle is the baseline of the text,
// so we must introduce a fudge factor based on the line height to
// actually center the control.
const int16_t fudge_y = fm.height*5/16;
CLCD::CommandFifo::toggle(x + h/2, y + h/2 - widget_h/2 + fudge_y, w - h, _font, options, state);
const int16_t fudge_y = fm.height * 5 / 16;
CLCD::CommandFifo::toggle(x + h / 2, y + (h - widget_h) / 2 + fudge_y, w - h, _font, options, state);
CLCD::CommandFifo::str(text);
return *this;
}
@ -286,23 +286,29 @@ class CommandProcessor : public CLCD::CommandFifo {
return *this;
}
void apply_text_alignment(int16_t &x, int16_t &y, int16_t w, int16_t h, uint16_t options) {
using namespace FTDI;
x += ((options & OPT_CENTERX) ? w / 2 : ((options & OPT_RIGHTX) ? w : 0));
y += ((options & OPT_CENTERY) ? h / 2 : h);
}
CommandProcessor& number(int16_t x, int16_t y, int16_t w, int16_t h, int32_t n, uint16_t options = FTDI::OPT_CENTER) {
using namespace FTDI;
CLCD::CommandFifo::number(
x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)),
y + ((options & OPT_CENTERY) ? h/2 : h),
_font, options, n);
apply_text_alignment(x, y, w, h, options);
CLCD::CommandFifo::number(x, y, _font, options, n);
return *this;
}
template<typename T> FORCEDINLINE
CommandProcessor& text(int16_t x, int16_t y, int16_t w, int16_t h, T text, uint16_t options = FTDI::OPT_CENTER) {
using namespace FTDI;
CLCD::CommandFifo::text(
x + ((options & OPT_CENTERX) ? w/2 : ((options & OPT_RIGHTX) ? w : 0)),
y + ((options & OPT_CENTERY) ? h/2 : h),
_font, options);
apply_text_alignment(x, y, w, h, options);
#ifdef TOUCH_UI_USE_UTF8
draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), options);
#else
CLCD::CommandFifo::text(x, y, _font, options);
CLCD::CommandFifo::str(text);
#endif
return *this;
}
@ -313,8 +319,8 @@ class CommandProcessor : public CLCD::CommandFifo {
cmd(BITMAP_TRANSFORM_A(uint32_t(float(256)/scale)));
cmd(BITMAP_TRANSFORM_E(uint32_t(float(256)/scale)));
}
cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width*scale, info.height*scale));
cmd(VERTEX2F((x + w/2 - info.width*scale/2)*16, (y + h/2 - info.height*scale/2)*16));
cmd(BITMAP_SIZE(info.filter, info.wrapx, info.wrapy, info.width * scale, info.height * scale));
cmd(VERTEX2F((x + w / 2 - info.width * scale / 2) * 16, (y + h / 2 - info.height * scale / 2) * 16));
if (scale != 1) {
cmd(BITMAP_TRANSFORM_A(256));
cmd(BITMAP_TRANSFORM_E(256));
@ -328,7 +334,13 @@ class CommandProcessor : public CLCD::CommandFifo {
bool styleModified = false;
if (_btn_style_callback) styleModified = _btn_style_callback(*this, _tag, _style, options, false);
CLCD::CommandFifo::button(x, y, w, h, _font, options);
#ifdef TOUCH_UI_USE_UTF8
apply_text_alignment(x, y, w, h, OPT_CENTER);
CLCD::CommandFifo::str(F(""));
draw_utf8_text(*this, x, y, text, font_size_t::from_romfont(_font), OPT_CENTER);
#else
CLCD::CommandFifo::str(text);
#endif
if (_btn_style_callback && styleModified) _btn_style_callback(*this, _tag, _style, options, true);
return *this;
}

@ -30,14 +30,19 @@
#endif
#ifdef FTDI_EXTENDED
#include "unicode/font_size_t.h"
#include "unicode/unicode.h"
#include "unicode/standard_char_set.h"
#include "unicode/western_char_set.h"
#include "unicode/font_bitmaps.h"
#include "rgb_t.h"
#include "bitmap_info.h"
#include "tiny_timer.h"
#include "grid_layout.h"
#include "dl_cache.h"
#include "screen_types.h"
#include "event_loop.h"
#include "command_processor.h"
#include "screen_types.h"
#include "sound_player.h"
#include "sound_list.h"
#include "polygon.h"

@ -156,8 +156,11 @@ class UncachedScreen {
public:
static void onRefresh() {
using namespace FTDI;
CLCD::CommandFifo cmd;
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART);
#ifdef TOUCH_UI_USE_UTF8
load_utf8_bitmaps(cmd);
#endif
current_screen.onRedraw(BOTH);
@ -183,9 +186,12 @@ class CachedScreen {
static void repaintBackground() {
using namespace FTDI;
DLCache dlcache(DL_SLOT);
CLCD::CommandFifo cmd;
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART);
#ifdef TOUCH_UI_USE_UTF8
load_utf8_bitmaps(cmd);
#endif
current_screen.onRedraw(BACKGROUND);
dlcache.store(DL_SIZE);
@ -195,14 +201,16 @@ class CachedScreen {
static void onRefresh() {
using namespace FTDI;
DLCache dlcache(DL_SLOT);
CLCD::CommandFifo cmd;
CommandProcessor cmd;
cmd.cmd(CMD_DLSTART);
if (dlcache.has_data()) {
dlcache.append();
}
else {
} else {
#ifdef TOUCH_UI_USE_UTF8
load_utf8_bitmaps(cmd);
#endif
current_screen.onRedraw(BACKGROUND);
dlcache.store(DL_SIZE);
}

@ -29,41 +29,33 @@ namespace FTDI {
* be broken so that the display width is less than w. The line will also
* be broken after a '\n'. Returns the display width of the line.
*/
static uint16_t find_line_break(const CLCD::FontMetrics &fm, uint16_t w, const char *str, const char *&end) {
static uint16_t find_line_break(const FontMetrics &fm, uint16_t w, const char *str, const char *&end) {
w -= fm.get_char_width(' ');
const char *p = str;
end = str + strlen(str);
uint16_t width = fm.get_text_width(str);
end = str;
uint16_t lw = 0, result = 0;
for(;;) {
// Find next tentative line break.
char delim = *(p);
while (delim && delim != ' ' && delim != '\n') {
delim = *(++p);
utf8_char_t c = get_utf8_char_and_inc(p);
if (c == ' ' || c == '\n' || c == '\0') {
if (lw < w || end == str) {
end = (c == '\0') ? p-1 : p;
result = lw;
}
// Check to see whether to break the line.
const uint16_t margin = fm.get_text_width(" ");
const uint16_t lw = p > str ? fm.get_text_width(str, p - str) + margin : 0;
if (lw < w) {
width = lw;
switch (delim) {
case '\0':
end = p;
break;
case '\n':
end = ++p;
break;
case ' ':
end = ++p;
continue;
if (c == '\0' || c == '\n') break;
}
lw += fm.get_char_width(c);
}
return width;
if (end == str) {
end = p-1;
result = lw;
}
return result;
}
/**
* This function returns a measurements of the word-wrapped text box.
*/
static void measure_text_box(const CLCD::FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) {
static void measure_text_box(const FontMetrics &fm, const char *str, uint16_t &width, uint16_t &height) {
const char *line_start = (const char*)str;
const char *line_end;
const uint16_t wrap_width = width;
@ -72,7 +64,7 @@ namespace FTDI {
uint16_t line_width = find_line_break(fm, wrap_width, line_start, line_end);
if (line_end == line_start) break;
width = max(width, line_width);
height += fm.height;
height += fm.get_height();
line_start = line_end;
}
}
@ -81,10 +73,11 @@ namespace FTDI {
* This function draws text inside a bounding box, doing word wrapping and using the largest font that will fit.
*/
void draw_text_box(CommandProcessor& cmd, int x, int y, int w, int h, const char *str, uint16_t options, uint8_t font) {
CLCD::FontMetrics fm(font);
uint16_t box_width, box_height;
FontMetrics fm(font);
// Shrink the font until we find a font that fits
for(;;) {
box_width = w;
measure_text_box(fm, str, box_width, box_height);
@ -110,10 +103,14 @@ namespace FTDI {
if (line[line_len - 1] == '\n' || line[line_len - 1] == ' ')
line[line_len - 1] = 0;
#ifdef TOUCH_UI_USE_UTF8
draw_utf8_text(cmd, x + dx, y + dy, line, fm.fs, options & ~OPT_CENTERY);
#else
cmd.CLCD::CommandFifo::text(x + dx, y + dy, font, options & ~OPT_CENTERY);
cmd.CLCD::CommandFifo::str(line);
#endif
}
y += fm.height;
y += fm.get_height();
line_start = line_end;
}

@ -0,0 +1,40 @@
FTDI EVE Unicode Rendering
--------------------------
The FTDI EVE chips have several fonts in ROM, but these fonts only contain a
subset of ASCII characters. Notably, this excludes diacritics and accents
used in most Western languages.
While the FTDI EVE has the capability for user-defined fonts, such fonts only
support 127 character positions, making them as limiting as the built-in fonts.
As a further complication, high resolution TFT displays require high resolution
fonts. It is not feasible to put a complete international font into the limited
flash memory of most microprocessors.
To work around these limitations, this library uses a custom font renderer with
the following characteristics:
1) Rather than providing bitmaps for different font sizes, it uses a single
bitmap for the largest font size (romfont 31) and emulates other sizes by
scaling the bitmaps using BITMAP_TRANSFORM.
2) Rather than loading an entire font, it combines symbols from romfont 31
with a limited number of symbols from a custom font. For accented letters,
the rendering code combine basic letter shapes from romfont 31 with
bitmaps containing only the accent themselves.
3) The custom bitmap is RLE compressed into PROGMEM. For accents, which have
a fairly small number of non-white pixels, the savings are significant.
These characteristics enable an alphabet for Western languages to be
synthesized from only a few dozen custom symbols and modest PROGMEM use (~10k)
The text layout is done by the code in "unicode.cpp" with the help of one of
more character renderers (e.g. "western_char_set.cpp"). Each character render
is responsible for loading the necessary bitmap data into RAMG and drawing
characters as requested.
To add symbols for other languages, it will only be necessary to make a bitmap
and implement a corresponding character renderer.

@ -0,0 +1,55 @@
/*******************
* font_bitmap.cpp *
*******************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../ftdi_extended.h"
#ifdef FTDI_EXTENDED
namespace FTDI {
void write_rle_data(uint16_t addr, const uint8_t *data, size_t n) {
for (; n > 2; n -= 2) {
uint8_t count = pgm_read_byte(data++);
uint8_t value = pgm_read_byte(data++);
while (count--) CLCD::mem_write_8(addr++, value);
}
}
void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle) {
cmd.cmd(BITMAP_HANDLE(handle));
cmd.cmd(BITMAP_SOURCE(fm.ptr));
cmd.bitmap_layout(fm.format, fm.stride, fm.height);
cmd.bitmap_size(BILINEAR, BORDER, BORDER, fm.width, fm.height);
}
void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell) {
if (x < 0 || y < 0 || x > 511 || y > 511) {
cmd.cmd(BITMAP_HANDLE(handle));
cmd.cmd(CELL(cell));
cmd.cmd(VERTEX2F(x * 16, y * 16));
} else {
cmd.cmd(VERTEX2II(x, y, handle, cell));
}
}
} // namespace FTDI
#endif // FTDI_EXTENDED

@ -0,0 +1,30 @@
/******************
* font_bitmaps.h *
******************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
class CommandProcessor;
namespace FTDI {
void write_rle_data(uint16_t addr, const uint8_t *data, size_t n);
void set_font_bitmap(CommandProcessor& cmd, CLCD::FontMetrics &fm, uint8_t handle);
void ext_vertex2ii(CommandProcessor &cmd, int x, int y, uint8_t handle, uint8_t cell);
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

@ -0,0 +1,46 @@
/*******************
* font_size_t.cpp *
*******************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../ftdi_extended.h"
#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
namespace FTDI {
// Returns the height of a standard FTDI romfont
uint8_t font_size_t::get_romfont_height(uint8_t font) {
static const uint8_t tbl[] PROGMEM = {
8, 8, 16, 16, 13, 17, 20, 22, 29, 38, 16, 20, 25, 28, 36, 49, 63, 83, 108
};
return pgm_read_byte(&tbl[font - 16]);
}
// Sets the scaling coefficient to match a romfont size
font_size_t font_size_t::from_romfont(uint8_t font) {
return font_size_t(uint32_t(std_height) * 256 / get_romfont_height(font));
}
// Returns the height of the font
uint8_t font_size_t::get_height() const {
return scale(std_height);
}
}
#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8

@ -0,0 +1,55 @@
/*****************
* font_size_t.h *
*****************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
class CommandProcessor;
namespace FTDI {
/* The unicode rendering of different font sizes happens by scaling a
* large-sized font bitmap using the FTDI bitmap transformation matrix.
* This keeps us from having to have load bitmaps for all font sizes.
*
* The font_size_t class helps manage this scaling factor.
*/
class font_size_t {
private:
// Standard height for font bitmaps
static constexpr uint8_t std_height = 49;
// 8.8 fixed point scaling coefficient
uint16_t coefficient;
font_size_t(uint16_t v) : coefficient(v) {}
public:
font_size_t() : coefficient(256) {}
static uint8_t get_romfont_height(uint8_t font);
static font_size_t from_romfont(uint8_t size);
template<typename T> T scale(T val) const {return (int32_t(val) * 256 / coefficient);}
uint8_t get_height() const;
uint16_t get_coefficient() const {return coefficient;}
};
}

@ -0,0 +1,100 @@
/*************************
* standard_char_set.cpp *
*************************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../ftdi_extended.h"
#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
constexpr static uint8_t std_font = 31;
/* Lookup table of the char widths for standard ROMFONT 31 */
uint8_t FTDI::StandardCharSet::std_char_width(char c) {
static const uint8_t tbl[] PROGMEM = {
10, 11, 15, 26, 25, 31, 26, 10, 15, 14, 18, 24, 9, 18, 11, 17, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 10, 10, 21, 23, 22, 20, 37, 27, 27, 26,
28, 23, 22, 28, 29, 12, 23, 26, 22, 35, 29, 28, 26, 29, 27, 26, 26, 28,
27, 36, 27, 26, 25, 12, 18, 12, 18, 21, 13, 23, 24, 22, 24, 22, 15, 24,
24, 10, 11, 22, 10, 36, 24, 24, 24, 24, 15, 22, 14, 24, 21, 32, 21, 21,
22, 15, 10, 15, 29, 10
};
return pgm_read_byte(&tbl[c - ' ']);
}
/**
* Load bitmap data into RAMG. This function is called once at the start
* of the program.
*
* Parameters:
*
* addr - Address in RAMG where the font data is written
*/
void FTDI::StandardCharSet::load_data(uint32_t) {
}
/**
* Populates the bitmap handles for the custom into the display list.
* This function is called once at the start of each display list.
*
* Parameters:
*
* cmd - Object used for writing to the FTDI chip command queue.
*/
void FTDI::StandardCharSet::load_bitmaps(CommandProcessor& cmd) {
CLCD::FontMetrics std_fm(std_font);
set_font_bitmap(cmd, std_fm, std_font);
}
/**
* Renders a character at location x and y. The x position is incremented
* by the width of the character.
*
* Parameters:
*
* cmd - If non-NULL the symbol is drawn to the screen.
* If NULL, only increment position for text measurement.
*
* x, y - The location at which to draw the character. On output,
* incremented to the location of the next character.
*
* fs - A scaling object used to scale the font. The display will
* already be configured to scale bitmaps, but positions
* must be scaled using fs.scale()
*
* c - The unicode code point to draw. If the renderer does not
* support the character, it should draw nothing.
*/
bool FTDI::StandardCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) {
uint8_t which = (c >= ' ' && c < 128) ? c : '?';
uint8_t width = std_char_width(which);
// Draw the character
if (cmd) ext_vertex2ii(*cmd, x, y, std_font, which);
// Increment X to the next character position
x += fs.scale(width);
return true;
}
#endif // FTDI_EXTENDED

@ -0,0 +1,30 @@
/***********************
* standard_char_set.h *
***********************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
namespace FTDI {
class StandardCharSet {
public:
static uint8_t std_char_width(char);
static void load_data(uint32_t addr);
static void load_bitmaps(CommandProcessor&);
static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t);
};
}

@ -0,0 +1,190 @@
/***************
* unicode.cpp *
***************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../ftdi_extended.h"
#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8)
using namespace FTDI;
/**
* Return a character in a UTF8 string and increment the
* pointer to the next character
*
* Parameters:
*
* c - Pointer to a UTF8 encoded string.
*
* Returns: The packed bytes of a UTF8 encoding of a single
* character (this is not the unicode codepoint)
*/
utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
utf8_char_t val = *(uint8_t*)c++;
while ((*c & 0xC0) == 0x80)
val = (val << 8) | *(uint8_t*)c++;
return val;
}
/**
* Helper function to draw and/or measure a UTF8 string
*
* Parameters:
*
* cmd - If non-NULL the symbol is drawn to the screen.
* If NULL, only increment position for text measurement.
*
* x, y - The location at which to draw the string.
*
* str - The UTF8 string to draw or measure.
*
* fs - A scaling object used to specify the font size.
*/
static uint16_t render_utf8_text(CommandProcessor* cmd, int x, int y, const char *str, font_size_t fs) {
const int start_x = x;
while (*str) {
const utf8_char_t c = get_utf8_char_and_inc(str);
#ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
WesternCharSet::render_glyph(cmd, x, y, fs, c) ||
#endif
StandardCharSet::render_glyph(cmd, x, y, fs, c);
}
return x - start_x;
}
/**
* Load the font bitmap data into RAMG. Called once at program start.
*
* Parameters:
*
* addr - Address in RAMG where the font data is written
*/
void FTDI::load_utf8_data(uint16_t addr) {
#ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
WesternCharSet::load_data(addr);
#endif
StandardCharSet::load_data(addr);
}
/**
* Populate the bitmap handles for the custom fonts into the display list.
* Called once at the start of each display list.
*
* Parameters:
*
* cmd - Object used for writing to the FTDI chip command queue.
*/
void FTDI::load_utf8_bitmaps(CommandProcessor &cmd) {
#ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
WesternCharSet::load_bitmaps(cmd);
#endif
StandardCharSet::load_bitmaps(cmd);
}
/**
* Measure a UTF8 text character
*
* Parameters:
*
* c - The unicode code point to measure.
*
* fs - A scaling object used to specify the font size.
*
* Returns: A width in pixels
*/
uint16_t FTDI::get_utf8_char_width(utf8_char_t c, font_size_t fs) {
int x = 0, y = 0;
#ifdef TOUCH_UI_UTF8_WESTERN_CHARSET
WesternCharSet::render_glyph(NULL, x, y, fs, c) ||
#endif
StandardCharSet::render_glyph(NULL, x, y, fs, c);
return x;
}
/**
* Measure a UTF8 text string
*
* Parameters:
*
* str - The UTF8 string to measure.
*
* fs - A scaling object used to specify the font size.
*
* Returns: A width in pixels
*/
uint16_t FTDI::get_utf8_text_width(const char *str, font_size_t fs) {
return render_utf8_text(NULL, 0, 0, str, fs);
}
uint16_t FTDI::get_utf8_text_width(progmem_str pstr, font_size_t fs) {
char str[strlen_P((const char*)pstr) + 1];
strcpy_P(str, (const char*)pstr);
return get_utf8_text_width((const char*) pstr, fs);
}
/**
* Draw a UTF8 text string
*
* Parameters:
*
* cmd - Object used for writing to the FTDI chip command queue.
*
* x, y - The location at which to draw the string.
*
* str - The UTF8 string to draw.
*
* fs - A scaling object used to specify the font size.
*
* options - Text alignment options (i.e. OPT_CENTERX, OPT_CENTERY, OPT_CENTER or OPT_RIGHTX)
*
*/
void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, const char *str, font_size_t fs, uint16_t options) {
cmd.cmd(SAVE_CONTEXT());
cmd.cmd(BITMAP_TRANSFORM_A(fs.get_coefficient()));
cmd.cmd(BITMAP_TRANSFORM_E(fs.get_coefficient()));
cmd.cmd(BEGIN(BITMAPS));
// Apply alignment options
if (options & OPT_CENTERX)
x -= get_utf8_text_width(str, fs) / 2;
else if (options & OPT_RIGHTX)
x -= get_utf8_text_width(str, fs);
if (options & OPT_CENTERY)
y -= fs.get_height()/2;
// Render the text
render_utf8_text(&cmd, x, y, str, fs);
cmd.cmd(RESTORE_CONTEXT());
}
void FTDI::draw_utf8_text(CommandProcessor& cmd, int x, int y, progmem_str pstr, font_size_t fs, uint16_t options) {
char str[strlen_P((const char*)pstr) + 1];
strcpy_P(str, (const char*)pstr);
draw_utf8_text(cmd, x, y, (const char*) str, fs, options);
}
#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8

@ -0,0 +1,106 @@
/*************
* unicode.h *
*************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
class CommandProcessor;
namespace FTDI {
#ifdef TOUCH_UI_USE_UTF8
typedef uint16_t utf8_char_t;
/**
* Converts a 32-bit codepoint into UTF-8. This compile-time function
* will be useful until the u8'a' character literal becomes more common.
*/
constexpr uint32_t utf8(const uint32_t c) {
return (c < 0x7F ) ? c :
(c < 0x7FF) ? (0x0000C080 | ((c & 0b011111000000) << 2) | (c & 0b111111)) :
(c < 0xFFFF) ? (0x00E08080 | ((c & 0b001111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111)) :
(0xF0808080 | ((c & 0b000111000000000000000000) << 6) | ((c & 0b111111000000000000) << 4) | ((c & 0b111111000000) << 2) | (c & 0b111111));
}
/* Returns the next character in a UTF8 string and increments the
* pointer to the next character */
utf8_char_t get_utf8_char_and_inc(const char *&c);
/* Returns the next character in a UTF8 string, without incrementing */
inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);}
void load_utf8_data(uint16_t addr);
#else
typedef char utf8_char_t;
inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;}
inline utf8_char_t get_utf8_char(const char *c) {return *c;}
inline void load_utf8_data(uint16_t) {}
#endif
void load_utf8_bitmaps(CommandProcessor& cmd);
uint16_t get_utf8_char_width(utf8_char_t, font_size_t);
uint16_t get_utf8_text_width(progmem_str, font_size_t);
uint16_t get_utf8_text_width(const char *, font_size_t);
void draw_utf8_text(CommandProcessor&, int x, int y, progmem_str, font_size_t, uint16_t options = 0);
void draw_utf8_text(CommandProcessor&, int x, int y, const char *, font_size_t, uint16_t options = 0);
// Similar to CLCD::FontMetrics, but can be used with UTF8 encoded strings.
struct FontMetrics {
#ifdef TOUCH_UI_USE_UTF8
font_size_t fs;
#else
CLCD::FontMetrics fm;
#endif
inline void load(uint8_t rom_font_size) {
#ifdef TOUCH_UI_USE_UTF8
fs = font_size_t::from_romfont(rom_font_size);
#else
fm.load(rom_font_size);
#endif
}
inline uint16_t get_char_width(utf8_char_t c) const {
#ifdef TOUCH_UI_USE_UTF8
return get_utf8_char_width(c, fs);
#else
return fm.char_widths[(uint8_t)c];
#endif
}
inline uint8_t get_height() const {
#ifdef TOUCH_UI_USE_UTF8
return fs.get_height();
#else
return fm.height;
#endif
}
inline FontMetrics(uint8_t rom_font_size) {
load(rom_font_size);
}
};
}

@ -0,0 +1,338 @@
/************************
* western_char_set.cpp *
************************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#include "../ftdi_extended.h"
#if defined(FTDI_EXTENDED) && defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
#include "western_char_set_bitmap_31.h"
#define NUM_ELEMENTS(a) (sizeof(a)/sizeof(a[0]))
using namespace FTDI;
constexpr static uint8_t std_font = 31;
constexpr static uint8_t alt_font = 1;
static uint32_t bitmap_addr;
/* Glyphs in the WesternCharSet bitmap */
enum {
GRAVE,
ACUTE,
CIRCUMFLEX,
TILDE,
DIAERESIS,
DOT_ABOVE,
CEDILLA,
NO_DOT_I,
SHARP_S,
LRG_O_STROKE,
SML_O_STROKE,
LRG_AE,
SML_AE,
LRG_ETH,
SML_ETH,
LRG_THORN,
SML_THORN,
LEFT_DBL_QUOTE,
RIGHT_DBL_QUOTE,
INV_EXCLAMATION,
INV_QUESTION,
CENT_SIGN,
POUND_SIGN,
CURRENCY_SIGN,
YEN_SIGN
};
/* Centerline of characters that can take accents */
constexpr int8_t mid_a = 12;
constexpr int8_t mid_e = 12;
constexpr int8_t mid_i = 5;
constexpr int8_t mid_o = 12;
constexpr int8_t mid_u = 12;
constexpr int8_t mid_y = 11;
constexpr int8_t mid_n = 12;
constexpr int8_t mid_c = 12;
constexpr int8_t mid_A = 13;
constexpr int8_t mid_E = 13;
constexpr int8_t mid_I = 6;
constexpr int8_t mid_O = 14;
constexpr int8_t mid_U = 14;
constexpr int8_t mid_Y = 13;
constexpr int8_t mid_N = 15;
constexpr int8_t mid_C = 13;
/* Centerline of accent glyphs */
constexpr int8_t mid_accent = 16;
/* When reusing the DOT_ABOVE accent glyph for the degree sign, we need to trim the leading space */
constexpr uint8_t deg_sign_leading = 9;
/* Look-up table for constructing characters (must be ordered by unicode)
*
* Characters are either complete symbols from the Western Char Set bitmap,
* or they are constructed using a standard letter from the romfont and
* drawing an accent from the Western Char Set bitmap over it.
*/
#define UTF8(A) uint16_t(utf8(U##A))
PROGMEM constexpr struct {
uint16_t unicode;
uint8_t std_char; // Glyph from standard ROMFONT (zero if none)
uint8_t alt_char; // Glyph from Western Char Set bitmap
uint8_t alt_data; // For accented characters, the centerline; else char width
} char_recipe[] = {
{0, 0, NO_DOT_I, 10 },
{UTF8('¡'), 0 , INV_EXCLAMATION, 13 },
{UTF8('¢'), 0 , CENT_SIGN, 23 },
{UTF8('£'), 0 , POUND_SIGN, 24 },
{UTF8('¤'), 0 , CURRENCY_SIGN, 26 },
{UTF8('¥'), 0 , YEN_SIGN, 26 },
{UTF8('«'), 0 , LEFT_DBL_QUOTE, 23 },
{UTF8('°'), 0 , DOT_ABOVE, 24 },
{UTF8('»'), 0 , RIGHT_DBL_QUOTE, 24 },
{UTF8('¿'), 0 , INV_QUESTION, 21 },
{UTF8('À'), 'A', GRAVE, mid_A},
{UTF8('Á'), 'A', ACUTE, mid_A},
{UTF8('Â'), 'A', CIRCUMFLEX, mid_A},
{UTF8('Ã'), 'A', TILDE, mid_A},
{UTF8('Ä'), 'A', DIAERESIS, mid_A},
{UTF8('Å'), 'A', DOT_ABOVE, mid_A},
{UTF8('Æ'), 0 , LRG_AE, mid_E},
{UTF8('Ç'), 'C', CEDILLA, mid_C},
{UTF8('È'), 'E', GRAVE, mid_E},
{UTF8('É'), 'E', ACUTE, mid_E},
{UTF8('Ê'), 'E', CIRCUMFLEX, mid_E},
{UTF8('Ë'), 'E', DIAERESIS, mid_E},
{UTF8('Ì'), 'I', GRAVE, mid_I},
{UTF8('Í'), 'I', ACUTE, mid_I},
{UTF8('Î'), 'I', CIRCUMFLEX, mid_I},
{UTF8('Ï'), 'I', DIAERESIS, mid_I},
{UTF8('Ð'), 0, LRG_ETH, 31 },
{UTF8('Ñ'), 'N', TILDE, mid_N},
{UTF8('Ò'), 'O', GRAVE, mid_O},
{UTF8('Ó'), 'O', ACUTE, mid_O},
{UTF8('Ô'), 'O', CIRCUMFLEX, mid_O},
{UTF8('Õ'), 'O', TILDE, mid_O},
{UTF8('Ö'), 'O', DIAERESIS, mid_O},
{UTF8('Ø'), 0 , LRG_O_STROKE, 32 },
{UTF8('Ù'), 'U', GRAVE, mid_U},
{UTF8('Ú'), 'U', ACUTE, mid_U},
{UTF8('Û'), 'U', CIRCUMFLEX, mid_U},
{UTF8('Ü'), 'U', DIAERESIS, mid_U},
{UTF8('Ý'), 'Y', ACUTE, mid_Y},
{UTF8('Þ'), 0 , LRG_THORN, 25 },
{UTF8('ß'), 0 , SHARP_S, 26 },
{UTF8('à'), 'a', GRAVE, mid_a},
{UTF8('á'), 'a', ACUTE, mid_a},
{UTF8('â'), 'a', CIRCUMFLEX, mid_a},
{UTF8('ã'), 'a', TILDE, mid_a},
{UTF8('ä'), 'a', DIAERESIS, mid_a},
{UTF8('å'), 'a', DOT_ABOVE, mid_a},
{UTF8('æ'), 0 , SML_AE, 40 },
{UTF8('ç'), 'c', CEDILLA, mid_c},
{UTF8('è'), 'e', GRAVE, mid_e},
{UTF8('é'), 'e', ACUTE, mid_e},
{UTF8('ê'), 'e', CIRCUMFLEX, mid_e},
{UTF8('ë'), 'e', DIAERESIS, mid_e},
{UTF8('ì'), 'i', GRAVE, mid_i},
{UTF8('í'), 'i', ACUTE, mid_i},
{UTF8('î'), 'i', CIRCUMFLEX, mid_i},
{UTF8('ï'), 'i', DIAERESIS, mid_i},
{UTF8('ð'), 0, SML_ETH, 24 },
{UTF8('ñ'), 'n', TILDE, mid_n},
{UTF8('ò'), 'o', GRAVE, mid_o},
{UTF8('ó'), 'o', ACUTE, mid_o},
{UTF8('ô'), 'o', CIRCUMFLEX, mid_o},
{UTF8('õ'), 'o', TILDE, mid_o},
{UTF8('ö'), 'o', DIAERESIS, mid_o},
{UTF8('ø'), 0 , SML_O_STROKE, 25 },
{UTF8('ù'), 'u', GRAVE, mid_u},
{UTF8('ú'), 'u', ACUTE, mid_u},
{UTF8('û'), 'u', CIRCUMFLEX, mid_u},
{UTF8('ü'), 'u', DIAERESIS, mid_u},
{UTF8('ý'), 'y', ACUTE, mid_y},
{UTF8('þ'), 0 , SML_THORN, 25 },
{UTF8('ÿ'), 'y', DIAERESIS, mid_y}
};
static_assert(UTF8('¡') == 0xC2A1, "Incorrect encoding for character");
/* Compile-time check that the table is in sorted order */
constexpr bool is_sorted(size_t n) {
return n < 2 ? true : char_recipe[n-2].unicode < char_recipe[n-1].unicode && is_sorted(n-1);
}
static_assert(is_sorted(NUM_ELEMENTS(char_recipe)), "The table must be sorted by unicode value");
/* Performs a binary search to find a unicode character in the table */
static int8_t find_char_data(FTDI::utf8_char_t c) {
int8_t min = 0, max = NUM_ELEMENTS(char_recipe), index;
for (;;) {
index = (min + max)/2;
const uint16_t char_at = pgm_read_word(&char_recipe[index].unicode);
if (char_at == c) break;
if (min == max) return -1;
if (c > char_at)
min = index + 1;
else
max = index;
}
return index;
}
static void get_char_data(uint8_t index, uint8_t &std_char, uint8_t &alt_char, uint8_t &alt_data) {
std_char = pgm_read_byte(&char_recipe[index].std_char);
alt_char = pgm_read_byte(&char_recipe[index].alt_char);
alt_data = pgm_read_byte(&char_recipe[index].alt_data);
}
/**
* Load bitmap data into RAMG. This function is called once at the start
* of the program.
*
* Parameters:
*
* addr - Address in RAMG where the font data is written
*/
void FTDI::WesternCharSet::load_data(uint32_t addr) {
// Load the alternative font metrics
CLCD::FontMetrics alt_fm;
alt_fm.ptr = addr + 148;
alt_fm.format = L4;
alt_fm.stride = 19;
alt_fm.width = 38;
alt_fm.height = 49;
for (uint8_t i = 0; i < 127; i++) {
alt_fm.char_widths[i] = 0;
}
// For special characters, copy the character widths from the char tables
for (uint8_t i = 0; i < NUM_ELEMENTS(char_recipe); i++) {
uint8_t std_char, alt_char, alt_data;
get_char_data(i, std_char, alt_char, alt_data);
if (std_char == 0)
alt_fm.char_widths[alt_char] = alt_data;
}
CLCD::mem_write_bulk(addr, &alt_fm, 148);
// Decode the RLE data and load it into RAMG as a bitmap
write_rle_data(addr + 148, font, sizeof(font));
bitmap_addr = addr;
}
/**
* Populates the bitmap handles for the custom into the display list.
* This function is called once at the start of each display list.
*
* Parameters:
*
* cmd - Object used for writing to the FTDI chip command queue.
*/
void FTDI::WesternCharSet::load_bitmaps(CommandProcessor& cmd) {
CLCD::FontMetrics alt_fm;
alt_fm.ptr = bitmap_addr + 148;
alt_fm.format = L4;
alt_fm.stride = 19;
alt_fm.width = 38;
alt_fm.height = 49;
set_font_bitmap(cmd, alt_fm, alt_font);
}
/**
* Renders a character at location x and y. The x position is incremented
* by the width of the character.
*
* Parameters:
*
* cmd - If non-NULL the symbol is drawn to the screen.
* If NULL, only increment position for text measurement.
*
* x, y - The location at which to draw the character. On output,
* incremented to the location of the next character.
*
* fs - A scaling object used to scale the font. The display will
* already be configured to scale bitmaps, but positions
* must be scaled using fs.scale()
*
* c - The unicode code point to draw. If the renderer does not
* support the character, it should return false.
* Returns: Whether the character was supported.
*/
bool FTDI::WesternCharSet::render_glyph(CommandProcessor* cmd, int &x, int &y, font_size_t fs, utf8_char_t c) {
// A supported character?
if (c < UTF8('¡') || c > UTF8('ÿ')) return false;
int8_t index = find_char_data(c);
if (index == -1) return false;
// Determine character characteristics
uint8_t std_char, alt_char, alt_data;
get_char_data(index, std_char, alt_char, alt_data);
bool base_special;
uint8_t base_width;
uint8_t base_char;
uint8_t accent_char;
int8_t accent_dx, accent_dy;
if (std_char == 0) {
// Special character, non-accented
base_width = alt_data;
base_special = true;
base_char = alt_char;
accent_char = 0;
if (c == UTF8('°'))
x -= fs.scale(deg_sign_leading);
} else {
// Regular character with accent:
accent_dx = alt_data - mid_accent;
accent_dy = isupper(std_char) ? -7 : 0;
accent_char = alt_char;
base_width = StandardCharSet::std_char_width(std_char);
base_special = std_char == 'i';
base_char = base_special ? NO_DOT_I : std_char;
}
// If cmd != NULL, draw the glyph to the screen
if (cmd) {
ext_vertex2ii(*cmd, x, y, base_special ? alt_font : std_font, base_char);
if (accent_char)
ext_vertex2ii(*cmd, x + fs.scale(accent_dx), y + fs.scale(accent_dy), alt_font, accent_char);
}
// Increment X to the next character position
x += fs.scale(base_width);
return true;
}
#endif // FTDI_EXTENDED && TOUCH_UI_USE_UTF8 && TOUCH_UI_UTF8_WESTERN_CHARSET

@ -0,0 +1,29 @@
/**********************
* western_char_set.h *
**********************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
namespace FTDI {
class WesternCharSet {
public:
static void load_data(uint32_t addr);
static void load_bitmaps(CommandProcessor&);
static bool render_glyph(CommandProcessor*, int &x, int &y, font_size_t, utf8_char_t);
};
}

@ -0,0 +1,665 @@
/********************************
* western_european_bitmap_31.h *
********************************/
/****************************************************************************
* Written By Marcio Teixeira 2019 - Aleph Objects, Inc. *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* To view a copy of the GNU General Public License, go to the following *
* location: <http://www.gnu.org/licenses/>. *
****************************************************************************/
#pragma once
/* This is a dump of "font_bitmaps/western_european_bitmap_31.png"
* using the tool "bitmap2cpp.py". The tool converts the image into
* 16-level grayscale and packs two pixels per byte. The resulting
* bytes are then RLE compressed to yield (count, byte) pairs.
*/
const unsigned char font[] PROGMEM = {
0x76, 0x00, 0x01, 0x08, 0x01, 0xee, 0x01, 0xe5, 0x11, 0x00, 0x01, 0xaf,
0x01, 0xff, 0x01, 0x20, 0x10, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0,
0x10, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xf9, 0x11, 0x00, 0x01, 0x2e,
0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf2,
0x11, 0x00, 0x01, 0x5f, 0x01, 0xfd, 0x11, 0x00, 0x01, 0x06, 0x01, 0x99,
0x01, 0x40, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x20, 0x00, 0x01, 0x9e,
0x01, 0xee, 0x01, 0x50, 0x0f, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf8,
0x10, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0, 0x10, 0x00, 0x01, 0xcf,
0x01, 0xfc, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xd1, 0x10, 0x00,
0x01, 0x4f, 0x01, 0xfe, 0x01, 0x20, 0x0f, 0x00, 0x01, 0x01, 0x01, 0xef,
0x01, 0xf3, 0x10, 0x00, 0x01, 0x07, 0x01, 0xaa, 0x01, 0x40, 0xff, 0x00,
0xff, 0x00, 0xff, 0x00, 0x1f, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x10, 0x00,
0x01, 0x07, 0x02, 0xff, 0x01, 0x60, 0x0f, 0x00, 0x01, 0x2f, 0x02, 0xff,
0x01, 0xf2, 0x0f, 0x00, 0x01, 0xcf, 0x01, 0xf6, 0x01, 0x6f, 0x01, 0xfb,
0x0e, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x0a, 0x01, 0xff,
0x01, 0x60, 0x0d, 0x00, 0x01, 0x1f, 0x01, 0xfd, 0x01, 0x00, 0x01, 0x01,
0x01, 0xdf, 0x01, 0xf1, 0x0d, 0x00, 0x01, 0xbf, 0x01, 0xf3, 0x02, 0x00,
0x01, 0x3f, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x99, 0x01, 0x50,
0x02, 0x00, 0x01, 0x05, 0x01, 0x99, 0x01, 0x20, 0xff, 0x00, 0xff, 0x00,
0xff, 0x00, 0x1f, 0x00, 0x01, 0x11, 0x0d, 0x00, 0x01, 0x09, 0x01, 0xff,
0x01, 0xc3, 0x02, 0x00, 0x01, 0xff, 0x01, 0x80, 0x0c, 0x00, 0x01, 0xaf,
0x02, 0xff, 0x01, 0x50, 0x01, 0x01, 0x01, 0xff, 0x01, 0x60, 0x0b, 0x00,
0x01, 0x02, 0x01, 0xff, 0x01, 0xd9, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x07,
0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0x20,
0x01, 0x3e, 0x02, 0xff, 0x01, 0xfd, 0x0c, 0x00, 0x01, 0x09, 0x01, 0xfe,
0x01, 0x00, 0x01, 0x02, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00,
0x01, 0x07, 0x01, 0xa8, 0x02, 0x00, 0x01, 0x06, 0x01, 0x98, 0x01, 0x20,
0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x41, 0x00, 0x02, 0x44, 0x02, 0x00,
0x02, 0x44, 0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff,
0x0d, 0x00, 0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00,
0x02, 0xff, 0x01, 0x10, 0x01, 0x01, 0x02, 0xff, 0x0d, 0x00, 0x02, 0xcc,
0x01, 0x10, 0x01, 0x01, 0x02, 0xcc, 0xff, 0x00, 0xff, 0x00, 0xf6, 0x00,
0x01, 0x13, 0x01, 0x30, 0x10, 0x00, 0x01, 0x2b, 0x02, 0xff, 0x01, 0xa1,
0x0e, 0x00, 0x01, 0x02, 0x01, 0xef, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x10,
0x0d, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x94, 0x01, 0x5a, 0x01, 0xff,
0x01, 0xb0, 0x0d, 0x00, 0x01, 0x4f, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x9f,
0x01, 0xf2, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xf0, 0x02, 0x00, 0x01, 0x2f,
0x01, 0xf6, 0x0d, 0x00, 0x01, 0x8f, 0x01, 0xe0, 0x02, 0x00, 0x01, 0x0f,
0x01, 0xf7, 0x0d, 0x00, 0x01, 0x7f, 0x01, 0xf2, 0x02, 0x00, 0x01, 0x4f,
0x01, 0xf5, 0x0d, 0x00, 0x01, 0x2f, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x02,
0x01, 0xdf, 0x01, 0xf0, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0e, 0x00, 0x01, 0x9f, 0x02, 0xff,
0x01, 0xf8, 0x0f, 0x00, 0x01, 0x03, 0x01, 0x9c, 0x01, 0xc9, 0x01, 0x30,
0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x93, 0x00,
0x01, 0x06, 0x01, 0xff, 0x01, 0x20, 0x11, 0x00, 0x01, 0xcf, 0x01, 0xc0,
0x11, 0x00, 0x01, 0x3f, 0x01, 0xf6, 0x11, 0x00, 0x01, 0x0f, 0x01, 0xfb,
0x11, 0x00, 0x01, 0x3f, 0x01, 0xfd, 0x0e, 0x00, 0x01, 0x07, 0x01, 0xd9,
0x01, 0x89, 0x01, 0xff, 0x01, 0xfb, 0x0e, 0x00, 0x01, 0x07, 0x03, 0xff,
0x01, 0xf3, 0x0e, 0x00, 0x01, 0x04, 0x01, 0xbd, 0x01, 0xee, 0x01, 0xd9,
0x01, 0x20, 0xff, 0x00, 0x61, 0x00, 0x01, 0x01, 0x01, 0x99, 0x01, 0x96,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf9, 0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9,
0x10, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf9, 0xff, 0x00, 0x58, 0x00,
0x01, 0x35, 0x01, 0x66, 0x01, 0x52, 0x0e, 0x00, 0x01, 0x03, 0x01, 0xaf,
0x03, 0xff, 0x01, 0xe7, 0x0d, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xc1,
0x0b, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfc, 0x01, 0xaa, 0x01, 0xdf,
0x01, 0xff, 0x01, 0xfc, 0x0b, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf9,
0x01, 0x10, 0x01, 0x00, 0x01, 0x02, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x70,
0x0a, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x0d,
0x01, 0xff, 0x01, 0xe0, 0x0a, 0x00, 0x01, 0xef, 0x01, 0xff, 0x04, 0x00,
0x01, 0x05, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x01, 0x02, 0x01, 0xff,
0x01, 0xfb, 0x04, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xf7, 0x09, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x03, 0x00, 0x01, 0x03, 0x01, 0x9e,
0x01, 0xff, 0x01, 0xf8, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x02, 0x00, 0x01, 0x01, 0x01, 0xaf, 0x02, 0xff, 0x01, 0xd7, 0x09, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x01, 0xff,
0x01, 0xfc, 0x01, 0x50, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x02, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x70, 0x0b, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfa,
0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05,
0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf4, 0x0c, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf9,
0x0c, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x02,
0x02, 0xff, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x02, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0xf8, 0x0b, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x1d, 0x02, 0xff, 0x01, 0xd3,
0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x01,
0x01, 0xcf, 0x02, 0xff, 0x01, 0x70, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf8, 0x03, 0x00, 0x01, 0x07, 0x02, 0xff, 0x01, 0xfb, 0x09, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00, 0x01, 0x2b, 0x02, 0xff,
0x01, 0xb0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00,
0x01, 0x6f, 0x01, 0xff, 0x01, 0xf6, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf8, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf,
0x01, 0xff, 0x01, 0x10, 0x07, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf8, 0x05, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x01, 0x02, 0x01, 0x84, 0x03, 0x00,
0x01, 0x2d, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf8, 0x01, 0x02, 0x01, 0xff, 0x01, 0xec, 0x01, 0xa9, 0x01, 0xac,
0x02, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf8,
0x01, 0x02, 0x05, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x08, 0x00, 0x01, 0x03,
0x01, 0xee, 0x01, 0xe7, 0x01, 0x01, 0x01, 0xbf, 0x03, 0xff, 0x01, 0xfe,
0x01, 0x80, 0x0e, 0x00, 0x01, 0x35, 0x01, 0x78, 0x01, 0x76, 0x01, 0x30,
0xff, 0x00, 0x48, 0x00, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x47, 0x01, 0x9a,
0x01, 0xba, 0x01, 0x95, 0x01, 0x10, 0x02, 0x00, 0x01, 0x07, 0x01, 0xf8,
0x08, 0x00, 0x01, 0x02, 0x01, 0xae, 0x04, 0xff, 0x01, 0xfc, 0x01, 0x50,
0x01, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0x8f,
0x06, 0xff, 0x01, 0xfc, 0x01, 0x23, 0x01, 0xff, 0x01, 0xf6, 0x07, 0x00,
0x01, 0x1c, 0x03, 0xff, 0x01, 0xca, 0x01, 0x9b, 0x01, 0xdf, 0x02, 0xff,
0x01, 0xfe, 0x01, 0xff, 0x01, 0x80, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0xfd, 0x01, 0x50, 0x02, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff,
0x01, 0xfa, 0x07, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0x90, 0x04, 0x00,
0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0xf3, 0x07, 0x00, 0x01, 0x5f,
0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xfc,
0x07, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0, 0x05, 0x00, 0x01, 0x06,
0x03, 0xff, 0x01, 0x60, 0x05, 0x00, 0x01, 0x04, 0x02, 0xff, 0x01, 0x30,
0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xc0,
0x05, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02,
0x01, 0xef, 0x01, 0xf7, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xf3, 0x05, 0x00,
0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x05, 0x00, 0x01, 0x1d, 0x01, 0xff,
0x01, 0xa0, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf8, 0x05, 0x00, 0x01, 0x3f,
0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xfc, 0x01, 0x00,
0x01, 0x09, 0x01, 0xff, 0x01, 0xfb, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff,
0x01, 0xe0, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xd1, 0x01, 0x00,
0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff,
0x01, 0xc0, 0x04, 0x00, 0x01, 0x7f, 0x01, 0xfe, 0x01, 0x20, 0x01, 0x00,
0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0,
0x03, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf4, 0x02, 0x00, 0x01, 0x02,
0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0,
0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0x01,
0x02, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0,
0x02, 0x00, 0x01, 0x01, 0x01, 0xef, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x02,
0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0xb0,
0x02, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xb0, 0x03, 0x00, 0x01, 0x03,
0x02, 0xff, 0x01, 0x10, 0x04, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xc0,
0x02, 0x00, 0x01, 0xbf, 0x01, 0xfd, 0x04, 0x00, 0x01, 0x04, 0x02, 0xff,
0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0x08,
0x01, 0xff, 0x01, 0xe1, 0x04, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe,
0x05, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xf2, 0x01, 0x00, 0x01, 0x6f,
0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa,
0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x01, 0x04, 0x01, 0xff,
0x01, 0xf5, 0x05, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf7, 0x05, 0x00,
0x01, 0x09, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x2e, 0x01, 0xff, 0x01, 0x70,
0x05, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00, 0x01, 0x03,
0x02, 0xff, 0x01, 0xef, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0xb0, 0x06, 0x00, 0x01, 0xcf, 0x02, 0xff, 0x01, 0xc0, 0x05, 0x00,
0x01, 0x06, 0x02, 0xff, 0x01, 0x40, 0x06, 0x00, 0x01, 0x2f, 0x02, 0xff,
0x01, 0x20, 0x05, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xfb, 0x07, 0x00,
0x01, 0x0b, 0x02, 0xff, 0x01, 0xd2, 0x04, 0x00, 0x01, 0x06, 0x02, 0xff,
0x01, 0xe1, 0x07, 0x00, 0x01, 0x5f, 0x03, 0xff, 0x01, 0x93, 0x02, 0x00,
0x01, 0x05, 0x01, 0xcf, 0x02, 0xff, 0x01, 0x30, 0x06, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xfb, 0x03, 0xff, 0x01, 0xfd, 0x01, 0xde, 0x03, 0xff,
0x01, 0xe3, 0x07, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0x80, 0x01, 0x4d,
0x06, 0xff, 0x01, 0xfa, 0x01, 0x10, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xfb,
0x02, 0x00, 0x01, 0x5c, 0x04, 0xff, 0x01, 0xe9, 0x01, 0x30, 0x08, 0x00,
0x01, 0x1c, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x04, 0x01, 0x67, 0x01, 0x86,
0x01, 0x53, 0x0b, 0x00, 0x01, 0x10, 0xff, 0x00, 0xbd, 0x00, 0x01, 0x02,
0x01, 0x20, 0x0c, 0x00, 0x01, 0x02, 0x01, 0x32, 0x01, 0x10, 0x02, 0x00,
0x01, 0x1e, 0x01, 0xe3, 0x0a, 0x00, 0x01, 0x01, 0x01, 0x7c, 0x02, 0xff,
0x01, 0xfd, 0x01, 0x82, 0x01, 0x00, 0x01, 0xcf, 0x01, 0xf7, 0x0a, 0x00,
0x01, 0x6e, 0x05, 0xff, 0x01, 0x8a, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00,
0x01, 0x08, 0x07, 0xff, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff,
0x01, 0xfc, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3a, 0x02, 0xff, 0x01, 0xf1,
0x09, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x90, 0x03, 0x00, 0x01, 0x7f,
0x01, 0xff, 0x01, 0xf5, 0x09, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfc,
0x03, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfd, 0x09, 0x00,
0x01, 0x0e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x00, 0x01, 0x0b, 0x03, 0xff,
0x01, 0x30, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xd0, 0x03, 0x00,
0x01, 0x9f, 0x01, 0xfa, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x80, 0x08, 0x00,
0x01, 0x7f, 0x01, 0xff, 0x01, 0x80, 0x02, 0x00, 0x01, 0x06, 0x01, 0xff,
0x01, 0xc0, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x9f,
0x01, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x3f, 0x01, 0xfe, 0x01, 0x10,
0x01, 0x1f, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff,
0x01, 0x40, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf3, 0x01, 0x00,
0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x30, 0x01, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00,
0x01, 0x0e, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff,
0x01, 0x30, 0x01, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x0f,
0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
0x01, 0x08, 0x01, 0xff, 0x01, 0xb0, 0x02, 0x00, 0x01, 0x0f, 0x01, 0xff,
0x01, 0xe0, 0x08, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x60, 0x01, 0x5f,
0x01, 0xfd, 0x03, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xc0, 0x08, 0x00,
0x01, 0x4f, 0x01, 0xff, 0x01, 0xa3, 0x01, 0xff, 0x01, 0xe2, 0x03, 0x00,
0x01, 0x7f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f, 0x01, 0xff,
0x01, 0xfe, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x50, 0x08, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0xf6, 0x03, 0x00,
0x01, 0x05, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff,
0x01, 0xb0, 0x03, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf8, 0x0a, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xef,
0x01, 0xff, 0x01, 0xd0, 0x09, 0x00, 0x01, 0x04, 0x03, 0xff, 0x01, 0xfc,
0x01, 0xab, 0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x20, 0x09, 0x00,
0x01, 0x2f, 0x01, 0xff, 0x01, 0xaf, 0x05, 0xff, 0x01, 0xd2, 0x09, 0x00,
0x01, 0x01, 0x01, 0xdf, 0x01, 0xf5, 0x01, 0x04, 0x01, 0xbf, 0x03, 0xff,
0x01, 0xd6, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0x70, 0x01, 0x00,
0x01, 0x01, 0x01, 0x46, 0x01, 0x76, 0x01, 0x52, 0x0c, 0x00, 0x01, 0x28,
0xff, 0x00, 0x48, 0x00, 0x01, 0x14, 0x0b, 0x44, 0x01, 0x41, 0x06, 0x00,
0x01, 0x8f, 0x0b, 0xff, 0x01, 0xf3, 0x06, 0x00, 0x01, 0xef, 0x0b, 0xff,
0x01, 0xf3, 0x05, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xee, 0x09, 0xff,
0x01, 0xf3, 0x05, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf5, 0x01, 0x00,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x63, 0x06, 0x33, 0x01, 0x30, 0x05, 0x00,
0x01, 0x3f, 0x01, 0xff, 0x01, 0xe0, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0x40, 0x0c, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x01, 0x02, 0xff,
0x01, 0x10, 0x01, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00,
0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0x40, 0x0b, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf3, 0x02, 0x00,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff,
0x01, 0xd0, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0b, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x60, 0x02, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0x40, 0x0a, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfe, 0x03, 0x00,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff,
0x01, 0xf9, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xed, 0x06, 0xdd,
0x01, 0x80, 0x03, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x03, 0x00,
0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00, 0x01, 0x6f, 0x01, 0xff,
0x01, 0xb0, 0x03, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xa0, 0x03, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x40, 0x03, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0xa8, 0x06, 0x88, 0x01, 0x50, 0x02, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xfe, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0x40, 0x09, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xf4, 0x04, 0x33,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x09, 0x00, 0x01, 0x7f, 0x08, 0xff,
0x01, 0x40, 0x09, 0x00, 0x01, 0xef, 0x08, 0xff, 0x01, 0x40, 0x08, 0x00,
0x01, 0x05, 0x09, 0xff, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff,
0x01, 0xf7, 0x05, 0x33, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00,
0x01, 0x2f, 0x01, 0xff, 0x01, 0xe0, 0x05, 0x00, 0x01, 0xdf, 0x01, 0xff,
0x01, 0x40, 0x08, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x80, 0x05, 0x00,
0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x08, 0x00, 0x02, 0xff, 0x01, 0x20,
0x05, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x40, 0x07, 0x00, 0x01, 0x06,
0x01, 0xff, 0x01, 0xfb, 0x06, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xa8,
0x06, 0x88, 0x01, 0x85, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf4, 0x06, 0x00,
0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe0,
0x06, 0x00, 0x01, 0xdf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x8d, 0x01, 0xdd,
0x01, 0x60, 0x06, 0x00, 0x01, 0xbd, 0x08, 0xdd, 0x01, 0xd8, 0xff, 0x00,
0xe0, 0x00, 0x01, 0x01, 0x01, 0x34, 0x01, 0x31, 0x06, 0x00, 0x01, 0x12,
0x01, 0x42, 0x01, 0x10, 0x05, 0x00, 0x01, 0x02, 0x01, 0x7b, 0x01, 0xef,
0x02, 0xff, 0x01, 0xfb, 0x01, 0x60, 0x02, 0x00, 0x01, 0x03, 0x01, 0x9e,
0x02, 0xff, 0x01, 0xfd, 0x01, 0x81, 0x04, 0x00, 0x01, 0xbf, 0x05, 0xff,
0x01, 0xfe, 0x01, 0x40, 0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0x60,
0x03, 0x00, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xee, 0x03, 0xff, 0x01, 0xf5,
0x01, 0x1d, 0x03, 0xff, 0x01, 0xef, 0x02, 0xff, 0x01, 0xf8, 0x03, 0x00,
0x01, 0xdf, 0x01, 0xb6, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x5d,
0x02, 0xff, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xe7, 0x01, 0x20, 0x01, 0x00,
0x01, 0x29, 0x02, 0xff, 0x01, 0x50, 0x02, 0x00, 0x01, 0x71, 0x05, 0x00,
0x01, 0xaf, 0x02, 0xff, 0x01, 0xfb, 0x01, 0x10, 0x03, 0x00, 0x01, 0x4f,
0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x0d, 0x02, 0xff, 0x01, 0xd0,
0x04, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x08, 0x00, 0x01, 0x06,
0x02, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0xef, 0x01, 0xfd, 0x08, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x06, 0x00, 0x01, 0x9f, 0x01, 0xff,
0x04, 0x00, 0x01, 0x02, 0x01, 0x45, 0x02, 0x66, 0x01, 0x67, 0x01, 0xff,
0x01, 0xf9, 0x06, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x03, 0x00, 0x01, 0x4a,
0x06, 0xff, 0x01, 0xfb, 0x03, 0x66, 0x01, 0x67, 0x02, 0x77, 0x01, 0xaf,
0x01, 0xff, 0x02, 0x00, 0x01, 0x1b, 0x10, 0xff, 0x01, 0x00, 0x01, 0x01,
0x01, 0xdf, 0x02, 0xff, 0x01, 0xcb, 0x01, 0xa8, 0x01, 0x88, 0x01, 0x89,
0x0a, 0xff, 0x01, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x40,
0x03, 0x00, 0x01, 0x02, 0x01, 0xff, 0x01, 0xfa, 0x08, 0x77, 0x01, 0x00,
0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x09, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00,
0x01, 0x05, 0x01, 0xff, 0x01, 0xfa, 0x09, 0x00, 0x01, 0x7f, 0x01, 0xff,
0x01, 0x30, 0x04, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfe, 0x09, 0x00,
0x01, 0x7f, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0x0f, 0x02, 0xff,
0x01, 0x50, 0x08, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x04, 0x00,
0x01, 0x8f, 0x02, 0xff, 0x01, 0xe1, 0x08, 0x00, 0x01, 0x3f, 0x01, 0xff,
0x01, 0xd0, 0x03, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfe, 0x01, 0xff,
0x01, 0xfc, 0x01, 0x10, 0x05, 0x00, 0x01, 0x45, 0x01, 0x00, 0x01, 0x0d,
0x01, 0xff, 0x01, 0xfc, 0x01, 0x20, 0x01, 0x00, 0x01, 0x01, 0x01, 0x9f,
0x01, 0xff, 0x01, 0xa2, 0x02, 0xff, 0x01, 0xe6, 0x01, 0x10, 0x02, 0x00,
0x01, 0x02, 0x01, 0x8d, 0x01, 0xf8, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff,
0x01, 0xfd, 0x01, 0xab, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x00,
0x01, 0x3f, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xba, 0x01, 0xbc, 0x02, 0xff,
0x01, 0xf8, 0x02, 0x00, 0x01, 0x7f, 0x05, 0xff, 0x01, 0xa0, 0x01, 0x00,
0x01, 0x02, 0x01, 0xcf, 0x06, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x03,
0x01, 0xbf, 0x03, 0xff, 0x01, 0xb4, 0x03, 0x00, 0x01, 0x05, 0x01, 0xbf,
0x04, 0xff, 0x01, 0xb7, 0x01, 0x10, 0x03, 0x00, 0x01, 0x01, 0x01, 0x46,
0x01, 0x76, 0x01, 0x41, 0x06, 0x00, 0x01, 0x35, 0x01, 0x67, 0x01, 0x64,
0x01, 0x20, 0xff, 0x00, 0x48, 0x00, 0x01, 0x34, 0x03, 0x44, 0x01, 0x43,
0x01, 0x21, 0x0d, 0x00, 0x01, 0xbf, 0x05, 0xff, 0x01, 0xfe, 0x01, 0xb8,
0x01, 0x40, 0x0a, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xfe, 0x01, 0x81,
0x09, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xfe, 0x01, 0x60, 0x08, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x61, 0x02, 0x11, 0x01, 0x23, 0x01, 0x58,
0x01, 0xcf, 0x02, 0xff, 0x01, 0xf9, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x04, 0x00, 0x01, 0x02, 0x01, 0x9f, 0x02, 0xff, 0x01, 0x80,
0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x04,
0x01, 0xef, 0x01, 0xff, 0x01, 0xf4, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x06, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xfd, 0x07, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x06, 0x02, 0xff,
0x01, 0x50, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
0x01, 0xef, 0x01, 0xff, 0x01, 0xb0, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x07, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf0, 0x06, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x3f, 0x01, 0xff,
0x01, 0xf3, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
0x01, 0x0f, 0x01, 0xff, 0x01, 0xf5, 0x04, 0x00, 0x01, 0x23, 0x01, 0x33,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x73, 0x02, 0x33, 0x01, 0x30, 0x04, 0x00,
0x01, 0x0d, 0x01, 0xff, 0x01, 0xf6, 0x04, 0x00, 0x01, 0xcf, 0x06, 0xff,
0x01, 0xf2, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf7, 0x04, 0x00,
0x01, 0xcf, 0x06, 0xff, 0x01, 0xf2, 0x04, 0x00, 0x01, 0x0b, 0x01, 0xff,
0x01, 0xf9, 0x04, 0x00, 0x01, 0x9b, 0x01, 0xbb, 0x01, 0xef, 0x01, 0xff,
0x01, 0xdb, 0x02, 0xbb, 0x01, 0xb1, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff,
0x01, 0xf8, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x07, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf6, 0x06, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00, 0x01, 0x1f, 0x01, 0xff,
0x01, 0xf4, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x07, 0x00,
0x01, 0x5f, 0x01, 0xff, 0x01, 0xf1, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x07, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xd0, 0x06, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00, 0x01, 0x01, 0x02, 0xff,
0x01, 0x80, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x06, 0x00,
0x01, 0x0b, 0x02, 0xff, 0x01, 0x20, 0x06, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x50, 0x06, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0xf9, 0x07, 0x00,
0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x05, 0x00, 0x01, 0x1a, 0x02, 0xff,
0x01, 0xe1, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x50, 0x04, 0x00,
0x01, 0x29, 0x03, 0xff, 0x01, 0x30, 0x07, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0xa7, 0x01, 0x77, 0x01, 0x78, 0x01, 0x9a, 0x01, 0xbf, 0x03, 0xff,
0x01, 0xe3, 0x08, 0x00, 0x01, 0xbf, 0x08, 0xff, 0x01, 0xf9, 0x01, 0x10,
0x08, 0x00, 0x01, 0xbf, 0x07, 0xff, 0x01, 0xd8, 0x01, 0x10, 0x09, 0x00,
0x01, 0xad, 0x03, 0xdd, 0x01, 0xdc, 0x01, 0xbb, 0x01, 0xa7, 0x01, 0x41,
0xff, 0x00, 0x50, 0x00, 0x01, 0x38, 0x01, 0x88, 0x01, 0x81, 0x10, 0x00,
0x01, 0x0b, 0x01, 0xff, 0x01, 0xfc, 0x03, 0x00, 0x01, 0x5a, 0x01, 0x40,
0x0c, 0x00, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x04, 0x01, 0xaf,
0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x1e, 0x01, 0xff, 0x01, 0xfc,
0x02, 0xff, 0x01, 0xd8, 0x01, 0x20, 0x0c, 0x00, 0x01, 0x07, 0x02, 0xff,
0x01, 0xfd, 0x01, 0x82, 0x0d, 0x00, 0x01, 0x5a, 0x03, 0xff, 0x01, 0xf4,
0x0d, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x87, 0x02, 0xff,
0x01, 0x30, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xe9, 0x01, 0x30, 0x01, 0x00,
0x01, 0x8f, 0x01, 0xff, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x03, 0x03, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0e, 0x00, 0x01, 0x23,
0x01, 0x44, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02,
0x01, 0x9e, 0x04, 0xff, 0x01, 0xf7, 0x0c, 0x00, 0x01, 0x7f, 0x06, 0xff,
0x01, 0x30, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfe, 0x01, 0xcb,
0x01, 0xdf, 0x02, 0xff, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xff,
0x01, 0xfb, 0x01, 0x30, 0x02, 0x00, 0x01, 0x4e, 0x01, 0xff, 0x01, 0xf5,
0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x70, 0x03, 0x00, 0x01, 0x05,
0x01, 0xff, 0x01, 0xfd, 0x09, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xfa,
0x05, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x20, 0x08, 0x00, 0x01, 0x0f,
0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70,
0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x05, 0x00, 0x01, 0x4f,
0x01, 0xff, 0x01, 0xb0, 0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70,
0x05, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x9f,
0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0,
0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x05, 0x00, 0x01, 0x0e,
0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0x30,
0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf0, 0x08, 0x00, 0x01, 0x9f,
0x01, 0xff, 0x01, 0x40, 0x05, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xe0,
0x08, 0x00, 0x01, 0x8f, 0x01, 0xff, 0x01, 0x70, 0x05, 0x00, 0x01, 0x2f,
0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0,
0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x90, 0x08, 0x00, 0x01, 0x0f,
0x01, 0xff, 0x01, 0xf1, 0x05, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50,
0x08, 0x00, 0x01, 0x09, 0x01, 0xff, 0x01, 0xf9, 0x04, 0x00, 0x01, 0x05,
0x01, 0xff, 0x01, 0xfe, 0x09, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0x60,
0x03, 0x00, 0x01, 0x3e, 0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x7f,
0x01, 0xff, 0x01, 0xf9, 0x01, 0x20, 0x01, 0x00, 0x01, 0x07, 0x02, 0xff,
0x01, 0xb0, 0x0a, 0x00, 0x01, 0x09, 0x02, 0xff, 0x01, 0xfd, 0x01, 0xbd,
0x02, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x7f, 0x05, 0xff,
0x01, 0xb0, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xae, 0x03, 0xff, 0x01, 0xb4,
0x0f, 0x00, 0x01, 0x35, 0x01, 0x65, 0x01, 0x40, 0xff, 0x00, 0x51, 0x00,
0x02, 0x55, 0x11, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x05, 0xff,
0x01, 0xed, 0x01, 0xa7, 0x01, 0x10, 0x0b, 0x00, 0x07, 0xff, 0x01, 0xfa,
0x01, 0x10, 0x0a, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x02, 0xff,
0x01, 0x65, 0x01, 0x55, 0x01, 0x56, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe,
0x01, 0x10, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x03, 0x00, 0x01, 0x1b,
0x02, 0xff, 0x01, 0x80, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20,
0x04, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff,
0x01, 0x20, 0x04, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf6, 0x09, 0x00,
0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff, 0x01, 0xf7,
0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0d, 0x01, 0xff,
0x01, 0xf7, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00, 0x01, 0x0f,
0x01, 0xff, 0x01, 0xf6, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20, 0x04, 0x00,
0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x09, 0x00, 0x02, 0xff, 0x01, 0x20,
0x04, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xf0, 0x09, 0x00, 0x02, 0xff,
0x01, 0x20, 0x03, 0x00, 0x01, 0x1b, 0x02, 0xff, 0x01, 0x80, 0x09, 0x00,
0x02, 0xff, 0x01, 0x65, 0x02, 0x55, 0x01, 0x7a, 0x02, 0xff, 0x01, 0xfe,
0x01, 0x10, 0x09, 0x00, 0x08, 0xff, 0x01, 0xe2, 0x0a, 0x00, 0x07, 0xff,
0x01, 0xfa, 0x01, 0x10, 0x0a, 0x00, 0x05, 0xff, 0x01, 0xed, 0x01, 0xa7,
0x01, 0x10, 0x0b, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
0x01, 0x20, 0x10, 0x00, 0x02, 0xff, 0x01, 0x20, 0x10, 0x00, 0x02, 0xff,
0x01, 0x20, 0x10, 0x00, 0x02, 0xcc, 0x01, 0x10, 0xff, 0x00, 0x53, 0x00,
0x01, 0x02, 0x01, 0x99, 0x01, 0x94, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00,
0x01, 0x13, 0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x01, 0x00, 0x01, 0x5c, 0x02, 0xff, 0x01, 0xfd, 0x01, 0x70,
0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0a, 0x04, 0xff,
0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xdf, 0x02, 0xff, 0x01, 0xe1,
0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3,
0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03,
0x02, 0xff, 0x01, 0xfa, 0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff,
0x01, 0x60, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xe0, 0x04, 0x00,
0x01, 0x5f, 0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff,
0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3, 0x08, 0x00,
0x01, 0x03, 0x02, 0xff, 0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf7,
0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00, 0x01, 0x02,
0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9,
0x06, 0x00, 0x01, 0xff, 0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x08, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xff, 0x08, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xf8, 0x06, 0x00, 0x01, 0xef, 0x01, 0xfe,
0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf9, 0x06, 0x00, 0x01, 0xff,
0x01, 0xfd, 0x08, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfc, 0x05, 0x00,
0x01, 0x02, 0x01, 0xff, 0x01, 0xfb, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff,
0x05, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x03,
0x02, 0xff, 0x01, 0x60, 0x04, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xf3,
0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xd0, 0x04, 0x00, 0x01, 0x5f,
0x01, 0xff, 0x01, 0xd0, 0x08, 0x00, 0x01, 0x03, 0x02, 0xff, 0x01, 0xfa,
0x03, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x08, 0x00,
0x01, 0x03, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff, 0x01, 0xc3, 0x02, 0x00,
0x01, 0x6e, 0x01, 0xff, 0x01, 0xfc, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xec, 0x01, 0xcf, 0x02, 0xff,
0x01, 0xe2, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x01, 0x0b,
0x04, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x09, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xf7, 0x01, 0x00, 0x01, 0x6c, 0x02, 0xff, 0x01, 0xfe, 0x01, 0x70,
0x0a, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x23,
0x01, 0x54, 0x01, 0x20, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03,
0x01, 0xff, 0x01, 0xf7, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf7,
0x10, 0x00, 0x01, 0x01, 0x01, 0x66, 0x01, 0x63, 0xff, 0x00, 0x6c, 0x00,
0x01, 0x30, 0x03, 0x00, 0x01, 0x02, 0x0d, 0x00, 0x01, 0x08, 0x01, 0xa0,
0x02, 0x00, 0x01, 0x01, 0x01, 0xc6, 0x0d, 0x00, 0x01, 0xaf, 0x01, 0xa0,
0x02, 0x00, 0x01, 0x1d, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x1c, 0x01, 0xff,
0x01, 0xa0, 0x01, 0x00, 0x01, 0x02, 0x01, 0xef, 0x01, 0xf6, 0x0b, 0x00,
0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x3e,
0x01, 0xff, 0x01, 0xe2, 0x0b, 0x00, 0x01, 0x2e, 0x01, 0xff, 0x01, 0xf4,
0x01, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x0a, 0x00,
0x01, 0x04, 0x01, 0xef, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x00, 0x01, 0x6f,
0x01, 0xff, 0x01, 0xd1, 0x0b, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xd2,
0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x0b, 0x00, 0x01, 0x06,
0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x01, 0x00, 0x01, 0xaf, 0x01, 0xff,
0x01, 0xa0, 0x0b, 0x00, 0x01, 0x0c, 0x01, 0xff, 0x01, 0xd0, 0x02, 0x00,
0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf8,
0x02, 0x00, 0x01, 0xef, 0x01, 0xff, 0x01, 0x50, 0x0c, 0x00, 0x01, 0xaf,
0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x1c, 0x01, 0xff, 0x01, 0xf6,
0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb, 0x02, 0x00, 0x01, 0xbf,
0x01, 0xff, 0x01, 0x90, 0x0c, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xd1,
0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa, 0x0c, 0x00, 0x01, 0x05,
0x01, 0xff, 0x01, 0xfd, 0x01, 0x20, 0x01, 0x00, 0x01, 0x8f, 0x01, 0xff,
0x01, 0xb0, 0x0c, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00,
0x01, 0x07, 0x01, 0xff, 0x01, 0xf6, 0x0c, 0x00, 0x01, 0x02, 0x01, 0xef,
0x01, 0xa0, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xf6, 0x0d, 0x00, 0x01, 0x1d,
0x01, 0xa0, 0x02, 0x00, 0x01, 0x04, 0x01, 0xe6, 0x0d, 0x00, 0x01, 0x01,
0x01, 0x60, 0x03, 0x00, 0x01, 0x24, 0xff, 0x00, 0xff, 0x00, 0x46, 0x00,
0x01, 0x20, 0x03, 0x00, 0x01, 0x20, 0x0d, 0x00, 0x01, 0x01, 0x01, 0xe3,
0x03, 0x00, 0x01, 0x5d, 0x01, 0x10, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xff,
0x01, 0x50, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xe2, 0x0c, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xfe, 0x01, 0x30,
0x0c, 0x00, 0x01, 0xbf, 0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x2e,
0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xfa,
0x01, 0x00, 0x01, 0x01, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x60, 0x0c, 0x00,
0x01, 0x8f, 0x01, 0xff, 0x01, 0xb0, 0x01, 0x00, 0x01, 0x0b, 0x01, 0xff,
0x01, 0xf9, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10,
0x01, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xa0, 0x0c, 0x00, 0x01, 0x5f,
0x01, 0xff, 0x01, 0xd1, 0x01, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xfb,
0x0c, 0x00, 0x01, 0x05, 0x01, 0xff, 0x01, 0xf5, 0x02, 0x00, 0x01, 0x9f,
0x01, 0xff, 0x01, 0x10, 0x0b, 0x00, 0x01, 0x2d, 0x01, 0xff, 0x01, 0xf3,
0x01, 0x00, 0x01, 0x04, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10, 0x0a, 0x00,
0x01, 0x03, 0x01, 0xef, 0x01, 0xff, 0x01, 0x40, 0x01, 0x00, 0x01, 0x5f,
0x01, 0xff, 0x01, 0xd2, 0x0b, 0x00, 0x01, 0x4f, 0x01, 0xff, 0x01, 0xe3,
0x01, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xfc, 0x01, 0x10, 0x0a, 0x00,
0x01, 0x05, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x00, 0x01, 0x9f,
0x01, 0xff, 0x01, 0xb0, 0x0b, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xc1,
0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf9, 0x0b, 0x00, 0x01, 0x01,
0x01, 0xff, 0x01, 0xfa, 0x02, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0x70,
0x0b, 0x00, 0x01, 0x01, 0x01, 0xff, 0x01, 0x90, 0x02, 0x00, 0x01, 0x5f,
0x01, 0xf6, 0x0c, 0x00, 0x01, 0x01, 0x01, 0xf8, 0x03, 0x00, 0x01, 0x5f,
0x01, 0x40, 0x0c, 0x00, 0x01, 0x01, 0x01, 0x50, 0x03, 0x00, 0x01, 0x43,
0xff, 0x00, 0xff, 0x00, 0x38, 0x00, 0x01, 0xad, 0x01, 0xdd, 0x01, 0x40,
0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf,
0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50,
0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0x34,
0x01, 0x44, 0x01, 0x10, 0x49, 0x00, 0x01, 0x02, 0x01, 0x22, 0x11, 0x00,
0x01, 0x6f, 0x01, 0xff, 0x11, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x11, 0x00,
0x01, 0x7f, 0x01, 0xff, 0x01, 0x10, 0x10, 0x00, 0x01, 0x8f, 0x01, 0xff,
0x01, 0x20, 0x10, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00,
0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x10, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x40, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x50, 0x10, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x50, 0x10, 0x00,
0x01, 0x34, 0x01, 0x44, 0x01, 0x10, 0xff, 0x00, 0x69, 0x00, 0x02, 0xdd,
0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0xff,
0x11, 0x00, 0x02, 0xff, 0x11, 0x00, 0x02, 0x44, 0x37, 0x00, 0x01, 0xbc,
0x01, 0xcb, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xef,
0x01, 0xfe, 0x11, 0x00, 0x01, 0xef, 0x01, 0xfe, 0x11, 0x00, 0x01, 0xff,
0x01, 0xfd, 0x10, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xfb, 0x10, 0x00,
0x01, 0x0c, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0xaf, 0x01, 0xff,
0x01, 0xd0, 0x0f, 0x00, 0x01, 0x0a, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00,
0x01, 0xaf, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00, 0x01, 0x09, 0x02, 0xff,
0x01, 0x40, 0x0f, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0xf4, 0x0f, 0x00,
0x01, 0x03, 0x02, 0xff, 0x01, 0x40, 0x0f, 0x00, 0x01, 0x0a, 0x01, 0xff,
0x01, 0xf8, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
0x01, 0x1f, 0x01, 0xff, 0x01, 0xf0, 0x10, 0x00, 0x01, 0x0f, 0x01, 0xff,
0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf8, 0x04, 0x00,
0x01, 0x05, 0x01, 0xd0, 0x0a, 0x00, 0x01, 0x08, 0x02, 0xff, 0x01, 0x70,
0x02, 0x00, 0x01, 0x05, 0x01, 0xcf, 0x01, 0xf0, 0x0a, 0x00, 0x01, 0x01,
0x01, 0xef, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x98, 0x01, 0x8b, 0x02, 0xff,
0x01, 0xf0, 0x0b, 0x00, 0x01, 0x3f, 0x06, 0xff, 0x01, 0xc0, 0x0b, 0x00,
0x01, 0x02, 0x01, 0xcf, 0x04, 0xff, 0x01, 0xc5, 0x0d, 0x00, 0x01, 0x03,
0x01, 0x8b, 0x01, 0xcc, 0x01, 0xb9, 0x01, 0x62, 0xe2, 0x00, 0x01, 0x01,
0x01, 0x32, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05,
0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05,
0x01, 0xfc, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x11, 0x00, 0x01, 0x39,
0x01, 0xfd, 0x01, 0x42, 0x0e, 0x00, 0x01, 0x05, 0x01, 0xbf, 0x03, 0xff,
0x01, 0xfb, 0x01, 0x50, 0x0b, 0x00, 0x01, 0x03, 0x01, 0xcf, 0x05, 0xff,
0x01, 0xf6, 0x0b, 0x00, 0x01, 0x4f, 0x02, 0xff, 0x02, 0xfe, 0x01, 0xce,
0x01, 0xff, 0x01, 0xf6, 0x0a, 0x00, 0x01, 0x02, 0x02, 0xff, 0x01, 0xe6,
0x01, 0x05, 0x01, 0xfc, 0x01, 0x00, 0x01, 0x38, 0x01, 0xe6, 0x0a, 0x00,
0x01, 0x0c, 0x01, 0xff, 0x01, 0xfd, 0x01, 0x10, 0x01, 0x05, 0x01, 0xfc,
0x02, 0x00, 0x01, 0x02, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xe1,
0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x60, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0d, 0x00, 0x02, 0xff,
0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x04, 0x01, 0xff,
0x01, 0xfb, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00, 0x01, 0x06,
0x01, 0xff, 0x01, 0xf8, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfc, 0x0c, 0x00,
0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb,
0x0c, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf6, 0x02, 0x00, 0x01, 0x05,
0x01, 0xfc, 0x0c, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf7, 0x02, 0x00,
0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x06, 0x01, 0xff, 0x01, 0xf9,
0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xfc, 0x02, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x02, 0xff,
0x01, 0x10, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00, 0x01, 0xaf,
0x01, 0xff, 0x01, 0x80, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x0d, 0x00,
0x01, 0x4f, 0x01, 0xff, 0x01, 0xf3, 0x01, 0x00, 0x01, 0x05, 0x01, 0xfb,
0x0d, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x30, 0x01, 0x05,
0x01, 0xfb, 0x02, 0x00, 0x01, 0x33, 0x0a, 0x00, 0x01, 0x01, 0x01, 0xef,
0x01, 0xff, 0x01, 0xf9, 0x01, 0x35, 0x01, 0xfb, 0x01, 0x02, 0x01, 0x6c,
0x01, 0xf6, 0x0b, 0x00, 0x01, 0x2d, 0x06, 0xff, 0x01, 0xf6, 0x0b, 0x00,
0x01, 0x01, 0x01, 0x9f, 0x05, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x02,
0x01, 0x8d, 0x03, 0xff, 0x01, 0xc7, 0x01, 0x20, 0x0e, 0x00, 0x01, 0x06,
0x01, 0xfc, 0x01, 0x20, 0x10, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00,
0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0x11, 0x00,
0x01, 0x05, 0x01, 0xfb, 0x11, 0x00, 0x01, 0x05, 0x01, 0xfb, 0xf5, 0x00,
0x01, 0x6b, 0x01, 0xdf, 0x01, 0xfd, 0x01, 0xc9, 0x01, 0x40, 0x0d, 0x00,
0x01, 0x6e, 0x05, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0x07, 0x06, 0xff,
0x01, 0x30, 0x0b, 0x00, 0x01, 0x3f, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x85,
0x01, 0x34, 0x01, 0x7b, 0x01, 0xff, 0x01, 0x30, 0x0b, 0x00, 0x01, 0xaf,
0x01, 0xff, 0x01, 0xc1, 0x03, 0x00, 0x01, 0x18, 0x01, 0x30, 0x0a, 0x00,
0x01, 0x01, 0x02, 0xff, 0x01, 0x30, 0x0f, 0x00, 0x01, 0x04, 0x01, 0xff,
0x01, 0xfd, 0x10, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xfa, 0x10, 0x00,
0x01, 0x08, 0x01, 0xff, 0x01, 0xf8, 0x10, 0x00, 0x01, 0x09, 0x01, 0xff,
0x01, 0xf7, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x0e, 0x00, 0x01, 0x0a, 0x07, 0xff,
0x01, 0xf4, 0x0a, 0x00, 0x01, 0x0a, 0x07, 0xff, 0x01, 0xf4, 0x0a, 0x00,
0x01, 0x08, 0x01, 0xdd, 0x01, 0xdf, 0x01, 0xff, 0x01, 0xfe, 0x03, 0xdd,
0x01, 0xd4, 0x0c, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00,
0x01, 0x0a, 0x01, 0xff, 0x01, 0xf6, 0x10, 0x00, 0x01, 0x0a, 0x01, 0xff,
0x01, 0xf6, 0x0e, 0x00, 0x01, 0x4b, 0x01, 0xbb, 0x01, 0xbe, 0x01, 0xff,
0x01, 0xfd, 0x05, 0xbb, 0x01, 0x70, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff,
0x01, 0xa0, 0x08, 0x00, 0x01, 0x6f, 0x09, 0xff, 0x01, 0xa0, 0x08, 0x00,
0x01, 0x4a, 0x09, 0xaa, 0x01, 0x60, 0xff, 0x00, 0xd2, 0x00, 0x01, 0x30,
0x07, 0x00, 0x01, 0x01, 0x01, 0x40, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xf5,
0x07, 0x00, 0x01, 0x1d, 0x01, 0xf4, 0x08, 0x00, 0x01, 0xbf, 0x01, 0xff,
0x01, 0x40, 0x05, 0x00, 0x01, 0x01, 0x01, 0xdf, 0x01, 0xff, 0x01, 0x30,
0x07, 0x00, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4, 0x01, 0x00, 0x01, 0x6b,
0x01, 0xdd, 0x01, 0xc8, 0x01, 0x20, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa,
0x08, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x8e, 0x03, 0xff, 0x01, 0xfa,
0x01, 0xdf, 0x01, 0xff, 0x01, 0xa0, 0x09, 0x00, 0x01, 0x5f, 0x07, 0xff,
0x01, 0xfa, 0x0a, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0xe9, 0x01, 0x55,
0x01, 0x7c, 0x02, 0xff, 0x01, 0xa0, 0x0a, 0x00, 0x01, 0x03, 0x01, 0xff,
0x01, 0xfb, 0x01, 0x10, 0x02, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0xa0,
0x0a, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07,
0x01, 0xff, 0x01, 0xf2, 0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0x30,
0x04, 0x00, 0x01, 0xdf, 0x01, 0xf7, 0x0a, 0x00, 0x01, 0x4f, 0x01, 0xfd,
0x05, 0x00, 0x01, 0x8f, 0x01, 0xfa, 0x0a, 0x00, 0x01, 0x6f, 0x01, 0xfc,
0x05, 0x00, 0x01, 0x6f, 0x01, 0xfc, 0x0a, 0x00, 0x01, 0x5f, 0x01, 0xfc,
0x05, 0x00, 0x01, 0x7f, 0x01, 0xfb, 0x0a, 0x00, 0x01, 0x3f, 0x01, 0xff,
0x01, 0x10, 0x04, 0x00, 0x01, 0xbf, 0x01, 0xf8, 0x0a, 0x00, 0x01, 0x0e,
0x01, 0xff, 0x01, 0x80, 0x03, 0x00, 0x01, 0x03, 0x01, 0xff, 0x01, 0xf3,
0x0a, 0x00, 0x01, 0x07, 0x01, 0xff, 0x01, 0xf5, 0x03, 0x00, 0x01, 0x1d,
0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01, 0x02, 0xff, 0x01, 0x92,
0x01, 0x00, 0x01, 0x16, 0x01, 0xef, 0x01, 0xff, 0x01, 0x60, 0x0a, 0x00,
0x01, 0x1d, 0x03, 0xff, 0x01, 0xfe, 0x03, 0xff, 0x01, 0xf4, 0x09, 0x00,
0x01, 0x01, 0x01, 0xdf, 0x05, 0xff, 0x01, 0xfe, 0x02, 0xff, 0x01, 0x40,
0x08, 0x00, 0x01, 0x1d, 0x01, 0xff, 0x01, 0xfa, 0x01, 0x06, 0x01, 0xdf,
0x01, 0xff, 0x01, 0xfe, 0x01, 0x81, 0x01, 0x5f, 0x01, 0xff, 0x01, 0xf4,
0x08, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0xa0, 0x01, 0x00, 0x01, 0x01,
0x01, 0x44, 0x01, 0x20, 0x01, 0x00, 0x01, 0x05, 0x02, 0xff, 0x01, 0x20,
0x07, 0x00, 0x01, 0x4f, 0x01, 0xfa, 0x07, 0x00, 0x01, 0x4f, 0x01, 0xf8,
0x08, 0x00, 0x01, 0x05, 0x01, 0xa0, 0x07, 0x00, 0x01, 0x05, 0x01, 0x80,
0xff, 0x00, 0x84, 0x00, 0x01, 0x01, 0x01, 0x88, 0x01, 0x85, 0x07, 0x00,
0x01, 0x38, 0x01, 0x88, 0x01, 0x40, 0x07, 0x00, 0x01, 0xcf, 0x01, 0xff,
0x01, 0x10, 0x06, 0x00, 0x01, 0xcf, 0x01, 0xff, 0x01, 0x10, 0x07, 0x00,
0x01, 0x3f, 0x01, 0xff, 0x01, 0x90, 0x05, 0x00, 0x01, 0x05, 0x01, 0xff,
0x01, 0xf8, 0x08, 0x00, 0x01, 0x0b, 0x01, 0xff, 0x01, 0xf2, 0x05, 0x00,
0x01, 0x0d, 0x01, 0xff, 0x01, 0xe0, 0x08, 0x00, 0x01, 0x02, 0x01, 0xff,
0x01, 0xfa, 0x05, 0x00, 0x01, 0x6f, 0x01, 0xff, 0x01, 0x60, 0x09, 0x00,
0x01, 0xaf, 0x01, 0xff, 0x01, 0x30, 0x04, 0x00, 0x01, 0xef, 0x01, 0xfd,
0x0a, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x03, 0x00, 0x01, 0x07,
0x01, 0xff, 0x01, 0xf5, 0x0a, 0x00, 0x01, 0x08, 0x01, 0xff, 0x01, 0xf4,
0x03, 0x00, 0x01, 0x1f, 0x01, 0xff, 0x01, 0xc0, 0x0a, 0x00, 0x01, 0x01,
0x01, 0xef, 0x01, 0xfd, 0x03, 0x00, 0x01, 0x9f, 0x01, 0xff, 0x01, 0x40,
0x0b, 0x00, 0x01, 0x7f, 0x01, 0xff, 0x01, 0x50, 0x01, 0x00, 0x01, 0x02,
0x01, 0xff, 0x01, 0xfb, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xe0,
0x01, 0x00, 0x01, 0x0a, 0x01, 0xff, 0x01, 0xf3, 0x0c, 0x00, 0x01, 0x06,
0x01, 0xff, 0x01, 0xf7, 0x01, 0x00, 0x01, 0x2f, 0x01, 0xff, 0x01, 0xa0,
0x0a, 0x00, 0x01, 0x2a, 0x02, 0xaa, 0x01, 0xff, 0x01, 0xfe, 0x01, 0x10,
0x01, 0xbf, 0x01, 0xff, 0x01, 0xca, 0x01, 0xaa, 0x01, 0xa5, 0x08, 0x00,
0x01, 0x4f, 0x04, 0xff, 0x01, 0x83, 0x04, 0xff, 0x01, 0xf8, 0x08, 0x00,
0x01, 0x3c, 0x02, 0xcc, 0x01, 0xce, 0x01, 0xff, 0x01, 0xfd, 0x01, 0xff,
0x01, 0xfc, 0x02, 0xcc, 0x01, 0xc6, 0x0b, 0x00, 0x01, 0x03, 0x03, 0xff,
0x01, 0x70, 0x0f, 0x00, 0x01, 0xaf, 0x01, 0xff, 0x01, 0xfe, 0x10, 0x00,
0x01, 0x2f, 0x01, 0xff, 0x01, 0xf5, 0x0c, 0x00, 0x01, 0x01, 0x03, 0x11,
0x01, 0x1e, 0x01, 0xff, 0x01, 0xf3, 0x03, 0x11, 0x01, 0x10, 0x08, 0x00,
0x01, 0x4f, 0x09, 0xff, 0x01, 0xf8, 0x08, 0x00, 0x01, 0x4f, 0x09, 0xff,
0x01, 0xf8, 0x08, 0x00, 0x01, 0x27, 0x03, 0x77, 0x01, 0x7e, 0x01, 0xff,
0x01, 0xf8, 0x03, 0x77, 0x01, 0x73, 0x0c, 0x00, 0x01, 0x0e, 0x01, 0xff,
0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff,
0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff,
0x01, 0xf2, 0x10, 0x00, 0x01, 0x0e, 0x01, 0xff, 0x01, 0xf2, 0x10, 0x00,
0x01, 0x08, 0x01, 0x99, 0x01, 0x91, 0xc9, 0x00
};

@ -0,0 +1,89 @@
#!/usr/bin/python
# Written By Marcio Teixeira 2018 - Aleph Objects, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# To view a copy of the GNU General Public License, go to the following
# location: <http://www.gnu.org/licenses/>.
from __future__ import print_function
from PIL import Image
import argparse
import textwrap
def pack_rle(data):
"""Use run-length encoding to pack the bytes"""
rle = []
value = data[0]
count = 0
for i in data:
if i != value or count == 255:
rle.append(count)
rle.append(value)
value = i
count = 1
else:
count += 1
rle.append(count)
rle.append(value)
return rle
class WriteSource:
def __init__(self):
self.values = []
def add_pixel(self, value):
self.values.append(value)
def convert_to_4bpp(self, data):
# Invert the image
data = map(lambda i: 255 - i, data)
# Quanitize 8-bit values into 4-bits
data = map(lambda i: i >> 4, data)
# Make sure there is an even number of elements
if (len(data) & 1) == 1:
result.append(0)
# Combine each two adjacent values into one
i = iter(data)
data = map(lambda a, b: a << 4 | b, i ,i)
# Pack the data
data = pack_rle(data)
# Convert values into hex strings
return map(lambda a: "0x" + format(a, '02x'), data)
def end_row(self):
# Pad each row into even number of values
if len(self.values) & 1:
self.values.append(0)
def write(self):
data = self.convert_to_4bpp(self.values)
data = ', '.join(data)
data = textwrap.fill(data, 75, initial_indent = ' ', subsequent_indent = ' ')
print("const unsigned char font[] PROGMEM = {")
print(data);
print("};")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Converts a grayscale bitmap into a 16-level RLE packed C array for use as font data')
parser.add_argument("input")
args = parser.parse_args()
img = Image.open(args.input).convert('L')
writer = WriteSource()
for y in range(img.height):
for x in range(img.width):
writer.add_pixel(img.getpixel((x,y)))
writer.end_row()
writer.write()

@ -62,6 +62,7 @@ void BootScreen::onIdle() {
PUSH_SCREEN(StatusScreen);
} else {
if (!UIFlashStorage::is_valid()) {
StatusScreen::loadBitmaps();
SpinnerDialogBox::show(F("Please wait..."));
UIFlashStorage::format_flash();
SpinnerDialogBox::hide();
@ -73,12 +74,16 @@ void BootScreen::onIdle() {
if (!MediaPlayerScreen::playBootMedia())
showSplashScreen();
}
StatusScreen::loadBitmaps();
#ifdef LULZBOT_USE_BIOPRINTER_UI
GOTO_SCREEN(BioConfirmHomeXYZ);
current_screen.forget();
PUSH_SCREEN(StatusScreen);
PUSH_SCREEN(BioConfirmHomeE);
#else
StatusScreen::setStatusMessage(F(WELCOME_MSG));
GOTO_SCREEN(StatusScreen);
#endif
}

@ -161,7 +161,7 @@ void MediaPlayerScreen::playStream(void *obj, media_streamer_func_t *data_stream
// everything that is stored in RAMG.
cmd.cmd(CMD_DLSTART).execute();
DLCache::init();
StatusScreen::onStartup();
StatusScreen::loadBitmaps();
}
#endif // FTDI_API_LEVEL >= 810
}

@ -193,8 +193,13 @@ void StatusScreen::draw_temperature(draw_mode_t what) {
int8_t(getActualFan_percent(FAN0))
);
const char *idle = PSTR("%-3d C / idle");
const char *not_idle = PSTR("%-3d / %-3d C");
#if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
const char *idle = PSTR(u8"%3d°C / idle");
const char *not_idle = PSTR(u8"%3d / %3d°C");
#else
const char *idle = PSTR("%3d C / idle");
const char *not_idle = PSTR("%3d / %3d C");
#endif
sprintf_P(
bed_str,
@ -353,10 +358,14 @@ void StatusScreen::setStatusMessage(const char* message) {
.cmd(CLEAR(true,true,true));
draw_temperature(BACKGROUND);
#ifdef TOUCH_UI_USE_UTF8
load_utf8_bitmaps(cmd);
#endif
draw_progress(BACKGROUND);
draw_axis_position(BACKGROUND);
draw_status_message(BACKGROUND, message);
draw_interaction_buttons(BACKGROUND);
storeBackground();
#ifdef UI_FRAMEWORK_DEBUG
@ -369,9 +378,8 @@ void StatusScreen::setStatusMessage(const char* message) {
}
}
void StatusScreen::onStartup() {
void StatusScreen::loadBitmaps() {
// Load the bitmaps for the status screen
using namespace Theme;
constexpr uint32_t base = ftdi_memory_map::RAM_G;
CLCD::mem_write_pgm(base + TD_Icon_Info.RAMG_offset, TD_Icon, sizeof(TD_Icon));
@ -379,8 +387,13 @@ void StatusScreen::onStartup() {
CLCD::mem_write_pgm(base + Bed_Heat_Icon_Info.RAMG_offset, Bed_Heat_Icon, sizeof(Bed_Heat_Icon));
CLCD::mem_write_pgm(base + Fan_Icon_Info.RAMG_offset, Fan_Icon, sizeof(Fan_Icon));
setStatusMessage(F(WELCOME_MSG));
// Load fonts for internationalization
#ifdef TOUCH_UI_USE_UTF8
load_utf8_data(base + UTF8_FONT_OFFSET);
#endif
}
void StatusScreen::onStartup() {
UIFlashStorage::initialize();
}

@ -32,7 +32,14 @@ using namespace ExtUI;
void TemperatureScreen::onRedraw(draw_mode_t what) {
widgets_t w(what);
w.precision(0).color(temp).units(PSTR("C"));
w.precision(0).color(temp).units(
PSTR(
#if defined(TOUCH_UI_USE_UTF8) && defined(TOUCH_UI_UTF8_WESTERN_CHARSET)
u8"°C"
#else
"C"
#endif
));
w.heading( PSTR("Temperature:"));
w.button(30, PSTR("Cooldown (All Off)"));
#ifndef LULZBOT_DISABLE_TOOLHEAD_HEATER

@ -178,4 +178,6 @@ namespace Theme {
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00
};
constexpr PROGMEM uint32_t UTF8_FONT_OFFSET = 10000;
}; // namespace Theme

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1209,6 +1209,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1208,6 +1208,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1209,6 +1209,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1213,6 +1213,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1204,6 +1204,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1209,6 +1209,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1209,6 +1209,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1210,6 +1210,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1210,6 +1210,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1206,6 +1206,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1201,6 +1201,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

@ -1205,6 +1205,12 @@
//#define TOUCH_UI_PORTRAIT
//#define TOUCH_UI_MIRRORED
// Enable UTF8 rendering capabilities.
//#define TOUCH_UI_USE_UTF8
#if ENABLED(TOUCH_UI_USE_UTF8)
#define TOUCH_UI_UTF8_WESTERN_CHARSET
#endif
// Use a numeric passcode for "Screen lock" keypad.
// (recommended for smaller displays)
//#define TOUCH_UI_PASSCODE

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save