Руссификация библиотеки UTFT
- Войдите на сайт для отправки комментариев
Сб, 13/02/2016 - 01:09
Доброй ночи.
Возникло желание руссифицировать библиотеку, порывшись нашел на гитхабе , но не запустил, куча ошибок.
Железо такое:
IDE 1.6.7 Arduino DUE +CTE 7'' 1963 дисплей. +CTE Shild for DUE.
Нашел толковый пример:
Все сделал, а на экране вот это:

Пример компилируется без ошибок, в чем дело? Может в файле русских шрифтов?
Все изобретают велосипед. Я сделал по простому. В настройках IDE устанавливаем preproc.substitute_unicode=false. Это дает возхможность отображать не от -128 до 128, а от 0 до 255. Дописываете таблицу знакогенератора русским алфовитом, ву а ля. Только в гребаной UTFT это дело сожрет кучу ROM, так как под каждый размер шрифта надо писать свой дамп знакогенератора. Или размещать его во внешней флэш и при необходимости размещать в RAM. Но тогда опять возникает проблема, надо переписать функцию вывода пикселя для вывода символа т.к. он буде размещен не в ROM.
Спасибо конечно. Если бы понимал о чем вы пишете, то вероятно разобрался с проблемой выше. Чем плох способ указанный в первом сообщении? У кого-то же он работал...
Способ плох тем, что не работает.
И ссылка какая-то странная. Я по ней попадаю на http://arduino.ru/?p=2240 .
Пробовал править, один хер сюда ведет. В общем, скопировать и в браузер закинуть.
Способо не работает у меня. У дргих то он работал. Наверное...
Думаю что достаточно поменять настройку IDE как я писал выше и попробовать не используя эту функцию выполнить вывод русского шрифта с помощью стандартно функции UTFT. Что то мне подсказывает что будет выведен русский шрифт. Почему я так уверен, да потому что у меня так работает, правда в библиотеке Adafruit. Способ с перекодировкой довольно сложен, так как здесь, как я понял, происходит обращение к таблицы через преобразование кода буквы в указатель на позицию в массиве в которой размещен 1 байт выводимого символа.
Ух запарился пока писал.
Подскажи пожалуйста, где эта настройка в каком файле?
Открываем IDE arduino. Меню Файл/настойки.\ В открывшимся окне внизу выбераем C:\Users\.........
В открывшемся окне находим файл preferences, открываем, там находим строчку preproc.substitute_unicode=true, меняем значение на false. Обязательно!!! закрываем IDE!!!! Сохраняем изменения. Запускаем IDE пробуем.
С UTFT не пробовал, но при необходимости можно попробовать TFT есть, mega256 собрано штук 7, файл с кирилицей скачал, осталось выкроить время для эксперимента.
Попробовал русский шрифт выводится с настройкой preproc.substitute_unicode=true, но со всякими слешами и опострофами, при этом кодировка нарушена смещение примерно в 29 символов. Вместо "А" выводится 'Ъ" . Надо попытаться понять как функция printChar определяет адрес первого байта символа. Тогда можно отредактировать файл RussianFonts так чтобы все русские символы выводились правильно. Еще раз убеждаюсь в том что UTFT ламерская библиотека заточенная только на латиницу.
Ну походу понял в чем суть, увеличил количество байт в файле знакогенератора, перепишу знакогенератор на кирилицу , выложу файл. Попробуешь. Уже заглавные корректно выводит.
Ну вот, закончил. 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
...
Большое спасибо за старания. Но нихрена не вышло. Видимо я туплю где-то. Мои шаги:
1. Справил преференсес на false. Проверяю, ок, значение не изменилось.
2. Закидываю шрифт в папку скетча.
3. Обявляю шрифт
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) {}; }Какого оно глючит?
Кидал фонт и в либу поп пути указанном в примере, те же фаберже.
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 модули. Похоже шрифты зашиты жестко и сделать что то с ними не просто. Надо брать даташит и читать. В монохромных помню можно было записав смещение в память контроллера матрицы скопировать туда свои шрифты из программы и юзать их.
Благодарю. Буду пробовать, отпишусь. Так или иначе, мое глубокое уважение и благодарности за уделенное время.
Только обратил внимание. Где у вас в скетче строка #define <UTFT_CTE.h>?
SmallFont подключать нет нужды в файле SmallRusFont содержится и кирилица и латиница.
Под Due указанный пример надо чуть переделать, тогда будет нормально отображать русские буквы из файла шрифта. Дело в том, что под Due не так определён pgm_read_byte, поэтому символы не так читаются. Короче, решение: там, где было:
Заменить на
и будет щастье :)
Я добавил в библиотеку кириллические символы на накидал не замысловатую функцию для их вывода в кодировке 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