Как стать автором
Обновить

Симулятор Графического Монохромного Дисплея на Graphviz

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров3.9K

В разработке электроники часто приходится делать отладку при помощи графических монохромных дисплеев типа SSD1306. Типа таких https://habr.com/ru/articles/741164/

Есть и вовсе законченные устройства с графическим монохромным экраном: научные калькуляторы, диктофоны, автомобильные OBDII тестеры/сканеры, MP3 players, рации, приборные панели автомобилей, фотовспышки, бесперебойные источники питания, бегущие строки в вагонах метро и может быть ещё что-нибудь.

Вот например LoRa трансивер TTGO Т-Beam c графическим дисплеем.

Есть и огромные графические монохромники в метро

В Калининграде есть стильные терминалы в автобусах с графическими OLED монохромными дисплеями

В принтере Ecosys тоже HMI на основе графического монохромного дисплея.

Матричные дисплеи часто встречаются в рациях

В чем трудности при работе с графическими дисплеями?

  1. Проблема в том, что если мы захотим отладить код для сложной графики на большом компьютере, то с удивлением обнаружим, что у языка Си для PC нет встроенной библиотеки для отрисовки битовых матриц в отдельном окне на канве подобно тому как это есть в python или С#. Одновременно с этим прошивки пишут на Си, а не на руthon и С#.

  2. Для написания поддержки сложной графики (бегущая строка, приборная панель, экранное меню, экранная клавиатура, QR код) на графических экранах надо много итераций пере прошивки микроконтроллеров. Это долго, приходится ожидать окончания процесса компиляции потом окончания процесса пере прошивки, чтобы наконец увидеть результат.

  3. Отладка графики на устройстве также требует наличия самого Target устройства и дополнительного оборудования: программатор, источник питания кабели USB-UART. Это особенно трудно в условиях R&D, когда платы разрабатывают параллельно с написанием прошивки и у программистов просто по полгода нет электронной платы для отладки кода.

Есть ли способ отлаживать GUI код графики прямо на LapTop(е) при этом не меняя язык программирования Си? Ответ: да.

Что надо из софтвера?

Утилита

Назначение

1

Компилятор языка Graphviz

Утилита которая из кода DOT строит графику и сохраняет в *.png *.svg *.pdf *.bmp

2

компилятор GCC

Для сборки Cи программы на PC

3

Браузер Chrome

Программа для просмотра файлов

4

Plug-in браузера Chrome для авто обновления вкладки

Для имитации анимации.

Как же отлаживать графику на Си работая на LapTop(е)?

Суть проста. Состоит из трех шагов.

Фаза 1

На С(ях) сгенерировать Graphviz код в виде отдельного файла Display.gv для разметки положения 1024 пикселей и их цветов.

static bool display_render_segment(uint16_t x, int16_t p,
                                   uint8_t segment, 
                                   DisplayHandle_t* Node){
    bool res = false;
    if (segment) {
        LOG_DEBUG(DISPLAY, "(%d,%d):RenderSegment 0x%x=%s",
                  x,
                  p*8,segment, 
                  utoa_bin8(segment));
    }
    int8_t sy = 0;
    for(sy=0; sy<=7; sy++) {
        int16_t y = - sy - p*8;
        char CommonAttributes[200] = "";
        sprintf(CommonAttributes,
                "[height=%f][width=%f][shape=square][label=\"\"][style=filled]",
                Node->pixel_size,Node->pixel_size);
        if(    segment&(1<<sy)    ) {
            /*Pix On*/
            fprintf(Node->file_ptr, 
                    "node_%u %s[color=%s][pos =\"%f,%f!\"];\n",
                    Node->pix_cnt,CommonAttributes,
                    DataMatrixVal2Color(0),
                    ((double)x)*Node->pixel_size,
                    ((double)y)*Node->pixel_size);
        } else {
            /*Pix Off*/
            fprintf(Node->file_ptr, 
                    "node_%u %s[color=%s][pos =\"%f,%f!\"];\n",
                    Node->pix_cnt,CommonAttributes,
                    DataMatrixVal2Color(1),
                    ((double)x)*Node->pixel_size,
                    ((double)y)*Node->pixel_size);
        }
        Node->pix_cnt++;
    }
    return res;
}

