В процессе разработки пульта управления для системы сбора дождевой воды появилась у меня потребность вывода текста под углом. В случае TFT-дисплея отмахнулся бы от подобного желания, как требующего слишком много ресурсов от микроконтроллера. Но поскольку графикой в моих проектах занимается полновесный графический процессор (тот, который установлен в смартфоне и управляется с Ардуины по Bluetooth- или WiFi-каналу), то почему бы и нет?
Сказано - через несколько дней сделано.
В результате, система команд моего виртуального дисплея дополнилась еще одной - “#TM<параметры>;”. С ее помощью дисплею задается матрица преобразования, вращающая выводимый после нее текст на заданный угол вокруг заданного центра вращения. Эта матрица преобразования учитывается при всех последующих выводах текста до тех пор, пока она не будет изменена или обнулена.
Теперь немного подробнее о формате команды. В ней передается три параметра:
“#TM,,;”
это, соответственно, координаты центра вращения (X,Y) и угол поворота текста (Alpha). Пара X,Y задает расстояние в пикселях до центра вращения от верхнего левого угла дисплея, а Alpha - угол поворота выводимого текста (в градусах), положительное направление - против часовой стрелки.
Далее приведен блок кода, использовавшийся для тестирования. Он выводит текстовые строки под углами от 90 градусов до -90 с шагом -30 градусов, т.е. под углами 90, 60, 30, 0, -30, -60, -90 градусов.
Чтобы два раза не вставать, в этот блок добавлены команды изменения размера шрифта (setTextSize), а также команды изменения цвета шрифта/фона (setTextColors).
Текст с выравниванием по левой границе выводится командой outTextL.
Последней формируется команда обнуления матрицы преобразования “#TM0,0,0;”, после обработки которой все последующие текстовые выводы будут производиться строго горизонтально.
i=0;
for(int a=90;a>=-90;a=a-30) {
if(i%2==1) addCmdString(mdScout.setTextColors(i+1, i));
else addCmdString(mdScout.setTextColors(i+1, 0));
addCmdString(mdScout.setTextSize(20+i*2));
sprintf(s,"#TM130,%d,%d;",350,a);
addCmdString(s);
sprintf(s,"= Текст под углом %d =",a);
addCmdString(mdScout.outTextL(100,350+i*20,s));
i++;
}
addCmdString("#TM0,0,0;");
sendString(sResponse);
В результате выполнения этого цикла получаем на экране смартфона следующую картинку:
Вот, собственно, и все - задача вращения текста решается с минимальным использованием ресурсов микроконтроллера.