Русификация библиотеки Adafruit-GFX и вывод русских букв на дисплей в кодировке UTF-8 из Arduino IDE

arduinec
Offline
Зарегистрирован: 01.09.2015

Краткие итоги предыдущих 50 постов

Для русификации библиотеки Adafruit-GFX требуется:
- скачать любой из приведённых ниже (или выше) архивов;
- заменить файл glcdfont.c в Adafruit-GFX;
- добавить функцию utf8rus() в скетч;
- вставить в начале скетча команду: display.cp437(true);

Применять функцию utf8rus() можно внутри команд печати строк:
display.println(utf8rus("Тест"));

В архивах приводятся примеры, которые различаются по виду дисплея:

0.96" OLED 128x64
https://yadi.sk/d/kdjXv7-ziwFL5

2.8" TFT Touch Shield 320x240
https://yadi.sk/d/Li8N0FDUoRH3z

Nokia 5110 84x48
https://yadi.sk/d/yJOAk50yoTxF4

Более подробная информация в предыдущих постах.
 

SLOM
Offline
Зарегистрирован: 06.11.2014

подскажите как русифицировать

светодиодную точечную матрицу наподобии: 

только не ргб а одноцвет, красного цвета. 

пробовал в свой скетч добавить нужный код, и заменял файл, но результата нет. 

вот мой код

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>


int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf <a href="http://arduino.cc/en/Reference/SPI" title="http://arduino.cc/en/Reference/SPI" rel="nofollow">http://arduino.cc/en/Reference/SPI</a> )
int numberOfHorizontalDisplays = 1;
int numberOfVerticalDisplays = 4;

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}



String tape = "ПРИВЕТ";
int wait = 100; // In milliseconds

int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels

void setup() {
  
  matrix.setIntensity(3); // Use a value between 0 and 15 for brightness
  matrix.setRotation(matrix.getRotation()+1); //1 - 90  2 - 180   3 - 270
  

}
void loop() {
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) 
       {
    matrix.fillScreen(LOW);

    int letter = i / width;
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2; // center the text vertically

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
      }
      letter--;
      x -= width;
    }
    matrix.write(); // Send bitmap to display
    delay(wait);
  }
}

 

sirota
Offline
Зарегистрирован: 18.08.2015

А при чем тут Adafruit?

SLOM
Offline
Зарегистрирован: 06.11.2014

эммм, а разве не на этой библиотеке оно работает? :)

тогда что мне может помоч? 

sirota
Offline
Зарегистрирован: 18.08.2015

Что работает на этой библиотеке? Я вообще в вашем коде не вижу вызова ни adafruit ни уж тем более utf8. Прочтите примеры для того что бы понять как работает данная функция и зачем вообще адафруит. У вас в используется другая бюиблиотека для работы с эканом.

rust777
Offline
Зарегистрирован: 19.02.2016

Дисплей 1.8 TFT. запустился на русском 

#include <TFT.h>
#include <SPI.h>

// пины дисплея
#define cs   10 //TFT
#define dc   9
#define rst  8
TFT TFTscreen = TFT(cs, dc, rst);

void setup() 
{
  TFTscreen.begin();
  TFTscreen.setRotation(2); // повернуть экран 
  TFTscreen.background(0, 0, 0); // очищаем экран, заливая его черным цветом
  delay(500);
}

void loop() 
{

TFTscreen.setTextSize(1);
  TFTscreen.stroke(200, 150, 150);     // устанавливаем  цвет кисти серый
  TFTscreen.line(0, 42, 44, 42);       // линия до 
  TFTscreen.text(0, 46, 37);
  TFTscreen.print(utf8rus("Улица"));
  TFTscreen.line(78, 42, 128, 42);     // линия после

TFTscreen.setTextSize(1);
  TFTscreen.stroke(200, 150, 150);      // устанавливаем  цвет кисти серый
  TFTscreen.line(0, 95, 44, 95);        // линия до
  TFTscreen.text(0, 46, 90);
  TFTscreen.print(utf8rus("Дом"));
  TFTscreen.line(70, 95, 128, 95);      // линия после
  
}

https://yadi.sk/d/VE6es8E2pLkrE

 

rust777
Offline
Зарегистрирован: 19.02.2016

Вот результат

rust777
Offline
Зарегистрирован: 19.02.2016

Werewolf
Offline
Зарегистрирован: 06.01.2016

Не получается вывести символ градусы (176, \xB0)на дисплей.

Функция display.cp437(true) не работает, на нее ругается компилятор.

Заменил в библиотеке cp437=false на сp437=true - такая же фигня....

arduinec
Offline
Зарегистрирован: 01.09.2015

Werewolf пишет:

Не получается вывести символ градусы (176, \xB0)на дисплей.

Функция display.cp437(true) не работает, на нее ругается компилятор.

Заменил в библиотеке cp437=false на сp437=true - такая же фигня....

Возможно у вас старая библиотека и для неё cp437(true) не требуется. Более подробное описание в посте #15 данной темы.

poiskxxx
Offline
Зарегистрирован: 01.03.2016

Всем привет.
Ситуация такая:
Купил дисплей http://ru.aliexpress.com/item/2-8-Inch-TFT-LCD-Display-Touch-Screen-Module-for-Arduino-UNO-with-SD-Solt/32435462284.html
Помучился с ним не много, но всетаки удалось его запустить на Adafruit (новая)
 

  uint16_t identifier = tft.readID();
  if(identifier==0x0101)  
      identifier=0x9341;  

Хотя у продавца он идет как ILI9325.
Озадачился выводом русских букв на нем, ваша функция работает, буквы выводятся.
Но размер шрифта надо больше, если их увеличивать (tft.setTextSize(4)), то они становятся из квадратиков. А хочется красивых, гладких :)
В этой библиотеке есть папка Adafruit-GFX-Library-master\fontconvert. Вроде можно делать свои шрифты, но я никак не смог запустить все это дело. Я так понимаю это для Linux (для меня пока это темный лес). Качал Cygwin - тоже никак….

Чего я добился:
 - все таки научился делать шрифты, но для этого нужно старую Adafruit и Arduino 1.0.6
https://vk.com/doc61477137_382581111?hash=a1a4b984de0f6d211f&dl=fbf1c73d...
https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
 - могу делать цифры и англ буквы любого размера из любого системного шрифта ttf. Гладкие :)
 - символы в шрифте можно сделать одинаковой и разной ширины

программа GLCDFontCreator2
https://code.google.com/archive/p/glcd-arduino/downloads

В этой старой библиотеке Adafruit нравится обновление показаний на дисплее, плавное.
А в новой Adafruit нужно затирать показания прямоугольником с цветом фона, и получается мигание.

Ну а теперь, собственно, вопрос:

В файле шрифтов есть секция

шрифт - буквы разной ширины

#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef MICRORUS_H
#define MICRORUS_H

#define MICRORUS_WIDTH 3
#define MICRORUS_HEIGHT 6

static uint8_t microRus[] PROGMEM = {
    0x0C, 0x94, // size           <<<<----------------------------  как вычисляется вот это???
    0x03, // width
    0x06, // height
    0x20, // first char
    0xA0, // char count
    
    // char widths
    0x03, 0x01, 0x04, 0x05, 0x03, 0x05, 0x04, 0x02, 0x02, 0x02, 
    0x03, 0x03, 0x02, 0x03, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03,
    0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x02, 0x03, 0x03, 
    0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
    0x03, 0x01, 0x02, 0x03, 0x03, 0x05, 0x04, 0x03, 0x03, 0x03, 
    0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x02, 
    0x03, 0x02, 0x05, 0x05, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 
    0x02, 0x03, 0x03, 0x01, 0x02, 0x03, 0x02, 0x05, 0x03, 0x03, 
    0x03, 0x03, 0x02, 0x03, 0x03, 0x03, 0x03, 0x05, 0x03, 0x03, 
    0x03, 0x03, 0x01, 0x03, 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 
    0x05, 0x03, 0x03, 0x03, 0x05, 0x05, 0x03, 0x04, 0x03, 0x03, 
    0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 
    0x04, 0x04, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 
    0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x05, 0x05, 0x04, 0x04, 
    0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 
    0x05, 0x03, 0x04, 0x04, 0x03, 0x03, 0x05, 0x03, 0x03, 0x03, 
    
    
    // font data
    0x00, 0x00, 0x00, // пробел
    0x5C, // 33
    0x08, 0x04, 0x08, 0x04, // 34
    0x28, 0x7C, 0x28, 0x7C, 0x28, // 35
    0x48, 0x7C, 0x24, // 36
    0x0C, 0x4C, 0x38, 0x64, 0x60, // 37
    0x28, 0x54, 0x48, 0x20, // 38
    0x08, 0x04, // 39
и т д .................................

    0x0C, 0x94, // size           <<<<----------------------------  как вычисляется вот это???

 

Werewolf
Offline
Зарегистрирован: 06.01.2016

Похоже символ "градусы" можно вывести только в стандартном шрифте из библиотеки.

Ни один шрифт из папки Fonts его не поддерживает.....

rashn
Offline
Зарегистрирован: 22.11.2013

Добрый день, друзья!

У меня вопрос - кто нибудь пробовал подцеплять сконверченные самостоятельно шрифты?

Я создал файл с русским шрифтом Helvetica - но он упорно не хочет отображать буквы, хотя руссификация по методу ОП проведена успешно - системный шрифт отображается на русском.

Подскажите что делать?

 

sirota
Offline
Зарегистрирован: 18.08.2015

Если с коды символов точно соответствуют, то должно выводится. Я пробовал - у меня пошло. Размерность шрифта указана верно?

urban111988
Offline
Зарегистрирован: 04.05.2016

Огромная благодарность автору, удалось подружить сенсорный TFT LCD 2.4 с рускими буковками.

Только вот незадача, недавно пересел на Atmel Studio 7.0, и при компиляции скетчей в этой студии на экран выводятся крокозябры, вместо Русских букв. Не знаете как помочь? Пробовал в настройках Tools-Options-Text Editor-General играться с галочкой auto detect utf-8 encoding without signature, не помогает.

 

arduinec
Offline
Зарегистрирован: 01.09.2015

urban111988 пишет:

Только вот незадача, недавно пересел на Atmel Studio 7.0, и при компиляции скетчей в этой студии на экран выводятся крокозябры, вместо Русских букв.

Возможно там другая кодировка русских букв (не UTF-8). У меня Atmel Studio не установлена, поэтому проверить не могу.

urban111988
Offline
Зарегистрирован: 04.05.2016

Да, так и есть, долго не мог понять где выставляется кодировка в Atmel Studio, оказывается надо для каждого сохраняемого файла ее выставлять в Files-Advanced Save Options. Выставил Utf-8, и все заработало как миленькое :) Еще раз спасибо.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Мож я плохо искал, но мне не удалось найти GFX шрифтов с кириллицей для Adafruit. Повозился с Autoit, написал скрипт для формирования параметров и массива символов. Пока только один шрифт. Вывод на экран через функцию utf8rus от arduinec. Шрифт на основе Droid Serif Bold, таблица ASCII (кодировка Windows-1251).

