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

Графические контроллеры FT8xxРабота с пользовательскими шрифтами.

Графические контроллеры FTDI FT8xx имеют встроенный набор шрифтов нескольких типоразмеров. Эти шрифты ограничиваются стандартным набором ASCII символов. Но, микросхемы FT8xx имеют возможность работать с подгружаемыми пользовательскими шрифтами. В настоящей статье мы расскажем на примерах о базовых принципах работы с такими шрифтами.

 

Для вывода текстовой информации на экран дисплея в графических контроллерах FTDI предусмотрен ряд специализированных команд. Эти команды (например, CMD_Text или CMD_Number) используют для своей работы растровые шрифты. Графические контроллеры имеют предустановленный набор таких шрифтов. В микросхемах серии FT80x доступно 16 типоразмеров одного шрифта, в серии FT81x – 17. Каждый набор состоит из 127 символов, порядок которых соответствует стандартной кодировке ASCII.

Кроме встроенных шрифтов, графические контроллеры FTDI могут работать с пользовательскими шрифтами. В качестве пользовательского шрифта может выступать любой растровый шрифт, например, из состава шрифтов Windows (условия его использования определяются лицензионными соглашениями для каждого конкретного шрифта). Пользовательский шрифт тоже ограничивается 127 символами. Перед использованием такого шрифта в программе он должен быть загружен в графическую память контроллера FT8xx. Теоретически, в приложении одновременно можно использовать до 16 шрифтов. На практике мы ограничены размером графической памяти контроллера: 256 кБайт для FT80x и 1Мбайт для FT81x.

Для конвертации шрифта производитель предлагает специализированные утилиты, самой удобной из которых является Screen Editor v.1.17 (см. рис. 1).

Screen Editor

C ее помощью мы можем сразу оценить, как будет выглядеть наш шрифт на экране дисплея, какие объемы памяти микроконтроллера (МК) и графической памяти FT8xx потребуется для хранения шрифта и работы с ним. Сконвертированный шрифт имеет ряд параметров (ширина, высота и т.д), которые были описаны в статье “Графический контроллер EVE FT800 FTDI. Работа с пользовательскими шрифтами, кнопками и сенсорным экраном.” При использовании Screen Editor все параметры рассчитываются автоматически и, при генерации проекта в Arduino или MS Visual Studio (MSVС), подставляются в функции загрузки шрифта автоматически. 

Процесс конвертации начинается с добавления выбранного шрифта в Screen Editor, это делается во вкладке “Content” -> “Add”. Для примера были выбраны два шрифта с сайта http://www.fonts-online.ru/, исходные файлы которых можно найти в этом архиве (ссылка). Как только шрифт добавлен, для него становятся доступными настройки параметров во вкладке “Properties”, см. рис.2.

свойства шрифта

Одновременно с этим можно сразу “перетащить” добавленный шрифт в центральное окно утилиты. При этом мы сразу увидим его графическое представление и как оно будет выглядеть на экране дисплея (рис.1), а в нижнем текстовом окне утилиты увидим набор команд, которые требуются для его загрузки в графический контроллер и вывода на экран дисплея. Все манипуляции с параметрами нового шрифта будут синхронно отображаться в центральном окне утилиты, что позволяет сразу оценить влияние того или иного параметра на качество отображения.

В области “Content” интересным для нас может быть только поле “Name”, в нем задается имя шрифта, которое потом будет использоваться при создании проекта для MSVС или Arduino. Остальные поля, смысл которых очевиден из их названия, не трогаем и оставляем по умолчанию.

Область “Font” включает в себя три поля, которые отвечают за то, как будет выглядеть шрифт на экране и какой набор символов будет в него включен. Поле “Format” задает степень сглаживания шрифта на экране. Для выбора доступны три варианта L1 – минимальное сглаживание, L4 – среднее и L8 – максимальное. Поле “Size” отвечает за высоту шрифта, выбирается исходя из требований приложения. Поле “Charset” задает набор символов, которые будут включены в шрифт. По умолчанию, в этом поле задан стандартный набор символов ASCII. Любой из этих символов мы можем заменить на свой при условии, что требуемый нам символ есть в импортируемом шрифте.

Область “Memory Options” содержит поле “Address” для указания начального адреса, по которому шрифт будет загружаться в графическую память контроллера FT8xx. Одним из  удобств, которые дает нам использование утилиты Screen Editor, является автоматический расчет начального адреса для каждого нового добавляемого графического объекта (шрифта или растрового изображения). Эта функция полезна в том случае, когда все пользовательские объекты могут быть помещены в графическую память RAM_G одновременно. Галки “Loaded”, “Compressed” и “Embedded” остаются включенными, по умолчанию.

