Русификация библиотеки TFT_eSPI

Ulf
Offline
Зарегистрирован: 28.05.2021

Всем доброго здравия!
Опираясь на тему http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
я сделал попытку русифицировать библиотеку TFT_eSPI:
- заменил файл glcdfont.c
- вставил в код скетча функцию utf8rus
Однако вывести русские буквы все равно не получается. На жк дисплей не выводится ровным счетом ничего.
В монитор порта выводятся квадраты.
Буду благодарен любой помощи.

#include

TFT_eSPI tft = TFT_eSPI();

void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
tft.init();
tft.setSwapBytes(true);
tft.begin();
tft.fillScreen(TFT_BLUE);
}

void loop()
{
tft.setTextSize(1);
tft.setTextColor(TFT_WHITE);
tft.drawString(utf8rus("йцуфывячс"),0,0,4);
Serial.println(utf8rus("йцуфывячс"));
delay(4000);
}

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 <= 0x30)
{
n = n + 0x2F;
}
break;
}
case 0xD1:
{
n = source[i];
i++;
if (n == 0x91)
{
n = 0xB8;
break;
}
if (n >= 0x80 && n <= 0x70)
{
n = n + 0x6F;
}
break;
}
}
}
m[0] = n;
target = target + String(m);
}
return target;
}

Ulf
Offline
Зарегистрирован: 28.05.2021

Прошу прощения за плохо форматированный код в пером сообщении. Не нашел кнопки редактора.
Отформатированный код привожу ниже.

#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

void setup() 
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  tft.init();
  tft.setSwapBytes(true);
  tft.begin();
  tft.fillScreen(TFT_BLUE);
}

void loop() 
{
  tft.setTextSize(1);
  tft.setTextColor(TFT_WHITE);
  tft.drawString(utf8rus("йцуфывячс"),0,0,4);
  Serial.println(utf8rus("йцуфывячс"));
  delay(4000);
}

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 <= 0x30) 
          {
            n = n + 0x2F;
          }
          break;
        }
        case 0xD1: 
        {
          n = source[i]; 
          i++;
          if (n == 0x91) 
          { 
            n = 0xB8; 
            break; 
          }
          if (n >= 0x80 && n <= 0x70) 
          {
            n = n + 0x6F;
          }
          break;
        }
      }
    }
    m[0] = n; 
    target = target + String(m);
  }
  return target;
}

 

FoxJone
Offline
Зарегистрирован: 19.04.2019

Я таки дико извиняюсь, а в используемых фонтах вообще есть русские буквы то?

С библиотекой этой не знаком (и лениво ее даже искать - мне она не надо), но все ей подобные имеют возможность выбора фонтов. В коде не заметил указания на фонты, значит ставит какой то дефолтный (или вообще никакой).

Как то так проблема, я думаю...

Bill1389
Offline
Зарегистрирован: 19.10.2021

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

Ulf
Offline
Зарегистрирован: 28.05.2021

К сожалению нет, не удалось.

Вопрос остается актуальным, но пока работы по проекту временно остановлены.

b707
Offline
Зарегистрирован: 26.05.2017

Ulf пишет:

К сожалению нет, не удалось.

вы на вопрос в сообщении #2 так и не ответили. В фонтах библиотеки есть русские буквы? - если нет, редактировать код бессмысленно, надо сначала найти фонты с кириллицей

Bill1389
Offline
Зарегистрирован: 19.10.2021

У меня в фонтах есть библиотека с кирилицей. Например TimesNRCyr14, но не могу ее нормально использовать. Подключаю, она точно активна, но русские буквы не выводит. Если в скетче вместо букв использовать код символов, например \x9f\xa0\x98\x92\x95\xa2 на tft экране выведет ПРИВЕТ.

b707
Offline
Зарегистрирован: 26.05.2017

значит у вас неправильная кодировка в Ардуино ИДЕ. Там в редакторе есть кнопка "Исправить кодировку и перезагрузить" - попробуйте с ней

Bill1389
Offline
Зарегистрирован: 19.10.2021

Какая должны быть кодировка? У меня VSCode и PlatformIO, кодировки скетча менял через notepad++ и сохранял, так как не нашел в VS как сменить. Пробовал кодировку скетча win-1251? koi-8r, utf-8 - результат один, нет символов на экране. Уже задумываюсь в библиотеке изменить значения латинских букв на кирилицу и использовать так. ну типа пишешь F - а на экране А...

b707
Offline
Зарегистрирован: 26.05.2017

Bill1389 пишет:

Какая должны быть кодировка?

Вопрос на 100 рублей :)     .... у вас функция перекодировки называется utf8rus()

 

если у вас вот это -  \x9f\xa0\x98\x92\x95\xa2 - работает и на tft экране выведет ПРИВЕТ - значит в принципе библиотека работает и вся проблема только в кодировке. Тут уже смешно спрашивать в форуме, тут надо садиться и искать. что у вас портит кодировку.

Bill1389
Offline
Зарегистрирован: 19.10.2021

Да понятно что логичную кодировку файла я испробовал). И не только ее...Не едут лыжи и все тут.

b707
Offline
Зарегистрирован: 26.05.2017

Bill1389 пишет:

Не едут лыжи и все тут.

еще посмотрите, какая кодировка в фонте и совпадает ли она с выходной кодировкой конвертера utf8rus()

Bill1389
Offline
Зарегистрирован: 19.10.2021

Спасибо, разобрался.... Функция utf8rus была кривая. Уже и не вспомню откуда брал ее, но с какого-то соседнего форума....

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;
}

Поменял ее на ту что в этой ветке - все заработало. Спасибо

tager
Offline
Зарегистрирован: 24.09.2018

Скетч и русские шрифты. Проверял на esp32.

https://cloud.mail.ru/public/UvrQ/hphncmznm

Rankle
Offline
Зарегистрирован: 31.10.2020

tager пишет:

Скетч и русские шрифты. Проверял на esp32.

https://cloud.mail.ru/public/UvrQ/hphncmznm

скажите чем конвертируете TTF (OTF) шрифты в VLW формат (который у вас в архиве)?