http://vk.com/club112518686

const uint8_t DroidSerifBold18pt8bBitmaps[] PROGMEM = {
 0xFF, 0xFE, 0x92, 0x41, 0x74, 0xCD, 0xDF, 0xBB, 0x34, 0x51, 0x00, 0x09,
 0x02, 0x40, 0x90, 0x2C, 0x7F, 0xC6, 0x81, 0x20, 0x58, 0xFF, 0x8D, 0x02,
 0x40, 0x90, 0x24, 0x00, 0x08, 0x3E, 0x6B, 0xCB, 0xE8, 0xF8, 0x7E, 0x0F,
 0xCF, 0xCB, 0xEB, 0x3C, 0x08, 0x08, 0x78, 0x23, 0x31, 0x0C, 0xCC, 0x33,
 0x20, 0xCD, 0x83, 0x34, 0x07, 0xB7, 0x80, 0xB3, 0x06, 0xCC, 0x13, 0x30,
 0xCC, 0xC2, 0x33, 0x10, 0x78, 0x1F, 0x01, 0xCC, 0x0C, 0x60, 0x73, 0x03,
 0xB0, 0x0F, 0x3C, 0xF9, 0x8C, 0xEC, 0xE3, 0xC7, 0x1E, 0x38, 0x78, 0xE3,
 0xC3, 0xE7, 0x80, 0xDF, 0xB5, 0x00, 0x08, 0xCC, 0xC6, 0x73, 0x9C, 0xE7,
 0x39, 0xC6, 0x30, 0xC3, 0x08, 0x86, 0x18, 0x63, 0x1C, 0xE7, 0x39, 0xCE,
 0x73, 0x19, 0x98, 0x80, 0x18, 0x5A, 0xF7, 0x18, 0xF7, 0x5A, 0x18, 0x10,
 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10, 0xDF, 0xB5, 0x00, 0xFF, 0x5D,
 0x00, 0x08, 0xC4, 0x21, 0x18, 0x84, 0x21, 0x18, 0x84, 0x23, 0x10, 0x3C,
 0x66, 0x66, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x66, 0x66, 0x3C,
 0x1C, 0x3C, 0xFC, 0xDC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
 0x7F, 0x7C, 0xE7, 0xE7, 0xC7, 0x07, 0x06, 0x0C, 0x18, 0x10, 0x21, 0x43,
 0xFF, 0xFF, 0x7C, 0xE7, 0xE7, 0x47, 0x07, 0x0E, 0x3C, 0x0E, 0x07, 0x47,
 0xC7, 0xCE, 0x7C, 0x0E, 0x07, 0x07, 0x83, 0xC2, 0xE3, 0x71, 0x39, 0x1C,
 0xFF, 0x87, 0x03, 0x81, 0xC3, 0xF8, 0x7E, 0x7E, 0x42, 0x40, 0x40, 0xFC,
 0x0E, 0x07, 0x07, 0x07, 0xC7, 0xCE, 0x7C, 0x1E, 0x37, 0x63, 0x60, 0xE0,
 0xFE, 0xE6, 0xE7, 0xE7, 0xE7, 0x67, 0x66, 0x3C, 0xFF, 0xFF, 0x82, 0x82,
 0x06, 0x04, 0x0C, 0x08, 0x08, 0x18, 0x10, 0x30, 0x20, 0x3C, 0x66, 0xC7,
 0xC7, 0xE6, 0x7C, 0x3C, 0x6E, 0xE7, 0xC7, 0xE7, 0x66, 0x3C, 0x3C, 0x66,
 0xE6, 0xE7, 0xE3, 0xE3, 0xE7, 0x7F, 0x07, 0x06, 0x86, 0xCC, 0x78, 0x5D,
 0x00, 0x02, 0xF8, 0x5D, 0x00, 0x06, 0xFD, 0xA8, 0x01, 0x07, 0x1C, 0x70,
 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xE0,
 0x38, 0x0E, 0x03, 0x0E, 0x38, 0xE0, 0x80, 0x7C, 0xE6, 0xE7, 0x07, 0x07,
 0x06, 0x0C, 0x18, 0x18, 0x00, 0x10, 0x38, 0x10, 0x03, 0xE0, 0x18, 0x30,
 0xC0, 0x31, 0x00, 0x36, 0x1F, 0x68, 0xC6, 0x71, 0x98, 0xE6, 0x33, 0xCC,
 0x67, 0x98, 0xCB, 0x3B, 0x96, 0x39, 0xC6, 0x00, 0x04, 0x00, 0x06, 0x06,
 0x07, 0xF0, 0x03, 0x00, 0x1E, 0x00, 0x58, 0x01, 0x70, 0x0D, 0xC0, 0x27,
 0x00, 0x8E, 0x06, 0x38, 0x1F, 0xE0, 0xC1, 0xC3, 0x07, 0x08, 0x1C, 0xF8,
 0xFC, 0xFF, 0x83, 0x9C, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x9C, 0x3F, 0x83,
 0x8E, 0x38, 0x73, 0x87, 0x38, 0x73, 0x8E, 0xFF, 0xC0, 0x1F, 0x8E, 0x77,
 0x0D, 0x82, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x07, 0x04, 0xF7,
 0x1F, 0x80, 0xFF, 0x81, 0xC7, 0x0E, 0x1C, 0x70, 0x73, 0x83, 0x9C, 0x1C,
 0xE0, 0xE7, 0x07, 0x38, 0x39, 0xC3, 0x8E, 0x1C, 0x71, 0xCF, 0xF8, 0x00,
 0xFF, 0xE3, 0x86, 0x38, 0x23, 0x80, 0x38, 0x03, 0x80, 0x3F, 0xC3, 0x80,
 0x38, 0x03, 0x80, 0x38, 0x13, 0x83, 0xFF, 0xF0, 0xFF, 0xE7, 0x0C, 0xE0,
 0x9C, 0x03, 0x80, 0x70, 0x0F, 0xF1, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C,
 0x0F, 0xE0, 0x0F, 0xC3, 0x8E, 0x70, 0x66, 0x04, 0xE0, 0x0E, 0x00, 0xE0,
 0x0E, 0x1F, 0xE0, 0xE6, 0x0E, 0x70, 0xE3, 0x8E, 0x0F, 0xC0, 0xFE, 0xFE,
 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0F, 0xFE, 0x1C,
 0x1C, 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xCF, 0xEF, 0xE0, 0xFE,
 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xCF, 0xE0, 0x7F,
 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
 0x1C, 0x1C, 0x38, 0xF0, 0xFE, 0xFC, 0xE1, 0xC3, 0x86, 0x0E, 0x30, 0x39,
 0x00, 0xEC, 0x03, 0xF8, 0x0E, 0xE0, 0x39, 0xC0, 0xE7, 0x83, 0x8E, 0x0E,
 0x1C, 0xFE, 0x3C, 0xFE, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E,
 0x01, 0xC0, 0x38, 0x07, 0x04, 0xE0, 0x9C, 0x3F, 0xFE, 0xF8, 0x0F, 0x9E,
 0x0F, 0x0B, 0x07, 0x85, 0xC3, 0xC2, 0xE2, 0xE1, 0x31, 0x70, 0x9D, 0xB8,
 0x4E, 0x9C, 0x23, 0x4E, 0x11, 0xE7, 0x08, 0xE3, 0x84, 0x31, 0xCF, 0x99,
 0xF8, 0xF8, 0x7C, 0xE0, 0x43, 0xC1, 0x0B, 0x84, 0x2E, 0x10, 0x9C, 0x42,
 0x39, 0x08, 0x74, 0x21, 0xD0, 0x83, 0xC2, 0x07, 0x08, 0x1C, 0xF8, 0x30,
 0x1F, 0x83, 0x9C, 0x70, 0xEE, 0x06, 0xE0, 0x7E, 0x07, 0xE0, 0x7E, 0x07,
 0xE0, 0x7E, 0x06, 0x70, 0xE3, 0x9C, 0x1F, 0x80, 0xFF, 0x87, 0x38, 0xE3,
 0x9C, 0x73, 0x8E, 0x73, 0x8F, 0xC1, 0xC0, 0x38, 0x07, 0x00, 0xE0, 0x1C,
 0x0F, 0xE0, 0x1F, 0x83, 0x9C, 0x70, 0xEE, 0x06, 0xE0, 0x7E, 0x07, 0xE0,
 0x7E, 0x07, 0xE0, 0x7E, 0x07, 0x70, 0xE3, 0x9C, 0x1F, 0x80, 0x70, 0x07,
 0x00, 0x38, 0x01, 0xE0, 0xFF, 0x81, 0xCF, 0x0E, 0x38, 0x71, 0xC3, 0x8E,
 0x1C, 0xE0, 0xFE, 0x07, 0x70, 0x39, 0xC1, 0xCE, 0x0E, 0x38, 0x71, 0xCF,
 0xE7, 0x80, 0x3E, 0x33, 0xB0, 0xDC, 0x4F, 0x03, 0xE0, 0xFC, 0x1F, 0x03,
 0xE0, 0xF0, 0x7C, 0x67, 0xE0, 0xFF, 0xF9, 0xCE, 0x38, 0xC7, 0x10, 0xE0,
 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x03, 0xF8, 0xFE,
 0x7C, 0xE0, 0x43, 0x81, 0x0E, 0x04, 0x38, 0x10, 0xE0, 0x43, 0x81, 0x0E,
 0x04, 0x38, 0x10, 0xE0, 0x43, 0x83, 0x07, 0x18, 0x0F, 0xC0, 0xFC, 0x7B,
 0x81, 0x8E, 0x08, 0x70, 0x41, 0x86, 0x0E, 0x20, 0x73, 0x01, 0xD0, 0x0E,
 0x80, 0x3C, 0x01, 0xC0, 0x0E, 0x00, 0x20, 0x00, 0xFE, 0x30, 0xF9, 0xC1,
 0x81, 0x0E, 0x0E, 0x18, 0x30, 0xF0, 0xC1, 0xC7, 0xC4, 0x0E, 0x2E, 0x20,
 0x33, 0x73, 0x01, 0xD9, 0xD0, 0x0E, 0x8E, 0x80, 0x74, 0x34, 0x01, 0xC1,
 0xE0, 0x0E, 0x0E, 0x00, 0x70, 0x30, 0x00, 0xFC, 0xF1, 0xC3, 0x0E, 0x10,
 0x39, 0x80, 0xF8, 0x07, 0x80, 0x1C, 0x01, 0xF0, 0x0B, 0x80, 0x8E, 0x0C,
 0x38, 0xC1, 0xCF, 0x9F, 0x80, 0xFE, 0xF9, 0xC1, 0x0E, 0x18, 0x38, 0x81,
 0xCC, 0x07, 0x40, 0x3E, 0x00, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC0, 0x0E,
 0x01, 0xFC, 0x00, 0xFF, 0xF0, 0x78, 0x3A, 0x1C, 0x07, 0x03, 0x81, 0xE0,
 0x70, 0x38, 0x0E, 0x17, 0x07, 0x83, 0xFF, 0xC0, 0xFF, 0x39, 0xCE, 0x73,
 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9F, 0x86, 0x10, 0x84, 0x30, 0x84, 0x21,
 0x0C, 0x21, 0x08, 0x61, 0xF9, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
 0x9C, 0xFF, 0x18, 0x18, 0x3C, 0x24, 0x24, 0x42, 0x42, 0xC3, 0xFF, 0xE6,
 0x30, 0x3E, 0x33, 0x99, 0xC0, 0xE3, 0xF7, 0x3B, 0x9D, 0xCE, 0xEF, 0x39,
 0xC0, 0xF0, 0x1C, 0x07, 0x01, 0xC0, 0x77, 0x1E, 0xE7, 0x1D, 0xC7, 0x71,
 0xDC, 0x77, 0x1D, 0xC7, 0x6B, 0xB9, 0xC0, 0x3E, 0x77, 0xE3, 0xE0, 0xE0,
 0xE0, 0xE0, 0xE1, 0x73, 0x3E, 0x07, 0x80, 0x70, 0x0E, 0x01, 0xC3, 0xB8,
 0xEF, 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0x73, 0x8E, 0x71, 0xC7, 0x58, 0x73,
 0xC0, 0x3C, 0x66, 0xE7, 0xE7, 0xFF, 0xE0, 0xE0, 0xE0, 0x72, 0x3E, 0x1F,
 0x1C, 0xCE, 0x07, 0x0F, 0xE1, 0xC0, 0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07,
 0x03, 0x87, 0xF0, 0x3F, 0xDD, 0xD6, 0x31, 0x8C, 0x77, 0x0F, 0x82, 0x01,
 0x80, 0x7F, 0x0F, 0xEE, 0x3B, 0x06, 0xC3, 0x1F, 0x80, 0xF0, 0x1C, 0x07,
 0x01, 0xC0, 0x7F, 0x1F, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE,
 0x73, 0xBE, 0xF0, 0x23, 0x88, 0x00, 0x79, 0xCE, 0x73, 0x9C, 0xE7, 0x3B,
 0xE0, 0x11, 0xC4, 0x00, 0x3C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3B,
 0xB8, 0xF0, 0x0E, 0x01, 0xC0, 0x38, 0x07, 0x3C, 0xE3, 0x1C, 0xC3, 0xB0,
 0x7E, 0x0F, 0xE1, 0xDC, 0x39, 0xC7, 0x3D, 0xF3, 0xC0, 0xF3, 0x9C, 0xE7,
 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x7C, 0xFF, 0x78, 0xFF, 0xF9, 0xCE, 0x73,
 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xF7,
 0xBC, 0xFF, 0x1F, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73,
 0xBE, 0xF0, 0x3E, 0x3B, 0xB8, 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0x77,
 0x1F, 0x00, 0x73, 0x86, 0xB8, 0xE3, 0x9C, 0x73, 0x8E, 0x71, 0xCE, 0x39,
 0xC7, 0x3D, 0xC7, 0x70, 0xE0, 0x1C, 0x03, 0x81, 0xF8, 0x00, 0x39, 0xEE,
 0xB3, 0x8E, 0x71, 0xCE, 0x39, 0xC7, 0x38, 0xE7, 0x1C, 0x77, 0x87, 0x70,
 0x0E, 0x01, 0xC0, 0x38, 0x1F, 0xC0, 0xE7, 0x7F, 0x73, 0x70, 0x70, 0x70,
 0x70, 0x70, 0x70, 0xFC, 0x7D, 0x9F, 0x17, 0x07, 0xC7, 0xC3, 0xE3, 0xC6,
 0xF8, 0x31, 0xCF, 0xDC, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x4F, 0xF7, 0x9C,
 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x7F, 0x8F, 0x70, 0xF9,
 0xEE, 0x11, 0xC2, 0x18, 0xC3, 0x90, 0x72, 0x06, 0xC0, 0xF0, 0x1E, 0x01,
 0xC0, 0xF9, 0x3E, 0xE3, 0x11, 0xCE, 0x23, 0x9C, 0xC3, 0x3D, 0x06, 0x9A,
 0x0F, 0x34, 0x1E, 0x78, 0x1C, 0xE0, 0x30, 0xC0, 0x7D, 0xE3, 0x8C, 0x18,
 0x80, 0xD0, 0x0E, 0x00, 0xF0, 0x0B, 0x81, 0x1C, 0x30, 0xEF, 0xBF, 0xFB,
 0xDC, 0x27, 0x08, 0xC6, 0x39, 0x0E, 0x41, 0xE0, 0x78, 0x0E, 0x03, 0x00,
 0xC0, 0x30, 0x18, 0x3C, 0x00, 0xFF, 0xC7, 0x8E, 0x1C, 0x1C, 0x38, 0x38,
 0x71, 0xE1, 0xFF, 0x1E, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x70, 0x70, 0x70,
 0xE1, 0xC3, 0x87, 0x0E, 0x0F, 0xFF, 0xFF, 0xC0, 0xF0, 0x70, 0xE1, 0xC3,
 0x87, 0x0E, 0x07, 0x1C, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x78, 0x70, 0x99,
 0x0E,
 0xFF, 0xE3, 0x39, 0x88, 0xE2, 0x23, 0x88, 0x0E, 0x00, 0x3F, 0xC0, 0xF3,
 0x83, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x86, 0x3F, 0xB0, 0x07,
 0x01, 0x80, 0xC0, 0x00, 0xFF, 0xCE, 0x33, 0x84, 0xE1, 0x38, 0x0E, 0x03,
 0x80, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0xFE, 0x00, 0xDF, 0xB5, 0x00,
 0x0E, 0x0C, 0x18, 0x00, 0xFF, 0x71, 0x71, 0x70, 0x70, 0x70, 0x70, 0x70,
 0x70, 0xF8, 0xCD, 0xDF, 0xBB, 0x34, 0x51, 0x00, 0xE7, 0x3F, 0x39, 0xF9,
 0xCE, 0x38, 0x70, 0x40, 0x8F, 0xFF, 0xCE, 0x1C, 0x38, 0x70, 0x40, 0x81,
 0x02, 0x04, 0x08, 0x38, 0x70, 0x47, 0xFF, 0xE7, 0x0E, 0x08, 0x10, 0x70,
 0xE7, 0xFF, 0xE2, 0x0E, 0x1C, 0x1E, 0x33, 0x33, 0x70, 0x70, 0xFC, 0x70,
 0x70, 0xFC, 0x70, 0x71, 0x3B, 0x1E, 0x78, 0x20, 0x06, 0x62, 0x00, 0x33,
 0x30, 0x01, 0x99, 0x00, 0x0C, 0xD8, 0x00, 0x66, 0x80, 0x01, 0xED, 0xE3,
 0xC0, 0x59, 0xB3, 0x06, 0xCD, 0x98, 0x26, 0x6C, 0xC3, 0x33, 0x66, 0x11,
 0x9B, 0x31, 0x07, 0x8F, 0x00, 0x3F, 0xF8, 0x04, 0x70, 0x02, 0x38, 0x01,
 0x1C, 0x00, 0x8E, 0x00, 0x47, 0x00, 0x23, 0xF8, 0x31, 0xCE, 0x10, 0xE3,
 0x88, 0x71, 0xC4, 0x38, 0xFE, 0x1C, 0xEE, 0x3F, 0xE0, 0x36, 0xEC, 0xE6,
 0x30, 0xFC, 0xFC, 0x0E, 0x1C, 0x03, 0x87, 0x00, 0xE1, 0xC0, 0x38, 0x70,
 0x0E, 0x1C, 0x03, 0xFF, 0xF0, 0xE1, 0xCE, 0x38, 0x71, 0xCE, 0x1C, 0x73,
 0x87, 0x1C, 0xE1, 0xCE, 0xFC, 0xFF, 0x00, 0x01, 0xC0, 0x0C, 0x00, 0xC0,
 0x00, 0x0F, 0xC7, 0x1C, 0x78, 0xE2, 0x07, 0x20, 0x39, 0x01, 0xD0, 0x0F,
 0xC0, 0x77, 0x83, 0x9C, 0x1C, 0x60, 0xE3, 0x07, 0x1C, 0xFC, 0x78, 0xFF,
 0xE0, 0xCE, 0x60, 0x8E, 0x20, 0x8E, 0x20, 0x0E, 0x00, 0x0F, 0xF0, 0x0F,
 0x38, 0x0E, 0x1C, 0x0E, 0x1C, 0x0E, 0x1C, 0x0E, 0x1C, 0x0E, 0x1C, 0x3F,
 0xFF, 0xFE, 0xFE, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xC3, 0x83, 0x87, 0x07,
 0x0E, 0x0E, 0x1C, 0x1C, 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xCF,
 0xFF, 0xE0, 0x70, 0x00, 0x40, 0x00, 0x80, 0x01, 0x00, 0x78, 0x0E, 0x0F,
 0xE0, 0xE0, 0x3F, 0x8F, 0xF3, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7,
 0x39, 0xDF, 0x70, 0x1C, 0x07, 0x01, 0x80, 0xC0, 0x2B, 0x7E, 0xC0, 0xDF,
 0xB5, 0x00, 0x22, 0x8B, 0x37, 0x7E, 0xEC, 0xC0, 0xCD, 0xDF, 0xBB, 0x34,
 0x51, 0x00, 0x7B, 0xFF, 0xFF, 0xFD, 0xE0, 0xFF, 0x80, 0xFF, 0xFF, 0xC0,
 0xFE, 0x0C, 0x8C, 0x62, 0x32, 0x88, 0xAA, 0x22, 0xC8, 0x89, 0x60, 0x3F,
 0xE0, 0x13, 0x80, 0x27, 0x00, 0x4E, 0x00, 0x9F, 0xC3, 0x39, 0xC4, 0x73,
 0x88, 0xE7, 0xF1, 0xCF, 0xC7, 0xF0, 0xC6, 0x73, 0x76, 0xC0, 0xFB, 0xE0,
 0xE3, 0x81, 0xC7, 0x03, 0x8E, 0x07, 0xFF, 0xCE, 0x39, 0xDC, 0x73, 0xB8,
 0xE7, 0x71, 0xCF, 0xF7, 0xF0, 0x07, 0x00, 0xC0, 0x30, 0x00, 0x0F, 0x9E,
 0xE2, 0xDC, 0x83, 0xA0, 0x7E, 0x0E, 0xE1, 0xDC, 0x39, 0xC7, 0x3D, 0xF3,
 0xC0, 0x78, 0x07, 0x03, 0xF8, 0x1C, 0x03, 0xF8, 0x7F, 0x8E, 0x71, 0xCE,
 0x39, 0xC7, 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0xFB, 0xC0, 0xFB, 0xEE, 0x39,
 0xC7, 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0x73, 0x8E, 0x71, 0xDF, 0xFC, 0x38,
 0x02, 0x00, 0x40, 0x08, 0x00,
 0x30, 0xC3, 0x9C, 0x1F, 0x80, 0x00, 0xFD, 0xF7, 0x86, 0x38, 0x43, 0x84,
 0x1C, 0xC1, 0xC8, 0x0C, 0x80, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60,
 0x3C, 0x00, 0x61, 0x9C, 0xE3, 0xF0, 0x00, 0xFB, 0xDC, 0x27, 0x08, 0xC6,
 0x39, 0x0E, 0x41, 0xE0, 0x78, 0x0E, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x3C,
 0x00, 0x7F, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
 0x1C, 0x1C, 0x1C, 0x1C, 0x38, 0xF0, 0xFF, 0x38, 0x61, 0xCF, 0xF0, 0x00,
 0x40, 0x3F, 0xFC, 0xE0, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x0E, 0x03,
 0x80, 0xE0, 0x38, 0x0E, 0x0F, 0xE0, 0xFE, 0x1F, 0xC0, 0x3C, 0x66, 0x66,
 0x60, 0x70, 0x7C, 0xCE, 0xC7, 0xE3, 0x7B, 0x1E, 0x0E, 0x26, 0x66, 0x66,
 0x3C, 0x0C, 0xC0, 0xCC, 0x00, 0x0F, 0xFE, 0x38, 0x63, 0x82, 0x38, 0x03,
 0x80, 0x38, 0x03, 0xFC, 0x38, 0x03, 0x80, 0x38, 0x03, 0x81, 0x38, 0x3F,
 0xFF, 0x0F, 0x81, 0x83, 0x18, 0x0C, 0x8E, 0x28, 0x88, 0xCC, 0x06, 0x40,
 0x33, 0x01, 0x98, 0x8A, 0x78, 0x98, 0x0C, 0x60, 0xC0, 0xF8, 0x00, 0x1F,
 0x8E, 0x77, 0x0D, 0x82, 0xE0, 0x38, 0x0F, 0xE3, 0x80, 0xE0, 0x38, 0x07,
 0x04, 0xF7, 0x1F, 0x80, 0x33, 0x66, 0xEE, 0xCC, 0xEE, 0x66, 0x33, 0xFE,
 0x04, 0x08, 0x10, 0x20,
 0x0F, 0x81, 0x83, 0x18, 0x0C, 0xFE, 0x29, 0x08, 0xC8, 0xC6, 0x78, 0x32,
 0x61, 0x91, 0x8B, 0xC6, 0x98, 0x0C, 0x60, 0xC0, 0xF8, 0x00, 0x66, 0xCC,
 0x07, 0xF3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x7F,
 0x76, 0xE3, 0xB7, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x10, 0x10, 0x10,
 0x00, 0xFF, 0xFE, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1,
 0xCF, 0xE0, 0x23, 0x88, 0x00, 0x79, 0xCE, 0x73, 0x9C, 0xE7, 0x3B, 0xE0,
 0x01, 0x01, 0xFF, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8,
 0xE7, 0x73, 0xB9, 0xDC, 0xEE, 0x77, 0x3B, 0x9D, 0xCE, 0xFB, 0x5D, 0xE0,
 0x18, 0x0E, 0x03, 0x00, 0x7F, 0xFE, 0x4F, 0x93, 0xE4, 0xF9, 0x3E, 0x47,
 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0x24, 0x09, 0x02, 0x40, 0x90, 0xE7,
 0x5D, 0x00, 0x66, 0x66, 0x00, 0x3C, 0x66, 0xE7, 0xE7, 0xFF, 0xE0, 0xE0,
 0xE0, 0x72, 0x3E, 0xF9, 0xF0, 0x1C, 0x20, 0x0B, 0x10, 0x05, 0x88, 0x02,
 0xE4, 0x61, 0x32, 0x78, 0x99, 0x66, 0x46, 0xB3, 0x23, 0x59, 0x90, 0xE7,
 0x88, 0x70, 0x04, 0x1B, 0xFF, 0x8D, 0xF8, 0x3E, 0x67, 0xE3, 0xE0, 0xFC,
 0xE0, 0xE0, 0xE1, 0x73, 0x3E, 0xCC, 0x66, 0x77, 0x33, 0x77, 0x66, 0xCC,
 0x11, 0xC4, 0x00, 0x3C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE7, 0x3B, 0xB8,
 0x3E, 0x33, 0xB0, 0xDC, 0x4F, 0x03, 0xE0, 0xFC, 0x1F, 0x03, 0xE0, 0xF0,
 0x7C, 0x67, 0xE0, 0x7D, 0x9F, 0x17, 0x07, 0xC7, 0xC3, 0xE3, 0xC6, 0xF8,
 0xCF, 0x30, 0x1E, 0x38, 0xE3, 0x8E, 0x38, 0xE3, 0x8E, 0x7C, 0x03, 0x00,
 0x1E, 0x00, 0x58, 0x01, 0x70, 0x0D, 0xC0, 0x27, 0x00, 0x8E, 0x06, 0x38,
 0x1F, 0xE0, 0xC1, 0xC3, 0x07, 0x08, 0x1C, 0xF8, 0xFC, 0xFF, 0xE3, 0x86,
 0x38, 0x23, 0x82, 0x38, 0x03, 0x80, 0x3F, 0xC3, 0x8E, 0x38, 0x73, 0x87,
 0x38, 0x73, 0x8E, 0xFF, 0xC0, 0xFF, 0x83, 0x9C, 0x38, 0xE3, 0x8E, 0x38,
 0xE3, 0x9C, 0x3F, 0x83, 0x8E, 0x38, 0x73, 0x87, 0x38, 0x73, 0x8E, 0xFF,
 0xC0, 0xFF, 0xCE, 0x33, 0x84, 0xE1, 0x38, 0x0E, 0x03, 0x80, 0xE0, 0x38,
 0x0E, 0x03, 0x80, 0xE0, 0xFE, 0x00, 0x1F, 0xF8, 0x27, 0x01, 0x38, 0x09,
 0xC0, 0x4E, 0x04, 0x70, 0x23, 0x83, 0x1C, 0x10, 0xE1, 0x87, 0x08, 0x38,
 0xC1, 0xCF, 0xFF, 0xE0, 0x0F, 0x00, 0x70, 0x01, 0x80, 0x08, 0xFF, 0xE3,
 0x86, 0x38, 0x23, 0x80, 0x38, 0x03, 0x80, 0x3F, 0xC3, 0x80, 0x38, 0x03,
 0x80, 0x38, 0x13, 0x83, 0xFF, 0xF0, 0x73, 0xF1, 0xCF, 0x1C, 0x78, 0x23,
 0x08, 0x06, 0x62, 0x00, 0x4C, 0x40, 0x05, 0x90, 0x01, 0xFF, 0x00, 0x66,
 0x70, 0x1C, 0xC7, 0x07, 0x18, 0xE0, 0xE3, 0x0E, 0x38, 0x70, 0xEE, 0x3F,
 0x1E, 0x3E, 0x71, 0xF8, 0xE8, 0x70, 0x38, 0x38, 0xF8, 0x0E, 0x03, 0xE1,
 0xF0, 0xFC, 0xE3, 0xE0, 0xFE, 0xFE, 0x70, 0x70, 0xE0, 0xE1, 0xC3, 0xC3,
 0x8B, 0x87, 0x37, 0x0E, 0xCE, 0x1D, 0x1C, 0x3C, 0x38, 0x70, 0x70, 0xE0,
 0xE1, 0xC1, 0xCF, 0xEF, 0xE0, 0x0C, 0x30, 0x1C, 0xE0, 0x1F, 0x80, 0x00,
 0x0F, 0xEF, 0xE7, 0x07, 0x0E, 0x0E, 0x1C, 0x3C, 0x38, 0xB8, 0x73, 0x70,
 0xEC, 0xE1, 0xD1, 0xC3, 0xC3, 0x87, 0x07, 0x0E, 0x0E, 0x1C, 0x1C, 0xFE,
 0xFE, 0xFC, 0x71, 0xC7, 0x8E, 0x20, 0x72, 0x03, 0x90, 0x1D, 0x00, 0xFC,
 0x07, 0x78, 0x39, 0xC1, 0xC6, 0x0E, 0x30, 0x71, 0xCF, 0xC7, 0x80, 0x1F,
 0xF8, 0x27, 0x01, 0x38, 0x09, 0xC0, 0x4E, 0x02, 0x70, 0x33, 0x81, 0x9C,
 0x08, 0xE0, 0x47, 0x06, 0x39, 0xE1, 0xCE, 0x3F, 0x80, 0xF8, 0x0F, 0x9E,
 0x0F, 0x0B, 0x07, 0x85, 0xC3, 0xC2, 0xE2, 0xE1, 0x31, 0x70, 0x9D, 0xB8,
 0x4E, 0x9C, 0x23, 0x4E, 0x11, 0xE7, 0x08, 0xE3, 0x84, 0x31, 0xCF, 0x99,
 0xF8, 0xFE, 0xFE, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xC3, 0x83, 0x87, 0x07,
 0x0F, 0xFE, 0x1C, 0x1C, 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xCF,
 0xEF, 0xE0, 0x1F, 0x83, 0x9C, 0x70, 0xEE, 0x06, 0xE0, 0x7E, 0x07, 0xE0,
 0x7E, 0x07, 0xE0, 0x7E, 0x06, 0x70, 0xE3, 0x9C, 0x1F, 0x80, 0xFF, 0xFE,
 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0E, 0x0E, 0x1C,
 0x1C, 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xCF, 0xEF, 0xE0, 0xFF,
 0x87, 0x38, 0xE3, 0x9C, 0x73, 0x8E, 0x73, 0x8F, 0xC1, 0xC0, 0x38, 0x07,
 0x00, 0xE0, 0x1C, 0x0F, 0xE0, 0x1F, 0x8E, 0x77, 0x0D, 0x82, 0xE0, 0x38,
 0x0E, 0x03, 0x80, 0xE0, 0x38, 0x07, 0x04, 0xF7, 0x1F, 0x80, 0xFF, 0xF9,
 0xCE, 0x38, 0xC7, 0x10, 0xE0, 0x1C, 0x03, 0x80, 0x70, 0x0E, 0x01, 0xC0,
 0x38, 0x07, 0x03, 0xF8, 0xFD, 0xF7, 0x86, 0x38, 0x43, 0x84, 0x1C, 0xC1,
 0xC8, 0x0C, 0x80, 0xF0, 0x07, 0x00, 0x70, 0x06, 0x00, 0x60, 0x3C, 0x00,
 0x0F, 0xC0, 0x0C, 0x03, 0xFF, 0x1C, 0xCE, 0xE3, 0x1F, 0x8C, 0x7E, 0x31,
 0xF8, 0xC7, 0xE3, 0x1D, 0xCC, 0xE1, 0xFE, 0x00, 0xC0, 0x0F, 0xC0, 0xFC,
 0xF1, 0xC3, 0x0E, 0x10, 0x39, 0x80, 0xF8, 0x07, 0x80, 0x1C, 0x01, 0xF0,
 0x0B, 0x80, 0x8E, 0x0C, 0x38, 0xC1, 0xCF, 0x9F, 0x80, 0xFE, 0xFE, 0x70,
 0x70, 0xE0, 0xE1, 0xC1, 0xC3, 0x83, 0x87, 0x07, 0x0E, 0x0E, 0x1C, 0x1C,
 0x38, 0x38, 0x70, 0x70, 0xE0, 0xE1, 0xC1, 0xCF, 0xFF, 0xE0, 0x00, 0xC0,
 0x01, 0x80, 0x01, 0x00, 0x02, 0xFF, 0xFC, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
 0x38, 0x70, 0xE1, 0xC3, 0xCF, 0x07, 0xFC, 0x00, 0x70, 0x01, 0xC0, 0x07,
 0x00, 0x1C, 0x01, 0xFC, 0xFD, 0xF9, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x38,
 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E,
 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xCF,
 0xFF, 0xFF, 0x80, 0xFD, 0xF9, 0xF9, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70,
 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C,
 0x38, 0x70, 0xE1, 0xC3, 0x87, 0x0E, 0x1C, 0x38, 0x70, 0xE1, 0xCF, 0xFF,
 0xFF, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x08,
 0xFF, 0x86, 0x70, 0x23, 0x81, 0x1C, 0x00, 0xE0, 0x07, 0x00, 0x3F, 0x81,
 0xCE, 0x0E, 0x38, 0x71, 0xC3, 0x8E, 0x1C, 0xE3, 0xFE, 0x00, 0xFE, 0x1F,
 0xCE, 0x01, 0xC3, 0x80, 0x70, 0xE0, 0x1C, 0x38, 0x07, 0x0E, 0x01, 0xC3,
 0xF8, 0x70, 0xE7, 0x1C, 0x38, 0xE7, 0x0E, 0x39, 0xC3, 0x8E, 0x70, 0xE7,
 0x1C, 0xFF, 0x9F, 0xC0, 0xFE, 0x07, 0x00, 0xE0, 0x1C, 0x03, 0x80, 0x70,
 0x0F, 0xE1, 0xCE, 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0xEF, 0xF8, 0x7E, 0x38,
 0xCC, 0x39, 0x07, 0x01, 0xC0, 0x71, 0xFC, 0x07, 0x01, 0xF0, 0x6C, 0x3B,
 0x9C, 0x3E, 0x00, 0xFE, 0x3F, 0x07, 0x0E, 0x70, 0xE3, 0x87, 0x1C, 0x60,
 0x63, 0x9C, 0x0E, 0x73, 0x81, 0xCF, 0xF0, 0x39, 0xCE, 0x07, 0x39, 0xC0,
 0xE7, 0x38, 0x18, 0xE3, 0x87, 0x1C, 0x39, 0xCF, 0xE3, 0xF0, 0x0F, 0xF8,
 0xE7, 0x0E, 0x38, 0x71, 0xC3, 0x8E, 0x0E, 0x70, 0x3F, 0x81, 0xDC, 0x1C,
 0xE0, 0xE7, 0x0E, 0x38, 0xF1, 0xCF, 0x3F, 0x80, 0x3E, 0x33, 0x99, 0xC0,
 0xE3, 0xF7, 0x3B, 0x9D, 0xCE, 0xEF, 0x39, 0xC0, 0x03, 0x9F, 0x9F, 0x8C,
 0x0C, 0x04, 0xF2, 0x9D, 0xC7, 0xE3, 0xF1, 0xF8, 0xEC, 0x77, 0x71, 0xF0,
 0xFF, 0x39, 0x9C, 0xEE, 0x67, 0xE3, 0x9D, 0xCE, 0xE7, 0x73, 0xFF, 0x80,
 0xFF, 0x71, 0x71, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0xF8, 0x7F, 0xC2,
 0x70, 0x4E, 0x09, 0xC1, 0x38, 0x67, 0x08, 0xE1, 0x1C, 0x63, 0x9F, 0xFF,
 0x01, 0xE0, 0x38, 0x03, 0x00, 0x40, 0x3C, 0x66, 0xE7, 0xE7, 0xFF, 0xE0,
 0xE0, 0xE0, 0x72, 0x3E, 0xE3, 0xE3, 0xE8, 0xE2, 0xC2, 0x72, 0x00, 0xBB,
 0x00, 0xFF, 0x80, 0xEE, 0xE0, 0x67, 0x30, 0x73, 0x9C, 0x71, 0xC7, 0x71,
 0xF1, 0xC0, 0x7E, 0x67, 0x47, 0x06, 0x3C, 0x06, 0x07, 0xC7, 0xC7, 0x7C,
 0xFB, 0xEE, 0x39, 0xC7, 0x39, 0xE7, 0x7C, 0xFB, 0x9E, 0x73, 0x8E, 0x71,
 0xDF, 0x7C, 0x30, 0xC7, 0x38, 0x7E, 0x00, 0x0F, 0xBE, 0xE3, 0x9C, 0x73,
 0x9E, 0x77, 0xCF, 0xB9, 0xE7, 0x38, 0xE7, 0x1D, 0xF7, 0xC0, 0xF9, 0xEE,
 0x2D, 0xC8, 0x3A, 0x07, 0xE0, 0xEE, 0x1D, 0xC3, 0x9C, 0x73, 0xDF, 0x3C,
 0x7F, 0xE2, 0x70, 0x4E, 0x09, 0xC1, 0x38, 0x27, 0x08, 0xE1, 0x1C, 0xE3,
 0x98, 0xFC, 0xF0, 0x7D, 0xC3, 0xC7, 0x8F, 0x16, 0x3C, 0x5D, 0x71, 0x35,
 0xC4, 0xF7, 0x11, 0x9C, 0x46, 0x73, 0xD3, 0xF0, 0xFF, 0xDC, 0xE7, 0x39,
 0xCE, 0x7F, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0xBF, 0xF0, 0x3E, 0x3B, 0xB8,
 0xFC, 0x7E, 0x3F, 0x1F, 0x8F, 0xC7, 0x77, 0x1F, 0x00, 0xFF, 0xEE, 0x39,
 0xC7, 0x38, 0xE7, 0x1C, 0xE3, 0x9C, 0x73, 0x8E, 0x71, 0xDF, 0x7C, 0x73,
 0x86, 0xB8, 0xE3, 0x9C, 0x73, 0x8E, 0x71, 0xCE, 0x39, 0xC7, 0x3D, 0xC7,
 0x70, 0xE0, 0x1C, 0x03, 0x81, 0xF8, 0x00, 0x3E, 0x77, 0xE3, 0xE0, 0xE0,
 0xE0, 0xE0, 0xE1, 0x73, 0x3E, 0xFF, 0xCE, 0xE7, 0x23, 0x81, 0xC0, 0xE0,
 0x70, 0x38, 0x1C, 0x3F, 0x00, 0xFB, 0xDC, 0x27, 0x08, 0xC6, 0x39, 0x0E,
 0x41, 0xE0, 0x78, 0x0E, 0x03, 0x00, 0xC0, 0x30, 0x18, 0x3C, 0x00, 0x0F,
 0x00, 0x38, 0x01, 0xC0, 0x0E, 0x01, 0xFC, 0x3B, 0xB9, 0x9C, 0xDC, 0xE7,
 0xE7, 0x3F, 0x39, 0xF9, 0xCE, 0xCE, 0x67, 0x77, 0x0F, 0xE0, 0x1C, 0x00,
 0xE0, 0x07, 0x00, 0x7C, 0x00, 0x7D, 0xE3, 0x8C, 0x18, 0x80, 0xD0, 0x0E,
 0x00, 0xF0, 0x0B, 0x81, 0x1C, 0x30, 0xEF, 0xBF, 0xFB, 0xE7, 0x1C, 0x71,
 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xCF, 0xFF, 0x00,
 0x30, 0x03, 0x00, 0x10, 0x01, 0xFB, 0xF7, 0x1C, 0x71, 0xC7, 0x1C, 0x71,
 0xC7, 0xFC, 0x3D, 0xC0, 0x1C, 0x01, 0xC0, 0x3F, 0xFB, 0xFF, 0xB8, 0xE7,
 0x1C, 0x63, 0x8E, 0x31, 0xC7, 0x18, 0xE3, 0x8C, 0x71, 0xC6, 0x38, 0xE3,
 0x1C, 0x71, 0x8E, 0x7F, 0xFF, 0xC0, 0xFB, 0xFF, 0xB8, 0xE7, 0x1C, 0x63,
 0x8E, 0x31, 0xC7, 0x18, 0xE3, 0x8C, 0x71, 0xC6, 0x38, 0xE3, 0x1C, 0x71,
 0x8E, 0x7F, 0xFF, 0xC0, 0x00, 0x60, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04,
 0xFF, 0x0C, 0xE0, 0x8E, 0x00, 0xE0, 0x0F, 0xE0, 0xE7, 0x0E, 0x70, 0xE7,
 0x0E, 0x73, 0xFE, 0xF8, 0x3E, 0xE0, 0x39, 0xC0, 0x73, 0x80, 0xE7, 0xF1,
 0xCE, 0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9D, 0xFC, 0x7C, 0xF8, 0x38,
 0x1C, 0x0E, 0x07, 0xF3, 0x9D, 0xCE, 0xE7, 0x73, 0xFF, 0x80, 0x7C, 0xE6,
 0x47, 0x07, 0x3F, 0x07, 0x07, 0xC7, 0xC6, 0x7C, 0xF8, 0xF8, 0xE3, 0xB9,
 0xCE, 0x3B, 0x9C, 0x77, 0xF8, 0xEE, 0x71, 0xDC, 0xE3, 0xB9, 0xC7, 0x71,
 0xDD, 0xF1, 0xF0, 0x3F, 0xEE, 0x71, 0xCE, 0x39, 0xC3, 0x38, 0x3F, 0x07,
 0xE1, 0xDC, 0x73, 0x9C, 0xFC,
  };

