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

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Доброй ночи.

Возникло желание руссифицировать библиотеку, порывшись нашел на гитхабе , но не запустил, куча ошибок.

Железо такое:

IDE 1.6.7 Arduino DUE +CTE 7'' 1963 дисплей. +CTE Shild for DUE.

Нашел толковый пример:

http://грибовы.рф/?p=2240

Все сделал, а на экране вот это:

Пример компилируется без ошибок, в чем дело? Может в файле русских шрифтов?

diger67
Offline
Зарегистрирован: 25.07.2015

Все изобретают велосипед. Я сделал по простому. В настройках IDE  устанавливаем preproc.substitute_unicode=false. Это дает возхможность отображать не от -128 до 128, а от 0 до 255. Дописываете таблицу знакогенератора русским алфовитом, ву а ля. Только в гребаной UTFT это дело сожрет кучу ROM, так как под каждый размер шрифта надо писать свой дамп знакогенератора. Или размещать его во внешней флэш и при необходимости размещать в RAM. Но тогда опять возникает проблема, надо переписать функцию вывода пикселя для вывода символа т.к. он буде размещен не в ROM.

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Спасибо конечно. Если бы понимал о чем вы пишете, то вероятно разобрался с проблемой выше. Чем плох способ указанный в первом сообщении? У кого-то же он работал...

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

Способ плох тем, что не работает.

И ссылка какая-то странная. Я по ней попадаю на http://arduino.ru/?p=2240 .

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Пробовал править, один хер сюда ведет. В общем, скопировать и в браузер закинуть. 

Способо не работает у меня. У дргих то он работал. Наверное...

diger67
Offline
Зарегистрирован: 25.07.2015

Думаю что достаточно поменять настройку IDE как я писал выше и попробовать не используя эту функцию выполнить вывод русского шрифта с помощью стандартно функции UTFT. Что то мне подсказывает что будет выведен русский шрифт. Почему я так уверен, да потому что у меня так работает, правда в библиотеке Adafruit. Способ с перекодировкой довольно сложен, так как здесь, как я понял, происходит обращение к таблицы через преобразование кода буквы в указатель на позицию в массиве в которой размещен 1 байт выводимого символа.

Ух запарился пока писал.

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Подскажи пожалуйста, где эта настройка в каком файле?

diger67
Offline
Зарегистрирован: 25.07.2015

Открываем IDE arduino. Меню Файл/настойки.\ В открывшимся окне внизу выбераем C:\Users\.........

В открывшемся окне находим файл preferences, открываем, там находим  строчку preproc.substitute_unicode=true, меняем значение на false. Обязательно!!! закрываем IDE!!!! Сохраняем изменения. Запускаем IDE пробуем.

С UTFT не пробовал, но при необходимости можно попробовать TFT есть, mega256 собрано штук  7, файл с кирилицей скачал, осталось выкроить время для эксперимента.

diger67
Offline
Зарегистрирован: 25.07.2015

Попробовал русский шрифт выводится с настройкой preproc.substitute_unicode=true, но  со всякими слешами и опострофами, при этом кодировка нарушена смещение примерно в 29 символов. Вместо "А" выводится 'Ъ" . Надо попытаться понять как функция printChar определяет адрес первого байта символа. Тогда можно отредактировать файл RussianFonts так чтобы все русские символы выводились правильно. Еще раз убеждаюсь в том что UTFT ламерская библиотека заточенная только на латиницу.

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

diger67
Offline
Зарегистрирован: 25.07.2015

Ну вот, закончил. http://178.130.34.198/adafruit/UTFT/Rus_font/RussianFonts_UTFT.c

Тут лежит файл c SmallRusFont. Также содержит некоторые иконки, есть возможность добавит еще около 30 иконок. точно не считал. Меняем как описано выше preproc.substitute_unicode=true на false. И как ни вчем небывало, переключив регистр языка, выводим в скетче используя стандартную функцию UTFT myGLCD.print( "* Пишем по русски без гомороя *",  CENTER, 1); . Можно сказать спасибо.

Желающие по аналогии могут создать шрифты нужных размеров.

P.S. неудалось создать прописную "ё",  если остро необходимо вписываем ее в свободную строку дампа знакогенератора и выводим например как "\xA0". Что бы вы не мучались вот строчка которую надо подставит вместо свободной заполненной значениями 0x00.  0x00,0x00,0x00,0x28,0x00,0x30,0x48,0x78,0x40,0x30,0x00,0x00, // ё

 

