микроконтроллеры от ведущих мировых производителей

Новые графические контроллеры FTDI/Bridgetek BT81x.

Что нового? Работа со шрифтами Юникод.

Сергей Долгушин, dsa@efo.ru

В настоящей статье продолжаем рассматривать новые функции графических контроллеров FTDI/Bridgetek BT81x. Сегодня речь пойдет о работе со шрифтами Юникод.

Одним из основных элементов графического интерфейса является шрифт. В том или ином объеме он всегда присутствует на экране. При этом для русскоязычных приложений иногда необходимо иметь поддержку двух наборов символов: английского и кириллицы. C введением поддержки шрифтов Юникод в новом семействе графических контроллеров BT81x работа с двумя наборами символов стала простой и удобной для разработчика.    

Во всех  семействах графических контроллеров FTDI предусмотрена аппаратная поддержка шрифтов. Все микросхемы имеют встроенный набор шрифтов, набор символов которых соответствует таблице ASCII. Контроллеры EVE FT80x имеют 16 шрифтов, EVE 2 и EVE 3 – 14 шрифтов. Также, микросхемы семейств EVE 2 и 3 имеют два дополнительных шрифта, символы в которых соответствуют дополнительному набору символов расширенной таблицы ASCII (коды 128-255 кодовой страницы 437). На рисунке 1 показано, как выглядят все встроенные шрифты на экране дисплея Riverdi 4.3” (разрешение экрана 480 х 272 точки):

Рисунок 1. Отображение встроенных шрифтов на экране дисплея 4.3"