const GFXglyph DroidSerifBold18pt8bGlyphs[] PROGMEM = {
{0,0,0,5,0,1},   // 0x20 ' '
{0,3,13,8,3,-12},   // 0x21 !
{5,7,6,10,2,-12},   // 0x22 "
{11,10,13,11,1,-12},   // 0x23 #
{28,8,14,11,2,-12},   // 0x24 $
{42,14,13,17,2,-12},   // 0x25 %
{65,13,13,15,2,-12},   // 0x26 &
{87,3,6,6,2,-12},   // 0x27 '
{90,5,17,8,2,-13},   // 0x28 (
{101,5,17,8,2,-13},   // 0x29 )
{112,8,7,11,2,-13},   // 0x2A *
{119,8,8,11,2,-9},   // 0x2B +
{127,3,6,6,2,-2},   // 0x2C ,
{130,4,2,7,2,-5},   // 0x2D -
{131,3,3,6,2,-2},   // 0x2E .
{133,5,16,6,1,-13},   // 0x2F /
{143,8,13,11,2,-12},   // 0x30 0
{156,8,13,11,2,-12},   // 0x31 1
{169,8,13,11,2,-12},   // 0x32 2
{182,8,13,11,2,-12},   // 0x33 3
{195,9,13,11,2,-12},   // 0x34 4
{210,8,13,11,2,-12},   // 0x35 5
{223,8,13,11,2,-12},   // 0x36 6
{236,8,13,11,2,-12},   // 0x37 7
{249,8,13,11,2,-12},   // 0x38 8
{262,8,13,11,2,-12},   // 0x39 9
{275,3,10,6,2,-9},   // 0x3A :
{279,3,13,6,2,-9},   // 0x3B ;
{284,8,9,11,2,-10},   // 0x3C <
{293,8,5,11,2,-8},   // 0x3D =
{298,8,9,11,2,-10},   // 0x3E >
{307,8,13,11,2,-12},   // 0x3F ?
{320,15,16,18,2,-12},   // 0x40 @
{350,14,13,15,1,-12},   // 0x41 A
{373,12,13,14,1,-12},   // 0x42 B
{393,10,13,13,2,-12},   // 0x43 C
{410,13,13,15,1,-12},   // 0x44 D
{432,12,13,13,1,-12},   // 0x45 E
{452,11,13,13,1,-12},   // 0x46 F
{470,12,13,15,2,-12},   // 0x47 G
{490,15,13,16,1,-12},   // 0x48 H
{515,7,13,8,1,-12},   // 0x49 I
{527,8,17,8,0,-12},   // 0x4A J
{544,14,13,15,1,-12},   // 0x4B K
{567,11,13,13,1,-12},   // 0x4C L
{585,17,13,18,1,-12},   // 0x4D M
{613,14,13,15,1,-12},   // 0x4E N
{636,12,13,15,2,-12},   // 0x4F O
{656,11,13,13,1,-12},   // 0x50 P
{674,12,17,15,2,-12},   // 0x51 Q
{700,13,13,14,1,-12},   // 0x52 R
{722,9,13,12,2,-12},   // 0x53 S
{737,11,13,12,1,-12},   // 0x54 T
{755,14,13,15,1,-12},   // 0x55 U
{778,13,13,14,1,-12},   // 0x56 V
{800,21,13,20,0,-12},   // 0x57 W
{835,13,13,14,1,-12},   // 0x58 X
{857,13,13,14,1,-12},   // 0x59 Y
{879,10,13,13,2,-12},   // 0x5A Z
{896,5,16,8,3,-13},   // 0x5B [
{906,5,16,6,1,-13},   // 0x5C 
{916,5,16,8,1,-13},   // 0x5D ]
{926,8,8,11,2,-12},   // 0x5E ^
{934,8,1,9,1,3},   // 0x5F _
{935,4,3,11,4,-13},   // 0x60 `
{937,9,10,12,2,-9},   // 0x61 a
{949,10,14,13,2,-13},   // 0x62 b
{967,8,10,11,2,-9},   // 0x63 c
{977,11,14,13,2,-13},   // 0x64 d
{997,8,10,11,2,-9},   // 0x65 e
{1007,9,14,9,1,-13},   // 0x66 f
{1023,10,14,11,1,-9},   // 0x67 g
{1041,10,14,13,2,-13},   // 0x68 h
{1059,5,15,8,2,-14},   // 0x69 i
{1069,5,19,8,1,-14},   // 0x6A j
{1081,11,14,13,2,-13},   // 0x6B k
{1101,5,14,8,2,-13},   // 0x6C l
{1110,15,10,18,2,-9},   // 0x6D m
{1129,10,10,13,2,-9},   // 0x6E n
{1142,9,10,12,2,-9},   // 0x6F o
{1154,11,14,13,1,-9},   // 0x70 p
{1174,11,14,13,2,-9},   // 0x71 q
{1194,8,10,10,2,-9},   // 0x72 r
{1204,7,10,10,2,-9},   // 0x73 s
{1213,6,12,8,2,-11},   // 0x74 t
{1222,10,10,13,2,-9},   // 0x75 u
{1235,11,10,11,1,-9},   // 0x76 v
{1249,15,10,16,1,-9},   // 0x77 w
{1268,12,10,13,1,-9},   // 0x78 x
{1283,10,14,11,1,-9},   // 0x79 y
{1301,8,10,11,2,-9},   // 0x7A z
{1311,7,16,9,2,-13},   // 0x7B {
{1325,1,18,10,5,-13},   // 0x7C |
{1328,7,16,9,1,-13},   // 0x7D }
{1342,8,3,11,2,-7},   // 0x7E ~
{0,0,0,0,0,0},   // 0x7F 
{1345,14,13,16,1,-12},   // 0x80 Ђ
{1368,10,17,12,1,-16},   // 0x81 Ѓ
{1390,3,6,6,2,-2},   // 0x82 ‚
{1393,8,14,11,2,-13},   // 0x83 ѓ
{1407,7,6,10,2,-2},   // 0x84 „
{1413,13,3,16,2,-2},   // 0x85 …
{1418,7,16,10,2,-13},   // 0x86 †
{1432,7,16,10,2,-13},   // 0x87 ‡
{1446,8,13,11,2,-12},   // 0x88 €
{1459,21,13,24,2,-12},   // 0x89 ‰
{1494,17,13,19,1,-12},   // 0x8A Љ
{1522,4,7,7,2,-7},   // 0x8B ‹
{1526,18,13,20,1,-12},   // 0x8C Њ
{1556,13,17,14,1,-16},   // 0x8D Ќ
{1584,16,13,17,1,-12},   // 0x8E Ћ
{1610,15,17,16,1,-12},   // 0x8F Џ
{1642,10,18,13,1,-13},   // 0x90 ђ
{1665,3,6,6,2,-12},   // 0x91 ‘
{1668,3,6,6,2,-12},   // 0x92 ’
{1671,7,6,10,2,-12},   // 0x93 “
{1677,7,6,10,2,-12},   // 0x94 ”
{1683,6,6,9,2,-9},   // 0x95 •
{1688,9,1,10,1,-4},   // 0x96 –
{1690,18,1,19,1,-4},   // 0x97 —
{0,0,0,0,0,0},   // 0x98
{1693,14,6,17,2,-12},   // 0x99 ™
{1704,15,10,17,1,-9},   // 0x9A љ
{1723,4,7,7,2,-7},   // 0x9B ›
{1727,15,10,18,2,-9},   // 0x9C њ
{1746,11,14,13,2,-13},   // 0x9D ќ
{1766,11,14,13,1,-13},   // 0x9E ћ
{1786,11,14,14,2,-9},   // 0x9F џ
{0,0,0,0,0,0},   // 0xA0
{1806,12,17,13,1,-16},   // 0xA1 Ў
{1832,10,18,11,1,-13},   // 0xA2 ў
{1855,8,17,8,0,-12},   // 0xA3 Ј
{1872,6,6,11,3,-9},   // 0xA4 ¤
{1877,10,15,11,1,-14},   // 0xA5 Ґ
{1896,1,18,10,5,-13},   // 0xA6 ¦
{1899,8,16,11,2,-13},   // 0xA7 §
{1915,12,16,13,1,-15},   // 0xA8 Ё
{1939,13,13,16,2,-12},   // 0xA9 ©
{1961,10,13,13,2,-12},   // 0xAA Є
{1978,8,7,11,2,-7},   // 0xAB «
{1985,7,5,11,2,-6},   // 0xAC ¬
{0,0,0,0,0,0},   // 0xAD
{1990,13,13,16,2,-12},   // 0xAE ®
{2012,7,16,8,1,-15},   // 0xAF Ї
{2026,5,5,8,2,-12},   // 0xB0 °
{2030,8,10,11,2,-9},   // 0xB1 ±
{2040,7,13,8,1,-12},   // 0xB2 І
{2052,5,15,8,2,-14},   // 0xB3 і
{2062,8,12,10,2,-11},   // 0xB4 ґ
{2074,9,14,13,3,-9},   // 0xB5 µ
{2090,10,16,12,2,-13},   // 0xB6 ¶
{2110,3,3,6,2,-7},   // 0xB7 ·
{2112,8,13,11,2,-12},   // 0xB8 ё
{2125,17,13,19,1,-12},   // 0xB9 №
{2153,8,10,11,2,-9},   // 0xBA є
{2163,8,7,11,2,-7},   // 0xBB »
{2170,5,19,8,1,-14},   // 0xBC ј
{2182,9,13,12,2,-12},   // 0xBD Ѕ
{2197,7,10,10,2,-9},   // 0xBE ѕ
{2206,6,13,8,1,-12},   // 0xBF ї
{2216,14,13,15,1,-12},   // 0xC0 А
{2239,12,13,14,1,-12},   // 0xC1 Б
{2259,12,13,14,1,-12},   // 0xC2 В
{2279,10,13,12,1,-12},   // 0xC3 Г
{2296,13,17,14,1,-12},   // 0xC4 Д
{2324,12,13,13,1,-12},   // 0xC5 Е
{2344,19,13,20,1,-12},   // 0xC6 Ж
{2375,9,13,12,2,-12},   // 0xC7 З
{2390,15,13,16,1,-12},   // 0xC8 И
{2415,15,17,16,1,-16},   // 0xC9 Й
{2447,13,13,14,1,-12},   // 0xCA К
{2469,13,13,14,1,-12},   // 0xCB Л
{2491,17,13,18,1,-12},   // 0xCC М
{2519,15,13,16,1,-12},   // 0xCD Н
{2544,12,13,15,2,-12},   // 0xCE О
{2564,15,13,16,1,-12},   // 0xCF П
{2589,11,13,13,1,-12},   // 0xD0 Р
{2607,10,13,13,2,-12},   // 0xD1 С
{2624,11,13,12,1,-12},   // 0xD2 Т
{2642,12,13,13,1,-12},   // 0xD3 У
{2662,14,13,17,2,-12},   // 0xD4 Ф
{2685,13,13,14,1,-12},   // 0xD5 Х
{2707,15,17,16,1,-12},   // 0xD6 Ц
{2739,14,13,15,1,-12},   // 0xD7 Ч
{2762,21,13,22,1,-12},   // 0xD8 Ш
{2797,21,17,22,1,-12},   // 0xD9 Щ
{2842,13,13,15,1,-12},   // 0xDA Ъ
{2864,18,13,19,1,-12},   // 0xDB Ы
{2894,11,13,13,1,-12},   // 0xDC Ь
{2912,10,13,13,2,-12},   // 0xDD Э
{2929,19,13,21,1,-12},   // 0xDE Ю
{2960,13,13,14,1,-12},   // 0xDF Я
{2982,9,10,12,2,-9},   // 0xE0 а
{2994,9,14,12,2,-13},   // 0xE1 б
{3010,9,10,12,2,-9},   // 0xE2 в
{3022,8,10,11,2,-9},   // 0xE3 г
{3032,11,14,12,1,-9},   // 0xE4 д
{3052,8,10,11,2,-9},   // 0xE5 е
{3062,17,10,18,1,-9},   // 0xE6 ж
{3084,8,10,11,2,-9},   // 0xE7 з
{3094,11,10,14,2,-9},   // 0xE8 и
{3108,11,14,14,2,-13},   // 0xE9 й
{3128,11,10,13,2,-9},   // 0xEA к
{3142,11,10,12,1,-9},   // 0xEB л
{3156,14,10,16,2,-9},   // 0xEC м
{3174,10,10,13,2,-9},   // 0xED н
{3187,9,10,12,2,-9},   // 0xEE о
{3199,11,10,14,2,-9},   // 0xEF п
{3213,11,14,13,1,-9},   // 0xF0 р
{3233,8,10,11,2,-9},   // 0xF1 с
{3243,9,10,12,2,-9},   // 0xF2 т
{3255,10,14,11,1,-9},   // 0xF3 у
{3273,13,18,16,2,-13},   // 0xF4 ф
{3303,12,10,13,1,-9},   // 0xF5 х
{3318,12,14,14,2,-9},   // 0xF6 ц
{3339,12,10,13,1,-9},   // 0xF7 ч
{3354,17,10,19,2,-9},   // 0xF8 ш
{3376,17,14,19,2,-9},   // 0xF9 щ
{3406,12,10,14,1,-9},   // 0xFA ъ
{3421,15,10,18,2,-9},   // 0xFB ы
{3440,9,10,12,2,-9},   // 0xFC ь
{3452,8,10,11,2,-9},   // 0xFD э
{3462,15,10,18,2,-9},   // 0xFE ю
{3481,11,10,12,1,-9},   // 0xFF я
  };