http://178.130.34.198/adafruit/picture/pic_0004.jpg

...

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Большое спасибо за старания. Но нихрена не вышло. Видимо я туплю где-то. Мои шаги:

1. Справил преференсес на false. Проверяю, ок, значение не изменилось.

2. Закидываю шрифт в папку скетча.

3. Обявляю шрифт 

extern uint8_t  SmallRusFont[];

4. Компилю, шью, и вижу зюги.

вот код скетча:

#include <UTFT.h>

// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t  SmallRusFont[];

// Remember to change the model parameter to suit your display module!
UTFT myGLCD(CTE70, 25, 26, 27, 28);

void setup()
{
  myGLCD.InitLCD();

  myGLCD.clrScr();
}

void loop()
{
  myGLCD.setColor(0, 255, 0);
  myGLCD.setBackColor(0, 0, 0);

 
  myGLCD.setFont(SmallRusFont);
  myGLCD.print(" !\"#$%&'()*+,-./0123456789:;<=>?", CENTER, 120);
  myGLCD.print("@ПРИВЕТ ЖEFGHIJKLMNOPQRSTUVWXYZ[\\]^_", CENTER, 132);
  myGLCD.print("работай ты уже заманала vwxyz{|}~ ", CENTER, 144);



  while(1) {};
}

Какого оно глючит?

Кидал фонт и в либу поп пути указанном в примере, те же фаберже. 

 

diger67
Offline
Зарегистрирован: 25.07.2015

1. Если вы используете UTFT_CTE библиотеку, знакогенератор должен распологаться в IC SPI flash на шилде.

2. Что бы использовать его надо раскоментировать строку "#define CTE_DUE_SHIELD 1" в файле HW_ARM_defines.h, папка \hardware\arm  и как я понял он туда загрузится при прошивке (может и ошибаюсь) почитайте файл readme в папке с библиотекой. Интересно что такого define в этом файле нет.

3. Мой вариант работает с UTFT, когда массив расположен в памяти программ и вы не используете UTFT_CTE.

Резюмирую. При использовании UTFT_CTE создаем массив знакогенератора, прошиваем во внешнюю флэшь, при выводе букв и цифр библиотека извлекает данные из внешней флэш. Мало того там можно хранить и картинки. Вобщем используем на подобии SD. Попробуйте отключить UTFT_CTE и посмотреть отразится ли текст нормально. Потом разбирайтесь с этой библиотекой.

P.S.

Прочитал про CTE модули. Похоже шрифты зашиты жестко и сделать что то с ними не просто. Надо брать даташит и читать. В монохромных помню можно было записав смещение в память контроллера матрицы скопировать туда свои шрифты из программы и юзать их.

Hayabusa
Offline
Зарегистрирован: 29.03.2012

Благодарю. Буду пробовать, отпишусь. Так или иначе, мое глубокое уважение и благодарности за уделенное время. 

diger67
Offline
Зарегистрирован: 25.07.2015

Только обратил внимание. Где у вас в скетче строка #define <UTFT_CTE.h>?

SmallFont подключать нет нужды в файле SmallRusFont содержится и кирилица и латиница.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Под Due указанный пример надо чуть переделать, тогда будет нормально отображать русские буквы из файла шрифта. Дело в том, что под Due не так определён pgm_read_byte, поэтому символы не так читаются. Короче, решение: там, где было:

ch = pgm_read_byte(utf8_rus_charmap + ch);

Заменить на

ch = utf8_rus_charmap[ch];

и будет щастье :)

Muramur2000
Offline
Зарегистрирован: 11.11.2020

Я добавил в библиотеку кириллические символы на накидал не замысловатую функцию для их вывода в кодировке UTF-8

Так же допилил поддержку ST7796

Если кому надо, вот https://github.com/Muramur2000/UTFT_Rus

Текст с кириллицей выводится функцией printrus

Вот маленький пример 

#include <UTFT.h>

extern uint8_t BigFont[];

UTFT myGLCD(ST7796, 33, 35, 37, 39, 41);
//               SDI, SDK, CS, RESET, DC/RS
void setup() {
  Serial.begin(9600);
  myGLCD.InitLCD();
  myGLCD.setColor(64, 64, 64);
  myGLCD.fillScr(64, 64, 64);
  myGLCD.setFont(BigFont);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setBackColor(64, 64, 64);
  
  myGLCD.printrus(F("Привет, мир!"), CENTER, CENTER);

}

void loop() {
  // put your main code here, to run repeatedly:

}

Проверял только на DUE