Главным минусом встроенных шрифтов является то, что набор их символов ограничен только английскими буквами. Для работы с другими языками необходимо создавать свои шрифты. Поддержка пользовательских шрифтов также реализована в контроллерах FTDI. Пользовательский шрифт может быть создан путем конвертации любого TTF шрифта, а работа с ним полностью аналогична работе с встроенными шрифтами. Общая методика работы была описана в статье “Графические контроллеры FT8xx. Работа с пользовательскими шрифтами и растровыми изображениями” (http://mymcu.ru/storage/content/devtools/FTDI/09_1792.pdf)  и она поддерживается всеми семействами контроллеров.

У такого принципа работы есть ограничения, если на экран необходимо выводить символы разных алфавитов. Это связано с тем, что во всех командах, которые работают с выводом текста, присутствует указатель на шрифт. Это приводит к тому, что при выводе на экран дисплея строки “команда CMD_Text” нам потребуется разбить ее на две части и выводить по очереди с помощью двух команд русский и английский наборы символов. Кроме того, встроенные шрифты разработаны FTDI. Это сделано для того, чтобы не платить отчисления за использование чужих шрифтов. Но при этом достаточно проблематично подобрать парный шрифт для создания своего.   

В новом семействе контроллеров EVE 3 введена поддержка работы со шрифтами Юникод, что позволяет уйти от ограничений, описанных выше. Юникод - это стандарт, с которым более подробно можно познакомиться на официальном сайте: https://www.unicode.org/ . Для практического применения нам достаточно понимать, что шрифт в стандарте Юникод может содержать несколько наборов символов. При использовании такого шрифта для вывода строки “команда CMD_Text” понадобится только одна команда.

А теперь подробнее расскажем о работе со шрифтами Юникод на примере шрифта Arial. В качестве рабочей платформы будем использовать дисплей Riverdi RVT43ULBNWC00 и переходную плату Hermes board для подключения дисплея к ПК. В качестве среды разработки используем Visual Studio 2019.

Для подготовки шрифта и загрузки его во флэш-память модуля RVT43ULBNWC00 используется уже знакомая по предыдущим статьям утилита EVE Asset Builder (EAB). По данной ссылке вы найдете последнюю версию 0.4.8 этой утилиты. Это бета-версия, а почему лучше использовать ее, а не версию 0.4.2 с сайта производителя расскажем далее.

 

Рисунок 2. Вкладка Generate Font утилиты Eve Asset Builder (слева версия 0.4.2, справа - 0.4.8)

Утилита EAB поддерживает работу со всеми семействами графических контроллеров FTDI/Bridgetek. В окне преобразования (см. рис. 2) шрифтов Generate Font указываем пути к расположению исходного файла шрифта, папки, куда будет размещен преобразованный шрифт и размер шрифта. Названия папок не должны содержать русских символов, в противном случае преобразование шрифта завершится ошибкой “Conversion failed!”.

Далее выбираем вкладку Extended format (BT81x). В этой вкладке задаются параметры сжатия шрифта в выпадающих меню ASTC block footprints и Compression speed, а также память, из которой шрифт будет вызываться. Все эти параметры оставляем по умолчанию.

Следующим пунктом идет опция, определяющая пользовательский набор символов в конвертируемом шрифте. Если ее не ставить, то наш итоговый шрифт будет содержать весь набор символов, который был в исходном шрифте. В большинстве случаев в этом нет необходимости, и для большинства приложений будет достаточно двух наборов символов – кириллицы и английского. Кроме того, количество символов, как и их размер, влияет на размер итогового шрифта. Ниже представлены размеры итоговых файлов после преобразования шрифта Arial:

arial_14.glyph : 1024896 байт

arial_14.xfont : 9280 байт

arial_20.glyph : 77568 байт

arial_20.xfont : 8704 байт

Шрифт Arial с размером символов 14 включает полный набор символов исходного шрифта, файл с расширением glyph – это сам шрифт, файл xfont – его метрика. Соответственно второй набор файлов – это тот же самый шрифт Arial, но его символы имеют размер 20 и итоговый набор символов включает весь набор символов ACSII + все заглавные символы кириллицы (см. рис.3)

Рисунок 3. Шаблон с набором символов для создания пользовательского шрифта

А теперь настало время сказать об отличиях в версиях утилиты EAB 0.4.2 и 0.4.8. Если мы конвертируем шрифт с полным набором символов, то разницы между версиями утилиты нет. Обе версии преобразуют шрифт Юникод корректно, русский и английский шрифты отображаются на экране правильно. Но, как мы показали выше, шрифт с полным набором символов имеет существенный объем, и если речь идет об использовании дисплеев Riverdi серии EVE 3, то один полный шрифт Юникод займет 1/8 объема флэш-памяти. Кроме того, для типовых приложений нет необходимости в полном наборе символов - кириллицы и английского достаточно. И вот именно в этом случае при выборе пользовательского набора символов в версиях утилиты EAB есть принципиальное отличие. На рисунке 2 справа от поля, в котором указываем путь к текстовому файлу с заданным набором символов, есть выпадающее меню “Code point mode”. В этом меню можно выбрать способ кодировки UTF-8 или Ordinal. В версии 0.4.2 это меню отсутствует, а кодировкой по умолчанию является Ordinal. Тогда как при работе, например, в Visual Studio для корректного отображения на экране дисплея строки типа “Gpu_CoCmd_Text(phost, 220, 200, 1, 0, "Надпись встроенным шрифтом 27"); ” требуется кодировка UTF-8 (см. рис. 5). 

Результатом преобразования шрифта являются, как уже было отмечено выше, два файла с расширениями glyph и xfont. Во вкладке Generate flash утилиты EAB создаем образ для загрузки во внешнюю флэш-память дисплея RVT43ULBNWC00. В это образ должны быть включены оба файла (glyph и xfont) подготовленного шрифта. Полученный образ загружаем во флэш-память дисплея (см. рис.4).

                 

Рисунок 4. Создание образа и загрузка его во флэш-память модуля

 

Листинг функции, в которой осуществляются инициализация пользовательских шрифтов и вывод изображения на экран, приведен ниже (внешний вид результата выполнения данного кода приведен на рис. 5):

void Skeleton(Gpu_Hal_Context_t *phost)

{

                Gpu_CoCmd_Dlstart(phost);

                //установка максимальной скорости работы с внешней флэш-памятью 

Gpu_CoCmd_FlashFast(phost, 0);

//загрузка метрик (xfont) шрифтов

                Gpu_CoCmd_FlashRead(phost, 0, 1028992, 9280); // 0 – адрес в RAM_G;1028992 – адрес во внешней флэш-памяти; 9280 – размер метрики

                Gpu_CoCmd_FlashRead(phost, 9280, 1136576, 8704);

                //присваивание указателей 1 и 2 пользовательским шрифтам 

Gpu_CoCmd_SetFont2(phost, 1, 0, 0); // 1 – указатель на шрифт, 0 – начальный  адрес метрики шрифта в RAM_G

                Gpu_CoCmd_SetFont2(phost, 2, 9280, 0);

                //вывод графических элементов на экран дисплея

                App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

Gpu_CoCmd_Text(phost, 10, 10, 1, 0, "Full Unicode: ABCDEF АБВГД 12345 ,./';");

                Gpu_CoCmd_Text(phost, 10, 30, 2, 0, "User's Charset: АБШЩУ ABVDG");

                Gpu_CoCmd_Button(phost, 44, 186, 155, 53, 27, 0, "Button");

                Gpu_CoCmd_Button(phost, 44, 123, 155, 53, 2, 0, "СТАРТ");

                Gpu_CoCmd_Button(phost, 44, 60, 155, 53, 1, 0, "Кнопка");

                Gpu_CoCmd_Text(phost, 220, 70, 1, 0, "Надпись шрифтом Arial 14\nв кодировке Unicode");

                Gpu_CoCmd_Text(phost, 220, 125, 1, 0, "Надпись шрифтом Arial 20\n в кодировке Unicode \nпользовательский набор ");

                Gpu_CoCmd_Text(phost, 220, 200, 1, 0, "Надпись встроенным шрифтом 27");

                App_WrCoCmd_Buffer(&host, DISPLAY());

                Gpu_CoCmd_Swap(&host);

                App_Flush_Co_Buffer(&host);

                Gpu_Hal_WaitCmdfifo_empty(&host);

}

Рисунок 5. Результат выполнения функции, приведенной выше

 

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

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

Стандартной командой Gpu_CoCmd_SetFont2 (эта команда была введена, начиная с семейства EVE 2) присваиваем шрифтам указатели.

Командой Gpu_CoCmd_FlashFast включаем режим быстрого доступа к внешней флэш-памяти. Как говорилось в предыдущих статьях, графические контроллеры BT81x могут работать с элементами во внешней памяти только в режиме быстрого доступа.

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

Говоря о новых функциях для работы со шрифтами, отметим еще одно нововведение. Оно касается форматированного вывода текста на экран. В семействах контроллеров EVE – EVE 2 в команде CMD_Text были доступны только опции выравнивания текста. В графические контроллеры BT81x производитель добавил дополнительные опции и команды для форматирования текста. Ниже рассмотрим пару опций, которые могут быть наиболее полезны, например, их можно использовать для создания всплывающих подсказок на экране.

 Первый вариант – это перенос части строки с помощью опции перевода строки “\n”. В листинге, приведенном выше, можно посмотреть пример ее использования. При использовании данной опции мы определяем ширину блока текста “на глаз”. В случае однотипного текста, как в примере выше, это удобно. Если же текст большой и его надо вписать в некоторое ограниченное пространство, например, всплывающее окно с подсказкой, то удобнее воспользоваться второй опцией.

Второй вариант – перенос текста в строке с помощью опций OPT_FILL и команды CMD_FillWidht. Командой CMD_FillWidht задается максимальная длина строки в пикселях. При превышении заданного значения текст, выводимый командой CMD_Text с установленной опцией OPT_FILL, автоматически разбивается на строки, длина которых меньше или равна заданному командой CMD_FillWidht значению. В следующем листинге приводится пример вывода текста в окне с помощью этих инструментов, а результат выполнения данного кода показан на рисунке 6:

// левое текстовое окно

// рисуем нижний прямоугольник белого цвета, который будет формировать белую рамку

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));