const GFXfont DroidSerifBold18pt8b PROGMEM = {
  (uint8_t  *)DroidSerifBold18pt8bBitmaps,
  (GFXglyph *)DroidSerifBold18pt8bGlyphs,
  0x20, 0xFF, 22 };
#include <Adafruit_GFX.h>    // Core graphics library
#include <MCUFRIEND_kbv.h>
#include <Fonts/DroidSerifBold18pt8b.h>
MCUFRIEND_kbv tft;       // hard-wired for UNO shields anyway.
void setup(void)
{
  Serial.begin(9600);
  tft.begin(9600);
  tft.reset();
  tft.begin(tft.readID());
  tft.setRotation(1);
  tft.cp437(true);
  tft.fillScreen(0x000000);
}
void loop()
{
  //int16_t x1, y1;
  //uint16_t w, h;
  tft.setFont(&DroidSerifBold18pt8b);
  tft.setTextColor(0xFFFFFF);
  tft.setCursor(10, 40);
  char myChar1[] = {"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_`abcdefghijklmnopqrstuvwxyz{|}~"};
  tft.print(utf8rus(myChar1));
  tft.print(utf8rus("\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA9\xAA\xAB\xAC"));
  tft.print(utf8rus("\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"));
  tft.print(utf8rus("АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзиклмнопрстуфхцчшщъыьэюя"));
  //tft.getTextBounds(myChar1, 10, 40, &x1, &y1, &w, &h);
  delay(5000);
  //tft.fillRect(x1, y1, w, h, BLACK);
  //delay(5000);
}
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    Serial.print(n);
    m[0] = n; target = target + String(m);
  }
  Serial.println();
  return target;
}

 