Поле “Information” содержит информацию о физическом размере шрифта и параметрах символа. Подробнее о параметрах шрифта Width, Height и Stride можно ознакомиться в статье “Графический контроллер EVE FT800 FTDI. Работа с пользовательскими шрифтами, кнопками и сенсорным экраном.” Физический размер шрифта дается для сжатого и распакованного видов. Первый показывает нам, какой объем памяти МК потребуется для хранения шрифта, второй – сколько графической памяти займет шрифт при загрузке его в графический контроллер. Эти размеры автоматически пересчитываются при любом изменении параметров шрифта (качество сглаживания, количество символов и высота), что позволяет сразу оценить внешний вид шрифта и объем памяти, требуемый для его хранения.

Теперь, когда мы подготовили шрифты для работы, можно приступить к генерации проекта. В данном примере, для управления графическим контроллером мы будем использовать персональный компьютер и MSVC. В качестве целевой платформы будем использовать 7” дисплей Riverdi серии uxTouch RVT70UQFNWC00 с разрешением 800х480 точек (рис.3).

RVT70UQFNWC00

Для подключения дисплея воспользуемся специальной отладочной платой Hermes Board (рис.4). Эта плата производства Riverdi представляет собой конвертер USB-SPI на базе моста FTDI FT232H. На этапе освоения плата будет полезным дополнением, с помощью которого можно быстро протестировать работоспособность дисплея и разрабатываемого кода с помощью персонального компьютера. Производитель дает примеры для MSVC, которые можно использовать в качестве заготовки для своих проектов. Они ничем не отличаются от примеров FTDI для MSVC, кроме параметров инициализации контроллеров FT8xx для работы с дисплеями Riverdi.

Итак, в качестве основы для нашего примера возьмем проект, предлагаемый компанией Riverdi для их дисплеев на базе микросхем FT81x: http://riverdi.com/downolads/Hermes_Board_FT81X_demo_source_code. Почему он нам нужен в качестве заготовки? К сожалению, на текущий момент инженеры FTDI не реализовали в новой версии утилиты Screen Editor 2.28 (с поддержкой новых контроллеров FT81x) функцию генерации кода для MSVC, как было описано в статье “Графический контроллер FT800. Программные средства разработки и отладки.”. Поэтому, если мы используем дисплеи с новыми контроллерами, нам приходится работать с предыдущей версией этой утилиты Screen Editor v.1.17 с последующим копированием рабочего кода программы в вышеприведенный пример. Несмотря на кажущуюся сложность данной процедуры, такой путь наиболее прост на этапе освоения возможностей графических контроллеров нового семейства FT81x.

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

 Следующим этапом будет генерация проекта для MSVC с помощью Screen Editor. Выполняется эта процедура через меню Scripts -> Export HAL (FTDI) Project. Результатом будет готовый проект MSVC для графических контроллеров серии FT80x. Откроем файл font_FTEVE_HAL.c этого сгенерированного проекта и скопируем нужный нам код. Это адрес RAM_DIGIT с массивом digit[] первого шрифта и адрес RAM_CYR_FONT с массивом второго шрифта cyr_font[]. Также скопируем основной код, в котором осуществляется загрузка обоих шрифтов в RAM_G и вывод на экран двух текстовых строк в подготовленный ранее проект:

Ft_Gpu_CoCmd_Dlstart(phost);

//Загрузка шрифтов в память контроллера

Ft_Gpu_Hal_WrCmd32(phost, CMD_INFLATE);

Ft_Gpu_Hal_WrCmd32(phost, RAM_DIGIT);

Ft_Gpu_Hal_WrCmdBuf(phost, digit, sizeof(digit));

Ft_Gpu_Hal_WrCmd32(phost, CMD_INFLATE);

Ft_Gpu_Hal_WrCmd32(phost, RAM_CYR_FONT);

Ft_Gpu_Hal_WrCmdBuf(phost, cyr_font, sizeof(cyr_font));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_HANDLE(0));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_SOURCE(148));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_LAYOUT(L4, 24, 77));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_SIZE(NEAREST, BORDER, BORDER, 48, 77));

Ft_Gpu_CoCmd_SetFont(phost, 0, 0);

Ft_App_WrCoCmd_Buffer(phost, BITMAP_HANDLE(1));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_SOURCE(118568));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_LAYOUT(L4, 12, 20));