App_WrCoCmd_Buffer(phost, BEGIN(RECTS));
App_WrCoCmd_Buffer(phost, VERTEX2II(8, 8, 0, 0));
App_WrCoCmd_Buffer(phost, VERTEX2II(201, 201, 0, 0));
App_WrCoCmd_Buffer(phost, END());

// рисуем верхний прямоугольник черного цвета, который будет формировать текстовое окно
App_WrCoCmd_Buffer(phost, COLOR_RGB(0, 0, 0));
App_WrCoCmd_Buffer(phost, BEGIN(RECTS));
App_WrCoCmd_Buffer(phost, VERTEX2II(10, 10, 0, 0));
App_WrCoCmd_Buffer(phost, VERTEX2II(200, 200, 0, 0));
App_WrCoCmd_Buffer(phost, END());
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));

// задаем ширину блока текста, чтобы он вписывался в размеры текстового окна
Gpu_CoCmd_FillWidth(phost, 160);

// выводим текст
Gpu_CoCmd_Text(phost, 30, 30, 1, OPT_FILL, "Вывод блока текста в заданной области. Строка автоматически переносится, если ее длина превышает значение в команде FillWidht");

// правое текстовое окно

App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
App_WrCoCmd_Buffer(phost, BEGIN(RECTS));
App_WrCoCmd_Buffer(phost, VERTEX2II(208, 8, 0, 0));
App_WrCoCmd_Buffer(phost, VERTEX2II(401, 201, 0, 0));
App_WrCoCmd_Buffer(phost, END());
App_WrCoCmd_Buffer(phost, COLOR_RGB(0, 0, 0));
App_WrCoCmd_Buffer(phost, BEGIN(RECTS));
App_WrCoCmd_Buffer(phost, VERTEX2II(210, 10, 0, 0));
App_WrCoCmd_Buffer(phost, VERTEX2II(400, 200, 0, 0));
App_WrCoCmd_Buffer(phost, END());
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
Gpu_CoCmd_FillWidth(phost, 160);