ardunoob
Offline
Зарегистрирован: 22.04.2016

Автору респект и благодарность, успешно русифицировал TFT экранчик TFT_ILI9163C.

Одно не нравится - размеры и эстетика шрифта оставляют желать лучшего. В https://cdn-learn.adafruit.com/downloads/pdf/adafruit-gfx-graphics-library.pdf в конце описывается как сделать свой шрифт. Если сконвертировать таким образом шрифт с поддержкой кириллицы и нужными мне размерами нужно ли будет использовать функцию utf8rus?

Никто не пробовал?

arduinec
Offline
Зарегистрирован: 01.09.2015

Шрифт в библиотеке Adafruit-GFX содержит 256 символов и код каждого символа занимает 1 байт. Arduino IDE же сохраняет символы в кодировке UTF-8 и русские буквы в этой кодировке занимают 2 байта. Функция utf8rus лишь перекодирует из 2-байтовой кодировки Arduino IDE в 1-байтовую кодировку шрифта Adafruit-GFX и не знает какой там шрифт.

sirota
Offline
Зарегистрирован: 18.08.2015

DarkGenius пишет:

Мож я плохо искал, но мне не удалось найти GFX шрифтов с кириллицей для Adafruit. Повозился с Autoit, написал скрипт для формирования параметров и массива символов. Пока только один шрифт. Вывод на экран через функцию utf8rus от arduinec. Шрифт на основе Droid Serif Bold, таблица ASCII (кодировка Windows-1251).