Фаза 2

Преобразовать файл *.gv в *.svg или *.gv в *.png при помощи утилиты dot.exe. Для рендеринга надо использовать именно движок neato. Этот движок учитывает желаемые координаты фигур Graphviz.

        char CmdCommand[200] = "";
        sprintf(CmdCommand, "start /B dot.exe -Kneato -Tpng  %s -o %s", 
                            FileNameGv,
                            FileNamePng);
        res = win_cmd_run(CmdCommand);

Фаза 3

Отобразить рисунок *.svg или *.png браузер(ом). Например сhrome.exe.

Фаза 4

Сделать авто обновление вкладки браузера плагином Easy Auto Refresh.

После этого получится отрисовка дисплея в реальном времени. Как будто перед тобой реальная электронная плата с дисплеем SSD1306

При этом Вы можете менять цвет пикселей, менять обводку пикселей, вставлять во внутрь пикселей надписи и прочее. Всё это можно делать средствами синтаксиса языка разметки Graphviz.

Обычно FPS получается порядка 0.33 Hz .

Вот суть всего этого метода.

Ваш симулятор прошивки может работать с Win консолью, имитируя UART-CLI. Вы можете прямо в run-time через консоль приказывать отобразить на симуляторе дисплея текст или фигуру.

Я, к слову, весьма удивлен, что в России (MSK и SPB) среди программистов-микроконтроллеров практически никто не знает и не догадывается о существовании языка Graphviz/Dot. А ведь Dot очень полезен также для составления схем конечных автоматов, построения трансляторов разнообразных типов данных из строчек, описания Toolchain(ов), авто генерации документации и прочего и прочего.

Альтернативные технологии:

--Для этих целей должна подойти библиотека SDL. Ее можно рассматривать как своеобразный фундамент для любых графических или игроподобных приложений. Рисовать массив цветных точек можно как-то вот так : https://gist.github.com/mmozeiko/729860eeb414f1a2ee345d9d3ab4dd4e

--Можно попробовать задействовать игровой движок Haaf's Game Engine - Hardware accelerated 2D games engine (HGE)
https://kvakvs.github.io/hge/doc/index.html?main_overview.html

Вывод

Графические монохромные дисплеи можно с легкостью моделировать на большом компьютере. Это позволяет отлаживать сложную графику и сэкономить время на пере прошивке микроконтроллера.

Получается Cи+ GCC + Graphviz + Сhrome = игровой движок.

Если вам известны ещё примеры современных электронных устройств с графическим монохромным дисплеем, то напишите про это в комментариях.

Словарь

Акроним

Расшифровка

FPS

frames per second

GUI

graphical user interface

HMI

Human Machine Interfaces

CLI

Command-line interface

Links

https://habr.com/ru/articles/741164/

https://habr.com/ru/articles/337078/
https://habr.com/ru/articles/499170/
https://habr.com/ru/articles/688542/
https://habr.com/ru/articles/662561/

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы использовали Graphviz для отладки графических дисплеев?
4.88% да2
95.12% нет39
Проголосовал 41 пользователь. Воздержались 3 пользователя.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы использовали Graphviz?
40.43% да19
59.57% нет28
Проголосовали 47 пользователей. Воздержался 1 пользователь.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Вы программировали графические монохромные дисплей?
66.67% да30
33.33% нет15
Проголосовали 45 пользователей. Воздержался 1 пользователь.
Теги:
Хабы:
Всего голосов 7: ↑5 и ↓2+7
Комментарии22

Публикации

Работа

Ближайшие события