ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 июля
1065697 Топик полностью
fk0, легенда (29.12.2020 18:46, просмотров: 412) ответил Toчкa oпopы на ИМХО, с высокой степенью вероятности, там самый "тупой" контроллер (отображает своё ОЗУ на пиксели). Что-то вроде KS0108, если не путаю...
Разве это плохо? Не понимаю, зачем нужны "умные" контроллеры, в которых всё через ()() сделано, многие вещи тупо не сделать, всё дико тормозит и т.п. Единственное что -- нужна толковая графическая библиотека на МК. А дальше начинаются сложности: 

1) если ОЗУ много, то всё просто. Имеем копию ОЗУ контроллера дисплея. Рисуем в неё. В процессе отрисовки строим bounding box (в идеале не один, небольшое количество, порядка десятка, которые объединяются если что), и изменённую область копируем в контроллер. ОЗУ контроллера читать не нужно (т.к. медленно обычно).


2) если ОЗУ мало... все процедуры отрисовки должны уметь работать с клиппированим (обрезкой по границам заданного прямоугольника). Вначале вычисляем набор объемлющих прямоугольников для обновления (опять же можно укрупнять, чтоб их было не очень много), потом их делим на окна (по размеру располагаемого ОЗУ), которые отрисовываем снизу до верху (по Z-координате) и пересылаем в контроллер. ОЗУ нужно меньше, только копирование в контроллер, перерисовка выполняется многократно (и медленно).


В простых случаях, наверное Z-координаты вовсе нет (если не делается аналог Windows 3.11). А из набора графических примитивов нужны:


1) шрифты (удобно готовые TTF, TrueType, web и т.п. шрифты преобразовать в Adobe BDF, который легко самостоятельно распарсить или преобразовать в самодельный формат -- но у BDF нет антиалиасинга) и собственно вывод строк заданным шрифтом;


2) рисование залитых многоугольников (и как частный случай, прямоугольники с ускорением -- основа UI), всё остальное, кривые, эллипсы, что угодно -- частный случай многоугольника;


3) копирование/распаковка спрайтов (чб и/или цветных)...


Шрифты и графику, если сжатие самодельное, удобно делать примерно как в факсах: по X-координате RLE, по Y-координате ксорка с предыдущей строкой (тогда там сразу куча нулей). Цветные изображения может быть лучше разбить на битпланы (а-ля EGA-карта). А градации серого кодировать тоже как в факсе, но не ксоркой, а разностью: тогда останутся преимущественно околонулевые значения которые легко кодируются кодом Райса/Голомба, методом MFT т.п.


Шрифты вообще выгодней транспонировать: пиксели слева-направо должны быть не соседними битами в байте, а соседними байтами. А биты -- по Y-координате. Это потому, что все буквы имеют одинаковую высоту и разную ширину (и количество байт в итоге). В этом смысле в BDF всё наоборот, что неудобно.


Если нужны всплывающие окна то вариантов два:


1) сохранять битмап, того, что было под окном в момент всплытия и потом восстанавливать (нужно ОЗУ, но в целом всё сильно проще);


2) таки вводить понятия окон, Z-координаты, bounding box'ов, понимать, что испорчено и вызывать перерисовку... клиппирование скорей сразу понадобиться (иначе будут все по-очереди перерисовываться, с артефактами и долго, если навалено много).


Поскольку дисплей имеет фиксированный размер, то местоположение текстов, картинок, всех "виджетов" можно так же как в MFC прибить гвоздями, прямо в исходнике записать координаты, и не париться.


Можно будет сделать функции отрисовки более сложных элементов UI на основе вышеперечисленного: поле вывода текста (опять же нужен клиппинг), кнопка, переключатель, "крыжик", выбор из списка (всплывающее окно!), слайдер, спинбокс, окно редактирования текста/чисел, меню для выбора действия... Ну ещё функцию отрисовки любых примитивов (опять клиппинг!) в боксе заданном пользователем (пользовательские графики и т.п.)


Можно построить систему "меню" несложную: весь UI состоит из окон-экранов. Каждое из которых имеет функцию, которая его отрисовывает путём создания "виджетов", которые создаются включаются в список, по которому можно перемещаться (фокус ввода) стрелками, например. И в каждом элементе другие кнопки могут уже что-то ещё делать (включать, выключать, редактировать, запускать на исполнение, если пункт меню...) Меню могут быть вложенные (опять же всплывающие окна -- если нижнее занимает не весь экран, то нужно уметь перерисовывать и те которые под ними). В принципе для среднего прибора более чем достаточно.


Аналогично можно построить и печать на принтер (Epson ESC/P, Hewlett-Packard HPGL, Postscript...) Т.е. графика с точки зрения языка управления принтером пиксельная, рисуется в маленьких окошках (по десятку строчек за раз -- сколько ОЗУ хватит) и выводится на принтер. Даже PDF так сформировать можно (с нечитаемыми/некопируемыми и страшными квадратными шрифтами).


Только сейчас мне скажут, что моё время закончилось в 80-х, а сейчас айфон 11-й с 5G проще встроить вместо МК. И будут правы. А там Dart и Flutter, а всякие C-программисты могут отправляться нахер.

[ZX]