А что за огромный кусок невнятных симовов после ~? Там есть "нужные", но и шлака просто огромная гора. j - 2 раза. S и s так же. % так же. Это же все память.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

это полный набор ASC, он автоматом создаётся. Можно исключить что либо, но это не более 15%. Потому не счёл нужным, может быть добавлю исключения.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Сделал ещё 4 шрифта, но мне не нравится что скрипт делает большое растояние между символами. Думаю как решить, просто отнять не много, либо писать правила. Так как растояние между символами сильно бывает отличается.

Danila
Offline
Зарегистрирован: 16.05.2013

Уважаемые, подскажите, сделал все по порядку

Для русификации библиотеки Adafruit-GFX требуется:
- скачать любой из приведённых ниже (или выше) архивов;
- заменить файл glcdfont.c в Adafruit-GFX;
- добавить функцию utf8rus() в скетч;
- вставить в начале скетча команду: display.cp437(true);

Применять функцию utf8rus() можно внутри команд печати строк:
display.println(utf8rus("Тест"));

В архивах приводятся примеры, которые различаются по виду дисплея:

 

Но не компилируется, ругается на display.cp437(true);

Пишет :

amoled_project_june_2016.ino: In function 'void setup()':

amoled_project_june_2016:87: error: 'class Adafruit_SSD1306' has no member named 'cp437'
 
 
Как разрешить проблеу? 
 
