Merge pull request #1 from Bodmer/master

pr
This commit is contained in:
kostuch 2019-11-01 00:12:37 +01:00 committed by GitHub
commit c5972a52a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
203 changed files with 22097 additions and 4823 deletions

76
Extensions/Button.cpp Normal file
View File

@ -0,0 +1,76 @@
/***************************************************************************************
** Code for the GFX button UI element
** Grabbed from Adafruit_GFX library and enhanced to handle any label font
***************************************************************************************/
TFT_eSPI_Button::TFT_eSPI_Button(void) {
_gfx = 0;
}
// Classic initButton() function: pass center & size
void TFT_eSPI_Button::initButton(
TFT_eSPI *gfx, int16_t x, int16_t y, uint16_t w, uint16_t h,
uint16_t outline, uint16_t fill, uint16_t textcolor,
char *label, uint8_t textsize)
{
// Tweak arguments and pass to the newer initButtonUL() function...
initButtonUL(gfx, x - (w / 2), y - (h / 2), w, h, outline, fill,
textcolor, label, textsize);
}
// Newer function instead accepts upper-left corner & size
void TFT_eSPI_Button::initButtonUL(
TFT_eSPI *gfx, int16_t x1, int16_t y1, uint16_t w, uint16_t h,
uint16_t outline, uint16_t fill, uint16_t textcolor,
char *label, uint8_t textsize)
{
_x1 = x1;
_y1 = y1;
_w = w;
_h = h;
_outlinecolor = outline;
_fillcolor = fill;
_textcolor = textcolor;
_textsize = textsize;
_gfx = gfx;
strncpy(_label, label, 9);
}
void TFT_eSPI_Button::drawButton(boolean inverted) {
uint16_t fill, outline, text;
if(!inverted) {
fill = _fillcolor;
outline = _outlinecolor;
text = _textcolor;
} else {
fill = _textcolor;
outline = _outlinecolor;
text = _fillcolor;
}
uint8_t r = min(_w, _h) / 4; // Corner radius
_gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill);
_gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline);
_gfx->setTextColor(text);
_gfx->setTextSize(_textsize);
uint8_t tempdatum = _gfx->getTextDatum();
_gfx->setTextDatum(MC_DATUM);
_gfx->drawString(_label, _x1 + (_w/2), _y1 + (_h/2));
_gfx->setTextDatum(tempdatum);
}
boolean TFT_eSPI_Button::contains(int16_t x, int16_t y) {
return ((x >= _x1) && (x < (_x1 + _w)) &&
(y >= _y1) && (y < (_y1 + _h)));
}
void TFT_eSPI_Button::press(boolean p) {
laststate = currstate;
currstate = p;
}
boolean TFT_eSPI_Button::isPressed() { return currstate; }
boolean TFT_eSPI_Button::justPressed() { return (currstate && !laststate); }
boolean TFT_eSPI_Button::justReleased() { return (!currstate && laststate); }

38
Extensions/Button.h Normal file
View File

@ -0,0 +1,38 @@
/***************************************************************************************
// The following button class has been ported over from the Adafruit_GFX library so
// should be compatible.
// A slightly different implementation in this TFT_eSPI library allows the button
// legends to be in any font
***************************************************************************************/
class TFT_eSPI_Button {
public:
TFT_eSPI_Button(void);
// "Classic" initButton() uses center & size
void initButton(TFT_eSPI *gfx, int16_t x, int16_t y,
uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);
// New/alt initButton() uses upper-left corner & size
void initButtonUL(TFT_eSPI *gfx, int16_t x1, int16_t y1,
uint16_t w, uint16_t h, uint16_t outline, uint16_t fill,
uint16_t textcolor, char *label, uint8_t textsize);
void drawButton(boolean inverted = false);
boolean contains(int16_t x, int16_t y);
void press(boolean p);
boolean isPressed();
boolean justPressed();
boolean justReleased();
private:
TFT_eSPI *_gfx;
int16_t _x1, _y1; // Coordinates of top-left corner
uint16_t _w, _h;
uint8_t _textsize;
uint16_t _outlinecolor, _fillcolor, _textcolor;
char _label[10];
boolean currstate, laststate;
};

586
Extensions/Smooth_font.cpp Normal file
View File

@ -0,0 +1,586 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with anti-aliased font functions
////////////////////////////////////////////////////////////////////////////////////////
// New anti-aliased (smoothed) font functions added below
////////////////////////////////////////////////////////////////////////////////////////
/***************************************************************************************
** Function name: loadFont
** Description: loads parameters from a new font vlw file
*************************************************************************************x*/
void TFT_eSPI::loadFont(String fontName, fs::FS &ffs)
{
fontFS = ffs;
loadFont(fontName, false);
}
/***************************************************************************************
** Function name: loadFont
** Description: loads parameters from a new font vlw file
*************************************************************************************x*/
void TFT_eSPI::loadFont(String fontName, bool flash)
{
/*
The vlw font format does not appear to be documented anywhere, so some reverse
engineering has been applied!
Header of vlw file comprises 6 uint32_t parameters (24 bytes total):
1. The gCount (number of character glyphs)
2. A version number (0xB = 11 for the one I am using)
3. The font size (in points, not pixels)
4. Deprecated mboxY parameter (typically set to 0)
5. Ascent in pixels from baseline to top of "d"
6. Descent in pixels from baseline to bottom of "p"
Next are gCount sets of values for each glyph, each set comprises 7 int32t parameters (28 bytes):
1. Glyph Unicode stored as a 32 bit value
2. Height of bitmap bounding box
3. Width of bitmap bounding box
4. gxAdvance for cursor (setWidth in Processing)
5. dY = distance from cursor baseline to top of glyph bitmap (signed value +ve = up)
6. dX = distance from cursor to left side of glyph bitmap (signed value -ve = left)
7. padding value, typically 0
The bitmaps start next at 24 + (28 * gCount) bytes from the start of the file.
Each pixel is 1 byte, an 8 bit Alpha value which represents the transparency from
0xFF foreground colour, 0x00 background. The sketch uses a linear interpolation
between the foreground and background RGB component colours. e.g.
pixelRed = ((fgRed * alpha) + (bgRed * (255 - alpha))/255
To gain a performance advantage fixed point arithmetic is used with rounding and
division by 256 (shift right 8 bits is faster).
After the bitmaps is:
1 byte for font name string length (excludes null)
a zero terminated character string giving the font name
1 byte for Postscript name string length
a zero/one terminated character string giving the font name
last byte is 0 for non-anti-aliased and 1 for anti-aliased (smoothed)
Then the font name seen by Java when it's created
Then the postscript name of the font
Then a boolean to tell if smoothing is on or not.
Glyph bitmap example is:
// Cursor coordinate positions for this and next character are marked by 'C'
// C<------- gxAdvance ------->C gxAdvance is how far to move cursor for next glyph cursor position
// | |
// | | ascent is top of "d", descent is bottom of "p"
// +-- gdX --+ ascent
// | +-- gWidth--+ | gdX is offset to left edge of glyph bitmap
// | + x@.........@x + | gdX may be negative e.g. italic "y" tail extending to left of
// | | @@.........@@ | | cursor position, plot top left corner of bitmap at (cursorX + gdX)
// | | @@.........@@ gdY | gWidth and gHeight are glyph bitmap dimensions
// | | .@@@.....@@@@ | |
// | gHeight ....@@@@@..@@ + + <-- baseline
// | | ...........@@ |
// | | ...........@@ | gdY is the offset to the top edge of the bitmap
// | | .@@.......@@. descent plot top edge of bitmap at (cursorY + yAdvance - gdY)
// | + x..@@@@@@@..x | x marks the corner pixels of the bitmap
// | |
// +---------------------------+ yAdvance is y delta for the next line, font size or (ascent + descent)
// some fonts can overlay in y direction so may need a user adjust value
*/
spiffs = flash;
if(spiffs) fontFS = SPIFFS;
unloadFont();
// Avoid a crash on the ESP32 if the file does not exist
if (fontFS.exists("/" + fontName + ".vlw") == false) {
Serial.println("Font file " + fontName + " not found!");
return;
}
fontFile = fontFS.open( "/" + fontName + ".vlw", "r");
if(!fontFile) return;
fontFile.seek(0, fs::SeekSet);
gFont.gCount = (uint16_t)readInt32(); // glyph count in file
readInt32(); // vlw encoder version - discard
gFont.yAdvance = (uint16_t)readInt32(); // Font size in points, not pixels
readInt32(); // discard
gFont.ascent = (uint16_t)readInt32(); // top of "d"
gFont.descent = (uint16_t)readInt32(); // bottom of "p"
// These next gFont values might be updated when the Metrics are fetched
gFont.maxAscent = gFont.ascent; // Determined from metrics
gFont.maxDescent = gFont.descent; // Determined from metrics
gFont.yAdvance = gFont.ascent + gFont.descent;
gFont.spaceWidth = gFont.yAdvance / 4; // Guess at space width
fontLoaded = true;
// Fetch the metrics for each glyph
loadMetrics(gFont.gCount);
//fontFile.close();
}
/***************************************************************************************
** Function name: loadMetrics
** Description: Get the metrics for each glyph and store in RAM
*************************************************************************************x*/
//#define SHOW_ASCENT_DESCENT
void TFT_eSPI::loadMetrics(uint16_t gCount)
{
uint32_t headerPtr = 24;
uint32_t bitmapPtr = 24 + gCount * 28;
#if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT)
if ( psramFound() )
{
gUnicode = (uint16_t*)ps_malloc( gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF)
gHeight = (uint8_t*)ps_malloc( gCount ); // Height of glyph
gWidth = (uint8_t*)ps_malloc( gCount ); // Width of glyph
gxAdvance = (uint8_t*)ps_malloc( gCount ); // xAdvance - to move x cursor
gdY = (int16_t*)ps_malloc( gCount * 2); // offset from bitmap top edge from lowest point in any character
gdX = (int8_t*)ps_malloc( gCount ); // offset for bitmap left edge relative to cursor X
gBitmap = (uint32_t*)ps_malloc( gCount * 4); // seek pointer to glyph bitmap in the file
}
else
#endif
{
gUnicode = (uint16_t*)malloc( gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF)
gHeight = (uint8_t*)malloc( gCount ); // Height of glyph
gWidth = (uint8_t*)malloc( gCount ); // Width of glyph
gxAdvance = (uint8_t*)malloc( gCount ); // xAdvance - to move x cursor
gdY = (int16_t*)malloc( gCount * 2); // offset from bitmap top edge from lowest point in any character
gdX = (int8_t*)malloc( gCount ); // offset for bitmap left edge relative to cursor X
gBitmap = (uint32_t*)malloc( gCount * 4); // seek pointer to glyph bitmap in the file
}
#ifdef SHOW_ASCENT_DESCENT
Serial.print("ascent = "); Serial.println(gFont.ascent);
Serial.print("descent = "); Serial.println(gFont.descent);
#endif
uint16_t gNum = 0;
fontFile.seek(headerPtr, fs::SeekSet);
while (gNum < gCount)
{
gUnicode[gNum] = (uint16_t)readInt32(); // Unicode code point value
gHeight[gNum] = (uint8_t)readInt32(); // Height of glyph
gWidth[gNum] = (uint8_t)readInt32(); // Width of glyph
gxAdvance[gNum] = (uint8_t)readInt32(); // xAdvance - to move x cursor
gdY[gNum] = (int16_t)readInt32(); // y delta from baseline
gdX[gNum] = (int8_t)readInt32(); // x delta from cursor
readInt32(); // ignored
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gHeight = "); Serial.println(gHeight[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gWidth = "); Serial.println(gWidth[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gxAdvance = "); Serial.println(gxAdvance[gNum]);
//Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", gdY = "); Serial.println(gdY[gNum]);
// Different glyph sets have different ascent values not always based on "d", so we could get
// the maximum glyph ascent by checking all characters. BUT this method can generate bad values
// for non-existant glyphs, so we will reply on processing for the value and disable this code for now...
/*
if (gdY[gNum] > gFont.maxAscent)
{
// Try to avoid UTF coding values and characters that tend to give duff values
if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0x7F)) || (gUnicode[gNum] > 0xA0))
{
gFont.maxAscent = gdY[gNum];
#ifdef SHOW_ASCENT_DESCENT
Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxAscent = "); Serial.println(gFont.maxAscent);
#endif
}
}
*/
// Different glyph sets have different descent values not always based on "p", so get maximum glyph descent
if (((int16_t)gHeight[gNum] - (int16_t)gdY[gNum]) > gFont.maxDescent)
{
// Avoid UTF coding values and characters that tend to give duff values
if (((gUnicode[gNum] > 0x20) && (gUnicode[gNum] < 0xA0) && (gUnicode[gNum] != 0x7F)) || (gUnicode[gNum] > 0xFF))
{
gFont.maxDescent = gHeight[gNum] - gdY[gNum];
#ifdef SHOW_ASCENT_DESCENT
Serial.print("Unicode = 0x"); Serial.print(gUnicode[gNum], HEX); Serial.print(", maxDescent = "); Serial.println(gHeight[gNum] - gdY[gNum]);
#endif
}
}
gBitmap[gNum] = bitmapPtr;
headerPtr += 28;
bitmapPtr += gWidth[gNum] * gHeight[gNum];
gNum++;
yield();
}
gFont.yAdvance = gFont.maxAscent + gFont.maxDescent;
gFont.spaceWidth = (gFont.ascent + gFont.descent) * 2/7; // Guess at space width
}
/***************************************************************************************
** Function name: deleteMetrics
** Description: Delete the old glyph metrics and free up the memory
*************************************************************************************x*/
void TFT_eSPI::unloadFont( void )
{
if (gUnicode)
{
free(gUnicode);
gUnicode = NULL;
}
if (gHeight)
{
free(gHeight);
gHeight = NULL;
}
if (gWidth)
{
free(gWidth);
gWidth = NULL;
}
if (gxAdvance)
{
free(gxAdvance);
gxAdvance = NULL;
}
if (gdY)
{
free(gdY);
gdY = NULL;
}
if (gdX)
{
free(gdX);
gdX = NULL;
}
if (gBitmap)
{
free(gBitmap);
gBitmap = NULL;
}
if(fontFile) fontFile.close();
fontLoaded = false;
}
/***************************************************************************************
** Function name: decodeUTF8
** Description: Line buffer UTF-8 decoder with fall-back to extended ASCII
*************************************************************************************x*/
/* Function moved to TFT_eSPI.cpp
#define DECODE_UTF8
uint16_t TFT_eSPI::decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining)
{
byte c = buf[(*index)++];
//Serial.print("Byte from string = 0x"); Serial.println(c, HEX);
#ifdef DECODE_UTF8
// 7 bit Unicode
if ((c & 0x80) == 0x00) return c;
// 11 bit Unicode
if (((c & 0xE0) == 0xC0) && (remaining > 1))
return ((c & 0x1F)<<6) | (buf[(*index)++]&0x3F);
// 16 bit Unicode
if (((c & 0xF0) == 0xE0) && (remaining > 2))
{
c = ((c & 0x0F)<<12) | ((buf[(*index)++]&0x3F)<<6);
return c | ((buf[(*index)++]&0x3F));
}
// 21 bit Unicode not supported so fall-back to extended ASCII
// if ((c & 0xF8) == 0xF0) return c;
#endif
return c; // fall-back to extended ASCII
}
*/
/***************************************************************************************
** Function name: decodeUTF8
** Description: Serial UTF-8 decoder with fall-back to extended ASCII
*************************************************************************************x*/
/* Function moved to TFT_eSPI.cpp
uint16_t TFT_eSPI::decodeUTF8(uint8_t c)
{
#ifdef DECODE_UTF8
// 7 bit Unicode
if ((c & 0x80) == 0x00) {
decoderState = 0;
return (uint16_t)c;
}
if (decoderState == 0)
{
// 11 bit Unicode
if ((c & 0xE0) == 0xC0)
{
decoderBuffer = ((c & 0x1F)<<6);
decoderState = 1;
return 0;
}
// 16 bit Unicode
if ((c & 0xF0) == 0xE0)
{
decoderBuffer = ((c & 0x0F)<<12);
decoderState = 2;
return 0;
}
// 21 bit Unicode not supported so fall-back to extended ASCII
if ((c & 0xF8) == 0xF0) return (uint16_t)c;
}
else
{
if (decoderState == 2)
{
decoderBuffer |= ((c & 0x3F)<<6);
decoderState--;
return 0;
}
else
{
decoderBuffer |= (c & 0x3F);
decoderState = 0;
return decoderBuffer;
}
}
#endif
decoderState = 0;
return (uint16_t)c; // fall-back to extended ASCII
}
*/
/***************************************************************************************
** Function name: alphaBlend
** Description: Blend foreground and background and return new colour
*************************************************************************************x*/
uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc)
{
// For speed use fixed point maths and rounding to permit a power of 2 division
uint16_t fgR = ((fgc >> 10) & 0x3E) + 1;
uint16_t fgG = ((fgc >> 4) & 0x7E) + 1;
uint16_t fgB = ((fgc << 1) & 0x3E) + 1;
uint16_t bgR = ((bgc >> 10) & 0x3E) + 1;
uint16_t bgG = ((bgc >> 4) & 0x7E) + 1;
uint16_t bgB = ((bgc << 1) & 0x3E) + 1;
// Shift right 1 to drop rounding bit and shift right 8 to divide by 256
uint16_t r = (((fgR * alpha) + (bgR * (255 - alpha))) >> 9);
uint16_t g = (((fgG * alpha) + (bgG * (255 - alpha))) >> 9);
uint16_t b = (((fgB * alpha) + (bgB * (255 - alpha))) >> 9);
// Combine RGB565 colours into 16 bits
//return ((r&0x18) << 11) | ((g&0x30) << 5) | ((b&0x18) << 0); // 2 bit greyscale
//return ((r&0x1E) << 11) | ((g&0x3C) << 5) | ((b&0x1E) << 0); // 4 bit greyscale
return (r << 11) | (g << 5) | (b << 0);
}
/***************************************************************************************
** Function name: readInt32
** Description: Get a 32 bit integer from the font file
*************************************************************************************x*/
uint32_t TFT_eSPI::readInt32(void)
{
uint32_t val = 0;
val |= fontFile.read() << 24;
val |= fontFile.read() << 16;
val |= fontFile.read() << 8;
val |= fontFile.read();
return val;
}
/***************************************************************************************
** Function name: getUnicodeIndex
** Description: Get the font file index of a Unicode character
*************************************************************************************x*/
bool TFT_eSPI::getUnicodeIndex(uint16_t unicode, uint16_t *index)
{
for (uint16_t i = 0; i < gFont.gCount; i++)
{
if (gUnicode[i] == unicode)
{
*index = i;
return true;
}
}
return false;
}
/***************************************************************************************
** Function name: drawGlyph
** Description: Write a character to the TFT cursor position
*************************************************************************************x*/
// Expects file to be open
void TFT_eSPI::drawGlyph(uint16_t code)
{
if (code < 0x21)
{
if (code == 0x20) {
cursor_x += gFont.spaceWidth;
return;
}
if (code == '\n') {
cursor_x = 0;
cursor_y += gFont.yAdvance;
if (cursor_y >= _height) cursor_y = 0;
return;
}
}
uint16_t gNum = 0;
bool found = getUnicodeIndex(code, &gNum);
uint16_t fg = textcolor;
uint16_t bg = textbgcolor;
if (found)
{
if (textwrapX && (cursor_x + gWidth[gNum] + gdX[gNum] > _width))
{
cursor_y += gFont.yAdvance;
cursor_x = 0;
}
if (textwrapY && ((cursor_y + gFont.yAdvance) >= _height)) cursor_y = 0;
if (cursor_x == 0) cursor_x -= gdX[gNum];
fontFile.seek(gBitmap[gNum], fs::SeekSet); // This is taking >30ms for a significant position shift
uint8_t pbuffer[gWidth[gNum]];
int16_t xs = 0;
uint32_t dl = 0;
int16_t cy = cursor_y + gFont.maxAscent - gdY[gNum];
int16_t cx = cursor_x + gdX[gNum];
startWrite(); // Avoid slow ESP32 transaction overhead for every pixel
for (int y = 0; y < gHeight[gNum]; y++)
{
if (spiffs)
{
fontFile.read(pbuffer, gWidth[gNum]);
//Serial.println("SPIFFS");
}
else
{
endWrite(); // Release SPI for SD card transaction
fontFile.read(pbuffer, gWidth[gNum]);
startWrite(); // Re-start SPI for TFT transaction
//Serial.println("Not SPIFFS");
}
for (int x = 0; x < gWidth[gNum]; x++)
{
uint8_t pixel = pbuffer[x]; //<//
if (pixel)
{
if (pixel != 0xFF)
{
if (dl) {
if (dl==1) drawPixel(xs, y + cy, fg);
else drawFastHLine( xs, y + cy, dl, fg);
dl = 0;
}
drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg));
}
else
{
if (dl==0) xs = x + cx;
dl++;
}
}
else
{
if (dl) { drawFastHLine( xs, y + cy, dl, fg); dl = 0; }
}
}
if (dl) { drawFastHLine( xs, y + cy, dl, fg); dl = 0; }
}
cursor_x += gxAdvance[gNum];
endWrite();
}
else
{
// Not a Unicode in font so draw a rectangle and move on cursor
drawRect(cursor_x, cursor_y + gFont.maxAscent - gFont.ascent, gFont.spaceWidth, gFont.ascent, fg);
cursor_x += gFont.spaceWidth + 1;
}
}
/***************************************************************************************
** Function name: showFont
** Description: Page through all characters in font, td ms between screens
*************************************************************************************x*/
void TFT_eSPI::showFont(uint32_t td)
{
if(!fontLoaded) return;
if(!fontFile)
{
fontLoaded = false;
return;
}
int16_t cursorX = width(); // Force start of new page to initialise cursor
int16_t cursorY = height();// for the first character
uint32_t timeDelay = 0; // No delay before first page
fillScreen(textbgcolor);
for (uint16_t i = 0; i < gFont.gCount; i++)
{
// Check if this will need a new screen
if (cursorX + gdX[i] + gWidth[i] >= width()) {
cursorX = -gdX[i];
cursorY += gFont.yAdvance;
if (cursorY + gFont.maxAscent + gFont.descent >= height()) {
cursorX = -gdX[i];
cursorY = 0;
delay(timeDelay);
timeDelay = td;
fillScreen(textbgcolor);
}
}
setCursor(cursorX, cursorY);
drawGlyph(gUnicode[i]);
cursorX += gxAdvance[i];
//cursorX += printToSprite( cursorX, cursorY, i );
yield();
}
delay(timeDelay);
fillScreen(textbgcolor);
//fontFile.close();
}

50
Extensions/Smooth_font.h Normal file
View File

@ -0,0 +1,50 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with anti-aliased font functions
public:
// These are for the new antialiased fonts
void loadFont(String fontName, fs::FS &ffs);
void loadFont(String fontName, bool flash = true);
void unloadFont( void );
bool getUnicodeIndex(uint16_t unicode, uint16_t *index);
uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc);
virtual void drawGlyph(uint16_t code);
void showFont(uint32_t td);
// This is for the whole font
typedef struct
{
uint16_t gCount; // Total number of characters
uint16_t yAdvance; // Line advance
uint16_t spaceWidth; // Width of a space character
int16_t ascent; // Height of top of 'd' above baseline, other characters may be taller
int16_t descent; // Offset to bottom of 'p', other characters may have a larger descent
uint16_t maxAscent; // Maximum ascent found in font
uint16_t maxDescent; // Maximum descent found in font
} fontMetrics;
fontMetrics gFont = { 0, 0, 0, 0, 0, 0, 0 };
// These are for the metrics for each individual glyph (so we don't need to seek this in file and waste time)
uint16_t* gUnicode = NULL; //UTF-16 code, the codes are searched so do not need to be sequential
uint8_t* gHeight = NULL; //cheight
uint8_t* gWidth = NULL; //cwidth
uint8_t* gxAdvance = NULL; //setWidth
int16_t* gdY = NULL; //topExtent
int8_t* gdX = NULL; //leftExtent
uint32_t* gBitmap = NULL; //file pointer to greyscale bitmap
bool fontLoaded = false; // Flags when a anti-aliased font is loaded
fs::File fontFile;
private:
void loadMetrics(uint16_t gCount);
uint32_t readInt32(void);
fs::FS &fontFS = SPIFFS;
bool spiffs = true;

2006
Extensions/Sprite.cpp Normal file

File diff suppressed because it is too large Load Diff

146
Extensions/Sprite.h Normal file
View File

@ -0,0 +1,146 @@
/***************************************************************************************
// The following class creates Sprites in RAM, graphics can then be drawn in the Sprite
// and rendered quickly onto the TFT screen. The class inherits the graphics functions
// from the TFT_eSPI class. Some functions are overridden by this class so that the
// graphics are written to the Sprite rather than the TFT.
***************************************************************************************/
class TFT_eSprite : public TFT_eSPI {
public:
TFT_eSprite(TFT_eSPI *tft);
// Create a sprite of width x height pixels, return a pointer to the RAM area
// Sketch can cast returned value to (uint16_t*) for 16 bit depth if needed
// RAM required is 1 byte per pixel for 8 bit colour depth, 2 bytes for 16 bit
void* createSprite(int16_t width, int16_t height, uint8_t frames = 1);
// Delete the sprite to free up the RAM
void deleteSprite(void);
// Select the frame buffer for graphics
void* frameBuffer(int8_t f);
// Set or get the colour depth to 8 or 16 bits. Can be used to change depth an existing
// sprite, but clears it to black, returns a new pointer if sprite is re-created.
void* setColorDepth(int8_t b);
int8_t getColorDepth(void);
void setBitmapColor(uint16_t c, uint16_t b);
void drawPixel(int32_t x, int32_t y, uint32_t color);
void drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size),
fillSprite(uint32_t color),
// Define a window to push 16 bit colour pixels into in a raster order
// Colours are converted to 8 bit if depth is set to 8
setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1),
pushColor(uint32_t color),
pushColor(uint32_t color, uint16_t len),
// Push a pixel preformatted as a 8 or 16 bit colour (avoids conversion overhead)
writeColor(uint16_t color),
// Set the scroll zone, top left corner at x,y with defined width and height
// The colour (optional, black is default) is used to fill the gap after the scroll
setScrollRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t color = TFT_BLACK),
// Scroll the defined zone dx,dy pixels. Negative values left,up, positive right,down
// dy is optional (default is then no up/down scroll).
// The sprite coordinate frame does not move because pixels are moved
scroll(int16_t dx, int16_t dy = 0),
drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color),
drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color),
drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color),
fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color);
// Set the sprite text cursor position for print class (does not change the TFT screen cursor)
//setCursor(int16_t x, int16_t y);
// Set the rotation of the Sprite (for 1bpp Sprites only)
void setRotation(uint8_t rotation);
uint8_t getRotation(void);
// Push a rotated copy of Sprite to TFT with optional transparent colour
bool pushRotated(int16_t angle, int32_t transp = -1);
// Push a rotated copy of Sprite to another different Sprite with optional transparent colour
bool pushRotated(TFT_eSprite *spr, int16_t angle, int32_t transp = -1);
// Set and get the pivot point for this Sprite
void setPivot(int16_t x, int16_t y);
int16_t getPivotX(void),
getPivotY(void);
// Get the bounding box for a rotated copy of this Sprite
void getRotatedBounds(float sina, float cosa, int16_t w, int16_t h, int16_t xp, int16_t yp,
int16_t *min_x, int16_t *min_y, int16_t *max_x, int16_t *max_y);
// Read the colour of a pixel at x,y and return value in 565 format
uint16_t readPixel(int32_t x0, int32_t y0);
// Write an image (colour bitmap) to the sprite
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data);
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data);
// Swap the byte order for pushImage() - corrects different image endianness
void setSwapBytes(bool swap);
bool getSwapBytes(void);
// Push the sprite to the TFT screen, this fn calls pushImage() in the TFT class.
// Optionally a "transparent" colour can be defined, pixels of that colour will not be rendered
void pushSprite(int32_t x, int32_t y);
void pushSprite(int32_t x, int32_t y, uint16_t transparent);
int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font),
drawChar(uint16_t uniCode, int32_t x, int32_t y);
// Return the width and height of the sprite
int16_t width(void),
height(void);
// Used by print class to print text to cursor position
size_t write(uint8_t);
// Functions associated with anti-aliased fonts
void drawGlyph(uint16_t code);
void printToSprite(String string);
void printToSprite(char *cbuffer, uint16_t len);
int16_t printToSprite(int16_t x, int16_t y, uint16_t index);
private:
TFT_eSPI *_tft;
// Reserve memory for the Sprite and return a pointer
void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1);
protected:
uint8_t _bpp; // bits per pixel (1, 8 or 16)
uint16_t *_img; // pointer to 16 bit sprite
uint8_t *_img8; // pointer to 8 bit sprite
uint8_t *_img8_1; // pointer to frame 1
uint8_t *_img8_2; // pointer to frame 2
int16_t _xpivot; // x pivot point coordinate
int16_t _ypivot; // y pivot point coordinate
bool _created; // A Sprite has been created and memory reserved
bool _gFont = false;
// int32_t _icursor_x, _icursor_y;
uint8_t _rotation = 0;
int32_t _xs, _ys, _xe, _ye, _xptr, _yptr; // for setWindow
int32_t _sx, _sy; // x,y for scroll zone
uint32_t _sw, _sh; // w,h for scroll zone
uint32_t _scolor; // gap fill colour for scroll zone
boolean _iswapBytes; // Swap the byte order for Sprite pushImage()
int32_t _iwidth, _iheight; // Sprite memory image bit width and height (swapped during rotations)
int32_t _dwidth, _dheight; // Real display width and height (for <8bpp Sprites)
int32_t _bitwidth; // Sprite image bit width for drawPixel (for <8bpp Sprites, not swapped)
};

305
Extensions/Touch.cpp Normal file
View File

@ -0,0 +1,305 @@
// The following touch screen support code by maxpautsch was merged 1/10/17
// https://github.com/maxpautsch
// Define TOUCH_CS is the user setup file to enable this code
// A demo is provided in examples Generic folder
// Additions by Bodmer to double sample, use Z value to improve detection reliability
// and to correct rotation handling
// See license in root directory.
/***************************************************************************************
** Function name: getTouchRaw
** Description: read raw touch position. Always returns true.
***************************************************************************************/
uint8_t TFT_eSPI::getTouchRaw(uint16_t *x, uint16_t *y){
uint16_t tmp;
spi_begin_touch();
// Start YP sample request for x position, read 4 times and keep last sample
spi.transfer(0xd0); // Start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0xd0); // Read last 8 bits and start new YP conversion
tmp = spi.transfer(0); // Read first 8 bits
tmp = tmp <<5;
tmp |= 0x1f & (spi.transfer(0x90)>>3); // Read last 8 bits and start new XP conversion
*x = tmp;
// Start XP sample request for y position, read 4 times and keep last sample
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion
spi.transfer(0); // Read first 8 bits
spi.transfer(0x90); // Read last 8 bits and start new XP conversion
tmp = spi.transfer(0); // Read first 8 bits
tmp = tmp <<5;
tmp |= 0x1f & (spi.transfer(0)>>3); // Read last 8 bits
*y = tmp;
spi_end_touch();
return true;
}
/***************************************************************************************
** Function name: getTouchRawZ
** Description: read raw pressure on touchpad and return Z value.
***************************************************************************************/
uint16_t TFT_eSPI::getTouchRawZ(void){
spi_begin_touch();
// Z sample request
int16_t tz = 0xFFF;
spi.transfer(0xb0); // Start new Z1 conversion
tz += spi.transfer16(0xc0) >> 3; // Read Z1 and start Z2 conversion
tz -= spi.transfer16(0x00) >> 3; // Read Z2
spi_end_touch();
return (uint16_t)tz;
}
/***************************************************************************************
** Function name: validTouch
** Description: read validated position. Return false if not pressed.
***************************************************************************************/
#define _RAWERR 20 // Deadband error allowed in successive position samples
uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){
uint16_t x_tmp, y_tmp, x_tmp2, y_tmp2;
// Wait until pressure stops increasing to debounce pressure
uint16_t z1 = 1;
uint16_t z2 = 0;
while (z1 > z2)
{
z2 = z1;
z1 = getTouchRawZ();
delay(1);
}
// Serial.print("Z = ");Serial.println(z1);
if (z1 <= threshold) return false;
getTouchRaw(&x_tmp,&y_tmp);
// Serial.print("Sample 1 x,y = "); Serial.print(x_tmp);Serial.print(",");Serial.print(y_tmp);
// Serial.print(", Z = ");Serial.println(z1);
delay(1); // Small delay to the next sample
if (getTouchRawZ() <= threshold) return false;
delay(2); // Small delay to the next sample
getTouchRaw(&x_tmp2,&y_tmp2);
// Serial.print("Sample 2 x,y = "); Serial.print(x_tmp2);Serial.print(",");Serial.println(y_tmp2);
// Serial.print("Sample difference = ");Serial.print(abs(x_tmp - x_tmp2));Serial.print(",");Serial.println(abs(y_tmp - y_tmp2));
if (abs(x_tmp - x_tmp2) > _RAWERR) return false;
if (abs(y_tmp - y_tmp2) > _RAWERR) return false;
*x = x_tmp;
*y = y_tmp;
return true;
}
/***************************************************************************************
** Function name: getTouch
** Description: read callibrated position. Return false if not pressed.
***************************************************************************************/
#define Z_THRESHOLD 350 // Touch pressure threshold for validating touches
uint8_t TFT_eSPI::getTouch(uint16_t *x, uint16_t *y, uint16_t threshold){
uint16_t x_tmp, y_tmp;
if (threshold<20) threshold = 20;
if (_pressTime > millis()) threshold=20;
uint8_t n = 5;
uint8_t valid = 0;
while (n--)
{
if (validTouch(&x_tmp, &y_tmp, threshold)) valid++;;
}
if (valid<1) { _pressTime = 0; return false; }
_pressTime = millis() + 50;
convertRawXY(&x_tmp, &y_tmp);
if (x_tmp >= _width || y_tmp >= _height) return false;
_pressX = x_tmp;
_pressY = y_tmp;
*x = _pressX;
*y = _pressY;
return valid;
}
/***************************************************************************************
** Function name: convertRawXY
** Description: convert raw touch x,y values to screen coordinates
***************************************************************************************/
void TFT_eSPI::convertRawXY(uint16_t *x, uint16_t *y)
{
uint16_t x_tmp = *x, y_tmp = *y, xx, yy;
if(!touchCalibration_rotate){
xx=(x_tmp-touchCalibration_x0)*_width/touchCalibration_x1;
yy=(y_tmp-touchCalibration_y0)*_height/touchCalibration_y1;
if(touchCalibration_invert_x)
xx = _width - xx;
if(touchCalibration_invert_y)
yy = _height - yy;
} else {
xx=(y_tmp-touchCalibration_x0)*_width/touchCalibration_x1;
yy=(x_tmp-touchCalibration_y0)*_height/touchCalibration_y1;
if(touchCalibration_invert_x)
xx = _width - xx;
if(touchCalibration_invert_y)
yy = _height - yy;
}
*x = xx;
*y = yy;
}
/***************************************************************************************
** Function name: calibrateTouch
** Description: generates calibration parameters for touchscreen.
***************************************************************************************/
void TFT_eSPI::calibrateTouch(uint16_t *parameters, uint32_t color_fg, uint32_t color_bg, uint8_t size){
int16_t values[] = {0,0,0,0,0,0,0,0};
uint16_t x_tmp, y_tmp;
for(uint8_t i = 0; i<4; i++){
fillRect(0, 0, size+1, size+1, color_bg);
fillRect(0, _height-size-1, size+1, size+1, color_bg);
fillRect(_width-size-1, 0, size+1, size+1, color_bg);
fillRect(_width-size-1, _height-size-1, size+1, size+1, color_bg);
if (i == 5) break; // used to clear the arrows
switch (i) {
case 0: // up left
drawLine(0, 0, 0, size, color_fg);
drawLine(0, 0, size, 0, color_fg);
drawLine(0, 0, size , size, color_fg);
break;
case 1: // bot left
drawLine(0, _height-size-1, 0, _height-1, color_fg);
drawLine(0, _height-1, size, _height-1, color_fg);
drawLine(size, _height-size-1, 0, _height-1 , color_fg);
break;
case 2: // up right
drawLine(_width-size-1, 0, _width-1, 0, color_fg);
drawLine(_width-size-1, size, _width-1, 0, color_fg);
drawLine(_width-1, size, _width-1, 0, color_fg);
break;
case 3: // bot right
drawLine(_width-size-1, _height-size-1, _width-1, _height-1, color_fg);
drawLine(_width-1, _height-1-size, _width-1, _height-1, color_fg);
drawLine(_width-1-size, _height-1, _width-1, _height-1, color_fg);
break;
}
// user has to get the chance to release
if(i>0) delay(1000);
for(uint8_t j= 0; j<8; j++){
// Use a lower detect threshold as corners tend to be less sensitive
while(!validTouch(&x_tmp, &y_tmp, Z_THRESHOLD/2));
values[i*2 ] += x_tmp;
values[i*2+1] += y_tmp;
}
values[i*2 ] /= 8;
values[i*2+1] /= 8;
}
// from case 0 to case 1, the y value changed.
// If the measured delta of the touch x axis is bigger than the delta of the y axis, the touch and TFT axes are switched.
touchCalibration_rotate = false;
if(abs(values[0]-values[2]) > abs(values[1]-values[3])){
touchCalibration_rotate = true;
touchCalibration_x0 = (values[1] + values[3])/2; // calc min x
touchCalibration_x1 = (values[5] + values[7])/2; // calc max x
touchCalibration_y0 = (values[0] + values[4])/2; // calc min y
touchCalibration_y1 = (values[2] + values[6])/2; // calc max y
} else {
touchCalibration_x0 = (values[0] + values[2])/2; // calc min x
touchCalibration_x1 = (values[4] + values[6])/2; // calc max x
touchCalibration_y0 = (values[1] + values[5])/2; // calc min y
touchCalibration_y1 = (values[3] + values[7])/2; // calc max y
}
// in addition, the touch screen axis could be in the opposite direction of the TFT axis
touchCalibration_invert_x = false;
if(touchCalibration_x0 > touchCalibration_x1){
values[0]=touchCalibration_x0;
touchCalibration_x0 = touchCalibration_x1;
touchCalibration_x1 = values[0];
touchCalibration_invert_x = true;
}
touchCalibration_invert_y = false;
if(touchCalibration_y0 > touchCalibration_y1){
values[0]=touchCalibration_y0;
touchCalibration_y0 = touchCalibration_y1;
touchCalibration_y1 = values[0];
touchCalibration_invert_y = true;
}
// pre calculate
touchCalibration_x1 -= touchCalibration_x0;
touchCalibration_y1 -= touchCalibration_y0;
if(touchCalibration_x0 == 0) touchCalibration_x0 = 1;
if(touchCalibration_x1 == 0) touchCalibration_x1 = 1;
if(touchCalibration_y0 == 0) touchCalibration_y0 = 1;
if(touchCalibration_y1 == 0) touchCalibration_y1 = 1;
// export parameters, if pointer valid
if(parameters != NULL){
parameters[0] = touchCalibration_x0;
parameters[1] = touchCalibration_x1;
parameters[2] = touchCalibration_y0;
parameters[3] = touchCalibration_y1;
parameters[4] = touchCalibration_rotate | (touchCalibration_invert_x <<1) | (touchCalibration_invert_y <<2);
}
}
/***************************************************************************************
** Function name: setTouch
** Description: imports calibration parameters for touchscreen.
***************************************************************************************/
void TFT_eSPI::setTouch(uint16_t *parameters){
touchCalibration_x0 = parameters[0];
touchCalibration_x1 = parameters[1];
touchCalibration_y0 = parameters[2];
touchCalibration_y1 = parameters[3];
if(touchCalibration_x0 == 0) touchCalibration_x0 = 1;
if(touchCalibration_x1 == 0) touchCalibration_x1 = 1;
if(touchCalibration_y0 == 0) touchCalibration_y0 = 1;
if(touchCalibration_y1 == 0) touchCalibration_y1 = 1;
touchCalibration_rotate = parameters[4] & 0x01;
touchCalibration_invert_x = parameters[4] & 0x02;
touchCalibration_invert_y = parameters[4] & 0x04;
}

33
Extensions/Touch.h Normal file
View File

@ -0,0 +1,33 @@
// Coded by Bodmer 10/2/18, see license in root directory.
// This is part of the TFT_eSPI class and is associated with the Touch Screen handlers
public:
// Get raw x,y ADC values from touch controller
uint8_t getTouchRaw(uint16_t *x, uint16_t *y);
// Get raw z (i.e. pressure) ADC value from touch controller
uint16_t getTouchRawZ(void);
// Convert raw x,y values to calibrated and correctly rotated screen coordinates
void convertRawXY(uint16_t *x, uint16_t *y);
// Get the screen touch coordinates, returns true if screen has been touched
// if the touch cordinates are off screen then x and y are not updated
uint8_t getTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);
// Run screen calibration and test, report calibration values to the serial port
void calibrateTouch(uint16_t *data, uint32_t color_fg, uint32_t color_bg, uint8_t size);
// Set the screen calibration values
void setTouch(uint16_t *data);
private:
// Handlers for the SPI settings and clock speed change
inline void spi_begin_touch() __attribute__((always_inline));
inline void spi_end_touch() __attribute__((always_inline));
// Private function to validate a touch, allow settle time and reduce spurious coordinates
uint8_t validTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600);
// Initialise with example calibration values so processor does not crash if setTouch() not called in setup()
uint16_t touchCalibration_x0 = 300, touchCalibration_x1 = 3600, touchCalibration_y0 = 300, touchCalibration_y1 = 3600;
uint8_t touchCalibration_rotate = 1, touchCalibration_invert_x = 2, touchCalibration_invert_y = 0;
uint32_t _pressTime; // Press and hold time-out
uint16_t _pressX, _pressY; // For future use (last sampled calibrated coordinates)

View File

@ -15,7 +15,8 @@ PROGMEM const unsigned char widtbl_f16[96] = // character width table
8, 4, 8, 8, 7, 10, 8, 8, // char 72 - 79
8, 8, 8, 8, 8, 8, 8, 10, // char 80 - 87
8, 8, 8, 4, 7, 4, 7, 9, // char 88 - 95
4, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103
// 4, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 grave see lines 411-414
5, 7, 7, 7, 7, 7, 6, 7, // char 96 - 103 celcius
7, 4, 5, 6, 4, 8, 7, 8, // char 104 - 111
7, 8, 6, 6, 5, 7, 8, 8, // char 112 - 119
6, 7, 7, 5, 3, 5, 8, 6 // char 120 - 127
@ -407,8 +408,10 @@ PROGMEM const unsigned char chr_f16_5F[32] = // 1 unsigned chars per row
PROGMEM const unsigned char chr_f16_60[16] = // 1 unsigned char per row
{
0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11
0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
// 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 grave
// 0x00, 0x00, 0x00, 0x00, 0x00 // row 12 - 16
0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, // row 1 - 11 Celcius
0x00, 0x00, 0x00, 0x00, 0x00
};
PROGMEM const unsigned char chr_f16_61[16] = // 1 unsigned char per row

247
Fonts/Font72x53rle.c Normal file
View File

@ -0,0 +1,247 @@
// Font 8
//
// This font has been 8 bit Run Length Encoded to save FLASH space
//
// It is a Arial 75 pixel height font intended to display large numbers
// Width for numerals reduced from 55 to 53 (to fit in 160 pixel screens)
// This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - .
// All other characters print as a space
#include <pgmspace.h>
PROGMEM const unsigned char widtbl_f72[96] = // character width table
{
29, 29, 29, 29, 29, 29, 29, 29, // char 32 - 39
29, 29, 29, 29, 29, 29, 29, 29, // char 40 - 47
53, 53, 53, 53, 53, 53, 53, 53, // char 48 - 55
53, 53, 29, 29, 29, 29, 29, 29, // char 56 - 63
29, 29, 29, 29, 29, 29, 29, 29, // char 64 - 71
29, 29, 29, 29, 29, 29, 29, 29, // char 72 - 79
29, 29, 29, 29, 29, 29, 29, 29, // char 80 - 87
29, 29, 29, 29, 29, 29, 29, 29, // char 88 - 95
29, 29, 29, 29, 29, 29, 29, 29, // char 96 - 103
29, 29, 29, 29, 29, 29, 29, 29, // char 104 - 111
29, 29, 29, 29, 29, 29, 29, 29, // char 112 - 119
29, 29, 29, 29, 29, 29, 29, 29 // char 120 - 127
};
// Row format, MSB left
PROGMEM const unsigned char chr_f72_20[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7E
};
PROGMEM const unsigned char chr_f72_2D[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x36, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91,
0x0A, 0x91, 0x0A, 0x91, 0x0A, 0x91, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x07
};
PROGMEM const unsigned char chr_f72_2E[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x48, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};
PROGMEM const unsigned char chr_f72_30[] =
{
0x7F, 0x68, 0x8A, 0x26, 0x90, 0x21, 0x94, 0x1D, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10,
0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0C, 0x89, 0x14,
0x88, 0x0C, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0A, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x08, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0A, 0x88, 0x16,
0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x16, 0x88, 0x0B, 0x89, 0x14, 0x89, 0x0C, 0x88, 0x14,
0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E, 0x88, 0x12, 0x88, 0x0F, 0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E,
0x8A, 0x10, 0x8B, 0x0A, 0x8B, 0x12, 0x8C, 0x06, 0x8C, 0x13, 0xA0, 0x14, 0x9E, 0x16, 0x9C, 0x18,
0x9A, 0x1A, 0x98, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x8A, 0x49
};
PROGMEM const unsigned char chr_f72_31[] =
{
0x7F, 0x70, 0x85, 0x2D, 0x86, 0x2D, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29,
0x8A, 0x28, 0x8B, 0x27, 0x8C, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x22, 0x91, 0x20, 0x93, 0x1E,
0x95, 0x1C, 0x8D, 0x00, 0x88, 0x1B, 0x8C, 0x02, 0x88, 0x1B, 0x8B, 0x03, 0x88, 0x1B, 0x8A, 0x04,
0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x87, 0x07, 0x88, 0x1B, 0x85, 0x09, 0x88, 0x1B, 0x83, 0x0B,
0x88, 0x1B, 0x81, 0x0D, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7B
};
PROGMEM const unsigned char chr_f72_32[] =
{
0x7F, 0x67, 0x8A, 0x25, 0x92, 0x1F, 0x96, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14, 0xA0, 0x12,
0xA2, 0x10, 0x8E, 0x07, 0x8D, 0x0F, 0x8B, 0x0C, 0x8C, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x89, 0x12,
0x8A, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x88, 0x16, 0x89, 0x0A, 0x88, 0x16,
0x89, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09, 0x88, 0x18, 0x88, 0x0D, 0x84, 0x18,
0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29,
0x89, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x8A, 0x28, 0x8A, 0x28, 0x8B, 0x27, 0x8B, 0x27, 0x8B, 0x27,
0x8B, 0x27, 0x8B, 0x27, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8C, 0x26,
0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x26, 0x8C, 0x25, 0x8D, 0x25, 0x8D, 0x25, 0x8C, 0x26, 0x8C, 0x26,
0x8C, 0x27, 0x8B, 0x27, 0x8B, 0x27, 0x8A, 0x28, 0x8A, 0x29, 0x89, 0x29, 0x8A, 0x29, 0x89, 0x29,
0x89, 0x2A, 0xAA, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x07, 0xAC, 0x07, 0xAC, 0x07, 0xAC, 0x07,
0xAC, 0x07, 0xAC, 0x6E
};
PROGMEM const unsigned char chr_f72_33[] =
{
0x7F, 0x67, 0x89, 0x27, 0x90, 0x21, 0x94, 0x1D, 0x97, 0x1B, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x13, 0x8C, 0x06, 0x8C, 0x12, 0x8B, 0x0A, 0x8B, 0x10, 0x8A, 0x0E, 0x89, 0x10, 0x89, 0x10,
0x89, 0x0F, 0x88, 0x12, 0x88, 0x0E, 0x89, 0x12, 0x89, 0x0D, 0x88, 0x14, 0x88, 0x0D, 0x88, 0x14,
0x88, 0x0C, 0x89, 0x14, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x10, 0x84, 0x15, 0x88, 0x2B, 0x88, 0x2B,
0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x29, 0x89, 0x29, 0x89, 0x28, 0x8B, 0x26, 0x8C, 0x21,
0x91, 0x22, 0x8F, 0x24, 0x8D, 0x26, 0x8F, 0x23, 0x92, 0x21, 0x94, 0x1F, 0x95, 0x1E, 0x81, 0x07,
0x8C, 0x29, 0x8B, 0x2A, 0x8A, 0x2A, 0x89, 0x2B, 0x89, 0x2B, 0x89, 0x2A, 0x89, 0x2B, 0x88, 0x2B,
0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A,
0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x89, 0x18, 0x89, 0x07, 0x89, 0x18, 0x88, 0x09, 0x88, 0x18,
0x88, 0x09, 0x89, 0x16, 0x89, 0x09, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x14, 0x89, 0x0B, 0x8A, 0x12,
0x89, 0x0D, 0x8A, 0x10, 0x8A, 0x0D, 0x8B, 0x0D, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA2, 0x12,
0xA0, 0x14, 0x9D, 0x17, 0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A
};
PROGMEM const unsigned char chr_f72_34[] =
{
0x7F, 0x7F, 0x2A, 0x86, 0x2C, 0x87, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x89, 0x29, 0x8A, 0x28, 0x8B,
0x27, 0x8C, 0x26, 0x8D, 0x26, 0x8D, 0x25, 0x8E, 0x24, 0x8F, 0x23, 0x90, 0x23, 0x90, 0x22, 0x91,
0x21, 0x92, 0x20, 0x93, 0x20, 0x93, 0x1F, 0x8A, 0x00, 0x88, 0x1E, 0x8A, 0x01, 0x88, 0x1D, 0x8A,
0x02, 0x88, 0x1C, 0x8B, 0x02, 0x88, 0x1C, 0x8A, 0x03, 0x88, 0x1B, 0x8A, 0x04, 0x88, 0x1A, 0x8A,
0x05, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x19, 0x8A, 0x06, 0x88, 0x18, 0x8A, 0x07, 0x88, 0x17, 0x8A,
0x08, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x16, 0x8A, 0x09, 0x88, 0x15, 0x8A, 0x0A, 0x88, 0x14, 0x8A,
0x0B, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x13, 0x8A, 0x0C, 0x88, 0x12, 0x8A, 0x0D, 0x88, 0x11, 0x8A,
0x0E, 0x88, 0x10, 0x8A, 0x0F, 0x88, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x10, 0x88, 0x0E, 0x8A,
0x11, 0x88, 0x0D, 0x8A, 0x12, 0x88, 0x0C, 0x8A, 0x13, 0x88, 0x0C, 0xAF, 0x04, 0xAF, 0x04, 0xAF,
0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x04, 0xAF, 0x23, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x75
};
PROGMEM const unsigned char chr_f72_35[] =
{
0x7F, 0x7F, 0x14, 0xA0, 0x13, 0xA0, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1, 0x12, 0xA1,
0x11, 0xA2, 0x11, 0xA2, 0x11, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89,
0x06, 0x88, 0x1A, 0x89, 0x03, 0x8E, 0x17, 0x88, 0x02, 0x92, 0x15, 0x88, 0x00, 0x96, 0x13, 0xA1,
0x11, 0xA3, 0x10, 0xA4, 0x0F, 0xA5, 0x0E, 0x8F, 0x07, 0x8E, 0x0D, 0x8C, 0x0D, 0x8C, 0x0B, 0x8B,
0x11, 0x8A, 0x0B, 0x8A, 0x13, 0x8A, 0x0A, 0x89, 0x15, 0x89, 0x0E, 0x84, 0x17, 0x89, 0x2A, 0x89,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x89, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0B, 0x84, 0x1A, 0x88, 0x07, 0x88, 0x19, 0x88,
0x08, 0x89, 0x18, 0x88, 0x08, 0x89, 0x18, 0x88, 0x09, 0x88, 0x17, 0x89, 0x09, 0x89, 0x16, 0x88,
0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A,
0x0E, 0x8B, 0x0D, 0x8A, 0x10, 0x8D, 0x07, 0x8D, 0x10, 0xA2, 0x12, 0xA0, 0x14, 0x9E, 0x17, 0x9B,
0x19, 0x98, 0x1D, 0x95, 0x20, 0x90, 0x26, 0x8A, 0x4A
};
PROGMEM const unsigned char chr_f72_36[] =
{
0x7F, 0x6A, 0x89, 0x26, 0x90, 0x21, 0x95, 0x1C, 0x98, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x12, 0x8D, 0x06, 0x8D, 0x10, 0x8B, 0x0B, 0x8B, 0x10, 0x8A, 0x0E, 0x8A, 0x0E, 0x89, 0x11,
0x89, 0x0D, 0x8A, 0x12, 0x89, 0x0C, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0B, 0x89, 0x15,
0x89, 0x0A, 0x88, 0x16, 0x89, 0x09, 0x89, 0x17, 0x88, 0x09, 0x88, 0x18, 0x84, 0x0D, 0x88, 0x2B,
0x87, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x0A, 0x88, 0x17, 0x87, 0x08, 0x8E, 0x14,
0x87, 0x06, 0x92, 0x11, 0x88, 0x04, 0x96, 0x0F, 0x88, 0x03, 0x98, 0x0E, 0x88, 0x02, 0x9A, 0x0D,
0x88, 0x01, 0x9C, 0x0C, 0x88, 0x00, 0x9E, 0x0B, 0x92, 0x07, 0x8E, 0x0A, 0x90, 0x0C, 0x8C, 0x09,
0x8E, 0x10, 0x8A, 0x09, 0x8D, 0x12, 0x8A, 0x08, 0x8C, 0x14, 0x89, 0x08, 0x8B, 0x16, 0x89, 0x07,
0x8A, 0x17, 0x89, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x88, 0x07, 0x89, 0x19, 0x89, 0x06,
0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x06, 0x88, 0x1B, 0x88, 0x07,
0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07, 0x87, 0x1B, 0x88, 0x07,
0x88, 0x1A, 0x88, 0x08, 0x87, 0x19, 0x89, 0x08, 0x87, 0x19, 0x88, 0x09, 0x88, 0x18, 0x88, 0x09,
0x88, 0x17, 0x89, 0x0A, 0x88, 0x16, 0x88, 0x0B, 0x88, 0x15, 0x89, 0x0C, 0x88, 0x14, 0x89, 0x0C,
0x89, 0x12, 0x89, 0x0E, 0x89, 0x10, 0x8A, 0x0E, 0x8B, 0x0C, 0x8B, 0x10, 0x8C, 0x07, 0x8D, 0x12,
0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17, 0x9B, 0x1A, 0x97, 0x1D, 0x95, 0x21, 0x8F, 0x27, 0x89, 0x49
};
PROGMEM const unsigned char chr_f72_37[] =
{
0x7F, 0x7F, 0x0D, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB, 0x08, 0xAB,
0x08, 0xAB, 0x08, 0xAA, 0x2C, 0x86, 0x2C, 0x86, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2B, 0x87,
0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x87, 0x2C, 0x87, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x87,
0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2B, 0x87, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88,
0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88,
0x2B, 0x88, 0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2A, 0x89,
0x2A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x7F, 0x06
};
PROGMEM const unsigned char chr_f72_38[] =
{
0x7F, 0x68, 0x89, 0x26, 0x91, 0x20, 0x95, 0x1C, 0x99, 0x19, 0x9B, 0x17, 0x9D, 0x15, 0x9F, 0x13,
0xA1, 0x11, 0x8D, 0x07, 0x8C, 0x11, 0x8B, 0x0B, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0E, 0x89, 0x11,
0x89, 0x0E, 0x88, 0x13, 0x88, 0x0D, 0x89, 0x13, 0x89, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15,
0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15, 0x88, 0x0C, 0x88, 0x15,
0x88, 0x0C, 0x88, 0x15, 0x88, 0x0D, 0x88, 0x13, 0x88, 0x0E, 0x88, 0x13, 0x88, 0x0E, 0x89, 0x11,
0x89, 0x0F, 0x89, 0x0F, 0x89, 0x11, 0x89, 0x0D, 0x89, 0x13, 0x8B, 0x07, 0x8C, 0x14, 0x9D, 0x17,
0x9B, 0x1A, 0x97, 0x1E, 0x93, 0x1E, 0x96, 0x1B, 0x9A, 0x18, 0x9D, 0x15, 0x9F, 0x13, 0x8C, 0x07,
0x8C, 0x11, 0x8A, 0x0C, 0x8B, 0x0F, 0x8A, 0x0F, 0x8A, 0x0D, 0x8A, 0x11, 0x89, 0x0D, 0x89, 0x13,
0x89, 0x0B, 0x89, 0x15, 0x88, 0x0B, 0x89, 0x15, 0x89, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x88, 0x17,
0x88, 0x09, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19,
0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x88, 0x19,
0x88, 0x08, 0x88, 0x19, 0x88, 0x08, 0x89, 0x17, 0x89, 0x09, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15,
0x89, 0x0A, 0x89, 0x15, 0x89, 0x0B, 0x89, 0x13, 0x89, 0x0C, 0x8A, 0x11, 0x8A, 0x0D, 0x8A, 0x0F,
0x8A, 0x0E, 0x8C, 0x0C, 0x8B, 0x0F, 0x8D, 0x07, 0x8D, 0x11, 0xA1, 0x13, 0x9F, 0x15, 0x9D, 0x17,
0x9B, 0x19, 0x99, 0x1C, 0x95, 0x20, 0x91, 0x26, 0x89, 0x4A
};
PROGMEM const unsigned char chr_f72_39[] =
{
0x7F, 0x68, 0x88, 0x27, 0x90, 0x21, 0x94, 0x1E, 0x97, 0x1A, 0x9A, 0x18, 0x9C, 0x16, 0x9E, 0x14,
0xA0, 0x12, 0x8E, 0x07, 0x8B, 0x11, 0x8C, 0x0B, 0x8A, 0x0F, 0x8B, 0x0F, 0x88, 0x0F, 0x8A, 0x11,
0x88, 0x0D, 0x8A, 0x13, 0x88, 0x0C, 0x89, 0x14, 0x88, 0x0B, 0x89, 0x16, 0x87, 0x0B, 0x89, 0x17,
0x87, 0x0A, 0x88, 0x18, 0x87, 0x0A, 0x88, 0x18, 0x87, 0x09, 0x89, 0x19, 0x87, 0x08, 0x88, 0x1A,
0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A, 0x87, 0x08, 0x88, 0x1A,
0x87, 0x08, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A, 0x88, 0x07, 0x88, 0x1A,
0x88, 0x07, 0x89, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x88, 0x18, 0x89, 0x08, 0x89, 0x16,
0x8A, 0x08, 0x89, 0x16, 0x8A, 0x09, 0x89, 0x14, 0x8B, 0x09, 0x8A, 0x12, 0x8C, 0x0A, 0x8A, 0x10,
0x8D, 0x0A, 0x8C, 0x0C, 0x8F, 0x0B, 0x8E, 0x07, 0x91, 0x0C, 0x9D, 0x00, 0x88, 0x0D, 0x9B, 0x01,
0x88, 0x0E, 0x99, 0x02, 0x88, 0x0F, 0x97, 0x03, 0x88, 0x10, 0x95, 0x04, 0x88, 0x11, 0x92, 0x06,
0x87, 0x14, 0x8E, 0x08, 0x87, 0x17, 0x88, 0x0A, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B, 0x88, 0x2B,
0x87, 0x2B, 0x88, 0x0E, 0x84, 0x17, 0x88, 0x0A, 0x88, 0x17, 0x88, 0x0A, 0x89, 0x15, 0x88, 0x0B,
0x89, 0x15, 0x88, 0x0C, 0x88, 0x14, 0x89, 0x0C, 0x89, 0x13, 0x88, 0x0D, 0x89, 0x12, 0x89, 0x0E,
0x89, 0x10, 0x89, 0x0F, 0x8A, 0x0E, 0x8A, 0x0F, 0x8B, 0x0B, 0x8B, 0x11, 0x8C, 0x07, 0x8C, 0x13,
0x9F, 0x14, 0x9E, 0x16, 0x9C, 0x18, 0x9A, 0x1B, 0x97, 0x1D, 0x94, 0x21, 0x90, 0x26, 0x89, 0x4C
};
PROGMEM const unsigned char chr_f72_3A[] =
{
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x23, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13,
0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x33, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x13, 0x88, 0x13, 0x88, 0x13, 0x88, 0x13, 0x88,
0x44
};
PROGMEM const unsigned char * const chrtbl_f72[96] = // character pointer table
{
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_2D, chr_f72_2E, chr_f72_20,
chr_f72_30, chr_f72_31, chr_f72_32, chr_f72_33, chr_f72_34, chr_f72_35, chr_f72_36, chr_f72_37,
chr_f72_38, chr_f72_39, chr_f72_3A, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20,
chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20, chr_f72_20
};

10
Fonts/Font72x53rle.h Normal file
View File

@ -0,0 +1,10 @@
#include <Fonts/Font72x53rle.c>
#define nr_chrs_f72 96
#define chr_hgt_f72 75
#define baseline_f72 73
#define data_size_f72 8
#define firstchr_f72 32
extern const unsigned char widtbl_f72[96];
extern const unsigned char* const chrtbl_f72[96];

View File

@ -12,7 +12,7 @@
PROGMEM const unsigned char widtbl_f7s[96] = // character width table
{
12, 12, 12, 12, 12, 12, 12, 12, // char 32 - 39
12, 12, 12, 12, 12, 17, 12, 12, // char 40 - 47
12, 12, 12, 12, 12, 32, 12, 12, // char 40 - 47
32, 32, 32, 32, 32, 32, 32, 32, // char 48 - 55
32, 32, 12, 12, 12, 12, 12, 12, // char 56 - 63
12, 12, 12, 12, 12, 12, 12, 12, // char 64 - 71
@ -32,10 +32,12 @@ PROGMEM const unsigned char chr_f7s_20[] =
0x7F, 0x7F, 0x7F, 0x7F, 0x3F
};
// Make - sign look like a segment
PROGMEM const unsigned char chr_f7s_2D[] =
{
0x7F, 0x7F, 0x45, 0x8A, 0x05, 0x8A, 0x05, 0x8A,
0x05, 0x8A, 0x7F, 0x7F, 0x7F, 0x2B
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x27, 0x8E, 0x0E,
0x92, 0x0A, 0x96, 0x09, 0x94, 0x0C, 0x90, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x47
};
PROGMEM const unsigned char chr_f7s_2E[] =

View File

@ -12,7 +12,7 @@
#ifdef LOAD_GFXFF
typedef struct { // Data stored PER GLYPH
uint16_t bitmapOffset; // Pointer into GFXfont->bitmap
uint32_t bitmapOffset; // Pointer into GFXfont->bitmap
uint8_t width, height; // Bitmap dimensions in pixels
uint8_t xAdvance; // Distance to advance cursor (x axis)
int8_t xOffset, yOffset; // Dist from cursor pos to UL corner
@ -21,7 +21,7 @@ typedef struct { // Data stored PER GLYPH
typedef struct { // Data stored for FONT AS A WHOLE:
uint8_t *bitmap; // Glyph bitmaps, concatenated
GFXglyph *glyph; // Glyph array
uint8_t first, last; // ASCII extents
uint16_t first, last; // ASCII extents
uint8_t yAdvance; // Newline distance (y axis)
} GFXfont;

102
README.md
View File

@ -1,12 +1,104 @@
# News
1. Sprites can now by pushed to the screen (or another Sprite) with a rotation angle. The new function is pushRotated(). Three new examples (Rotate_Sprite_1/2/3) have been added to show how the functions can be used to rotate text, images and to draw animated dials with moving needles.
2. A new TFT_eFEX support library has been created which includes extra functions such as drawing a BMP or Jpeg to the screen. This library will simplify the examples. It will be expanded at a future date to include meters, dials and GUI elements like progress bars, graphs and animated buttons:
https://github.com/Bodmer/TFT_eFEX
3. androdlang has published a really nice companion library to extend the graphics capabilities of TFT_eSPI, you can find this here:
https://github.com/androdlang/TFTShape
4. I have created a user updateable graphics extension library template that can be used to create your own graphics extensions. The Library contains examples and is commented so it should be clear what you need to do to add functions. You can find it here:
https://github.com/Bodmer/TFT_eFX
5. The capability to read from an ST7789V TFT with a single bidirectional SDA pin has been added. At the moment this **ONLY** works with an ESP32. It is enabled with a #define TFT_SDA_READ in the setup file.
6. ST7789V and ILI9341 displays are manufactured in two variants that have the red and blue pixels swapped, this is catered for by a new option in the setup file:
//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
# TFT_eSPI
An Arduino IDE compatible graphics and fonts library for ESP8266 processors with a driver for ILI9341, ILI9163, ST7735 and S6D02A1 based TFT displays that support SPI.
An Arduino IDE compatible graphics and fonts library for ESP8266 and ESP32 processors with drivers for ILI9341, ILI9163, ST7735, S6D02A1, ILI9481, ILI9486, ILI9488, HX8357D and ST7789 based TFT displays that support SPI. The library can be loaded using the Arduino IDE's Library Manager.
The library also supports TFT displays designed for the Raspberry Pi that are based on a ILI9486 driver chip with a 480 x 320 pixel screen. This display must be of the Waveshare design and use a 16 bit serial interface based on the 74HC04, 74HC4040 and 2 x 74HC4094 logic chips. A modification to these displays is possible (see mod image in Tools folder) to make many graphics functions much faster (e.g. 23ms to clear the screen, 1.2ms to draw a 72 pixel high numeral).
8 bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with an ESP32.
The library contains proportional fonts, different sizes can be enabled/disabled at compile time to optimise the use of FLASH memory. The library has been tested with the NodeMCU (ESP8266 based)
The library supports TFT displays designed for the Raspberry Pi that are based on a ILI9486 driver chip with a 480 x 320 pixel screen. This display must be of the Waveshare design and use a 16 bit serial interface based on the 74HC04, 74HC4040 and 2 x 74HC4094 logic chips. A modification to these displays is possible (see mod image in Tools folder) to make many graphics functions much faster (e.g. 23ms to clear the screen, 1.2ms to draw a 72 pixel high numeral).
The library is based on the Adafruit GFX and Adafruit driver libraries and the aim is to retain compatibility. Significant additions have been made to the library to boost the speed for ESP8266 processors (it is typically 3 to 10 times faster) and to add new features. The new graphics functions include different size proportional fonts and formatting features. There are a significant number of example sketches to demonstrate the different features.
Some displays permit the internal TFT screen RAM to be read. The library supports reading from ILI9341, ST7789 and ILI9488 SPI displays for the ESP32 and ESP8266. The 8 bit parallel displays used with the ESP32 can usually can be read too. The TFT_Screen_Capture example allows full screens to be captured and sent to a PC, this is handy to create program documentation.
Configuration of the library font selections, pins used to interface with the TFT and other features is made by editting the User_Setup.h file in the library folder. Fonts and features can easily be disabled by commenting out lines.
Support has been added recently for Waveshare 2 and 3 colour ePaper displays using full frame buffers. This addition is currently relatively immature and thus only one example has been provided. Further examples will be added soon.
The library includes a "Sprite" class, this enables flicker free updates of complex graphics. Direct writes to the TFT with graphics functions are still available, so existing sketches do not need to be changed.
A Sprite is notionally an invisible graphics screen that is kept in the processors RAM. Graphics can be drawn into the Sprite just as they can be drawn directly to the screen. Once the Sprite is completed it can be plotted onto the screen in any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. Sprites by default use 16 bit colours, the bit depth can be set to 8 bits (256 colours) , or 1 bit (any 2 colours) to reduce the RAM needed. On an ESP8266 the largest 16 bit colour Sprite that can be created is about 160x128 pixels, this consumes 40Kbytes of RAM. On an ESP32 the workspace RAM is more limited than the datsheet implies so a 16 bit colour Sprite is limited to about 200x200 pixels (~80Kbytes), an 8 bit sprite to 320x240 pixels (~76kbytes). A 1 bit per pixel Sprite requires only 9600 bytes for a full 320 x 240 screen buffer, this is ideal for supporting use with 2 colour bitmap fonts.
One or more sprites can be created, a sprite can be any pixel width and height, limited only by available RAM. The RAM needed for a 16 bit colour depth Sprite is (2 x width x height) bytes, for a Sprite with 8 bit colour depth the RAM needed is (width x height) bytes. Sprites can be created and deleted dynamically as needed in the sketch, this means RAM can be freed up after the Sprite has been plotted on the screen, more RAM intensive WiFi based code can then be run and normal graphics operations still work.
Drawing graphics into a sprite is very fast, for those familiar with the Adafruit "graphicstest" example, this whole test completes in 18ms in a 160x128 sprite. Examples of sprite use can be found in the "examples/Sprite" folder.
Sprites can be plotted to the TFT with one colour being specified as "transparent", see Transparent_Sprite_Demo example.
If an ESP32 board has SPIRAM (i.e. PSRAM) fitted then Sprites will use the PSRAM memory and large full screen buffer Sprites can be created. Full screen Sprites take longer to render (~45ms for a 320 x 240 16 bit Sprite), so bear that in mind.
The XPT2046 touch screen controller is supported. The SPI bus for the touch controller is shared with the TFT and only an additional chip select line is needed.
The Button class from Adafruit_GFX is incorporated, with the enhancement that the button labels can be in any font.
The library supports SPI overlap on the ESP8266 so the TFT screen can share MOSI, MISO and SCLK pins with the program FLASH, this frees up GPIO pins for other uses.
The library contains proportional fonts, different sizes can be enabled/disabled at compile time to optimise the use of FLASH memory. Anti-alased (smooth) font files in vlw format stored in SPIFFS are supported. Any 16 bit Unicode character can be included and rendered, this means many language specific characters can be rendered to the screen.
The library is based on the Adafruit GFX and Adafruit driver libraries and the aim is to retain compatibility. Significant additions have been made to the library to boost the speed for ESP8266/ESP32 processors (it is typically 3 to 10 times faster) and to add new features. The new graphics functions include different size proportional fonts and formatting features. There are lots of example sketches to demonstrate the different features and included functions.
Configuration of the library font selections, pins used to interface with the TFT and other features is made by editting the User_Setup.h file in the library folder, or by selecting your own configuration in the "User_Setup_Selet,h" file. Fonts and features can easily be enabled/disabled by commenting out lines.
# Anti-aliased Fonts
Anti-aliased (smooth) font files in "vlw" format are generated by the free [Processing IDE](https://processing.org/) using a sketch included in the library Tools folder. This sketch with the Processing IDE can be used to generate font files from your computer's font set or any TrueType (.ttf) font, the font file can include **any** combination of 16 bit Unicode characters. This means Greek, Japanese and any other UCS-2 glyphs can be used. Character arrays and Strings in UTF-8 format are supported.
Here is the Adafruit_GFX "FreeSans12pt" bitmap font compared to the same font drawn as anti-aliased:
![Smooth_font](https://i.imgur.com/gAeDPFY.png)
The smooth font example displays the following screen:
![Example](https://i.imgur.com/xJF0Oz7.png)
It would be possible to compress the vlw font files but the rendering performance to a TFT is still good when storing the font file(s) in SPIFFS.
Here is an example screenshot showing the anti-aliased Hiragana character Unicode block (0x3041 to 0x309F) in 24pt from the Microsoft Yahei font:
![Hiragana glyphs](https://i.imgur.com/jeXf2st.png)
# ESP32 with 8 bit Mcufriend UNO shields
The ESP32 board I have been using for testing has the following pinout:
![Example](https://i.imgur.com/bvM6leE.jpg)
UNO style boards with a Wemos R32(ESP32) label are also available at low cost with the same pin-out.
Unfortunately the typical UNO/mcufriend TFT display board maps LCD_RD, LCD_CS and LCD_RST signals to the ESP32 analogue pins 35, 34 and 36 which are input only. To solve this I linked in the 3 spare pins IO15, IO33 and IO32 by adding wires to the bottom of the board as follows:
IO15 wired to IO35
IO33 wired to IO34
IO32 wired to IO36
![Example](https://i.imgur.com/pUZn6lF.jpg)
If the display board is fitted with a resistance based touch screen then this can be used by performing the modifications described here and the fork of the Adafruit library:
https://github.com/s60sc/Adafruit_TouchScreen
# ePaper displays
The library was intended to support only TFT displays but using a Sprite as a 1 bit per pixel screen buffer permits support for the Waveshare 2 and 3 colour SPI ePaper displays. This addition to the library is experimental and only one example is provided. Further examples will be added.
![Example](https://i.imgur.com/L2tV129.jpg?1)

View File

@ -5,10 +5,14 @@ This library has been derived from the Adafruit_GFX and driver library with
further code from other authors.
It is not compatible with legacy versions of the IDE (e.g. 1.0.6 and
older. Use the latest 1.6.x version.
older. Use the latest version.
New functions have been added in particular it contains proportional fonts
in addition to the original Adafruit font.
Note: This version of the library might not be fully compatible with the original.
A sprite class has been added to aid the generation of flicker free complex
graphics.
Note: This version of the library might not be fully compatible with the
original.

27
TFT_Drivers/EPD_Defines.h Normal file
View File

@ -0,0 +1,27 @@
// Null set for ePaper
#define TFT_WIDTH 1000
#define TFT_HEIGHT 1000
#define TFT_INIT_DELAY 0
#define TFT_NOP 0x00
#define TFT_SWRST 0x00
#define TFT_CASET 0x00
#define TFT_PASET 0x00
#define TFT_RAMWR 0x00
#define TFT_RAMRD 0x00
#define TFT_IDXRD 0x00
#define TFT_MADCTL 0x00
#define TFT_MAD_MY 0x00
#define TFT_MAD_MX 0x00
#define TFT_MAD_MV 0x00
#define TFT_MAD_ML 0x00
#define TFT_MAD_BGR 0x00
#define TFT_MAD_MH 0x00
#define TFT_MAD_RGB 0x00
#define TFT_INVOFF 0x00
#define TFT_INVON 0x00

View File

@ -0,0 +1,86 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPar.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read
#define HX8357_NOP 0x00
#define HX8357_SWRESET 0x01
#define HX8357_RDDID 0x04
#define HX8357_RDDST 0x09
#define HX8357_RDPOWMODE 0x0A
#define HX8357_RDMADCTL 0x0B
#define HX8357_RDCOLMOD 0x0C
#define HX8357_RDDIM 0x0D
#define HX8357_RDDSDR 0x0F
#define HX8357_SLPIN 0x10
#define HX8357_SLPOUT 0x11
#define HX8357_INVOFF 0x20
#define HX8357_INVON 0x21
#define HX8357_DISPOFF 0x28
#define HX8357_DISPON 0x29
#define HX8357_CASET 0x2A
#define HX8357_PASET 0x2B
#define HX8357_RAMWR 0x2C
#define HX8357_RAMRD 0x2E
#define HX8357_TEON 0x35
#define HX8357_TEARLINE 0x44
#define HX8357_MADCTL 0x36
#define HX8357_COLMOD 0x3A
#define HX8357_SETOSC 0xB0
#define HX8357_SETPWR1 0xB1
#define HX8357_SETRGB 0xB3
#define HX8357D_SETCOM 0xB6
#define HX8357D_SETCYC 0xB4
#define HX8357D_SETC 0xB9
#define HX8357D_SETSTBA 0xC0
#define HX8357_SETPANEL 0xCC
#define HX8357D_SETGAMMA 0xE0

118
TFT_Drivers/HX8357D_Init.h Normal file
View File

@ -0,0 +1,118 @@
// This is the command sequence that initialises the HX8357D driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
// Configure HX8357D display
// setextc
writecommand(HX8357D_SETC);
writedata(0xFF);
writedata(0x83);
writedata(0x57);
delay(300);
// setRGB which also enables SDO
writecommand(HX8357_SETRGB);
writedata(0x80); //enable SDO pin!
// writedata(0x00); //disable SDO pin!
writedata(0x0);
writedata(0x06);
writedata(0x06);
writecommand(HX8357D_SETCOM);
writedata(0x25); // -1.52V
writecommand(HX8357_SETOSC);
writedata(0x68); // Normal mode 70Hz, Idle mode 55 Hz
writecommand(HX8357_SETPANEL); //Set Panel
writedata(0x05); // BGR, Gate direction swapped
writecommand(HX8357_SETPWR1);
writedata(0x00); // Not deep standby
writedata(0x15); //BT
writedata(0x1C); //VSPR
writedata(0x1C); //VSNR
writedata(0x83); //AP
writedata(0xAA); //FS
writecommand(HX8357D_SETSTBA);
writedata(0x50); //OPON normal
writedata(0x50); //OPON idle
writedata(0x01); //STBA
writedata(0x3C); //STBA
writedata(0x1E); //STBA
writedata(0x08); //GEN
writecommand(HX8357D_SETCYC);
writedata(0x02); //NW 0x02
writedata(0x40); //RTN
writedata(0x00); //DIV
writedata(0x2A); //DUM
writedata(0x2A); //DUM
writedata(0x0D); //GDON
writedata(0x78); //GDOFF
writecommand(HX8357D_SETGAMMA);
writedata(0x02);
writedata(0x0A);
writedata(0x11);
writedata(0x1d);
writedata(0x23);
writedata(0x35);
writedata(0x41);
writedata(0x4b);
writedata(0x4b);
writedata(0x42);
writedata(0x3A);
writedata(0x27);
writedata(0x1B);
writedata(0x08);
writedata(0x09);
writedata(0x03);
writedata(0x02);
writedata(0x0A);
writedata(0x11);
writedata(0x1d);
writedata(0x23);
writedata(0x35);
writedata(0x41);
writedata(0x4b);
writedata(0x4b);
writedata(0x42);
writedata(0x3A);
writedata(0x27);
writedata(0x1B);
writedata(0x08);
writedata(0x09);
writedata(0x03);
writedata(0x00);
writedata(0x01);
writecommand(HX8357_COLMOD);
writedata(0x55); // 16 bit
writecommand(HX8357_MADCTL);
writedata(0xC0);
writecommand(HX8357_TEON); // TE off
writedata(0x00);
writecommand(HX8357_TEARLINE); // tear line
writedata(0x00);
writedata(0x02);
writecommand(HX8357_SLPOUT); //Exit Sleep
delay(150);
writecommand(HX8357_DISPON); // display on
delay(50);
// End of HX8357D display configuration

View File

@ -0,0 +1,26 @@
// This is the command sequence that rotates the ILI9481 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_RGB);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_RGB);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
case 2: // Inverter portrait
writedata(TFT_MAD_RGB);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_RGB);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
}

View File

@ -7,8 +7,8 @@
switch (rotation) {
case 0:
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 0;
@ -16,8 +16,8 @@
break;
case 1:
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 0;
@ -25,8 +25,8 @@
break;
case 2:
writedata(TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 32;
@ -34,8 +34,8 @@
break;
case 3:
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
#ifdef CGRAM_OFFSET
colstart = 32;
rowstart = 0;

View File

@ -51,6 +51,16 @@
#define TFT_MAD_MH 0x04
#define TFT_MAD_RGB 0x00
#ifdef TFT_RGB_ORDER
#if (TFT_RGB_ORDER == 1)
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21

View File

@ -55,7 +55,11 @@
writedata(0x86); //--
writecommand(ILI9341_MADCTL); // Memory Access Control
writedata(0x48);
#ifdef M5STACK
writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode)
#else
writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); // Rotation 0 (portrait mode)
#endif
writecommand(ILI9341_PIXFMT);
writedata(0x55);
@ -116,4 +120,5 @@
spi_begin();
writecommand(ILI9341_DISPON); //Display on
}

View File

@ -6,45 +6,77 @@
writecommand(TFT_MADCTL);
switch (rotation) {
case 0:
writedata(TFT_MAD_MX | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
#ifdef M5STACK
writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_width;
_height = _init_height;
break;
case 1:
writedata(TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
#ifdef M5STACK
writedata(TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_height;
_height = _init_width;
break;
case 2:
writedata(TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
#ifdef M5STACK
writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_width;
_height = _init_height;
break;
case 3:
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
#ifdef M5STACK
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_height;
_height = _init_width;
break;
// These next rotations are for bottum up BMP drawing
// These next rotations are for bottom up BMP drawing
case 4:
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
#ifdef M5STACK
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_width;
_height = _init_height;
break;
case 5:
writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
#ifdef M5STACK
writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_height;
_height = _init_width;
break;
case 6:
writedata(TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
#ifdef M5STACK
writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_COLOR_ORDER);
#endif
_width = _init_width;
_height = _init_height;
break;
case 7:
writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
#ifdef M5STACK
writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER);
#else
writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
#endif
_width = _init_height;
_height = _init_width;
break;
}
}

View File

@ -0,0 +1,42 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read

View File

@ -0,0 +1,77 @@
// This is the command sequence that initialises the ILI9481 driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
// Configure ILI9481 display
writecommand(TFT_SLPOUT);
delay(20);
writecommand(0xD0);
writedata(0x07);
writedata(0x42);
writedata(0x18);
writecommand(0xD1);
writedata(0x00);
writedata(0x07);
writedata(0x10);
writecommand(0xD2);
writedata(0x01);
writedata(0x02);
writecommand(0xC0);
writedata(0x10);
writedata(0x3B);
writedata(0x00);
writedata(0x02);
writedata(0x11);
writecommand(0xC5);
writedata(0x03);
writecommand(0xC8);
writedata(0x00);
writedata(0x32);
writedata(0x36);
writedata(0x45);
writedata(0x06);
writedata(0x16);
writedata(0x37);
writedata(0x75);
writedata(0x77);
writedata(0x54);
writedata(0x0C);
writedata(0x00);
writecommand(TFT_MADCTL);
writedata(0x0A);
writecommand(0x3A);
writedata(0x55);
writecommand(TFT_CASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0x3F);
writecommand(TFT_PASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0xDF);
delay(120);
writecommand(TFT_DISPON);
delay(25);
// End of ILI9481 display configuration

View File

@ -0,0 +1,27 @@
// This is the command sequence that rotates the ILI9481 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_BGR | TFT_MAD_SS);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
case 2: // Inverter portrait
writedata(TFT_MAD_BGR | TFT_MAD_GS);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_MV | TFT_MAD_BGR | TFT_MAD_SS | TFT_MAD_GS);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
}

View File

@ -4,7 +4,7 @@
#define TFT_HEIGHT 480
// For Raspberry Pi ILI9486 only with a modified board to add a write strobe:
#ifdef TFT_WR
#if defined (TFT_WR) && defined (RPI_ILI9486_DRIVER)
#define RPI_WRITE_STROBE
#endif

View File

@ -5,43 +5,43 @@
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_BGR | TFT_MAD_MX);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_BGR | TFT_MAD_MV);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 2: // Inverter portrait
writedata( TFT_MAD_BGR | TFT_MAD_MY);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 4: // Portrait
writedata(TFT_MAD_BGR | TFT_MAD_MX | TFT_MAD_MY);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 5: // Landscape (Portrait + 90)
writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MX);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 6: // Inverter portrait
writedata( TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 7: // Inverted landscape
writedata(TFT_MAD_BGR | TFT_MAD_MV | TFT_MAD_MY);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
}

View File

@ -0,0 +1,42 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read

View File

@ -0,0 +1,99 @@
// This is the command sequence that initialises the ILI9488 driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
// Configure ILI9488 display
writecommand(0xE0); // Positive Gamma Control
writedata(0x00);
writedata(0x03);
writedata(0x09);
writedata(0x08);
writedata(0x16);
writedata(0x0A);
writedata(0x3F);
writedata(0x78);
writedata(0x4C);
writedata(0x09);
writedata(0x0A);
writedata(0x08);
writedata(0x16);
writedata(0x1A);
writedata(0x0F);
writecommand(0XE1); // Negative Gamma Control
writedata(0x00);
writedata(0x16);
writedata(0x19);
writedata(0x03);
writedata(0x0F);
writedata(0x05);
writedata(0x32);
writedata(0x45);
writedata(0x46);
writedata(0x04);
writedata(0x0E);
writedata(0x0D);
writedata(0x35);
writedata(0x37);
writedata(0x0F);
writecommand(0XC0); // Power Control 1
writedata(0x17);
writedata(0x15);
writecommand(0xC1); // Power Control 2
writedata(0x41);
writecommand(0xC5); // VCOM Control
writedata(0x00);
writedata(0x12);
writedata(0x80);
writecommand(TFT_MADCTL); // Memory Access Control
writedata(0x48); // MX, BGR
writecommand(0x3A); // Pixel Interface Format
#if defined (ESP32_PARALLEL)
writedata(0x55); // 16 bit colour for parallel
#else
writedata(0x66); // 18 bit colour for SPI
#endif
writecommand(0xB0); // Interface Mode Control
writedata(0x00);
writecommand(0xB1); // Frame Rate Control
writedata(0xA0);
writecommand(0xB4); // Display Inversion Control
writedata(0x02);
writecommand(0xB6); // Display Function Control
writedata(0x02);
writedata(0x02);
writedata(0x3B);
writecommand(0xB7); // Entry Mode Set
writedata(0xC6);
writecommand(0xF7); // Adjust Control 3
writedata(0xA9);
writedata(0x51);
writedata(0x2C);
writedata(0x82);
writecommand(TFT_SLPOUT); //Exit Sleep
delay(120);
writecommand(TFT_DISPON); //Display on
delay(25);
// End of ILI9488 display configuration

View File

@ -0,0 +1,27 @@
// This is the command sequence that rotates the ILI9488 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_MX | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
case 2: // Inverter portrait
writedata(TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
}

View File

@ -0,0 +1,42 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read

80
TFT_Drivers/R61581_Init.h Normal file
View File

@ -0,0 +1,80 @@
// This is the command sequence that initialises the R61581 driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
// Configure R61581 display
writecommand(TFT_SLPOUT);
delay(20);
writecommand(0xB0);
writedata(0x00);
writecommand(0xD0);
writedata(0x07);
writedata(0x42);
writedata(0x18);
writecommand(0xD1);
writedata(0x00);
writedata(0x07);
writedata(0x10);
writecommand(0xD2);
writedata(0x01);
writedata(0x02);
writecommand(0xC0);
writedata(0x12);
writedata(0x3B);
writedata(0x00);
writedata(0x02);
writedata(0x11);
writecommand(0xC5);
writedata(0x03);
writecommand(0xC8);
writedata(0x00);
writedata(0x32);
writedata(0x36);
writedata(0x45);
writedata(0x06);
writedata(0x16);
writedata(0x37);
writedata(0x75);
writedata(0x77);
writedata(0x54);
writedata(0x0C);
writedata(0x00);
writecommand(TFT_MADCTL);
writedata(0x0A);
writecommand(0x3A);
writedata(0x55);
writecommand(TFT_CASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0x3F);
writecommand(TFT_PASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0xDF);
delay(120);
writecommand(TFT_DISPON);
delay(25);
// End of R61581 display configuration

View File

@ -0,0 +1,27 @@
// This is the command sequence that rotates the R61581 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_BGR | TFT_MAD_MX);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
case 2: // Inverter portrait
writedata(TFT_MAD_BGR | TFT_MAD_GS);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_MV | TFT_MAD_BGR | TFT_MAD_MX | TFT_MAD_GS);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
}

View File

@ -0,0 +1,42 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#define TFT_WIDTH 320
#define TFT_HEIGHT 480
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read

View File

@ -0,0 +1,77 @@
// This is the command sequence that initialises the RM68140 driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
// Configure RM68140 display
writecommand(TFT_SLPOUT);
delay(20);
writecommand(0xD0);
writedata(0x07);
writedata(0x42);
writedata(0x18);
writecommand(0xD1);
writedata(0x00);
writedata(0x07);
writedata(0x10);
writecommand(0xD2);
writedata(0x01);
writedata(0x02);
writecommand(0xC0);
writedata(0x10);
writedata(0x3B);
writedata(0x00);
writedata(0x02);
writedata(0x11);
writecommand(0xC5);
writedata(0x03);
writecommand(0xC8);
writedata(0x00);
writedata(0x32);
writedata(0x36);
writedata(0x45);
writedata(0x06);
writedata(0x16);
writedata(0x37);
writedata(0x75);
writedata(0x77);
writedata(0x54);
writedata(0x0C);
writedata(0x00);
writecommand(TFT_MADCTL);
writedata(0x0A);
writecommand(0x3A);
writedata(0x55);
writecommand(TFT_CASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0x3F);
writecommand(TFT_PASET);
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0xDF);
delay(120);
writecommand(TFT_DISPON);
delay(25);
// End of RM68140 display configuration

View File

@ -0,0 +1,44 @@
// This is the command sequence that rotates the RM68140 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
writedata(TFT_MAD_BGR);
writecommand(0xB6);
writedata(0);
writedata(0x22);
writedata(0x3B);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 1: // Landscape (Portrait + 90)
writedata(TFT_MAD_MV | TFT_MAD_BGR);
writecommand(0xB6);
writedata(0);
writedata(0x02);
writedata(0x3B);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
case 2: // Inverter portrait
writedata(TFT_MAD_BGR);
writecommand(0xB6);
writedata(0);
writedata(0x42);
writedata(0x3B);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
break;
case 3: // Inverted landscape
writedata(TFT_MAD_MV | TFT_MAD_BGR);
writecommand(0xB6);
writedata(0);
writedata(0x62);
writedata(0x3B);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
break;
}

View File

@ -7,22 +7,22 @@
switch (rotation) {
case 0:
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 1:
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 2:
writedata(TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 3:
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
}

View File

@ -9,13 +9,15 @@
// Enumerate the different configurations
#define INITR_GREENTAB 0x0
#define INITR_REDTAB 0x1
#define INITR_BLACKTAB 0x2
#define INITR_GREENTAB2 0x3 // Use if you get random pixels on two edges of green tab display
#define INITR_GREENTAB3 0x4 // Use if you get random pixels on edge(s) of 128x128 screen
#define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1
#define INITB 0xB
#define INITR_GREENTAB 0x0
#define INITR_REDTAB 0x1
#define INITR_BLACKTAB 0x2 // Display with no offsets
#define INITR_GREENTAB2 0x3 // Use if you get random pixels on two edges of green tab display
#define INITR_GREENTAB3 0x4 // Use if you get random pixels on edge(s) of 128x128 screen
#define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1
#define INITR_GREENTAB160x80 0x6 // Use if you only get part of 128x128 screen in rotation 0 & 1
#define INITR_REDTAB160x80 0x7 // Added for https://www.aliexpress.com/item/ShengYang-1pcs-IPS-0-96-inch-7P-SPI-HD-65K-Full-Color-OLED-Module-ST7735-Drive/32918394604.html
#define INITB 0xB
// Setup the tab color that will be used by the library setRotation() and setup command list
@ -38,7 +40,15 @@
#define TAB_COLOUR INITR_GREENTAB128
#define CGRAM_OFFSET
#elif defined (ST6635_REDTAB)
#elif defined (ST7735_GREENTAB160x80)
#define TAB_COLOUR INITR_GREENTAB160x80
#define CGRAM_OFFSET
#elif defined (ST7735_REDTAB160x80)
#define TAB_COLOUR INITR_REDTAB160x80
#define CGRAM_OFFSET
#elif defined (ST7735_REDTAB)
#define TAB_COLOUR INITR_REDTAB
#elif defined (ST7735_BLACKTAB)

View File

@ -24,7 +24,7 @@
0x03, // 3 lines back porch
10, // 10 ms delay
ST7735_MADCTL , 1 , // 5: Memory access ctrl (directions), 1 arg:
0x08, // Row addr/col addr, bottom to top refresh
0x40, // Row addr/col addr, bottom to top refresh
ST7735_DISSET5, 2 , // 6: Display settings #5, 2 args, no delay:
0x15, // 1 clk cycle nonoverlap, 2 cycle gate
// rise, 3 cycle osc equalize
@ -140,8 +140,6 @@
ST7735_DISPON , TFT_INIT_DELAY, // 4: Main screen turn on, no args w/delay
100 }; // 100 ms delay
tabcolor = TAB_COLOUR;
if (tabcolor == INITB)
{
commandList(Bcmd);
@ -175,6 +173,19 @@
colstart = 0;
rowstart = 32;
}
else if (tabcolor == INITR_GREENTAB160x80)
{
commandList(Rcmd2green);
writecommand(TFT_INVON);
colstart = 26;
rowstart = 1;
}
else if (tabcolor == INITR_REDTAB160x80)
{
commandList(Rcmd2green);
colstart = 24;
rowstart = 0;
}
else if (tabcolor == INITR_REDTAB)
{
commandList(Rcmd2red);

View File

@ -20,11 +20,21 @@
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_BGR);
colstart = 0;
rowstart = 32;
} else {
} else if(tabcolor == INITR_GREENTAB160x80) {
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_BGR);
colstart = 26;
rowstart = 1;
} else if(tabcolor == INITR_REDTAB160x80) {
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MH | TFT_MAD_BGR);
colstart = 24;
rowstart = 0;
} else if(tabcolor == INITB) {
writedata(TFT_MAD_MX | TFT_MAD_RGB);
} else {
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR);
}
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 1:
if (tabcolor == INITR_BLACKTAB) {
@ -41,11 +51,21 @@
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR);
colstart = 32;
rowstart = 0;
} else {
} else if(tabcolor == INITR_GREENTAB160x80) {
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR);
colstart = 1;
rowstart = 26;
} else if(tabcolor == INITR_REDTAB160x80) {
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR);
colstart = 0;
rowstart = 24;
} else if(tabcolor == INITB) {
writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_RGB);
} else {
writedata(TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_BGR);
}
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 2:
if (tabcolor == INITR_BLACKTAB) {
@ -62,11 +82,21 @@
writedata(TFT_MAD_BGR);
colstart = 0;
rowstart = 0;
} else {
} else if(tabcolor == INITR_GREENTAB160x80) {
writedata(TFT_MAD_BGR);
colstart = 0;
rowstart = 0;
} else if(tabcolor == INITR_REDTAB160x80) {
writedata(TFT_MAD_BGR);
colstart = 24;
rowstart = 0;
} else if(tabcolor == INITB) {
writedata(TFT_MAD_MY | TFT_MAD_RGB);
} else {
writedata(TFT_MAD_BGR);
}
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 3:
if (tabcolor == INITR_BLACKTAB) {
@ -83,33 +113,43 @@
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
colstart = 0;
rowstart = 0;
} else {
} else if(tabcolor == INITR_GREENTAB160x80) {
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
colstart = 1;
rowstart = 26;
} else if(tabcolor == INITR_REDTAB160x80) {
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
colstart = 0;
rowstart = 24;
} else if(tabcolor == INITB) {
writedata(TFT_MAD_MV | TFT_MAD_RGB);
} else {
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR);
}
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
// These next rotations are for bottum up BMP drawing
/* case 4:
writedata(ST7735_TFT_MAD_MX | ST7735_TFT_MAD_MY | ST7735_TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 5:
writedata(ST7735_TFT_MAD_MV | ST7735_TFT_MAD_MX | ST7735_TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
case 6:
writedata(ST7735_TFT_MAD_BGR);
_width = TFT_WIDTH;
_height = TFT_HEIGHT;
_width = _init_width;
_height = _init_height;
break;
case 7:
writedata(ST7735_TFT_MAD_MY | ST7735_TFT_MAD_MV | ST7735_TFT_MAD_BGR);
_width = TFT_HEIGHT;
_height = TFT_WIDTH;
_width = _init_height;
_height = _init_width;
break;
*/
}
}

View File

@ -0,0 +1,143 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#ifndef TFT_WIDTH
#define TFT_WIDTH 240
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 320
#endif
#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240)
#define CGRAM_OFFSET
#endif
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_NORON 0x13
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_COLMOD 0x3A
// Flags for TFT_MADCTL
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#ifdef TFT_RGB_ORDER
#if (TFT_RGB_ORDER == 1)
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#else
#ifdef CGRAM_OFFSET
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#endif
#endif
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read
#define ST_CMD_DELAY 0x80 // special signifier for command lists
#define ST7789_240x240_XSTART 0
#define ST7789_240x240_YSTART 0
// ST7789 specific commands used in init
#define ST7789_NOP 0x00
#define ST7789_SWRESET 0x01
#define ST7789_RDDID 0x04
#define ST7789_RDDST 0x09
#define ST7789_RDDPM 0x0A // Read display power mode
#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL
#define ST7789_RDD_COLMOD 0x0C // Read display pixel format
#define ST7789_RDDIM 0x0D // Read display image mode
#define ST7789_RDDSM 0x0E // Read display signal mode
#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V)
#define ST7789_SLPIN 0x10
#define ST7789_SLPOUT 0x11
#define ST7789_PTLON 0x12
#define ST7789_NORON 0x13
#define ST7789_INVOFF 0x20
#define ST7789_INVON 0x21
#define ST7789_GAMSET 0x26 // Gamma set
#define ST7789_DISPOFF 0x28
#define ST7789_DISPON 0x29
#define ST7789_CASET 0x2A
#define ST7789_RASET 0x2B
#define ST7789_RAMWR 0x2C
#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors
#define ST7789_RAMRD 0x2E
#define ST7789_PTLAR 0x30
#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V)
#define ST7789_TEOFF 0x34 // Tearing effect line off
#define ST7789_TEON 0x35 // Tearing effect line on
#define ST7789_MADCTL 0x36 // Memory data access control
#define ST7789_IDMOFF 0x38 // Idle mode off
#define ST7789_IDMON 0x39 // Idle mode on
#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V)
#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V)
#define ST7789_COLMOD 0x3A
#define ST7789_RAMCTRL 0xB0 // RAM control
#define ST7789_RGBCTRL 0xB1 // RGB control
#define ST7789_PORCTRL 0xB2 // Porch control
#define ST7789_FRCTRL1 0xB3 // Frame rate control
#define ST7789_PARCTRL 0xB5 // Partial mode control
#define ST7789_GCTRL 0xB7 // Gate control
#define ST7789_GTADJ 0xB8 // Gate on timing adjustment
#define ST7789_DGMEN 0xBA // Digital gamma enable
#define ST7789_VCOMS 0xBB // VCOMS setting
#define ST7789_LCMCTRL 0xC0 // LCM control
#define ST7789_IDSET 0xC1 // ID setting
#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable
#define ST7789_VRHS 0xC3 // VRH set
#define ST7789_VDVSET 0xC4 // VDV setting
#define ST7789_VCMOFSET 0xC5 // VCOMS offset set
#define ST7789_FRCTR2 0xC6 // FR Control 2
#define ST7789_CABCCTRL 0xC7 // CABC control
#define ST7789_REGSEL1 0xC8 // Register value section 1
#define ST7789_REGSEL2 0xCA // Register value section 2
#define ST7789_PWMFRSEL 0xCC // PWM frequency selection
#define ST7789_PWCTRL1 0xD0 // Power control 1
#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output
#define ST7789_CMD2EN 0xDF // Command 2 enable
#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control
#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control
#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red
#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue
#define ST7789_GATECTRL 0xE4 // Gate control
#define ST7789_SPI2EN 0xE7 // SPI2 enable
#define ST7789_PWCTRL2 0xE8 // Power control 2
#define ST7789_EQCTRL 0xE9 // Equalize time control
#define ST7789_PROMCTRL 0xEC // Program control
#define ST7789_PROMEN 0xFA // Program mode enable
#define ST7789_NVMSET 0xFC // NVM setting
#define ST7789_PROMACT 0xFE // Program action

View File

@ -0,0 +1,22 @@
// This is the command sequence that initialises the ST7789 driver
// Configure ST7789 display
{
static const uint8_t PROGMEM
st7789[] = {
8,
TFT_SLPOUT, TFT_INIT_DELAY, 255,
TFT_COLMOD, 1+TFT_INIT_DELAY, 0x55, 10,
TFT_MADCTL, 1, 0x00,
TFT_CASET, 4, 0x00, 0x00, 0x00, 0xF0,
TFT_PASET, 4, 0x00, 0x00, 0x00, 0xF0,
TFT_INVON, TFT_INIT_DELAY, 10,
TFT_NORON, TFT_INIT_DELAY, 10,
TFT_DISPON, TFT_INIT_DELAY, 255
};
commandList(st7789);
}
// End of ST7789 display configuration

View File

@ -0,0 +1,48 @@
// This is the command sequence that rotates the ST7789 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 0;
#endif
writedata(TFT_MAD_COLOR_ORDER);
_width = _init_width;
_height = _init_height;
break;
case 1: // Landscape (Portrait + 90)
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 0;
#endif
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
_width = _init_height;
_height = _init_width;
break;
case 2: // Inverter portrait
#ifdef CGRAM_OFFSET
colstart = 0;
rowstart = 80;
#endif
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
_width = _init_width;
_height = _init_height;
break;
case 3: // Inverted landscape
#ifdef CGRAM_OFFSET
colstart = 80;
rowstart = 0;
#endif
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
_width = _init_height;
_height = _init_width;
break;
}

View File

@ -0,0 +1,139 @@
// Change the width and height if required (defined in portrait mode)
// or use the constructor to over-ride defaults
#ifndef TFT_WIDTH
#define TFT_WIDTH 240
#endif
#ifndef TFT_HEIGHT
#define TFT_HEIGHT 320
#endif
#if (TFT_HEIGHT == 240) && (TFT_WIDTH == 240)
#define CGRAM_OFFSET
#endif
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked
// Generic commands used by TFT_eSPI.cpp
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_SLPIN 0x10
#define TFT_SLPOUT 0x11
#define TFT_NORON 0x13
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
#define TFT_DISPOFF 0x28
#define TFT_DISPON 0x29
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_MADCTL 0x36
#define TFT_COLMOD 0x3A
// Flags for TFT_MADCTL
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_RGB 0x00
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_SS 0x02
#define TFT_MAD_GS 0x01
#ifdef TFT_RGB_ORDER
#if (TFT_RGB_ORDER == 1)
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#endif
#else
#ifdef CGRAM_OFFSET
#define TFT_MAD_COLOR_ORDER TFT_MAD_BGR
#else
#define TFT_MAD_COLOR_ORDER TFT_MAD_RGB
#endif
#endif
#define TFT_IDXRD 0x00 // ILI9341 only, indexed control register read
// ST7789 specific commands used in init
#define ST7789_NOP 0x00
#define ST7789_SWRESET 0x01
#define ST7789_RDDID 0x04
#define ST7789_RDDST 0x09
#define ST7789_RDDPM 0x0A // Read display power mode
#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL
#define ST7789_RDD_COLMOD 0x0C // Read display pixel format
#define ST7789_RDDIM 0x0D // Read display image mode
#define ST7789_RDDSM 0x0E // Read display signal mode
#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V)
#define ST7789_SLPIN 0x10
#define ST7789_SLPOUT 0x11
#define ST7789_PTLON 0x12
#define ST7789_NORON 0x13
#define ST7789_INVOFF 0x20
#define ST7789_INVON 0x21
#define ST7789_GAMSET 0x26 // Gamma set
#define ST7789_DISPOFF 0x28
#define ST7789_DISPON 0x29
#define ST7789_CASET 0x2A
#define ST7789_RASET 0x2B
#define ST7789_RAMWR 0x2C
#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors
#define ST7789_RAMRD 0x2E
#define ST7789_PTLAR 0x30
#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V)
#define ST7789_TEOFF 0x34 // Tearing effect line off
#define ST7789_TEON 0x35 // Tearing effect line on
#define ST7789_MADCTL 0x36 // Memory data access control
#define ST7789_IDMOFF 0x38 // Idle mode off
#define ST7789_IDMON 0x39 // Idle mode on
#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V)
#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V)
#define ST7789_COLMOD 0x3A
#define ST7789_RAMCTRL 0xB0 // RAM control
#define ST7789_RGBCTRL 0xB1 // RGB control
#define ST7789_PORCTRL 0xB2 // Porch control
#define ST7789_FRCTRL1 0xB3 // Frame rate control
#define ST7789_PARCTRL 0xB5 // Partial mode control
#define ST7789_GCTRL 0xB7 // Gate control
#define ST7789_GTADJ 0xB8 // Gate on timing adjustment
#define ST7789_DGMEN 0xBA // Digital gamma enable
#define ST7789_VCOMS 0xBB // VCOMS setting
#define ST7789_LCMCTRL 0xC0 // LCM control
#define ST7789_IDSET 0xC1 // ID setting
#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable
#define ST7789_VRHS 0xC3 // VRH set
#define ST7789_VDVSET 0xC4 // VDV setting
#define ST7789_VCMOFSET 0xC5 // VCOMS offset set
#define ST7789_FRCTR2 0xC6 // FR Control 2
#define ST7789_CABCCTRL 0xC7 // CABC control
#define ST7789_REGSEL1 0xC8 // Register value section 1
#define ST7789_REGSEL2 0xCA // Register value section 2
#define ST7789_PWMFRSEL 0xCC // PWM frequency selection
#define ST7789_PWCTRL1 0xD0 // Power control 1
#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output
#define ST7789_CMD2EN 0xDF // Command 2 enable
#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control
#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control
#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red
#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue
#define ST7789_GATECTRL 0xE4 // Gate control
#define ST7789_SPI2EN 0xE7 // SPI2 enable
#define ST7789_PWCTRL2 0xE8 // Power control 2
#define ST7789_EQCTRL 0xE9 // Equalize time control
#define ST7789_PROMCTRL 0xEC // Program control
#define ST7789_PROMEN 0xFA // Program mode enable
#define ST7789_NVMSET 0xFC // NVM setting
#define ST7789_PROMACT 0xFE // Program action

124
TFT_Drivers/ST7789_Init.h Normal file
View File

@ -0,0 +1,124 @@
// This is the command sequence that initialises the ST7789 driver
//
// This setup information uses simple 8 bit SPI writecommand() and writedata() functions
//
// See ST7735_Setup.h file for an alternative format
{
writecommand(ST7789_SLPOUT); // Sleep out
delay(120);
writecommand(ST7789_NORON); // Normal display mode on
//------------------------------display and color format setting--------------------------------//
writecommand(ST7789_MADCTL);
//writedata(0x00);
writedata(TFT_MAD_COLOR_ORDER);
// JLX240 display datasheet
writecommand(0xB6);
writedata(0x0A);
writedata(0x82);
writecommand(ST7789_COLMOD);
writedata(0x55);
delay(10);
//--------------------------------ST7789V Frame rate setting----------------------------------//
writecommand(ST7789_PORCTRL);
writedata(0x0c);
writedata(0x0c);
writedata(0x00);
writedata(0x33);
writedata(0x33);
writecommand(ST7789_GCTRL); // Voltages: VGH / VGL
writedata(0x35);
//---------------------------------ST7789V Power setting--------------------------------------//
writecommand(ST7789_VCOMS);
writedata(0x28); // JLX240 display datasheet
writecommand(ST7789_LCMCTRL);
writedata(0x0C);
writecommand(ST7789_VDVVRHEN);
writedata(0x01);
writedata(0xFF);
writecommand(ST7789_VRHS); // voltage VRHS
writedata(0x10);
writecommand(ST7789_VDVSET);
writedata(0x20);
writecommand(ST7789_FRCTR2);
writedata(0x0f);
writecommand(ST7789_PWCTRL1);
writedata(0xa4);
writedata(0xa1);
//--------------------------------ST7789V gamma setting---------------------------------------//
writecommand(ST7789_PVGAMCTRL);
writedata(0xd0);
writedata(0x00);
writedata(0x02);
writedata(0x07);
writedata(0x0a);
writedata(0x28);
writedata(0x32);
writedata(0x44);
writedata(0x42);
writedata(0x06);
writedata(0x0e);
writedata(0x12);
writedata(0x14);
writedata(0x17);
writecommand(ST7789_NVGAMCTRL);
writedata(0xd0);
writedata(0x00);
writedata(0x02);
writedata(0x07);
writedata(0x0a);
writedata(0x28);
writedata(0x31);
writedata(0x54);
writedata(0x47);
writedata(0x0e);
writedata(0x1c);
writedata(0x17);
writedata(0x1b);
writedata(0x1e);
writecommand(ST7789_INVON);
writecommand(ST7789_CASET); // Column address set
writedata(0x00);
writedata(0x00);
writedata(0x00);
writedata(0xE5); // 239
writecommand(ST7789_RASET); // Row address set
writedata(0x00);
writedata(0x00);
writedata(0x01);
writedata(0x3F); // 319
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
spi_end();
delay(120);
spi_begin();
writecommand(ST7789_DISPON); //Display on
delay(120);
#ifdef TFT_BL
// Turn on the back-light LED
digitalWrite(TFT_BL, HIGH);
pinMode(TFT_BL, OUTPUT);
#endif
}

View File

@ -0,0 +1,80 @@
// This is the command sequence that rotates the ST7789 driver coordinate frame
writecommand(TFT_MADCTL);
rotation = m % 4;
switch (rotation) {
case 0: // Portrait
#ifdef CGRAM_OFFSET
if (_init_width == 135)
{
colstart = 52;
rowstart = 40;
}
else
{
colstart = 0;
rowstart = 0;
}
#endif
writedata(TFT_MAD_COLOR_ORDER);
_width = _init_width;
_height = _init_height;
break;
case 1: // Landscape (Portrait + 90)
#ifdef CGRAM_OFFSET
if (_init_width == 135)
{
colstart = 40;
rowstart = 53;
}
else
{
colstart = 0;
rowstart = 0;
}
#endif
writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER);
_width = _init_height;
_height = _init_width;
break;
case 2: // Inverter portrait
#ifdef CGRAM_OFFSET
if (_init_width == 135)
{
colstart = 53;
rowstart = 40;
}
else
{
colstart = 0;
rowstart = 80;
}
#endif
writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
_width = _init_width;
_height = _init_height;
break;
case 3: // Inverted landscape
#ifdef CGRAM_OFFSET
if (_init_width == 135)
{
colstart = 40;
rowstart = 52;
}
else
{
colstart = 80;
rowstart = 0;
}
#endif
writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER);
_width = _init_height;
_height = _init_width;
break;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,9 @@
/***************************************************
Arduino TFT graphics library targetted at ESP8266
based boards. (ESP32 support is planned!)
This library has been derived from the Adafruit_GFX
library and the associated driver library. See text
at the end of this file.
Arduino TFT graphics library targeted at ESP8266
and ESP32 based boards.
This is a standalone library that contains the
hardware driver, the graphics funtions and the
hardware driver, the graphics functions and the
proportional fonts.
The larger fonts are Run Length Encoded to reduce
@ -19,17 +15,47 @@
#ifndef _TFT_eSPIH_
#define _TFT_eSPIH_
#define TFT_ESPI_VERSION "1.4.20"
//#define ESP32 //Just used to test ESP32 options
// Include header file that defines the fonts loaded, the TFT drivers
// available and the pins to be used
#include <User_Setup_Select.h>
#ifndef TAB_COLOUR
#define TAB_COLOUR 0
#endif
// If the frequency is not defined, set a default
#ifndef SPI_FREQUENCY
#define SPI_FREQUENCY 20000000
#endif
// If the frequency is not defined, set a default
#ifndef SPI_READ_FREQUENCY
#define SPI_READ_FREQUENCY SPI_FREQUENCY
#endif
#if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER)
#define TFT_SPI_MODE SPI_MODE3
#else
#define TFT_SPI_MODE SPI_MODE0
#endif
// If the frequency is not defined, set a default
#ifndef SPI_TOUCH_FREQUENCY
#define SPI_TOUCH_FREQUENCY 2500000
#endif
// Use GLCD font in error case where user requests a smooth font file
// that does not exist (this is a temporary fix to stop ESP32 reboot)
#ifdef SMOOTH_FONT
#ifndef LOAD_GLCD
#define LOAD_GLCD
#endif
#endif
// Only load the fonts defined in User_Setup.h (to save space)
// Set flag so RLE rendering code is optionally compiled
#ifdef LOAD_GLCD
@ -64,6 +90,12 @@
#ifndef LOAD_RLE
#define LOAD_RLE
#endif
#elif defined LOAD_FONT8N
#define LOAD_FONT8
#include <Fonts/Font72x53rle.h>
#ifndef LOAD_RLE
#define LOAD_RLE
#endif
#endif
#include <Arduino.h>
@ -73,49 +105,309 @@
#include <SPI.h>
#if defined (ESP8266) && defined (D0_USED_FOR_DC)
#define DC_C digitalWrite(TFT_DC, LOW)
#define DC_D digitalWrite(TFT_DC, HIGH)
#elif defined (ESP32)
//#define DC_C digitalWrite(TFT_DC, HIGH); GPIO.out_w1tc = (1 << TFT_DC)//digitalWrite(TFT_DC, LOW)
//#define DC_D digitalWrite(TFT_DC, LOW); GPIO.out_w1ts = (1 << TFT_DC)//digitalWrite(TFT_DC, HIGH)
#define DC_C GPIO.out_w1ts = (1 << TFT_DC); GPIO.out_w1ts = (1 << TFT_DC); GPIO.out_w1tc = (1 << TFT_DC)
#define DC_D GPIO.out_w1tc = (1 << TFT_DC); GPIO.out_w1ts = (1 << TFT_DC)
#ifdef ESP32
#include "soc/spi_reg.h"
#ifdef USE_HSPI_PORT
#define SPI_PORT HSPI
#else
#define SPI_PORT VSPI
#endif
#endif
#ifdef SMOOTH_FONT
// Call up the SPIFFS FLASH filing system for the anti-aliased fonts
#define FS_NO_GLOBALS
#include <FS.h>
#ifdef ESP32
#include "SPIFFS.h"
#endif
#endif
#ifndef TFT_DC
#define DC_C // No macro allocated so it generates no code
#define DC_D // No macro allocated so it generates no code
#else
#define DC_C GPOC=dcpinmask
#define DC_D GPOS=dcpinmask
#if defined (ESP8266) && (TFT_DC == 16)
#define DC_C digitalWrite(TFT_DC, LOW)
#define DC_D digitalWrite(TFT_DC, HIGH)
#elif defined (ESP32)
#if defined (ESP32_PARALLEL)
#define DC_C GPIO.out_w1tc = (1 << TFT_DC)
#define DC_D GPIO.out_w1ts = (1 << TFT_DC)
#else
#if TFT_DC >= 32
#ifdef RPI_ILI9486_DRIVER // RPi display needs a slower DC change
#define DC_C GPIO.out1_w1ts.val = (1 << (TFT_DC - 32)); \
GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))
#define DC_D GPIO.out1_w1tc.val = (1 << (TFT_DC - 32)); \
GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))
#else
#define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1tc.val = (1 << (TFT_DC - 32))
#define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_DC - 32))
#endif
#else
#if TFT_DC >= 0
#ifdef RPI_ILI9486_DRIVER // RPi display needs a slower DC change
#define DC_C GPIO.out_w1ts = (1 << TFT_DC); \
GPIO.out_w1tc = (1 << TFT_DC)
#define DC_D GPIO.out_w1tc = (1 << TFT_DC); \
GPIO.out_w1ts = (1 << TFT_DC)
#else
#define DC_C GPIO.out_w1tc = (1 << TFT_DC)//;GPIO.out_w1tc = (1 << TFT_DC)
#define DC_D GPIO.out_w1ts = (1 << TFT_DC)//;GPIO.out_w1ts = (1 << TFT_DC)
#endif
#else
#define DC_C
#define DC_D
#endif
#endif
#endif
#else
#define DC_C GPOC=dcpinmask
#define DC_D GPOS=dcpinmask
#endif
#endif
#if defined (TFT_SPI_OVERLAP)
#undef TFT_CS
#define SPI1U_WRITE (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD)
#define SPI1U_READ (SPIUMOSI | SPIUSSE | SPIUCSSETUP | SPIUCSHOLD | SPIUDUPLEX)
#else
#ifdef ESP8266
#define SPI1U_WRITE (SPIUMOSI | SPIUSSE)
#define SPI1U_READ (SPIUMOSI | SPIUSSE | SPIUDUPLEX)
#endif
#endif
#ifndef TFT_CS
#define CS_L // No macro allocated so it generates no code
#define CS_H // No macro allocated so it generates no code
#else
#if defined (ESP8266) && defined (D0_USED_FOR_CS)
#if defined (ESP8266) && (TFT_CS == 16)
#define CS_L digitalWrite(TFT_CS, LOW)
#define CS_H digitalWrite(TFT_CS, HIGH)
#elif defined (ESP32)
//#define CS_L digitalWrite(TFT_CS, HIGH); GPIO.out_w1tc = (1 << TFT_CS)//digitalWrite(TFT_CS, LOW)
//#define CS_H digitalWrite(TFT_CS, LOW); GPIO.out_w1ts = (1 << TFT_CS)//digitalWrite(TFT_CS, HIGH)
#define CS_L GPIO.out_w1ts = (1 << TFT_CS);GPIO.out_w1tc = (1 << TFT_CS)
#define CS_H GPIO.out_w1ts = (1 << TFT_CS)
#if defined (ESP32_PARALLEL)
#define CS_L // The TFT CS is set permanently low during init()
#define CS_H
#else
#if TFT_CS >= 32
#ifdef RPI_ILI9486_DRIVER // RPi display needs a slower CS change
#define CS_L GPIO.out1_w1ts.val = (1 << (TFT_CS - 32)); \
GPIO.out1_w1tc.val = (1 << (TFT_CS - 32))
#define CS_H GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); \
GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))
#else
#define CS_L GPIO.out1_w1tc.val = (1 << (TFT_CS - 32)); GPIO.out1_w1tc.val = (1 << (TFT_CS - 32))
#define CS_H GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))//;GPIO.out1_w1ts.val = (1 << (TFT_CS - 32))
#endif
#else
#if TFT_CS >= 0
#ifdef RPI_ILI9486_DRIVER // RPi display needs a slower CS change
#define CS_L GPIO.out_w1ts = (1 << TFT_CS); GPIO.out_w1tc = (1 << TFT_CS)
#define CS_H GPIO.out_w1tc = (1 << TFT_CS); GPIO.out_w1ts = (1 << TFT_CS)
#else
#define CS_L GPIO.out_w1tc = (1 << TFT_CS);GPIO.out_w1tc = (1 << TFT_CS)
#define CS_H GPIO.out_w1ts = (1 << TFT_CS)//;GPIO.out_w1ts = (1 << TFT_CS)
#endif
#else
#define CS_L
#define CS_H
#endif
#endif
#endif
#else
#define CS_L GPOC=cspinmask
#define CS_H GPOS=cspinmask
#endif
#endif
// Use single register write for CS_L and DC_C if pins are both in range 0-31
#ifdef ESP32
#ifdef TFT_CS
#if (TFT_CS >= 0) && (TFT_CS < 32) && (TFT_DC >= 0) && (TFT_DC < 32)
#ifdef RPI_ILI9486_DRIVER // RPi display needs a slower CD and DC change
#define CS_L_DC_C GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC)); \
GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC))
#else
#define CS_L_DC_C GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC)); GPIO.out_w1tc = ((1 << TFT_CS) | (1 << TFT_DC))
#endif
#else
#define CS_L_DC_C CS_L; DC_C
#endif
#else
#define CS_L_DC_C CS_L; DC_C
#endif
#else // ESP8266
#define CS_L_DC_C CS_L; DC_C
#endif
// chip select signal for touchscreen
#ifndef TOUCH_CS
#define T_CS_L // No macro allocated so it generates no code
#define T_CS_H // No macro allocated so it generates no code
#else
#define T_CS_L digitalWrite(TOUCH_CS, LOW)
#define T_CS_H digitalWrite(TOUCH_CS, HIGH)
#endif
#ifdef TFT_WR
#if defined (ESP32)
#define WR_L GPIO.out_w1tc = (1 << TFT_WR)
//digitalWrite(TFT_WR, LOW)
#define WR_H GPIO.out_w1ts = (1 << TFT_WR)
//digitalWrite(TFT_WR, HIGH)
#else
#define WR_L GPOC=wrpinmask
#define WR_H GPOS=wrpinmask
#endif
#endif
#ifdef ESP8266
// Concatenate two 16 bit values for the SPI 32 bit register write
#define SPI_32(H,L) ( (H)<<16 | (L) )
#define COL_32(H,L) ( (H)<<16 | (L) )
#else
#if defined (ESP32_PARALLEL) || defined (ILI9488_DRIVER)
#define SPI_32(H,L) ( (H)<<16 | (L) )
#else
#define SPI_32(H,L) ( ((H)<<8 | (H)>>8) | (((L)<<8 | (L)>>8)<<16 ) )
#endif
// Swap byte order for concatenated 16 bit colors
// AB CD -> DCBA for 32 bit register write
#define COL_32(H,L) ( ((H)<<8 | (H)>>8) | (((L)<<8 | (L)>>8)<<16 ) )
#endif
#if defined (ESP32) && defined (ESP32_PARALLEL)
// Mask for the 8 data bits to set pin directions
#define dir_mask ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7))
// Data bits and the write line are cleared to 0 in one step
#define clr_mask (dir_mask | (1 << TFT_WR))
// A lookup table is used to set the different bit patterns, this uses 1kByte of RAM
#define set_mask(C) xset_mask[C] // 63fps Sprite rendering test 33% faster, graphicstest only 1.8% faster than shifting in real time
// Real-time shifting alternative to above to save 1KByte RAM, 47 fps Sprite rendering test
/*#define set_mask(C) ((C&0x80)>>7)<<TFT_D7 | ((C&0x40)>>6)<<TFT_D6 | ((C&0x20)>>5)<<TFT_D5 | ((C&0x10)>>4)<<TFT_D4 | \
((C&0x08)>>3)<<TFT_D3 | ((C&0x04)>>2)<<TFT_D2 | ((C&0x02)>>1)<<TFT_D1 | ((C&0x01)>>0)<<TFT_D0
//*/
// Write 8 bits to TFT
#define tft_Write_8(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)C); WR_H
// Write 16 bits to TFT
#ifdef PSEUDO_8_BIT
#define tft_Write_16(C) WR_L;GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)(C >> 0)); WR_H
#else
#define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)(C >> 8)); WR_H; \
GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)(C >> 0)); WR_H
#endif
// 16 bit write with swapped bytes
#define tft_Write_16S(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 0)); WR_H; \
GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 8)); WR_H
// Write 32 bits to TFT
#define tft_Write_32(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 24)); WR_H; \
GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 16)); WR_H; \
GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 8)); WR_H; \
GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (C >> 0)); WR_H
#ifdef TFT_RD
#define RD_L GPIO.out_w1tc = (1 << TFT_RD)
//#define RD_L digitalWrite(TFT_WR, LOW)
#define RD_H GPIO.out_w1ts = (1 << TFT_RD)
//#define RD_H digitalWrite(TFT_WR, HIGH)
#endif
#elif defined (ILI9488_DRIVER) // 16 bit colour converted to 3 bytes for 18 bit RGB
// Write 8 bits to TFT
#define tft_Write_8(C) spi.transfer(C)
// Convert 16 bit colour to 18 bit and write in 3 bytes
#define tft_Write_16(C) spi.transfer((C & 0xF800)>>8); \
spi.transfer((C & 0x07E0)>>3); \
spi.transfer((C & 0x001F)<<3)
// Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes
#define tft_Write_16S(C) spi.transfer(C & 0xF8); \
spi.transfer((C & 0xE000)>>11 | (C & 0x07)<<5); \
spi.transfer((C & 0x1F00)>>5)
// Write 32 bits to TFT
#define tft_Write_32(C) spi.write32(C)
#elif defined (RPI_ILI9486_DRIVER)
#define tft_Write_8(C) spi.transfer(0); spi.transfer(C)
#define tft_Write_16(C) spi.write16(C)
#define tft_Write_16S(C) spi.write16(C<<8 | C>>8)
#define tft_Write_32(C) spi.write32(C)
#elif defined ESP8266
#define tft_Write_8(C) spi.write(C)
#define tft_Write_16(C) spi.write16(C)
#define tft_Write_32(C) spi.write32(C)
#else // ESP32 using SPI with 16 bit color display
// ESP32 low level SPI writes for 8, 16 and 32 bit values
// to avoid the function call overhead
// Write 8 bits
#define tft_Write_8(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 8-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR);
// Write 16 bits with corrected endianess for 16 bit colours
#define tft_Write_16(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 16-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), C<<8 | C>>8); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR);
// Write 16 bits
#define tft_Write_16S(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 16-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR);
// Write 32 bits
#define tft_Write_32(C) \
WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), 32-1); \
WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), C); \
SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \
while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR);
#endif
#if !defined (ESP32_PARALLEL)
// Read from display using SPI or software SPI
#if defined (ESP8266) && defined (TFT_SDA_READ)
// Use a bit banged function call for ESP8266 and bi-directional SDA pin
#define SCLK_L GPOC=sclkpinmask
#define SCLK_H GPOS=sclkpinmask
#else
// Use a SPI read transfer
#define tft_Read_8() spi.transfer(0)
#endif
// Make sure TFT_MISO is defined if not used to avoid an error message
#ifndef TFT_MISO
#define TFT_MISO -1
#endif
#endif
#ifdef LOAD_GFXFF
// We can include all the free fonts and they will only be built into
// the sketch if they are used
@ -227,18 +519,89 @@
#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */
#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */
#define TFT_WHITE 0xFFFF /* 255, 255, 255 */
#define TFT_ORANGE 0xFD20 /* 255, 165, 0 */
#define TFT_GREENYELLOW 0xAFE5 /* 173, 255, 47 */
#define TFT_PINK 0xF81F
#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */
#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */
#define TFT_PINK 0xFC9F
// Next is a special 16 bit colour value that encodes to 8 bits
// and will then decode back to the same 16 bit value.
// Convenient for 8 bit and 16 bit transparent sprites.
#define TFT_TRANSPARENT 0x0120
// Swap any type
template <typename T> static inline void
swap_coord(T& a, T& b) { T t = a; a = b; b = t; }
// This is a structure to conveniently hold infomation on the default fonts
#ifndef min
// Return minimum of two numbers, may already be defined
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
// This structure allows sketches to retrieve the user setup parameters at runtime
// by calling getSetup(), zero impact on code size unless used, mainly for diagnostics
typedef struct
{
String version = TFT_ESPI_VERSION;
int16_t esp;
uint8_t trans;
uint8_t serial;
uint8_t overlap;
#if defined (ESP32)
#if defined (USE_HSPI_PORT)
uint8_t port = HSPI;
#else
uint8_t port = VSPI;
#endif
#endif
uint16_t tft_driver; // Hexadecimal code
uint16_t tft_width; // Rotation 0 width and height
uint16_t tft_height;
uint8_t r0_x_offset; // Offsets, not all used yet
uint8_t r0_y_offset;
uint8_t r1_x_offset;
uint8_t r1_y_offset;
uint8_t r2_x_offset;
uint8_t r2_y_offset;
uint8_t r3_x_offset;
uint8_t r3_y_offset;
int8_t pin_tft_mosi;
int8_t pin_tft_miso;
int8_t pin_tft_clk;
int8_t pin_tft_cs;
int8_t pin_tft_dc;
int8_t pin_tft_rd;
int8_t pin_tft_wr;
int8_t pin_tft_rst;
int8_t pin_tft_d0;
int8_t pin_tft_d1;
int8_t pin_tft_d2;
int8_t pin_tft_d3;
int8_t pin_tft_d4;
int8_t pin_tft_d5;
int8_t pin_tft_d6;
int8_t pin_tft_d7;
int8_t pin_tch_cs;
int16_t tft_spi_freq;
int16_t tft_rd_freq;
int16_t tch_spi_freq;
} setup_t;
// This is a structure to conveniently hold information on the default fonts
// Stores pointer to font character image address table, width table and height
// Create a null set in case some fonts not used (to prevent crash)
const uint8_t widtbl_null[1] = {0};
PROGMEM const uint8_t chr_null[1] = {0};
PROGMEM const uint8_t* const chrtbl_null[1] = {chr_null};
typedef struct {
const uint8_t *chartbl;
const uint8_t *widthtbl;
@ -248,50 +611,52 @@ typedef struct {
// Now fill the structure
const PROGMEM fontinfo fontdata [] = {
{ 0, 0, 0, 0 },
#ifdef LOAD_GLCD
{ (const uint8_t *)font, widtbl_null, 0, 0 },
#else
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#endif
// GLCD font (Font 1) does not have all parameters
{ 0, 0, 8, 7 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 8, 7 },
#ifdef LOAD_FONT2
{ (const uint8_t *)chrtbl_f16, widtbl_f16, chr_hgt_f16, baseline_f16},
#else
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#endif
// Font 3 current unused
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#ifdef LOAD_FONT4
{ (const uint8_t *)chrtbl_f32, widtbl_f32, chr_hgt_f32, baseline_f32},
#else
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#endif
// Font 5 current unused
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#ifdef LOAD_FONT6
{ (const uint8_t *)chrtbl_f64, widtbl_f64, chr_hgt_f64, baseline_f64},
#else
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#endif
#ifdef LOAD_FONT7
{ (const uint8_t *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s, baseline_f7s},
#else
{ 0, 0, 0, 0 },
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 },
#endif
#ifdef LOAD_FONT8
{ (const uint8_t *)chrtbl_f72, widtbl_f72, chr_hgt_f72, baseline_f72}
#else
{ 0, 0, 0, 0 }
{ (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }
#endif
};
// Class functions and variables
class TFT_eSPI : public Print {
@ -299,27 +664,31 @@ class TFT_eSPI : public Print {
TFT_eSPI(int16_t _W = TFT_WIDTH, int16_t _H = TFT_HEIGHT);
void init(void), begin(void); // Same - begin included for backwards compatibility
void init(uint8_t tc = TAB_COLOUR), begin(uint8_t tc = TAB_COLOUR); // Same - begin included for backwards compatibility
void drawPixel(uint32_t x, uint32_t y, uint32_t color);
// These are virtual so the TFT_eSprite class can override them with sprite specific functions
virtual void drawPixel(int32_t x, int32_t y, uint32_t color),
drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size),
drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color),
drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color),
drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color),
fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color);
void drawChar(int32_t x, int32_t y, unsigned char c, uint32_t color, uint32_t bg, uint8_t font),
setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1),
virtual int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font),
drawChar(uint16_t uniCode, int32_t x, int32_t y),
height(void),
width(void);
// The TFT_eSprite class inherits the following functions
void setWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye),
pushColor(uint16_t color),
pushColor(uint16_t color, uint16_t len),
pushColors(uint16_t *data, uint8_t len),
pushColor(uint16_t color, uint32_t len),
pushColors(uint16_t *data, uint32_t len, bool swap = true), // With byte swap option
pushColors(uint8_t *data, uint32_t len),
fillScreen(uint32_t color),
fillScreen(uint32_t color);
drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color),
drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color),
drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color),
drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color),
fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color),
void drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color),
drawRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color),
fillRoundRect(int32_t x0, int32_t y0, int32_t w, int32_t h, int32_t radius, uint32_t color),
@ -331,21 +700,24 @@ class TFT_eSPI : public Print {
fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color),
fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t cornername, int32_t delta, uint32_t color),
drawEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color),
fillEllipse(int16_t x0, int16_t y0, int16_t rx, int16_t ry, uint16_t color),
drawEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color),
fillEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color),
drawTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color),
fillTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color),
drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color),
drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor),
setBitmapColor(uint16_t fgcolor, uint16_t bgcolor), // For 1bpp sprites
setPivot(int16_t x, int16_t y),
setCursor(int16_t x, int16_t y),
setCursor(int16_t x, int16_t y, uint8_t font),
setTextColor(uint16_t color),
setTextColor(uint16_t fgcolor, uint16_t bgcolor),
setTextSize(uint8_t size),
setTextWrap(boolean wrap),
setTextWrap(boolean wrapX, boolean wrapY = false),
setTextDatum(uint8_t datum),
setTextPadding(uint16_t x_width),
@ -359,121 +731,192 @@ class TFT_eSPI : public Print {
spiwrite(uint8_t),
writecommand(uint8_t c),
writedata(uint8_t d),
commandList(const uint8_t *addr);
uint8_t readcommand8(uint8_t cmd_function, uint8_t index);
uint16_t readcommand16(uint8_t cmd_function, uint8_t index);
uint32_t readcommand32(uint8_t cmd_function, uint8_t index);
uint8_t readcommand8(uint8_t cmd_function, uint8_t index = 0);
uint16_t readcommand16(uint8_t cmd_function, uint8_t index = 0);
uint32_t readcommand32(uint8_t cmd_function, uint8_t index = 0);
// Read the colour of a pixel at x,y and return value in 565 format
uint16_t readPixel(int32_t x0, int32_t y0);
// The next functions can be used as a pair to copy screen blocks (or horizontal/vertical lines) to another location
// Read a block of pixels to a data buffer, buffer is 16 bit and the array size must be at least w * h
void readRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data);
void readRect(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data);
// Write a block of pixels to the screen
void pushRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint16_t *data);
void pushRect(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data);
// These are used to render images or sprites stored in RAM arrays
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data);
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data, uint16_t transparent);
// These are used to render images stored in FLASH (PROGMEM)
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data, uint16_t transparent);
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data);
// These are used by pushSprite for 1 and 8 bit colours
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data, bool bpp8 = true);
void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data, uint8_t transparent, bool bpp8 = true);
// Swap the byte order for pushImage() - corrects endianness
void setSwapBytes(bool swap);
bool getSwapBytes(void);
// This next function has been used successfully to dump the TFT screen to a PC for documentation purposes
// It reads a screen area and returns the RGB 8 bit colour values of each pixel
// Set w and h to 1 to read 1 pixel's colour. The data buffer must be at least w * h * 3 bytes
void readRectRGB(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_t *data);
uint8_t getRotation(void);
uint8_t getRotation(void),
getTextDatum(void),
color16to8(uint16_t color565); // Convert 16 bit colour to 8 bits
int16_t getCursorX(void),
getCursorY(void);
int16_t getPivotX(void),
getPivotY(void);
uint16_t fontsLoaded(void),
color565(uint8_t r, uint8_t g, uint8_t b);
color565(uint8_t red, uint8_t green, uint8_t blue), // Convert 8 bit red, green and blue to 16 bits
color8to16(uint8_t color332); // Convert 8 bit colour to 16 bits
int16_t drawNumber(long long_num, int32_t poX, int32_t poY, uint8_t font),
drawNumber(long long_num, int32_t poX, int32_t poY),
drawFloat(float floatNumber, uint8_t decimal, int32_t poX, int32_t poY, uint8_t font),
drawFloat(float floatNumber, uint8_t decimal, int32_t poX, int32_t poY),
int16_t drawChar(unsigned int uniCode, int x, int y, int font),
drawChar(unsigned int uniCode, int x, int y),
drawNumber(long long_num,int poX, int poY, int font),
drawNumber(long long_num,int poX, int poY),
drawFloat(float floatNumber,int decimal,int poX, int poY, int font),
drawFloat(float floatNumber,int decimal,int poX, int poY),
// Handle char arrays
drawString(const char *string, int poX, int poY, int font),
drawString(const char *string, int poX, int poY),
drawCentreString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString()
drawRightString(const char *string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString()
drawString(const char *string, int32_t poX, int32_t poY, uint8_t font),
drawString(const char *string, int32_t poX, int32_t poY),
drawCentreString(const char *string, int32_t dX, int32_t poY, uint8_t font), // Deprecated, use setTextDatum() and drawString()
drawRightString(const char *string, int32_t dX, int32_t poY, uint8_t font), // Deprecated, use setTextDatum() and drawString()
// Handle String type
drawString(const String& string, int poX, int poY, int font),
drawString(const String& string, int poX, int poY),
drawCentreString(const String& string, int dX, int poY, int font), // Deprecated, use setTextDatum() and drawString()
drawRightString(const String& string, int dX, int poY, int font); // Deprecated, use setTextDatum() and drawString()
int16_t height(void),
width(void),
textWidth(const char *string, int font),
drawString(const String& string, int32_t poX, int32_t poY, uint8_t font),
drawString(const String& string, int32_t poX, int32_t poY),
drawCentreString(const String& string, int32_t dX, int32_t poY, uint8_t font), // Deprecated, use setTextDatum() and drawString()
drawRightString(const String& string, int32_t dX, int32_t poY, uint8_t font); // Deprecated, use setTextDatum() and drawString()
int16_t textWidth(const char *string, uint8_t font),
textWidth(const char *string),
textWidth(const String& string, int font),
textWidth(const String& string, uint8_t font),
textWidth(const String& string),
fontHeight(int16_t font);
fontHeight(int16_t font),
fontHeight(void);
void setAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye);
void setAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h);
virtual size_t write(uint8_t);
// Compatibility additions
void startWrite(void); // Begin SPI transaction
void writeColor(uint16_t color, uint32_t len); // Write colours without transaction overhead
void endWrite(void); // End SPI transaction
private:
uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining);
uint16_t decodeUTF8(uint8_t c);
size_t write(uint8_t);
inline void spi_begin() __attribute__((always_inline));
inline void spi_end() __attribute__((always_inline));
#ifdef TFT_SDA_READ
#if defined (ESP8266) && defined (TFT_SDA_READ)
uint8_t tft_Read_8(void);
#endif
void begin_SDA_Read(void);
void end_SDA_Read(void);
#endif
void readAddrWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye);
uint8_t tabcolor,
colstart = 0, rowstart = 0; // some ST7735 displays need this changed
// Set or get an arbitrary library attribute or configuration option
void setAttribute(uint8_t id = 0, uint8_t a = 0);
uint8_t getAttribute(uint8_t id = 0);
volatile uint32_t *dcport, *csport;//, *mosiport, *clkport, *rsport;
void getSetup(setup_t& tft_settings); // Sketch provides the instance to populate
uint32_t cspinmask, dcpinmask, wrpinmask;//, mosipinmask, clkpinmask;
static SPIClass& getSPIinstance(void);
uint32_t lastColor = 0xFFFF;
int32_t cursor_x, cursor_y, padX;
uint32_t textcolor, textbgcolor;
protected:
uint32_t bitmap_fg, bitmap_bg;
int32_t cursor_x, cursor_y, win_xe, win_ye, padX;
uint32_t _width, _height; // Display w/h as modified by current rotation
uint32_t textcolor, textbgcolor, fontsloaded, addr_row, addr_col;
uint8_t glyph_ab, // glyph height above baseline
glyph_bb, // glyph height below baseline
textfont, // Current selected font
uint8_t textfont, // Current selected font
textsize, // Current font size multiplier
textdatum, // Text reference datum
rotation; // Display rotation (0-3)
boolean textwrap; // If set, 'wrap' text at right edge of display
int16_t _xpivot; // x pivot point coordinate
int16_t _ypivot; // x pivot point coordinate
boolean locked, inTransaction; // Transaction and mutex lock flags for ESP32
uint8_t decoderState = 0; // UTF8 decoder state
uint16_t decoderBuffer; // Unicode code-point buffer
private:
inline void spi_begin() __attribute__((always_inline));
inline void spi_end() __attribute__((always_inline));
inline void spi_begin_read() __attribute__((always_inline));
inline void spi_end_read() __attribute__((always_inline));
void readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h);
uint8_t tabcolor,
colstart = 0, rowstart = 0; // some ST7735 displays need this changed
volatile uint32_t *dcport, *csport;
uint32_t cspinmask, dcpinmask, wrpinmask, sclkpinmask;
#if defined(ESP32_PARALLEL)
uint32_t xclr_mask, xdir_mask, xset_mask[256];
#endif
uint32_t lastColor = 0xFFFF;
protected:
int32_t win_xe, win_ye;
int32_t _init_width, _init_height; // Display w/h as input, used by setRotation()
int32_t _width, _height; // Display w/h as modified by current rotation
int32_t addr_row, addr_col;
uint32_t fontsloaded;
uint8_t glyph_ab, // glyph delta Y (height) above baseline
glyph_bb; // glyph delta Y (height) below baseline
bool isDigits; // adjust bounding box for numbers to reduce visual jiggling
bool textwrapX, textwrapY; // If set, 'wrap' text at right and optionally bottom edge of display
bool _swapBytes; // Swap the byte order for TFT pushImage()
bool locked, inTransaction; // Transaction and mutex lock flags for ESP32
bool _booted; // init() or begin() has already run once
bool _cp437; // If set, use correct CP437 charset (default is ON)
bool _utf8; // If set, use UTF-8 decoder in print stream 'write()' function (default ON)
uint32_t _lastColor; // Buffered value of last colour used
#ifdef LOAD_GFXFF
GFXfont
*gfxFont;
GFXfont *gfxFont;
#endif
};
// Load the Touch extension
#ifdef TOUCH_CS
#include "Extensions/Touch.h"
#endif
/***************************************************
// Load the Anti-aliased font extension
#ifdef SMOOTH_FONT
#include "Extensions/Smooth_font.h"
#endif
ORIGINAL LIBRARY HEADER
}; // End of class TFT_eSPI
This is our library for the Adafruit ILI9341 Breakout and Shield
----> http://www.adafruit.com/products/1651
// Load the Button Class
#include "Extensions/Button.h"
Check out the links above for our tutorials and wiring diagrams
These displays use SPI to communicate, 4 or 5 pins are required to
interface (RST is optional)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
// Load the Sprite Class
#include "Extensions/Sprite.h"
Written by Limor Fried/Ladyada for Adafruit Industries.
MIT license, all text above must be included in any redistribution
Updated with new functions by Bodmer 14/4/15
****************************************************/
#endif

View File

@ -0,0 +1,523 @@
// This is a Processing sketch, see https://processing.org/ to download the IDE
// Select the font, size and character ranges in the user configuration section
// of this sketch, which starts at line 120. Instructions start at line 50.
/*
Software License Agreement (FreeBSD License)
Copyright (c) 2018 Bodmer (https://github.com/Bodmer)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of the FreeBSD Project.
*/
////////////////////////////////////////////////////////////////////////////////////////////////
// This is a processing sketch to create font files for the TFT_eSPI library:
// https://github.com/Bodmer/TFT_eSPI
// Coded by Bodmer January 2018, updated 10/2/19
// Version 0.8
// >>>>>>>>>>>>>>>>>>>> INSTRUCTIONS <<<<<<<<<<<<<<<<<<<<
// See comments below in code for specifying the font parameters (point size,
// unicode blocks to include etc). Ranges of characters (glyphs) and specific
// individual glyphs can be included in the created "*.vlw" font file.
// Created fonts are saved in the sketches "FontFiles" folder. Press Ctrl+K to
// see that folder location.
// 16 bit Unicode point codes in the range 0x0000 - 0xFFFF are supported.
// Codes 0-31 are control codes such as "tab" and "carraige return" etc.
// and 32 is a "space", these should NOT be included.
// The sketch will convert True Type (a .ttf or .otf file) file stored in the
// sketches "Data" folder as well as your computers' system fonts.
// To maximise rendering performance and the memory consumed only include the characters
// you will use. Characters at the start of the file will render faster than those at
// the end due to the buffering and file seeking overhead.
// The inclusion of "non-existant" characters in a font may give unpredicatable results
// when rendering with the TFT_eSPI library. The Processing sketch window that pops up
// to show the font characters will print "boxes" (also known as Tofu!) for non existant
// characters.
// Once created the files must be loaded into the ESP32 or ESP8266 SPIFFS memory
// using the Arduino IDE plugin detailed here:
// https://github.com/esp8266/arduino-esp8266fs-plugin
// https://github.com/me-no-dev/arduino-esp32fs-plugin
// When the sketch is run it will generate a file called "System_Font_List.txt" in the
// sketch "FontFiles" folder, press Ctrl+K to see it. Open the file in a text editor to
// view it. This list provides the font reference number needed below to locate that
// font on your system.
// The sketch also lists all the available system fonts to the console, you can increase
// the console line count (in preferences.txt) to stop some fonts scrolling out of view.
// See link in File>Preferences to locate "preferences.txt" file. You must close
// Processing then edit the file lines. If Processing is not closed first then the
// edits will be overwritten by defaults! Edit "preferences.txt" as follows for
// 3000 lines, then save, then run Processing again:
// console.length=3000; // Line 4 in file
// console.scrollback.lines=3000; // Line 7 in file
// Useful links:
/*
https://en.wikipedia.org/wiki/Unicode_font
https://www.gnu.org/software/freefont/
https://www.gnu.org/software/freefont/sources/
https://www.gnu.org/software/freefont/ranges/
http://savannah.gnu.org/projects/freefont/
http://www.google.com/get/noto/
https://github.com/Bodmer/TFT_eSPI
https://github.com/esp8266/arduino-esp8266fs-plugin
https://github.com/me-no-dev/arduino-esp32fs-plugin
>>>>>>>>>>>>>>>>>>>> END OF INSTRUCTIONS <<<<<<<<<<<<<<<<<<<< */
import java.awt.Desktop; // Required to allow sketch to open file windows
////////////////////////////////////////////////////////////////////////////////////////////////
// >>>>>>>>>> USER CONFIGURED PARAMETERS START HERE <<<<<<<<<<
// Use font number or name, -1 for fontNumber means use fontName below, a value >=0 means use system font number from list.
// When the sketch is run it will generate a file called "systemFontList.txt" in the sketch folder, press Ctrl+K to see it.
// Open the "systemFontList.txt" in a text editor to view the font files and reference numbers for your system.
int fontNumber = -1; // << Use [Number] in brackets from the fonts listed.
// OR use font name for ttf files placed in the "Data" folder or the font number seen in IDE Console for system fonts
// the font numbers are listed when the sketch is run.
// | 1 2 | Maximum filename size for SPIFFS is 31 including leading /
// 1234567890123456789012345 and added point size and .vlw extension, so max is 25
String fontName = "Final-Frontier"; // Manually crop the filename length later after creation if needed
// Note: SPIFFS does NOT accept underscore in a filename!
String fontType = ".ttf";
//String fontType = ".otf";
// Define the font size in points for the TFT_eSPI font file
int fontSize = 20;
// Font size to use in the Processing sketch display window that pops up (can be different to above)
int displayFontSize = 28;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Next we specify which unicode blocks from the the Basic Multilingual Plane (BMP) are included in the final font file. //
// Note: The ttf/otf font file MAY NOT contain all possible Unicode characters, refer to the fonts online documentation. //
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static final int[] unicodeBlocks = {
// The list below has been created from the table here: https://en.wikipedia.org/wiki/Unicode_block
// Remove // at start of lines below to include that unicode block, different code ranges can also be specified by
// editting the start and end-of-range values. Multiple lines from the list below can be included, limited only by
// the final font file size!
// Block range, //Block name, Code points, Assigned characters, Scripts
// First, last, //Range is inclusive of first and last codes
0x0021, 0x007E, //Basic Latin, 128, 128, Latin (52 characters), Common (76 characters)
//0x0080, 0x00FF, //Latin-1 Supplement, 128, 128, Latin (64 characters), Common (64 characters)
//0x0100, 0x017F, //Latin Extended-A, 128, 128, Latin
//0x0180, 0x024F, //Latin Extended-B, 208, 208, Latin
//0x0250, 0x02AF, //IPA Extensions, 96, 96, Latin
//0x02B0, 0x02FF, //Spacing Modifier Letters, 80, 80, Bopomofo (2 characters), Latin (14 characters), Common (64 characters)
//0x0300, 0x036F, //Combining Diacritical Marks, 112, 112, Inherited
//0x0370, 0x03FF, //Greek and Coptic, 144, 135, Coptic (14 characters), Greek (117 characters), Common (4 characters)
//0x0400, 0x04FF, //Cyrillic, 256, 256, Cyrillic (254 characters), Inherited (2 characters)
//0x0500, 0x052F, //Cyrillic Supplement, 48, 48, Cyrillic
//0x0530, 0x058F, //Armenian, 96, 89, Armenian (88 characters), Common (1 character)
//0x0590, 0x05FF, //Hebrew, 112, 87, Hebrew
//0x0600, 0x06FF, //Arabic, 256, 255, Arabic (237 characters), Common (6 characters), Inherited (12 characters)
//0x0700, 0x074F, //Syriac, 80, 77, Syriac
//0x0750, 0x077F, //Arabic Supplement, 48, 48, Arabic
//0x0780, 0x07BF, //Thaana, 64, 50, Thaana
//0x07C0, 0x07FF, //NKo, 64, 59, Nko
//0x0800, 0x083F, //Samaritan, 64, 61, Samaritan
//0x0840, 0x085F, //Mandaic, 32, 29, Mandaic
//0x0860, 0x086F, //Syriac Supplement, 16, 11, Syriac
//0x08A0, 0x08FF, //Arabic Extended-A, 96, 73, Arabic (72 characters), Common (1 character)
//0x0900, 0x097F, //Devanagari, 128, 128, Devanagari (124 characters), Common (2 characters), Inherited (2 characters)
//0x0980, 0x09FF, //Bengali, 128, 95, Bengali
//0x0A00, 0x0A7F, //Gurmukhi, 128, 79, Gurmukhi
//0x0A80, 0x0AFF, //Gujarati, 128, 91, Gujarati
//0x0B00, 0x0B7F, //Oriya, 128, 90, Oriya
//0x0B80, 0x0BFF, //Tamil, 128, 72, Tamil
//0x0C00, 0x0C7F, //Telugu, 128, 96, Telugu
//0x0C80, 0x0CFF, //Kannada, 128, 88, Kannada
//0x0D00, 0x0D7F, //Malayalam, 128, 117, Malayalam
//0x0D80, 0x0DFF, //Sinhala, 128, 90, Sinhala
//0x0E00, 0x0E7F, //Thai, 128, 87, Thai (86 characters), Common (1 character)
//0x0E80, 0x0EFF, //Lao, 128, 67, Lao
//0x0F00, 0x0FFF, //Tibetan, 256, 211, Tibetan (207 characters), Common (4 characters)
//0x1000, 0x109F, //Myanmar, 160, 160, Myanmar
//0x10A0, 0x10FF, //Georgian, 96, 88, Georgian (87 characters), Common (1 character)
//0x1100, 0x11FF, //Hangul Jamo, 256, 256, Hangul
//0x1200, 0x137F, //Ethiopic, 384, 358, Ethiopic
//0x1380, 0x139F, //Ethiopic Supplement, 32, 26, Ethiopic
//0x13A0, 0x13FF, //Cherokee, 96, 92, Cherokee
//0x1400, 0x167F, //Unified Canadian Aboriginal Syllabics, 640, 640, Canadian Aboriginal
//0x1680, 0x169F, //Ogham, 32, 29, Ogham
//0x16A0, 0x16FF, //Runic, 96, 89, Runic (86 characters), Common (3 characters)
//0x1700, 0x171F, //Tagalog, 32, 20, Tagalog
//0x1720, 0x173F, //Hanunoo, 32, 23, Hanunoo (21 characters), Common (2 characters)
//0x1740, 0x175F, //Buhid, 32, 20, Buhid
//0x1760, 0x177F, //Tagbanwa, 32, 18, Tagbanwa
//0x1780, 0x17FF, //Khmer, 128, 114, Khmer
//0x1800, 0x18AF, //Mongolian, 176, 156, Mongolian (153 characters), Common (3 characters)
//0x18B0, 0x18FF, //Unified Canadian Aboriginal Syllabics Extended, 80, 70, Canadian Aboriginal
//0x1900, 0x194F, //Limbu, 80, 68, Limbu
//0x1950, 0x197F, //Tai Le, 48, 35, Tai Le
//0x1980, 0x19DF, //New Tai Lue, 96, 83, New Tai Lue
//0x19E0, 0x19FF, //Khmer Symbols, 32, 32, Khmer
//0x1A00, 0x1A1F, //Buginese, 32, 30, Buginese
//0x1A20, 0x1AAF, //Tai Tham, 144, 127, Tai Tham
//0x1AB0, 0x1AFF, //Combining Diacritical Marks Extended, 80, 15, Inherited
//0x1B00, 0x1B7F, //Balinese, 128, 121, Balinese
//0x1B80, 0x1BBF, //Sundanese, 64, 64, Sundanese
//0x1BC0, 0x1BFF, //Batak, 64, 56, Batak
//0x1C00, 0x1C4F, //Lepcha, 80, 74, Lepcha
//0x1C50, 0x1C7F, //Ol Chiki, 48, 48, Ol Chiki
//0x1C80, 0x1C8F, //Cyrillic Extended-C, 16, 9, Cyrillic
//0x1CC0, 0x1CCF, //Sundanese Supplement, 16, 8, Sundanese
//0x1CD0, 0x1CFF, //Vedic Extensions, 48, 42, Common (15 characters), Inherited (27 characters)
//0x1D00, 0x1D7F, //Phonetic Extensions, 128, 128, Cyrillic (2 characters), Greek (15 characters), Latin (111 characters)
//0x1D80, 0x1DBF, //Phonetic Extensions Supplement, 64, 64, Greek (1 character), Latin (63 characters)
//0x1DC0, 0x1DFF, //Combining Diacritical Marks Supplement, 64, 63, Inherited
//0x1E00, 0x1EFF, //Latin Extended Additional, 256, 256, Latin
//0x1F00, 0x1FFF, //Greek Extended, 256, 233, Greek
//0x2000, 0x206F, //General Punctuation, 112, 111, Common (109 characters), Inherited (2 characters)
//0x2070, 0x209F, //Superscripts and Subscripts, 48, 42, Latin (15 characters), Common (27 characters)
//0x20A0, 0x20CF, //Currency Symbols, 48, 32, Common
//0x20D0, 0x20FF, //Combining Diacritical Marks for Symbols, 48, 33, Inherited
//0x2100, 0x214F, //Letterlike Symbols, 80, 80, Greek (1 character), Latin (4 characters), Common (75 characters)
//0x2150, 0x218F, //Number Forms, 64, 60, Latin (41 characters), Common (19 characters)
//0x2190, 0x21FF, //Arrows, 112, 112, Common
//0x2200, 0x22FF, //Mathematical Operators, 256, 256, Common
//0x2300, 0x23FF, //Miscellaneous Technical, 256, 256, Common
//0x2400, 0x243F, //Control Pictures, 64, 39, Common
//0x2440, 0x245F, //Optical Character Recognition, 32, 11, Common
//0x2460, 0x24FF, //Enclosed Alphanumerics, 160, 160, Common
//0x2500, 0x257F, //Box Drawing, 128, 128, Common
//0x2580, 0x259F, //Block Elements, 32, 32, Common
//0x25A0, 0x25FF, //Geometric Shapes, 96, 96, Common
//0x2600, 0x26FF, //Miscellaneous Symbols, 256, 256, Common
//0x2700, 0x27BF, //Dingbats, 192, 192, Common
//0x27C0, 0x27EF, //Miscellaneous Mathematical Symbols-A, 48, 48, Common
//0x27F0, 0x27FF, //Supplemental Arrows-A, 16, 16, Common
//0x2800, 0x28FF, //Braille Patterns, 256, 256, Braille
//0x2900, 0x297F, //Supplemental Arrows-B, 128, 128, Common
//0x2980, 0x29FF, //Miscellaneous Mathematical Symbols-B, 128, 128, Common
//0x2A00, 0x2AFF, //Supplemental Mathematical Operators, 256, 256, Common
//0x2B00, 0x2BFF, //Miscellaneous Symbols and Arrows, 256, 207, Common
//0x2C00, 0x2C5F, //Glagolitic, 96, 94, Glagolitic
//0x2C60, 0x2C7F, //Latin Extended-C, 32, 32, Latin
//0x2C80, 0x2CFF, //Coptic, 128, 123, Coptic
//0x2D00, 0x2D2F, //Georgian Supplement, 48, 40, Georgian
//0x2D30, 0x2D7F, //Tifinagh, 80, 59, Tifinagh
//0x2D80, 0x2DDF, //Ethiopic Extended, 96, 79, Ethiopic
//0x2DE0, 0x2DFF, //Cyrillic Extended-A, 32, 32, Cyrillic
//0x2E00, 0x2E7F, //Supplemental Punctuation, 128, 74, Common
//0x2E80, 0x2EFF, //CJK Radicals Supplement, 128, 115, Han
//0x2F00, 0x2FDF, //Kangxi Radicals, 224, 214, Han
//0x2FF0, 0x2FFF, //Ideographic Description Characters, 16, 12, Common
//0x3000, 0x303F, //CJK Symbols and Punctuation, 64, 64, Han (15 characters), Hangul (2 characters), Common (43 characters), Inherited (4 characters)
//0x3040, 0x309F, //Hiragana, 96, 93, Hiragana (89 characters), Common (2 characters), Inherited (2 characters)
//0x30A0, 0x30FF, //Katakana, 96, 96, Katakana (93 characters), Common (3 characters)
//0x3100, 0x312F, //Bopomofo, 48, 42, Bopomofo
//0x3130, 0x318F, //Hangul Compatibility Jamo, 96, 94, Hangul
//0x3190, 0x319F, //Kanbun, 16, 16, Common
//0x31A0, 0x31BF, //Bopomofo Extended, 32, 27, Bopomofo
//0x31C0, 0x31EF, //CJK Strokes, 48, 36, Common
//0x31F0, 0x31FF, //Katakana Phonetic Extensions, 16, 16, Katakana
//0x3200, 0x32FF, //Enclosed CJK Letters and Months, 256, 254, Hangul (62 characters), Katakana (47 characters), Common (145 characters)
//0x3300, 0x33FF, //CJK Compatibility, 256, 256, Katakana (88 characters), Common (168 characters)
//0x3400, 0x4DBF, //CJK Unified Ideographs Extension A, 6,592, 6,582, Han
//0x4DC0, 0x4DFF, //Yijing Hexagram Symbols, 64, 64, Common
//0x4E00, 0x9FFF, //CJK Unified Ideographs, 20,992, 20,971, Han
//0xA000, 0xA48F, //Yi Syllables, 1,168, 1,165, Yi
//0xA490, 0xA4CF, //Yi Radicals, 64, 55, Yi
//0xA4D0, 0xA4FF, //Lisu, 48, 48, Lisu
//0xA500, 0xA63F, //Vai, 320, 300, Vai
//0xA640, 0xA69F, //Cyrillic Extended-B, 96, 96, Cyrillic
//0xA6A0, 0xA6FF, //Bamum, 96, 88, Bamum
//0xA700, 0xA71F, //Modifier Tone Letters, 32, 32, Common
//0xA720, 0xA7FF, //Latin Extended-D, 224, 160, Latin (155 characters), Common (5 characters)
//0xA800, 0xA82F, //Syloti Nagri, 48, 44, Syloti Nagri
//0xA830, 0xA83F, //Common Indic Number Forms, 16, 10, Common
//0xA840, 0xA87F, //Phags-pa, 64, 56, Phags Pa
//0xA880, 0xA8DF, //Saurashtra, 96, 82, Saurashtra
//0xA8E0, 0xA8FF, //Devanagari Extended, 32, 30, Devanagari
//0xA900, 0xA92F, //Kayah Li, 48, 48, Kayah Li (47 characters), Common (1 character)
//0xA930, 0xA95F, //Rejang, 48, 37, Rejang
//0xA960, 0xA97F, //Hangul Jamo Extended-A, 32, 29, Hangul
//0xA980, 0xA9DF, //Javanese, 96, 91, Javanese (90 characters), Common (1 character)
//0xA9E0, 0xA9FF, //Myanmar Extended-B, 32, 31, Myanmar
//0xAA00, 0xAA5F, //Cham, 96, 83, Cham
//0xAA60, 0xAA7F, //Myanmar Extended-A, 32, 32, Myanmar
//0xAA80, 0xAADF, //Tai Viet, 96, 72, Tai Viet
//0xAAE0, 0xAAFF, //Meetei Mayek Extensions, 32, 23, Meetei Mayek
//0xAB00, 0xAB2F, //Ethiopic Extended-A, 48, 32, Ethiopic
//0xAB30, 0xAB6F, //Latin Extended-E, 64, 54, Latin (52 characters), Greek (1 character), Common (1 character)
//0xAB70, 0xABBF, //Cherokee Supplement, 80, 80, Cherokee
//0xABC0, 0xABFF, //Meetei Mayek, 64, 56, Meetei Mayek
//0xAC00, 0xD7AF, //Hangul Syllables, 11,184, 11,172, Hangul
//0xD7B0, 0xD7FF, //Hangul Jamo Extended-B, 80, 72, Hangul
//0xD800, 0xDB7F, //High Surrogates, 896, 0, Unknown
//0xDB80, 0xDBFF, //High Private Use Surrogates, 128, 0, Unknown
//0xDC00, 0xDFFF, //Low Surrogates, 1,024, 0, Unknown
//0xE000, 0xF8FF, //Private Use Area, 6,400, 6,400, Unknown
//0xF900, 0xFAFF, //CJK Compatibility Ideographs, 512, 472, Han
//0xFB00, 0xFB4F, //Alphabetic Presentation Forms, 80, 58, Armenian (5 characters), Hebrew (46 characters), Latin (7 characters)
//0xFB50, 0xFDFF, //Arabic Presentation Forms-A, 688, 611, Arabic (609 characters), Common (2 characters)
//0xFE00, 0xFE0F, //Variation Selectors, 16, 16, Inherited
//0xFE10, 0xFE1F, //Vertical Forms, 16, 10, Common
//0xFE20, 0xFE2F, //Combining Half Marks, 16, 16, Cyrillic (2 characters), Inherited (14 characters)
//0xFE30, 0xFE4F, //CJK Compatibility Forms, 32, 32, Common
//0xFE50, 0xFE6F, //Small Form Variants, 32, 26, Common
//0xFE70, 0xFEFF, //Arabic Presentation Forms-B, 144, 141, Arabic (140 characters), Common (1 character)
//0xFF00, 0xFFEF, //Halfwidth and Fullwidth Forms, 240, 225, Hangul (52 characters), Katakana (55 characters), Latin (52 characters), Common (66 characters)
//0xFFF0, 0xFFFF, //Specials, 16, 5, Common
//0x0030, 0x0039, //Example custom range (numbers 0-9)
//0x0041, 0x005A, //Example custom range (Upper case A-Z)
//0x0061, 0x007A, //Example custom range (Lower case a-z)
};
// Here we specify particular individual Unicodes to be included (appended at end of selected range)
static final int[] specificUnicodes = {
// Commonly used codes, add or remove // in next line
// 0x00A3, 0x00B0, 0x00B5, 0x03A9, 0x20AC, // £ ° µ Ω €
// Numbers and characters for showing time, change next line to //* to use
/*
0x002B, 0x002D, 0x002E, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, // - + . 0 1 2 3 4
0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x0061, 0x006D, // 5 6 7 8 9 : a m
0x0070, // p
//*/
// More characters for TFT_eSPI test sketches, change next line to //* to use
/*
0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x010C, 0x010D,
0x010E, 0x010F, 0x0110, 0x0111, 0x0118, 0x0119, 0x011A, 0x011B,
0x0131, 0x0139, 0x013A, 0x013D, 0x013E, 0x0141, 0x0142, 0x0143,
0x0144, 0x0147, 0x0148, 0x0150, 0x0151, 0x0152, 0x0153, 0x0154,
0x0155, 0x0158, 0x0159, 0x015A, 0x015B, 0x015E, 0x015F, 0x0160,
0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x016E, 0x016F, 0x0170,
0x0171, 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E,
0x0192,
0x02C6, 0x02C7, 0x02D8, 0x02D9, 0x02DA, 0x02DB, 0x02DC, 0x02DD,
0x03A9, 0x03C0, 0x2013, 0x2014, 0x2018, 0x2019, 0x201A, 0x201C,
0x201D, 0x201E, 0x2020, 0x2021, 0x2022, 0x2026, 0x2030, 0x2039,
0x203A, 0x2044, 0x20AC,
0x2122, 0x2202, 0x2206, 0x220F,
0x2211, 0x221A, 0x221E, 0x222B, 0x2248, 0x2260, 0x2264, 0x2265,
0x25CA,
0xF8FF, 0xFB01, 0xFB02,
//*/
};
// >>>>>>>>>> USER CONFIGURED PARAMETERS END HERE <<<<<<<<<<
////////////////////////////////////////////////////////////////////////////////////////////////
// Variable to hold the inclusive Unicode range (16 bit values only for this sketch)
int firstUnicode = 0;
int lastUnicode = 0;
PFont myFont;
PrintWriter logOutput;
void setup() {
logOutput = createWriter("FontFiles/System_Font_List.txt");
size(1000, 800);
// Print the available fonts to the console as a list:
String[] fontList = PFont.list();
printArray(fontList);
// Save font list to file
for (int x = 0; x < fontList.length; x++)
{
logOutput.print("[" + x + "] ");
logOutput.println(fontList[x]);
}
logOutput.flush(); // Writes the remaining data to the file
logOutput.close(); // Finishes the file
// Set the fontName from the array number or the defined fontName
if (fontNumber >= 0)
{
fontName = fontList[fontNumber];
fontType = "";
}
char[] charset;
int index = 0, count = 0;
int blockCount = unicodeBlocks.length;
for (int i = 0; i < blockCount; i+=2) {
firstUnicode = unicodeBlocks[i];
lastUnicode = unicodeBlocks[i+1];
if (lastUnicode < firstUnicode) {
delay(100);
System.err.println("ERROR: Bad Unicode range secified, last < first!");
System.err.print("first in range = 0x" + hex(firstUnicode, 4));
System.err.println(", last in range = 0x" + hex(lastUnicode, 4));
while (true);
}
// calculate the number of characters
count += (lastUnicode - firstUnicode + 1);
}
count += specificUnicodes.length;
println();
println("=====================");
println("Creating font file...");
println("Unicode blocks included = " + (blockCount/2));
println("Specific unicodes included = " + specificUnicodes.length);
println("Total number of characters = " + count);
if (count == 0) {
delay(100);
System.err.println("ERROR: No Unicode range or specific codes have been defined!");
while (true);
}
// allocate memory
charset = new char[count];
for (int i = 0; i < blockCount; i+=2) {
firstUnicode = unicodeBlocks[i];
lastUnicode = unicodeBlocks[i+1];
// loading the range specified
for (int code = firstUnicode; code <= lastUnicode; code++) {
charset[index] = Character.toChars(code)[0];
index++;
}
}
// loading the specific point codes
for (int i = 0; i < specificUnicodes.length; i++) {
charset[index] = Character.toChars(specificUnicodes[i])[0];
index++;
}
// Make font smooth (anti-aliased)
boolean smooth = true;
// Create the font in memory
myFont = createFont(fontName+fontType, displayFontSize, smooth, charset);
// Print characters to the sketch window
fill(0, 0, 0);
textFont(myFont);
// Set the left and top margin
int margin = displayFontSize;
translate(margin/2, margin);
int gapx = displayFontSize*10/8;
int gapy = displayFontSize*10/8;
index = 0;
fill(0);
textSize(displayFontSize);
for (int y = 0; y < height-gapy; y += gapy) {
int x = 0;
while (x < width) {
int unicode = charset[index];
float cwidth = textWidth((char)unicode) + 2;
if ( (x + cwidth) > (width - gapx) ) break;
// Draw the glyph to the screen
text(new String(Character.toChars(unicode)), x, y);
// Move cursor
x += cwidth;
// Increment the counter
index++;
if (index >= count) break;
}
if (index >= count) break;
}
// creating font to save as a file
PFont font;
font = createFont(fontName+fontType, fontSize, smooth, charset);
println("Created font " + fontName + str(fontSize) + ".vlw");
// creating file
try {
print("Saving to sketch FontFiles folder... ");
OutputStream output = createOutput("FontFiles/" + fontName + str(fontSize) + ".vlw");
font.save(output);
output.close();
println("OK!");
delay(100);
// Open up the FontFiles folder to access the saved file
String path = sketchPath();
Desktop.getDesktop().open(new File(path+"/FontFiles"));
System.err.println("All done! Note: Rectangles are displayed for non-existant characters.");
}
catch(IOException e) {
println("Doh! Failed to create the file");
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

View File

@ -0,0 +1,33 @@
PlatformIO User notes:
It is possible to load settings from the calling program rather than modifying
the library for each project by modifying the "platformio.ini" file.
The User_Setup_Select.h file will not load the user setting header files if
USER_SETUP_LOADED is defined.
Instead of using #define, use the -D prefix, for example:
[env:esp32dev]
platform = https://github.com/platformio/platform-espressif32.git#feature/stage
board = esp32dev
framework = arduino
upload_port = ESP32-Test-2481CE9C.local
build_flags =
-Os
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
-DUSER_SETUP_LOADED=1
-DILI9163_DRIVER=1
-DTFT_WIDTH=128
-DTFT_HEIGHT=160
-DTFT_MISO=19
-DTFT_MOSI=23
-DTFT_SCLK=18
-DTFT_CS=5
-DTFT_DC=19
-DTFT_RST=-1
-DLOAD_GLCD=1
-DSPI_FREQUENCY=27000000
lib_extra_dirs = B:\Projects\ESP32\ESP32Lib

Binary file not shown.

Before

Width:  |  Height:  |  Size: 385 KiB

After

Width:  |  Height:  |  Size: 381 KiB

View File

@ -4,26 +4,56 @@
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is editted correctly then all the library example sketches should
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
#define ILI9341_DRIVER
//#define ST7735_DRIVER
//#define ILI9163_DRIVER
//#define ST7735_DRIVER // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
//#define RM68140_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
//#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH 80
// #define TFT_WIDTH 128
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
@ -32,22 +62,38 @@
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
//#define ST7735_GREENTAB128 // For 128 x 128 display
//#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
// #define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
@ -61,31 +107,51 @@
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labelled AO or RS (Register Select)
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For ModeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions.
// Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
@ -95,25 +161,55 @@
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 5 // Chip select control pin
//#define TFT_CS 15 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven (ESP8266 only)
//
// ##################################################################################
//#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported on ESP32
// Uncomment line below to use ESP32 Parallel interface instead of SPI
//#define ESP32_PARALLEL
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
@ -122,49 +218,64 @@
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
// Section 4. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display TBD MHz works OK,
// With an ILI9163 display 27 MHz works OK.
// The RPi typically only works at 20MHz maximum.
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line:
//#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS

View File

@ -1,7 +1,7 @@
// This header file contains a list of user setup files and defines which one the
// compliler uses when the IDE performs a Verify/Compile or Upload.
// compiler uses when the IDE performs a Verify/Compile or Upload.
//
// Users can create configurations for different Espressiff boards and TFT displays.
// Users can create configurations for different Espressif boards and TFT displays.
// This makes selecting between hardware setups easy by "uncommenting" one line.
// The advantage of this hardware configuration method is that the examples provided
@ -9,12 +9,15 @@
// changes being needed. It also improves the portability of users sketches to other
// hardware configurations and compatible libraries.
//
// Create a shortcut to this file on your desktop to permit quick access for editting.
// Create a shortcut to this file on your desktop to permit quick access for editing.
// Re-compile and upload after making and saving any changes to this file.
// Customised User_Setup files are stored in the "User_Setups" folder.
// Only ONE line should be uncommented. Add extra lines and files as needed.
#ifndef USER_SETUP_LOADED // Lets PlatformIO users define settings in
// platformio.ini, see notes in "Tools" folder.
// Only ONE line below should be uncommented. Add extra lines and files as needed.
#include <User_Setup.h> // Default setup is root library folder
@ -22,12 +25,40 @@
//#include <User_Setups/Setup2_ST7735.h> // Setup file configured for my ST7735
//#include <User_Setups/Setup3_ILI9163.h> // Setup file configured for my ILI9163
//#include <User_Setups/Setup4_S6D02A1.h> // Setup file configured for my S6D02A1
//#include <User_Setups/Setup5_RPi_ILI9486.h> // Setup file configured for my stock RPi TFT
//#include <User_Setups/Setup6_RPi_Wr_ILI9486.h> // Setup file configured for my modified RPi TFT
//#include <User_Setups/Setup7_ST7735_128x128.h> // Setup file configured for my ST7735 128x128 display
//#include <User_Setups/Setup8_ILI9163_128x128.h> // Setup file configured for my ILI9163 128x128 display
//#include <User_Setups/Setup5_RPi_ILI9486.h> // Setup file configured for my stock RPi TFT
//#include <User_Setups/Setup6_RPi_Wr_ILI9486.h> // Setup file configured for my modified RPi TFT
//#include <User_Setups/Setup7_ST7735_128x128.h> // Setup file configured for my ST7735 128x128 display
//#include <User_Setups/Setup8_ILI9163_128x128.h> // Setup file configured for my ILI9163 128x128 display
//#include <User_Setups/Setup9_ST7735_Overlap.h> // Setup file configured for my ST7735
//#include <User_Setups/Setup10_RPi_touch_ILI9486.h> // Setup file configured for ESP8266 and RPi TFT with touch
//#include <User_Setups/SetupX_Template.h> // Setup file template for copying/editting
//#include <User_Setups/Setup11_RPi_touch_ILI9486.h> // Setup file configured for ESP32 and RPi TFT with touch
//#include <User_Setups/Setup12_M5Stack.h> // Setup file for the ESP32 based M5Stack
//#include <User_Setups/Setup13_ILI9481_Parallel.h> // Setup file for the ESP32 with parallel bus TFT
//#include <User_Setups/Setup14_ILI9341_Parallel.h> // Setup file for the ESP32 with parallel bus TFT
//#include <User_Setups/Setup15_HX8357D.h> // Setup file configured for HX8357D (untested)
//#include <User_Setups/Setup16_ILI9488_Parallel.h> // Setup file for the ESP32 with parallel bus TFT
//#include <User_Setups/Setup17_ePaper.h> // Setup file for any Waveshare ePaper display
//#include <User_Setups/Setup18_ST7789.h> // Setup file configured for ST7789
//#include <User_Setups/Setup19_RM68140_Parallel.h> // Setup file configured for RM68140 with parallel bus
//#include <User_Setups/Setup20_ILI9488.h> // Setup file for ESP8266 and ILI9488 SPI bus TFT
//#include <User_Setups/Setup21_ILI9488.h> // Setup file for ESP32 and ILI9488 SPI bus TFT
//#include <User_Setups/Setup22_TTGO_T4.h> // Setup file for ESP32 and TTGO T4 (BTC) ILI9341 SPI bus TFT
//#include <User_Setups/Setup23_TTGO_TM.h> // Setup file for ESP32 and TTGO TM ST7789 SPI bus TFT
//#include <User_Setups/Setup24_ST7789.h> // Setup file configured for ST7789 240 x 240
//#include <User_Setups/Setup25_TTGO_T_Display.h> // Setup file for ESP32 and TTGO T-Display ST7789V SPI bus TFT
//#include <User_Setups/Setup43_ST7735.h> // Setup file configured for my ST7735S 80x160
//#include <User_Setups/Setup135_ST7789.h> // Setup file for ESP8266 and ST7789 125 x 240 TFT
//#include <User_Setups/SetupX_Template.h>
#endif // USER_SETUP_LOADED
@ -39,28 +70,80 @@
/////////////////////////////////////////////////////////////////////////////////////
// Identical looking TFT displays may have a different colour ordering in the 16 bit colour
#define TFT_BGR 0 // Colour order Blue-Green-Red
#define TFT_RGB 1 // Colour order Red-Green-Blue
// Load the right driver definition - do not tinker here !
#if defined (ILI9341_DRIVER)
#include <TFT_Drivers/ILI9341_Defines.h>
#define TFT_DRIVER 0x9341
#elif defined (ST7735_DRIVER)
#include <TFT_Drivers/ST7735_Defines.h>
#define TFT_DRIVER 0x7735
#elif defined (ILI9163_DRIVER)
#include <TFT_Drivers/ILI9163_Defines.h>
#define TFT_DRIVER 0x9163
#elif defined (S6D02A1_DRIVER)
#include <TFT_Drivers/S6D02A1_Defines.h>
#define TFT_DRIVER 0x6D02
#elif defined (RPI_ILI9486_DRIVER)
#include <TFT_Drivers/RPI_ILI9486_Defines.h>
#include <TFT_Drivers/ILI9486_Defines.h>
#define TFT_DRIVER 0x9486
#elif defined (ILI9486_DRIVER)
#include <TFT_Drivers/ILI9486_Defines.h>
#define TFT_DRIVER 0x9486
#elif defined (ILI9481_DRIVER)
#include <TFT_Drivers/ILI9481_Defines.h>
#define TFT_DRIVER 0x9481
#elif defined (ILI9488_DRIVER)
#include <TFT_Drivers/ILI9488_Defines.h>
#define TFT_DRIVER 0x9488
#elif defined (HX8357D_DRIVER)
#include "TFT_Drivers/HX8357D_Defines.h"
#define TFT_DRIVER 0x8357
#elif defined (EPD_DRIVER)
#include "TFT_Drivers/EPD_Defines.h"
#define TFT_DRIVER 0xE9D
#elif defined (ST7789_DRIVER)
#include "TFT_Drivers/ST7789_Defines.h"
#define TFT_DRIVER 0x7789
#elif defined (R61581_DRIVER)
#include "TFT_Drivers/R61581_Defines.h"
#define TFT_DRIVER 0x6158
#elif defined (ST7789_2_DRIVER)
#include "TFT_Drivers/ST7789_2_Defines.h"
#define TFT_DRIVER 0x778B
#elif defined (RM68140_DRIVER)
#include "TFT_Drivers/RM68140_Defines.h"
#define TFT_DRIVER 0x6814
#elif defined (XYZZY_DRIVER) // <<<<<<<<<<<<<<<<<<<<<<<< ADD NEW DRIVER HERE
#include "TFT_Drivers/XYZZY_Defines.h"
#define TFT_DRIVER 0x0000
#else
#define TFT_DRIVER 0x0000
#endif
// These are the pins for all ESP8266 boards
#define PIN_D0 16
#define PIN_D1 5
#define PIN_D2 4
#define PIN_D3 0
#define PIN_D4 2
#define PIN_D5 14
#define PIN_D6 12
#define PIN_D7 13
#define PIN_D8 15
#define PIN_D9 3
#define PIN_D10 1
// These are the pins for ESP8266 boards
// Name GPIO NodeMCU Function
#define PIN_D0 D0 // GPIO16 WAKE
#define PIN_D1 D1 // GPIO5 User purpose
#define PIN_D2 D2 // GPIO4 User purpose
#define PIN_D3 D3 // GPIO0 Low on boot means enter FLASH mode
#define PIN_D4 D4 // GPIO2 TXD1 (must be high on boot to go to UART0 FLASH mode)
#define PIN_D5 D5 // GPIO14 HSCLK
#define PIN_D6 D6 // GPIO12 HMISO
#define PIN_D7 D7 // GPIO13 HMOSI RXD2
#define PIN_D8 D8 // GPIO15 HCS TXD0 (must be low on boot to enter UART0 FLASH mode)
#define PIN_D9 3 // RXD0
#define PIN_D10 1 // TXD0
#define PIN_MOSI 8 // SD1 FLASH and overlap mode
#define PIN_MISO 7 // SD0
#define PIN_SCLK 6 // CLK
#define PIN_HWCS 0 // D3
#define PIN_D11 9 // SD2
#define PIN_D12 10 // SD4

View File

@ -0,0 +1,31 @@
// See SetupX_Template.h for all options available
#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
#define TOUCH_CS PIN_D1 // Chip select pin (T_CS) of touch screen
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 16000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,30 @@
// See SetupX_Template.h for all options available
#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000

View File

@ -0,0 +1,32 @@
// See SetupX_Template.h for all options available
#define ILI9341_DRIVER
#define M5STACK
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 14 // Chip select control pin
#define TFT_DC 27 // Data Command control pin
#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL 32 // LED back-light
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
#define SPI_FREQUENCY 27000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 5000000

View File

@ -0,0 +1,56 @@
// ST7789 135 x 240 display with no chip select line
#define ST7789_DRIVER // Configure all registers
#define TFT_WIDTH 135
#define TFT_HEIGHT 240
#define CGRAM_OFFSET // Library will add offsets required
//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
//#define TFT_INVERSION_ON
//#define TFT_INVERSION_OFF
// DSTIKE stepup
//#define TFT_DC 23
//#define TFT_RST 32
//#define TFT_MOSI 26
//#define TFT_SCLK 27
// Generic ESP32 setup
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS -1 // Not connected
//#define TFT_DC 2
//#define TFT_RST 4 // Connect reset to ensure display initialises
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS -1 // Define as not used
#define TFT_DC PIN_D1 // Data Command control pin
//#define TFT_RST PIN_D4 // TFT reset pin (could connect to NodeMCU RST, see next line)
#define TFT_RST -1 // TFT reset pin connect to NodeMCU RST, must also then add 10K pull down to TFT SCK
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 40000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,35 @@
// See SetupX_Template.h for all options available
#define ESP32_PARALLEL
#define ILI9481_DRIVER
// ESP32 pins used for UNO format board
#define TFT_CS 33 // Chip select control pin
#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
#define TFT_RST 32 // Reset pin
#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
#define TFT_RD 2
#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
#define TFT_D1 13 // so a single register write sets/clears all bits
#define TFT_D2 26
#define TFT_D3 25
#define TFT_D4 17
#define TFT_D5 16
#define TFT_D6 27
#define TFT_D7 14
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

View File

@ -0,0 +1,35 @@
// See SetupX_Template.h for all options available
#define ESP32_PARALLEL
#define ILI9341_DRIVER
// ESP32 pins used for the parallel interface TFT
#define TFT_CS 33 // Chip select control pin
#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
#define TFT_RST 32 // Reset pin
#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
#define TFT_RD 2
#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
#define TFT_D1 13 // so a single register write sets/clears all bits
#define TFT_D2 26
#define TFT_D3 25
#define TFT_D4 17
#define TFT_D5 16
#define TFT_D6 27
#define TFT_D7 14
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

View File

@ -0,0 +1,31 @@
// See SetupX_Template.h for all options available
#define HX8357D_DRIVER
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,35 @@
// See SetupX_Template.h for all options available
#define ESP32_PARALLEL
#define ILI9488_DRIVER
// ESP32 pins used
#define TFT_CS 33 // Chip select control pin
#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
#define TFT_RST 32 // Reset pin
#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
#define TFT_RD 2
#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
#define TFT_D1 13 // so a single register write sets/clears all bits
#define TFT_D2 26
#define TFT_D3 25
#define TFT_D4 17
#define TFT_D5 16
#define TFT_D6 27
#define TFT_D7 14
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

View File

@ -0,0 +1,40 @@
// See SetupX_Template.h for all options available
#define EPD_DRIVER // ePaper driver
// READ THIS READ THIS READ THIS READ THIS READ THIS READ THIS
// Install the ePaper library for your own display size and type
// from here:
// https://github.com/Bodmer/EPD_Libraries
// Note: Pin allocations for the ePaper signals are defined in
// the ePaper library's epdif.h file. There follows the default
// pins already included in epdif.h file for the ESP8266:
///////////////////////////////////////////////////////////////////
// For ESP8266 connect as follows: //
// Display 3.3V to NodeMCU 3V3 //
// Display GND to NodeMCU GND //
// //
// Display GPIO NodeMCU pin //
// BUSY 5 D1 //
// RESET 4 D2 //
// DC 0 D3 //
// CS 2 D4 //
// CLK 14 D5 //
// D6 (MISO not connected to display) //
// DIN 13 D7 //
// //
///////////////////////////////////////////////////////////////////
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

View File

@ -0,0 +1,44 @@
// See SetupX_Template.h for all options available
#define ST7789_DRIVER
// #define TFT_SDA_READ // This option is for ESP32 ONLY, tested with ST7789 display only
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// For ST7789 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// My ST7789 display has TCT_CS wired permananently low so the pin is not defined here
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
#define SPI_TOUCH_FREQUENCY 2500000
//#define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,35 @@
// See SetupX_Template.h for all options available
#define ESP32_PARALLEL
#define RM68140_DRIVER
// ESP32 pins used for UNO format board
#define TFT_CS 33 // Chip select control pin
#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
#define TFT_RST 32 // Reset pin
#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
#define TFT_RD 2
#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
#define TFT_D1 13 // so a single register write sets/clears all bits
#define TFT_D2 26
#define TFT_D3 25
#define TFT_D4 17
#define TFT_D5 16
#define TFT_D6 27
#define TFT_D7 14
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT

View File

@ -1,113 +1,13 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
#define ILI9341_DRIVER
//#define ST7735_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
//#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -117,36 +17,17 @@
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
#define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,32 @@
// See SetupX_Template.h for all options available
#define ILI9488_DRIVER
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,34 @@
// See SetupX_Template.h for all options available
#define ILI9488_DRIVER
//#define TFT_INVERSION_OFF
#define TFT_MISO 19 // (leave TFT SDO disconnected if other SPI devices share MISO)
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 16000000
#define SPI_TOUCH_FREQUENCY 2500000

View File

@ -0,0 +1,30 @@
// Setup for the TTGO T4 ("Bitcoin Tracker") ESP32 board with 2.2" ILI9341 display
// See SetupX_Template.h for all options available
#define ILI9341_DRIVER
#define TFT_MISO 12
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 27
#define TFT_DC 26
#define TFT_RST 5
#define LOAD_GLCD
#define LOAD_FONT2
#define LOAD_FONT4
#define LOAD_FONT6
#define LOAD_FONT7
#define LOAD_FONT8
#define LOAD_GFXFF
#define SMOOTH_FONT
//#define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 40000000 // Maximum for ILI9341
#define USE_HSPI_PORT
#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V

View File

@ -0,0 +1,36 @@
// Setup for the TTGO TM (Music) ESP32 board with 2.4" ST7789V display
// See SetupX_Template.h for all options available
#define ST7789_DRIVER
#define TFT_SDA_READ // Read from display, it only provides an SDA pin
#define TFT_MISO 19 // Must be defined even though it is not used
#define TFT_MOSI 23 // Connected to display SDA line
#define TFT_SCLK 18
#define TFT_CS 05
#define TFT_DC 16
#define TFT_RST 17
#define TFT_WIDTH 240
#define TFT_HEIGHT 320
//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
#define LOAD_GLCD
#define LOAD_FONT2
#define LOAD_FONT4
#define LOAD_FONT6
#define LOAD_FONT7
#define LOAD_FONT8
#define LOAD_GFXFF
#define SMOOTH_FONT
#define SPI_FREQUENCY 40000000 // This display also seems to work reliably at 80MHz
#define SPI_FREQUENCY 80000000
#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V

View File

@ -0,0 +1,54 @@
// ST7789 240 x 240 display with no chip select line
#define ST7789_DRIVER // Configure all registers
#define TFT_WIDTH 240
#define TFT_HEIGHT 240
//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
//#define TFT_INVERSION_ON
//#define TFT_INVERSION_OFF
// DSTIKE stepup
//#define TFT_DC 23
//#define TFT_RST 32
//#define TFT_MOSI 26
//#define TFT_SCLK 27
// Generic ESP32 setup
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS -1 // Not connected
//#define TFT_DC 2
//#define TFT_RST 4 // Connect reset to ensure display initialises
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS -1 // Define as not used
#define TFT_DC PIN_D1 // Data Command control pin
#define TFT_RST PIN_D4 // TFT reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // TFT reset pin connect to NodeMCU RST, must also then add 10K pull down to TFT SCK
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 40000000
#define SPI_READ_FREQUENCY 20000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,38 @@
// Setup for the TTGO T4 ("Bitcoin Tracker") ESP32 board with 2.2" ILI9341 display
// See SetupX_Template.h for all options available
#define ST7789_DRIVER
#define TFT_WIDTH 135
#define TFT_HEIGHT 240
#define CGRAM_OFFSET // Library will add offsets required
//#define TFT_MISO -1
#define TFT_MOSI 19
#define TFT_SCLK 18
#define TFT_CS 5
#define TFT_DC 16
#define TFT_RST 23
#define TFT_BL 4 // Display backlight control pin
#define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options
#define LOAD_GLCD
#define LOAD_FONT2
#define LOAD_FONT4
#define LOAD_FONT6
#define LOAD_FONT7
#define LOAD_FONT8
#define LOAD_GFXFF
#define SMOOTH_FONT
//#define SPI_FREQUENCY 27000000
#define SPI_FREQUENCY 40000000 // Maximum for ILI9341
#define SPI_READ_FREQUENCY 6000000 // 6 MHz is the maximum SPI read speed for the ST7789V

View File

@ -1,114 +1,21 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
#define ST7735_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not test/supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -116,38 +23,17 @@
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Maximum for my ST7735. It is actually 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -1,101 +1,18 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER
#define ILI9163_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -103,39 +20,17 @@
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display TBD MHz works OK,
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,37 @@
// Setup for ESP32 and ST7735 80 x 160 TFT
// See SetupX_Template.h for all options available
#define ST7735_DRIVER
#define TFT_WIDTH 80
#define TFT_HEIGHT 160
#define ST7735_GREENTAB160x80
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS 15 // Chip select control pin
#define TFT_DC 2 // Data Command control pin
#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
//#define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3

View File

@ -1,97 +1,14 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER
//#define ILI9163_DRIVER
#define S6D02A1_DRIVER
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -99,39 +16,17 @@
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display TBD MHz works OK,
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
#define SPI_FREQUENCY 27000000
// #define SPI_FREQUENCY 40000000
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -1,119 +1,14 @@
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER
//#define ILI9163_DRIVER
//#define S6D02A1_DRIVER
#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
//#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// For ST7735 ONLY, define the pixel width and height in portrait orientation
//#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -123,37 +18,12 @@
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
#define SPI_FREQUENCY 20000000
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display TBD MHz works OK,
#define SPI_TOUCH_FREQUENCY 2500000
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
#define SPI_FREQUENCY 20000000
// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -1,119 +1,16 @@
// USER DEFINED SETTINGS
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER
//#define ILI9163_DRIVER
//#define S6D02A1_DRIVER
#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
//#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_GREENTAB3
//#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -123,37 +20,12 @@
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
#define SPI_FREQUENCY 20000000
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display TBD MHz works OK,
#define SPI_TOUCH_FREQUENCY 2500000
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
#define SPI_FREQUENCY 20000000
// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -1,117 +1,21 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
#define ST7735_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
#define TFT_HEIGHT 128
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
// out the different options below if the screen does not display graphics correctly,
// e.g. colours wrong, mirror images, or tray pixels at the edges.
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB // No display
//#define ST7735_GREENTAB // 2 pixel left border
//#define ST7735_GREENTAB2 // Colours wrong RB swap
//#define ST7735_GREENTAB3 // 2 pixel left border
#define ST7735_GREENTAB128 // For 128 x 128 display
//#define ST7735_REDTAB // colours wrong rotation 0 needs y shift of 32, 1 an x shift of 32
//#define ST7735_BLACKTAB
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labell AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not test/supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -119,40 +23,17 @@
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Maximum for my ST7735. It is actually 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
#define SPI_FREQUENCY 27000000
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -1,101 +1,18 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// See SetupX_Template.h for all options available
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
//#define ILI9341_DRIVER
//#define ST7735_DRIVER
#define ILI9163_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
#define TFT_HEIGHT 128
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
// Display VCC to NodeMCU 5V or 3.3V
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
// Section 3. Define the fonts that are to be used here
//
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
@ -103,39 +20,16 @@
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 40 MHz works OK,
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
#define SPI_TOUCH_FREQUENCY 2500000
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// #define SUPPORT_TRANSACTIONS

View File

@ -0,0 +1,41 @@
// See SetupX_Template.h for all options available
#define ST7735_DRIVER
#define TFT_WIDTH 128
#define TFT_HEIGHT 160
#define ST7735_REDTAB
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
#define TFT_CS PIN_D3
#define TFT_DC PIN_D5 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// In ESP8266 overlap mode the following must be defined
#define TFT_SPI_OVERLAP
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
#define SMOOTH_FONT
// #define SPI_FREQUENCY 20000000
#define SPI_FREQUENCY 27000000
#define SPI_TOUCH_FREQUENCY 2500000
// #define SUPPORT_TRANSACTIONS

View File

@ -1,28 +1,58 @@
// USER DEFINED SETTINGS
//
// The User_Setup header that will be called up is defined in User_Setup_Select.h
// This file is a default template that can be copied to create new setup files
// Add the new header file to the list in User_Setup_Select.h
//
// Set driver type, fonts to be loaded, pins used and SPI control method etc
//
// If this file is editted correctly then all the library example sketches should
//
// See the User_Setup_Select.h file if you wish to be able to define multiple
// setups and then easily select which setup file is used by the compiler.
//
// If this file is edited correctly then all the library example sketches should
// run without the need to make any more changes for a particular hardware setup!
// Note that some sketches are designed for a particular TFT pixel width/height
// ##################################################################################
//
// Section 0. Call up the right driver file and any options for it
// Section 1. Call up the right driver file and any options for it
//
// ##################################################################################
// Only define one driver, the other ones must be commented out
#define ILI9341_DRIVER
//#define ST7735_DRIVER
//#define ST7735_DRIVER // Define additional parameters below for this display
//#define ILI9163_DRIVER // Define additional parameters below for this display
//#define S6D02A1_DRIVER
//#define RPI_ILI9486_DRIVER // 20MHz maximum SPI
//#define HX8357D_DRIVER
//#define ILI9481_DRIVER
//#define ILI9486_DRIVER
//#define ILI9488_DRIVER // WARNING: Do not connect ILI9488 display SDO to MISO if other devices share the SPI bus (TFT SDO does NOT tristate when CS is high)
//#define ST7789_DRIVER // Full configuration option, define additional parameters below for this display
//#define ST7789_2_DRIVER // Minimal configuration option, define additional parameters below for this display
//#define R61581_DRIVER
// For ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
//#define TFT_WIDTH 128
//#define TFT_HEIGHT 160
//#define TFT_HEIGHT 128
// Some displays support SPI reads via the MISO pin, other displays have a single
// bi-directional SDA pin and the library will try to read this via the MOSI line.
// To use the SDA line for reading data from the TFT uncomment the following line:
// #define TFT_SDA_READ // This option if for ESP32 ONLY, tested with ST7789 display only
// For ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display
// Try ONE option at a time to find the correct colour order for your display
// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue
// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red
// For M5Stack ESP32 module with integrated ILI9341 display ONLY, remove // in line below
// #define M5STACK
// For ST7789, ST7735 and ILI9163 ONLY, define the pixel width and height in portrait orientation
// #define TFT_WIDTH 80
// #define TFT_WIDTH 128
// #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320
// #define TFT_HEIGHT 160
// #define TFT_HEIGHT 128
// #define TFT_HEIGHT 240 // ST7789 240 x 240
// #define TFT_HEIGHT 320 // ST7789 240 x 320
// For ST7735 ONLY, define the type of display, originally this was based on the
// colour of the tab on the screen protector film but this is not always true, so try
@ -31,26 +61,44 @@
// Comment out ALL BUT ONE of these options for a ST7735 display driver, save this
// this User_Setup file, then rebuild and upload the sketch to the board again:
//#define ST7735_INITB
//#define ST7735_GREENTAB
//#define ST7735_GREENTAB2
//#define ST7735_REDTAB
//#define ST7735_BLACKTAB
// #define ST7735_INITB
// #define ST7735_GREENTAB
// #define ST7735_GREENTAB2
// #define ST7735_GREENTAB3
// #define ST7735_GREENTAB128 // For 128 x 128 display
// #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset)
// #define ST7735_REDTAB
// #define ST7735_BLACKTAB
// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset
// If colours are inverted (white shows as black) then uncomment one of the next
// 2 lines try both options, one of the options should correct the inversion.
// #define TFT_INVERSION_ON
// #define TFT_INVERSION_OFF
// If a backlight control signal is available then define the TFT_BL pin in Section 2
// below. The backlight will be turned ON when tft.begin() is called, but the library
// needs to know if the LEDs are ON with the pin HIGH or LOW. If the LEDs are to be
// driven with a PWM signal or turned OFF/ON then this must be handled by the user
// sketch. e.g. with digitalWrite(TFT_BL, LOW);
// #define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options
// ##################################################################################
//
// Section 1. Define the pins that are used to interface with the display here
// Section 2. Define the pins that are used to interface with the display here
//
// ##################################################################################
// We must use hardware SPI, a minimum of 3 GPIO pins is needed.
// Typical setup for NodeMCU ESP-12 is :
// Typical setup for ESP8266 NodeMCU ESP-12 is :
//
// Display SDO/MISO to NodeMCU pin D6 (or leave disconnected if not reading TFT)
// Display LED to NodeMCU pin VIN (or 5V, see below)
// Display SCK to NodeMCU pin D5
// Display SDI/MOSI to NodeMCU pin D7
// Display DC (or AO)to NodeMCU pin D3
// Display DC (RS/AO)to NodeMCU pin D3
// Display RESET to NodeMCU pin D4 (or RST, see below)
// Display CS to NodeMCU pin D8 (or GND, see below)
// Display GND to NodeMCU pin GND (0V)
@ -58,47 +106,109 @@
//
// The TFT RESET pin can be connected to the NodeMCU RST pin or 3.3V to free up a control pin
//
// The DC (Data Command) pin may be labeled AO or RS (Register Select)
//
// With some displays such as the ILI9341 the TFT CS pin can be connected to GND if no more
// SPI deivces (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// SPI devices (e.g. an SD Card) are connected, in this case comment out the #define TFT_CS
// line below so it is NOT defined. Other displays such at the ST7735 require the TFT CS pin
// to be toggled during setup, so in these cases the TFT_CS line must be defined and connected.
//
// The NodeMCU D0 pin can be used for RST
//
// See Section 2. below if DC or CS is connected to D0
//
// Note: only some versions of the NodeMCU provide the USB 5V on the VIN pin
// If 5V is not available at a pin you can use 3.3V but backlight brightness
// will be lower.
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR SETUP ######
// ModeMCU
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ######
// For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation
#define TFT_CS PIN_D8 // Chip select control pin D8
#define TFT_DC PIN_D3 // Data Command control pin
#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
//#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin)
//#define TOUCH_CS PIN_D2 // Chip select pin (T_CS) of touch screen
//#define TFT_WR PIN_D2 // Write strobe for modified Raspberry Pi TFT only
// ###### FOR ESP8266 OVERLAP MODE EDIT THE PIN NUMBERS IN THE FOLLOWING LINES ######
// Overlap mode shares the ESP8266 FLASH SPI bus with the TFT so has a performance impact
// but saves pins for other functions.
// Use NodeMCU SD0=MISO, SD1=MOSI, CLK=SCLK to connect to TFT in overlap mode
// In ESP8266 overlap mode the following must be defined
//#define TFT_SPI_OVERLAP
// In ESP8266 overlap mode the TFT chip select MUST connect to pin D3
//#define TFT_CS PIN_D3
//#define TFT_DC PIN_D5 // Data Command control pin
//#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V
// ESP32 Dev board (planned, not supported yet)
//#define TFT_CS 5 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to Arduino RESET pin)
// ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP32 SETUP ######
// For ESP32 Dev board (only tested with ILI9341 display)
// The hardware SPI can be mapped to any pins
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 15 // Chip select control pin
//#define TFT_DC 2 // Data Command control pin
//#define TFT_RST 4 // Reset pin (could connect to RST pin)
//#define TFT_RST -1 // Set TFT_RST to -1 if display RESET is connected to ESP32 board RST
// ##################################################################################
//
// Section 2. Define the way the DC and/or CS lines are driven
//
// ##################################################################################
//#define TFT_BL 32 // LED back-light (only for ST7789 with backlight control pin)
// Normally the library uses direct register access for the DC and CS lines for speed
// If D0 (GPIO16) is used for CS or DC then a different slower method must be used
// Uncomment one line if D0 is used for DC or CS
// DC on D0 = 6% performance penalty at 40MHz SPI running graphics test
// CS on D0 = 2% performance penalty at 40MHz SPI running graphics test
//#define TOUCH_CS 21 // Chip select pin (T_CS) of touch screen
//#define TFT_WR 22 // Write strobe for modified Raspberry Pi TFT only
// For the M5Stack module use these #define lines
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
//#define TFT_CS 14 // Chip select control pin
//#define TFT_DC 27 // Data Command control pin
//#define TFT_RST 33 // Reset pin (could connect to Arduino RESET pin)
//#define TFT_BL 32 // LED back-light (required for M5Stack)
// ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ######
// The library supports 8 bit parallel TFTs with the ESP32, the pin
// selection below is compatible with ESP32 boards in UNO format.
// Wemos D32 boards need to be modified, see diagram in Tools folder.
// Only ILI9481 and ILI9341 based displays have been tested!
// Parallel bus is only supported on ESP32
// Uncomment line below to use ESP32 Parallel interface instead of SPI
//#define ESP32_PARALLEL
// The ESP32 and TFT the pins used for testing are:
//#define TFT_CS 33 // Chip select control pin (library pulls permanently low
//#define TFT_DC 15 // Data Command control pin - must use a pin in the range 0-31
//#define TFT_RST 32 // Reset pin, toggles on startup
//#define TFT_WR 4 // Write strobe control pin - must use a pin in the range 0-31
//#define TFT_RD 2 // Read strobe control pin
//#define TFT_D0 12 // Must use pins in the range 0-31 for the data bus
//#define TFT_D1 13 // so a single register write sets/clears all bits.
//#define TFT_D2 26 // Pins can be randomly assigned, this does not affect
//#define TFT_D3 25 // TFT screen update performance.
//#define TFT_D4 17
//#define TFT_D5 16
//#define TFT_D6 27
//#define TFT_D7 14
// #define D0_USED_FOR_DC
// #define D0_USED_FOR_CS
// ##################################################################################
//
@ -107,48 +217,64 @@
// ##################################################################################
// Comment out the #defines below with // to stop that font being loaded
// The ESP8366 had plenty of memory so commenting out fonts is not normally necessary
// If all fonts are loaded the extra FLASH space required is about 17Kbytes...
// To save FLASH space only enable the fonts you need!
// The ESP8366 and ESP32 have plenty of memory so commenting out fonts is not
// normally necessary. If all fonts are loaded the extra FLASH space required is
// about 17Kbytes. To save FLASH space only enable the fonts you need!
#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH
#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters
#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:.
#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-.
#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.
//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT
#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts
// ##################################################################################
//
// Section 4. Not used
//
// ##################################################################################
// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded
// this will save ~20kbytes of FLASH
#define SMOOTH_FONT
// ##################################################################################
//
// Section 5. Other options
// Section 4. Other options
//
// ##################################################################################
// Define the SPI clock frequency
// Define the SPI clock frequency, this affects the graphics rendering speed. Too
// fast and the TFT driver will not keep up and display corruption appears.
// With an ILI9341 display 40MHz works OK, 80MHz sometimes fails
// With a ST7735 display more than 27MHz may not work (spurious pixels and lines)
// With an ILI9163 display 27 MHz works OK.
// The RPi typically only works at 20MHz maximum.
// #define SPI_FREQUENCY 1000000
// #define SPI_FREQUENCY 5000000
// #define SPI_FREQUENCY 10000000
// #define SPI_FREQUENCY 20000000
// #define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
#define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3
// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS
// #define SPI_FREQUENCY 80000000
// Optional reduced SPI frequency for reading TFT
#define SPI_READ_FREQUENCY 20000000
// The XPT2046 requires a lower SPI clock rate of 2.5MHz so we define that here:
#define SPI_TOUCH_FREQUENCY 2500000
// The ESP32 has 2 free SPI ports i.e. VSPI and HSPI, the VSPI is the default.
// If the VSPI port is in use and pins are not accessible (e.g. TTGO T-Beam)
// then uncomment the following line to use the HSPI port:
//#define USE_HSPI_PORT
// Comment out the following #define if "SPI Transactions" do not need to be
// supported. Tranaction support is required if other SPI devices are connected.
// When commented out the code size will be smaller and sketches will
// supported. When commented out the code size will be smaller and sketches will
// run slightly faster, so leave it commented out unless you need it!
// Transaction support is needed to work with SD library but not needed with TFT_SdFat
// Transaction support is required if other SPI devices are connected.
// Transactions are automatically enabled by the library for an ESP32 (to use HAL mutex)
// so changing it here has no effect
// #define SUPPORT_TRANSACTIONS

View File

@ -13,9 +13,10 @@
^^^^
*/
// When font files are placed in the Custom folder then they must also be #included here:
// When font files are placed in the Custom folder (TFT_eSPI\Fonts\Custom) then they must
// also be #included here:
// The comment added is a shorthand reference but this is not essential
// The CF_OL24 etc are a shorthand reference, but this is not essential to use the fonts
#ifdef LOAD_GFXFF

View File

@ -1,42 +0,0 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>
// Icon width and height
const uint16_t alertWidth = 32;
const uint16_t alertHeight = 32;
// The icon file can be created with the "UTFT ImageConverter 565" bitmap to .c file creation utility, more can be pasted in here
const unsigned short alert[1024] PROGMEM={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1080,0xAC66,0xEDE8,0xFE69,0xC4C6,0x2901,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xBCC6,0xFE68,0xFE68,0xFE6A,0xFE68,0xEDE8,0x18A1,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8344,0xFE48,0xFE8C,0xFFDD,0xFFFF,0xFEF0,0xFE48,0xB466,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 3, 128 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1880,0xEDC7,0xFE48,0xFF99,0xFFBC,0xFF9B,0xFFBD,0xFE6A,0xFE48,0x5A23,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 4, 160 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9BE5,0xFE28,0xFED0,0xFFBC,0xFF7A,0xFF9A,0xFF9B,0xFF35,0xFE28,0xBCA6,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 5, 192 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3962,0xFE28,0xFE28,0xFF9A,0xFF79,0xFF9A,0xFF9B,0xFF9A,0xFFBD,0xFE6B,0xFE28,0x72E3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 6, 224 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xB465,0xFE28,0xFEF2,0xFF7A,0xFF79,0xFF7A,0xFF9A,0xFF7A,0xFF7A,0xFF78,0xFE28,0xDD67,0x0860,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 7, 256 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5A22,0xFE07,0xFE29,0xFF9B,0xFF37,0xFF58,0xFF79,0xFF79,0xFF79,0xFF58,0xFF9B,0xFEAE,0xFE07,0x93A4,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 8, 288 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xC4A5,0xFE07,0xFF15,0xFF37,0xFF36,0xAD11,0x2965,0x2965,0xCDF4,0xFF37,0xFF37,0xFF79,0xFE07,0xFE07,0x2901,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 9, 320 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7B03,0xFDE7,0xFE4B,0xFF79,0xFEF4,0xFF15,0xB552,0x2945,0x2945,0xDE55,0xFF16,0xFF15,0xFF58,0xFED1,0xFDE7,0xAC25,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 10, 352 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0840,0xDD26,0xFDE7,0xFF57,0xFED3,0xFED2,0xFEF4,0xBD93,0x2124,0x2124,0xDE75,0xFF14,0xFED3,0xFED3,0xFF7A,0xFE08,0xFDE7,0x49A2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 11, 384 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9BA4,0xFDC6,0xFE6E,0xFF36,0xFE90,0xFEB1,0xFED3,0xC592,0x2124,0x2124,0xE675,0xFED3,0xFEB2,0xFEB1,0xFEF3,0xFEF3,0xFDC6,0xBC45,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 12, 416 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3141,0xF5C6,0xF5C7,0xFF58,0xFE90,0xFE6F,0xFE8F,0xFEB1,0xCDB2,0x2104,0x2104,0xF6B4,0xFEB1,0xFE90,0xFE8F,0xFE90,0xFF58,0xFE0A,0xF5C6,0x72A3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 13, 448 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xABE4,0xF5A6,0xFEB1,0xFED3,0xFE4E,0xFE6E,0xFE6F,0xFE90,0xD5F2,0x18E3,0x18E3,0xFED4,0xFE90,0xFE6F,0xFE6F,0xFE6E,0xFE91,0xFF36,0xF5A6,0xCCA5,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 14, 480 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x5202,0xF5A6,0xF5C7,0xFF58,0xFE4D,0xFE4D,0xFE4D,0xFE4E,0xFE6F,0xDE11,0x18C3,0x18C3,0xFED3,0xFE6F,0xFE6E,0xFE4E,0xFE4D,0xFE4D,0xFF16,0xFE2C,0xF5A6,0x9363,0x0000,0x0000,0x0000,0x0000,0x0000, // row 15, 512 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0xBC44,0xF585,0xFED3,0xFE6F,0xFE2C,0xFE2C,0xFE2D,0xFE4D,0xFE4E,0xE630,0x10A2,0x2104,0xFED1,0xFE4E,0xFE4D,0xFE4D,0xFE2D,0xFE2C,0xFE4D,0xFF37,0xF586,0xF585,0x28E1,0x0000,0x0000,0x0000,0x0000, // row 16, 544 pixels
0x0000,0x0000,0x0000,0x0000,0x7282,0xF565,0xF5EA,0xFF16,0xFE0B,0xFE0B,0xFE0B,0xFE2C,0xFE2C,0xFE4D,0xF670,0x1082,0x2924,0xFEB0,0xFE2D,0xFE2C,0xFE2C,0xFE2C,0xFE0B,0xFE0B,0xFEB2,0xFE6F,0xF565,0xA383,0x0000,0x0000,0x0000,0x0000, // row 17, 576 pixels
0x0000,0x0000,0x0000,0x0840,0xD4C4,0xF565,0xFEF5,0xFE0C,0xFDE9,0xFDEA,0xFE0A,0xFE0B,0xFE0B,0xFE2C,0xFE8F,0x0861,0x2964,0xFE8F,0xFE2C,0xFE0B,0xFE0B,0xFE0B,0xFE0A,0xFDEA,0xFE0B,0xFF37,0xF586,0xF565,0x4181,0x0000,0x0000,0x0000, // row 18, 608 pixels
0x0000,0x0000,0x0000,0x9343,0xF545,0xF60C,0xFED3,0xFDC8,0xFDC8,0xFDC9,0xFDE9,0xFDEA,0xFDEA,0xFE0B,0xFE8E,0x0861,0x3184,0xFE6D,0xFE0B,0xFE0A,0xFDEA,0xFDEA,0xFDE9,0xFDC9,0xFDC9,0xFE4E,0xFEB2,0xF545,0xB3E3,0x0000,0x0000,0x0000, // row 19, 640 pixels
0x0000,0x0000,0x28E0,0xF544,0xF545,0xFF17,0xFDC8,0xFDA7,0xFDA7,0xFDC8,0xFDC8,0xFDC9,0xFDC9,0xFDE9,0xFE6C,0x10A2,0x39C4,0xFE4C,0xFDEA,0xFDE9,0xFDC9,0xFDC9,0xFDC8,0xFDC8,0xFDA7,0xFDA8,0xFF16,0xF588,0xF544,0x6222,0x0000,0x0000, // row 20, 672 pixels
0x0000,0x0000,0xA383,0xF524,0xF64E,0xFE4E,0xFD86,0xFD86,0xFD87,0xFDA7,0xFDA7,0xFDA8,0xFDC8,0xFDC8,0xFE2A,0xA469,0xB4EA,0xFE2A,0xFDC9,0xFDC8,0xFDC8,0xFDA8,0xFDA7,0xFDA7,0xFD87,0xFD86,0xFDEA,0xFED3,0xF524,0xC443,0x0000,0x0000, // row 21, 704 pixels
0x0000,0x51C1,0xF504,0xF546,0xFF16,0xF565,0xFD65,0xFD65,0xFD86,0xFD86,0xFD86,0xFDA7,0xFDA7,0xFDA7,0xFDE8,0xFE6A,0xFE4A,0xFDE8,0xFDA7,0xFDA7,0xFDA7,0xFDA7,0xFD86,0xFD86,0xFD86,0xFD65,0xFD65,0xFEB2,0xF5CA,0xF504,0x8AE2,0x0000, // row 22, 736 pixels
0x0000,0xB3A2,0xED03,0xFE92,0xFDC9,0xF543,0xF544,0xFD44,0xFD65,0xFD65,0xFD65,0xFD86,0xFD86,0xFD86,0xFDA7,0xFDC7,0xFDC7,0xFDA7,0xFD86,0xFD86,0xFD86,0xFD86,0xFD65,0xFD65,0xFD65,0xFD44,0xF544,0xFD86,0xFEF5,0xED03,0xE4C3,0x1880, // row 23, 768 pixels
0x7241,0xECE3,0xF567,0xFED3,0xF523,0xF523,0xF523,0xF543,0xF544,0xF544,0xFD65,0xFD65,0xFD65,0xFD65,0xD4E6,0x39C5,0x39A5,0xD4E6,0xFD86,0xFD65,0xFD65,0xFD65,0xFD65,0xF544,0xF544,0xF543,0xF523,0xF523,0xFE2E,0xF5EC,0xECE3,0x9B42, // row 24, 800 pixels
0xD443,0xECE3,0xFED4,0xF565,0xF502,0xF502,0xF522,0xF523,0xF523,0xF543,0xF544,0xF544,0xF544,0xFD65,0x8B64,0x18C3,0x18C3,0x8344,0xFD85,0xFD44,0xF544,0xF544,0xF544,0xF543,0xF523,0xF523,0xF522,0xF502,0xF523,0xFEF5,0xED04,0xECE3, // row 25, 832 pixels
0xECC3,0xF5AB,0xFE6F,0xF501,0xF4E1,0xF501,0xF502,0xF502,0xF522,0xF522,0xF523,0xF523,0xF523,0xFD84,0xC504,0x20E1,0x18E1,0xC4E4,0xFD84,0xF543,0xF523,0xF523,0xF523,0xF522,0xF522,0xF502,0xF502,0xF501,0xF501,0xFDC9,0xF62F,0xECC3, // row 26, 864 pixels
0xECC2,0xFE92,0xF523,0xF4E0,0xF4E0,0xF4E1,0xF4E1,0xF501,0xF501,0xF502,0xF502,0xF522,0xF522,0xF543,0xFDE3,0xFEA5,0xF6A4,0xFE04,0xF543,0xF522,0xF522,0xF522,0xF502,0xF502,0xF501,0xF501,0xF4E1,0xF4E1,0xF4E0,0xF4E1,0xFED4,0xECC2, // row 27, 896 pixels
0xECA2,0xF5EC,0xF4E0,0xF4C0,0xF4E0,0xF4E0,0xF4E0,0xF4E1,0xF4E1,0xF501,0xF501,0xF501,0xF502,0xF502,0xF542,0xFDA2,0xFDA2,0xF542,0xF502,0xF502,0xF502,0xF501,0xF501,0xF501,0xF4E1,0xF4E1,0xF4E0,0xF4E0,0xF4E0,0xF4C0,0xF5A9,0xECA2, // row 28, 928 pixels
0xECA2,0xECA2,0xECC2,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4E1,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E2,0xF4E1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xF4C1,0xECC2,0xECC3,0xECA2, // row 29, 960 pixels
0x8AC1,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0xEC82,0x9B01, // row 30, 992 pixels
0x0000,0x1880,0x51A0,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x8AA1,0x61E0,0x28E0,0x0000}; // row 31, 1024 pixels

View File

@ -1,41 +0,0 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>
// Icon width and height
const uint16_t closeWidth = 32;
const uint16_t closeHeight = 32;
// The icon file can be created with the "UTFT ImageConverter 565" bitmap to .c file creation utility, more can be pasted in here
const unsigned short close[1024] PROGMEM={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x30C3,0x4124,0x61C7,0x61C7,0x4124,0x30E3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x48E3,0xA249,0xEB8E,0xFCB2,0xFD14,0xFD75,0xFD96,0xFD34,0xFCF3,0xEBEF,0xA28A,0x4904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x58E3,0xC228,0xFC10,0xFD34,0xFE18,0xFE59,0xFE79,0xFE9A,0xFE9A,0xFE9A,0xFE9A,0xFE59,0xFD75,0xFC51,0xC28A,0x5904,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2041,0x8945,0xF34D,0xFD34,0xFDB6,0xFD75,0xFD55,0xFD55,0xFD96,0xFDD7,0xFDF7,0xFDF7,0xFDB6,0xFDB6,0xFDD7,0xFDF7,0xFD75,0xF38E,0x8965,0x2041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 3, 128 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x4082,0xE208,0xF410,0xFD34,0xFC92,0xFBEF,0xFBAE,0xFBEF,0xFC71,0xFD14,0xFD75,0xFDB6,0xFD75,0xFD14,0xFC92,0xFC51,0xFC71,0xFCF3,0xFD75,0xFC30,0xEA28,0x40A2,0x0000,0x0000,0x0000,0x0000,0x0000, // row 4, 160 pixels
0x0000,0x0000,0x0000,0x0000,0x3861,0xE1E7,0xF451,0xFC92,0xFB4D,0xFA49,0xFA49,0xFAEB,0xFBAE,0xFC71,0xFD34,0xFDB6,0xFE18,0xFDB6,0xFD34,0xFC71,0xFBAE,0xFB0C,0xFAEB,0xFBAE,0xFCD3,0xFC71,0xE208,0x4082,0x0000,0x0000,0x0000,0x0000, // row 5, 192 pixels
0x0000,0x0000,0x0000,0x1020,0xD986,0xF430,0xFC30,0xFA28,0xF924,0xF965,0xFA8A,0xFB0C,0xFBAE,0xFC51,0xFD14,0xFD75,0xFDB6,0xFD75,0xFD14,0xFC51,0xFC71,0xFBEF,0xFA28,0xF9C7,0xFA8A,0xFC51,0xF430,0xD9A6,0x1020,0x0000,0x0000,0x0000, // row 6, 224 pixels
0x0000,0x0000,0x0000,0x78A2,0xEB6D,0xFC30,0xF9C7,0xF861,0xF8A2,0xFA08,0xFEDB,0xFD55,0xFB4D,0xFC10,0xFC92,0xFD14,0xFD34,0xFD14,0xFC92,0xFCB2,0xFF7D,0xFF7D,0xFB2C,0xF945,0xF8E3,0xF9E7,0xFC30,0xEB8E,0x78C3,0x0000,0x0000,0x0000, // row 7, 256 pixels
0x0000,0x0000,0x3841,0xD9E7,0xF492,0xF208,0xF041,0xF800,0xF945,0xFE9A,0xFFFF,0xFFFF,0xFD75,0xFB8E,0xFC10,0xFC51,0xFC71,0xFC51,0xFCB2,0xFF7D,0xFFFF,0xFFFF,0xFF3C,0xFA8A,0xF882,0xF841,0xFA08,0xFC92,0xDA08,0x3841,0x0000,0x0000, // row 8, 288 pixels
0x0000,0x0000,0x88A2,0xEBCF,0xF2EB,0xF061,0xF000,0xF8E3,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD75,0xFB4D,0xFBAE,0xFBAE,0xFC71,0xFF7D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFEFB,0xFA28,0xF800,0xF061,0xF2EB,0xEBEF,0x90C3,0x0000,0x0000, // row 9, 320 pixels
0x0000,0x2820,0xD1C7,0xF410,0xE945,0xE800,0xF000,0xFE9A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD34,0xFAEB,0xFBCF,0xFF5D,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF1C,0xF986,0xF000,0xF145,0xF410,0xD1E7,0x2820,0x0000, // row 10, 352 pixels
0x0000,0x6841,0xDB2C,0xEACB,0xE041,0xE800,0xF000,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFD14,0xFF1C,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFBCF,0xF082,0xF000,0xE841,0xEACB,0xE34D,0x7061,0x0000, // row 11, 384 pixels
0x0000,0x9861,0xE3CF,0xE186,0xE000,0xE800,0xE800,0xF145,0xFEDB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE986,0xEBCF,0xA082,0x0000, // row 12, 416 pixels
0x0800,0xB8A2,0xE3AE,0xD8A2,0xD800,0xE000,0xE800,0xE800,0xF145,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE000,0xE0A2,0xEBAE,0xC0C3,0x0800, // row 13, 448 pixels
0x1800,0xC124,0xE30C,0xD020,0xD800,0xE000,0xE000,0xE800,0xE800,0xF145,0xFEDB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB8E,0xF000,0xF000,0xE800,0xE800,0xE000,0xE000,0xD820,0xE30C,0xC124,0x1800, // row 14, 480 pixels
0x2800,0xC165,0xDAAA,0xC800,0xD000,0xD800,0xE000,0xE000,0xE800,0xE800,0xF124,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFB6D,0xF000,0xF000,0xE800,0xE800,0xE000,0xE000,0xD800,0xD000,0xDAAA,0xC165,0x2800, // row 15, 512 pixels
0x2000,0xB924,0xD269,0xC800,0xD000,0xD000,0xD800,0xE000,0xE000,0xE800,0xE924,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF36D,0xE800,0xE800,0xE800,0xE000,0xE000,0xD800,0xD000,0xD000,0xDA69,0xC145,0x2800, // row 16, 544 pixels
0x1000,0xB0A2,0xD28A,0xC000,0xC800,0xD000,0xD000,0xD800,0xD800,0xE165,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xF3AE,0xE000,0xE000,0xD800,0xD800,0xD000,0xD000,0xC800,0xD28A,0xB8C3,0x1000, // row 17, 576 pixels
0x0000,0xA800,0xD2AA,0xB800,0xC000,0xC800,0xC800,0xD000,0xD965,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBAE,0xD800,0xD800,0xD000,0xC800,0xC800,0xC000,0xD2AA,0xB020,0x0000, // row 18, 608 pixels
0x0000,0x8000,0xCA69,0xB841,0xB800,0xC000,0xC800,0xD186,0xFEFB,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBCF,0xD000,0xC800,0xC800,0xC000,0xC041,0xCA69,0x8000,0x0000, // row 19, 640 pixels
0x0000,0x4800,0xC1C7,0xB8E3,0xB800,0xB800,0xC000,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xEBEF,0xFE79,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE410,0xC841,0xC000,0xB800,0xC0E3,0xC1C7,0x4800,0x0000, // row 20, 672 pixels
0x0000,0x1000,0xB061,0xC1E7,0xB000,0xB000,0xB800,0xD269,0xFFBE,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xE38E,0xD000,0xD965,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDB0C,0xC020,0xB800,0xB000,0xC1E7,0xB061,0x1000,0x0000, // row 21, 704 pixels
0x0000,0x0000,0x6000,0xB9C7,0xB061,0xB000,0xB000,0xB800,0xCA49,0xFF9E,0xFFFF,0xFFFF,0xFFFF,0xE38E,0xC800,0xC800,0xC800,0xD186,0xF69A,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xDB0C,0xB800,0xB800,0xB000,0xB061,0xC1C7,0x6000,0x0000,0x0000, // row 22, 736 pixels
0x0000,0x0000,0x1800,0xB041,0xB986,0xA800,0xA800,0xB000,0xB000,0xCA49,0xFF7D,0xFFFF,0xDB8E,0xC000,0xC000,0xC000,0xC000,0xC000,0xC986,0xF6DB,0xFFFF,0xFFFF,0xD30C,0xB800,0xB000,0xB000,0xA800,0xB986,0xB041,0x1800,0x0000,0x0000, // row 23, 768 pixels
0x0000,0x0000,0x0000,0x5800,0xB0E3,0xA8C3,0xA800,0xA800,0xA800,0xB000,0xCACB,0xD38E,0xB000,0xB800,0xB800,0xB800,0xB800,0xB800,0xB800,0xC145,0xF6DB,0xD34D,0xB000,0xB000,0xA800,0xA800,0xB0C3,0xB0E3,0x5800,0x0000,0x0000,0x0000, // row 24, 800 pixels
0x0000,0x0000,0x0000,0x0000,0x6000,0xB124,0xA882,0xA000,0xA800,0xA800,0xA800,0xA800,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xB000,0xA800,0xA800,0xA800,0xA800,0xA882,0xB124,0x6000,0x0000,0x0000,0x0000,0x0000, // row 25, 832 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0xB104,0xA882,0xA000,0xA000,0xA000,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA800,0xA000,0xA000,0xA882,0xB104,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 26, 864 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6000,0xB0A2,0xA8C3,0xA020,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA000,0xA020,0xA8C3,0xB0A2,0x6000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 27, 896 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4800,0xA800,0xB0C3,0xA0A2,0x9800,0x9800,0x9800,0x9800,0xA000,0xA000,0xA000,0x9800,0x9800,0x9800,0xA082,0xB0E3,0xA800,0x4800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 28, 928 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5800,0xA800,0xB0A2,0xA8E3,0xA0A2,0xA041,0x9800,0x9800,0xA041,0xA0A2,0xA8E3,0xB0A2,0xA800,0x5800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 29, 960 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3000,0x6000,0x8800,0xA000,0xA800,0xA800,0xA000,0x8800,0x6000,0x3000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 30, 992 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}; // row 31, 1024 pixels

View File

@ -1,110 +0,0 @@
// Code partly derived from ILI9341_Due library example
// Draws the 3 icons across the middle of the screen and pauses.
// Then draws 300 icons at random locations, clears screen and repeats
//
// This demonstrates drawing icons from FLASH
// Icons are stored in tabs, e.g. Alert.h etc
// more than one icon can be in a header file.
// Original sketch header follow:
/*
This sketch demonstrates loading images from arrays stored in program (FLASH) memory.
This sketch does not use/need any fonts at all...
Arrays containing FLASH images can be created with UTFT library tool:
(libraries\UTFT\Tools\ImageConverter565.exe)
Convert to .c format then copy into a new tab
The number and size of icons is limited by available FLASH memory. The icon array will
use width x height x 2 bytes of FLASH, i.e. 32 x 32 icon uses ~2048 bytes
*/
#include <TFT_eSPI.h> // Graphics and font library for ST7735 driver chip
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI(); // Invoke library, pins defined in User_Setup.h
// Include the header files that contain the icons
#include "alert.h"
#include "Close.h"
#include "Info.h"
long count = 0; // Loop count
void setup()
{
Serial.begin(115200);
tft.init();
tft.setRotation(1); // landscape
tft.fillScreen(TFT_BLACK);
// Draw the icons
drawIcon(info, (tft.width() - infoWidth)/2 - 50, (tft.height() - infoHeight)/2, infoWidth, infoHeight);
drawIcon(alert, (tft.width() - alertWidth)/2, (tft.height() - alertHeight)/2, alertWidth, alertHeight);
drawIcon(close, (tft.width() - closeWidth)/2 + 50, (tft.height() - closeHeight)/2, closeWidth, closeHeight);
// Pause here to admire the icons!
delay(4000);
}
void loop()
{
// Loop filling and clearing screen
drawIcon(info, random(tft.width() - infoWidth), random(tft.height() - infoHeight), infoWidth, infoHeight);
drawIcon(alert, random(tft.width() - alertWidth), random(tft.height() - alertHeight), alertWidth, alertHeight);
drawIcon(close, random(tft.width() - closeWidth), random(tft.height() - closeHeight), alertWidth, closeHeight);
// Clear screen after 100 x 3 = 300 icons drawn
if (100 == count++) {
count = 1;
tft.setRotation(2 * random(2)); // Rotate randomly to clear display left>right or right>left to reduce monotony!
tft.fillScreen(TFT_BLACK);
tft.setRotation(1);
Serial.println(millis());
}
}
//====================================================================================
// This is the function to draw the icon stored as an array in program memory (FLASH)
//====================================================================================
// To speed up rendering we use a 64 pixel buffer
#define BUFF_SIZE 64
// Draw array "icon" of defined width and height at coordinate x,y
// Maximum icon size is 255x255 pixels to avoid integer overflow
void drawIcon(const unsigned short* icon, int16_t x, int16_t y, int8_t width, int8_t height) {
uint16_t pix_buffer[BUFF_SIZE]; // Pixel buffer (16 bits per pixel)
// Set up a window the right size to stream pixels into
tft.setAddrWindow(x, y, x + width - 1, y + height - 1);
// Work out the number whole buffers to send
uint16_t nb = ((uint16_t)height * width) / BUFF_SIZE;
// Fill and send "nb" buffers to TFT
for (int i = 0; i < nb; i++) {
for (int j = 0; j < BUFF_SIZE; j++) {
pix_buffer[j] = pgm_read_word(&icon[i * BUFF_SIZE + j]);
}
tft.pushColors(pix_buffer, BUFF_SIZE);
}
// Work out number of pixels not yet sent
uint16_t np = ((uint16_t)height * width) % BUFF_SIZE;
// Send any partial buffer left over
if (np) {
for (int i = 0; i < np; i++) pix_buffer[i] = pgm_read_word(&icon[nb * BUFF_SIZE + i]);
tft.pushColors(pix_buffer, np);
}
}

View File

@ -1,41 +0,0 @@
// We need this header file to use FLASH as storage with PROGMEM directive:
#include <pgmspace.h>
// Icon width and height
const uint16_t infoWidth = 32;
const uint16_t infoHeight = 32;
// The icon file can be created with the "UTFT ImageConverter 565" bitmap to .c file creation utility, more can be pasted in here
const unsigned short info[1024] PROGMEM={
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 0, 32 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x4A69,0x8C71,0xA514,0xBDF7,0xBDF7,0xA514,0x8C71,0x4A69,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 1, 64 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39E7,0x9CF3,0xEF7D,0xF79E,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xFFDF,0xF79E,0xEF7D,0x9CF3,0x39E7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 2, 96 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2965,0x9492,0xF79E,0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xF79E,0x9492,0x2965,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 3, 128 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x630C,0xEF7D,0xFFDF,0xFFFF,0xFFFF,0xFFFF,0xD75F,0xB6BF,0x9E5F,0x963F,0x963F,0x9E5F,0xB6BF,0xD75F,0xFFFF,0xFFFF,0xFFFF,0xFFDF,0xEF7D,0x630C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 4, 160 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xEF7D,0xFFDF,0xFFFF,0xFFDF,0xBEDF,0x7DBF,0x7DBF,0x7DDF,0x7DDF,0x7DDF,0x7DDF,0x7DDF,0x7DBF,0x759F,0x7DBE,0xBEBF,0xFFDF,0xFFFF,0xFFDF,0xEF7D,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000, // row 5, 192 pixels
0x0000,0x0000,0x0000,0x0000,0x630C,0xEF7D,0xFFFF,0xFFFF,0xE77F,0x7DBE,0x759E,0x759F,0x7DBF,0x7DDF,0x7DDF,0x85FF,0x7DDF,0x7DDF,0x7DBF,0x759F,0x759E,0x6D7E,0x7DBE,0xDF7F,0xFFFF,0xFFFF,0xEF7D,0x630C,0x0000,0x0000,0x0000,0x0000, // row 6, 224 pixels
0x0000,0x0000,0x0000,0x31A6,0xEF5D,0xFFDF,0xFFFF,0xCF1E,0x6D7E,0x6D7E,0x759E,0x759F,0x7DBF,0x7DDF,0x8E1F,0xBEDF,0xC6FF,0x8DFF,0x75BF,0x759F,0x759E,0x6D7E,0x655E,0x655D,0xCF1E,0xFFFF,0xFFDF,0xEF5D,0x31A6,0x0000,0x0000,0x0000, // row 7, 256 pixels
0x0000,0x0000,0x0000,0x94B2,0xF7BE,0xFFFF,0xDF5E,0x655D,0x655D,0x6D7E,0x6D7E,0x759E,0x75BF,0x759F,0xEFBF,0xFFFF,0xFFFF,0xEFBF,0x759F,0x759E,0x6D7E,0x6D7E,0x655D,0x653D,0x653D,0xDF5E,0xFFFF,0xF7BE,0x94B2,0x0000,0x0000,0x0000, // row 8, 288 pixels
0x0000,0x0000,0x4228,0xEF7D,0xFFFF,0xF7BF,0x6D5D,0x653D,0x655D,0x6D5E,0x6D7E,0x759E,0x759E,0x85DF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8DFE,0x6D7E,0x6D7E,0x6D5E,0x655D,0x653D,0x5D1D,0x6D5D,0xF7BF,0xFFFF,0xEF7D,0x4228,0x0000,0x0000, // row 9, 320 pixels
0x0000,0x0000,0xA534,0xFFDF,0xFFDF,0xA65D,0x5D1D,0x5D1D,0x653D,0x655E,0x6D7E,0x6D7E,0x6D7E,0x651E,0xE77F,0xFFFF,0xFFFF,0xF7BF,0x5CFE,0x6D7E,0x6D7E,0x655E,0x653D,0x5D1D,0x5D1D,0x54FC,0xA65D,0xFFDF,0xFFDF,0xA534,0x0000,0x0000, // row 10, 352 pixels
0x0000,0x18E3,0xEF5D,0xFFFF,0xEF9E,0x5CFC,0x54FC,0x5D1D,0x5D3D,0x653D,0x655E,0x6D7E,0x6D7E,0x653E,0x6D3E,0xB67E,0xBEBE,0x755E,0x5D1E,0x6D5E,0x655E,0x653D,0x5D3D,0x5D1D,0x54FC,0x54DC,0x54FC,0xEF9E,0xFFFF,0xEF5D,0x18E3,0x0000, // row 11, 384 pixels
0x0000,0x630C,0xEF7D,0xFFDF,0xB69D,0x54DC,0x54FC,0x5CFC,0x5D1D,0x653D,0x653D,0x655E,0x6D5E,0x655E,0x5CFE,0x4C9D,0x4C7D,0x54DD,0x653E,0x655E,0x653D,0x653D,0x5D1D,0x5CFC,0x54FC,0x54DC,0x4CBC,0xB69D,0xFFDF,0xEF7D,0x630C,0x0000, // row 12, 416 pixels
0x0000,0x94B2,0xF7BE,0xFFDF,0x85BC,0x4CBC,0x54DC,0x54FC,0x5CFD,0x5D1D,0x5D3D,0x653D,0x655D,0x653D,0x85DE,0xC6FE,0xC6FE,0x85BE,0x653D,0x653D,0x5D3D,0x5D1D,0x5CFD,0x54FC,0x54DC,0x4CBC,0x4CBB,0x85BC,0xFFDF,0xF7BE,0x94B2,0x0000, // row 13, 448 pixels
0x0000,0xB5B6,0xFFDF,0xF7BE,0x651C,0x4CBB,0x4CBC,0x54DC,0x54FC,0x5CFC,0x5D1D,0x5D1D,0x653D,0x5D1D,0xE77E,0xFFDF,0xFFDF,0xEF9E,0x5CFD,0x5D1D,0x5D1D,0x5CFC,0x54FC,0x54DC,0x4CBC,0x4CBB,0x449B,0x651B,0xF7BE,0xFFDF,0xB5B6,0x0000, // row 14, 480 pixels
0x0000,0xC638,0xFFDF,0xF7BE,0x54DB,0x449B,0x4CBB,0x4CBC,0x54DC,0x54FC,0x54FC,0x5D1D,0x5D1D,0x7D7D,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0x7D7D,0x5CFD,0x54FC,0x54FC,0x54DC,0x4CBC,0x4CBB,0x449B,0x447B,0x54BB,0xF7BE,0xFFDF,0xC638,0x0000, // row 15, 512 pixels
0x0000,0xC638,0xFFDF,0xF79E,0x4CBB,0x449B,0x449B,0x4CBB,0x4CBC,0x54DC,0x54DC,0x54FC,0x54DC,0x753C,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0x753C,0x54DC,0x54DC,0x54DC,0x4CBC,0x4CBB,0x449B,0x449B,0x3C7B,0x4C9B,0xF79E,0xFFDF,0xC638,0x0000, // row 16, 544 pixels
0x0000,0xB5B6,0xFFDF,0xF7BE,0x5CFB,0x3C7B,0x447B,0x449B,0x4CBB,0x4CBC,0x4CBC,0x4CDC,0x4CBC,0x6D1C,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0x6CFC,0x4CBC,0x4CBC,0x4CBC,0x4CBB,0x449B,0x447B,0x3C7B,0x3C5A,0x54DB,0xF7BE,0xFFDF,0xB5B6,0x0000, // row 17, 576 pixels
0x0000,0x94B2,0xF7BE,0xF7BE,0x755B,0x3C5A,0x3C7B,0x447B,0x449B,0x449B,0x4CBB,0x4CBB,0x4C9B,0x6CFB,0xF79E,0xF79E,0xF79E,0xF79E,0x64FB,0x449B,0x4CBB,0x449B,0x449B,0x447B,0x3C7B,0x3C5A,0x3C5A,0x753B,0xF7BE,0xF7BE,0x9CD3,0x0000, // row 18, 608 pixels
0x0000,0x6B4D,0xEF7D,0xF7BE,0xA61C,0x3C5A,0x3C5A,0x3C7B,0x447B,0x447B,0x449B,0x449B,0x447B,0x64DB,0xF79E,0xF79E,0xF79E,0xF79E,0x64DB,0x447B,0x449B,0x447B,0x447B,0x3C7B,0x3C5A,0x3C5A,0x343A,0xA61C,0xF7BE,0xEF7D,0x6B4D,0x0000, // row 19, 640 pixels
0x0000,0x2124,0xE71C,0xFFDF,0xDF3D,0x3C5A,0x343A,0x3C5A,0x3C5A,0x3C7B,0x3C7B,0x447B,0x3C5B,0x64BA,0xF79E,0xF79E,0xF79E,0xF79E,0x64BA,0x3C5B,0x3C7B,0x3C7B,0x3C5A,0x3C5A,0x343A,0x343A,0x343A,0xDF3D,0xFFDF,0xE71C,0x2124,0x0000, // row 20, 672 pixels
0x0000,0x0000,0xAD75,0xF7BE,0xF79E,0x859B,0x343A,0x343A,0x345A,0x3C5A,0x3C5A,0x3C5A,0x3C5A,0x5C9A,0xEF7D,0xEF7D,0xEF7D,0xEF7D,0x5C9A,0x3C3A,0x3C5A,0x3C5A,0x345A,0x343A,0x343A,0x341A,0x859B,0xF79E,0xF7BE,0xAD75,0x0000,0x0000, // row 21, 704 pixels
0x0000,0x0000,0x528A,0xE71C,0xFFDF,0xDF3D,0x3C5A,0x343A,0x343A,0x343A,0x343A,0x3C5A,0x343A,0x4C5A,0xEF7D,0xEF7D,0xEF7D,0xEF7D,0x4C59,0x343A,0x343A,0x343A,0x343A,0x343A,0x341A,0x3C5A,0xDF3D,0xFFDF,0xE71C,0x528A,0x0000,0x0000, // row 22, 736 pixels
0x0000,0x0000,0x0000,0x9CD3,0xF79E,0xF7BE,0xBE7C,0x3419,0x341A,0x341A,0x343A,0x343A,0x341A,0x2B99,0xC69C,0xEF7D,0xEF7D,0xD6DC,0x2398,0x341A,0x343A,0x341A,0x341A,0x2C19,0x2C19,0xBE7C,0xF7BE,0xF79E,0x9CD3,0x0000,0x0000,0x0000, // row 23, 768 pixels
0x0000,0x0000,0x0000,0x39E7,0xDEDB,0xFFDF,0xF79E,0x9DFB,0x2C19,0x2C19,0x2C1A,0x341A,0x341A,0x2BB9,0x2B57,0x6459,0x74B9,0x2337,0x2BB9,0x341A,0x2C1A,0x2C19,0x2C19,0x2C19,0x9DFB,0xF79E,0xFFDF,0xDEDB,0x39E7,0x0000,0x0000,0x0000, // row 24, 800 pixels
0x0000,0x0000,0x0000,0x0000,0x632C,0xDEFB,0xFFDF,0xEF7D,0xB65C,0x3C39,0x2BF9,0x2C19,0x2C19,0x2BF9,0x2398,0x1B58,0x1B37,0x2398,0x2BF9,0x2C19,0x2BF9,0x2BF9,0x3439,0xB65C,0xEF7D,0xFFDF,0xDEFB,0x632C,0x0000,0x0000,0x0000,0x0000, // row 25, 832 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x73AE,0xDEFB,0xF7BE,0xF79E,0xDF1C,0x7D5A,0x2BF9,0x2BF9,0x2BF9,0x2BF9,0x23D9,0x23D9,0x2BF9,0x2BF9,0x2BF9,0x2BF9,0x7D5A,0xDF1C,0xF79E,0xF7BE,0xDEFB,0x73AE,0x0000,0x0000,0x0000,0x0000,0x0000, // row 26, 864 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x632C,0xDEDB,0xF79E,0xFFDF,0xEF7D,0xD6FC,0x9DFB,0x5CDA,0x4C9A,0x3419,0x3419,0x4C9A,0x5CDA,0x9DFB,0xD6FC,0xEF7D,0xFFDF,0xF79E,0xDEDB,0x632C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 27, 896 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4208,0x94B2,0xDEFB,0xF7BE,0xFFDF,0xF7BE,0xF79E,0xEF7D,0xEF5D,0xEF5D,0xEF7D,0xF79E,0xF7BE,0xFFDF,0xF7BE,0xDEFB,0x94B2,0x4208,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 28, 928 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528A,0xA534,0xDEDB,0xE73C,0xF79E,0xF7BE,0xF7BE,0xF7BE,0xF7BE,0xF79E,0xE73C,0xDEDB,0xA534,0x528A,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 29, 960 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18C3,0x5AEB,0x8C71,0xAD55,0xBDD7,0xBDD7,0xAD55,0x8C71,0x5AEB,0x18C3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, // row 30, 992 pixels
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}; // row 31, 1024 pixels

View File

@ -107,13 +107,17 @@ void midline() {
// If the ball is not on the line then don't redraw the line
if ((ball_x<dashline_x-ball_w) && (ball_x > dashline_x+dashline_w)) return;
tft.startWrite();
// Quick way to draw a dashed line
tft.setAddrWindow(dashline_x,0,dashline_x+dashline_w-1,h);
tft.setAddrWindow(dashline_x, 0, dashline_w, h);
for(int16_t i = 0; i < dashline_n; i+=2) {
tft.pushColor(WHITE, dashline_w*dashline_h); // push dash pixels
tft.pushColor(BLACK, dashline_w*dashline_h); // push gap pixels
}
tft.endWrite();
}
void lpaddle() {

View File

@ -0,0 +1,191 @@
/*====================================================================================
This sketch contains support functions to render the Jpeg images.
Created by Bodmer 15th Jan 2017
==================================================================================*/
// Return the minimum of two values a and b
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
//====================================================================================
// Opens the image file and prime the Jpeg decoder
//====================================================================================
void drawJpeg(const char *filename, int xpos, int ypos) {
Serial.println("===========================");
Serial.print("Drawing file: "); Serial.println(filename);
Serial.println("===========================");
// Open the named file (the Jpeg decoder library will close it after rendering image)
fs::File jpegFile = SPIFFS.open( filename, "r"); // File handle reference for SPIFFS
// File jpegFile = SD.open( filename, FILE_READ); // or, file handle reference for SD library
if ( !jpegFile ) {
Serial.print("ERROR: File \""); Serial.print(filename); Serial.println ("\" not found!");
return;
}
// Use one of the three following methods to initialise the decoder:
//boolean decoded = JpegDec.decodeFsFile(jpegFile); // Pass a SPIFFS file handle to the decoder,
//boolean decoded = JpegDec.decodeSdFile(jpegFile); // or pass the SD file handle to the decoder,
boolean decoded = JpegDec.decodeFsFile(filename); // or pass the filename (leading / distinguishes SPIFFS files)
// Note: the filename can be a String or character array type
if (decoded) {
// print information about the image to the serial port
jpegInfo();
// render the image onto the screen at given coordinates
jpegRender(xpos, ypos);
}
else {
Serial.println("Jpeg file format not supported!");
}
}
//====================================================================================
// Decode and render the Jpeg image onto the TFT screen
//====================================================================================
void jpegRender(int xpos, int ypos) {
// retrieve infomration about the image
uint16_t *pImg;
uint16_t mcu_w = JpegDec.MCUWidth;
uint16_t mcu_h = JpegDec.MCUHeight;
uint32_t max_x = JpegDec.width;
uint32_t max_y = JpegDec.height;
// Jpeg images are draw as a set of image block (tiles) called Minimum Coding Units (MCUs)
// Typically these MCUs are 16x16 pixel blocks
// Determine the width and height of the right and bottom edge image blocks
uint32_t min_w = minimum(mcu_w, max_x % mcu_w);
uint32_t min_h = minimum(mcu_h, max_y % mcu_h);
// save the current image block size
uint32_t win_w = mcu_w;
uint32_t win_h = mcu_h;
// record the current time so we can measure how long it takes to draw an image
uint32_t drawTime = millis();
// save the coordinate of the right and bottom edges to assist image cropping
// to the screen size
max_x += xpos;
max_y += ypos;
// read each MCU block until there are no more
while ( JpegDec.readSwappedBytes()) { // Swap byte order so the SPI buffer can be used
// save a pointer to the image block
pImg = JpegDec.pImage;
// calculate where the image block should be drawn on the screen
int mcu_x = JpegDec.MCUx * mcu_w + xpos; // Calculate coordinates of top left corner of current MCU
int mcu_y = JpegDec.MCUy * mcu_h + ypos;
// check if the image block size needs to be changed for the right edge
if (mcu_x + mcu_w <= max_x) win_w = mcu_w;
else win_w = min_w;
// check if the image block size needs to be changed for the bottom edge
if (mcu_y + mcu_h <= max_y) win_h = mcu_h;
else win_h = min_h;
// copy pixels into a contiguous block
if (win_w != mcu_w)
{
uint16_t *cImg;
int p = 0;
cImg = pImg + win_w;
for (int h = 1; h < win_h; h++)
{
p += mcu_w;
for (int w = 0; w < win_w; w++)
{
*cImg = *(pImg + w + p);
cImg++;
}
}
}
// draw image MCU block only if it will fit on the screen
if ( ( mcu_x + win_w) <= tft.width() && ( mcu_y + win_h) <= tft.height())
{
tft.pushRect(mcu_x, mcu_y, win_w, win_h, pImg);
}
else if ( ( mcu_y + win_h) >= tft.height()) JpegDec.abort();
}
// calculate how long it took to draw the image
drawTime = millis() - drawTime; // Calculate the time it took
// print the results to the serial port
Serial.print ("Total render time was : "); Serial.print(drawTime); Serial.println(" ms");
Serial.println("=====================================");
}
//====================================================================================
// Print information decoded from the Jpeg image
//====================================================================================
void jpegInfo() {
Serial.println("===============");
Serial.println("JPEG image info");
Serial.println("===============");
Serial.print ("Width :"); Serial.println(JpegDec.width);
Serial.print ("Height :"); Serial.println(JpegDec.height);
Serial.print ("Components :"); Serial.println(JpegDec.comps);
Serial.print ("MCU / row :"); Serial.println(JpegDec.MCUSPerRow);
Serial.print ("MCU / col :"); Serial.println(JpegDec.MCUSPerCol);
Serial.print ("Scan type :"); Serial.println(JpegDec.scanType);
Serial.print ("MCU width :"); Serial.println(JpegDec.MCUWidth);
Serial.print ("MCU height :"); Serial.println(JpegDec.MCUHeight);
Serial.println("===============");
Serial.println("");
}
//====================================================================================
// Open a Jpeg file and send it to the Serial port in a C array compatible format
//====================================================================================
void createArray(const char *filename) {
// Open the named file
fs::File jpgFile = SPIFFS.open( filename, "r"); // File handle reference for SPIFFS
// File jpgFile = SD.open( filename, FILE_READ); // or, file handle reference for SD library
if ( !jpgFile ) {
Serial.print("ERROR: File \""); Serial.print(filename); Serial.println ("\" not found!");
return;
}
uint8_t data;
byte line_len = 0;
Serial.println("");
Serial.println("// Generated by a JPEGDecoder library example sketch:");
Serial.println("// https://github.com/Bodmer/JPEGDecoder");
Serial.println("");
Serial.println("#include <pgmspace.h>");
Serial.println("// Remove leading / from array name!");
Serial.print ("const uint8_t ");
while (*filename != '.') Serial.print(*filename++);
Serial.println("[] PROGMEM = {"); // PROGMEM added for AVR processors, it is ignored by Due
while ( jpgFile.available()) {
data = jpgFile.read();
Serial.print("0x"); if (abs(data) < 16) Serial.print("0");
Serial.print(data, HEX); Serial.print(",");// Add value and comma
line_len++;
if ( line_len >= 32) {
line_len = 0;
Serial.println();
}
}
Serial.println("};\r\n");
jpgFile.close();
}
//====================================================================================

View File

@ -14,8 +14,7 @@ void listFiles(void) {
fs::Dir dir = SPIFFS.openDir("/"); // Root directory
String line = "=====================================";
uint32_t totalBytes = 0;
Serial.println(line);
Serial.println(" File name Size");
Serial.println(line);
@ -27,13 +26,8 @@ void listFiles(void) {
while (spaces--) Serial.print(" ");
fs::File f = dir.openFile("r");
Serial.print(f.size()); Serial.println(" bytes");
totalBytes += f.size();
}
Serial.println(); Serial.print("Total = ");
int spaces = 25 - 8; // Tabulate nicely
while (spaces--) Serial.print(" ");
Serial.print(totalBytes); Serial.println(" bytes");
Serial.println(line);
Serial.println();
delay(1000);

View File

@ -0,0 +1,129 @@
/*====================================================================================
This sketch demonstrates loading images which have been stored as files in the
built-in FLASH memory on a NodeMCU 1.0 (ESP8266 based, ESP-12E Module) rendering the
images onto a 160 x 128 pixel TFT screen.
The images are stored in the SPI FLASH Filing System (SPIFFS), which effectively
functions like a tiny "hard drive". This filing system is built into the ESP8266
Core that can be loaded from the IDE "Boards manager" menu option. This is at
version 2.3.0 at the time of sketch creation.
The size of the SPIFFS partition can be set in the IDE as 1Mbyte or 3Mbytes. Either
will work with this sketch. Typically most sketches easily fit within 1 Mbyte so a
3 Mbyte SPIFS partition can be used, in which case it can contain 100's of Jpeg
full screem images.
The Jpeg library can be found here:
https://github.com/Bodmer/JPEGDecoder
Images in the Jpeg format can be created using Paint or IrfanView or other picture
editting software.
Place the images inside the sketch folder, in a folder called "Data". Then upload
all the files in the folder using the Arduino IDE "ESP8266 Sketch Data Upload" option
in the "Tools" menu:
http://www.esp8266.com/viewtopic.php?f=32&t=10081
https://github.com/esp8266/arduino-esp8266fs-plugin/releases
This takes some time, but the SPIFFS content is not altered when a new sketch is
uploaded, so there is no need to upload the same files again!
Note: If open, you must close the "Serial Monitor" window to upload data to SPIFFS!
The IDE will not copy the "data" folder with the sketch if you save the sketch under
another name. It is necessary to manually make a copy and place it in the sketch
folder.
This sketch includes example images in the Data folder.
Saving images, uploading and rendering on the TFT screen couldn't be much easier!
Created by Bodmer 24th Jan 2017 - Tested in Arduino IDE 1.8.0 esp8266 Core 2.3.0
==================================================================================*/
//====================================================================================
// Libraries
//====================================================================================
// Call up the SPIFFS FLASH filing system this is part of the ESP Core
#define FS_NO_GLOBALS
#include <FS.h>
// JPEG decoder library
#include <JPEGDecoder.h>
// SPI library, built into IDE
#include <SPI.h>
// Call up the TFT library
#include <TFT_eSPI.h> // Hardware-specific library for ESP8266
// The TFT control pins are set in the User_Setup.h file <<<<<<<<<<<<<<<<< NOTE!
// that can be found in the "src" folder of the library
// Invoke TFT library
TFT_eSPI tft = TFT_eSPI();
//====================================================================================
// Setup
//====================================================================================
void setup()
{
Serial.begin(250000); // Used for messages and the C array generator
delay(10);
Serial.println("NodeMCU decoder test!");
tft.begin();
tft.setRotation(0); // 0 & 2 Portrait. 1 & 3 landscape
tft.fillScreen(TFT_BLACK);
if (!SPIFFS.begin()) {
Serial.println("SPIFFS initialisation failed!");
while (1) yield(); // Stay here twiddling thumbs waiting
}
Serial.println("\r\nInitialisation done.");
listFiles(); // Lists the files so you can see what is in the SPIFFS
}
//====================================================================================
// Loop
//====================================================================================
void loop()
{
// Note the / before the SPIFFS file name must be present, this means the file is in
// the root directory of the SPIFFS, e.g. "/Tiger.jpg" for a file called "Tiger.jpg"
tft.setRotation(0); // portrait
tft.fillScreen(random(0xFFFF));
drawJpeg("/EagleEye160.jpg", 0, 16);
delay(2000);
tft.fillScreen(random(0xFFFF));
drawJpeg("/tiger160.jpg", 4, 0);
delay(2000);
tft.setRotation(1); // landscape
//tft.fillScreen(random(0xFFFF));
drawJpeg("/arduino160.jpg", 0, 0);
delay(2000);
tft.fillScreen(TFT_BLACK);
drawJpeg("/Baboon160.jpg", 0, 4);
delay(2000);
tft.fillScreen(random(0xFFFF));
drawJpeg("/Mouse160.jpg", 0, 11);
delay(2000);
// Create arrays from the jpeg images and send them to the serial port for copy and
// pasting into a sketch (used to make arrays fot the TFT_FLASH_Jpeg sketch)
//createArray("/EagleEye160.jpg");
//createArray("/tiger160.jpg");
//createArray("/Baboon160.jpg");
//createArray("/Mouse160.jpg");
//while(1) yield(); // Stay here
}
//====================================================================================

View File

@ -0,0 +1,212 @@
// Sketch to display images on a 160 x 128 TFT
// Renders images stored in an array in program (FLASH)
// The JPEG images are stored in header files (see jpeg1.h etc)
// As well as the TFT_eSPI library:
// https://github.com/Bodmer/TFT_eSPI
// the sketch needs the JPEG Decoder library. This can be loaded via the Library Manager.
// or can be downloaded here:
// https://github.com/Bodmer/JPEGDecoder
//----------------------------------------------------------------------------------------------------
#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
// JPEG decoder library
#include <JPEGDecoder.h>
// Return the minimum of two values a and b
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
// Include the sketch header file that contains the image stored as an array of bytes
// More than one image array could be stored in each header file.
#include "jpeg1.h"
#include "jpeg2.h"
#include "jpeg3.h"
#include "jpeg4.h"
// Count how many times the image is drawn for test purposes
uint32_t icount = 0;
//----------------------------------------------------------------------------------------------------
//####################################################################################################
// Setup
//####################################################################################################
void setup() {
Serial.begin(115200);
tft.begin();
}
//####################################################################################################
// Main loop
//####################################################################################################
void loop() {
tft.setRotation(0); // portrait
tft.fillScreen(TFT_BLACK);
drawArrayJpeg(EagleEye, sizeof(EagleEye), 0, 16); // Draw a jpeg image stored in memory at x,y
delay(2000);
tft.setRotation(0); // portrait
tft.fillScreen(TFT_BLACK);
drawArrayJpeg(Tiger, sizeof(Tiger), 4, 0); // Draw a jpeg image stored in memory
delay(2000);
tft.setRotation(1); // landscape
tft.fillScreen(TFT_BLACK);
drawArrayJpeg(Baboon, sizeof(Baboon), 0, 4); // Draw a jpeg image stored in memory
delay(2000);
tft.setRotation(1); // landscape
tft.fillScreen(TFT_BLACK);
drawArrayJpeg(Mouse160, sizeof(Mouse160), 0, 11); // Draw a jpeg image stored in memory
delay(2000);
}
//####################################################################################################
// Draw a JPEG on the TFT pulled from a program memory array
//####################################################################################################
void drawArrayJpeg(const uint8_t arrayname[], uint32_t array_size, int xpos, int ypos) {
int x = xpos;
int y = ypos;
JpegDec.decodeArray(arrayname, array_size);
jpegInfo(); // Print information from the JPEG file (could comment this line out)
renderJPEG(x, y);
Serial.println("#########################");
}
//####################################################################################################
// Draw a JPEG on the TFT, images will be cropped on the right/bottom sides if they do not fit
//####################################################################################################
// This function assumes xpos,ypos is a valid screen coordinate. For convenience images that do not
// fit totally on the screen are cropped to the nearest MCU size and may leave right/bottom borders.
void renderJPEG(int xpos, int ypos) {
// retrieve infomration about the image
uint16_t *pImg;
uint16_t mcu_w = JpegDec.MCUWidth;
uint16_t mcu_h = JpegDec.MCUHeight;
uint32_t max_x = JpegDec.width;
uint32_t max_y = JpegDec.height;
// Jpeg images are draw as a set of image block (tiles) called Minimum Coding Units (MCUs)
// Typically these MCUs are 16x16 pixel blocks
// Determine the width and height of the right and bottom edge image blocks
uint32_t min_w = minimum(mcu_w, max_x % mcu_w);
uint32_t min_h = minimum(mcu_h, max_y % mcu_h);
// save the current image block size
uint32_t win_w = mcu_w;
uint32_t win_h = mcu_h;
// record the current time so we can measure how long it takes to draw an image
uint32_t drawTime = millis();
// save the coordinate of the right and bottom edges to assist image cropping
// to the screen size
max_x += xpos;
max_y += ypos;
// read each MCU block until there are no more
while (JpegDec.readSwappedBytes()) {
// save a pointer to the image block
pImg = JpegDec.pImage ;
// calculate where the image block should be drawn on the screen
int mcu_x = JpegDec.MCUx * mcu_w + xpos; // Calculate coordinates of top left corner of current MCU
int mcu_y = JpegDec.MCUy * mcu_h + ypos;
// check if the image block size needs to be changed for the right edge
if (mcu_x + mcu_w <= max_x) win_w = mcu_w;
else win_w = min_w;
// check if the image block size needs to be changed for the bottom edge
if (mcu_y + mcu_h <= max_y) win_h = mcu_h;
else win_h = min_h;
// copy pixels into a contiguous block
if (win_w != mcu_w)
{
uint16_t *cImg;
int p = 0;
cImg = pImg + win_w;
for (int h = 1; h < win_h; h++)
{
p += mcu_w;
for (int w = 0; w < win_w; w++)
{
*cImg = *(pImg + w + p);
cImg++;
}
}
}
// draw image MCU block only if it will fit on the screen
if (( mcu_x + win_w ) <= tft.width() && ( mcu_y + win_h ) <= tft.height())
{
tft.pushRect(mcu_x, mcu_y, win_w, win_h, pImg);
}
else if ( (mcu_y + win_h) >= tft.height()) JpegDec.abort(); // Image has run off bottom of screen so abort decoding
}
// calculate how long it took to draw the image
drawTime = millis() - drawTime;
// print the results to the serial port
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
//####################################################################################################
// Print image information to the serial port (optional)
//####################################################################################################
void jpegInfo() {
Serial.println(F("==============="));
Serial.println(F("JPEG image info"));
Serial.println(F("==============="));
Serial.print(F( "Width :")); Serial.println(JpegDec.width);
Serial.print(F( "Height :")); Serial.println(JpegDec.height);
Serial.print(F( "Components :")); Serial.println(JpegDec.comps);
Serial.print(F( "MCU / row :")); Serial.println(JpegDec.MCUSPerRow);
Serial.print(F( "MCU / col :")); Serial.println(JpegDec.MCUSPerCol);
Serial.print(F( "Scan type :")); Serial.println(JpegDec.scanType);
Serial.print(F( "MCU width :")); Serial.println(JpegDec.MCUWidth);
Serial.print(F( "MCU height :")); Serial.println(JpegDec.MCUHeight);
Serial.println(F("==============="));
}
//####################################################################################################
// Show the execution time (optional)
//####################################################################################################
// WARNING: for UNO/AVR legacy reasons printing text to the screen with the Mega might not work for
// sketch sizes greater than ~70KBytes because 16 bit address pointers are used in some libraries.
// The Due will work fine with the HX8357_Due library.
void showTime(uint32_t msTime) {
//tft.setCursor(0, 0);
//tft.setTextFont(1);
//tft.setTextSize(2);
//tft.setTextColor(TFT_WHITE, TFT_BLACK);
//tft.print(F(" JPEG drawn in "));
//tft.print(msTime);
//tft.println(F(" ms "));
Serial.print(F(" JPEG drawn in "));
Serial.print(msTime);
Serial.println(F(" ms "));
}

View File

@ -0,0 +1,212 @@
// We need this header file to use FLASH as storage with PROGMEM directive
#include <pgmspace.h>
const uint8_t EagleEye[] PROGMEM = {
0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x00,0xB4,0x00,0xB4,0x00,0x00,0xFF,0xDB,0x00,0x43,0x00,0x04,0x03,0x03,0x03,0x03,0x02,0x04,
0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x0A,0x06,0x06,0x05,0x05,0x06,0x0C,0x08,0x09,0x07,0x0A,0x0E,0x0C,0x0F,0x0E,0x0E,0x0C,0x0D,0x0D,0x0F,0x11,0x16,0x13,0x0F,
0x10,0x15,0x11,0x0D,0x0D,0x13,0x1A,0x13,0x15,0x17,0x18,0x19,0x19,0x19,0x0F,0x12,0x1B,0x1D,0x1B,0x18,0x1D,0x16,0x18,0x19,0x18,0xFF,0xDB,0x00,0x43,0x01,0x04,0x04,
0x04,0x06,0x05,0x06,0x0B,0x06,0x06,0x0B,0x18,0x10,0x0D,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xC0,
0x00,0x11,0x08,0x00,0x80,0x00,0x80,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xFF,0xC4,0x00,0x1D,0x00,0x00,0x03,0x01,0x00,0x03,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x07,0x04,0x02,0x03,0x08,0x01,0x09,0x00,0xFF,0xC4,0x00,0x3F,0x10,0x00,0x02,0x01,0x02,0x04,0x03,0x06,0x05,0x01,0x05,0x07,
0x03,0x05,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x11,0x00,0x05,0x12,0x21,0x06,0x31,0x41,0x13,0x14,0x22,0x51,0x61,0x71,0x07,0x32,0x81,0x91,0xA1,0xB1,0x23,0x42,0xC1,
0xD1,0xF0,0x15,0x24,0x25,0x33,0x52,0x62,0x72,0x08,0x34,0x92,0x16,0x43,0x53,0xA2,0xE1,0xFF,0xC4,0x00,0x1A,0x01,0x00,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x01,0x04,0x05,0x06,0xFF,0xC4,0x00,0x28,0x11,0x00,0x02,0x02,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x01,0x02,0x00,0x11,0x03,0x04,0x12,0x21,0x31,0x13,0x05,0x22,0x32,0x41,0x51,0x14,0x15,0x61,0x71,0x81,0x91,0xFF,0xDA,0x00,0x0C,0x03,0x01,0x00,0x02,0x11,
0x03,0x11,0x00,0x3F,0x00,0x6C,0x4C,0xFE,0x4C,0xAB,0x2B,0x4A,0x65,0xB5,0x2B,0x01,0x74,0x58,0x90,0x24,0x30,0x13,0x6D,0xEC,0x3F,0x7B,0xD7,0x9E,0x34,0x53,0xE7,0x51,
0x8D,0x15,0x11,0x42,0xD3,0x4A,0xA7,0x50,0x91,0x9F,0x48,0x66,0xF3,0x37,0xDC,0x9F,0xA7,0xDB,0x13,0xFC,0xE3,0x3D,0xA0,0xAC,0xCC,0x84,0x39,0x74,0x46,0x34,0x43,0x76,
0x9A,0x49,0x0B,0x28,0x3E,0xE4,0x0B,0xFD,0x00,0xF7,0x38,0x6B,0xE1,0x9C,0xF3,0x86,0x29,0x20,0x66,0xAB,0xA4,0x7A,0xD9,0x2C,0x2F,0x34,0xB2,0x68,0x43,0x6F,0xF7,0x58,
0x9B,0x7A,0x2E,0x38,0xAE,0x8C,0x00,0x27,0xB9,0xE8,0x43,0x83,0xF1,0x8C,0x73,0x71,0xB5,0x5E,0x59,0x46,0x8F,0x57,0x2B,0xB9,0x67,0x2B,0xD8,0xC7,0xE1,0xD4,0x4E,0xFC,
0xB9,0x91,0xEA,0xD8,0x16,0x2B,0xF3,0xEE,0x28,0xAA,0x4E,0xF3,0x53,0xDD,0x29,0x57,0x60,0x01,0x0A,0xAA,0x3F,0x4C,0x0B,0xAA,0xCD,0x78,0x4E,0x59,0x5E,0x70,0x89,0x08,
0x0D,0x71,0x69,0x1D,0x8F,0x3E,0x40,0xB3,0x1D,0xBD,0x80,0xC6,0xCA,0x0C,0xDE,0x3A,0x97,0x58,0xF2,0xAC,0xBA,0x5A,0x89,0x01,0xBA,0xEA,0x21,0x45,0xFA,0x1F,0x15,0xB0,
0x46,0xEB,0x88,0x3C,0x5D,0xCA,0x77,0x08,0xC1,0x96,0xE5,0x71,0xDB,0x2D,0x53,0x99,0x56,0x1E,0x73,0xB8,0x2B,0x1A,0x1E,0x5F,0x31,0xDD,0xBA,0xF2,0xBF,0x2E,0x78,0x25,
0x9B,0xE7,0xD9,0x95,0x04,0xD2,0x45,0x51,0x53,0x1B,0x80,0x36,0x85,0x06,0x94,0x3E,0x44,0x8F,0xE7,0x7C,0x22,0xC3,0x98,0x71,0x7D,0x2C,0x5A,0xCF,0x78,0x90,0x91,0xA7,
0xB1,0xA0,0x84,0x39,0xFF,0x00,0xC8,0x9E,0x9E,0x98,0x5C,0xAE,0xE2,0x5A,0xE3,0x9C,0x32,0x54,0x43,0x1D,0x35,0x41,0xF9,0x9A,0xA9,0x8C,0x92,0xDB,0xD5,0x4D,0xBF,0x8E,
0x23,0x29,0x65,0xAB,0x90,0x28,0xBB,0x8F,0xA2,0xBA,0xA3,0x36,0x74,0x7A,0xFE,0xED,0x28,0x53,0xE0,0x1F,0x30,0x51,0xE9,0x7B,0x5B,0xEF,0x86,0x38,0x33,0x7C,0xAF,0x26,
0xA4,0x12,0x54,0xB8,0x43,0x7D,0xA3,0x45,0x63,0xF8,0x17,0xFD,0x31,0x32,0xCB,0x12,0x7A,0xA9,0xE3,0xED,0xE6,0xCD,0x24,0x57,0x5D,0x43,0xB0,0x8C,0x42,0xBF,0xC3,0x0D,
0xB1,0x65,0x19,0x3C,0x22,0x36,0x58,0xC0,0x95,0xB9,0x34,0xB5,0x57,0x72,0x3D,0xB4,0x9B,0xF3,0xF3,0xC6,0x73,0x8C,0x77,0x77,0x1F,0xB8,0x9E,0x2A,0x30,0xBF,0x1B,0x65,
0x95,0xF2,0x68,0x8B,0x2E,0xA9,0xA9,0x07,0xE5,0x09,0x12,0xED,0xEA,0x4B,0x72,0xFB,0x1C,0x74,0xD7,0xAA,0x66,0x8C,0xAD,0x0F,0x0E,0x18,0x85,0xB7,0x33,0x4C,0x01,0xF5,
0xE5,0xB7,0xF5,0xB6,0x08,0x65,0xD4,0x70,0x50,0x46,0xB2,0x99,0x69,0x5A,0xE2,0xDD,0x98,0x4B,0x11,0xEB,0x72,0x6D,0xF8,0xC0,0x3E,0x2E,0xCF,0xF8,0x96,0x29,0x0C,0x79,
0x5E,0x4F,0x2C,0xF1,0xA7,0x36,0xA7,0xF1,0x93,0xCB,0xA5,0xBF,0x43,0xE7,0x82,0xC6,0x87,0x20,0xA6,0x13,0x3E,0x43,0xB5,0xB8,0x87,0x68,0xF8,0x46,0x86,0x37,0xED,0x99,
0xE1,0xA6,0x52,0x05,0x83,0x48,0xD2,0x8F,0xD4,0x5B,0x04,0x64,0xAF,0xCA,0x28,0xA1,0xEC,0x19,0xA9,0xE7,0xD3,0x71,0xFB,0x32,0x14,0x7B,0xD9,0xAE,0x3F,0x18,0x90,0xD3,
0xF1,0x07,0x12,0x55,0x32,0xC3,0x36,0x4B,0x99,0x87,0xE4,0x5A,0x65,0x65,0x00,0x7E,0x76,0xC1,0x24,0xCB,0xEB,0xEA,0xC7,0x69,0xA2,0x9A,0x26,0x03,0x70,0xDA,0x98,0xAE,
0xDB,0x78,0x74,0x8C,0x3B,0xC7,0x8D,0x20,0x16,0x66,0xEC,0xC7,0xF7,0xCC,0x32,0xAA,0x98,0x13,0xB2,0x9F,0xBB,0x9B,0xEC,0x4C,0xAB,0x6F,0xB0,0x00,0x63,0x1B,0x45,0x54,
0x6A,0xC2,0xD1,0x66,0x54,0x73,0x5B,0x61,0x78,0xF5,0x7E,0x16,0xC4,0xE1,0x6B,0x2E,0xA7,0xAA,0xE4,0x66,0x85,0x82,0x90,0x35,0x0A,0x57,0x52,0x3E,0xAC,0x45,0xF1,0x40,
0xE1,0xBC,0xB2,0xA9,0xA4,0xED,0x66,0xAB,0x6E,0x7F,0x2C,0x8D,0x1A,0xED,0xE9,0xCC,0x81,0x84,0xDA,0xB9,0xDA,0x3B,0x8C,0x2A,0x71,0x8B,0x33,0xEE,0x55,0x3F,0x11,0x51,
0x80,0xC6,0x92,0x9A,0x7B,0xF5,0x55,0x74,0xFB,0x82,0x76,0xC3,0x1B,0x4F,0x57,0x55,0x02,0x3E,0x61,0x45,0xDD,0x5C,0x7F,0xF1,0xB9,0x03,0xF4,0xC1,0x25,0x80,0x0A,0x62,
0xAC,0xE2,0xE3,0x90,0x49,0x2E,0x48,0xFC,0x60,0x64,0xF4,0xF4,0x82,0x76,0x92,0xA6,0xB0,0xA5,0x8E,0xA1,0xAD,0x98,0xFE,0x3F,0x96,0x36,0x10,0x55,0x6A,0x63,0x2E,0x1D,
0xAE,0x7E,0x7D,0x51,0xD3,0xB4,0xD6,0x73,0x3A,0xA2,0xAA,0x8B,0xEA,0x60,0xA1,0x47,0x4F,0x7C,0x74,0xD5,0xF6,0xB3,0x59,0x1E,0xAE,0x48,0x69,0xD7,0x90,0x06,0xDA,0xCD,
0xF9,0x91,0x84,0x61,0x98,0x66,0x51,0x47,0xFE,0x61,0x13,0x11,0xB1,0x3F,0x2C,0x6B,0xE6,0x3D,0x7D,0x71,0xB3,0x2D,0xCC,0xEA,0xAA,0x67,0x58,0xA9,0xEA,0x43,0x48,0xA7,
0x79,0x0B,0x02,0x47,0xFC,0x6F,0xD7,0x0C,0x08,0x3B,0x26,0x5A,0xBD,0xFB,0x40,0x8D,0x75,0x93,0xCB,0x96,0x4B,0x1B,0xB4,0x33,0x3A,0xBF,0xCA,0xEE,0xA4,0x29,0xFA,0x9C,
0x14,0xCB,0xF8,0xD4,0xE5,0xCD,0x18,0x92,0x46,0x0D,0x20,0xF9,0x23,0x3A,0x40,0xFE,0x38,0x51,0xAF,0x6C,0xC2,0xB2,0xAF,0xFC,0x63,0x32,0x96,0x8E,0x25,0x5F,0xD9,0x40,
0xCD,0xDA,0xC8,0xC7,0xD8,0x72,0xBE,0x30,0x35,0x05,0x5C,0x68,0xD3,0x35,0x35,0x5C,0x3B,0x17,0x43,0xD9,0x30,0x24,0x0F,0x32,0x05,0xC7,0xBE,0x2F,0xD8,0xDC,0x42,0xDC,
0x54,0xCB,0x1D,0x07,0x19,0x33,0x09,0x0A,0xD3,0x42,0x74,0x8D,0x5A,0xAA,0x5D,0xA4,0x22,0xDB,0xEC,0x09,0xFE,0xAF,0x8E,0xEA,0x4E,0x31,0xCB,0x2B,0xA6,0x96,0xB3,0x30,
0xA6,0x7A,0x7D,0x3E,0x18,0xE4,0x89,0x82,0xDC,0xF2,0x1E,0x1D,0x0D,0xF6,0xBE,0x22,0x19,0x6D,0x5D,0x29,0xAB,0x59,0x59,0x65,0xED,0x6E,0x3C,0x08,0xAD,0xEF,0xBD,0xAE,
0x6F,0xF7,0xC3,0x6D,0x33,0xD0,0xD4,0x65,0x8D,0x98,0x4B,0x9B,0xA2,0x44,0xAD,0x74,0x11,0xC7,0xA9,0xD1,0xB9,0xE9,0x3A,0xD6,0xE0,0xFA,0x83,0x84,0x38,0x17,0x40,0x43,
0x5C,0x97,0xF7,0x1E,0x33,0x5F,0x88,0xD9,0x9E,0x52,0xE2,0x28,0x29,0xE6,0x70,0xC4,0x30,0xED,0xA5,0xB1,0xD2,0x7F,0xDA,0x1B,0x9F,0xD0,0x60,0x52,0xF1,0xF5,0x45,0x4D,
0x72,0xB4,0x94,0x72,0x76,0x8D,0xF3,0x33,0x35,0xC1,0xFF,0x00,0xEB,0x8E,0xBC,0xA3,0x84,0x32,0x1C,0xFF,0x00,0x34,0x12,0xE6,0x39,0xAC,0xBA,0x19,0x75,0x42,0xF3,0x96,
0x0D,0x25,0xC1,0xF0,0x8E,0x45,0x8D,0xF6,0xD9,0x85,0xB0,0x53,0x87,0xFE,0x12,0x66,0xF2,0xD0,0x87,0xAF,0xA8,0x31,0x33,0xC8,0x58,0xA3,0xF6,0xEA,0xF1,0xA0,0xF9,0x5E,
0xF7,0xD3,0xE2,0x07,0xCC,0xE2,0x0C,0xB8,0xD5,0x68,0xC0,0x39,0x0D,0xF7,0x0B,0x1E,0x3B,0xA3,0xA4,0xA6,0x88,0xD4,0x45,0x40,0x8D,0x6B,0x18,0x96,0x7B,0xCB,0x6F,0x3D,
0x27,0x97,0xDB,0x02,0xF8,0x83,0x8E,0xA4,0xAE,0x30,0xC2,0xCE,0xBD,0xD9,0xFC,0x49,0xFD,0xDB,0x5E,0xA1,0xD0,0x8F,0x5E,0x9B,0x61,0xB3,0x3A,0xF8,0x6D,0xC3,0x51,0xF0,
0xAF,0x7C,0xCF,0xA5,0xA7,0xA4,0x68,0x63,0x11,0xB1,0x39,0x99,0x9C,0x97,0x0D,0xE2,0x6B,0x6C,0xA3,0x62,0x06,0xDB,0x6D,0x89,0xFD,0x63,0x7C,0x2B,0xA3,0xA2,0x96,0x0A,
0x4C,0xF5,0x83,0xB4,0x80,0x04,0x17,0x7F,0x08,0xBE,0xE0,0xA9,0x21,0x6D,0xB7,0x53,0x7C,0x2C,0xE7,0x50,0x7E,0x26,0x4D,0xD7,0x0B,0xE5,0xFC,0x44,0xD0,0xD2,0xAD,0x5D,
0x3C,0xB7,0x2A,0x6C,0xC8,0xF9,0x7C,0x8D,0xA4,0x79,0x9E,0x60,0x72,0xC1,0x78,0x3E,0x24,0x66,0x46,0x99,0x52,0x9A,0x90,0x37,0x8F,0x79,0x2C,0xD1,0xDF,0xA5,0xAE,0x0F,
0xF0,0xC2,0x36,0x7B,0x59,0x92,0x54,0xE4,0xD0,0x8E,0x1C,0xCE,0x24,0x16,0x90,0xDA,0x15,0x0F,0x21,0x03,0x50,0x08,0xB7,0x64,0xE7,0xB9,0xE5,0xCF,0x6C,0x64,0xA6,0xE2,
0x3E,0x23,0xC8,0x62,0x9E,0x91,0xE7,0xCC,0xDD,0x67,0x43,0x1C,0xF1,0xC9,0x01,0x4D,0x26,0xD7,0x17,0x0E,0x01,0x3B,0x5A,0xDC,0xBD,0x0E,0x2D,0x33,0x06,0xEC,0x57,0xF7,
0x08,0x19,0x6B,0xE1,0xDF,0x89,0x52,0x41,0x28,0x6A,0xBA,0x07,0x7B,0x9B,0xB3,0x77,0x99,0x0A,0xFD,0x80,0xC5,0x4B,0x27,0xF8,0x90,0xAE,0x8B,0x28,0xA7,0xAC,0x89,0x58,
0xD8,0x2B,0x90,0x76,0xF3,0x1A,0x80,0xDB,0x1E,0x38,0xA3,0xE3,0xE9,0xA9,0xEA,0xDE,0x9E,0xAB,0x30,0x92,0x32,0x48,0x67,0x8E,0xA0,0x58,0xF2,0xD8,0x5A,0xDF,0xCF,0x0F,
0xDC,0x3F,0xC6,0x94,0x91,0xCC,0xB3,0xC9,0x11,0x64,0xD8,0x93,0x4E,0x74,0x10,0x3A,0x9D,0x8D,0xFF,0x00,0xAF,0xBD,0x32,0x6D,0xF7,0x28,0x8D,0x52,0x1B,0xE5,0x3D,0x79,
0x45,0xC4,0xCF,0x57,0x0A,0x34,0xBD,0xA6,0x96,0xB7,0xCC,0xA8,0x30,0x41,0xA2,0xEF,0xA8,0xAD,0x0D,0x9D,0x41,0xB9,0x54,0x09,0xAA,0xFE,0x63,0x7C,0x79,0xEB,0x23,0xE3,
0x5C,0xBE,0x4A,0xB5,0xEE,0x55,0xE5,0x37,0x04,0xAF,0x6A,0x41,0x07,0x6B,0x8D,0xD4,0x79,0xF3,0xC3,0xC5,0x2F,0x14,0xF1,0x0C,0x35,0x62,0x65,0x68,0x2A,0x69,0x24,0x6B,
0x45,0x22,0x11,0xA8,0xFF,0x00,0xCB,0xC5,0xB7,0x5E,0x57,0xC2,0xEC,0xB7,0xCA,0x51,0xC4,0x3B,0x49,0xF9,0xED,0x3E,0x70,0xD9,0x92,0xA5,0x2C,0xBA,0xBB,0x15,0x16,0x62,
0x16,0xC5,0x8F,0x3F,0x61,0xF9,0xC6,0xAC,0x86,0xA7,0x23,0x6A,0xBE,0xC2,0xBA,0x29,0x52,0x21,0x20,0x01,0x52,0x75,0x82,0xEB,0xFE,0xE6,0x20,0xD8,0x7B,0x60,0xD4,0x7C,
0x1B,0x05,0x54,0x81,0x23,0x65,0x65,0x06,0xC8,0x81,0x77,0xBF,0x9B,0x1E,0x40,0x13,0x7E,0xBC,0x94,0xE3,0x54,0xDF,0x0E,0x65,0x34,0xAE,0x91,0xEA,0xD6,0x00,0xDA,0x35,
0xDD,0xCF,0x41,0xA8,0xF3,0x3B,0xF2,0xFE,0x44,0xE3,0x5F,0x95,0x07,0x13,0x10,0xF2,0x5D,0xCE,0x72,0xF1,0x05,0x3A,0x67,0xE8,0x94,0xEB,0x96,0x42,0xB4,0xC8,0x4D,0x3A,
0x51,0xCA,0xAA,0xC6,0xE3,0xAB,0xE9,0x21,0x8F,0x2F,0x5F,0x2C,0x2F,0x56,0x71,0x44,0x94,0xAE,0xD3,0x0E,0xCE,0xAD,0xA4,0x3E,0x28,0x1A,0x47,0x5E,0xCC,0xF5,0xBD,0xAD,
0xCF,0xD3,0x03,0x6B,0x78,0x52,0xA2,0x87,0x3D,0x8B,0x2E,0x94,0x3A,0x55,0x1D,0xCA,0x75,0xB9,0x36,0x03,0xFA,0xF2,0xC7,0xDA,0x8E,0x1C,0xAA,0xA7,0x6E,0xCE,0x4A,0x49,
0xA5,0x62,0xDA,0x2E,0xA2,0xE0,0x7B,0x7A,0xEC,0x70,0x40,0xE3,0xAE,0x24,0x3B,0xCC,0x21,0x9A,0x7C,0x42,0x97,0x30,0xA2,0x8A,0x08,0xF2,0xB4,0x85,0xE3,0x42,0x9A,0xE3,
0x95,0xEC,0x56,0xE3,0xC2,0x7D,0x2C,0x2C,0x05,0xFE,0xF8,0x15,0xFF,0x00,0xAB,0xB3,0xB9,0x68,0xFB,0x80,0x82,0x9C,0xD3,0x10,0x08,0x8B,0xB2,0xBE,0x9B,0x0B,0x6D,0xD7,
0x05,0xE9,0x38,0x58,0xC3,0x34,0x5D,0xF2,0x07,0x90,0x3E,0xA3,0xDD,0xB5,0x69,0xD1,0xE1,0xD8,0x9D,0xB9,0x83,0x63,0x6F,0xA6,0x0F,0x49,0x43,0x94,0xF0,0xCD,0x1D,0x25,
0x7C,0xD1,0xC1,0x52,0xEC,0xCC,0x86,0x89,0xD7,0xC6,0xC2,0xC7,0xC6,0xDF,0xE9,0x1B,0xFD,0xC0,0xB6,0x33,0xE6,0xD4,0xE3,0x43,0xB0,0x0B,0x63,0x2D,0x70,0xB1,0x16,0x62,
0xF5,0x1E,0x69,0xC6,0x89,0x45,0x04,0x89,0x53,0xDC,0xA9,0x20,0xBA,0xAC,0x85,0x40,0x45,0xBD,0xCD,0x8D,0xF9,0xF5,0xDB,0xD4,0xE3,0x7C,0x5F,0x15,0x38,0xBF,0x2B,0x83,
0xB1,0xA7,0xE3,0x0C,0xDC,0xFE,0xD0,0x3B,0xA5,0x34,0xA6,0x34,0x20,0x0B,0x0D,0xC1,0x1B,0x5B,0x60,0x2D,0x6C,0x2F,0xE6,0x95,0x99,0x8E,0x65,0x53,0x23,0x54,0x3B,0x08,
0x8D,0x99,0x63,0x4F,0x0A,0x2E,0xDB,0x58,0x60,0x34,0xB4,0xF5,0x0B,0x24,0x61,0xE0,0x91,0x9E,0x4E,0x5B,0x6C,0x70,0x78,0x6D,0xBE,0x47,0xFE,0x4A,0x6D,0xA0,0xD0,0x11,
0xC3,0x31,0xF8,0x85,0x26,0x7B,0x57,0x5B,0x98,0x67,0x09,0x2E,0x61,0x23,0x69,0x58,0xCD,0x75,0x4B,0xBB,0xA7,0x4D,0xBC,0xEC,0x07,0xE4,0x63,0x66,0x53,0xC7,0x19,0x04,
0x15,0x90,0xCF,0x2E,0x40,0x22,0x2A,0x82,0x30,0xD1,0xA8,0x22,0xDA,0xAF,0xA8,0xFF,0x00,0xA8,0xDB,0x6C,0x29,0x47,0x96,0x39,0x81,0x5E,0x4A,0x29,0x2E,0x08,0x36,0x55,
0xBE,0xDE,0xB8,0x68,0xCA,0x78,0x7F,0xBF,0x00,0x05,0x2B,0x20,0x41,0x73,0x6B,0x5F,0x7C,0x2B,0x2A,0xE1,0xA3,0x66,0xBF,0xD9,0x6A,0xEC,0x7E,0xA3,0xFE,0x51,0xC5,0x9C,
0x15,0x57,0x9B,0xCB,0x3C,0x35,0x42,0x3B,0x21,0x65,0x86,0xA5,0x01,0xD6,0xED,0xD0,0x93,0xBD,0xAE,0x39,0xF3,0x00,0xFD,0x70,0xF8,0xB5,0x14,0xD5,0x73,0x45,0x4D,0x31,
0x8E,0xA6,0x1A,0xB5,0xBA,0x4A,0x8C,0x16,0xD2,0x03,0x76,0xD8,0xFE,0xF0,0x06,0xD7,0xE4,0x6F,0xCF,0x12,0x84,0xF8,0x6B,0x0D,0x7E,0x46,0x64,0x89,0x94,0x55,0xA8,0xED,
0x07,0x69,0xE1,0xE9,0xC8,0x1F,0x3E,0x7D,0x77,0xBE,0x30,0x49,0xC4,0x12,0x77,0xEA,0x2C,0x9A,0xB2,0x8A,0x3C,0xAA,0xA2,0x8A,0x11,0x02,0x4F,0x48,0x8D,0x79,0x8F,0xFA,
0xA4,0x04,0x95,0x24,0x8F,0x20,0x09,0xF3,0xC0,0x63,0xC0,0x1C,0x56,0x33,0x7F,0xDC,0x22,0xF5,0xF2,0xE2,0x51,0x73,0x0E,0x07,0xCB,0x33,0xAA,0x9B,0x3D,0x22,0x39,0x3A,
0x9D,0x2A,0x15,0x4B,0x12,0x3C,0x88,0xD8,0x9E,0x77,0xB0,0xF2,0xB5,0xB1,0x3A,0xE2,0x2C,0x8B,0x33,0xE1,0xBC,0xDB,0xBA,0x52,0x4F,0xDB,0x22,0x3E,0xAE,0xCA,0x32,0x43,
0x80,0x3A,0x8E,0xA0,0x60,0xEF,0x0E,0x7C,0x4B,0x8A,0x8F,0x88,0x57,0x27,0xCC,0x2A,0x7B,0x78,0x89,0x55,0xEF,0x40,0x59,0x5C,0x5B,0x90,0x07,0xE5,0xDC,0xEF,0xFF,0x00,
0xEE,0x2B,0x39,0x9F,0x09,0xE5,0x3C,0x57,0x90,0xD2,0xE6,0x80,0xB3,0xA8,0x1E,0x3B,0xD8,0x9D,0x82,0x8B,0x5C,0x1B,0x81,0xB8,0xE5,0xBF,0xA1,0xC5,0x2E,0x53,0x89,0xB6,
0x34,0x7E,0xC2,0x46,0xE1,0xCC,0x85,0xE4,0x7C,0x4D,0x9E,0x51,0xA0,0x44,0xA9,0x66,0x76,0xBD,0x8C,0xBE,0x19,0x06,0xE3,0x91,0x3F,0x5E,0x58,0xA3,0x70,0xF7,0x12,0x55,
0x55,0x65,0xEA,0xF0,0xD6,0x97,0x2B,0xE2,0x54,0x9A,0xEC,0x09,0xB5,0x8A,0xDF,0x9A,0x9E,0x83,0x6F,0x2C,0x04,0xAE,0xE0,0x81,0x4D,0x9A,0x3A,0xC3,0x0C,0xDA,0x54,0xD9,
0x22,0xAA,0x6B,0xA8,0x17,0xBF,0x86,0x51,0xB5,0xEF,0xEC,0x7D,0xF0,0x22,0x6A,0x15,0xA0,0x83,0x55,0x33,0x3E,0xAD,0x64,0xDD,0x0F,0x8E,0x3E,0x5B,0x6F,0xD3,0x0E,0x39,
0x15,0x87,0x12,0xD7,0xDA,0x79,0x94,0x8A,0x5E,0x19,0x96,0x8E,0x7E,0xDD,0xE0,0xED,0x5A,0xA1,0x89,0xD2,0xAB,0x7B,0xE9,0xB8,0xD2,0xDE,0xB7,0x00,0xDB,0x90,0xD5,0xE7,
0xC8,0xCE,0x4F,0x92,0x35,0x5C,0xD1,0xCF,0x1A,0x1E,0xEF,0x1C,0xA1,0x74,0x84,0xB9,0xD4,0x4D,0xF4,0xAF,0xBD,0x94,0x7B,0x73,0xD8,0x93,0x87,0x3E,0x1C,0x92,0x2C,0xDD,
0x33,0x1A,0x69,0xA3,0x92,0x9D,0x0C,0x77,0x89,0xF4,0x9B,0xE9,0x0E,0xA5,0x8E,0xAB,0x7C,0xCC,0x4D,0xCF,0xB8,0xC1,0x7A,0xD3,0x1D,0x3D,0x6D,0x33,0x51,0x46,0xB2,0x2D,
0x42,0x9D,0x30,0xD2,0x8E,0x48,0x00,0x17,0x1E,0x40,0xF2,0xBF,0x97,0x95,0xF1,0x97,0x69,0x1C,0x19,0x5C,0x4F,0x34,0x71,0x75,0x32,0x27,0xC6,0x7A,0x79,0xD2,0x68,0x92,
0x7E,0xC3,0x5B,0x3E,0x9B,0x84,0x62,0x2E,0x2D,0xF4,0x22,0xDF,0x4E,0xB8,0xC5,0x9B,0xCE,0xD4,0x79,0xAC,0x6D,0x1D,0xFB,0x72,0xE9,0x24,0x64,0xA9,0x0A,0x35,0x21,0x23,
0x9F,0x36,0xDC,0x7B,0x58,0xE1,0xC7,0xE2,0x2E,0x5A,0x68,0xF3,0x24,0xE2,0x59,0xF4,0x24,0x93,0xAB,0x34,0x6A,0xA9,0x63,0x7E,0x87,0x91,0xE6,0x2F,0xCF,0x90,0x23,0x08,
0x39,0x1C,0x15,0x99,0xA5,0x7C,0x99,0xC6,0x6D,0x22,0x53,0xD2,0x52,0x21,0x98,0x3C,0xD7,0x20,0x8B,0xDC,0x80,0x47,0x52,0x6F,0x6C,0x4C,0xDA,0x81,0x8F,0x1D,0xCB,0x4C,
0x65,0x8F,0xF1,0x1A,0xB2,0x9C,0xA7,0x32,0x8A,0x7A,0x3C,0xA6,0x3C,0xAE,0x2A,0x9C,0xEE,0xBA,0x33,0xDD,0x69,0x65,0x1E,0x08,0x10,0x27,0xFD,0xC1,0xF2,0x00,0x0B,0xDB,
0xA9,0x03,0xCF,0x05,0x26,0xF8,0x57,0x96,0x65,0xB4,0xD2,0x55,0xE6,0x7D,0xBE,0x65,0x3B,0x5D,0xA4,0x92,0x5F,0x08,0x04,0x1D,0xC1,0x1F,0xC0,0x7B,0x60,0xBF,0xC1,0x3C,
0xF4,0x71,0x46,0x73,0xC5,0xFC,0x49,0x2C,0x4E,0xD5,0xAF,0x0C,0x74,0xB4,0x20,0x12,0x5A,0x28,0x94,0x92,0x40,0xEB,0xB9,0x09,0xFF,0x00,0x88,0xC1,0xAC,0xE7,0x33,0xA8,
0x87,0x87,0x4A,0xCF,0x33,0x09,0x5C,0x98,0x44,0x3C,0xEF,0xE2,0x1B,0xB0,0xE6,0x76,0x23,0x1E,0x43,0x55,0xA9,0xC8,0x99,0xBC,0x4A,0x69,0xB8,0xBF,0xF6,0x74,0xF1,0xE0,
0x39,0x17,0x75,0x71,0x24,0xF9,0xDA,0x65,0xB9,0x6E,0x56,0x2B,0xA5,0xCA,0x29,0xC4,0x20,0xE8,0x58,0x54,0x69,0x69,0x18,0x8E,0x77,0xC4,0xBB,0x3C,0x97,0x32,0xCC,0xE2,
0xED,0x66,0xA8,0x65,0x48,0xC1,0xD1,0x0C,0x7B,0x58,0x5A,0xD6,0x1F,0x4C,0x1A,0xF8,0xCD,0xC5,0xB9,0xA4,0x5C,0x4F,0x4D,0x97,0x2D,0xD5,0x60,0x80,0x7C,0xF1,0x90,0x6E,
0x7D,0x3C,0xB1,0x32,0x87,0x88,0x26,0x9A,0xA1,0x0E,0x63,0xAE,0x68,0xD4,0xDF,0x48,0x00,0x03,0xF4,0xC7,0xBD,0xF4,0x7D,0x26,0x35,0xC2,0x32,0x37,0x24,0xCF,0x3F,0xAF,
0xCA,0xDE,0x42,0x8B,0xC0,0x13,0xE4,0x19,0xDE,0x67,0x94,0xD5,0xBB,0x41,0x5A,0xE4,0x93,0xBA,0x86,0xB8,0xF6,0xFC,0x62,0x99,0xC2,0x5C,0x6B,0x2E,0x6F,0x54,0x0C,0x91,
0xA2,0xCA,0x14,0x24,0xAB,0xD1,0x87,0x2D,0x40,0x74,0xF5,0xC4,0xEF,0x31,0xCD,0xF2,0xCC,0xC0,0xB2,0xBD,0x03,0xA2,0x86,0x06,0x3D,0x04,0x2E,0xD6,0x00,0x83,0xF6,0xC7,
0x1E,0x1C,0xAC,0x86,0x93,0x8A,0xE1,0x92,0x35,0x31,0xC4,0xEC,0x14,0xAE,0xAB,0xEC,0x7D,0x71,0xB3,0x57,0xA3,0xC7,0x95,0x0D,0x88,0x9D,0x36,0x62,0xAC,0x01,0x9E,0xB7,
0xE1,0xCE,0x10,0xAB,0xE2,0x30,0x3B,0x8C,0x35,0x75,0x52,0x18,0xF5,0x84,0xA6,0x89,0xAC,0x17,0x6B,0xF2,0xDA,0xDB,0xDA,0xF8,0x42,0xF8,0xA5,0xC2,0xF2,0xD1,0x7F,0x89,
0xF7,0x5E,0xCE,0x78,0x16,0xD2,0x12,0x77,0x2A,0x7E,0x52,0x6D,0xE4,0x71,0x56,0xF8,0x4B,0xF1,0x73,0x32,0xE0,0x9C,0xB2,0x4A,0x1A,0x58,0xA2,0xAA,0xA6,0x60,0x74,0xA4,
0x8B,0xB8,0x3B,0x72,0x6E,0x76,0xDB,0xDB,0x00,0xB8,0xEF,0x34,0x19,0xD2,0x54,0x09,0x8A,0xCD,0x55,0x59,0x1B,0x19,0x43,0xED,0x6D,0xB5,0x7D,0xBF,0x96,0x3C,0xB8,0x38,
0xF4,0xB9,0x11,0xB1,0xB5,0xB7,0xE3,0xF1,0x3B,0x7E,0x26,0xCA,0x18,0x15,0xE2,0x41,0x66,0x97,0x2D,0xA8,0xCA,0xA8,0xA4,0x92,0x9A,0x51,0x37,0x6A,0x0B,0xCF,0x19,0xB0,
0x0A,0x41,0x00,0x5B,0xCE,0xF6,0xDF,0x17,0x4F,0x86,0x79,0xAC,0x93,0xF0,0x05,0x45,0x2C,0xE1,0xC4,0x88,0x7B,0x30,0x74,0x73,0x00,0xEE,0x43,0x5F,0xC3,0xCB,0xAF,0x4C,
0x79,0xF6,0xA2,0xAE,0x46,0xA4,0x97,0x4C,0x51,0xC6,0x91,0xB9,0x40,0xA9,0x7B,0x0B,0x1E,0x78,0xF5,0xAF,0xC3,0x3C,0x9E,0x66,0xC8,0x06,0x53,0x4E,0x8C,0x28,0xDB,0x2F,
0x82,0xA1,0x83,0x1B,0x89,0x25,0x72,0x43,0x13,0xD0,0x12,0x9D,0x3A,0x80,0x3C,0xF1,0xDC,0xF5,0x24,0x1B,0x46,0x40,0x3A,0x98,0xB4,0xEC,0x28,0xA9,0x98,0xB2,0xB8,0xA1,
0xAB,0x9E,0x48,0x5A,0xA9,0x1C,0x4A,0x40,0x91,0x1D,0x44,0xAA,0x4E,0xFB,0x11,0xBD,0xF9,0xF5,0x04,0xFB,0x8B,0x1C,0x00,0xCD,0xB8,0x42,0x96,0xB3,0x36,0x91,0x29,0xA3,
0x14,0xE8,0x8C,0x74,0x46,0xA8,0xF6,0xE5,0xC9,0x4F,0x3E,0xB7,0xF2,0xF4,0x18,0x66,0xCB,0x72,0x6A,0xD8,0x69,0x5F,0x30,0xA7,0x99,0xF4,0x8A,0xAD,0x01,0x96,0xEC,0x57,
0x6B,0x05,0xD3,0xD6,0xE0,0x1F,0xAE,0x36,0xD1,0x57,0x36,0x65,0x4B,0x2D,0x14,0xF4,0xA5,0xC2,0xF8,0x16,0x40,0x81,0x9A,0xFB,0xDF,0x90,0xE7,0xEE,0x6C,0x3A,0xE3,0x20,
0x7E,0x23,0x8C,0xA5,0x43,0x1C,0x74,0xBC,0x2E,0xD4,0x40,0x87,0xA8,0x91,0xD6,0x08,0xF4,0x2F,0x31,0x6F,0x11,0xB7,0xB9,0x2B,0xFC,0xF1,0xF2,0x82,0x33,0x43,0x95,0xCB,
0x2C,0xC4,0x9A,0xB9,0x27,0x11,0x07,0xEA,0x88,0x3C,0x2B,0xE9,0x60,0x01,0xD2,0x39,0x5F,0xA6,0xD8,0x16,0xBC,0x4F,0x57,0x49,0x3D,0x3D,0x0C,0xD4,0xE9,0x2C,0x85,0x5A,
0x67,0xA9,0x85,0x6E,0xB1,0xBC,0x9B,0x85,0xE5,0xB5,0x81,0x27,0x7E,0xB8,0x29,0x5B,0x58,0xD4,0xEC,0xAD,0xA8,0x46,0x18,0xEB,0x40,0xCC,0x41,0x27,0x9E,0xC4,0xAF,0xEE,
0x8B,0x01,0x60,0x79,0x1E,0x58,0x1C,0x8C,0x20,0xAA,0xF3,0xCC,0x93,0x7C,0x59,0xA2,0x4C,0xD2,0xBA,0x82,0x09,0xE9,0x41,0x33,0x54,0x22,0x2B,0xB5,0xF7,0x53,0x70,0x76,
0xBD,0x99,0x8E,0xDB,0xDA,0xDD,0x31,0x3C,0xF8,0xAD,0x95,0x66,0x33,0x70,0x45,0x3E,0x5D,0xC1,0xF0,0x43,0x57,0x96,0xD1,0x6A,0xA9,0xAE,0xEE,0xF7,0x57,0x45,0x06,0xC0,
0x30,0x3C,0xD4,0x73,0xF4,0xBF,0xA6,0x2B,0x5C,0x6D,0x0C,0x79,0x96,0x53,0x98,0x3C,0xD5,0x22,0x3A,0xBE,0xC4,0x84,0x60,0x4C,0x8E,0xDE,0x20,0xC1,0x6F,0xA4,0x01,0x6D,
0x2B,0x6B,0x7F,0x1C,0x48,0xF8,0x3F,0x89,0xB3,0x3E,0x1F,0x15,0xD2,0x66,0xD9,0x79,0xAD,0xA1,0x8E,0x36,0xA7,0x78,0x82,0x02,0x41,0xD8,0x80,0xDD,0x6D,0x6B,0x83,0xEF,
0x8E,0x6B,0x62,0x7D,0xC3,0x20,0x17,0x46,0xEA,0x3F,0x80,0x2A,0x75,0xFF,0x00,0xD3,0x63,0x14,0xE2,0xFA,0xEA,0x68,0x49,0x49,0x65,0xCB,0xD9,0x6C,0x5A,0xCB,0x71,0x26,
0xAF,0xA9,0xDC,0x7E,0x7D,0x71,0x43,0xE2,0x68,0xE6,0x5C,0xB2,0xA6,0x96,0x85,0xCB,0x4D,0x1B,0xAC,0xF2,0x31,0x37,0xB1,0x04,0x91,0xBF,0x9E,0xDC,0xBD,0x31,0x28,0xCB,
0xF2,0xF8,0x6A,0x38,0xA6,0x2C,0xF7,0x80,0xEA,0x4D,0x05,0x7C,0x5F,0xB6,0x34,0x73,0x38,0x0A,0x4F,0x50,0x8C,0x7D,0x3C,0xFD,0x71,0x40,0xFE,0xDD,0x4C,0xFA,0x81,0x2A,
0x69,0x61,0x78,0x65,0x47,0x06,0xBA,0x19,0x76,0x65,0x90,0x13,0x75,0x3D,0x6C,0x7A,0x63,0x83,0xEA,0xB8,0x9F,0xF5,0x5F,0xAA,0x51,0xC1,0xEF,0xF8,0xA9,0xD6,0xD1,0x95,
0x38,0xFC,0x77,0xCC,0x82,0x7C,0x68,0xCA,0x25,0x19,0xAC,0x19,0xC4,0x72,0x34,0xC8,0x62,0x09,0x23,0xDE,0xE6,0xE7,0x71,0x7F,0x4D,0xF1,0x26,0x4B,0x16,0x37,0xC7,0xAD,
0x73,0xDC,0x9E,0x9B,0x33,0xA8,0x9E,0x82,0x7A,0x78,0xE5,0xA7,0x98,0x7E,0xD1,0x98,0x05,0x29,0x7E,0x57,0x1D,0x31,0x14,0xCF,0xBE,0x11,0xE6,0x34,0xF9,0x84,0x83,0x24,
0x9E,0x2A,0x88,0xB5,0x00,0x15,0xCE,0x96,0x17,0xDB,0xF5,0x23,0xEF,0x8F,0x61,0xE8,0xFE,0xA9,0x8F,0xC6,0x31,0xB9,0xAA,0x9C,0x3D,0x7E,0x81,0xF7,0x97,0x5E,0x4C,0x9C,
0x47,0xA4,0x4A,0x58,0x80,0x6D,0xCA,0xF8,0x3B,0xC2,0x59,0x4C,0xD9,0x87,0x13,0x45,0x32,0x53,0xF6,0xB0,0xC2,0x7B,0x47,0x1A,0x49,0x16,0xF2,0x38,0x29,0x07,0xC3,0x3C,
0xFF,0x00,0xBF,0x76,0x15,0xFD,0x8D,0x20,0x06,0xCC,0x5D,0xAE,0x7C,0xF6,0xC5,0x0B,0x87,0xF2,0x28,0x38,0x69,0x85,0x25,0x3D,0x41,0x09,0x20,0x3A,0xAA,0x19,0x6D,0x71,
0xE7,0xFA,0x63,0xA1,0xAA,0xF5,0x3C,0x4A,0x84,0x21,0xB3,0x31,0xE9,0xB4,0x0E,0xD9,0x2D,0x85,0x46,0x6C,0xB5,0xE8,0xF4,0x30,0x96,0x27,0x84,0x32,0x85,0x5D,0x27,0x68,
0xFD,0x06,0x08,0x66,0x50,0x11,0x93,0xD7,0x66,0x1D,0xF1,0x5D,0x69,0xE9,0xD9,0x35,0x9B,0x16,0xB1,0x5B,0x01,0xCB,0xD7,0x1D,0x32,0xE5,0xB0,0x0A,0x76,0x73,0x5E,0x67,
0x95,0x80,0xB4,0x69,0xE1,0x5F,0x3C,0x2E,0xF1,0x55,0x44,0x54,0x1C,0x3E,0x32,0x85,0x98,0x3D,0x7D,0x59,0x0A,0xF0,0xC6,0x49,0x28,0x97,0xB8,0xD8,0x1E,0xBF,0xC7,0x1E,
0x47,0x0A,0x0D,0x46,0x71,0xB4,0xF2,0x4C,0xF4,0x2E,0xC3,0x16,0x33,0x27,0xF4,0x99,0x6D,0x55,0x5C,0x51,0x52,0x0B,0x2B,0xD4,0x4C,0x54,0x13,0xC8,0x5C,0xDA,0xFF,0x00,
0x4C,0x7B,0x3F,0xE1,0xCE,0x53,0x3D,0x27,0x07,0xD7,0xB5,0x2C,0xAE,0x29,0xAB,0xA5,0x44,0x81,0x25,0xF9,0xFB,0x34,0x04,0x2B,0x11,0xEC,0x47,0x2E,0x46,0xF8,0x8A,0xFC,
0x35,0xF8,0x47,0x99,0x66,0xF5,0x50,0xE7,0x59,0xCC,0x12,0x25,0x0D,0x37,0xED,0x16,0x94,0xA9,0xB9,0x00,0x03,0xA9,0xBD,0x37,0xC7,0xAA,0x28,0x8E,0x49,0x41,0x1D,0x2D,
0x6C,0x0D,0x2C,0x14,0xF4,0xE0,0xC4,0x90,0x25,0xEE,0xC4,0x80,0x00,0xB2,0xDC,0xF5,0x3B,0x75,0xC7,0xA4,0xD6,0x65,0xF2,0x91,0x89,0x3A,0xFC,0xCE,0x26,0x15,0xA0,0x49,
0x93,0x4C,0xDE,0x3A,0xCE,0x1D,0x99,0xA8,0xA0,0x80,0xC0,0x63,0x73,0x7A,0xC5,0xF0,0x6E,0xD7,0xE4,0x3C,0xEC,0x6C,0x39,0x90,0x05,0xCF,0x30,0x30,0x67,0x84,0x29,0xE8,
0x20,0x71,0x53,0x2C,0x80,0x36,0x9D,0x28,0xAA,0xC3,0xDC,0xDC,0xF4,0xDF,0x7B,0x7D,0xF0,0x03,0xE2,0x23,0xCF,0x9D,0xE6,0xF1,0x8A,0x09,0xDE,0x52,0x80,0x2B,0x6F,0xBA,
0x28,0x1F,0xBD,0x6F,0x97,0xF5,0xF7,0xC6,0x1C,0xB6,0x56,0xC9,0x72,0xC1,0x13,0x78,0xC8,0xBE,0x94,0xBD,0xD9,0xF7,0xDA,0xCB,0xFA,0x0F,0x3D,0xF6,0xC2,0x7E,0x3D,0xCD,
0x82,0x99,0x6A,0xA5,0x23,0x35,0x82,0x3A,0x2C,0xD4,0x53,0xD2,0x19,0xA9,0x63,0xAB,0x91,0x95,0xA4,0xA7,0x84,0xA2,0xBF,0x5F,0x10,0xB5,0xD9,0xBD,0x79,0x60,0x17,0x14,
0x54,0xD4,0x51,0xC1,0xDD,0x29,0x65,0xA8,0x47,0x56,0xBC,0x33,0x9D,0x76,0x3C,0x80,0xF9,0xCE,0xC7,0xCC,0x8F,0xBE,0x19,0x6A,0x26,0x8F,0x3D,0xC9,0xA1,0xA4,0xA4,0x31,
0xCB,0x16,0x90,0xD3,0x52,0xD7,0x06,0x32,0x3D,0xC0,0x27,0x44,0x83,0x7E,0xB7,0xFB,0x72,0xC0,0x2E,0x2F,0xA7,0xA6,0x5E,0x18,0x78,0x60,0x5A,0x82,0xD0,0x85,0x71,0x11,
0x87,0xB4,0x74,0xEB,0x70,0xD7,0x0C,0x45,0xFD,0xF7,0x1C,0xF0,0xC3,0x8A,0x8D,0x4C,0xC1,0xEE,0x2C,0x4F,0x5D,0x59,0x5D,0x42,0x90,0xC9,0x58,0x1B,0x30,0x58,0xFC,0x41,
0xE3,0xB1,0x3C,0xEE,0x6C,0x1A,0xDC,0x8F,0x3E,0x78,0x8F,0xE6,0x39,0xBD,0x56,0x4F,0xC5,0x52,0xC7,0x57,0x97,0x45,0x51,0x34,0xDA,0x92,0x59,0x35,0x04,0x2E,0x87,0x63,
0x65,0x22,0xEA,0x4D,0xED,0x71,0xB5,0xAF,0x8A,0x64,0x39,0xBE,0x57,0x34,0xA2,0x19,0x19,0x2A,0xD6,0x44,0x04,0x80,0xD2,0x24,0x88,0x77,0xE4,0x5C,0x9B,0xFB,0x7E,0x70,
0xA5,0xC7,0x3C,0x2B,0x4F,0x9D,0x70,0xFC,0xB9,0x9E,0x47,0x32,0x19,0xE9,0xED,0x74,0x98,0x08,0xE4,0x5E,0x9B,0x10,0x6C,0x45,0xF6,0xC1,0xA2,0x10,0xDD,0x4B,0x2D,0x62,
0x61,0xEE,0x19,0x7E,0x67,0x51,0x45,0x2F,0x0D,0xC4,0xF4,0xEB,0x2B,0x76,0xAC,0x93,0x5F,0xFB,0xBE,0xE3,0x52,0xD9,0x77,0x61,0x61,0xF3,0x00,0x36,0x1C,0x86,0x3E,0xE5,
0xF5,0xB2,0x55,0xE7,0x81,0x73,0xF9,0x1B,0x2E,0xA9,0x70,0xCE,0x73,0x73,0x73,0xAB,0x48,0x3E,0x16,0x03,0x67,0x5D,0x40,0x03,0x7B,0xE2,0x69,0x95,0x71,0x6D,0x66,0x45,
0x9D,0x32,0xD7,0x42,0xE5,0xD6,0xE1,0x40,0x60,0xAC,0xBE,0x7C,0xBD,0x07,0xE7,0x15,0x3A,0x7E,0x22,0xA2,0xE3,0x3C,0xB1,0xD6,0xAA,0x49,0xE2,0x99,0xAD,0xA7,0x53,0x76,
0x8B,0x38,0x08,0xAA,0xEE,0xE2,0xE4,0x86,0xD4,0xA0,0x92,0x3E,0xBD,0x4E,0x26,0x7D,0x0A,0xE4,0xEC,0x71,0x2B,0x1E,0xA4,0xA3,0x7B,0x7B,0x9D,0xF5,0x52,0xCF,0x3C,0xB1,
0xBB,0xAB,0xCC,0x84,0xBC,0xBD,0xA4,0x2C,0x35,0x3A,0xEB,0x24,0xB9,0x53,0x66,0x0A,0x4E,0xFB,0x8E,0xBE,0xB8,0x01,0x9C,0x54,0x2B,0x4D,0x3B,0x42,0x2A,0x23,0x37,0x52,
0xB7,0x8D,0xC0,0x7B,0x6F,0x60,0x6D,0x6E,0x7B,0xE3,0x56,0x5F,0x42,0x33,0x3C,0x9B,0x30,0xAB,0xA0,0x47,0x2E,0xA3,0xB1,0xDF,0x99,0x51,0x72,0x59,0xD5,0x6D,0x61,0xE1,
0x3C,0xED,0x72,0x56,0xD7,0xDF,0x07,0xB2,0x6F,0xED,0x15,0x4C,0xB5,0xD8,0x42,0xF0,0xD2,0xA3,0xB4,0x7A,0xA3,0x2C,0x4A,0x92,0x08,0xBA,0x9E,0xAC,0x58,0x7D,0xC6,0x39,
0x69,0xE9,0x43,0x09,0x3B,0x09,0x13,0x6F,0xEE,0x0C,0xC2,0x9B,0x98,0x82,0xF9,0x8C,0x0F,0x52,0xD1,0xB8,0x91,0xDC,0x90,0x75,0x68,0x2D,0x7F,0xEB,0x9E,0x09,0x55,0xD5,
0xCB,0x53,0x0C,0x71,0xE5,0x59,0x5D,0x4D,0x4C,0x97,0x11,0xBB,0x18,0xCA,0x2B,0x82,0x2D,0x6F,0x7E,0x78,0x7B,0x5C,0xB6,0xA2,0x09,0xE7,0x8A,0x5A,0x79,0x5A,0x79,0x81,
0x53,0x32,0xC2,0x40,0x0A,0x4F,0x8B,0x98,0xF0,0xDA,0xC7,0xED,0x86,0x3E,0x17,0xCA,0xEB,0x9F,0x2F,0x86,0xBE,0x85,0x69,0xA0,0x68,0x19,0x66,0x44,0x91,0xFF,0x00,0xEE,
0x1B,0x51,0x50,0xC0,0xB7,0x87,0xF7,0xC7,0xD3,0xA6,0x21,0xD0,0x86,0x23,0x71,0xBA,0x82,0x7D,0x41,0x87,0x0A,0x24,0xA3,0x22,0xF8,0x75,0xC6,0xB5,0x75,0xD3,0x15,0x8B,
0xBA,0x3A,0x80,0xC4,0x37,0x89,0x88,0x6E,0x41,0x57,0xAE,0xC7,0xCF,0x0F,0xD9,0x77,0xC3,0x8C,0x83,0x87,0x44,0x79,0xC5,0x6D,0x4B,0x55,0x67,0x32,0x3A,0x87,0x79,0x40,
0x62,0xC4,0xDE,0xDA,0x7E,0xC3,0x90,0xFE,0x18,0x76,0xA9,0x99,0x24,0xA2,0xA8,0xCC,0xAA,0xEB,0x6A,0x04,0xF4,0xC1,0xBB,0x57,0x41,0xA5,0x09,0x20,0x35,0xF5,0x2D,0xFA,
0x93,0xB6,0xC2,0xD6,0xDB,0x1D,0xD4,0xF9,0x8C,0x8B,0xC3,0x54,0xA6,0xA6,0x6A,0x10,0x95,0x23,0xF6,0x4A,0xF2,0xAA,0xBA,0x2B,0xDB,0x53,0x6D,0xAC,0xAF,0x87,0xC8,0x83,
0xE7,0x73,0x8D,0x2B,0xA7,0xDA,0x6C,0x71,0x10,0xD9,0x99,0xC7,0xBA,0x6F,0xA6,0x35,0xF0,0x2C,0x11,0xCD,0x1A,0x52,0xC2,0xA9,0xAD,0x04,0x7F,0x33,0x06,0x1F,0xB8,0x09,
0x0C,0xDD,0x7D,0x2C,0xDB,0x9B,0x8B,0x60,0x7E,0x6D,0xC4,0x91,0x25,0x0C,0xF4,0xB9,0x42,0x14,0x2C,0x09,0x24,0x4C,0x42,0x81,0xE6,0xC3,0x99,0x3E,0x96,0x00,0x60,0x5E,
0x7F,0xC4,0xC2,0x83,0x3A,0x7A,0x4C,0x9B,0x30,0x54,0x82,0xA2,0x25,0x13,0x2C,0x26,0xE3,0x61,0xD5,0xED,0xA8,0x9F,0xAE,0x16,0x17,0x31,0xD5,0x52,0x4D,0x10,0x88,0x20,
0x17,0xED,0x9C,0x8D,0xDA,0xDB,0xB9,0xBE,0xE4,0x5E,0xF6,0x1B,0x1F,0xAE,0x1B,0xB3,0x67,0x52,0xD4,0x5C,0x21,0x02,0xC7,0x4F,0x04,0xC9,0x51,0x38,0x31,0x9B,0x33,0x2A,
0xDC,0x6A,0x24,0xD8,0xF9,0x9F,0xB9,0xBF,0xD7,0x19,0x86,0x69,0x0D,0x2C,0xCF,0x23,0x0F,0xDA,0xDB,0xC0,0x84,0xEE,0x83,0xCC,0xFA,0x9F,0x7B,0xFA,0xE1,0x66,0xB7,0x3B,
0x8A,0x92,0xA1,0xCD,0x24,0x9D,0xE2,0xA1,0xB6,0xEF,0x0F,0x63,0xA7,0xFE,0x23,0x96,0x38,0x51,0xD5,0xA8,0xA9,0x5A,0x9A,0xE9,0xF5,0x03,0xE2,0x52,0x4D,0xB7,0xF3,0x1E,
0x67,0xD7,0x02,0x79,0x8D,0x59,0x68,0x92,0xA2,0x18,0x57,0xB7,0xCD,0x62,0x6A,0x4A,0x13,0x3B,0x43,0x4D,0x99,0x45,0xE2,0x60,0x57,0x93,0x3D,0xB7,0x23,0x6D,0x26,0xDC,
0xB9,0x8F,0xDE,0xC6,0x2C,0xEB,0x3B,0x32,0xF0,0xDD,0x65,0x2C,0xA1,0x6B,0x3B,0x44,0x2C,0x84,0x44,0x19,0x18,0x81,0xE2,0x3A,0x4F,0x89,0x48,0xEA,0x01,0x1E,0xDB,0xE0,
0x4E,0x5D,0x9C,0x66,0x0A,0x29,0xF2,0x2A,0x9A,0x85,0x7A,0x2A,0x44,0x4A,0x86,0x8E,0x51,0xE1,0x98,0x31,0x2A,0xCC,0x08,0xEA,0x00,0x04,0x7F,0xC0,0xF9,0xE0,0x2E,0x6F,
0x9A,0x3D,0x4C,0x83,0x25,0x4A,0x18,0xE4,0xA4,0xA7,0x70,0x3B,0x5D,0x5A,0x1D,0xF5,0x5C,0xAB,0x01,0xB5,0x87,0xFB,0xBC,0xFA,0xEF,0x8D,0xFD,0x09,0xCF,0x1D,0xC5,0x6C,
0xB2,0x3C,0xCA,0x5C,0xAE,0x44,0x30,0x56,0x2C,0x01,0x18,0x89,0x23,0x8C,0x4C,0x85,0x4F,0x3E,0x6D,0xB7,0xDB,0x0A,0xD9,0x86,0x99,0x29,0x62,0x85,0x6A,0xA3,0x9A,0x38,
0xC9,0xD4,0x12,0x37,0x1B,0xF9,0x78,0x6E,0x7A,0x61,0xCB,0x3A,0xA1,0xAD,0xAA,0x96,0x3C,0xC7,0x26,0x8D,0xEA,0x2A,0x14,0x69,0x78,0xBB,0x34,0x69,0x13,0x6E,0x64,0x82,
0xA6,0xE3,0xD5,0x4E,0xDB,0x82,0x70,0x0E,0xA8,0x56,0xD4,0x2F,0x61,0x9A,0xF7,0xE8,0x65,0xD2,0x6C,0x92,0xEA,0x9C,0x0B,0x1E,0x56,0x04,0x39,0x3F,0x8C,0x0E,0xEF,0xA8,
0xC2,0x2E,0x4B,0xB3,0xAC,0xB6,0x87,0x32,0x98,0xF7,0x38,0x3B,0x09,0xA2,0x07,0x50,0x88,0xBB,0xDF,0x7E,0x7E,0x2D,0xF0,0xBB,0xA7,0x3A,0xCB,0x2A,0x4B,0xD2,0xCD,0x2B,
0x0B,0x1F,0x93,0x66,0x02,0xF6,0xE9,0xBE,0x29,0x71,0x54,0xD1,0xD0,0xE6,0xB5,0x54,0x53,0xB4,0x8A,0x8D,0xCE,0x23,0x0C,0x94,0xFA,0x47,0xB1,0x61,0xF9,0xC7,0x1A,0xE9,
0xA8,0x25,0x8A,0x38,0xA9,0x2B,0xEA,0x26,0x57,0xBD,0xBF,0xBB,0x06,0x60,0x2D,0xCB,0xC6,0x3D,0x70,0xEF,0x31,0x15,0x71,0x47,0x0E,0xE3,0x01,0x64,0xDC,0x77,0x98,0xD3,
0x4B,0x09,0xAA,0xCB,0x44,0xE2,0x30,0x2D,0xAC,0x14,0xBD,0xBE,0x50,0x4F,0x22,0x01,0x00,0xE1,0x9F,0x2C,0xF8,0xA9,0x48,0xB2,0xA3,0xE6,0x14,0xF5,0x92,0x4A,0xCE,0xD2,
0xC8,0x16,0x72,0x2F,0x2D,0xAC,0x1A,0xC7,0x6B,0x01,0x60,0x07,0xA5,0xAF,0x80,0x74,0xD4,0x12,0x35,0x48,0x2B,0x96,0x8E,0xC8,0x1B,0x0E,0xF0,0x48,0x00,0xFD,0x2D,0xF7,
0xBD,0xB1,0xDB,0x36,0x65,0x95,0x3C,0x81,0xA4,0xA2,0x8A,0x32,0xA7,0x41,0x7D,0x23,0x9D,0xBF,0xD4,0x18,0x5F,0xEF,0x88,0x76,0x9E,0x84,0xA0,0xBB,0x7B,0x8F,0xB0,0xFC,
0x42,0xE1,0xB3,0x95,0xE4,0x94,0xD5,0x27,0x30,0xD1,0x10,0xFE,0xFC,0xA1,0xB5,0x89,0x85,0xF5,0x69,0xB1,0x3C,0xB5,0x74,0x04,0x5F,0x1A,0x5F,0xE2,0x2C,0xF9,0xCA,0x9C,
0xB7,0x28,0xA2,0xAC,0x14,0x33,0xCA,0x21,0x14,0xA0,0x84,0x0C,0x6E,0x34,0x80,0x4D,0xFA,0xDB,0x13,0xCE,0xF3,0x49,0x57,0x10,0x8A,0x92,0x92,0x79,0x99,0x98,0x03,0x2E,
0x8D,0x4C,0x3D,0xB9,0x00,0x3D,0xCE,0x0E,0xD2,0xD2,0xCD,0x47,0x1A,0xCD,0x53,0x0D,0x34,0x60,0x8D,0x51,0x76,0xB2,0x89,0x98,0x8B,0x73,0x08,0x80,0xFE,0x6F,0x80,0xDA,
0x39,0xE2,0x31,0x47,0xDC,0xA0,0xE4,0xB0,0xE6,0x79,0xAD,0x3B,0x97,0x86,0xA2,0x1A,0x75,0x62,0xD2,0x35,0x88,0x50,0x6F,0x7B,0x12,0x45,0xAF,0xE9,0x61,0x8C,0x99,0xA6,
0x61,0x54,0xD2,0x2A,0xAD,0x78,0x48,0x21,0x27,0x93,0x03,0x61,0xEB,0x6B,0x01,0xFA,0xFA,0x61,0x66,0x0E,0x2E,0xAC,0xA9,0x59,0xA9,0xCF,0x7B,0xA9,0x00,0x85,0x3D,0xAB,
0x5A,0x31,0xB7,0x45,0xF0,0xFE,0x77,0xC7,0x19,0xD6,0x59,0xA9,0x43,0x54,0xD6,0x53,0xC7,0x1F,0x35,0x45,0x1A,0xD8,0xFB,0x03,0x60,0x3E,0x97,0xC2,0x88,0x11,0x80,0x42,
0x75,0x3C,0x43,0x0C,0x59,0x7B,0x88,0x64,0x65,0x47,0x05,0x43,0x85,0xB9,0x90,0x7A,0x7A,0x7E,0x3D,0xF0,0x01,0x73,0x1A,0xEA,0xF9,0xFB,0x08,0x63,0x74,0x8E,0x4D,0xEE,
0x4D,0xC9,0xF7,0x38,0xEE,0x58,0x29,0x60,0x46,0x7E,0xCD,0xA5,0x98,0x8D,0xDE,0x56,0xE6,0x3C,0xB7,0xE5,0xED,0xB6,0x38,0x45,0x5A,0x61,0x04,0x2C,0xD1,0x53,0x8B,0xEE,
0xA9,0xD7,0xEA,0x71,0x2E,0xFA,0x11,0xAA,0x3F,0x30,0x95,0x3D,0x1D,0x3D,0x02,0x8A,0xAA,0x99,0x10,0x37,0x21,0xA9,0xB9,0xFD,0x3A,0x9F,0xEA,0xD8,0xD1,0x4F,0xDA,0x55,
0x95,0x92,0x9A,0x9C,0xEA,0x5F,0xFD,0xC7,0xD8,0x0D,0xFA,0x75,0xC6,0x6A,0x69,0xA8,0x98,0x87,0xD3,0x34,0xCC,0x4D,0xB5,0x10,0x58,0x03,0xEE,0x76,0xFC,0xE3,0x62,0xCD,
0x5C,0x11,0x60,0xCB,0xE8,0xDD,0xB9,0x8D,0x4E,0x40,0x3C,0xC7,0x41,0x8C,0xE5,0x4C,0x68,0x68,0xC1,0x9A,0xB2,0xC5,0xC4,0x8B,0x06,0x57,0x5D,0x25,0x53,0xBC,0x46,0x36,
0xA8,0xEC,0xC2,0x26,0xA6,0x91,0xAD,0xA5,0x40,0x00,0x28,0x0C,0x76,0x1E,0xB8,0x2B,0x25,0x3D,0x1C,0xE7,0x2E,0x96,0xA2,0x50,0xD5,0x54,0xF4,0xC9,0x10,0x96,0xDF,0xE4,
0x85,0x07,0xB2,0x2E,0x79,0x59,0x80,0x65,0x3C,0xF9,0x82,0x70,0x7F,0x30,0xE0,0x89,0xE8,0xB2,0xD8,0xE7,0xA4,0xA7,0xEC,0x91,0xE5,0xD1,0x3D,0x4B,0x9B,0xBC,0x84,0x92,
0xA4,0xA5,0xB9,0x2A,0xAB,0x11,0x7E,0xA7,0x09,0x59,0xC4,0x99,0x86,0x5A,0xAB,0x49,0x5B,0x1B,0xA4,0x15,0xDA,0x9C,0x4B,0x26,0xC1,0xA3,0x56,0xD3,0x7F,0xD0,0x60,0xD3,
0x52,0xAF,0xF7,0x31,0x04,0xFB,0x31,0x6B,0x3A,0x8D,0x2B,0x6A,0x6A,0x73,0x0A,0x56,0x7A,0x3A,0xD8,0x34,0x87,0x8E,0xFE,0x19,0x58,0x91,0x61,0x7B,0x75,0xB0,0x3C,0xED,
0xB1,0xC7,0x7D,0x35,0x6E,0x67,0x5F,0x45,0x35,0x2C,0x95,0x22,0x99,0xE3,0x5D,0x6F,0x4B,0x3A,0x07,0xB0,0xB8,0x07,0x49,0x66,0x17,0xBD,0xF9,0x2D,0xC7,0xA6,0x39,0x56,
0x9A,0x5A,0xFA,0x98,0x9A,0x9E,0x36,0x95,0x51,0x23,0x80,0xBE,0x9B,0x76,0x97,0x0C,0xC1,0x58,0x79,0xF8,0x5B,0x7F,0x41,0xE7,0x81,0x0E,0xD5,0x49,0x45,0x24,0xAE,0x7B,
0x46,0x25,0x81,0x8A,0x5D,0xCB,0x28,0x36,0xBA,0x8F,0x3B,0x9E,0x5E,0x98,0x33,0x94,0x54,0x30,0x20,0x9C,0xCA,0x79,0x29,0x33,0x2B,0xBB,0xC7,0x32,0xF2,0xD2,0x90,0xBA,
0x5B,0xCB,0x96,0x9F,0xE3,0x8C,0x35,0x72,0xD6,0x30,0x3D,0x95,0x0E,0x99,0x6D,0x74,0x77,0x2E,0x58,0xDF,0xCB,0x51,0xDB,0x6B,0xF4,0xC1,0x07,0x9E,0x89,0x32,0xE1,0x5B,
0x3E,0x5C,0xF2,0x40,0xCE,0x02,0xCF,0x4F,0x21,0x4E,0x5D,0x2F,0xD4,0xFA,0x36,0x3F,0xA7,0xAE,0xCB,0xAA,0x4F,0xF8,0x42,0x6A,0x2A,0x06,0x9E,0xD5,0xB4,0x35,0xFD,0x45,
0xED,0x7F,0xA6,0x2C,0x71,0xDC,0x65,0x54,0x06,0x32,0x2A,0xE9,0x22,0x2D,0x2C,0x0F,0xAF,0x4E,0xA2,0x65,0x60,0xBB,0x75,0xDA,0xE4,0xFE,0x98,0xEF,0x5E,0x1E,0x9A,0xA1,
0x3B,0xC4,0xF4,0xE9,0x23,0x8D,0xC4,0x93,0xC8,0xCF,0x61,0xE4,0x03,0x5B,0xF5,0xC3,0x06,0x55,0x21,0xCD,0x40,0xA5,0xA9,0x8E,0xBE,0x09,0x94,0x58,0xBD,0x29,0x8C,0xEA,
0x1E,0x5F,0x28,0x37,0xFA,0xE3,0xAA,0xBA,0x3C,0x9A,0x15,0x68,0xA7,0x8F,0x38,0x91,0xF7,0x00,0xCE,0x25,0x22,0xDF,0x7C,0x2D,0x9E,0x8F,0xF3,0x08,0x28,0x23,0x88,0xAF,
0x55,0x55,0x55,0x1C,0xB1,0xB4,0xDA,0x54,0xC6,0x6C,0x0A,0x13,0x1A,0x8F,0x60,0x08,0xB7,0xDF,0x06,0x67,0xCF,0xE9,0xEB,0xBB,0x29,0x62,0xA8,0x95,0x24,0x8A,0xD7,0x42,
0xC5,0xD7,0x63,0xD3,0x51,0xB9,0xFA,0x9C,0x0A,0xAC,0xA6,0xA4,0x8E,0x56,0x78,0x69,0xA3,0x50,0x0D,0xEE,0xF4,0xAE,0x6D,0xB7,0x99,0xC7,0x5C,0x33,0x53,0x4A,0x5A,0xF5,
0xA5,0x1C,0x30,0x50,0xBD,0x9B,0x28,0x3E,0xA3,0xD3,0x1A,0x15,0xB7,0x08,0xB2,0x00,0xEE,0x1A,0x9B,0x38,0xAE,0xAC,0x84,0x53,0xB0,0x22,0x3B,0xDF,0x4D,0xED,0xAB,0xDC,
0x01,0x8D,0x54,0xB2,0xB0,0x87,0xB3,0x88,0x41,0x4E,0xD6,0xDF,0xB2,0x8C,0xB3,0x13,0xEA,0x4E,0x07,0xC5,0x4E,0xA2,0xC5,0xE6,0x4B,0x83,0xB9,0xD0,0x58,0x9F,0xB9,0xC6,
0xF8,0x3F,0xB5,0x10,0x83,0x4C,0x91,0xB2,0xF4,0x3B,0x0C,0x43,0xD4,0x80,0xCC,0xA6,0x0E,0xD6,0x72,0xD5,0x95,0x15,0x6F,0xA6,0xD7,0x2C,0xDA,0x2F,0xEA,0x06,0x3B,0xA3,
0x8E,0x38,0x27,0x2F,0x05,0x33,0x05,0x26,0xF7,0x23,0x57,0xD6,0xFC,0xB1,0xDA,0xD5,0x39,0xB4,0x4C,0x75,0x44,0xA1,0x81,0xF9,0x8A,0x5A,0xFE,0xD6,0x1B,0xE3,0xA6,0x4E,
0xF8,0xD2,0x86,0x9A,0xA3,0xB2,0xB8,0xE4,0x11,0x71,0x70,0xB7,0xAF,0xE2,0x16,0xA3,0xAD,0x2F,0xA4,0x24,0x41,0xD8,0x1E,0x67,0x95,0xB0,0x6E,0x0A,0xC1,0x1D,0x38,0x59,
0x6B,0x61,0x80,0x11,0xC8,0xA6,0xDF,0xD7,0xAE,0x14,0xE0,0xA8,0x58,0x9C,0xC7,0xDB,0xC9,0x7B,0xF3,0x00,0x6F,0xF6,0xC7,0xC7,0xAC,0x70,0x42,0x69,0x91,0xF5,0x7C,0xA1,
0x93,0x9E,0xFC,0xEC,0x70,0xA6,0xC5,0x70,0xD5,0xC7,0xD0,0x9F,0xFF,0xD9,};

View File

@ -0,0 +1,300 @@
// We need this header file to use FLASH as storage with PROGMEM directive
#include <pgmspace.h>
const uint8_t Tiger[] PROGMEM = {
0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x00,0xB4,0x00,0xB4,0x00,0x00,0xFF,0xDB,0x00,0x43,0x00,0x04,0x03,0x03,0x03,0x03,0x02,0x04,
0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x0A,0x06,0x06,0x05,0x05,0x06,0x0C,0x08,0x09,0x07,0x0A,0x0E,0x0C,0x0F,0x0E,0x0E,0x0C,0x0D,0x0D,0x0F,0x11,0x16,0x13,0x0F,
0x10,0x15,0x11,0x0D,0x0D,0x13,0x1A,0x13,0x15,0x17,0x18,0x19,0x19,0x19,0x0F,0x12,0x1B,0x1D,0x1B,0x18,0x1D,0x16,0x18,0x19,0x18,0xFF,0xDB,0x00,0x43,0x01,0x04,0x04,
0x04,0x06,0x05,0x06,0x0B,0x06,0x06,0x0B,0x18,0x10,0x0D,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xC0,
0x00,0x11,0x08,0x00,0xA0,0x00,0x78,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xFF,0xC4,0x00,0x1D,0x00,0x00,0x02,0x02,0x03,0x01,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x04,0x07,0x00,0x03,0x08,0x02,0x01,0x09,0xFF,0xC4,0x00,0x40,0x10,0x00,0x01,0x03,0x02,0x05,0x02,0x04,0x03,0x06,0x04,0x05,
0x02,0x07,0x01,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x11,0x00,0x06,0x12,0x21,0x31,0x07,0x41,0x13,0x22,0x51,0x61,0x14,0x71,0x81,0x08,0x15,0x23,0x32,0x91,0xA1,0x42,
0x62,0xB1,0xD1,0x33,0x52,0xC1,0xE1,0xF0,0x63,0x72,0x16,0x17,0x24,0x34,0x43,0x82,0x92,0xC2,0xFF,0xC4,0x00,0x1B,0x01,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x05,0x02,0x06,0x01,0x00,0x07,0xFF,0xC4,0x00,0x30,0x11,0x00,0x02,0x02,0x01,0x03,0x03,0x03,0x01,0x07,0x04,0x03,0x00,
0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x03,0x11,0x04,0x12,0x21,0x31,0x41,0x51,0x05,0x13,0x22,0x61,0x14,0x23,0x42,0x71,0x81,0x91,0xB1,0x32,0xC1,0xD1,0xF0,0x33,0xA1,
0xE1,0xFF,0xDA,0x00,0x0C,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3F,0x00,0x75,0x87,0x3D,0xB4,0x20,0xC7,0x6D,0xB0,0xDE,0x9E,0x34,0xA7,0xB7,0x7B,0x83,0x81,0xE3,
0x30,0xAD,0xDA,0xBA,0x63,0xB2,0xC8,0x75,0x29,0x56,0x92,0xA4,0x10,0x40,0xFA,0x76,0x3F,0xF3,0xDF,0x00,0xB3,0x5C,0xBA,0xB8,0xF0,0x98,0xA4,0x18,0x6D,0x21,0xC3,0xA1,
0x6E,0xBE,0x6C,0x52,0x3B,0x9B,0x5F,0x73,0xFF,0x00,0x36,0xC0,0x6A,0x3B,0x49,0xCA,0xF4,0x79,0x2F,0x2A,0x58,0x99,0x29,0xD7,0x37,0x56,0x91,0xE7,0x59,0xE1,0x29,0x1D,
0xAF,0xFD,0xFB,0x63,0xF3,0x21,0x4F,0xC7,0x3D,0xCF,0x69,0xD5,0x6F,0x00,0xFD,0x21,0xFC,0xC7,0xD4,0x98,0x54,0x19,0xEC,0xD3,0x13,0x19,0xD9,0x95,0x17,0x9C,0xB1,0x89,
0x19,0x3B,0xB6,0xDD,0xFF,0x00,0xC4,0x51,0x3B,0x01,0xED,0x84,0xB6,0xBA,0xB9,0x9F,0xA0,0x4D,0x0D,0x55,0x72,0xF5,0x32,0x74,0x17,0x56,0x50,0x92,0xA6,0x14,0x82,0xA1,
0xB9,0xDF,0x73,0xF2,0xE3,0x0B,0xB5,0xCA,0xEC,0x7A,0x45,0x6C,0x29,0xE7,0xDB,0x45,0x42,0x5A,0x8A,0xE5,0x49,0xD9,0x76,0x3C,0x0B,0x7B,0x01,0x60,0x07,0xA2,0x46,0x2C,
0xFC,0x85,0x12,0x4E,0x61,0x8C,0xC3,0xF1,0xD9,0x4D,0x46,0x9E,0xE9,0x50,0xD6,0x0A,0x75,0x80,0x8B,0xEA,0x3A,0x49,0x1D,0xC5,0xBE,0xA9,0xFA,0x75,0x1A,0x3F,0x49,0x55,
0x4C,0x91,0x96,0x32,0x16,0xAB,0xD4,0x18,0xB6,0x41,0xE2,0x15,0xCB,0x13,0xBA,0x69,0x9C,0x5D,0x6A,0x32,0xE9,0x8A,0xA3,0xD5,0x1A,0x6C,0x15,0xC2,0x5E,0xA4,0xDC,0x1B,
0x59,0x48,0x23,0xCA,0x41,0x24,0x7A,0x1D,0xF7,0x18,0x25,0x5F,0x89,0x91,0xEB,0x5E,0x3C,0x14,0x57,0xA2,0xB5,0x3D,0x94,0x84,0x25,0x0B,0x74,0x58,0x11,0x6B,0x02,0x0F,
0xA6,0x90,0x30,0xBD,0xD4,0x2C,0x91,0x4B,0x8E,0xDC,0x7A,0xBC,0x15,0xBF,0x1D,0xB6,0x80,0x71,0x7A,0x54,0x10,0xAD,0x3C,0x94,0x83,0xDA,0xE3,0x8F,0x98,0xC1,0x0A,0xB6,
0x4F,0xE9,0x9C,0x5A,0x53,0xB5,0x0A,0x9C,0x78,0xE9,0x6D,0x60,0x15,0x4B,0x93,0x21,0x45,0x4B,0xF4,0x3A,0x8A,0xBB,0xE1,0x6D,0x4E,0xC4,0x3B,0x2E,0x66,0x38,0xED,0xD7,
0xF9,0x9A,0x4A,0xD7,0x50,0xB9,0x0A,0x20,0xB8,0x09,0xA7,0x39,0x11,0x9F,0x83,0x0D,0xD6,0xA7,0xD3,0x02,0x92,0xCC,0x86,0x0E,0xB5,0xB7,0xA4,0x9F,0x2F,0x37,0x0A,0xB9,
0x20,0x28,0x8B,0x27,0x91,0x73,0xA4,0xA6,0x0C,0x49,0xB3,0xE3,0x46,0x9E,0xFE,0x66,0x64,0xC3,0x8E,0x12,0x97,0x96,0x5D,0x51,0x2A,0x2B,0x04,0x13,0xCF,0x73,0xE8,0x3F,
0xCB,0x8A,0xB6,0x26,0x7D,0xC8,0xF9,0x5F,0xAA,0x6B,0xAB,0xD2,0x22,0x85,0x41,0x42,0x94,0xDB,0x6A,0x69,0x4B,0x04,0x00,0x2D,0xA8,0x02,0x48,0x50,0x3B,0xFA,0x60,0xBE,
0x78,0xFB,0x40,0x26,0x72,0xD0,0x8C,0xAE,0xDD,0x2A,0xA3,0x1C,0xA3,0xF1,0x5A,0x94,0xCA,0xD0,0xE8,0x20,0xEF,0x6B,0xEC,0xA0,0x47,0x6D,0xFB,0xE3,0x2D,0xA2,0x66,0x75,
0x5A,0xD4,0xED,0x3C,0xF8,0xFF,0x00,0x31,0x53,0xA5,0xA8,0x8D,0xC5,0xB9,0x12,0x7D,0x3F,0xAD,0xA8,0xA5,0xE7,0xC8,0xB5,0x4A,0x75,0x2D,0x87,0x63,0x44,0x74,0xA9,0x0C,
0xBC,0x2F,0xAC,0x10,0x42,0x8D,0xBB,0x13,0x72,0x71,0xD7,0xF9,0x6B,0xED,0x31,0xD3,0xFC,0xC5,0x45,0x4B,0xAA,0x9E,0xD4,0x19,0x1E,0x16,0xA7,0x23,0xC8,0x55,0x8A,0x0F,
0xA7,0xBE,0x3F,0x3F,0xE2,0x57,0x32,0x6E,0x6C,0x79,0x65,0x70,0xC5,0x1A,0x63,0x96,0x51,0x46,0xBB,0x24,0xAB,0x7B,0xE9,0x36,0x02,0xC7,0x01,0x66,0xD1,0xEA,0x31,0xA5,
0xAD,0x98,0xCB,0x2E,0x84,0x1B,0x82,0x0F,0x3F,0xF0,0x62,0xE5,0x06,0x8A,0xC6,0xC5,0x1B,0x0C,0x0F,0xD9,0xD9,0x3F,0xA3,0x99,0x6E,0xFD,0xAC,0x73,0x65,0x03,0x35,0xE7,
0x48,0x4E,0xE5,0xC7,0xD8,0x74,0xA1,0x8B,0x3C,0xB6,0xB7,0x17,0xBE,0xC0,0xE2,0x47,0x43,0xE9,0x2E,0xFF,0x00,0xE5,0x33,0xF2,0xDE,0xF0,0x23,0xC6,0x12,0x12,0x94,0xAD,
0xB5,0x94,0xBC,0xFA,0xAF,0x75,0x1B,0xF7,0xB0,0x20,0x0B,0x0F,0x5C,0x24,0xE5,0x1E,0x8D,0xE6,0x4C,0xC3,0xF0,0xD5,0x1A,0xC3,0x6B,0x87,0x0D,0xF5,0x0F,0x05,0x0E,0x9B,
0x39,0x20,0x7A,0x81,0xC8,0x4F,0xAA,0x8F,0xD2,0xF8,0xE9,0x39,0xD4,0x88,0xD9,0x73,0x24,0xC7,0xCA,0xD4,0xE8,0xCD,0xC5,0x6A,0x1B,0x05,0xC2,0xE5,0xB7,0x70,0xF2,0x79,
0x1D,0xCF,0xF6,0xC6,0x75,0x56,0xD3,0x65,0x66,0xB0,0x73,0x88,0xBE,0xA0,0x32,0x2E,0x0F,0x53,0x16,0xDF,0x71,0xF6,0x96,0xCB,0xED,0xB4,0xA7,0x63,0xF8,0x28,0x01,0xED,
0x7A,0x82,0x95,0xE2,0x58,0x8B,0xF7,0x36,0xEF,0xDF,0x12,0x96,0xF8,0x87,0x1A,0x4A,0x0C,0x92,0x12,0xE3,0x61,0x6B,0x0A,0x55,0xFF,0x00,0x89,0x23,0xFA,0x6F,0xF5,0x38,
0x1F,0x22,0x43,0x8A,0xF0,0xD8,0x75,0x44,0xC6,0x08,0x5B,0x84,0xB6,0x78,0x52,0x5C,0x1A,0x7F,0xDF,0x1A,0x66,0xBE,0x17,0x4F,0x9A,0xA9,0x0D,0x23,0x49,0x53,0x68,0x04,
0x8E,0x52,0x53,0xB8,0x3F,0xA0,0xFD,0x31,0xC4,0x32,0xE0,0x32,0x8F,0x3F,0xDE,0x0D,0xB2,0xB8,0xCF,0x89,0x19,0xB9,0x0C,0x54,0x50,0xB9,0xD1,0x9D,0x57,0x92,0x56,0x95,
0xDF,0xF8,0x95,0xED,0x7F,0x61,0x8C,0xC4,0x26,0x69,0x71,0xE3,0x20,0xB8,0xE3,0xEA,0x67,0xC0,0xB8,0x6D,0x90,0x7F,0x3A,0x94,0x90,0x47,0xE8,0x06,0x33,0x1A,0xB7,0x2A,
0x40,0x10,0x37,0xD5,0xB9,0xB3,0x02,0x66,0x1C,0xB5,0x93,0xE9,0x4B,0x76,0x6D,0x66,0xB3,0x25,0x60,0x6E,0xB0,0xB9,0x04,0xEA,0x26,0xFB,0x5B,0xBD,0xCE,0x11,0xE3,0x66,
0xAF,0xB9,0x25,0x47,0x97,0x0D,0x95,0x39,0x42,0x2F,0x16,0x23,0xDC,0x5C,0xF8,0xAA,0x49,0x24,0xEF,0x63,0x7B,0x5F,0xD7,0x9C,0x3B,0x64,0x4E,0x9D,0xC5,0x7A,0xB3,0x36,
0xA7,0x56,0x4B,0xAF,0x2E,0x38,0x4A,0x90,0xCB,0xAE,0xEB,0x0D,0x95,0x02,0x4A,0x97,0xEA,0x6D,0x6D,0xBD,0xF0,0xA7,0xD4,0x16,0x60,0x66,0x3E,0xB1,0xB3,0x94,0x40,0x54,
0x78,0x10,0x46,0x94,0x86,0x5A,0xD9,0x6E,0xDB,0x51,0xBD,0xAC,0x05,0xED,0x6D,0x47,0x80,0x0E,0x3A,0x1D,0x1D,0x60,0xDC,0x54,0x92,0xD8,0xE7,0x3D,0xBF,0x41,0x3A,0x5D,
0x43,0xFD,0xDE,0x40,0xC6,0x62,0x8E,0x7A,0x99,0x1E,0x66,0x66,0x63,0xC3,0x91,0xE1,0xBC,0xF9,0x4D,0xED,0x73,0xA5,0x26,0xDC,0x0F,0x6D,0xF1,0xD2,0x9D,0x0C,0x79,0xD9,
0x9D,0x3D,0xAB,0x40,0xA6,0xCC,0x63,0xE2,0x92,0xB0,0xEC,0x55,0x11,0x70,0xCA,0x37,0x49,0x6D,0x29,0xE4,0xA8,0x6B,0x49,0x3B,0x0B,0x6C,0x38,0xB0,0xC7,0x21,0x57,0x0A,
0x65,0xF5,0x21,0xD8,0xF2,0x9A,0x28,0x4B,0x72,0x92,0xDE,0x94,0x02,0xAB,0x36,0x9B,0x00,0x3C,0xBB,0x93,0xA4,0x6F,0x6E,0xF8,0xE9,0x4E,0x87,0xD7,0x65,0xD0,0xA3,0x4B,
0xA6,0x57,0x7C,0x66,0xDF,0x75,0xEF,0x04,0xBC,0xD8,0x43,0x2A,0x69,0x49,0x56,0x9B,0x8B,0x0B,0x84,0x5C,0x94,0xF7,0xE2,0xFB,0x76,0xE8,0xD3,0xE1,0x83,0x23,0xDA,0xB9,
0x40,0x25,0xE7,0x54,0x8B,0x0A,0x96,0xA9,0x54,0xA9,0xAE,0x22,0x73,0xA6,0x10,0x71,0x48,0x5A,0x75,0x16,0xCF,0x60,0x05,0xB6,0x01,0x49,0x27,0xDE,0xF8,0xE6,0x5C,0xC5,
0xD3,0xFA,0xA6,0x6F,0xCE,0x82,0x35,0x7B,0x36,0x8A,0x7D,0x21,0xB6,0x93,0xF0,0xCD,0x3A,0x8F,0xF0,0xC0,0xE4,0x14,0xDC,0x0E,0xC7,0x7B,0xFA,0x62,0xE6,0xAC,0xE6,0x39,
0x15,0xDA,0xFC,0xA2,0xD3,0x05,0xBD,0x36,0x41,0x52,0x8A,0x81,0x70,0x24,0xF9,0x82,0x81,0x36,0xE7,0x7E,0xFC,0xED,0xEE,0xC9,0x96,0xB2,0x9D,0x16,0xB7,0x25,0x2A,0xAD,
0x86,0xDD,0x6A,0x4B,0x44,0x16,0x08,0x0B,0x41,0x41,0xE7,0x51,0x3B,0x0E,0xC0,0x7C,0xFF,0x00,0x5E,0x7F,0x5D,0xA8,0x65,0xBF,0x75,0x7D,0x7C,0xCA,0x1A,0x34,0x51,0x5E,
0x1E,0x73,0x9C,0x18,0xFD,0x10,0xC8,0x66,0xA1,0x47,0xAA,0x56,0xD3,0x98,0x1F,0x71,0x00,0x19,0x08,0x8D,0xE2,0x23,0xFE,0xD0,0x37,0x00,0x8B,0x73,0x7E,0xF8,0x89,0x96,
0x22,0x74,0xD5,0xA9,0xE7,0x30,0xC1,0x88,0xD2,0x19,0x7D,0x61,0x29,0xF8,0xB4,0x58,0x32,0xE6,0xF6,0x09,0xD5,0xB0,0xBD,0xBB,0x7F,0x6C,0x5C,0x3D,0x42,0xC9,0x7F,0x66,
0x5C,0xB7,0x19,0xAA,0xB4,0x98,0x6C,0xC1,0x44,0x55,0xA9,0x83,0xE1,0xA9,0xC5,0x25,0xE7,0x45,0xD5,0xA7,0x48,0xFC,0xD6,0xB1,0x1F,0xB6,0x29,0x4E,0xAC,0xF5,0x13,0x25,
0xE6,0x3E,0x98,0x42,0xA1,0xD2,0x32,0xE4,0x9A,0x63,0xC9,0x7D,0x2F,0xC2,0x2A,0x68,0x34,0x85,0x35,0xE6,0x05,0x76,0x1D,0x8D,0xAC,0x07,0xCF,0x02,0x6A,0x5B,0x50,0xC0,
0x21,0x6F,0x97,0x53,0x9E,0x3F,0x68,0xD5,0x77,0x04,0x19,0x20,0x71,0xD0,0x62,0x1F,0xCD,0xB9,0xEE,0x3A,0x59,0x4B,0x31,0xFA,0x66,0xBA,0xDA,0x54,0xAF,0x08,0x3E,0xEB,
0x09,0x53,0x64,0xDB,0x6D,0x3A,0x42,0xAF,0xBF,0xCB,0x11,0x32,0x6D,0x4D,0xE7,0xFA,0xAD,0x4F,0xA7,0x56,0x7A,0x61,0x2A,0x96,0xCC,0xA1,0xA0,0xFE,0x77,0x1B,0x41,0x00,
0xE9,0x55,0x88,0xB5,0xAF,0xB1,0xFA,0x62,0xB6,0xCA,0x15,0xA9,0xB9,0x1E,0x84,0xFD,0x49,0x8A,0xE3,0xB1,0xEA,0x05,0xC4,0x29,0x98,0x12,0x0A,0x83,0x2F,0x20,0x8B,0xEF,
0xD8,0x1B,0x5E,0xD8,0x7A,0xCB,0x5D,0x68,0xAF,0xD7,0xAB,0xE8,0x5E,0x5E,0xA8,0xA2,0x89,0x5A,0xD3,0xF8,0x30,0xE6,0x7E,0x3C,0x39,0x6B,0xB7,0xE5,0x04,0xEE,0xDA,0x8F,
0x03,0x7B,0x1D,0xB1,0x9F,0xB2,0xB5,0x4A,0x55,0x17,0x2A,0x3F,0x16,0x4F,0xF1,0x3D,0x6B,0x77,0xF2,0x4F,0x3E,0x38,0x9D,0x75,0x0F,0x2C,0x57,0xC2,0x5F,0xAD,0x30,0xCA,
0x65,0x06,0xDB,0x01,0x90,0xED,0x90,0x00,0xB5,0xEC,0x2E,0x7D,0x79,0x3C,0x61,0x12,0xA9,0x9E,0x8D,0x46,0x94,0xBA,0x35,0x65,0xA6,0x90,0x56,0xAD,0x08,0x73,0x48,0xF2,
0x1E,0xC2,0xE7,0xDC,0x0E,0xFC,0xE1,0x7B,0xA7,0xDF,0x68,0x6A,0xAE,0x69,0x96,0xAA,0x2E,0x76,0xA6,0xA2,0x95,0x55,0xA7,0x3A,0x1B,0x01,0x96,0xCA,0x10,0x55,0xBE,0xD6,
0xBF,0x3F,0xAE,0xD8,0x3D,0xD4,0xBA,0x1A,0x5E,0x44,0x2A,0xB4,0x64,0xB4,0xDC,0x67,0x8A,0x6D,0xA4,0xEC,0x95,0x5C,0x92,0x6D,0xEF,0xA8,0xF7,0xE7,0x18,0xB6,0xC6,0xD3,
0xAE,0xC4,0x3C,0x8E,0xB2,0x36,0xBA,0x97,0xB3,0xEF,0x3A,0x48,0x31,0x18,0x65,0xAC,0xA7,0x50,0x17,0x05,0xC5,0x90,0x52,0xA3,0xB9,0x48,0x59,0xD5,0xDF,0xE7,0x85,0xA9,
0xF3,0x0C,0xC8,0x8E,0x42,0x48,0xB9,0x6F,0x4D,0xEF,0xDC,0xD8,0xF6,0xFA,0x60,0x8B,0x8D,0xBE,0xE6,0x51,0x42,0x22,0x5A,0xCF,0xA1,0x41,0x66,0xF6,0x26,0xC0,0x8F,0xD6,
0xF6,0xC0,0xB7,0x99,0x42,0x29,0x88,0x96,0xD8,0x5F,0x8C,0xB5,0x36,0xA7,0x4A,0x8F,0x60,0x39,0xFD,0xF1,0x0D,0x57,0x36,0x9F,0xA9,0x8B,0x5B,0x66,0xED,0x8A,0x7B,0x08,
0x42,0x04,0x26,0x6A,0x6E,0x36,0xFF,0x00,0x8C,0x13,0xE1,0xA5,0x2D,0xB8,0x87,0x2F,0xAC,0xDA,0xC0,0x8B,0xFA,0xEF,0xFB,0x63,0x31,0x1E,0x85,0x35,0x2E,0xD7,0x42,0x12,
0xE1,0x40,0x0A,0x25,0x41,0x63,0x75,0xA8,0x9B,0x03,0xFB,0x1C,0x66,0x1B,0x64,0x50,0x79,0x12,0x86,0x8A,0xCA,0x99,0x4E,0xF1,0xDE,0x58,0x79,0x7B,0x2B,0xC1,0xA0,0xD2,
0x19,0xA7,0xC5,0x05,0x65,0x43,0x5B,0xEF,0x2B,0x72,0xEA,0xB9,0xBA,0x8F,0xF7,0xEC,0x46,0x39,0xE6,0x5B,0xCE,0xC1,0xFB,0x41,0x56,0x61,0x3D,0x1D,0xA4,0xB7,0x25,0x4A,
0x4F,0xC4,0xB8,0x2C,0x50,0x9D,0xC6,0xDD,0xCD,0xEF,0xFB,0x0D,0xB1,0xD7,0x74,0xFA,0x42,0xE5,0x28,0xA9,0xC4,0x94,0x21,0x80,0x9B,0x94,0x9E,0x4D,0xEF,0x6F,0xD2,0xC3,
0xE4,0x4E,0x2A,0x7E,0xA2,0xE5,0x9A,0x68,0xCC,0xAF,0x54,0x92,0x94,0xB4,0xB7,0xD0,0xA6,0xDC,0xB2,0x6E,0xA5,0x0D,0x8D,0xB6,0xDC,0x76,0x3F,0xEC,0x71,0x47,0x45,0x78,
0x1B,0xB7,0x7E,0x29,0x43,0x52,0x32,0x40,0x1D,0xA2,0x9F,0x4D,0x7A,0x57,0x95,0x69,0xB5,0x23,0x98,0xAA,0x95,0x26,0xAB,0x15,0x47,0x9A,0x2E,0xB6,0xC2,0x12,0xA5,0x25,
0x2A,0x36,0x51,0x29,0x57,0x2A,0x36,0xB7,0xA6,0xD7,0x17,0xC3,0xCD,0x2B,0x2D,0xCA,0x2F,0x38,0xFF,0x00,0xDD,0x32,0xC7,0x88,0xE2,0x92,0xDC,0xA6,0xDB,0xBA,0xDA,0x40,
0x36,0x4D,0xF6,0xDA,0xE3,0x6B,0x9B,0xF1,0xDB,0x9C,0x0E,0xA4,0x52,0x9E,0xA3,0xD2,0x91,0x51,0x2D,0x29,0x96,0xD2,0x3C,0x46,0xC7,0xF1,0x04,0x80,0x2C,0x4D,0xC9,0xFF,
0x00,0x9F,0x2C,0x33,0xD4,0x73,0xCD,0x17,0x28,0xD2,0x9F,0xA8,0x57,0xAB,0x21,0x86,0x14,0x82,0xB4,0x37,0x20,0x0D,0x6A,0x07,0x8B,0x27,0x9D,0xD3,0xB5,0xB6,0xB6,0xDF,
0x2C,0x52,0x3A,0xED,0xC3,0x62,0xF5,0x88,0x7B,0x04,0x1D,0xC6,0x4B,0x81,0x95,0x1B,0x43,0xAA,0x93,0x55,0x78,0x43,0x56,0xAF,0xC3,0x74,0xEE,0xA5,0xDA,0xDB,0x6E,0x6C,
0x4E,0xC7,0xB7,0x6E,0xF8,0x54,0xEA,0x27,0x5B,0xF2,0xDE,0x55,0x84,0xF5,0x36,0x34,0xAB,0xBE,0x84,0x5B,0xC4,0x49,0x1A,0xB5,0x0B,0x82,0x13,0xB5,0xEF,0x84,0xD8,0xFD,
0x6D,0xAF,0x67,0xEA,0x84,0xC8,0xD9,0x66,0x1A,0x11,0x19,0x92,0x03,0x73,0x1D,0x1A,0x4B,0x60,0x03,0xBE,0xDC,0xEC,0x47,0xF4,0xB7,0x7C,0x53,0xD5,0x7A,0x8E,0x43,0x99,
0xD5,0x38,0x70,0x2B,0xDE,0x2C,0x84,0xB5,0x20,0xB7,0x22,0x42,0x4D,0x9A,0x17,0xDB,0x71,0xDC,0x5F,0xF6,0xC2,0x25,0x1A,0xDB,0x0A,0x30,0x3C,0x72,0x71,0xD6,0x34,0xAA,
0x10,0x06,0x32,0x5D,0x5F,0x2E,0xD7,0xBA,0x8B,0x5A,0xA5,0x66,0x1A,0xE4,0xE4,0x44,0xCB,0xCF,0x38,0x1B,0x8B,0x1F,0x7D,0x7A,0x54,0x6E,0x12,0x84,0xF7,0x5A,0xBD,0x7F,
0xB6,0x2D,0x7C,0xC1,0xD1,0xDA,0x2D,0x4D,0xC7,0x2B,0x55,0x48,0xAF,0xCF,0x91,0x11,0x80,0xD4,0x58,0x2C,0xB8,0x1A,0x6C,0x36,0x81,0x74,0x37,0xFB,0x1B,0xF6,0xF3,0x1C,
0x5E,0x19,0x47,0x27,0x53,0xE4,0xC9,0x82,0xCA,0x62,0x47,0x31,0x98,0x48,0x0C,0x10,0x2E,0x10,0x34,0xEF,0xA7,0xD3,0x6C,0x72,0xBF,0xDA,0x8F,0x3C,0xE6,0xAA,0x3F,0x5B,
0x2A,0xB9,0x3A,0x93,0x54,0x91,0x0A,0x99,0x09,0xB6,0x9B,0x0D,0xB3,0x74,0x15,0x15,0x36,0x95,0x92,0x4F,0x3F,0xC5,0xFF,0x00,0x37,0xC7,0xDA,0x74,0xD4,0x6A,0xC8,0xF6,
0xDB,0x68,0x10,0x8E,0xF5,0xD5,0x90,0x46,0x49,0x95,0x66,0x67,0x7E,0x75,0x57,0x30,0x56,0x9C,0xA9,0xD2,0xBE,0x0D,0x41,0xF4,0xB0,0xF4,0x76,0x88,0x52,0x5B,0xD0,0x0A,
0x40,0x49,0x00,0x0B,0x80,0x8D,0x8F,0x7F,0xAE,0x1E,0x7A,0x4B,0x95,0x61,0xD2,0xE0,0xCB,0xCC,0x15,0x3A,0x8D,0x1E,0x4D,0x1D,0xC3,0xA1,0x3F,0x12,0x01,0x0A,0x4F,0x73,
0x73,0xBA,0x14,0x01,0xFD,0xF0,0x81,0x42,0xA8,0x55,0xA7,0x74,0xF2,0xB7,0x0D,0xE7,0x75,0x47,0x61,0x6D,0x48,0x53,0xAE,0xEE,0x75,0x15,0xDE,0xE0,0xF7,0x36,0xD5,0xF3,
0xBE,0x23,0xC1,0xCB,0x0A,0xA9,0xCA,0x34,0xD6,0xAB,0xEC,0xD3,0xD9,0x94,0xE5,0xC3,0x12,0x4A,0x92,0x85,0x1E,0x76,0xED,0x7B,0x14,0x9B,0x7F,0x30,0xC3,0xDA,0x85,0xF8,
0x35,0x45,0xB6,0x81,0x8C,0xF7,0xE3,0x03,0xF6,0x98,0xAF,0x39,0x0C,0x06,0x4C,0xE9,0x6C,0xCD,0x97,0x20,0x56,0x9B,0x8D,0x5C,0xCB,0x35,0x38,0x8F,0x68,0x92,0xDA,0x5D,
0x53,0x4E,0x82,0x00,0xD3,0xA6,0xCA,0x20,0xFC,0xAD,0x7F,0x7C,0x38,0x54,0x2A,0x52,0x2A,0xDD,0x32,0x34,0x61,0x4F,0x7F,0xE2,0x12,0x7F,0x0D,0xD7,0x05,0xBC,0x42,0x9B,
0x1B,0xA7,0x7D,0xC1,0xB0,0xDF,0xDF,0xDF,0x1C,0xF9,0xD2,0x4C,0x89,0x9E,0xA9,0xF9,0xE2,0xB3,0x47,0x11,0x1C,0x5C,0x15,0xD3,0x1D,0x7E,0x43,0xA8,0x57,0xE1,0xA8,0x22,
0xCA,0x6D,0x69,0x3D,0xC8,0x58,0x48,0xF5,0xB6,0xAC,0x5D,0x51,0xAA,0x6B,0x7B,0x2B,0xD3,0xDB,0x64,0xA8,0xA9,0xB4,0xAA,0xCA,0x52,0xCD,0xD2,0x54,0x9D,0x5B,0x7A,0xFE,
0x41,0xDF,0xB9,0xC4,0x8D,0x4D,0x2B,0x52,0x80,0x8D,0xB8,0x1E,0x86,0x4F,0xF5,0x2B,0xAC,0x2A,0x50,0x8C,0x4D,0xB0,0x50,0xA5,0x64,0xFA,0x21,0x37,0x0E,0xA9,0x6E,0x38,
0xA4,0xFB,0x05,0x10,0x71,0x01,0xC2,0x85,0xA9,0x4C,0xB5,0xAC,0xA5,0x6C,0xA9,0xCD,0x40,0xEC,0x90,0x9F,0x5F,0x9E,0x08,0x49,0x7D,0xD6,0x3E,0xEC,0xA7,0xEA,0x68,0x3B,
0xA1,0x0B,0xD2,0x8D,0xED,0x72,0x54,0xAF,0xD9,0x62,0xD8,0x1B,0x70,0xC4,0x47,0x14,0x38,0xF8,0x32,0x00,0xF9,0x9F,0xF7,0xC4,0xAB,0x49,0xA8,0x9F,0x3C,0x49,0xAA,0xC3,
0xDD,0x50,0xC3,0xA4,0x87,0x4F,0x85,0x21,0xB9,0x05,0xE4,0x4C,0x52,0x00,0x7D,0x22,0xC1,0x00,0x95,0x24,0x1D,0x40,0x5F,0xB5,0xAE,0x77,0xC6,0x63,0xC3,0xF3,0xD6,0xD3,
0x01,0xD2,0xB0,0x3C,0x45,0xF7,0xD8,0x1D,0xBB,0xE3,0x30,0xDB,0x56,0xED,0xCA,0xC2,0xE8,0xED,0x01,0x4E,0xE9,0xD6,0x93,0x62,0xB9,0x4F,0xA5,0x2D,0x0D,0x28,0x21,0xA0,
0x92,0x91,0x60,0x77,0xF5,0x27,0x14,0xC6,0x6F,0x69,0x32,0xAB,0x69,0x8F,0x09,0xB2,0x64,0x48,0x5F,0x95,0x29,0x49,0x04,0x20,0x7E,0x72,0x4D,0x8D,0x86,0xD7,0xF7,0xB6,
0xD7,0xC5,0xDB,0x59,0x21,0xD6,0x86,0xB4,0xAF,0xC9,0x77,0x0A,0x54,0x40,0x00,0x03,0xB0,0xDF,0x6B,0xFF,0x00,0x41,0xBE,0x28,0x47,0x2A,0xD5,0x0C,0xC9,0x9B,0x6A,0xB4,
0xF8,0x35,0x05,0x31,0x25,0xA5,0x84,0xB4,0xB8,0xA9,0x00,0x58,0x9D,0x85,0xB7,0xD4,0x93,0x6B,0xDC,0xD8,0x6D,0x70,0x3D,0x5E,0xAA,0x83,0xBB,0x22,0x5C,0x7B,0x40,0x19,
0x31,0x8E,0x5C,0xEA,0x7F,0x89,0x1E,0x87,0x2A,0x9A,0xB7,0x12,0x84,0xFF,0x00,0x86,0x8B,0x12,0x0F,0xF3,0x13,0x72,0x3E,0x43,0x7E,0x7E,0x58,0xE5,0x8E,0xAE,0xA6,0xB3,
0xD4,0x7E,0xB8,0x47,0xCB,0x70,0x19,0x08,0xF0,0x6C,0xD2,0x11,0x6B,0x04,0x0F,0x7B,0x5F,0x80,0x06,0x2F,0x3C,0xCB,0x5F,0xA1,0xF4,0xA2,0x8C,0xFC,0xEA,0xAC,0xCF,0xBC,
0xB3,0x03,0xA9,0x21,0x11,0xD0,0x3C,0xA9,0x51,0x17,0x37,0xE0,0xDB,0x8D,0xB6,0x1C,0x73,0x81,0x1D,0x14,0xE9,0xD5,0x5A,0xA0,0xF4,0xAE,0xA4,0x66,0x62,0xDA,0xA6,0x54,
0x54,0xA7,0x9B,0x2E,0x91,0x74,0x36,0x77,0xD4,0x7D,0x2E,0x3F,0x61,0x87,0x51,0x4E,0x9D,0x4D,0xC4,0x73,0xDB,0xF3,0x81,0x46,0xDE,0xDB,0x73,0xC4,0x64,0xC8,0x5D,0x37,
0xA6,0x65,0x1C,0xB4,0xDD,0x19,0x96,0x87,0x8B,0xA7,0xF1,0x5D,0xB7,0xF8,0x8A,0x3C,0x9B,0x9F,0xF9,0xB6,0x38,0xE7,0xAA,0x39,0x22,0xA5,0x92,0xBA,0x93,0x3E,0x0C,0x96,
0x9C,0x31,0xD6,0xE2,0x9D,0x8C,0xFD,0xB6,0x71,0xB2,0x49,0x1B,0xFA,0x8E,0x0E,0x3A,0x17,0xA9,0x3F,0x68,0xA6,0x28,0x19,0x91,0x34,0x9C,0xAB,0x0E,0x2D,0x41,0x96,0x54,
0x03,0xEF,0xAD,0x77,0x4A,0xAD,0xC8,0x41,0x1F,0xD7,0xF6,0xC2,0xE5,0x5F,0xAE,0xF9,0x55,0xFC,0xC4,0xC0,0x99,0x4D,0x4D,0x5E,0x99,0x29,0x84,0x29,0x6D,0x3A,0xD0,0x2B,
0x88,0xE9,0x27,0x5A,0x49,0x50,0xF3,0x0E,0x38,0xC6,0x34,0x6B,0xAC,0xD3,0xB9,0xB4,0xA6,0xED,0xD1,0x8B,0x1E,0xAB,0x06,0x33,0x8C,0x4E,0x82,0xFB,0x29,0x67,0xCF,0xFC,
0x5B,0xD3,0xAF,0x84,0x79,0x0A,0xF8,0xEA,0x3F,0x86,0xC2,0xC2,0xB7,0x52,0xD3,0xA0,0x58,0xFE,0xCA,0xC5,0x9B,0x9E,0x3A,0x41,0xD1,0x79,0xF2,0xEA,0x3D,0x46,0xEA,0x15,
0x26,0x13,0x6E,0x2D,0xA4,0x19,0x32,0x67,0x3A,0x50,0x84,0x84,0xA0,0x25,0x3B,0x5E,0xD7,0xB0,0x1F,0xA6,0x39,0x1B,0xA4,0x35,0x5E,0xA4,0xE4,0xBC,0xC5,0x9B,0x6A,0xBD,
0x3E,0xCA,0xEE,0xD5,0xCC,0x8A,0x9B,0x6D,0x86,0x10,0xC2,0x9C,0x4A,0x1A,0x21,0x6B,0x49,0xB0,0xE2,0xE9,0x29,0x00,0x9D,0xB1,0x62,0x66,0x3E,0xBD,0x65,0x7E,0xAA,0x65,
0x7A,0xEE,0x48,0xEA,0xF6,0x57,0x99,0x43,0x99,0x4D,0x2D,0x48,0x65,0x88,0xEA,0x5F,0x88,0x4A,0x5C,0x48,0x71,0x3A,0x4E,0xE1,0x61,0x2A,0x57,0x23,0x8B,0xFA,0x62,0x9E,
0x96,0x94,0xE4,0x8E,0x9E,0x24,0xFB,0x98,0x83,0x2A,0x39,0xF5,0x4C,0x99,0x52,0xA3,0xE7,0x8A,0x8E,0x54,0xCA,0xCA,0x67,0x28,0xD3,0x1D,0x65,0xB8,0x6E,0x06,0xCD,0xDF,
0x71,0x4A,0x29,0x41,0x70,0x5E,0xE0,0x12,0x36,0xF6,0x1E,0xB8,0x45,0x25,0xC9,0xA2,0x4B,0xE9,0x86,0xD3,0x29,0x65,0x0C,0x3A,0xB0,0xEB,0x21,0x5E,0x52,0x8B,0x15,0x11,
0x6B,0xEA,0x4E,0xF7,0xF6,0x4E,0x3A,0xF3,0xA8,0x39,0x07,0xA5,0xD9,0x2E,0x83,0x91,0x9F,0xC8,0xD4,0x64,0x8C,0xB7,0x99,0xEA,0x6C,0xB3,0x50,0x71,0x32,0x1C,0x5B,0x72,
0x19,0x5B,0x77,0x6C,0x28,0x28,0x91,0xC9,0xD4,0x0F,0x20,0x8D,0xB9,0x38,0xA8,0xFA,0xCF,0x43,0x6F,0x23,0x75,0x72,0xA7,0x47,0xA7,0x53,0xD6,0xAF,0x05,0x2D,0x29,0x0B,
0x29,0xD9,0xD8,0x8E,0x28,0xAD,0xBF,0xFF,0x00,0x2A,0x0B,0x6A,0xFD,0xEC,0x3D,0x70,0x9E,0xAF,0x47,0xEC,0xEE,0x74,0x1D,0x7E,0xBD,0x3F,0xDC,0x47,0x34,0xDA,0x93,0x66,
0x11,0x8C,0x49,0xCA,0xB9,0x87,0xA8,0x03,0x3A,0xC1,0xCB,0xF0,0x66,0xB3,0x49,0xA8,0x68,0x4C,0x78,0x73,0x02,0x35,0x25,0x5E,0x22,0x4E,0x94,0x38,0x91,0x74,0xA9,0xA5,
0x11,0xA4,0xEC,0x74,0xDC,0x1E,0xD8,0xB8,0xB2,0xDD,0x29,0xE8,0x59,0x58,0xC0,0xAF,0x40,0x4C,0x7A,0x8B,0x48,0x4B,0xAB,0x49,0xDB,0xCA,0x11,0xC2,0x6C,0x7B,0x05,0x14,
0x9F,0xAE,0xFB,0x1C,0x50,0x6F,0xE7,0x55,0xD0,0xB3,0x7C,0x69,0x54,0xC8,0xEA,0x2D,0xC7,0x29,0x91,0x16,0x42,0x01,0x2E,0x44,0x78,0x6F,0x61,0xEA,0x80,0xA4,0x6E,0x9F,
0x4C,0x75,0x20,0xA6,0xC0,0xCC,0xA4,0xF5,0x0A,0x0B,0xEB,0x5D,0x16,0xB3,0x4B,0x45,0x55,0x0D,0x07,0x42,0x04,0x67,0x6E,0x02,0xDA,0x04,0xFA,0x2F,0x51,0x23,0xE7,0x80,
0x0D,0x39,0xBB,0x4E,0x70,0xB8,0x23,0x90,0x3F,0x98,0x9F,0xA9,0x81,0xBB,0x24,0xC4,0x09,0x76,0x7A,0xB0,0x8A,0xAB,0x88,0x5F,0x82,0x87,0x83,0x60,0xDC,0x02,0xA4,0x70,
0x3F,0xA7,0xF4,0xC7,0xAA,0xD3,0x80,0x31,0x20,0x30,0x9D,0x04,0xA5,0x28,0x4A,0x51,0x6F,0x28,0xBF,0x6B,0xFB,0x61,0x87,0x32,0x65,0x78,0x02,0x20,0xA9,0x51,0x6A,0x3E,
0x3D,0x39,0xC4,0x83,0xAD,0xF0,0x75,0x25,0x42,0xC1,0x43,0x6B,0xF0,0x7E,0x5F,0xD3,0x0A,0xF5,0x36,0xD9,0x90,0x8F,0x19,0xA9,0x61,0x69,0x53,0x9A,0x94,0x94,0x20,0x92,
0x8B,0x1B,0x77,0xF9,0xFE,0xD8,0x85,0x7D,0x2D,0xB8,0x6E,0xFA,0x48,0xEC,0x4E,0x49,0x30,0x1C,0xD6,0x9F,0x90,0xD4,0x76,0x16,0x52,0xDA,0x00,0x2A,0xD6,0x6E,0x48,0x37,
0xF4,0xF9,0x63,0x30,0xC1,0x0A,0x0D,0x16,0x6C,0xC4,0x25,0xD4,0x4B,0x9C,0xA6,0xAC,0x52,0xD2,0x12,0x10,0x8B,0x8D,0xC6,0xA2,0x4F,0x00,0xDC,0x9E,0x05,0x87,0x38,0xCC,
0x38,0xAA,0xDD,0x01,0x1F,0xBC,0x1D,0x76,0x15,0x18,0xC4,0xBB,0xFA,0x95,0x9B,0xCC,0x5A,0xBD,0x3F,0x28,0x50,0x58,0x71,0xF9,0x12,0x55,0xE1,0xAF,0xC2,0x4D,0x94,0x96,
0xFB,0xAB,0x7E,0x00,0xE7,0xDF,0xDF,0x8C,0x49,0xA5,0xE4,0xBC,0x9B,0xD3,0xF8,0x6A,0xAE,0x19,0x28,0xA6,0xBA,0xB4,0xF8,0x92,0xA6,0xC8,0x78,0x92,0x4D,0xB7,0xDD,0x47,
0x8F,0xA0,0xC1,0xFC,0xA5,0x94,0x8A,0x24,0x3B,0x9A,0x6B,0x2D,0x87,0xA7,0xBC,0x48,0x61,0x97,0x2D,0xF8,0x48,0xDB,0x61,0xE8,0x4F,0x72,0x3B,0x7B,0x13,0x7E,0x6C,0xFB,
0x60,0x67,0x56,0xD1,0x06,0x36,0x5D,0x62,0xA8,0x95,0x49,0xF1,0xC1,0x91,0x12,0x3B,0xDF,0x95,0x2A,0x41,0xFC,0xE0,0x6F,0xBF,0xEF,0xBE,0x3A,0xCA,0x74,0x8A,0x06,0xE3,
0x29,0x35,0xC5,0x8E,0xD1,0x23,0xD4,0xF2,0x7B,0xDD,0x6B,0xFB,0x41,0xC0,0x83,0x40,0x4B,0xB3,0x28,0x31,0x02,0x57,0x22,0x68,0x68,0xF8,0x7A,0x0F,0x9A,0xFF,0x00,0x5F,
0xF5,0xC5,0xB9,0xF6,0x9E,0xAC,0x3D,0xD3,0x1E,0x82,0xC5,0xA2,0x51,0xDB,0x53,0x2B,0xAA,0x2B,0xE1,0x0B,0xE8,0x1A,0x74,0x21,0x29,0xB9,0x17,0x16,0xDC,0x8D,0xBE,0x57,
0xC1,0x5F,0xB3,0x64,0xE8,0x10,0x3A,0x37,0x4A,0x76,0x95,0x4E,0xF8,0x30,0xB6,0xFC,0xC1,0x6A,0x2A,0x2A,0xDF,0x72,0x2F,0xBD,0xAF,0x7C,0x22,0x7D,0xAA,0x2A,0xF4,0x6E,
0xAB,0x66,0x9C,0x97,0xD3,0x6A,0x3D,0x65,0x87,0x6A,0xAA,0x9E,0xAF,0x89,0x6A,0x3A,0x83,0x81,0x84,0x11,0x62,0x55,0x6E,0x08,0xB1,0x36,0xE7,0x0C,0x0A,0x14,0xFD,0xE3,
0x0E,0x07,0x49,0x95,0xB7,0x9D,0x99,0x9C,0x8D,0x90,0x3A,0x71,0x59,0xEA,0x26,0x64,0x51,0x5F,0x89,0x1E,0x98,0xD1,0xBC,0x89,0xA4,0x6C,0x3F,0x94,0x13,0xC9,0xC3,0xD7,
0x50,0xFA,0x45,0x45,0x4D,0x2A,0x2C,0xBA,0x14,0xB8,0xB0,0x60,0xC4,0x49,0x41,0x70,0xB7,0x77,0x1E,0x55,0xEC,0x75,0x28,0x90,0x0E,0xE3,0x6F,0x9E,0x2F,0xB6,0xB2,0x35,
0x3A,0x91,0x4A,0xA9,0xE4,0x8C,0xBF,0x29,0x0D,0x33,0x47,0xF0,0x94,0xEA,0xE2,0xAC,0x07,0x1D,0xD8,0x2C,0x85,0x7A,0x15,0x10,0x41,0xC5,0x55,0xF6,0x92,0x08,0x39,0x7E,
0x87,0x96,0xE2,0x2D,0xF8,0xB3,0xDF,0x79,0xB7,0x57,0x11,0xC2,0x6C,0x42,0xC1,0xD3,0xB9,0xE2,0xCA,0x49,0xDB,0xB6,0x21,0x59,0x6E,0xA2,0xDD,0x48,0xDA,0x76,0x81,0xFF,
0x00,0x52,0xC5,0x6D,0x52,0xA6,0x31,0x9C,0xCF,0x9D,0x13,0xCE,0xD9,0xC3,0xA3,0xF3,0xEB,0x39,0xA9,0x88,0x13,0xF3,0x0D,0x11,0xA6,0xD2,0xC5,0x40,0x8B,0xA7,0xE1,0xD2,
0x93,0x64,0xA8,0x85,0x5B,0xD7,0x63,0xDF,0x0E,0xDD,0x41,0xEB,0x97,0x47,0xF3,0xAB,0xAD,0x55,0xAB,0xF9,0x0A,0x4C,0x2A,0xD3,0xA8,0x09,0x8F,0x51,0x54,0x64,0x87,0x00,
0x20,0x79,0x94,0xA6,0xD6,0x14,0xA0,0x3D,0x2E,0x6E,0x2E,0x3B,0x9C,0x55,0xD9,0x7F,0x34,0x42,0xCA,0x32,0x27,0xD2,0xEB,0xCF,0xCF,0x93,0x97,0xAA,0xF4,0xB3,0x41,0xAB,
0xAD,0x9B,0x95,0xC6,0x70,0x5C,0x07,0xB4,0x9D,0x95,0xA4,0x93,0xC7,0x65,0x1E,0x70,0x12,0xAF,0x07,0x33,0xBF,0x40,0x42,0x58,0xCA,0xE2,0xB1,0x1E,0x08,0x2D,0xB1,0x98,
0xE2,0x85,0x39,0x13,0xC3,0x03,0x67,0x3C,0xA9,0x36,0x36,0xB5,0xC1,0x22,0xC7,0x9F,0x4C,0x52,0xD3,0x5C,0xCD,0x52,0x90,0xA0,0xF9,0xED,0x11,0xD4,0x56,0x05,0x87,0x92,
0x27,0x53,0xC6,0x81,0x0B,0x37,0xE4,0xAE,0x9F,0x35,0x45,0xAA,0x42,0x9D,0x43,0xA3,0xD5,0x5A,0xAB,0x48,0x59,0x25,0xB6,0x92,0xDA,0x50,0xAB,0xA1,0x08,0xDE,0xDE,0x73,
0x7D,0x1F,0xC2,0x76,0xD8,0x00,0x31,0x54,0x75,0x9F,0x38,0x2F,0x35,0x7D,0xA9,0x04,0xCA,0x43,0x8D,0x3B,0x05,0xCA,0x52,0x62,0x2D,0x0B,0x37,0x28,0x4B,0x6B,0x2B,0x0A,
0x23,0x84,0x92,0xBE,0x37,0xED,0xF2,0xC3,0x3F,0xD9,0xA9,0x74,0xF8,0x39,0x1F,0x30,0x64,0x9A,0xAC,0xD6,0x1D,0x93,0x0D,0x83,0x3E,0x3B,0x8D,0x2C,0x9F,0x19,0xA5,0x02,
0x54,0x9B,0x7A,0x83,0x62,0x7F,0xEF,0xC2,0x6C,0x7A,0x2D,0x26,0x6D,0x41,0xE7,0x56,0x14,0x1D,0x71,0xC0,0xF0,0x74,0x91,0x65,0x2C,0x70,0x0E,0xF7,0x21,0x22,0xD6,0x16,
0xFF,0x00,0x65,0x7D,0x56,0xE6,0xAD,0x3D,0xBF,0x23,0x10,0x9A,0x0A,0xF2,0xC5,0xBC,0x4A,0xAE,0xA9,0x4F,0x10,0x6A,0xCE,0xBA,0x1C,0x69,0x87,0xD9,0x74,0x1B,0x1E,0x09,
0x07,0x5E,0xDF,0x3B,0x94,0xDB,0x16,0x66,0x4D,0xA9,0xBB,0x99,0x32,0x95,0x33,0x2F,0xBE,0x99,0x0B,0xA5,0xD2,0x96,0xE2,0x20,0xC3,0x65,0xCD,0x28,0x52,0x8A,0x8A,0xCA,
0x96,0x6C,0x4A,0x80,0x0A,0x36,0x1F,0xCA,0xAD,0xEF,0x7C,0x06,0xCC,0xB4,0x18,0xCD,0x57,0x98,0x88,0x86,0x8A,0x03,0x81,0x20,0xBA,0xE0,0xB1,0x51,0x2A,0xDC,0x9E,0x6C,
0x0D,0xCE,0xFB,0x77,0xDB,0x12,0x7A,0x7C,0xC5,0x46,0x95,0x94,0x1A,0x9F,0x1A,0xA0,0x22,0xC8,0x92,0xE9,0x4B,0x4D,0xA1,0x24,0xA5,0x09,0x4D,0xC0,0x02,0xC0,0xD8,0x5D,
0x4A,0xF9,0xDC,0x9E,0x4E,0xF2,0xE8,0xB4,0xAD,0x4C,0x43,0x60,0x9E,0x23,0x1E,0xA3,0x8F,0x88,0x96,0xBC,0x60,0x22,0x52,0xEA,0x54,0xB7,0x69,0x12,0x51,0x19,0xF4,0x38,
0xB6,0x9E,0x54,0xA4,0xA9,0x01,0x7A,0x4E,0x93,0xA7,0xC3,0xB8,0x07,0xE7,0xD8,0x7C,0xF0,0xB8,0x88,0x54,0xF9,0xAE,0xB7,0x10,0x29,0xF6,0x02,0x98,0x0F,0x3A,0xEE,0xB4,
0x59,0x3B,0xA6,0xE7,0x7B,0x58,0x73,0x7D,0xEF,0xE9,0x83,0x15,0x70,0xEC,0xAC,0xA2,0xD2,0xA5,0xCF,0x31,0x63,0x34,0xB0,0x5D,0x71,0x57,0x25,0x5B,0x6E,0x12,0x3B,0x9E,
0x2C,0x3F,0x5C,0x00,0xA4,0x56,0xA3,0x07,0xD2,0x8A,0xAC,0x06,0x64,0xD3,0xD0,0x90,0xC2,0xDA,0xD3,0x6D,0x41,0x5A,0x41,0x51,0x3C,0xEA,0xEE,0x3D,0x3B,0x77,0xC4,0xB7,
0x56,0x20,0x09,0x15,0x90,0x06,0x35,0x99,0xB2,0x44,0xEA,0x2C,0x5A,0x67,0xDD,0xF1,0xA6,0x4E,0x2C,0xAD,0x41,0x2F,0x3E,0xE4,0x70,0x16,0xF8,0xBF,0xA8,0x5D,0xC0,0xE3,
0xCB,0x63,0x7E,0x4F,0x6B,0x66,0x02,0x66,0x3A,0x64,0x48,0x33,0x24,0x53,0xD8,0x4A,0x92,0x95,0x9F,0x1A,0x33,0x88,0x37,0x4A,0xD0,0x77,0xDE,0xFB,0x83,0x6D,0xAD,0xEA,
0x0E,0x33,0x1E,0x65,0x81,0xE9,0x14,0xDA,0x80,0x90,0xE3,0x91,0x3B,0x46,0xB9,0x51,0x79,0x8C,0xBB,0x26,0x5B,0x12,0x9B,0x43,0x85,0x3A,0x12,0xE1,0xB0,0x4B,0x63,0xB9,
0xBF,0xA0,0xDC,0xE3,0xF3,0x9B,0xAB,0xD9,0x6E,0x2B,0xBD,0x4B,0x12,0x3E,0x2D,0xE9,0x8F,0xCF,0x96,0x02,0xD6,0x91,0xA8,0xA9,0x4A,0x36,0xB6,0xF8,0xED,0xFC,0xFB,0x55,
0x62,0x7C,0x75,0xD2,0x59,0x70,0x29,0x9D,0x3A,0x74,0xA9,0x41,0x29,0x57,0x3C,0x93,0xB0,0x1B,0x9D,0x8F,0x38,0xA4,0xF3,0x76,0x50,0xA5,0xBB,0x49,0x76,0x4D,0x42,0x32,
0x94,0xF3,0x88,0x5A,0x52,0x9D,0xDB,0x5B,0xF7,0x16,0x28,0x4A,0xAD,0x74,0xA0,0x8D,0x94,0xAE,0x48,0x3A,0x47,0x73,0x8E,0xFE,0xC3,0xD8,0x46,0xAA,0x6D,0xBC,0xC8,0xD4,
0xDC,0xFF,0x00,0x44,0x8B,0xF6,0x62,0xA9,0xC5,0x5C,0x9A,0x84,0x58,0x54,0xFB,0x40,0x6A,0x5C,0x20,0xA6,0xDC,0x16,0xB2,0x50,0xEA,0x7D,0x2F,0xB1,0x23,0xDC,0xE2,0x88,
0xE9,0x9F,0x4F,0x33,0x9D,0x67,0xAE,0x51,0x69,0xF4,0xAA,0xBF,0xDD,0x75,0x16,0x90,0x67,0xC7,0xA8,0x12,0x16,0x16,0x9B,0x79,0x5C,0x45,0xFF,0x00,0x38,0x37,0xF7,0xE4,
0xE0,0xAC,0x8A,0x76,0x73,0x9F,0x0D,0xCA,0x46,0x64,0x90,0xCB,0x99,0x78,0xB8,0x08,0xA7,0xD3,0xCA,0x5A,0x4B,0x76,0xFC,0xBA,0x6D,0xC8,0x16,0xE0,0x93,0x7E,0x4D,0xCE,
0xF8,0xB1,0x1B,0x6E,0xAC,0xFE,0x44,0xA6,0xA7,0x23,0xD3,0x9C,0x6E,0xB5,0x42,0x5A,0x57,0x4E,0x98,0xE3,0x89,0x53,0xC9,0x4F,0x0A,0x42,0x92,0xBE,0x52,0x41,0x3B,0x6E,
0x36,0xF6,0xC0,0xC5,0xAB,0x8D,0x80,0xC3,0x0F,0x8E,0x71,0xDE,0x22,0x51,0xB2,0x97,0xDA,0x09,0x1D,0x43,0xCE,0x74,0xB8,0x12,0xDF,0x72,0xA8,0x82,0x17,0x55,0x2E,0x2D,
0x03,0xE2,0xC1,0x55,0xD2,0x50,0x54,0x2D,0xE6,0x1B,0x8B,0x5B,0x6D,0xB1,0x60,0xE7,0x3C,0x9B,0x51,0xEA,0xB6,0x72,0xA1,0x75,0x07,0x2A,0xC4,0x6E,0x4B,0x8C,0x46,0x4C,
0x2A,0xED,0x19,0xC7,0xD2,0xD4,0x88,0x52,0x59,0xBE,0xC5,0x27,0x71,0x7B,0x6C,0x6D,0xDB,0x0E,0x94,0x1C,0xC5,0x51,0xCB,0xB9,0x9D,0x39,0xFB,0xA9,0xF5,0x98,0x14,0xB1,
0x22,0x02,0x20,0xCA,0x8A,0xC2,0x6E,0xA7,0xDE,0x42,0x89,0x49,0x40,0x4F,0xE6,0x36,0x3C,0x76,0xF9,0x60,0x63,0x59,0x23,0x2C,0xF5,0xAF,0xA8,0x93,0x33,0xA7,0x4A,0x33,
0x45,0x5B,0x2C,0xD6,0x98,0x5A,0x53,0x52,0x84,0xB0,0xB8,0xEA,0x94,0x8B,0x5B,0x58,0x09,0x52,0x4A,0x6E,0x36,0x3D,0x8D,0xBB,0x6F,0x7F,0x0A,0x8B,0x15,0x8F,0x99,0xA0,
0xE5,0x58,0x1F,0x12,0x80,0x7D,0x99,0x12,0xAB,0xF5,0x86,0x23,0x26,0xA5,0x19,0xC5,0xC8,0x2E,0x3F,0x4E,0x92,0x94,0x87,0x19,0x5E,0xE1,0x49,0x20,0xF6,0xBF,0xF1,0x0F,
0x4C,0x58,0xDD,0x23,0xAA,0xC9,0xC8,0x52,0x27,0x2C,0x3C,0xF2,0xE9,0x73,0xD8,0x5B,0x53,0xA2,0x36,0xAD,0x9C,0xF2,0x90,0x08,0x1F,0xE6,0xDF,0xB7,0xFA,0xE2,0x46,0x73,
0xE9,0x5E,0x7C,0xA7,0xE6,0x05,0x37,0x57,0xA1,0xD7,0x2B,0x69,0x8D,0x71,0x1A,0x7C,0x95,0x47,0x6D,0xDD,0x27,0xFE,0xA2,0x5C,0x25,0x47,0xD2,0xE3,0x12,0x68,0xD4,0xB7,
0x69,0xF4,0x35,0xB3,0x55,0x86,0xC4,0x39,0x4A,0x46,0xA1,0x1D,0x4F,0xA5,0xE5,0x81,0x7D,0xB5,0xAA,0xC0,0x1F,0x40,0x00,0xF5,0x37,0xDB,0x10,0xCD,0xED,0x43,0xF0,0x65,
0x7F,0x6D,0x6D,0x4C,0x19,0x58,0xD0,0xE5,0xD6,0x59,0xCC,0xAD,0x4E,0xA6,0xFC,0x55,0x39,0x5A,0x94,0xD2,0xF4,0x9F,0x32,0x9B,0x37,0xD9,0x56,0xE7,0x6B,0x7E,0x98,0xBE,
0x29,0x74,0xB2,0xD5,0x2D,0xB5,0x85,0x29,0x0B,0x4A,0x00,0x50,0x52,0x74,0xDE,0xFF,0x00,0xBE,0x06,0x51,0x32,0xB4,0x65,0xC6,0x12,0x1F,0x69,0x3A,0xDC,0x37,0x52,0x49,
0x17,0xFD,0x70,0xEA,0xC4,0x76,0x9A,0xCB,0xF2,0x16,0x1B,0x51,0x17,0xB6,0xFB,0x58,0x58,0x0E,0x3E,0x98,0xC6,0xBB,0x54,0xB7,0xB0,0x20,0x4F,0x74,0xF5,0x1A,0xC1,0x11,
0x07,0x31,0x53,0xBE,0xF1,0x53,0x08,0x16,0x70,0x92,0xA0,0xA5,0x0B,0xD9,0x00,0x8B,0xDF,0xD8,0xED,0xDF,0x13,0x28,0x89,0xA7,0x52,0xB2,0x84,0x67,0x2A,0x75,0x14,0x33,
0x19,0x08,0xF0,0xEC,0x82,0x52,0xB7,0x56,0x9D,0xEC,0x90,0x05,0xEC,0x38,0x2A,0xE3,0x6C,0x19,0x44,0x45,0xB3,0x4C,0x5C,0xC5,0x36,0x15,0xBE,0xFC,0xD9,0x3F,0xF3,0xFD,
0x30,0x9F,0x59,0xA8,0xA9,0xF8,0x0D,0x45,0x95,0x20,0x3E,0x12,0xA5,0x29,0x8B,0xA0,0x79,0x00,0xF2,0xE8,0x4F,0x1A,0x46,0x94,0xA0,0xDB,0x7B,0x9B,0x9E,0xF8,0x9C,0xF5,
0x82,0xB9,0x3D,0xB9,0x8B,0x7A,0x88,0x2C,0xA2,0x4D,0xAD,0xE6,0x09,0x23,0x2F,0xA1,0x6C,0x4A,0x09,0x43,0x8F,0x2D,0xBF,0x05,0x5A,0x55,0xB2,0x8E,0xC0,0x5D,0x37,0xB8,
0xE6,0xE0,0xE0,0x32,0x2A,0xB2,0x58,0x60,0x30,0xCA,0xD6,0x94,0x36,0x91,0xA0,0x92,0x7B,0xFA,0xDA,0xD8,0xD5,0x34,0xC4,0x35,0x38,0xEC,0x49,0x48,0x6D,0x94,0xD9,0xFF,
0x00,0x1F,0xC3,0xD7,0x65,0x29,0x09,0x00,0x5B,0xD8,0xDC,0xDB,0x1E,0x65,0xC7,0x96,0xF8,0x4B,0x07,0xE1,0xDA,0x5E,0xE9,0xBA,0x97,0x64,0x27,0x7B,0xDE,0xFB,0xED,0xDF,
0x01,0x73,0xBB,0x91,0x23,0xDE,0x80,0x39,0x71,0xD3,0xFF,0x00,0x24,0xF8,0xD5,0x37,0x64,0xD3,0x97,0xE2,0x3C,0x7E,0x30,0xA9,0xB2,0x16,0xB5,0x2A,0xC9,0x4E,0xB4,0x83,
0xEF,0x6E,0x6E,0x3D,0xF1,0x98,0x80,0x90,0x93,0x19,0x2D,0xC4,0x42,0x1F,0x75,0x04,0x94,0x3C,0x7F,0x29,0x1A,0xBB,0x26,0xD7,0xDF,0xDC,0xFD,0x31,0x98,0xC7,0x20,0x0C,
0x98,0x11,0xED,0xE0,0x16,0x59,0x6D,0x66,0x4C,0xE3,0x4B,0x6E,0x49,0x94,0xFB,0xE8,0x6D,0xB4,0x90,0x95,0x2A,0xD7,0xB0,0xBE,0xDA,0x41,0xEE,0x77,0x23,0xB9,0x02,0xFE,
0x51,0x8A,0xE6,0x5F,0x50,0x9F,0x9F,0x50,0x65,0xD9,0x91,0x93,0x36,0x9A,0xFB,0x8A,0x40,0x65,0xE2,0x49,0x0D,0xF1,0x64,0xAC,0x58,0x83,0x62,0x4F,0xA5,0xC9,0x36,0xBE,
0x14,0x6B,0xEE,0x4A,0x7D,0x96,0x5B,0xD6,0xE2,0xDB,0x0A,0xF2,0xA0,0xEF,0xA0,0x90,0x55,0xFB,0x83,0x7C,0x6A,0x7A,0x32,0x86,0x57,0xA3,0x16,0x54,0x35,0xAC,0x38,0xE6,
0x9F,0x6B,0x81,0x7B,0xFB,0xD8,0x8F,0xA6,0x2C,0x37,0xA8,0x58,0xE7,0x8E,0x23,0x0C,0x98,0xFD,0x31,0x1A,0xE6,0x8C,0xB0,0xEA,0x0A,0x22,0xCF,0x9B,0x4E,0x71,0x46,0xC1,
0x12,0x5A,0x12,0x19,0x48,0x3C,0x10,0xEA,0x2C,0xBB,0x1E,0x47,0xE1,0x93,0x63,0xCE,0x1F,0x59,0xA1,0x54,0xE0,0x9A,0x63,0x94,0x39,0x34,0xD9,0xAA,0xD0,0x90,0x14,0xD4,
0x94,0xA1,0xD7,0xEC,0xDA,0x75,0x69,0x6D,0xCD,0x2B,0x3B,0xEF,0xB2,0x4F,0xD3,0x15,0x33,0x24,0xCB,0xCB,0x30,0x64,0x90,0x4A,0xA3,0xA8,0xA1,0x76,0x06,0xE4,0x5A,0xE8,
0xBF,0xE8,0x47,0xC8,0x0C,0x3F,0x0C,0xAD,0x5B,0xAC,0x66,0xB6,0xD0,0xD4,0x09,0x2B,0x8D,0x77,0x07,0x8D,0xE0,0x9F,0x0D,0xB4,0x96,0xD2,0x8B,0x95,0x71,0xC2,0x3D,0x70,
0x2A,0xEE,0x6D,0xFB,0xB1,0x93,0xF4,0x99,0x4C,0xE0,0xF8,0xE2,0x2D,0xF5,0x75,0xDF,0xBC,0x9F,0x6E,0x89,0x58,0x6A,0x5D,0x1E,0x5B,0x2E,0xA5,0xF6,0xD4,0xE2,0x0A,0x55,
0xA9,0x26,0xC9,0x58,0x06,0xDB,0xEE,0x76,0xFF,0x00,0x6C,0x35,0x57,0x0B,0x79,0xCD,0x54,0xAC,0xC3,0x44,0xCD,0x93,0xB2,0xB6,0x62,0x83,0x1F,0xE1,0x9E,0xA8,0xC5,0x8C,
0xB0,0x99,0x0D,0x94,0x6A,0x1A,0x80,0xB5,0xC5,0xC5,0xC7,0x3C,0x91,0xCE,0x37,0x66,0x08,0xBD,0x55,0x93,0x16,0x7C,0x6A,0x7D,0x31,0x99,0x30,0x22,0x2C,0x06,0xA1,0xD4,
0x43,0x12,0xD8,0x91,0xA9,0x44,0xA8,0x94,0x3A,0x48,0x4F,0x6B,0x14,0xD8,0x8B,0x73,0x8D,0xF4,0x68,0xD5,0x95,0xE5,0x77,0x4D,0x67,0x23,0xCD,0xCB,0xB3,0x59,0x05,0x7E,
0x2D,0x32,0x42,0x64,0x30,0xAB,0x6F,0xE5,0x65,0xC7,0x0A,0xB9,0xFF,0x00,0xA9,0x61,0xD8,0x76,0xC7,0x41,0x56,0xE6,0x50,0xE8,0x79,0x8C,0x23,0x02,0x30,0xC2,0x29,0x1A,
0xF7,0x5C,0x92,0x1C,0xA2,0xBB,0x9D,0xB2,0xCE,0x68,0x8A,0xD5,0xCF,0xC5,0xC8,0x76,0xCE,0xB5,0xDB,0x4A,0xB4,0xD8,0x8F,0xAD,0xFE,0x78,0xD3,0x42,0xCB,0xF2,0x61,0x32,
0x3E,0xF1,0x99,0x19,0xE7,0x96,0x4A,0x9C,0x6A,0x0A,0x74,0xB6,0x95,0xFF,0x00,0x98,0x93,0x75,0x2C,0xFB,0xA8,0xDB,0xDB,0x07,0x73,0xFF,0x00,0x50,0xA1,0xD0,0x19,0x82,
0xAA,0x96,0x56,0x53,0xD5,0x15,0xC5,0x6C,0xBD,0x25,0xB8,0x4A,0x65,0xB9,0x0A,0x20,0x92,0x02,0x96,0x91,0x75,0x00,0x6F,0x6D,0xC6,0xFC,0xE1,0x6F,0x29,0xE6,0xCA,0x7E,
0x6A,0xA8,0x38,0x88,0x90,0x5F,0xA7,0x3E,0x92,0x35,0x47,0x90,0xB1,0x73,0xE8,0x6C,0x3E,0x98,0x8B,0xAD,0xAF,0x51,0xB8,0xBB,0x2E,0x07,0x99,0x6B,0x4B,0x65,0x61,0x40,
0x07,0x99,0x65,0xC6,0x2C,0x22,0x21,0xFE,0x3B,0x8D,0x3A,0x81,0xB1,0x3B,0x1E,0x3D,0xB1,0xB9,0x88,0xB2,0x27,0x31,0xF0,0xAA,0x59,0x42,0x4A,0xAD,0x6D,0xF8,0xE0,0x6F,
0xE9,0x81,0x15,0x55,0x39,0x4C,0xCB,0xCE,0x2F,0xC5,0x42,0x1C,0x2D,0x92,0xCB,0x80,0xD8,0x8B,0x83,0xBE,0x26,0x74,0xFA,0x7C,0xDA,0xA6,0x52,0x61,0xD9,0xEE,0xA5,0xC7,
0x12,0x0A,0x0B,0xA9,0x57,0xF8,0x96,0xDA,0xFB,0xF7,0x3E,0xD8,0x51,0x17,0x3C,0xC2,0xBB,0x62,0x12,0x9F,0x4E,0x6E,0x24,0x45,0x46,0x8E,0xB5,0x2D,0x2A,0x1A,0x48,0x26,
0xF6,0xFF,0x00,0x7C,0x21,0x54,0xE2,0x8A,0x28,0x9B,0x21,0xE8,0x82,0x44,0x14,0x38,0x96,0x65,0x25,0x57,0x0B,0x6D,0xA5,0xDB,0xF1,0x13,0xE8,0x42,0x90,0x9B,0x1F,0x51,
0x63,0xCE,0x2C,0x99,0xAE,0x47,0x4B,0x7A,0x16,0xE2,0x11,0xA8,0xEA,0xDC,0xEE,0x7D,0xF7,0xF7,0xC2,0x85,0x5E,0x5B,0xCC,0x66,0x08,0xF2,0x5A,0x63,0xC7,0x0A,0x6D,0x68,
0x71,0x95,0x10,0x52,0xFB,0x76,0x1A,0x92,0xAB,0xF6,0x3C,0x0F,0x72,0x31,0xE3,0xE1,0x46,0x4F,0x4E,0xF1,0x1D,0x5B,0x1F,0x6F,0x22,0x26,0x47,0x31,0x64,0x53,0x93,0x67,
0x0F,0x9B,0x74,0xAC,0x8D,0x94,0x42,0x88,0x1F,0x22,0x40,0xFD,0xBD,0xF1,0x09,0x4E,0x87,0x62,0x21,0x2B,0x49,0x36,0x25,0x44,0x93,0x72,0x4E,0xD8,0x74,0x6A,0x8B,0x49,
0x72,0xA3,0x2A,0x2C,0x74,0x91,0x15,0xD4,0x09,0x91,0x17,0x7D,0x20,0xB6,0xBB,0x02,0x3D,0x8A,0x56,0x94,0xED,0xFD,0xF0,0x12,0x15,0x39,0xA9,0x15,0x69,0x14,0x87,0x02,
0x1C,0x5A,0xA4,0x06,0xCB,0xA8,0x5F,0x99,0x07,0x70,0x6D,0x7B,0x02,0x2E,0x7B,0xE1,0x67,0xA9,0x81,0x18,0x9C,0xFB,0xBA,0xE3,0xAC,0x11,0x4D,0x6D,0xC7,0xAA,0x4C,0xBA,
0xD4,0x85,0x30,0xD2,0x5B,0x70,0x14,0x5A,0xD7,0x57,0x3C,0xFD,0x07,0xE9,0x8C,0xC1,0x88,0x94,0x79,0x32,0x1B,0xA7,0x88,0xF2,0x59,0x5A,0x08,0xD7,0xE0,0x95,0x04,0x29,
0xC2,0x76,0x36,0xD5,0x6B,0xDA,0xC7,0x8B,0xE3,0x31,0xA5,0xA5,0x8C,0x2D,0x1F,0x31,0xC4,0xD3,0x53,0xCD,0xD1,0x63,0xB9,0x4C,0x11,0x28,0x71,0xE5,0x38,0x23,0x87,0x2C,
0xEC,0x68,0xC5,0x2B,0x21,0x24,0x5C,0xA0,0x33,0x71,0xF2,0x4A,0xC7,0x7C,0x1B,0xA9,0xC8,0x95,0xF7,0xF3,0x31,0xD7,0x47,0xA2,0xD3,0x12,0xCA,0x92,0xDC,0x78,0x71,0xE9,
0x49,0x95,0x2D,0xE0,0x94,0x0B,0x94,0xB0,0xAB,0x84,0x82,0x6E,0xA0,0x16,0x51,0x70,0x76,0xBD,0xB0,0x32,0x26,0x60,0xCB,0xF0,0xEA,0x54,0x58,0xD4,0x2A,0x7B,0xCA,0x75,
0xD6,0x94,0xDF,0xC6,0xBC,0xAD,0x2B,0x1B,0x9B,0x80,0xA1,0x65,0x8E,0x76,0x52,0x0B,0x46,0xC6,0xCA,0x07,0x0A,0x92,0xF3,0x35,0x6A,0xB1,0x4D,0x30,0x1B,0x3E,0x12,0x5E,
0x5E,0x85,0xC5,0x86,0x8F,0x05,0xB7,0x75,0x90,0x40,0x58,0x4D,0x82,0xCD,0xC9,0x17,0x55,0xCF,0xBE,0x28,0x7B,0xAA,0xA0,0xEE,0x39,0x3F,0x41,0x0C,0x0E,0x54,0xE3,0xAC,
0xB6,0xA9,0xB9,0xD6,0xA9,0x10,0xB7,0x4C,0x34,0xFC,0xBF,0x45,0x69,0xD1,0xA5,0x4E,0x3A,0x86,0x1B,0x94,0x14,0x2E,0x47,0xE0,0xC5,0x42,0x54,0x8D,0xC0,0xBA,0x56,0x95,
0x6C,0x39,0xC4,0x85,0xF5,0x72,0x64,0xAA,0xC9,0xA6,0x8C,0xCE,0xF9,0x7A,0x43,0xAA,0xD2,0xBA,0x74,0x12,0x12,0x12,0x92,0x36,0x51,0x2E,0x37,0x7F,0x4B,0xE9,0x38,0xA7,
0xE9,0x14,0x9C,0xC0,0x9A,0xDC,0x47,0xD5,0x47,0x53,0x4D,0x23,0x50,0x4B,0xD2,0x2E,0xCB,0x43,0x63,0x73,0xAD,0x44,0x27,0xEB,0x7C,0x3C,0x50,0xE8,0x99,0x39,0x99,0xB0,
0xBE,0xF7,0xCC,0x0C,0x2E,0x4A,0x92,0x24,0x18,0xB4,0xD7,0xCA,0x90,0x4E,0xAB,0x9D,0x6E,0x24,0x28,0x0E,0xC3,0x7D,0xBD,0xF0,0x4A,0x35,0x37,0x31,0x3B,0x07,0x18,0xFC,
0xBF,0xC4,0x18,0x25,0x80,0x3F,0x58,0xCE,0x9C,0xD5,0x0A,0xB4,0x99,0xF1,0x6A,0x01,0x53,0x54,0x8D,0xD3,0xAD,0xC6,0xD4,0xA3,0xC1,0xB1,0x48,0x6D,0xCD,0x3B,0xF1,0x72,
0x4E,0x03,0x25,0xAC,0xD0,0xE5,0x55,0xE8,0x99,0x5B,0xA7,0xF5,0xB7,0x18,0x4A,0x35,0x2A,0x5B,0x8A,0x6D,0x86,0x13,0xEA,0x7C,0x40,0x00,0x36,0xF4,0x02,0xFE,0xD8,0x78,
0xA3,0x56,0x32,0x7D,0x29,0x3E,0x3E,0x53,0xCA,0x71,0xDB,0x7D,0x63,0xFF,0x00,0x7D,0x21,0x03,0x59,0x03,0xB9,0x04,0x92,0x7D,0x2E,0x48,0xD8,0x76,0xC0,0x9A,0xD5,0x2F,
0x30,0x67,0x8A,0x7A,0xE6,0x4F,0x97,0x53,0x79,0x95,0x2F,0x5C,0x3A,0x74,0x0D,0x29,0x2E,0xA4,0x1B,0x15,0xA1,0x6E,0x03,0xE1,0xA6,0xE0,0x02,0xB1,0x64,0xEF,0x74,0x95,
0x11,0x6C,0x5A,0xD1,0xBB,0x2B,0x61,0x9B,0xAF,0xFB,0xD6,0x0C,0x31,0xDE,0x44,0x47,0x39,0x8A,0x89,0x2D,0x0E,0x65,0xFC,0xFC,0xC4,0x4A,0xCC,0x66,0xD2,0xA6,0xDC,0x62,
0x9C,0x1B,0x7A,0x65,0x3C,0x71,0xA9,0xA7,0x42,0x82,0x8A,0x41,0xFE,0x12,0x92,0x7E,0x63,0x04,0x27,0xE5,0x64,0xD1,0xDC,0x46,0x65,0xE9,0x71,0x83,0x9A,0x60,0x30,0xC0,
0x43,0x90,0x65,0x14,0x89,0xCC,0xA8,0x5B,0x60,0xAB,0x5C,0x5A,0xFB,0x83,0xB8,0xC2,0xAD,0x57,0x2A,0x57,0x29,0x75,0x70,0xBA,0x1A,0x93,0x4D,0xD6,0xEA,0x59,0xD5,0x45,
0x51,0x52,0xD0,0xE2,0xCD,0xB4,0xAA,0x6A,0xCF,0x88,0xFA,0x8D,0x8E,0xA5,0x6A,0x0D,0x27,0x72,0x80,0xA0,0x14,0x94,0x91,0xA1,0xD2,0xA0,0xBA,0xEA,0x6A,0x52,0xA5,0x39,
0x97,0xAA,0x21,0x45,0xCA,0x6D,0x46,0x94,0x0A,0x97,0x21,0xBB,0x59,0x2E,0xCA,0x42,0x80,0x57,0x9B,0xC8,0xAB,0x10,0x35,0x03,0x70,0x91,0x7C,0x12,0xFD,0x30,0x7F,0xAC,
0x7D,0x2D,0x29,0xCE,0x61,0xEC,0xB9,0x2A,0x9B,0x9E,0xB3,0x5A,0x69,0x75,0x15,0x49,0xA5,0xCE,0x7B,0xCA,0xF5,0x3E,0x48,0x28,0x00,0x01,0xFC,0x09,0xFA,0xF2,0x30,0x17,
0x24,0x56,0x2A,0x34,0xDE,0xA6,0xE6,0x5C,0x9F,0x9A,0x5E,0x66,0x99,0x2A,0x2C,0xAB,0xC3,0x68,0x82,0x94,0x3C,0xC1,0x2A,0x01,0x49,0x3F,0xC5,0x6B,0x27,0x7F,0xE6,0x18,
0x6F,0x15,0x0A,0xCC,0x87,0x23,0xBF,0x5F,0xA6,0xE5,0xDC,0xC2,0xEC,0x5B,0x2D,0xB9,0xE5,0x2E,0x42,0x70,0xAB,0xF8,0x4A,0xAE,0x9B,0x13,0xB7,0x00,0x8C,0x29,0xF5,0xB7,
0xEE,0x9E,0xA6,0xB5,0x4C,0x10,0xA9,0x7F,0x07,0x56,0x8A,0xAF,0x34,0xB4,0xAB,0x60,0x2D,0xF9,0x45,0xAF,0x71,0x7F,0x7C,0x24,0x9A,0x4A,0xD1,0x58,0x58,0x71,0x08,0x75,
0x79,0x65,0x03,0xA4,0x35,0x5C,0xCC,0x49,0x84,0xFA,0xA3,0xD3,0x9C,0x62,0x54,0xAB,0xE9,0x42,0x14,0xF0,0x64,0x73,0xCE,0xA5,0xD8,0x7E,0xF8,0x54,0x7A,0x74,0x9A,0xC4,
0xB8,0xF5,0x2F,0x87,0x4C,0x59,0x6C,0x38,0xE2,0x7C,0x22,0xE3,0x65,0x3B,0x58,0xEC,0xA0,0xAB,0x10,0x42,0x4E,0x3C,0x51,0xBA,0x6E,0xF3,0x2C,0xC2,0x97,0x5F,0x75,0xD9,
0x31,0x18,0xD3,0xE2,0x32,0xE2,0x89,0xBE,0xF6,0x25,0x6A,0x04,0x6E,0x2E,0x3C,0xB7,0x06,0xD8,0x3B,0x53,0x85,0x4D,0xA4,0xD7,0xCB,0xD2,0x63,0x35,0x1A,0x94,0xE8,0x52,
0x92,0x86,0x92,0x14,0xA5,0x92,0x09,0x01,0xB4,0x8B,0x69,0xE6,0xDB,0x90,0x08,0x22,0xDB,0x8D,0xA6,0x6A,0xC2,0x6C,0x2A,0x07,0xEB,0x05,0xAC,0xBC,0x05,0xDA,0xA7,0x3F,
0xDA,0x4A,0xA7,0xD4,0xD5,0x50,0x05,0x82,0xB7,0x19,0x75,0x09,0x5F,0x84,0x37,0x0B,0x4D,0xB6,0x71,0xAF,0xD9,0x2A,0x1F,0x2F,0x7C,0x25,0x57,0x49,0xF8,0xE7,0xDC,0x61,
0x4A,0xF1,0x1E,0x3A,0xB6,0xF5,0xB7,0xF7,0xBE,0x37,0xFD,0xE5,0xF0,0x53,0x19,0x79,0xB9,0xB2,0x1E,0x09,0x75,0x2B,0x69,0x4E,0xAB,0xCC,0x52,0x41,0x1E,0x55,0x77,0x4D,
0x80,0x04,0x1D,0xC1,0xDA,0xFC,0xE2,0x14,0xDB,0x2D,0xE5,0x3A,0x0A,0x0B,0x48,0x25,0x45,0x27,0xD0,0xF1,0xBE,0x25,0x5E,0xE0,0x00,0x33,0x24,0xB1,0xF9,0x0C,0xC3,0x39,
0x66,0xBA,0xFD,0x1E,0x42,0x22,0xBE,0xDA,0x9F,0x84,0xE4,0x84,0xA1,0x48,0x5A,0x42,0x92,0x93,0x71,0x62,0x2F,0xB5,0xC1,0x24,0x8F,0xDB,0x19,0x81,0x71,0x4C,0x87,0x58,
0x2A,0x69,0x2C,0x29,0x1A,0x89,0xD2,0xA4,0x02,0x9B,0x03,0xFB,0x7C,0xC6,0x33,0x07,0xAA,0xC2,0xAA,0x00,0x30,0xD5,0x07,0x03,0x28,0xBC,0x41,0xF1,0x7C,0x33,0x2A,0x14,
0xD3,0x29,0xA6,0xDB,0x62,0x2B,0xF2,0x4A,0xF5,0x6A,0x20,0x86,0x8A,0xC8,0x09,0x1B,0x9B,0x14,0x9D,0xBD,0xB0,0x31,0xBA,0xEA,0x60,0x26,0x64,0x4A,0x43,0x25,0xA5,0xB8,
0x4A,0x44,0xB5,0x1F,0xC6,0x25,0x24,0x90,0x52,0x46,0xCD,0xEC,0x0E,0xC9,0xDC,0x5E,0xDA,0x8E,0x23,0xC2,0x5A,0x15,0x40,0xAB,0x38,0xA1,0xA4,0xB7,0x19,0x41,0x00,0x76,
0x2B,0x21,0x1F,0xBE,0xB3,0x80,0xAC,0x2B,0xC2,0x8E,0x5C,0x00,0xDF,0x92,0x46,0x0B,0x5E,0x14,0x12,0x23,0x7B,0x87,0x5F,0x31,0xF9,0xD8,0x94,0xF9,0x68,0xA2,0x66,0xBA,
0x23,0x73,0x03,0x73,0x12,0xE3,0x32,0xE3,0x4D,0x7B,0xE2,0x14,0xCC,0x84,0x22,0xE7,0xCE,0x40,0xBA,0x56,0x95,0x25,0x42,0xE2,0xF7,0xD4,0x37,0xB6,0x23,0x51,0x61,0x49,
0x67,0x3C,0xB5,0x4E,0x92,0xA4,0xB6,0xEA,0x54,0x83,0xE0,0x6E,0xA5,0x2C,0xAF,0x52,0x92,0x3C,0xA3,0x91,0x7D,0xEF,0x6B,0x58,0xF7,0xC6,0xDC,0x82,0xE2,0x54,0x2A,0x14,
0x77,0x89,0x52,0x5F,0x52,0x5E,0x8C,0x00,0xB9,0xF1,0x90,0x85,0x80,0x00,0xF7,0x42,0x96,0x3F,0x4C,0x31,0x50,0x21,0x31,0x95,0x33,0x4B,0x2C,0xC5,0x51,0x95,0x99,0xE6,
0x21,0x05,0xB5,0x20,0x6A,0xFB,0xB9,0x05,0xBF,0x2E,0x93,0xDD,0xD5,0x5E,0xE0,0x8F,0xC8,0x0A,0x48,0x25,0x4A,0x05,0x26,0xA9,0x77,0xB3,0x37,0x69,0xEA,0x15,0x50,0x07,
0x93,0x2C,0x25,0x45,0x34,0x1A,0x2C,0x5A,0x42,0x62,0xAA,0x65,0x76,0x5A,0x94,0xD0,0x84,0x95,0x24,0x88,0xC8,0xDE,0xE5,0xC2,0x41,0x48,0x50,0x1C,0xA4,0x83,0x6E,0xF6,
0xFC,0xC8,0x25,0x5D,0xCD,0x11,0x32,0xE4,0x74,0x51,0xDC,0x71,0xE7,0xDF,0x4A,0x42,0x65,0xF8,0x0E,0x29,0x4A,0x75,0x64,0x6E,0x84,0xA9,0x64,0x90,0x8D,0xEC,0x5C,0x57,
0x99,0x5C,0x0B,0x80,0x40,0x4C,0x8D,0x99,0xA9,0xF9,0x5E,0x8F,0x29,0x30,0x58,0x32,0xE6,0xC1,0x49,0x42,0x9E,0x69,0xCD,0x69,0x6D,0x60,0x85,0x69,0xF5,0x21,0x37,0x49,
0x2A,0xE0,0xAA,0xD6,0xB8,0x49,0x25,0x46,0x81,0x99,0xA2,0xC9,0xCC,0x6D,0x89,0x0C,0x2D,0xE5,0xA9,0x2A,0x97,0x27,0x54,0x8F,0xC8,0x94,0xA4,0xAD,0x4A,0xB9,0x1B,0xB8,
0xAB,0x1B,0x5F,0xB9,0x04,0xF6,0xBB,0xFE,0xF1,0xAC,0x8A,0xEB,0x1C,0xFF,0x00,0x02,0x2E,0xA9,0x96,0x33,0xA1,0x9A,0xAA,0xD1,0x93,0x4B,0x65,0xAA,0xDB,0x51,0x98,0x7D,
0xD6,0x0A,0xFC,0x0D,0x23,0xF0,0x10,0xE7,0x94,0xDD,0x3C,0xDD,0x56,0xB1,0xBF,0x20,0x5A,0xF6,0x2A,0xD3,0x55,0x67,0xDA,0x6C,0x6A,0xD5,0x71,0x4B,0xA7,0xBF,0x1E,0x2B,
0x4D,0xF9,0x96,0x9D,0x00,0xA9,0x56,0x26,0xC4,0xDF,0xD0,0x92,0x7E,0x6A,0x27,0xBE,0x17,0xE5,0xD5,0x25,0x55,0xEB,0xCC,0x3B,0x21,0x87,0xD2,0xBF,0x1F,0xC7,0x90,0xAF,
0x88,0x48,0x42,0x02,0x49,0xB0,0xB6,0x9B,0x04,0x04,0xA4,0x80,0x38,0x48,0xF9,0xE3,0x4A,0xEA,0x54,0xA6,0xAB,0x2E,0xA6,0x43,0xCA,0x6C,0xC8,0x29,0x0E,0x2C,0x9F,0x15,
0x01,0x36,0xD8,0xDD,0x23,0x63,0xB0,0x57,0x7F,0x9E,0xD8,0x29,0xD7,0xB1,0x04,0x01,0xC7,0x99,0xE5,0x6A,0xC4,0x9E,0x78,0x13,0xE3,0xD1,0x17,0x12,0x10,0xF8,0xBA,0xAB,
0xA9,0x6F,0xF2,0x0D,0x3E,0x5D,0x7E,0xC0,0x0F,0x7C,0x65,0x29,0xB7,0xAA,0xF5,0x46,0xE2,0xC1,0x29,0x61,0x94,0x20,0xEB,0x79,0xD1,0xAB,0xC2,0x48,0xE5,0x77,0xE0,0x1F,
0x73,0xB0,0xE6,0xE3,0x91,0xB6,0x15,0x26,0x27,0xC6,0x97,0xD7,0x54,0x69,0x60,0x59,0xDF,0x11,0xE4,0xDA,0x3C,0x64,0x12,0x2C,0xB7,0x37,0xB5,0xCF,0x60,0x01,0x27,0x8B,
0x73,0x87,0xB8,0xCB,0xC8,0x28,0xA3,0xBB,0x0A,0x55,0x6A,0x3A,0x21,0x92,0x95,0xBA,0xD3,0x7A,0xCA,0x9E,0x50,0x02,0xCA,0x25,0x1F,0x98,0xFF,0x00,0x22,0x4D,0x93,0xEE,
0x45,0xF0,0x91,0x67,0xBC,0xED,0x06,0x17,0x39,0x1C,0x4D,0x71,0xAB,0xD4,0xF8,0xB0,0xA4,0x53,0xE8,0xCB,0xF8,0xC7,0x9B,0x57,0x83,0x22,0x59,0x46,0xBD,0x17,0x3B,0x2B,
0x41,0xFC,0xE9,0xF2,0x80,0x4E,0xF6,0xB6,0xC4,0x03,0x7C,0x29,0x66,0x56,0x0D,0x52,0x19,0x71,0x9F,0x19,0xC9,0x31,0xC1,0x71,0xC4,0xA5,0xC2,0xE1,0xB6,0xDA,0xB4,0xA9,
0x5B,0x91,0xB2,0x4D,0x8E,0xE0,0x13,0xCE,0x37,0x54,0xDC,0x8B,0x1E,0xB1,0x35,0xDC,0xBD,0x12,0x1A,0x9A,0x69,0xD4,0xB8,0x1C,0x4A,0xD6,0x54,0xA1,0x65,0x1B,0x28,0x6A,
0xDB,0x93,0xF5,0xC4,0xFA,0xC4,0xD4,0xC3,0xA5,0xC3,0xAB,0xB0,0xFD,0x39,0xA0,0xE2,0x9B,0x75,0x51,0xD9,0x8E,0xA2,0xA4,0x05,0x5C,0x1B,0xAA,0xF6,0x23,0xCC,0xAD,0xAD,
0xB1,0xB8,0xED,0x73,0x9B,0x14,0x10,0x54,0xF6,0x98,0xF6,0xF2,0xBC,0xF5,0x95,0x84,0xB9,0x2B,0x01,0x28,0xE1,0xA4,0xAF,0x5B,0x69,0x26,0xE4,0x5F,0x9F,0xA9,0xE7,0xB7,
0x38,0x2B,0x09,0xA5,0xD4,0xA7,0xA1,0x98,0xAE,0x34,0xB6,0xAC,0x94,0xB8,0x85,0x0B,0x85,0x6A,0xB0,0x1B,0xFC,0xCD,0x8F,0xCF,0x03,0xAA,0xC2,0x23,0x35,0xA7,0x23,0x36,
0x95,0x25,0x17,0xD6,0x84,0xFB,0x5E,0xE3,0xE9,0x6C,0x6A,0x81,0x29,0x48,0xCC,0x6B,0x69,0x95,0xAD,0xA4,0xBC,0x12,0x14,0xA6,0x94,0x53,0xB1,0x00,0x93,0x88,0x2C,0x06,
0x70,0xD1,0x4E,0xBC,0x18,0x69,0x55,0x07,0x29,0xB4,0xB6,0x60,0xC5,0x28,0x53,0x81,0x47,0xC6,0x55,0xEE,0x11,0xE6,0xB8,0x40,0x1F,0x5D,0xF1,0x98,0xFA,0xED,0x2A,0x2B,
0x0D,0x19,0x0C,0xA2,0x4C,0x98,0xE8,0x58,0xD2,0xEC,0x75,0x27,0x4E,0x90,0xBB,0x2B,0x5A,0x4E,0xE7,0xB7,0x1C,0x1F,0x98,0xC6,0x61,0xB0,0x84,0x46,0x12,0xD2,0x46,0x3A,
0x62,0x24,0x16,0xDC,0x46,0x57,0xAB,0xBC,0x91,0xA4,0x6B,0x69,0xB4,0x94,0x9B,0xED,0xA8,0x2B,0xFF,0x00,0xE3,0x10,0x58,0x4A,0x5F,0x86,0xDA,0x50,0xB6,0xD2,0x54,0x52,
0x9F,0x3A,0x82,0x47,0x04,0xF7,0xF9,0x60,0xB0,0xA5,0xCA,0x14,0xDA,0x8C,0x14,0xB6,0xE0,0x53,0xEE,0x38,0x96,0xD0,0xAF,0xE2,0x2D,0x8E,0x47,0xFF,0x00,0x65,0xDB,0xE9,
0x85,0xF6,0x5B,0xD3,0x97,0xD0,0x5C,0xD2,0x80,0xA7,0xC8,0x4B,0x8B,0xE1,0x21,0x3D,0xFE,0x97,0x38,0x68,0xA4,0x3D,0xA8,0x54,0x02,0x65,0x97,0xD3,0xA6,0x4C,0x1A,0x9B,
0x15,0x5A,0x84,0x74,0x69,0x6C,0x29,0xB4,0xB6,0xE0,0xF3,0x3E,0xEA,0x50,0x6C,0xD8,0x04,0xDE,0xDA,0x74,0xA9,0x44,0x76,0xF2,0xDC,0x15,0x0C,0x1A,0x8E,0xB6,0xA9,0xD9,
0x97,0x32,0xCA,0x6E,0x43,0x8E,0x56,0x6E,0xE1,0x71,0xC7,0x2C,0x4B,0x17,0x41,0xF2,0x92,0x3F,0xF9,0x4F,0x2A,0xFF,0x00,0x2F,0x17,0x2A,0x27,0x4A,0xED,0x1E,0xA8,0xB6,
0xAB,0x31,0x60,0xD3,0xF4,0x26,0x2C,0x56,0x97,0xF0,0xEA,0x58,0x1A,0xC5,0xD0,0xAD,0x4E,0x5C,0xEE,0x16,0xA2,0x01,0x24,0x6E,0x05,0x80,0x36,0x48,0xB6,0xF8,0x25,0x4D,
0xE6,0xAA,0xE5,0x92,0x4A,0x5C,0x94,0xF1,0xD0,0x08,0x48,0x3A,0x46,0x9B,0x5C,0xFB,0x9B,0x7D,0x3D,0xF0,0x55,0x60,0x89,0x85,0x9B,0x65,0xCA,0x29,0x82,0x6B,0xAD,0x4B,
0xFC,0x1A,0x43,0x0E,0xF8,0x3F,0x87,0xE3,0x2E,0xE9,0xDD,0xD5,0x28,0x70,0x0F,0x04,0x0B,0x11,0x71,0x89,0x54,0x7A,0x62,0x20,0xC4,0xA8,0xD3,0x9A,0x42,0x15,0x39,0xC6,
0x52,0xDA,0x94,0xB2,0x14,0x45,0x96,0x1C,0x2A,0x59,0xBD,0x80,0x05,0xBB,0x11,0xB7,0x27,0xDF,0x11,0x63,0x54,0xE7,0xAB,0x33,0x06,0x1D,0x6D,0x01,0x89,0x6E,0x05,0x38,
0xD4,0x96,0xFC,0x46,0x92,0x85,0x24,0x12,0xA4,0x8B,0xFF,0x00,0x2D,0xEE,0x0D,0xC6,0xFC,0x58,0xE1,0x89,0x11,0x22,0x54,0x21,0x98,0x34,0xDA,0x8A,0x69,0xEF,0x38,0x4A,
0xFC,0x27,0x14,0x4B,0x64,0x9B,0x6D,0xAB,0x73,0xC5,0xCD,0xCD,0xF6,0xE4,0x80,0x2F,0x8D,0x72,0x3E,0x50,0xAD,0x4E,0x17,0x89,0xF6,0x89,0x32,0x25,0x44,0xA9,0x11,0x13,
0xA4,0x32,0x09,0x71,0x6B,0xD9,0x2F,0x1F,0xC8,0x02,0x6F,0xD8,0xFB,0x9E,0xF7,0xEF,0xB4,0x28,0x2D,0xB1,0x26,0xB6,0x5E,0xA9,0x4D,0x54,0x68,0x2C,0x05,0x87,0x56,0x10,
0x15,0xA9,0x64,0x8E,0xC4,0x8B,0xF2,0x05,0x87,0x1C,0x8E,0x70,0x6A,0x15,0x36,0x99,0x4C,0x2D,0x53,0xE6,0x78,0x81,0xD5,0x24,0x10,0xE2,0x9B,0xD0,0x97,0x49,0x48,0x3E,
0x51,0x62,0x95,0xDB,0x8D,0xC8,0x1A,0x89,0x16,0x55,0xF6,0x92,0x9A,0x1F,0xDE,0xB2,0x54,0xF2,0xD0,0xEC,0xF6,0x14,0x0F,0xFE,0xA0,0x28,0x32,0x84,0x04,0xED,0x72,0x4D,
0xF4,0x01,0xBD,0x81,0x16,0x1B,0xDB,0x9C,0x6B,0xFE,0x50,0x14,0xF0,0x20,0xB6,0xA6,0xEC,0x31,0xE2,0x79,0x99,0x0A,0x8D,0x54,0xA6,0x44,0xA6,0x46,0xAB,0xB6,0xDC,0x6D,
0xDC,0x6D,0x0A,0xD4,0x94,0xE9,0xDA,0xEA,0x71,0x44,0x72,0x37,0xDF,0xB0,0x26,0xDB,0x62,0x0B,0x79,0x4E,0x11,0x75,0xB6,0xA1,0x09,0x4E,0x5D,0x25,0x2A,0x7E,0x3A,0x02,
0x93,0xB1,0x3C,0x90,0x4E,0xE0,0x5A,0xD6,0xD8,0xDF,0x13,0xE3,0xD4,0x29,0x10,0xDD,0x7D,0x34,0x48,0x69,0x9F,0x2D,0x95,0x80,0x5E,0x7E,0xFE,0x12,0x0F,0x1F,0x86,0x08,
0xF3,0xF2,0x45,0xD5,0x6F,0xFB,0x7B,0xE2,0x36,0x61,0x7D,0xF9,0x90,0x8C,0xD6,0xE4,0xAC,0xA4,0xD8,0x84,0x2D,0xC5,0x5D,0xAF,0x60,0x9B,0xEC,0x01,0xB5,0xB6,0xB6,0x3D,
0xC6,0xC2,0x14,0x4F,0x05,0x98,0x6F,0x6F,0xA0,0x91,0xD2,0xF3,0x59,0x7F,0x31,0x25,0xDF,0xBA,0x2A,0xB3,0xDB,0x2D,0x24,0xA4,0xAD,0x6D,0xB0,0xCA,0x94,0x94,0x94,0x85,
0x10,0x55,0xB9,0xBA,0x78,0xBF,0x7C,0x46,0x45,0x66,0xB5,0x29,0xA9,0x46,0x42,0x8B,0x6C,0xC8,0x0E,0x27,0xC1,0x00,0x69,0x21,0x44,0x9B,0x03,0x7B,0x5C,0x7B,0x5F,0x7F,
0x9E,0x31,0xDA,0x80,0xAD,0xD0,0x51,0x4D,0xAF,0xB5,0x05,0x94,0x02,0x52,0xDB,0x8A,0x6D,0x2B,0xF1,0x3D,0x48,0x57,0x20,0x82,0x06,0xC4,0x9E,0x4E,0xDC,0x61,0x7D,0x14,
0xFA,0x44,0x15,0xAC,0xC2,0x93,0x29,0xC7,0x52,0xA2,0x3F,0x00,0x15,0x21,0x5B,0x6D,0xB0,0xD8,0x63,0x76,0xA8,0x61,0x91,0xC1,0x84,0x75,0x5D,0xB8,0x1D,0x67,0x9A,0xF4,
0x4A,0x9C,0x79,0x11,0xA6,0xCF,0x78,0x3D,0x70,0x94,0x21,0xC1,0xDD,0x25,0x20,0xA4,0x7D,0x06,0x23,0x87,0x63,0xB5,0x50,0x89,0xE1,0xEA,0x0F,0x12,0x54,0xAB,0xFE,0x83,
0x1A,0x6A,0x0E,0x3E,0x56,0xEA,0x14,0xE4,0x85,0x2B,0x52,0x17,0xE1,0x29,0x67,0x48,0x23,0xFC,0xA3,0xF7,0xF6,0xBE,0x35,0x3A,0x7C,0x45,0xA5,0xF4,0x1B,0x29,0x2A,0xB7,
0xA7,0x06,0xDF,0xE9,0x88,0x3A,0xA5,0xC3,0x49,0xB7,0x28,0xDD,0xC4,0x77,0xCB,0x89,0x96,0xB8,0xCE,0x53,0xD4,0xC9,0x6D,0x32,0xA4,0x8F,0x02,0x51,0x48,0x3E,0x02,0xCA,
0x93,0xE7,0x49,0x3C,0x70,0x7E,0x78,0xCC,0x08,0xA7,0x38,0x2E,0xB5,0x29,0x4E,0x5B,0x48,0x70,0x29,0x27,0x70,0xA1,0x6F,0xDF,0x19,0x86,0xAA,0xBF,0x6A,0xED,0x30,0x4E,
0x76,0x31,0x13,0xFF,0xD9,};

View File

@ -0,0 +1,284 @@
// We need this header file to use FLASH as storage with PROGMEM directive
#include <pgmspace.h>
const uint8_t Baboon[] PROGMEM = {
0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x00,0x48,0x00,0x48,0x00,0x00,0xFF,0xDB,0x00,0x43,0x00,0x04,0x03,0x03,0x03,0x03,0x02,0x04,
0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x0A,0x06,0x06,0x05,0x05,0x06,0x0C,0x08,0x09,0x07,0x0A,0x0E,0x0C,0x0F,0x0E,0x0E,0x0C,0x0D,0x0D,0x0F,0x11,0x16,0x13,0x0F,
0x10,0x15,0x11,0x0D,0x0D,0x13,0x1A,0x13,0x15,0x17,0x18,0x19,0x19,0x19,0x0F,0x12,0x1B,0x1D,0x1B,0x18,0x1D,0x16,0x18,0x19,0x18,0xFF,0xDB,0x00,0x43,0x01,0x04,0x04,
0x04,0x06,0x05,0x06,0x0B,0x06,0x06,0x0B,0x18,0x10,0x0D,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xC0,
0x00,0x11,0x08,0x00,0x78,0x00,0xA0,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xFF,0xC4,0x00,0x1C,0x00,0x00,0x03,0x00,0x03,0x01,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x07,0x00,0x03,0x04,0x01,0x02,0x08,0xFF,0xC4,0x00,0x38,0x10,0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x05,0x03,0x03,0x03,0x04,
0x03,0x01,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x11,0x00,0x12,0x21,0x06,0x31,0x13,0x22,0x41,0x51,0x07,0x14,0x32,0x61,0x81,0x71,0x91,0xA1,0x15,0x23,0x42,0x52,0xD1,
0xF0,0x24,0xB1,0xC1,0xE1,0x33,0x43,0x72,0xF1,0xFF,0xC4,0x00,0x1B,0x01,0x00,0x02,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,
0x03,0x04,0x07,0x02,0x08,0x00,0xFF,0xC4,0x00,0x36,0x11,0x00,0x01,0x03,0x02,0x04,0x04,0x03,0x05,0x07,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x04,
0x11,0x05,0x12,0x21,0x41,0x06,0x22,0x31,0x61,0x13,0x51,0xB1,0x14,0x32,0x71,0x81,0xC1,0x15,0x23,0x33,0x34,0x62,0xA1,0xF0,0x07,0x35,0x42,0x52,0xB2,0xF1,0xFF,0xDA,
0x00,0x0C,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3F,0x00,0xD7,0x7B,0xA8,0xB1,0xD3,0xDC,0xE6,0x80,0xDD,0x67,0xAC,0x86,0x80,0x4A,0xAA,0xE6,0x47,0x99,0x61,0x24,
0x83,0x20,0xD8,0xE3,0x95,0x8F,0x7B,0x71,0xCE,0xDD,0xA0,0x83,0xE5,0xE3,0xCA,0x6A,0xEA,0xCB,0x47,0x47,0xD4,0xC9,0x35,0x40,0xB9,0xAF,0xCD,0x63,0xC6,0x83,0xCF,0x2F,
0x8A,0x63,0x8C,0x15,0x55,0x2B,0xB8,0x12,0xF8,0x61,0x93,0x86,0xDF,0xF5,0x03,0x80,0x12,0x6D,0x77,0x39,0x2A,0x52,0x78,0x69,0x92,0x9A,0x69,0xAA,0xA4,0x66,0xA9,0xA6,
0xBA,0x4E,0x23,0x77,0x56,0x4F,0x33,0x00,0xBC,0xE7,0x70,0x00,0xAA,0xA8,0x20,0x92,0x1B,0x2A,0x48,0xD0,0xE8,0x6E,0x36,0x8B,0x55,0xDA,0x9E,0xB6,0xA6,0x2F,0x1B,0x60,
0xDB,0x07,0x89,0x29,0x2A,0xBC,0x28,0xDA,0x63,0xDC,0x5F,0x6E,0x0A,0x92,0x0E,0x33,0x86,0xC6,0x70,0x72,0x06,0x9E,0x30,0x1D,0xCE,0xAB,0xBE,0x23,0x97,0x45,0x4E,0xBA,
0x3C,0x30,0xD8,0x27,0xB6,0x49,0xD4,0x34,0x75,0x34,0xEB,0x20,0xF0,0xE0,0x60,0xB1,0x3C,0x65,0x70,0x42,0x63,0xB9,0x3B,0xD8,0x8C,0x2F,0xEC,0x07,0x60,0xB5,0x53,0x52,
0x4D,0x53,0x55,0x4B,0x05,0xBF,0xE6,0xEA,0xA4,0x95,0xAA,0x43,0x2D,0x3A,0xC7,0x4F,0xB8,0xAB,0x80,0x14,0x12,0x4F,0xF8,0x76,0x03,0x20,0xAA,0xFB,0x1D,0x26,0x4D,0xD5,
0xF5,0x52,0x4B,0x3B,0x3D,0x57,0xCD,0x06,0x98,0xD4,0x23,0x95,0x08,0x44,0x83,0x3E,0x51,0x8E,0x70,0x49,0x27,0x27,0x3E,0x98,0xEC,0x74,0x45,0xFA,0xF7,0xCB,0xE2,0x8F,
0x16,0x1A,0x69,0x0F,0xF7,0x0C,0x0A,0x21,0x04,0xA8,0x62,0x46,0x46,0x08,0x25,0xDB,0x76,0x70,0x39,0x23,0x1E,0xBA,0x32,0xC7,0xC6,0x05,0xEF,0x65,0x4C,0xD3,0xCA,0x08,
0x24,0x5D,0x77,0x5C,0x2E,0xB7,0x89,0x20,0x4B,0x33,0x40,0x90,0x9A,0xDD,0xF1,0x55,0x6D,0xA9,0x59,0xC0,0x50,0x08,0x58,0x9D,0x58,0xA8,0x49,0x54,0x01,0x83,0xD8,0x64,
0x60,0x83,0x9D,0x0F,0xB2,0x75,0x4D,0xCA,0xD9,0x4B,0x5B,0x0D,0xCE,0xB1,0x24,0x59,0x0A,0x24,0x8A,0xB7,0x05,0xA9,0xDD,0xB4,0x02,0x46,0x40,0x2C,0x0F,0x1D,0xF2,0x47,
0x38,0x39,0xD0,0xA1,0xD7,0x72,0xD4,0xDE,0x29,0xAB,0x2B,0x2A,0x4C,0x72,0xC6,0xC8,0xB2,0x41,0x32,0x89,0xE1,0x2A,0xA0,0xE1,0xB1,0xEB,0xB4,0x93,0x80,0xDB,0xBD,0xCF,
0xBE,0xB5,0x37,0x50,0xD1,0xCF,0x05,0x67,0xF4,0xD8,0xA8,0xAA,0x25,0x24,0x3C,0x53,0x55,0xC6,0x5A,0x58,0x8F,0x00,0x8C,0x9E,0x0E,0x42,0xE3,0x91,0x8E,0xFA,0xE2,0xEC,
0x6E,0xB7,0x53,0x06,0x3C,0xB7,0x28,0x1A,0x22,0x35,0xA3,0xA9,0xFA,0x9E,0x96,0x34,0x6A,0x34,0x7A,0x70,0xDB,0xD9,0xE6,0x02,0x41,0x1B,0xF8,0x71,0xA9,0xC3,0x46,0x32,
0x54,0xE1,0x78,0x19,0xEF,0xCF,0x6D,0x79,0x59,0x6D,0x5B,0x15,0x19,0x6A,0xD5,0x69,0xA7,0x9E,0x75,0x6A,0x86,0x88,0x33,0xD3,0x37,0x94,0x91,0xB3,0x00,0x15,0xC0,0x2A,
0xDB,0x70,0x38,0x03,0x1C,0x63,0x4B,0xB6,0xAE,0xA8,0xAD,0xB6,0x53,0xB4,0x54,0x75,0x12,0xC7,0x02,0x82,0x66,0x05,0x42,0x82,0x4E,0x46,0x71,0xDF,0x38,0xC7,0x9B,0x82,
0x31,0xC1,0xD3,0x75,0x83,0xAC,0xE1,0x9D,0x60,0xA0,0x5B,0x75,0x3C,0x71,0xC8,0x36,0x3C,0xAD,0x89,0x3C,0x68,0xF3,0xC2,0x36,0x76,0x90,0x3B,0x00,0x46,0x48,0x04,0x8F,
0x30,0x1A,0x92,0x33,0x1B,0xC7,0xBD,0x62,0xBB,0x96,0x39,0x19,0xFE,0x3C,0xA8,0x7B,0xDC,0xBA,0x95,0x7A,0x85,0x24,0xFE,0xDD,0x22,0xD7,0x2A,0x4E,0x4A,0x40,0x8A,0xA5,
0xB2,0xD8,0xDD,0x9C,0x9C,0xE4,0x95,0xC9,0xE7,0x1F,0xC0,0xF1,0x43,0x7B,0x85,0x4A,0x5D,0x2D,0x9E,0x34,0xF5,0x21,0xE1,0x81,0xD0,0x7F,0x6C,0xB2,0xB7,0x86,0x4A,0xB6,
0xE0,0x30,0x01,0x62,0x4E,0x3B,0x83,0xEC,0x4E,0xAB,0xD0,0xDD,0xBA,0x7A,0x82,0xCB,0x4D,0xFD,0x4A,0xD1,0x09,0xA7,0x55,0xD9,0x99,0xC2,0xC9,0xE2,0x12,0xAD,0x89,0x16,
0x56,0xC0,0x3D,0xF2,0x40,0x53,0xC9,0xE7,0xB3,0x69,0x76,0xF9,0x35,0xAE,0xE5,0x6E,0xA3,0x9A,0xC7,0x7D,0x8C,0xC1,0x0C,0x6E,0x22,0xB2,0xAC,0x67,0xC6,0x63,0x92,0xAF,
0x9C,0x36,0xEF,0x32,0x8D,0xC4,0x91,0xFF,0x00,0xD8,0x40,0xD4,0xB2,0x53,0x46,0x05,0xF3,0x2A,0xBE,0x3B,0x9C,0x40,0x0D,0x16,0x49,0x33,0xA7,0x55,0x86,0xA9,0xA6,0xBB,
0x5B,0x5F,0xC3,0x08,0x57,0xE5,0xDC,0x6D,0xDE,0xA1,0x83,0xF2,0x46,0x01,0x21,0xC0,0x3C,0x1F,0xFD,0xBB,0x45,0xD0,0xF7,0x7A,0x9A,0x48,0x20,0xA7,0xB5,0xCD,0x04,0xCF,
0x39,0x32,0xCF,0x51,0x29,0x94,0x49,0x8C,0x86,0x0C,0x30,0x30,0x17,0x2D,0xEA,0x32,0x40,0xE7,0x9C,0xEB,0xBE,0xDD,0xD7,0xD4,0x17,0x4A,0xCC,0xDB,0xA9,0x67,0x6F,0x95,
0x88,0xA5,0x42,0x08,0x84,0x8E,0xC7,0x39,0xC1,0xC8,0x52,0xCA,0x09,0x6E,0x40,0x27,0xEE,0x3D,0x4D,0x4B,0xF1,0x2E,0x8E,0xDB,0x3A,0x42,0x92,0xC5,0x02,0xC7,0x0F,0x85,
0xE1,0x4B,0x0B,0xAC,0x8A,0xCC,0xC1,0x89,0x71,0xC8,0x1F,0x48,0x5C,0x7B,0x93,0x9E,0x35,0x6A,0x18,0xE9,0xD9,0xAB,0xCD,0xD4,0x2F,0x7C,0xAE,0xF7,0x00,0x5A,0x9B,0xE1,
0xDD,0xDD,0xAC,0x12,0x6E,0xAF,0x9A,0xA6,0xF6,0xE0,0x42,0xAC,0x26,0x55,0xDC,0x99,0x05,0xB8,0x6C,0x79,0x41,0x2A,0x7B,0xFA,0x0C,0x73,0xA5,0xDB,0xA5,0xB2,0x83,0xA7,
0x20,0xA3,0x34,0x77,0xA9,0xA9,0x46,0x04,0x13,0xC9,0x31,0x3E,0x1C,0xA7,0x04,0x3E,0xCE,0xC6,0x46,0x19,0x1C,0x67,0xD8,0xF7,0x3C,0x83,0xEA,0x3F,0x88,0xD7,0x6B,0xC5,
0xD1,0x80,0xAB,0x48,0xD7,0x77,0x87,0x23,0x53,0xC8,0xE3,0xC7,0x50,0x77,0x15,0xC9,0x39,0x61,0xCF,0xAE,0x7D,0x7B,0x67,0x4B,0xEB,0x59,0x3D,0xD2,0xF1,0x05,0x4D,0x75,
0x75,0x58,0xA3,0x81,0x8C,0x94,0xF4,0xCF,0x33,0x4A,0x14,0x83,0x9E,0xDC,0x0C,0x7E,0x87,0xF1,0xAA,0x92,0xD5,0x41,0x7B,0x35,0x4B,0x1D,0x2C,0xA0,0x5D,0xFD,0x0A,0x75,
0xB5,0xF4,0xCC,0xB2,0xA5,0x25,0x55,0xBA,0x86,0xBC,0x3C,0x85,0xA4,0x46,0x48,0x96,0x9C,0x91,0xBB,0x24,0x3B,0x3B,0x26,0x7B,0x67,0x2A,0x4E,0x08,0xF2,0x8E,0xFA,0x35,
0x17,0x43,0xED,0xF9,0x8A,0xCC,0xD2,0x08,0xAB,0x1C,0x24,0x66,0xA2,0x41,0x52,0xCE,0x32,0xAC,0x57,0x0C,0x47,0x9C,0x6D,0x38,0x2B,0x9C,0xE3,0x19,0x00,0x1D,0x22,0xDC,
0x7A,0xD6,0xE1,0x4F,0x71,0x92,0xB1,0x2E,0x93,0xD3,0x54,0x30,0x0B,0xF3,0x30,0xA0,0xDE,0x17,0x77,0x76,0xF5,0x27,0x81,0xDC,0x9E,0xDE,0xDC,0x68,0x74,0xFD,0x5D,0x7F,
0xAC,0xB7,0x2C,0x30,0x5F,0x9D,0xE2,0x72,0x37,0xC7,0x24,0xAC,0xAD,0x27,0xF9,0x12,0x40,0x38,0xC6,0x0B,0x0C,0x72,0x39,0x38,0xC0,0xC6,0xBB,0x74,0xD0,0xAE,0x84,0x12,
0x95,0x5F,0xA7,0xE9,0xFA,0x7B,0x25,0xC3,0xC2,0x91,0xA9,0x8D,0x30,0x6D,0xF3,0x78,0x91,0x28,0x07,0xCC,0x02,0x90,0xE5,0x40,0xCE,0x19,0x8F,0x97,0x19,0xC8,0x39,0xEC,
0x4F,0x6C,0x75,0xF6,0x9A,0x69,0xEA,0x68,0xAD,0xB5,0xD2,0x4B,0x23,0xC4,0x76,0x4F,0xB4,0xCE,0x5C,0x32,0xA6,0x4A,0x6D,0x19,0x66,0x5E,0x49,0x1C,0x8F,0x38,0x27,0xDD,
0x62,0x50,0xF5,0x3D,0xE2,0xDB,0x50,0xB5,0x30,0xD6,0x05,0x66,0x52,0x9E,0x1C,0x2E,0xE5,0x37,0x6D,0x20,0x36,0xDC,0xB0,0xFF,0x00,0x23,0x8E,0x3F,0xF3,0xAE,0x79,0xBA,
0x82,0xE1,0x52,0xB4,0xE0,0xDC,0x6B,0x64,0x76,0x2D,0xB6,0x49,0xE7,0x07,0x1E,0x65,0x23,0x0F,0x95,0xC8,0xF2,0x8E,0x71,0xAE,0x4D,0x63,0x18,0x6C,0x54,0x9E,0xC8,0xFD,
0xD5,0xA2,0xE7,0x57,0x41,0x54,0x91,0xCB,0x43,0x3C,0x0F,0x56,0x68,0xBC,0x0F,0x12,0x58,0xBC,0x47,0xCA,0x96,0x61,0x84,0x20,0xED,0x66,0xDC,0x18,0xB0,0x53,0xCA,0x8C,
0xE8,0x05,0x3D,0xE6,0xA1,0x77,0xD9,0xE1,0xB7,0xD6,0x4C,0xB1,0x13,0x59,0x3C,0x15,0x05,0x25,0x97,0x69,0x05,0xB7,0x8F,0x44,0x63,0x80,0x3C,0xD9,0x65,0x51,0xE5,0x51,
0xE9,0x32,0xA8,0xBF,0x5E,0x63,0x94,0x4C,0xB1,0xCA,0x33,0x08,0x8C,0x24,0xF2,0x31,0x38,0x3C,0x0D,0x85,0xB9,0x0B,0x80,0x46,0x41,0xCF,0x38,0xCE,0x38,0xD7,0x64,0xF7,
0x68,0xA5,0x8A,0xAD,0x96,0xE9,0x4F,0x42,0x2B,0x8F,0x87,0x3D,0x34,0x28,0x1B,0x2A,0x1B,0x80,0x66,0x18,0x07,0x24,0x64,0xF6,0x04,0x85,0xCE,0x48,0x07,0x55,0xA5,0x78,
0x90,0xDC,0x15,0x24,0x51,0x16,0xF2,0x93,0x75,0xF1,0x5F,0x5F,0x2D,0x1F,0xCB,0xBC,0xF2,0x55,0xC6,0xCE,0x3C,0x1A,0xEA,0x7A,0x0F,0x0E,0x28,0xE3,0x52,0x1B,0x6A,0xC8,
0x81,0x08,0x04,0x12,0x30,0x49,0x24,0x80,0x41,0xD0,0x09,0x18,0xC2,0x8C,0x94,0x75,0x95,0x32,0xC0,0xD2,0x28,0x8D,0xA3,0x99,0x82,0x36,0xD0,0x46,0xC0,0x76,0x1C,0x38,
0x1F,0xB0,0xFD,0xB5,0x45,0x6E,0x83,0x5A,0x09,0xDE,0xB0,0xC3,0x3C,0x0A,0x5F,0xC6,0x4A,0xA6,0x8C,0x98,0xE1,0x44,0xC3,0x00,0xA5,0x94,0x97,0x72,0xCC,0x00,0xC1,0x23,
0xD4,0x92,0x17,0x05,0x4A,0x6E,0x96,0xAE,0x32,0xC0,0x4B,0xD6,0x3D,0x39,0x91,0xB6,0xC5,0x28,0xCB,0x46,0x53,0x20,0x92,0x3B,0xE4,0x88,0xC6,0x49,0x00,0xE3,0x1C,0x10,
0x0E,0xA2,0xF0,0xDA,0xAE,0x78,0x8D,0x69,0xB2,0x0C,0xCA,0xF1,0x45,0x12,0x4A,0x24,0x85,0x59,0xD8,0x89,0x10,0x3F,0x87,0xB0,0x13,0x9E,0x30,0x1B,0x19,0x04,0xF1,0xEF,
0xDB,0x41,0xE2,0xAE,0x86,0x1A,0x80,0x23,0xDF,0x3C,0x95,0x19,0x10,0xE0,0x64,0xB3,0x13,0x81,0xC1,0xCF,0x39,0xCF,0xA7,0x3D,0xFD,0x8E,0xAC,0x14,0x5D,0x05,0x51,0x51,
0x4C,0x95,0x14,0xB5,0x1E,0x03,0x10,0xB1,0xA4,0x81,0x77,0x3B,0x10,0x0E,0x33,0xB3,0x24,0x70,0x40,0xCF,0x7F,0xB0,0xCE,0xA7,0x37,0x39,0x2C,0x9D,0x35,0xF1,0x0E,0xD1,
0x3C,0xD0,0x09,0x2A,0xAD,0xB5,0xE9,0x2D,0x74,0x91,0xCE,0x65,0x49,0x55,0x65,0xDD,0x8D,0xAC,0xA3,0x04,0x05,0x00,0xE0,0xE3,0xD3,0xBF,0x3A,0xF8,0x31,0x97,0xB1,0x51,
0x32,0xA3,0xCD,0x74,0xD3,0x74,0x7F,0x59,0x31,0x3F,0x2F,0x6F,0x2C,0x44,0xAD,0x11,0xDD,0x50,0x89,0xB4,0x8E,0xE4,0x1D,0xD8,0x23,0x9E,0xFA,0xD0,0x3A,0x53,0xAA,0xA8,
0xE4,0x09,0x1D,0xBE,0x8E,0xA6,0x45,0x07,0x7A,0xC5,0x59,0x19,0x61,0x83,0xEA,0x32,0x7F,0xE7,0xBE,0xAD,0x76,0x55,0xA4,0xB8,0x40,0xD4,0x6B,0x54,0x4A,0x22,0x1A,0x76,
0x68,0x64,0x21,0x80,0x39,0x21,0xC1,0xF5,0x04,0x1C,0x82,0x3D,0x31,0xA5,0x7B,0x37,0xC3,0xCA,0xAB,0x34,0xC6,0x64,0xBA,0xC5,0x25,0x24,0x13,0xBC,0xE8,0x52,0x11,0xF3,
0x32,0x97,0x00,0x62,0x49,0x79,0x66,0x00,0x00,0x02,0xE4,0x00,0x46,0x40,0x19,0xD2,0x51,0xE2,0x57,0x47,0x2C,0xB0,0xCA,0x43,0x0B,0x4E,0x80,0xB4,0x9B,0xA7,0x9A,0x7C,
0x0D,0x92,0xC7,0x13,0xA3,0xBB,0xB3,0x0B,0x93,0x7E,0x8A,0x5D,0x5B,0x6F,0xEA,0x1A,0x3A,0x37,0x9A,0xBE,0xDF,0x24,0x11,0xF8,0x8A,0xA1,0x84,0x88,0xC0,0x16,0xC8,0x00,
0x90,0x71,0xDF,0x8E,0x75,0xF5,0x59,0x4F,0x5F,0x60,0x96,0x1F,0xEA,0x56,0x9A,0xBA,0x59,0xB7,0x17,0x1E,0x2A,0x1F,0x0E,0x45,0x18,0x3C,0x30,0x3C,0x8E,0x79,0xC7,0xDB,
0x54,0x1F,0x8A,0x17,0x5A,0x6B,0x4F,0xC2,0xEA,0x8B,0x5C,0x90,0x87,0xAC,0xAC,0x95,0x22,0x85,0x78,0x66,0x01,0x64,0x59,0x1D,0xBD,0x71,0x80,0x02,0xF3,0xEA,0xFF,0x00,
0xAE,0x97,0xBE,0x1D,0xDF,0xBF,0xAB,0x59,0xE2,0xB1,0x75,0x12,0x2B,0xC3,0x2C,0x6E,0xF4,0x92,0x4B,0x30,0xDB,0x24,0x60,0x3A,0xB2,0xE0,0x1D,0xD9,0x07,0x24,0x00,0x46,
0x46,0x78,0x3C,0x1D,0x36,0xD0,0xCE,0x67,0xA6,0x6C,0xD2,0x36,0xCE,0x29,0x67,0x13,0x8F,0xD9,0xAA,0x1F,0x14,0x66,0xED,0x04,0x04,0x0A,0x97,0xA9,0xEA,0x68,0x6A,0xD6,
0xE3,0x44,0xA1,0x9B,0x77,0xD0,0x39,0x52,0x08,0xE5,0x4F,0x39,0xC1,0xCF,0xBF,0x3A,0x21,0x6D,0x65,0xAB,0x62,0xB2,0xBF,0xC9,0x2D,0x4C,0x81,0xBC,0x9B,0x56,0x25,0xC9,
0x04,0xE7,0x9C,0x01,0xF8,0xF7,0xD0,0x2E,0xA8,0xB4,0x41,0x66,0xBC,0xCA,0x69,0x65,0x44,0xA6,0x8D,0xC9,0x10,0x6E,0x12,0x6E,0xC1,0x00,0x85,0x75,0xF2,0x92,0xB9,0x20,
0xFA,0x1C,0x64,0x1C,0x92,0x35,0x96,0xB9,0xE3,0xAA,0x70,0xAA,0xDB,0x3B,0x12,0x76,0x96,0xDC,0x7D,0x39,0xE3,0xD3,0xDB,0xFD,0xB5,0x24,0x92,0x00,0x2E,0x35,0x55,0x1E,
0xDC,0xCC,0xBA,0x71,0x4A,0x4B,0xAD,0x15,0x05,0x45,0x3D,0x0F,0x50,0xD1,0x2D,0x34,0x93,0x6C,0x30,0x43,0x21,0x22,0x43,0x9E,0x0E,0xD5,0x51,0xC7,0x23,0xFE,0x67,0x40,
0x2B,0x8B,0xC1,0xBE,0x9A,0x4D,0x95,0x55,0xD2,0x38,0x01,0x95,0xF0,0x72,0x71,0xEA,0x4F,0x7F,0x4E,0xFA,0xFA,0x68,0xA2,0x85,0xCC,0xAB,0x57,0x53,0x3F,0x98,0x23,0x4A,
0x06,0x10,0x9E,0x38,0xDA,0x7B,0x1F,0x4C,0x73,0xFA,0x9E,0x75,0xDB,0xD3,0x4A,0xE6,0xB2,0xA6,0x76,0xA5,0x9E,0x49,0x19,0x82,0x46,0x60,0x52,0x5D,0x58,0xE7,0x00,0x36,
0x3C,0xA4,0xE3,0xBF,0x07,0xEF,0xDF,0x51,0x19,0x5A,0x74,0xBE,0x8A,0x0A,0x76,0x3B,0x3E,0x8B,0xAA,0xC1,0xD0,0xD7,0xBA,0x9F,0x06,0xA2,0xEB,0x71,0x14,0x01,0xC9,0x6F,
0x0F,0xC3,0x26,0x40,0x80,0x67,0x71,0xC7,0x0A,0x7D,0x3F,0x23,0x5C,0xB7,0x7B,0x5D,0x34,0x3D,0x53,0x6F,0xB0,0x59,0x2E,0x15,0x97,0x1A,0xEA,0xA9,0x22,0x89,0xA6,0x66,
0xF2,0x44,0xCC,0x42,0x95,0xC0,0x00,0x60,0x13,0x8F,0x5C,0x01,0xA7,0x7E,0xA6,0xBA,0xD4,0xD9,0xAC,0x49,0x6C,0xA5,0x48,0x05,0xE9,0xD5,0xDA,0x48,0xC0,0x45,0x58,0x40,
0x50,0xC1,0x02,0xB1,0xE0,0x8D,0x87,0xB8,0xC9,0x24,0x77,0x27,0x51,0xC3,0x27,0x53,0x74,0xE7,0x50,0xDA,0x6F,0xB5,0x14,0xD2,0xC6,0x77,0xC5,0x72,0xA6,0x33,0xF1,0xE2,
0xA0,0x7E,0xFE,0x99,0x04,0x82,0xBF,0x8D,0x77,0x03,0x9B,0xA5,0xD7,0x6F,0x71,0x79,0x39,0x3A,0x0F,0x55,0x68,0x83,0xE1,0x75,0xA9,0x6D,0xE6,0xB2,0xB6,0xAA,0xAD,0xE3,
0xF3,0x48,0xCD,0xBC,0xA9,0xD8,0x3D,0x76,0x8F,0x53,0x9E,0xDE,0x9A,0xF6,0x9B,0xA3,0x3E,0x1F,0x5E,0x6B,0x96,0xD3,0x4D,0x67,0xBB,0x5B,0xEB,0x8C,0x02,0xA6,0x24,0xA9,
0x79,0x61,0xF1,0xA3,0xDC,0xC9,0xBC,0x67,0x07,0x19,0x56,0x19,0x1E,0xDD,0xF4,0xD7,0xD3,0x1D,0x49,0x65,0xBF,0x5A,0xD3,0x15,0xB1,0x4F,0x14,0x88,0x41,0x86,0x56,0x50,
0xC1,0x4F,0x74,0x6F,0x76,0x18,0xC1,0xFD,0x33,0xEA,0x35,0xBA,0x9F,0xA5,0x7A,0x77,0xA6,0x2B,0xDA,0xE9,0x41,0x43,0x2D,0x3C,0x8E,0x85,0x0C,0xB3,0x4C,0x4A,0xC7,0x1E,
0xED,0xD8,0x00,0x9E,0x06,0x49,0x20,0x01,0x8E,0x75,0x9B,0x56,0x62,0xD5,0x6C,0x9E,0x58,0xAA,0x5C,0xF1,0x25,0xF9,0x72,0xF4,0x4E,0x54,0x74,0x50,0x18,0xE3,0x92,0x30,
0xDC,0x84,0x6B,0x7E,0xAA,0x5F,0xD5,0x7F,0x0E,0xA2,0xB2,0x74,0xE5,0xCE,0xED,0x68,0xAE,0xAA,0x91,0x6D,0xF1,0xA4,0xE6,0x19,0x18,0x3E,0x22,0x2D,0xB1,0xBC,0xC4,0x67,
0x21,0x99,0x4F,0xDC,0x13,0xED,0xA0,0xDD,0x3D,0x64,0xBB,0xDD,0xEC,0x62,0xBB,0xC1,0xDF,0x33,0x12,0x40,0xA9,0x6F,0x3C,0xF1,0x95,0xC7,0x95,0x48,0x20,0x9D,0xA0,0xB0,
0x3D,0xB8,0xC6,0x4E,0x34,0xDB,0xF1,0x0B,0xAB,0x1A,0x2E,0x94,0xA8,0xE9,0x9A,0x43,0xF3,0x17,0x6B,0x9A,0xA4,0x0C,0xA1,0x40,0x68,0xA0,0x0E,0x1D,0x9D,0xF9,0xC2,0x96,
0x2A,0xB8,0x04,0xFD,0x2A,0x49,0xC6,0x46,0x9D,0xFE,0x15,0xD9,0xA4,0x83,0xA4,0xA1,0xF9,0xAD,0x95,0x71,0x02,0x4A,0x54,0x92,0xDC,0x36,0x02,0xE7,0x6B,0x73,0x82,0x59,
0x88,0x3F,0xE9,0x20,0xF1,0xC8,0xD6,0x85,0x86,0x36,0x63,0x49,0x1F,0xB4,0xEA,0xFB,0x6B,0xE7,0xFC,0xB2,0x53,0xAF,0x91,0x82,0x79,0x04,0x06,0xED,0xBE,0x9F,0x0D,0xFF,
0x00,0x7B,0xA8,0x8F,0xF4,0xFA,0xB8,0xA5,0x79,0xA2,0xA7,0x64,0x96,0x9B,0x1C,0x08,0xD6,0x4D,0x84,0x1E,0xE7,0xCB,0xB4,0x1E,0x06,0xBA,0x20,0xB1,0x4D,0x3D,0x1C,0x93,
0x7C,0xB4,0xA6,0x3C,0x17,0xDA,0x40,0xCE,0xCC,0x8E,0x49,0xC0,0x18,0xCE,0x07,0x7E,0x72,0x35,0x49,0xEA,0x8A,0x3A,0x39,0x6F,0x48,0xA9,0x54,0x0B,0x07,0x0A,0x11,0x51,
0x64,0x60,0x01,0x3E,0x5C,0x16,0xC6,0x7F,0xF2,0xC4,0xE4,0x7A,0xEA,0xB6,0xD0,0x1A,0xAA,0xC8,0x66,0x89,0xE9,0xD9,0x0A,0xB6,0xFA,0x88,0x14,0x87,0x47,0x78,0xF3,0xB5,
0x99,0x4E,0xE4,0x6C,0xAB,0xB6,0x76,0x9C,0x81,0xC0,0x6C,0x6D,0xD5,0xE6,0xC2,0x45,0x9C,0x55,0x13,0x31,0x20,0x10,0x9A,0x51,0x8D,0x4A,0x25,0x2C,0x31,0x5B,0xA6,0xA8,
0xA7,0x26,0x20,0x66,0xF1,0x1A,0x55,0x50,0xA4,0x91,0x04,0x20,0xB3,0x67,0x73,0x63,0x7B,0xB0,0xCF,0x72,0x3E,0x93,0xA0,0x75,0x94,0xB0,0xBD,0xED,0xE2,0x4F,0x0D,0x64,
0x0E,0xEB,0x3D,0x51,0x75,0x72,0x19,0x81,0xCA,0x84,0xC6,0xC7,0xF2,0xEF,0x00,0xA7,0x19,0x7F,0x5C,0xE7,0x4C,0x0F,0x4B,0x73,0xAA,0xA3,0x48,0x64,0xA3,0x7A,0x59,0x48,
0x67,0xA7,0x94,0x53,0xF8,0xA6,0x22,0xB8,0x21,0x50,0xC6,0xA1,0x37,0x9F,0x2E,0x79,0x20,0x67,0x1B,0xB8,0x20,0xF0,0x5D,0x45,0x33,0x55,0xC1,0x4C,0xF1,0x2A,0xD4,0x46,
0xA1,0xC5,0x34,0x48,0xEA,0x91,0x77,0x1B,0xA5,0x7C,0x20,0xC7,0x00,0xB1,0x2F,0x8C,0x9E,0xCB,0xBB,0x9E,0x29,0xE4,0x26,0xD7,0x5F,0x48,0x33,0x2F,0x6C,0x97,0x68,0xA0,
0x81,0x29,0xA4,0x2B,0xF3,0x32,0xC4,0x24,0x5F,0x96,0x5D,0xA2,0x30,0x41,0x6F,0xAB,0x23,0x70,0x07,0x8F,0x5C,0x71,0xC8,0xC6,0x90,0x7A,0xB3,0xE1,0xFD,0x15,0x7D,0xD6,
0x20,0xCF,0x54,0x0B,0x40,0x92,0x48,0xFC,0x3C,0xA4,0x61,0x95,0x0A,0x93,0xF5,0x60,0x2E,0x0A,0x82,0x73,0xB7,0xD0,0xF3,0xA6,0xE1,0x43,0xFD,0x4B,0xC5,0x9C,0x50,0xAA,
0xBC,0x6E,0xC8,0x23,0xE7,0x62,0xA2,0x16,0x50,0xB8,0x2A,0x36,0x85,0xE3,0x92,0x32,0x49,0x07,0xD3,0x95,0xBB,0xD5,0xF2,0xA6,0xCF,0x2A,0xFF,0x00,0x53,0xB5,0xC9,0x2C,
0x2A,0x87,0xC0,0x90,0x9C,0xE1,0xBB,0x9D,0xA4,0x92,0xDB,0x4A,0xEF,0x1C,0x76,0x19,0xE3,0x18,0xC4,0xD2,0x35,0xF7,0xCC,0x15,0x68,0x89,0x6B,0x8B,0x42,0x9C,0xD3,0x1E,
0xB5,0xE9,0x7A,0x97,0x82,0xCB,0x51,0x2D,0x74,0x50,0x86,0xDA,0x69,0xFC,0xF2,0x2A,0x8E,0x4A,0x94,0xFA,0xC0,0x19,0xFA,0x58,0x63,0xBE,0x3B,0x92,0x4B,0x4F,0xF1,0x2B,
0xE2,0xBC,0xB4,0xE9,0x6D,0x4B,0x4C,0xB1,0x4A,0xE3,0x00,0xAD,0x0B,0x46,0xC0,0x0E,0xE4,0x93,0x81,0xEB,0xEB,0xAA,0x35,0xA2,0x9F,0xA7,0xFA,0x9A,0x58,0x8D,0x65,0xE6,
0x96,0xE9,0x38,0x6C,0x29,0x7A,0x64,0x7A,0x90,0x30,0x48,0x05,0x93,0x6C,0x98,0x1C,0x02,0x48,0xE3,0xD4,0xF6,0x23,0xB2,0x8A,0x3A,0x18,0xE9,0x84,0x12,0x5D,0x69,0xC2,
0x86,0x4C,0x2C,0x35,0xB2,0xB9,0xE5,0xBE,0x9F,0x0D,0x08,0x60,0x41,0xF5,0x3C,0x65,0xBB,0xE7,0x00,0xD3,0x96,0x86,0x8E,0x67,0xF8,0x92,0xC6,0x0B,0xBC,0xEC,0x8A,0x41,
0x5D,0x5F,0x13,0x32,0x46,0xE3,0x95,0x41,0xA9,0xBA,0x77,0xAF,0x7A,0x9B,0xA9,0x23,0x6B,0xC5,0x9E,0xF0,0x16,0x67,0x08,0xF5,0x13,0xC1,0x96,0x8C,0x77,0xC2,0x23,0x15,
0xC9,0xC6,0x7C,0xB9,0x1D,0xF3,0xEE,0x75,0x5B,0x87,0xE1,0x77,0x52,0xD0,0x74,0xA4,0xBF,0x23,0x6C,0x92,0x48,0xDA,0x7F,0x11,0xA5,0x96,0xBA,0x96,0x04,0x0F,0x10,0x05,
0x37,0x21,0x95,0xB6,0xF0,0x64,0x04,0x6E,0x0D,0xE7,0x27,0x3E,0x5C,0x13,0x2D,0x5F,0x65,0xA0,0xAE,0x13,0x41,0x57,0x57,0x25,0x4A,0x12,0x04,0x10,0x49,0x3C,0xE7,0xCC,
0x00,0x60,0xF1,0x31,0x59,0x01,0xF4,0x38,0x66,0xCE,0x48,0xC1,0x1A,0x19,0x76,0xB9,0xAD,0xF1,0x26,0xA4,0x66,0x95,0x9A,0x38,0xB6,0xAB,0xCD,0x51,0x18,0xF0,0x13,0x0B,
0x80,0xC8,0x8C,0x3C,0x25,0x04,0x7D,0x20,0xEE,0x39,0x39,0xCF,0x3A,0xBE,0xEA,0x78,0xDE,0xD6,0xDB,0x65,0x0C,0x93,0xCC,0x09,0x24,0x75,0x4A,0x7F,0x11,0x22,0xE9,0x96,
0xA1,0x9E,0x18,0xEA,0x62,0x6B,0xC5,0x1D,0x52,0x53,0xCC,0x23,0x50,0x9E,0x2A,0x98,0xF3,0xBD,0x40,0x66,0xC9,0x04,0x05,0x3C,0x9C,0x76,0xEC,0x06,0x57,0x12,0xC9,0x57,
0x6D,0x7A,0x06,0x55,0x8D,0x65,0x75,0x0D,0xB1,0x09,0x20,0xE3,0xBF,0x88,0xAD,0xF4,0xE3,0x20,0xF0,0x4A,0xF2,0x08,0xF5,0xCF,0x54,0xB6,0x48,0x2E,0x7D,0x65,0x4B,0x69,
0xB3,0xC9,0x05,0x79,0x11,0xB3,0xCF,0x3D,0x4A,0x36,0xD3,0x20,0x52,0x4B,0x21,0x03,0x81,0x82,0x36,0xF1,0xFA,0xE9,0x9A,0xFF,0x00,0x43,0x9E,0xA2,0xA4,0x96,0x82,0xB9,
0xA9,0x27,0x86,0x94,0xA8,0x56,0x90,0xBA,0xAA,0x8E,0xF9,0xC9,0x3E,0x50,0x06,0x38,0x0B,0xD8,0x70,0x34,0x2E,0xB8,0x39,0x9E,0xE8,0xEA,0x8A,0x61,0x6C,0x64,0xCD,0xCA,
0xFD,0x57,0x1C,0x74,0x15,0xB5,0x5D,0x42,0x7F,0xAE,0xC3,0x0A,0x47,0x0C,0xCA,0xC2,0x3A,0x3C,0x78,0x58,0x6E,0x01,0xCC,0x5C,0x01,0x9F,0x6C,0xB1,0xF4,0xD1,0xDA,0x19,
0x07,0x4C,0xD7,0x4B,0x7D,0xA5,0xC4,0x54,0x33,0x23,0x49,0x0B,0x2C,0x58,0x0D,0x2F,0x87,0x85,0x00,0x16,0xCA,0xE1,0xD8,0x90,0x58,0x93,0xC2,0x96,0x00,0x91,0x83,0xD7,
0x6B,0x49,0xA3,0xB9,0xA7,0xCC,0x16,0x85,0x80,0x8A,0x45,0x10,0x41,0xB6,0x13,0x84,0x42,0x5B,0x1C,0x2E,0xEC,0x31,0xED,0xF9,0xD7,0x44,0x51,0x43,0x75,0x92,0xE5,0x61,
0xAD,0xA3,0xA6,0x35,0x54,0xA1,0x6A,0xE8,0xB2,0xA0,0x9D,0xA1,0x86,0x5B,0x01,0x40,0x00,0x67,0xBF,0x3F,0x50,0xC0,0x3A,0x8E,0x90,0x09,0x25,0x73,0x6F,0x65,0x26,0x25,
0x4D,0xEC,0xB4,0xC2,0x46,0x82,0x12,0x9F,0x4D,0x57,0xD7,0x5C,0x7E,0x20,0x47,0x78,0xF0,0xED,0x74,0x4F,0x4F,0x33,0x89,0x21,0xAF,0x55,0x98,0xD5,0x39,0x46,0x23,0x29,
0xC6,0x36,0xE3,0x82,0x30,0x77,0x1C,0x8E,0x70,0x47,0x37,0x56,0xFC,0x3D,0xB8,0x55,0xDD,0x67,0xA8,0x9A,0xEE,0x0C,0xA8,0xC4,0x9A,0x69,0x29,0x64,0x59,0x22,0x0E,0xCC,
0xC4,0xEC,0x76,0x67,0xF0,0xC3,0x1F,0xA8,0x06,0xE1,0xB3,0xEF,0xAD,0xD7,0xB9,0xA8,0xAD,0x1D,0x56,0x67,0x9A,0xEE,0x29,0x6E,0xD1,0x82,0x85,0xD1,0x15,0xA2,0xA9,0x50,
0x36,0x11,0x22,0xC6,0x09,0x0E,0x78,0xC9,0xDA,0x73,0x9C,0x80,0x4F,0x21,0xB2,0xD1,0x3F,0x57,0x5C,0x20,0x11,0x4B,0x64,0x9E,0x6A,0x2C,0xED,0x87,0xC7,0xA3,0x01,0x07,
0x38,0xF2,0x1C,0x73,0xC0,0xC8,0x2D,0x1E,0x7F,0x5F,0x43,0x31,0x51,0xB8,0xBB,0x30,0x69,0x3F,0x2B,0xA5,0x77,0x55,0x06,0x34,0x73,0x80,0x3B,0xA9,0x05,0x4F,0xC3,0xCB,
0xD5,0x1D,0x63,0x49,0x49,0xD5,0x7D,0x3D,0x4D,0xB4,0x0F,0xEF,0xA5,0xC9,0x50,0x9E,0x70,0x17,0x6F,0xD5,0xF7,0xE4,0x70,0x3D,0x74,0x4E,0x86,0xC9,0x79,0x6A,0x51,0x42,
0x7A,0xE2,0xAE,0xEF,0x5C,0xDE,0x58,0xA0,0xB4,0x45,0x34,0xEE,0x8F,0xEB,0x82,0xC8,0xAB,0x9F,0x62,0xAE,0x31,0xE8,0x0E,0x78,0xB3,0x55,0x5A,0x6B,0xCC,0x7E,0x35,0x5F,
0x49,0x48,0xF3,0x48,0x72,0x2A,0xA1,0x96,0x57,0x61,0x8E,0xE4,0x23,0x95,0x0A,0x7B,0x72,0x0E,0x7E,0xFF,0x00,0xE3,0xAE,0x5A,0xAE,0xBC,0xB3,0x74,0x85,0x03,0x96,0xB0,
0xD7,0xD2,0x4C,0x63,0x3E,0x2B,0xCD,0x28,0x3E,0x31,0x1C,0xF2,0xA4,0xBE,0xD1,0xBB,0x9E,0x09,0x27,0x3D,0xC6,0x06,0x64,0x92,0x8E,0xD6,0xCF,0x17,0x4E,0x86,0xDA,0xE9,
0xF1,0x0A,0xC4,0x15,0x46,0x56,0xE4,0x64,0xC3,0xE4,0x50,0xEB,0x07,0xC3,0xB8,0x6D,0x34,0x66,0x86,0xA6,0xDF,0x14,0x15,0x12,0xAE,0x6A,0x17,0xE6,0x1A,0xAA,0xA6,0xB3,
0x38,0x2C,0x66,0x75,0x3E,0x51,0x9C,0x1F,0x0C,0x00,0x09,0x3E,0x62,0x73,0xCB,0x07,0x52,0xF5,0x5D,0xBA,0xC5,0x68,0x6B,0x41,0xB8,0xAC,0x95,0x86,0x21,0x1B,0x0A,0x74,
0x6F,0xEC,0xB8,0xCB,0x18,0xF3,0xE6,0x04,0x79,0x93,0xEC,0x0E,0x73,0x8E,0xDA,0x4A,0x9B,0xE2,0x6D,0xE3,0xA9,0xE4,0xD9,0x43,0x6E,0xA3,0xB4,0x40,0xC0,0xA0,0x64,0x4F,
0x0D,0x8E,0x40,0xCE,0x64,0x3E,0x66,0x20,0x60,0xE7,0xDF,0x07,0xD4,0x63,0x75,0xBA,0xD9,0x4C,0x16,0x6A,0x4A,0x77,0x6A,0xA0,0x72,0x65,0xA8,0x01,0x67,0x62,0x70,0x77,
0x17,0x2F,0x91,0x8F,0xCF,0xFA,0x89,0xC6,0x30,0x23,0xC9,0x98,0x67,0x72,0xE4,0xE5,0x8B,0x96,0xF7,0x28,0x54,0x6B,0x70,0xB9,0x57,0x45,0x4D,0x00,0x67,0x3B,0xE3,0x64,
0x91,0x8C,0x52,0xB8,0x45,0xC7,0x31,0x0D,0xC0,0x6F,0xCE,0x01,0x50,0xC4,0x6D,0x2C,0x30,0x31,0xCB,0x5C,0x35,0x0F,0x3D,0xC9,0x96,0x96,0x19,0x69,0xE3,0x91,0x3C,0xF5,
0x54,0xC0,0x41,0x18,0x0A,0xCE,0xC0,0x07,0x74,0x07,0x63,0x13,0xB8,0xA0,0x7C,0x92,0x0F,0xD5,0xE5,0x24,0x76,0xE4,0x83,0xA6,0x5A,0x29,0x6A,0x48,0x9E,0x6D,0x8A,0xBF,
0x35,0x13,0x4B,0x13,0xB2,0x30,0x6C,0xA1,0x51,0x94,0x3E,0x62,0x43,0x73,0x82,0xFC,0x13,0xE6,0x1A,0x27,0xE0,0xDA,0x52,0x24,0xB7,0x46,0xD7,0x0A,0xAA,0xC9,0xB1,0x51,
0xF2,0x55,0xCA,0x8F,0x14,0x92,0x72,0xCC,0x81,0xCB,0x85,0xCE,0x1B,0x38,0x0A,0xF9,0xF4,0xDD,0x9D,0x46,0x0D,0x97,0x44,0x5D,0x37,0x5D,0xE1,0x6B,0x85,0x55,0x4A,0xDA,
0xEE,0x7B,0x9A,0x8A,0x2D,0xE9,0x49,0x1C,0xE7,0xCA,0x72,0x08,0x67,0x4C,0x09,0x17,0xB8,0xC1,0x25,0x4F,0xD5,0x85,0x39,0xC3,0x21,0xB5,0x75,0xCA,0x4B,0x94,0x90,0xDE,
0x10,0x4C,0xD4,0xE4,0x84,0x96,0xB6,0x1C,0x64,0xE4,0x05,0x27,0x01,0x91,0x1B,0x24,0xE0,0x30,0xDE,0x02,0xB0,0xC0,0x66,0xC3,0x1F,0xA1,0x58,0x7A,0x56,0xC9,0x24,0xD1,
0x4F,0x53,0x53,0x2A,0x92,0x0D,0xCE,0xA1,0x1C,0xB3,0x36,0x32,0x63,0xC0,0x38,0x43,0xE4,0xEE,0x14,0x8C,0x0E,0x5B,0x1A,0x58,0xEA,0x7A,0xC3,0x53,0xD0,0x68,0xF4,0x86,
0xDD,0xF3,0xC9,0x28,0xCA,0xC1,0x2B,0x1D,0xA5,0x41,0x7F,0x2A,0x83,0x92,0xC0,0x1E,0x58,0x81,0xB7,0x83,0x92,0x58,0x60,0x7D,0x29,0xC8,0x46,0xEA,0xDC,0xB1,0x5D,0xBC,
0xAB,0x4D,0xEA,0xB2,0x29,0x42,0x54,0xC1,0x50,0x95,0xD5,0x61,0x3C,0x08,0xA0,0x2E,0x55,0xA7,0x04,0x85,0x2F,0x92,0x00,0x5C,0x36,0x14,0x67,0x0A,0x7C,0xC4,0x0E,0x41,
0xD2,0xCF,0x51,0x5E,0xEE,0x66,0xDF,0x12,0x4F,0x14,0x4D,0x18,0xDC,0xAB,0x2C,0xB2,0x17,0x69,0x7B,0x8F,0x10,0x60,0x95,0xC6,0x39,0x07,0xFC,0xB9,0xF5,0xCE,0x7C,0x35,
0x93,0xC9,0xE0,0x3C,0xF1,0xD7,0x55,0xC4,0x19,0x59,0x69,0xD9,0x96,0x11,0x93,0xE6,0x01,0x37,0x29,0x39,0xC6,0x32,0x54,0xA9,0xC8,0x38,0xE3,0xBF,0xC3,0x2D,0xC2,0xFD,
0x78,0x79,0x6A,0x6D,0x29,0x25,0x1A,0x90,0x48,0x76,0x2C,0x11,0x43,0x6E,0x20,0x12,0x0A,0xB0,0x04,0x73,0x8C,0x96,0xFB,0xE3,0x45,0xA0,0x63,0xE5,0x20,0x37,0xE7,0xD9,
0x53,0x7B,0x9A,0xD1,0x77,0x21,0x76,0x3B,0x35,0x3F,0x50,0xDD,0xC5,0x1C,0x97,0x7A,0x6A,0x06,0x69,0x44,0x91,0x04,0x83,0x3B,0x89,0x25,0x47,0x9F,0x20,0xFA,0x0F,0x53,
0xC9,0xF4,0xD5,0x8E,0x93,0xE0,0x9D,0x34,0xB4,0x0B,0x15,0x4D,0xEE,0xB6,0x51,0x23,0x6F,0x78,0xC6,0xD6,0x5D,0xC4,0x92,0x72,0x08,0x3C,0x73,0xDB,0x4C,0x96,0x4E,0x8E,
0xE9,0xDA,0xBB,0x04,0x46,0x3A,0x08,0x5A,0x19,0x23,0x52,0x1D,0x00,0x05,0xB2,0x33,0xCE,0x3F,0x8F,0xC6,0x88,0xDB,0xED,0xB7,0x4E,0x99,0xB8,0xAB,0x2C,0xB2,0xD5,0xDA,
0xC9,0xC3,0xA4,0x8D,0x99,0x22,0x3E,0xE0,0xFA,0x8E,0xDC,0x1E,0x74,0xED,0x0E,0x19,0x05,0x3B,0x43,0x64,0x60,0x75,0xF7,0x09,0x5A,0xA3,0x17,0x92,0x77,0x16,0x53,0xB8,
0xB4,0x8D,0x8A,0x19,0x6B,0xF8,0x4B,0x64,0xB6,0x4B,0xB5,0xE9,0x28,0x6E,0x14,0xEC,0x30,0x60,0xAA,0xA6,0x07,0x9F,0x7E,0x30,0x07,0xED,0xA5,0xFF,0x00,0x88,0xBF,0x07,
0x3A,0x46,0x5E,0x91,0xAC,0xBA,0xD8,0xE0,0x96,0xCD,0x76,0xA5,0x0D,0x3C,0x69,0x11,0xDD,0x1B,0xFA,0xED,0xDA,0x72,0x00,0xFD,0x3F,0x9D,0x5D,0xA9,0x61,0x49,0xA9,0x96,
0x65,0xC1,0xE3,0xF7,0xFB,0xE9,0x6B,0xE2,0x0B,0x44,0x9D,0x22,0xF1,0x89,0x0F,0x8B,0x29,0x0A,0x84,0x80,0x40,0x6F,0x41,0xF6,0xF6,0xCE,0x7D,0x74,0x3F,0x11,0x74,0x11,
0x53,0xC8,0x72,0x8B,0x00,0xAE,0x61,0x71,0xD5,0x54,0x54,0xC7,0x19,0x71,0x25,0xC4,0x05,0x01,0xF8,0x57,0x4C,0x24,0xB6,0x9B,0xA3,0x15,0x96,0x72,0x05,0x2E,0xD5,0x8C,
0xA8,0xC9,0x55,0x50,0xC4,0x92,0x72,0x72,0xB2,0x03,0x8C,0x8C,0x77,0xC7,0x1A,0x5C,0xEB,0x49,0xCC,0x5F,0x11,0xA1,0x8E,0x2A,0x53,0x35,0x0D,0x0E,0x21,0x2B,0x36,0xEC,
0x92,0x14,0x83,0xB9,0xB3,0x9C,0x11,0xE7,0x38,0xE0,0xF2,0x39,0xCE,0x74,0xF5,0xF0,0x9E,0xDD,0x53,0x43,0x3D,0xCE,0x79,0x44,0x50,0x45,0x1E,0xE2,0x23,0x50,0xA0,0xF8,
0xC4,0xE0,0x13,0xCE,0x3B,0x16,0x00,0x63,0xBF,0xEB,0xA0,0x77,0x6A,0x38,0x2A,0x7A,0xEA,0xAD,0xB7,0x46,0xD1,0xB3,0x8C,0xAA,0x8C,0xAA,0x9C,0x72,0x31,0xDC,0x8F,0x4E,
0x3F,0x6D,0x67,0x75,0xB8,0x93,0x1C,0xF6,0x2D,0x87,0x0E,0xC0,0xA4,0x8E,0x27,0x17,0x6E,0x6C,0x9E,0x6F,0x73,0xC6,0xD7,0x68,0x61,0x8A,0x92,0x99,0x92,0x2A,0x38,0xA6,
0x77,0x11,0xE5,0x40,0x78,0xD7,0x03,0x38,0xE4,0x01,0xB8,0x69,0x7F,0xAC,0x64,0xAD,0xA1,0xB5,0xD0,0x75,0xAD,0xBA,0x74,0x8C,0xD3,0xCC,0x21,0x9D,0x90,0x67,0x6A,0x1C,
0x28,0x24,0xF3,0xDB,0x00,0xFE,0xAB,0xFB,0xB4,0xDE,0xA4,0x0C,0xB0,0xBC,0x64,0x7F,0x72,0x96,0x20,0x07,0x75,0x20,0x20,0xFE,0x38,0xE3,0x5C,0xB4,0x30,0x0B,0x8F,0x4D,
0xD5,0x51,0x54,0x2D,0x3C,0x90,0xC8,0x8D,0x1C,0xBC,0x15,0xCA,0x30,0x23,0x04,0x8E,0xFC,0x13,0xFF,0x00,0x3B,0x0A,0xA4,0xAD,0xCB,0x5B,0x25,0xF4,0x03,0xA7,0xF3,0xE6,
0x8E,0x62,0x78,0x01,0x76,0x1A,0xC0,0xDD,0x49,0x17,0x53,0x9F,0x83,0x54,0x35,0xF7,0x6F,0x8D,0x4F,0x5F,0x3D,0x1F,0xCC,0x42,0xC2,0x42,0xAD,0x34,0x40,0x84,0x50,0x78,
0xDA,0x4F,0x7E,0x71,0xDB,0xDC,0xEB,0xF5,0xDC,0x76,0x6A,0x68,0x69,0x44,0x95,0x92,0x6C,0xFF,0x00,0x47,0x23,0xF8,0x1F,0xEF,0xA8,0xFF,0x00,0xC0,0xDB,0x5C,0x54,0xB5,
0x97,0x1B,0x8C,0xE5,0xD4,0xC3,0x88,0x22,0x8C,0x67,0x08,0x32,0x4F,0xEB,0x92,0x78,0xD5,0x7A,0x7F,0x99,0xB8,0x56,0x78,0x95,0x38,0x58,0x97,0x88,0xE2,0x19,0xC6,0x39,
0xFB,0x73,0xDF,0x5A,0x8E,0x13,0x3C,0xBE,0xCE,0xD7,0x0D,0x33,0x6A,0xB0,0x9C,0x62,0x9D,0x82,0x72,0xC9,0x46,0xAD,0x00,0x5B,0x6B,0xA1,0x57,0x0A,0xD8,0x20,0x45,0x8A,
0x86,0x96,0x6A,0xC6,0x5E,0x32,0xB8,0x20,0x7D,0xF2,0x78,0xFD,0xB4,0x97,0x78,0x9F,0xA9,0xEA,0x62,0x96,0x3A,0x7B,0x45,0x10,0x89,0x97,0x85,0xA8,0x93,0x82,0x3D,0x38,
0xC7,0x3D,0xF1,0xCE,0xA8,0xD2,0x53,0xA8,0x52,0x15,0x30,0xA0,0x67,0xCA,0x00,0xC6,0x94,0x2E,0x57,0x58,0x45,0x70,0xA4,0xA0,0x8C,0xCD,0x29,0xFA,0xE5,0x3F,0x4A,0x77,
0x03,0xF3,0x9F,0x41,0xA3,0xA0,0x07,0x32,0xF2,0xC8,0x40,0xEC,0x97,0x64,0x25,0xB2,0xFD,0xDB,0x02,0x82,0x75,0x05,0xB6,0xF1,0x6C,0xA9,0x0B,0x17,0x48,0x51,0x5A,0xF0,
0xC7,0x15,0x74,0xAC,0x32,0x30,0x32,0xBC,0x71,0xEA,0x3B,0x9D,0x6F,0xA2,0xB8,0x2C,0x76,0xCF,0x0A,0x18,0x2A,0x55,0xE0,0x63,0x2C,0xD3,0xBC,0xA1,0xE4,0x52,0x41,0xF3,
0xE0,0x70,0x06,0x73,0x9C,0x10,0x71,0xB8,0x63,0x04,0x6A,0x8F,0x73,0xE9,0x5E,0xA2,0xBE,0x93,0x25,0x5D,0x44,0x68,0x4F,0xD0,0xC3,0x92,0xAA,0x0F,0x38,0x07,0xBF,0x03,
0xFF,0x00,0x7A,0x9E,0xDE,0xAC,0x17,0x7B,0x1D,0xFE,0x35,0x37,0x69,0x91,0x00,0xF2,0xB9,0x1E,0x64,0x3D,0xB1,0x95,0x00,0xE0,0x86,0x23,0x1F,0x7C,0xE9,0x72,0xBE,0x90,
0x86,0x99,0x43,0x4E,0x5E,0xFF,0x00,0xF8,0x98,0xA8,0xEB,0x23,0x90,0x06,0x12,0x2F,0xD9,0x6B,0x13,0xBA,0x74,0xDD,0x2B,0xA5,0x7C,0x55,0x4A,0xEC,0x29,0x61,0x59,0x55,
0x64,0x4D,0xC7,0x92,0x5C,0xE5,0x5B,0x73,0x01,0x81,0xC1,0x56,0xE3,0xB9,0x1A,0x6D,0xB7,0x25,0x65,0xD6,0xB4,0xC7,0x73,0x78,0xA9,0xEA,0xD9,0x97,0x14,0x70,0x39,0xFE,
0xE1,0x03,0x20,0x9D,0xC7,0x20,0x80,0x73,0xE6,0x56,0xC8,0x24,0x1D,0xE0,0x69,0x55,0x62,0xA5,0xA3,0xAE,0xA4,0xAC,0xA8,0xF0,0x1A,0x04,0x56,0x86,0xA2,0x36,0x94,0x46,
0x08,0xC1,0x0A,0xCD,0xB8,0xE4,0x90,0x31,0xEA,0x72,0x40,0xE4,0x1D,0x77,0x59,0x6B,0x6E,0x75,0x57,0x89,0x23,0xB8,0xA7,0xCB,0x96,0x57,0x4A,0x1A,0xF6,0xA7,0x99,0x43,
0x80,0x3D,0x06,0x38,0x21,0x72,0x33,0xC8,0xC8,0x20,0x83,0x8C,0x95,0xC9,0x1C,0x58,0xFB,0x0D,0x91,0x86,0x92,0xE1,0x70,0x17,0x7D,0xCD,0xA7,0xBE,0xD4,0xAD,0x04,0xB0,
0xD4,0x41,0x4F,0x2F,0x9B,0xC2,0x69,0x5D,0xEA,0x64,0x0C,0xA0,0x06,0x0B,0xE1,0x94,0x0B,0xCB,0x70,0xE4,0x70,0x7B,0x1E,0x32,0x2E,0xD5,0xD1,0xB4,0x36,0x35,0x92,0x4B,
0x97,0xC9,0x4E,0x69,0x89,0x8A,0x2A,0x55,0x8E,0x22,0x22,0x0C,0x46,0x09,0x63,0xB8,0xB7,0x00,0x7D,0x58,0x3D,0xB0,0x08,0xC6,0xA8,0x14,0x8F,0x5B,0x25,0xAC,0xD2,0xC8,
0x7E,0x7E,0xE9,0x29,0x76,0x1F,0x27,0xB2,0x18,0xC8,0x2D,0x92,0x4B,0x32,0x20,0x62,0x33,0xDC,0x79,0xBD,0xBD,0xB4,0x09,0xF7,0x52,0xD1,0xD4,0x57,0x67,0x36,0xEA,0x79,
0x9A,0x19,0x26,0x92,0xA1,0x5A,0x39,0x1B,0x1F,0x51,0x2A,0x9F,0xDC,0x39,0x3D,0x9B,0x76,0x33,0xD8,0x63,0x1A,0xA9,0x47,0x1B,0x45,0xDA,0xA7,0x96,0x52,0x5B,0xA2,0x9C,
0x5C,0xAE,0x54,0x31,0xD0,0xCD,0x1D,0x9A,0xDD,0x04,0x95,0x01,0x18,0x3E,0xC8,0x43,0x6C,0x00,0x64,0x33,0x15,0x5E,0x14,0x1D,0xC0,0xFA,0x8D,0xA3,0x81,0xC1,0xD5,0xCB,
0xA1,0xEC,0xB4,0x63,0xA2,0x28,0xA4,0x58,0xD6,0x48,0xA5,0x89,0x64,0x65,0x0B,0x8D,0xC5,0x86,0x4F,0x6E,0xFD,0xCF,0x3A,0x97,0x5C,0x28,0xA9,0x7A,0x86,0xB1,0x69,0x60,
0xA3,0xCC,0x6B,0x30,0xF9,0x6A,0x91,0x4E,0x62,0x8C,0xE3,0xEB,0x21,0x5F,0x07,0x3E,0x99,0x0A,0xBD,0xC6,0x3D,0xF5,0x5B,0xE8,0xB8,0xE6,0xA4,0xE9,0xD8,0x28,0x67,0x5D,
0xBF,0x2A,0x5A,0x9C,0xE1,0xB8,0x1B,0x58,0x80,0x7B,0xF3,0xC1,0x1C,0xFD,0xB4,0xF9,0x80,0x44,0x6C,0xFD,0x34,0x23,0x43,0xF0,0x4A,0xB8,0xEB,0xB9,0x1A,0x6F,0xAD,0xF5,
0x5D,0x16,0xDA,0x53,0x63,0xBC,0x49,0x45,0xE1,0x2A,0xD1,0xD4,0x83,0x2C,0x08,0x4F,0xD2,0xC0,0x0D,0xCB,0xCF,0x20,0xF1,0x91,0xFA,0x9D,0x34,0x88,0x96,0xA2,0x3D,0xB2,
0x00,0x08,0xEF,0xBC,0x1E,0x75,0xCD,0x72,0xA0,0x15,0x76,0xC5,0xA8,0x84,0xA8,0x9A,0x22,0x19,0x19,0x8E,0x36,0xB0,0xE7,0xFD,0xFF,0x00,0x7D,0x74,0xD0,0x54,0x3C,0xD4,
0x71,0x4B,0x14,0x67,0x90,0x32,0x33,0x9C,0x7B,0xFF,0x00,0x39,0xD1,0x82,0xE3,0xE1,0xE5,0x1B,0x20,0xF1,0xC5,0xF7,0x99,0x8E,0xFA,0xA2,0x16,0x84,0x48,0xE6,0x34,0x92,
0x1E,0x08,0x3B,0x7F,0xE7,0xDB,0x40,0x3E,0x26,0xA9,0x8F,0xA4,0x6A,0x30,0x4A,0x1D,0xCA,0xA7,0x6F,0xA7,0x3E,0x9F,0x7E,0x34,0x69,0x1C,0x09,0x44,0x91,0x90,0x08,0x20,
0x9C,0x9E,0x0F,0xBE,0x80,0x7C,0x59,0x6D,0xDD,0x1E,0xAC,0x5F,0x61,0x79,0x11,0x38,0x38,0xDD,0xDF,0x83,0xEF,0xFF,0x00,0xF7,0x4A,0xB8,0xE9,0x73,0x28,0xA7,0xEE,0xD2,
0x9E,0x78,0x59,0x82,0x5C,0x42,0x99,0xA3,0xFD,0xC2,0x9A,0x58,0xC8,0xA4,0xE8,0xA9,0x6A,0x0A,0x10,0xD5,0x12,0xBB,0x2B,0xA9,0xF3,0x36,0xD3,0x8F,0x7C,0xE3,0xCC,0x7B,
0xFE,0xBA,0x55,0x8E,0x9E,0x49,0x6F,0xA2,0x51,0xB5,0x18,0xF3,0x84,0x62,0x77,0x64,0xFA,0xFB,0x7E,0x34,0xE7,0x39,0x96,0x9E,0xC7,0x4D,0x09,0x70,0x57,0x69,0xDC,0x5B,
0x20,0x9C,0xE7,0x9F,0xF6,0xE4,0x77,0xD0,0xBB,0x64,0x54,0xD5,0x35,0x89,0x21,0x55,0x58,0x90,0x0C,0x2B,0x64,0xE7,0xD3,0x24,0x9F,0x5F,0xF6,0xD6,0x47,0x2C,0xAE,0xF1,
0x63,0x1D,0x82,0xF4,0x9B,0x29,0x1A,0x62,0x21,0xCD,0xD6,0xF7,0xD3,0xB2,0xEE,0xB9,0x3F,0x87,0x4B,0x09,0x97,0x71,0x65,0x8D,0x06,0xEC,0x9C,0x0C,0x0F,0xA7,0x9D,0x6E,
0xB6,0xCF,0x23,0xC6,0xF1,0xC4,0xAC,0x43,0x29,0x00,0x00,0x70,0x38,0xFE,0x47,0xBF,0xE3,0x5F,0x15,0x8F,0x0A,0xCE,0xCA,0x64,0x57,0x24,0x71,0x84,0x00,0x63,0xDB,0x8F,
0xD3,0x5E,0xDA,0x32,0xCE,0xE8,0xB2,0x76,0xF3,0x02,0x07,0xAE,0x38,0xE0,0xEA,0x20,0xE7,0x3A,0xBC,0xEB,0xD5,0x59,0x74,0x2C,0xF6,0x21,0xCB,0x6B,0x26,0x5F,0x86,0xD4,
0xA9,0x49,0x2D,0xE2,0x98,0xB8,0x2C,0xD5,0x42,0x42,0xA1,0x89,0xE4,0xAE,0xEE,0xDE,0x83,0x2C,0x75,0x4E,0x45,0x2E,0xA8,0x13,0xCC,0x7B,0x13,0xA4,0x0E,0x88,0x81,0x7F,
0xA9,0xDC,0xE6,0x52,0xA1,0xA5,0x92,0x35,0xF2,0xAE,0x30,0x04,0x63,0x8E,0x47,0xDF,0x54,0x70,0x9F,0x29,0x42,0xC1,0x80,0x1C,0x70,0xD9,0xF7,0xED,0xAD,0x97,0x08,0x70,
0x6D,0x04,0x36,0x1B,0x7D,0x4A,0xF3,0x0F,0x13,0x46,0x3E,0xD6,0xA8,0x03,0xA0,0x3F,0x40,0x80,0xDF,0x1E,0x5A,0x99,0xDA,0x8A,0x90,0x98,0xE3,0xC6,0x1E,0x50,0x39,0xFD,
0x01,0xF4,0x3F,0x7D,0x0A,0x16,0xD8,0x29,0x99,0x7C,0x30,0x02,0x72,0xCD,0xC0,0xE7,0xF5,0xD1,0xC5,0x81,0x15,0x0C,0xA1,0x42,0x96,0xF4,0x27,0xB6,0x87,0xD6,0x48,0xD1,
0x53,0x33,0xC6,0x3C,0xF2,0x70,0xAA,0x07,0xAF,0xDF,0x4D,0x14,0x61,0xA0,0x5D,0xC9,0x1E,0xBD,0x85,0xE6,0xE1,0x2F,0xDC,0xAF,0x20,0x5C,0xD6,0xD7,0x40,0x86,0x4A,0x92,
0x32,0x5C,0xF0,0xA9,0xFB,0x1E,0xDA,0x99,0x75,0x55,0xA6,0xE5,0x49,0x71,0x82,0xAE,0xB9,0xEA,0xE7,0x59,0x64,0x29,0x2B,0x41,0x85,0x2B,0xFF,0x00,0xE4,0xFA,0xFE,0x7B,
0xEA,0xB7,0x68,0xB3,0xC7,0x45,0xBA,0x66,0x07,0xC5,0x72,0x1D,0x8B,0x71,0xB9,0xB1,0xDC,0x11,0xF8,0xD0,0x5E,0xBA,0x31,0x7F,0x4E,0x12,0xCC,0x8B,0x23,0x6E,0x5D,0x9C,
0x9C,0xA9,0xCF,0xDB,0xF4,0xD5,0x7C,0x42,0x95,0xD3,0xB0,0xB9,0xEE,0xE8,0xA6,0xA3,0xA9,0x6D,0x3B,0xD8,0xC6,0xB6,0xE4,0xF5,0x48,0x49,0xF2,0x37,0x47,0x82,0x39,0xC2,
0x57,0xC9,0x00,0xC8,0x92,0x7D,0xE6,0x44,0x6C,0x71,0x95,0x3D,0xCF,0x39,0x27,0x96,0x1F,0xF7,0xE9,0x5B,0x2F,0xF5,0x0A,0x19,0x2D,0x94,0x15,0x94,0x53,0x52,0x89,0x9B,
0x73,0x54,0xBB,0x81,0x14,0xA3,0x03,0x6E,0x58,0x13,0x81,0xDC,0x0F,0x30,0x1C,0x67,0x00,0xE3,0x5D,0x14,0xF4,0xD4,0x94,0xF6,0xF3,0x3D,0x2C,0x93,0x46,0xC5,0xD9,0xDA,
0xA6,0x9A,0x65,0x2E,0xB9,0xCE,0x42,0xED,0x1B,0x87,0x1C,0x9C,0x06,0x3D,0xF9,0x1D,0xC1,0x7B,0x65,0x05,0xBD,0x28,0xCD,0x65,0x25,0x43,0x90,0x63,0xCB,0xFF,0x00,0xD3,
0xF9,0xA4,0x00,0x0C,0xE7,0x07,0x7E,0xEE,0x46,0x49,0xEC,0x39,0xE4,0x69,0x46,0xA2,0x22,0x4D,0xC8,0xE8,0x99,0xE3,0x90,0xE8,0xD0,0x50,0x4A,0x98,0xA1,0x8E,0xDD,0x34,
0x54,0x7B,0x29,0x18,0x29,0x77,0x79,0x5E,0x27,0x92,0x50,0xBF,0x57,0x91,0x77,0x7A,0xE7,0x2D,0x81,0x8C,0xFA,0x71,0x94,0x6B,0xB5,0xD8,0xCF,0x47,0x34,0x76,0x19,0x17,
0xC6,0x64,0x06,0xA1,0x26,0x8B,0x6D,0x4C,0x98,0x23,0x84,0xF1,0x15,0xB6,0x8F,0xCF,0x1C,0x67,0x19,0x18,0x63,0xA8,0xB2,0xC1,0x5F,0x70,0x85,0x2B,0xAD,0x77,0x18,0xA1,
0x9E,0x47,0x8A,0x57,0xA6,0x11,0xCF,0x51,0x54,0xC9,0xE6,0xF3,0x6D,0x2A,0x23,0x89,0x77,0x73,0x92,0x46,0x00,0xED,0xDF,0x42,0xFA,0xCE,0xF4,0x6C,0x14,0xD3,0x52,0xD3,
0xD0,0xD4,0x3C,0x0E,0x86,0x24,0x96,0xA2,0x36,0x10,0xC5,0xC7,0x28,0x36,0x93,0x96,0x5F,0x31,0x19,0x00,0x0C,0xF6,0x23,0x07,0x40,0xA9,0xDA,0x1A,0x2E,0x3D,0xE4,0x62,
0x40,0x36,0x2B,0xEF,0xE1,0x6D,0x1B,0x1E,0xB5,0x28,0xEF,0x51,0x52,0x5E,0x2C,0x48,0x2A,0x18,0x9F,0x0D,0x81,0xCF,0x97,0x24,0x8C,0x70,0x73,0x9C,0x83,0x9F,0xB6,0x35,
0x64,0xA0,0x89,0xA8,0x7A,0xA2,0xE1,0x4B,0x2B,0xB1,0xF1,0x02,0xD4,0xC6,0x87,0xB7,0x6D,0xAC,0x3F,0x18,0x1F,0xB8,0xD4,0xBF,0xE0,0x55,0x04,0x69,0x9A,0xE4,0xA8,0x57,
0xF9,0x96,0x96,0x5F,0x11,0x54,0x2A,0xED,0xC8,0x03,0xB2,0xA9,0x3C,0x1E,0xF8,0xD5,0x76,0xF3,0x28,0xA7,0xBB,0xDB,0x6A,0xCA,0xB1,0x52,0x5A,0x12,0x71,0xC7,0x99,0x4F,
0x7F,0xB6,0x40,0xD6,0x9D,0x86,0xC5,0xE1,0xD3,0xC6,0x0F,0x95,0xD2,0x2E,0x31,0x28,0x92,0xA1,0xE0,0x74,0x16,0x47,0x20,0x0A,0xD1,0x18,0x5D,0x01,0x1E,0xFD,0xB5,0xA6,
0xDB,0x1A,0xD3,0x55,0xCD,0x12,0xB3,0x3A,0xE4,0xB1,0xDC,0x31,0xCE,0xBC,0xA5,0x3B,0x95,0x77,0x72,0xA3,0xD4,0x76,0xD7,0x44,0x71,0x47,0x1D,0x53,0x18,0x43,0x79,0xBC,
0xCA,0x71,0xFB,0x8D,0x71,0x33,0x72,0xB9,0x7D,0x4A,0xEC,0xCD,0x0B,0xEB,0x63,0xF8,0x9B,0x19,0x8F,0x6E,0xC3,0xD7,0x9C,0x69,0x6B,0xE2,0x10,0x92,0xA3,0xA4,0x69,0x15,
0x8B,0x1F,0xFA,0x95,0x04,0x1F,0x5C,0x06,0xED,0xF8,0xC6,0x9B,0xAA,0x95,0x96,0x54,0x77,0x88,0x47,0x91,0x92,0x01,0xC9,0xD2,0x9F,0x5C,0xA7,0x8F,0x61,0xA6,0x88,0x1D,
0xA4,0xD5,0x2E,0x31,0xCF,0xF8,0x9E,0xDA,0x5E,0xE2,0x53,0x7C,0x36,0x57,0x76,0x4E,0x1C,0x10,0x2D,0x8D,0x53,0xB4,0xEC,0xEF,0x44,0x81,0x73,0x96,0x46,0xB4,0x87,0x20,
0x79,0x70,0x80,0x16,0xE4,0x64,0x1C,0x7A,0x76,0xD7,0x15,0x95,0x96,0x69,0xF6,0xCC,0xE0,0x20,0x53,0xE6,0x0B,0xFF,0x00,0x6F,0xCE,0xBC,0xBC,0x02,0x19,0x57,0x79,0xE7,
0x92,0xA7,0xB0,0x3D,0xB5,0xED,0x92,0x97,0xC6,0x60,0x84,0xAE,0xD7,0x39,0x3B,0x71,0xC0,0x3F,0x9F,0xE3,0x58,0xC0,0x61,0x9A,0xAC,0x58,0x74,0xB2,0xF5,0x4B,0xC0,0x8A,
0x02,0x49,0xF9,0xAE,0xCB,0x9C,0x26,0x16,0x8D,0xD8,0x1D,0xC4,0x03,0x8C,0x93,0xFF,0x00,0x7F,0xCE,0xB9,0xED,0x72,0x95,0xAB,0x2B,0x18,0x0A,0x5C,0x63,0x03,0xD7,0x44,
0x2E,0x54,0xF4,0xFF,0x00,0x2E,0xAC,0x67,0xDA,0xE0,0x7D,0x27,0x07,0x70,0x3E,0xFC,0xF0,0x3F,0x9D,0x09,0xA2,0x8C,0x7C,0xDA,0x28,0xDC,0x39,0xDB,0x95,0xD7,0x15,0x99,
0xA2,0xAD,0x6D,0x97,0x14,0xE4,0x4F,0x4E,0x43,0x95,0x2B,0xE1,0xA3,0x3D,0x54,0xF7,0x49,0x66,0x39,0xC4,0xC0,0x0F,0x36,0x4F,0xD0,0xA3,0x27,0x3F,0xF8,0xD3,0xF5,0xC5,
0xC4,0xD5,0x42,0x91,0x58,0x08,0xE1,0xC1,0x7C,0x0E,0xED,0xED,0xA4,0x8F,0x86,0xC4,0x41,0x43,0x77,0x9D,0x94,0x85,0x5A,0xA2,0x0E,0x46,0x3B,0x46,0x9F,0xED,0xA6,0xB5,
0x2F,0x2C,0x01,0xD9,0x00,0x79,0x5B,0x7B,0x7A,0x91,0x93,0x9E,0x3F,0x7D,0x6E,0x18,0x53,0x2F,0x04,0x39,0xB6,0x68,0x5E,0x5B,0xE2,0xA7,0xB4,0x62,0x95,0x39,0x77,0x71,
0xFA,0x2C,0x63,0xE2,0xB1,0x76,0xC9,0x89,0x73,0xC6,0x7B,0xE8,0x5A,0xC4,0xF5,0x55,0xC6,0xA1,0xC1,0x08,0xBC,0x2F,0xE3,0xBF,0xE4,0xF1,0xA2,0x77,0x19,0x63,0x8A,0x95,
0x62,0xDC,0x79,0x1E,0x61,0x9C,0xF0,0x75,0xAA,0x9E,0x9C,0xC7,0x49,0x81,0xB0,0x67,0x3C,0x8F,0x41,0xED,0x8D,0x1C,0x8E,0x4C,0xA2,0xC9,0x49,0xF1,0x03,0xCC,0x57,0x1D,
0x49,0x0D,0xE6,0x75,0x18,0x51,0xC6,0x32,0x02,0xE7,0xF4,0xD2,0xBD,0xCE,0x81,0x6E,0xB3,0x96,0x96,0x32,0xE9,0x1E,0x55,0x19,0x8F,0x73,0x8E,0x49,0xC7,0x38,0xE7,0x1D,
0xF4,0xC1,0x74,0xA8,0x5A,0x6B,0x64,0xD3,0xC8,0xDB,0xD5,0x0B,0x65,0x40,0x27,0x9F,0x4F,0xE7,0x5C,0x74,0xAB,0x22,0x5B,0xD5,0xD8,0x06,0x0E,0xBB,0x98,0xFF,0x00,0x3C,
0x0E,0x71,0xDF,0x44,0x0B,0x03,0xDA,0x1A,0x50,0x27,0x12,0x1E,0x5E,0x3A,0xED,0xF1,0x52,0x19,0x25,0x9A,0xD9,0x7C,0x68,0x24,0x66,0x90,0x06,0x28,0x16,0x1C,0x09,0x00,
0x3D,0x8E,0x0E,0x07,0xD4,0x78,0xFD,0x7D,0x08,0x18,0x61,0xA3,0xBD,0xCD,0x47,0x57,0x15,0xBE,0xE7,0x2B,0x56,0x53,0xCA,0x18,0x94,0x96,0x95,0xA3,0x90,0xF6,0x5F,0x3A,
0x96,0x0A,0x70,0x72,0x32,0x41,0xED,0xEF,0x81,0xA5,0x8E,0xA1,0xAC,0xE9,0xAB,0x77,0x57,0x48,0x97,0x09,0x04,0x6F,0xBC,0xB9,0x99,0x23,0xDD,0xB5,0x87,0xA9,0x2D,0x80,
0x47,0x6E,0xD9,0x3F,0x6D,0x33,0xD0,0xCD,0x25,0xCE,0xD3,0x0D,0x63,0xD4,0xAB,0xC5,0x22,0x95,0x86,0x59,0x24,0x68,0xD6,0x4C,0x0E,0xC5,0x54,0x82,0xAD,0x8E,0x38,0x3C,
0xE3,0xB7,0x03,0x48,0x15,0x27,0x2C,0xAE,0x6B,0x4D,0xC5,0xD3,0x7D,0x3B,0xB3,0x35,0xAF,0x78,0xB6,0x89,0x7A,0xE5,0xD4,0x54,0xD6,0xDB,0x2D,0x5D,0x53,0x57,0x01,0x1D,
0x12,0x17,0x96,0x1F,0x1D,0x2A,0x65,0x92,0x42,0x40,0x51,0x29,0x50,0xB8,0xC9,0x65,0xE3,0x9C,0xE3,0xE9,0xF6,0x9B,0xF5,0x9D,0x75,0xE6,0xEB,0x5C,0x6A,0xFF,0x00,0xA9,
0x9B,0xA5,0x32,0xC6,0xBB,0x80,0xDE,0x63,0x88,0x6D,0xC9,0x19,0xE0,0x77,0xE4,0x0C,0xE7,0x8C,0xF3,0xC6,0x8D,0xF5,0x45,0xDA,0x93,0xA9,0x23,0xA3,0x92,0x19,0x63,0xA4,
0xAA,0x89,0x43,0xCB,0x4E,0xD1,0x96,0xF0,0xC9,0x52,0xAA,0x41,0x5C,0x16,0x38,0xCE,0x09,0xCB,0x65,0xF8,0x2A,0x09,0x25,0x6A,0xFF,0x00,0x7C,0x78,0xAD,0x72,0xD3,0x55,
0x3C,0xF0,0xE6,0x36,0x8D,0x25,0x45,0xDA,0x95,0x60,0x0C,0x32,0x82,0x32,0xC3,0x27,0xD0,0x1C,0x70,0x7D,0xCE,0x83,0x52,0x30,0x17,0x37,0x64,0xCC,0xE1,0x61,0x75,0x70,
0xF8,0x7D,0x6E,0x8E,0xC9,0xD3,0x1D,0x3C,0x62,0x05,0x16,0xA6,0x9C,0x97,0xE7,0x38,0x67,0xC3,0x72,0x77,0x73,0xC6,0xA8,0xB7,0x6B,0x78,0xA8,0xB0,0x49,0x93,0xB0,0xA7,
0x99,0x46,0x48,0x0A,0x47,0x20,0xE7,0xDB,0x3A,0x9C,0xD9,0x6B,0x76,0xFC,0x22,0xB0,0x5D,0xE0,0x8C,0x81,0x07,0xCB,0xC9,0x22,0x28,0x24,0xAA,0x61,0x41,0xCF,0x3C,0x7D,
0x47,0xF6,0xD5,0x42,0xDF,0x30,0xAC,0xB6,0x18,0xD8,0xE4,0xBC,0x7D,0x87,0xA6,0x47,0x7D,0x6A,0xD2,0xE9,0x0B,0x7C,0x3D,0x80,0xF4,0x59,0xB1,0x17,0x9C,0x99,0x37,0x27,
0xD5,0x69,0xB1,0xD4,0x47,0x5D,0x6E,0x82,0x7F,0x36,0x5D,0x01,0x23,0x69,0xE1,0xBD,0x47,0xE0,0xF1,0xA3,0x53,0x9F,0x24,0x45,0x53,0xCE,0x87,0xCC,0x73,0xDC,0x7E,0x9A,
0x54,0xE9,0xC9,0x3F,0xA7,0xDC,0xE5,0xA0,0x98,0x3E,0xD6,0x93,0x7C,0x7B,0xD7,0xB1,0xE3,0x70,0xE7,0xF2,0x7F,0x3A,0x77,0xA9,0x8D,0x3E,0x48,0x93,0xBB,0x24,0x76,0xCF,
0xF3,0xA1,0xB5,0x6F,0xE6,0x08,0x95,0x33,0x32,0x82,0x7C,0x97,0xD5,0xC2,0x3C,0x51,0xC6,0xCC,0xA3,0x2B,0x9C,0x30,0xF5,0xD4,0xFB,0xAD,0xA7,0x73,0x4D,0x49,0xB5,0x14,
0x84,0x9B,0xC4,0xC7,0x3E,0x8B,0x8C,0xFF,0x00,0x3A,0xA0,0xD3,0xC8,0x2B,0x3A,0x70,0x47,0x82,0x24,0x0B,0x80,0x4F,0xBE,0x90,0x3A,0xB0,0xAE,0xDA,0x58,0x25,0x69,0x1E,
0x49,0x18,0x84,0x29,0xC0,0xE0,0xAE,0x73,0x9E,0xFF,0x00,0xA6,0x97,0x31,0xA7,0x13,0x86,0x48,0x0F,0x6F,0x50,0x9E,0xB8,0x35,0x83,0xED,0xC8,0x1E,0x07,0x5B,0x9F,0xD9,
0x4D,0x2E,0x7F,0xFC,0xC4,0x12,0x09,0x19,0x04,0x83,0x9C,0xE8,0x9F,0x4D,0x3C,0x89,0x53,0x1C,0xE2,0x15,0x67,0x42,0x08,0xED,0xCF,0x39,0xE4,0x7A,0x8C,0x03,0xA1,0xB7,
0x50,0xAF,0x5E,0x15,0x19,0x4E,0x32,0x30,0x39,0xED,0xEF,0xC0,0xD1,0xBE,0x90,0x3E,0x0D,0x71,0x95,0xA4,0xDB,0x1A,0x9F,0x33,0x86,0xDA,0x14,0x7D,0xF1,0x8C,0x9C,0xE7,
0x8D,0x65,0x18,0x3C,0x62,0x4C,0x40,0xB4,0xF9,0xAF,0x4A,0x62,0xCF,0xF0,0xB0,0xF7,0x3B,0xC8,0x22,0x97,0xA9,0x1A,0x56,0x91,0x2A,0xD5,0x92,0x45,0x62,0x42,0xB2,0xE7,
0x19,0xC1,0xCE,0x73,0xEF,0x9D,0x2C,0x81,0x4D,0xE3,0xF2,0xE3,0x9C,0xF1,0xB4,0x9E,0x78,0xE4,0x01,0xEB,0xA6,0x6E,0xAF,0x8E,0x98,0xDC,0x1D,0x92,0x55,0x0D,0x22,0xE7,
0x2A,0x18,0x81,0xC9,0x03,0xD7,0xED,0xFC,0xE9,0x34,0xA9,0x8B,0xC2,0x75,0x40,0x4F,0xD9,0xBB,0x73,0xED,0xAE,0x71,0xE6,0x78,0x75,0x84,0x37,0x65,0x43,0x00,0x22,0x5A,
0x46,0xBC,0x1E,0xAA,0xA3,0xD1,0x4D,0xE1,0x74,0x95,0x42,0x00,0xED,0xE3,0x56,0x10,0x47,0x6F,0x44,0xCE,0x7F,0x6D,0x3A,0x51,0xC0,0x27,0xAC,0x0E,0x1C,0xED,0x4F,0x31,
0x04,0xFF,0x00,0x1A,0x48,0xE8,0x94,0x90,0x74,0x84,0x61,0x9C,0x96,0x92,0xB1,0xD8,0xE7,0xB7,0x08,0x34,0xF1,0x47,0x8A,0x7B,0x34,0xD3,0x86,0x04,0x82,0x00,0xCF,0x1F,
0xAE,0xB6,0x6C,0x39,0xC4,0x61,0xF1,0x38,0x75,0x2D,0x0B,0xCD,0x7C,0x46,0xC0,0xEC,0x6A,0xA1,0xA7,0xA0,0x71,0x5C,0xB5,0x8A,0xD3,0x56,0x05,0xC3,0x0C,0xB6,0xE6,0xF2,
0xF7,0xE7,0x80,0x4F,0xE9,0xAF,0x59,0xCA,0xA8,0x03,0x85,0x5C,0x9F,0x37,0x05,0xB5,0xF5,0x4B,0x1B,0x4D,0x23,0x48,0x06,0x77,0x72,0x57,0x9F,0xE7,0x5A,0x2E,0x38,0xA6,
0x82,0x59,0xA4,0x38,0x8D,0x01,0x62,0x5B,0x8E,0xDA,0x29,0x4E,0xD0,0x4D,0x8E,0xC9,0x5A,0xA6,0xE0,0x5C,0x6E,0x81,0x57,0xD4,0xC5,0x57,0x75,0x8E,0xD4,0xCA,0xC7,0x3E,
0x79,0x00,0xCF,0x00,0x1E,0x06,0x47,0xE4,0xFE,0x35,0xDF,0x35,0x2A,0xC3,0x11,0xA7,0xC3,0x00,0x47,0x0D,0xD8,0x76,0xCF,0xFC,0xCE,0xB9,0x6C,0xB4,0x1E,0x3B,0xCB,0x73,
0x92,0x46,0x77,0x75,0x24,0x81,0x8F,0x2E,0x47,0x00,0x73,0xCE,0x06,0x3F,0x7D,0x6B,0xBE,0x55,0xFC,0xB5,0x2D,0x45,0x4C,0x99,0x06,0x9D,0x09,0x24,0x61,0x77,0x71,0xF8,
0xF4,0xC6,0x89,0xB2,0x41,0x67,0x1F,0x20,0x84,0xD4,0xC4,0x1A,0x00,0x23,0x52,0xA0,0xDD,0x43,0x59,0x14,0xDD,0x69,0x30,0x68,0xE1,0x9E,0x25,0x72,0x1D,0x24,0x59,0x48,
0xDB,0xBB,0x6E,0x32,0xA0,0x00,0x7E,0xD9,0xCF,0xEF,0xAE,0x8B,0x45,0xCA,0x9E,0x6A,0x88,0xED,0xF0,0xD2,0x9A,0xA8,0x99,0xB7,0x46,0xBE,0x21,0x93,0x6B,0x2E,0x38,0xDA,
0xD1,0x85,0xC8,0x1F,0xEA,0x6C,0x63,0xD7,0x3A,0x58,0x7B,0x8C,0x93,0x75,0x65,0x4D,0x5D,0x3A,0xC8,0xB2,0xCB,0x92,0x6A,0xE9,0xCA,0xF9,0x94,0x1E,0x41,0xC0,0x20,0x2F,
0xA6,0x7F,0x5E,0x74,0xF1,0x64,0xB7,0x9A,0x4A,0x96,0xB8,0xDA,0xA8,0xD1,0x6E,0x32,0x45,0xB5,0xA1,0x96,0x76,0x8E,0x36,0xC0,0x05,0x9C,0x31,0xF3,0x30,0xFB,0xB0,0x55,
0x1F,0x70,0x72,0x73,0x69,0x8D,0xE5,0x2F,0x4D,0xF0,0xC6,0x5B,0x1B,0x5A,0x7C,0x94,0x5A,0xBA,0x92,0x01,0x05,0x43,0x08,0x96,0x27,0x76,0x51,0x37,0x84,0xF2,0xF8,0x71,
0xE4,0xFA,0x2E,0xD6,0xC8,0x39,0xCF,0x3D,0xB0,0x70,0x3D,0x74,0x3F,0xAB,0xAE,0x9F,0x2F,0x4B,0x0C,0x74,0xF5,0x42,0xAE,0x28,0x95,0x57,0x06,0x06,0x8E,0x32,0x71,0xE8,
0x18,0x64,0xFA,0xFB,0x67,0xD8,0x6B,0x35,0x9A,0x82,0x9B,0xF1,0x02,0x61,0x5F,0xA5,0x7E,0x0C,0xD5,0x3F,0x51,0x7C,0x04,0xA1,0x5F,0x19,0x1B,0x74,0x6F,0x0E,0x38,0x1D,
0x98,0x8C,0x60,0x0E,0x38,0xD3,0x77,0x46,0xD7,0x49,0xF2,0x29,0x42,0xEE,0xC2,0x5A,0x67,0x34,0xEE,0x59,0xF2,0x0E,0xCE,0x33,0x8C,0x7B,0x60,0xFE,0x75,0x9A,0xCD,0x6A,
0x91,0x6B,0x18,0x1F,0xA4,0x7A,0x05,0x99,0x56,0x69,0x33,0xED,0xB3,0xFE,0xA5,0x1F,0xB8,0xD2,0xB2,0xD6,0x7C,0xCC,0x58,0x12,0x29,0x0C,0xB9,0xC7,0xD5,0xEA,0x3B,0x67,
0x91,0xA6,0x44,0x7F,0x9D,0xB6,0x24,0x8A,0x70,0x42,0xE4,0xEE,0xF5,0xD6,0x6B,0x34,0x12,0xA3,0x40,0x1D,0xDD,0x1C,0x85,0xA0,0x12,0xDF,0x30,0xB4,0xD9,0xE4,0xF2,0x55,
0xD3,0x87,0x01,0xD4,0x96,0x50,0x17,0xBE,0x40,0xD4,0xCF,0xE2,0x14,0x81,0x6E,0x34,0x2D,0x27,0x23,0x0E,0xC0,0x0C,0x8E,0xDE,0xD8,0xF4,0x3F,0xF3,0x8D,0x66,0xB3,0x4B,
0xBC,0x49,0xFD,0xBA,0x6F,0x97,0xAA,0x78,0xFE,0x9E,0x6B,0x8E,0x53,0x37,0xF4,0xBB,0xFE,0x54,0xFD,0x99,0xDE,0x47,0xA8,0x0D,0xC9,0x24,0xF6,0xE3,0xBF,0xFE,0xF4,0xCD,
0xD1,0xF4,0x82,0xA6,0x79,0x09,0x8D,0xC2,0x8C,0x0D,0xDB,0xB3,0x82,0x48,0xED,0xDF,0x9E,0x73,0xAC,0xD6,0x6B,0x34,0xE1,0x5F,0xBC,0xAA,0x0E,0x72,0xF4,0x3F,0x12,0x48,
0xE8,0xE8,0x1C,0xE6,0xA2,0x9D,0x58,0x76,0xCE,0x23,0x0E,0xF2,0x28,0x5D,0x83,0x2E,0x1F,0x91,0xDD,0xB3,0xEC,0x4F,0xBE,0x93,0xA6,0x39,0x89,0x5C,0xB6,0x4F,0x3C,0x7B,
0x7E,0x75,0x9A,0xCD,0x7D,0xC4,0x5F,0x9D,0x72,0xA9,0xC3,0x3F,0x90,0x8D,0x54,0xFA,0x33,0xCD,0xD1,0xF4,0x64,0x63,0x7B,0x4B,0x33,0x0C,0x0E,0xF8,0x3B,0x73,0x9F,0x5E,
0x74,0xE1,0x73,0x94,0x53,0xD0,0x52,0x51,0xC2,0x09,0x32,0xB7,0x20,0x6B,0x35,0x9A,0xD7,0xA8,0x35,0xA3,0x81,0xBD,0x87,0xA0,0x5E,0x6B,0xE2,0x1D,0x31,0x7A,0xC7,0x79,
0x38,0xFA,0xAE,0xFA,0x62,0x90,0x51,0x16,0x23,0x73,0x37,0xE3,0x4A,0x3D,0x4F,0x54,0x93,0x4F,0x1D,0xB2,0x31,0xB4,0x2B,0x6F,0x75,0xF6,0xE7,0xCA,0x33,0xF7,0x23,0x59,
0xAC,0xD5,0xDA,0x5F,0xC4,0x77,0xC5,0x05,0xAA,0xFC,0x36,0xA2,0x70,0x2B,0xD0,0xDA,0x62,0x50,0x77,0x21,0x5D,0xAE,0xED,0x9C,0x93,0xDC,0xE9,0x3B,0xE2,0x35,0x54,0x90,
0x74,0xAD,0x45,0x3C,0x51,0xEF,0x79,0x10,0xB3,0xED,0xC2,0x90,0xB8,0xEF,0xCE,0xB3,0x59,0xAB,0xA3,0x58,0x9E,0x7B,0x14,0x1E,0x4E,0x69,0xDA,0x0E,0xC4,0x2F,0xCE,0xB6,
0xBB,0x6C,0xF5,0x95,0x33,0xC1,0xE1,0xD5,0x24,0xE1,0x0B,0x47,0x3B,0xAB,0x91,0x8D,0xD9,0x23,0x85,0xCB,0x0E,0x4F,0xE9,0xA6,0x68,0x23,0xAF,0xB4,0xA8,0x6A,0x38,0x05,
0xC1,0x2A,0x93,0xFB,0xCC,0xEA,0xED,0x26,0xE0,0x48,0x04,0x8C,0x92,0xA7,0xEC,0x76,0x93,0xEC,0x35,0x9A,0xCD,0x67,0x73,0xEC,0x9A,0xDA,0xBF,0xFF,0xD9,};

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