//в отличие от предыдущего текст в данном окне имеет выравнивание по центру 
Gpu_CoCmd_Text(phost, 310, 30, 1, OPT_FILL | OPT_CENTERX, "Вывод блока текста в заданной области. Строка автоматически переносится, если ее длина превышает значение в команде FillWidht");

// пример использования опции переноса строки «\n»

Gpu_CoCmd_Text(phost, 30, 220, 1, 0, "Перенос текста с помощью \nопции перевода строки");

    

Рисунок 6. Результат выполнения кода, приведенного выше

Также отметим, что теперь приобретают значение и опции выравнивания текста. В перовом окне на рисунке .. текст выровнен по левому краю (опция используется по умолчанию, если не указано другое), а во втором окне - текст выровнен по центру с помощью опции OPT_CenterX.

 Итак, этой статьей мы заканчиваем цикл «Новые графические контроллеры FTDI/Bridgetek BT81x. Что нового?». В этом цикле мы рассказали о наиболее важных нововведениях и показали на примерах, как работать с новыми функциями. На текущий момент графические контроллеры FTDI/Bridgetek являются самым простым в освоении решением. Они не требовательны к ресурсам управляющего микроконтроллера, при этом с их помощью можно реализовать удобный и привлекательный, по современным меркам, графический интерфейс пользователя. На базе этих контроллеров выпускаются готовые модули дисплеев компании Riverdi, которые можно рекомендовать для небольших проектов.

 

По техническим вопросам можно обращаться к Долгушину Сергею (dsa@efo.ru)

Напоимнаем также, что новые дисплеи Riverdi с контроллерами BT81x доступны с нашего склада по специальным ценам, информация по перечню моделей и специальные цены на них доступны по данной ссылке