sirota
Offline
Зарегистрирован: 18.08.2015

Danila пишет:

Пишет :

amoled_project_june_2016.ino: In function 'void setup()':

amoled_project_june_2016:87: error: 'class Adafruit_SSD1306' has no member named 'cp437'
 
 
Как разрешить проблеу? 
 

Тебе прям черным по русски написали:

amoled_project_june_2016:87: error: 'class Adafruit_SSD1306' has no member named 'cp437'

Твой класс не имеет именованного члена cp437

Danila
Offline
Зарегистрирован: 16.05.2013

Это понятно. Вопрос почему не имеет, если все сделал как написано выше ? :)

sirota
Offline
Зарегистрирован: 18.08.2015

Danila пишет:

Это понятно. Вопрос почему не имеет, если все сделал как написано выше ? :)

Значит в Вашей версии Adafruit для Вашего дисплее этой функции еще не было. Попробуйте в void() не вставлять ее и все. Еще лучше - скачать версию библиотеки по новее.

Danila
Offline
Зарегистрирован: 16.05.2013

УРА ! ЗАРАБОТАЛО! СПАСИБО, SIROTA ! 

afozyje
Offline
Зарегистрирован: 13.06.2016

uplift The repetition of navigation elements can contribute positively to the rhythm. Bolder logos, bigger and richer fonts along with solid colors scan make your website more attractive. It is better to provide one third or maximum half of the page for flash. excellent customer service hibu reviews
http://gylling19kjellerup.beep.com/webdesign-doit-like-a-pro-2016-05-15....