Ft_App_WrCoCmd_Buffer(phost, BITMAP_SIZE(NEAREST, BORDER, BORDER, 24, 20));

Ft_Gpu_CoCmd_SetFont(phost, 1, 118420);

Ft_App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

 

//Вывод текста на экран дисплея

Ft_App_WrCoCmd_Buffer(phost, COLOR_RGB(21, 212, 0));

Ft_Gpu_CoCmd_Text(phost, 50, 4, 0, 0, "1235678");

 

Ft_App_WrCoCmd_Buffer(phost, COLOR_RGB(212, 12, 32));

Ft_Gpu_CoCmd_Text(phost, 69, 136, 1, 0, " 01292364");

 

Ft_App_WrCoCmd_Buffer(phost, DISPLAY());

Ft_Gpu_CoCmd_Swap(phost);

Ft_App_Flush_Co_Buffer(phost);           

Этот код отвечает за загрузку шрифтов в графическую память контроллера FT8xx и вывод текстовой строки на экран. Проект Screen Editor, шрифты и сгенерированный утилитой проект доступны в следующем архиве. Откомпилируем и запустим проект – на экране дисплея появятся две текстовых строки, см. рисунок 5.

RVT70UQFNWC00

 

При работе с пользовательскими шрифтами есть одно неудобство - символы нашего шрифта заменяют собой символы стандартной кодировки ASCII. Это не позволяет использовать в программе русский текст в текстовых командах Ft_Gpu_CoCmd_Text в прямом виде. Русские символы необходимо заменять соответствующими кодами ASCII или стандартными символами, как показано в примере выше. В MSVC это можно обойти следующим образом:

unsigned char mytext[] = "ПРИВЕТ";

int t;        

for (t = 0; t

                {

                               mytext[t] = mytext[t] - 160;

                }

                while (1)

                {

                                Ft_Gpu_CoCmd_Dlstart(phost);

                               Ft_App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

 

                               Ft_App_WrCoCmd_Buffer(phost, COLOR_RGB(21, 212, 0));

                               Ft_Gpu_CoCmd_Text(phost, 50, 4, 0, 0, "1235");

 

                               Ft_App_WrCoCmd_Buffer(phost, COLOR_RGB(212, 12, 32));

                               Ft_Gpu_CoCmd_Text(phost, 69, 136, 1, 0, mytext);

 

                               Ft_App_WrCoCmd_Buffer(phost, DISPLAY());

                               Ft_Gpu_CoCmd_Swap(phost);

                               Ft_App_Flush_Co_Buffer(phost);

                }

 

Разница между кодами русских символов в таблице Win-1251 и в нашем шрифте cyr_font равняется 160. Эту разницу мы компенсируем в цикле для всех элементов текстовой переменной mytext в коде выше. Приведенный пример будет работать в MSVC, но не сработает в Arduino. В Arduino используется другая кодировка символов, отличная от Win-1251. Соответственно, в зависимости от используемого компилятора, пересчет придется выполнять по-разному. Все то же самое справедливо и для случаев, когда мы используем данные из внешней среды, полученные по тому или иному каналу обмена, и пытаемся их отобразить на экране дисплея. Мы должны учитывать, в какой кодировке принимаются данные и пересчитывать коды символов в соответствии с ней.

Как уже упоминалось в начале статьи, каждый шрифт может содержать до 127 символов. Мы можем задавать любое количество символов в пределах данной границы. Например, нам необходим специальный шрифт большого размера и содержащий только цифровые значения, как шрифт digit в примере (рис.6). Мы можем оставить весь стандартный набор ASCII символов, включая служебные:"                                 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~". Такой подход приемлем до тех пор, пока для работы нашего приложения достаточно графической памяти микросхем FT8xx. Объем памяти, необходимый для хранения шрифта (МК) и работы с ним (FT8xx), пропорционально зависит от трех параметров: количества символов, его размера (size) и сглаживания. Служебные символы в диапазоне кодов с 0x00 по 0x31 таблицы ASCII, хотя и не отображаются на экране, но занимают такой же объем памяти, что и отображаемые. В целях экономии памяти мы можем убрать из шрифта все элементы, которые не будут использованы в нашем приложении, например, оставив только цифры: “ 0123456789” (рис.6).

шрифт

Пробел в начале строки предназначен для сохранения служебного символа “конец строки” с кодом 0х00. Этот символ используется компилятором при работе со строковыми переменными. Если мы заменим его пользовательским элементом, функции работ со строками будут работать некорректно. Проект с шрифтом digit доступен в данном архиве.

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