arduinec
Offline
Зарегистрирован: 01.09.2015

Для развития проекта Transistor Tester (http://arduino.ru/forum/proekty/transistor-tester-arduino) немного модифицировал шрифт. Теперь символы с кодами 0x91 и 0x92 используются для отображения диодов, 0x93 - для конденсатора, 0x94 и 0x95 - для резистора. Код 0x90 содержит символ Омега, символ Микро с кодом 0xB5 уже был в шрифте.

Пример приводится для дисплея Nokia 5110:
https://yadi.sk/d/juZ_mZbfsTpez

Инструкция по замене шрифта остаётся прежней.
 

rashn
Offline
Зарегистрирован: 22.11.2013

Как руссификацию решил для себя я:

Делал под Mac OS, но всё это справедливо и для винды и для линукса:

1. Установил FreeType (в инете есть мануалы как это сделать) https://www.freetype.org/download.html

2. Далее размещаю любой шрифт который мне нужен в папку и ввожу вот такую команду:

cd Documents/Arduino/libraries/Adafruit-GFX-Library-master/fontconvert/

./fontconvert PTM55F.ttf 10 > PTM55.h

Где первый параметр это мой шрифт, второй - это его размер, на выходе будет  .h файл со шрифтом.

3. Далее у меня не работает с такими шрифтами стандартная функция utf8rus

я её подправил, вот её код:

////////////////
//
String utf8rusMy(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x0;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x40;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);

  }

  return target;
}
////////////

Таким вот образом можно конвертировать какие угодно шрифты и всё будет работать - гарантированно. 

 

DarkGenius
Offline
Зарегистрирован: 09.07.2015

На винде не работает.

MacSim
Offline
Зарегистрирован: 28.11.2012

SLOM пишет:

подскажите как русифицировать

светодиодную точечную матрицу наподобии: 

только не ргб а одноцвет, красного цвета. 

http://arduino.ru/forum/programmirovanie/led-matritsa-max7219-maxmatrixl...

sirota
Offline
Зарегистрирован: 18.08.2015

DarkGenius пишет:

На винде не работает.

Что у тебя не работает? Уменя все работает.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

У тебя стоит что то, что позоляет запустить из командной строки, код на С.

MacSim
Offline
Зарегистрирован: 28.11.2012

программы, программы... руками шрифт поправил с помощью таблицы символов и инжинерного калькулятора( бин в хекс перевел) и все.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Я посмотрю как ты шрифт 48 размера, 8 битный будешь на калькуляторе неделю делать.

MacSim
Offline
Зарегистрирован: 28.11.2012

DarkGenius пишет:

Я посмотрю как ты шрифт 48 размера, 8 битный будешь на калькуляторе неделю делать.

полчаса. а можно и вообще не переводить, так в бине и писать

kkmspb
Offline
Зарегистрирован: 18.06.2016

На ардуино UNO и Led module P10 16x32 пробую русские шрифты использовать.

Трудно найти FontEditor , чтобы сразу в *.h файл можно было шрифты нужные добавлять. Не пришлете вашу?

 

MacSim
Offline
Зарегистрирован: 28.11.2012

вашу что? по ссылке выше обсуждалось как на лед выводить. размер шрифта ставьте в функции вывода. ковыряйте ручками стандартный шрифт если не нравиться. исправленный файл с русскими букавами тоже по ссылке найдете. не красивые, некоторые выходят, я их правил.

gergi
Offline
Зарегистрирован: 15.06.2016

Господа подскажите в чем проблема. Вывожу дату на дисплей(oled 128x64)

char* mymonth[] = {"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сент-рь", "Октябрь", "Ноябрь", "Декабрь"'};
display.print(utf8rus(mymonth[now.month()])); 

Получаю пустую строку.

Если пишу так

display.print(mymonth[now.month()]); 

Соотвественно получаю кракозябру. Но всё же месяц отображается.

Если сократить mymonth

char* mymonth[] = {"Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль"}

Всё отображается в нужном виде и русскими буквами. Голову сломал в чем загвоздка.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вероятнее всего не хватает оперативной памяти. Лечится при помощи PROGMEM.

gergi
Offline
Зарегистрирован: 15.06.2016

Вы правы. Adafruit_GFX просто выел память. Буду искать другую библиотеку

sirota
Offline
Зарегистрирован: 18.08.2015

gergi пишет:

Вы правы. Adafruit_GFX просто выел память. Буду искать другую библиотеку

БОлее чем уверен и с новой библой будет не проще. Вам же сказали чем лечиться.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

gergi пишет:

Вы правы. Adafruit_GFX просто выел память. Буду искать другую библиотеку

Как бы дело не в конкретной библиотеке, а в экранном буфере.

Genri5
Offline
Зарегистрирован: 31.05.2016

Блин, крышу рвет,  тоже пытаюсь все сделать как в посте 51, не кампилируется скетч из папки NokiaRus(LCD3310) выдает ошибку:

Arduino: 1.6.10 Hourly Build 2016/07/12 12:33 (Windows 7), Плата:"Arduino Nano, ATmega328"

C:\Гена\Работа\Платежы\ESRpriborchik\Biblioteki\Nano_V3\NokiaRus\NokiaRus\NokiaRusTest\NokiaRusTest.ino: In function 'void setup()':

NokiaRusTest:71: error: 'class Adafruit_PCD8544' has no member named 'cp437'

NokiaRusTest:91: error: 'testdrawline' was not declared in this scope

NokiaRusTest:97: error: 'testdrawrect' was not declared in this scope

NokiaRusTest:103: error: 'testfillrect' was not declared in this scope

NokiaRusTest:109: error: 'testdrawcircle' was not declared in this scope

NokiaRusTest:120: error: 'testdrawroundrect' was not declared in this scope

NokiaRusTest:124: error: 'testfillroundrect' was not declared in this scope

NokiaRusTest:128: error: 'testdrawtriangle' was not declared in this scope

NokiaRusTest:132: error: 'testfilltriangle' was not declared in this scope

NokiaRusTest:137: error: 'testdrawchar' was not declared in this scope

NokiaRusTest:146: error: 'utf8rus' was not declared in this scope

NokiaRusTest:197: error: 'testdrawbitmap' was not declared in this scope

Несколько библиотек найдено для "Adafruit_GFX.h"
Используется: C:\Users\Gleb\Documents\Arduino\libraries\Adafruit_GFX
Не используется: C:\Users\Gleb\Documents\Arduino\libraries\arduino_87324
Не используется: C:\Users\Gleb\Documents\Arduino\libraries\Adafruit_GFX_Library
Не используется: C:\Users\Gleb\Documents\Arduino\libraries\Adafruit-GFX-Library-master
Не используется: C:\Program Files (x86)\Arduino\libraries\Adafruit_GFX_Library
Не используется: C:\Program Files (x86)\Arduino\libraries\Adafruit_GFX
exit status 1
'class Adafruit_PCD8544' has no member named 'cp437'
 

А когда закометировал стоку  - display.cp437(true), начинает ругаться на другую :

 \NokiaRusTest.ino: In fun exit status 1
'testdrawline' was not declared in this scope

 

arduinec
Offline
Зарегистрирован: 01.09.2015

Библиотеки из архива NokiaRus.zip (https://yadi.sk/d/yJOAk50yoTxF4) подключить не удалось?

Genri5
Offline
Зарегистрирован: 31.05.2016

Одна библиотека" Adafruit-GFX" подключилась, а "Adafruit_PCD8544", сообщило,что библиотека уже подключена. Но я для верности, содержимое "Adafruit_PCD8544" скопировал в папку по пути: /Program Files(x86)/Arduino/libraris/Adafruit_PCD8544. Перезапустил Arduino IDE, но в итоге получилось то, что получилось.

arduinec
Offline
Зарегистрирован: 01.09.2015

При компиляции во временном каталоге Windows создаётся папка build с цифрами и расширением .tmp. В этой папке появляются файлы с расширением .d, в которых указываются пути к библиотекам и другим файлам, необходимым для компиляции.

Скетч NokiaRusTest.ino сделан из примера pcdtest.ino для библиотеки Adafruit_PCD8544.

Genri5
Offline
Зарегистрирован: 31.05.2016

arduinec, загрузил на другой комп превью Arduino IDE, установил библиотеки из папки "NokiaRus" и запустил тест. На строчку - "display.cp437(true);" - уже неругается, но выдает другую ошибку - " 

Arduino: 1.6.10 Hourly Build 2016/07/20 04:33 (Windows XP), Плата:"Arduino Nano, ATmega328"

C:\Documents and Settings\Orlovsky_G\Рабочий стол\Чек\NokiaRus\NokiaRus\NokiaRusTest\NokiaRusTest.ino: In function 'void setup()':

NokiaRusTest:91: error: 'testdrawline' was not declared in this scope

NokiaRusTest:97: error: 'testdrawrect' was not declared in this scope

NokiaRusTest:103: error: 'testfillrect' was not declared in this scope

NokiaRusTest:109: error: 'testdrawcircle' was not declared in this scope

NokiaRusTest:120: error: 'testdrawroundrect' was not declared in this scope

NokiaRusTest:124: error: 'testfillroundrect' was not declared in this scope

NokiaRusTest:128: error: 'testdrawtriangle' was not declared in this scope

NokiaRusTest:132: error: 'testfilltriangle' was not declared in this scope

NokiaRusTest:137: error: 'testdrawchar' was not declared in this scope

NokiaRusTest:176: error: 'utf8rus' was not declared in this scope

NokiaRusTest:196: error: 'testdrawbitmap' was not declared in this scope

exit status 1
'testdrawline' was not declared in this scope "

Чего-то, блин еще не хватает ?