Здравствуйте уважаемые программисты и разработчики. Я думаю, что не я один сталкивался с графическим индикатором WG320240 и искал для него драйвер. Эту тему я решил создать не для того, чтобы спросить «есть ли у кого исходники для работы с ним», а наоборот немного рассказать о нем. Несколько лет назад я связался с таким индикатором, и тоже искал всяческую информацию и документацию. Но, как и принято – если хочешь сделать хорошо - делай это сам. Долго писал и не раз все переписывал заново, и в меру своей постоянной неудовлетворенности считаю, что так и не доделал. Однако работа выполнена, библиотека работает и почему бы не поделится этой работай с людьми. Возможно кто-то поможет закончить мою работу, чтобы получился законченный результат. В общем так, что из себя представляет этот индикатор: это графический индикатор с расширением 320 на 240 точек со встроенным контроллером SED1335 для регенерации изображения. Индикатор может иметь несколько слоев, как графических так и текстовых и может отображать 3 цвета: черный, белый и мерцающий (серый). Различные способы наложения слоев, прокрутки, пользовательские шрифты и так далее. Кто писал для этого индикатора функции рисования - знает, что рисовать на нем довольно таки сложно, потому что приходится постоянно ждать честко определенного момента времени, когда можно посылать на него информации. Можно конечно и не ждать, но тогда появится рябь на экране в момент записи данных. В качестве основного контроллера я использовал AT91SAM7S(X). Чтобы небыло задержек в рисовании или ряби на экране, я решил разделить работу на 2 части: рисование в памяти и выгрузка данных на индикатор. Для себя я определил, что мне понадобится 2 графических слоя, один постоянный, а второй мерцающий, чтобы получить трехцветный дисплей. Текстовый слой, прокрутка, мигающие курсоры мне не нужны, имхо что нарисовать красивую информацию на дисплее (окна, кнопки, поля ввода и т.д.) текстовый слой со своей жесткой привязкой к координатам будет только мешаться. Хотя я уже придумал куда можно применить третий текстовый слой – для отображения вспомогательной информации (бегунок уровня яркости, громкости звука и т.д. как меню на телевизорах). Для работы с тремя цветами понадобится 2 бита (4 состояния) из которых одно состояние остается неиспользованное. Чтобы даром не терять недоиспользованную информацию – я решил использовать его как прозрачный цвет. Конечно на экране прозрачного цвета быть не может, но при хранении картинок или определении цвета заливки очень даже полезный. Тем самым, что у меня получилось: 320 * 240 точек на 2 бита цвета получается 19200 байт оперативной памяти. Конечно ~19к оперативки жалко, но при имеющемся объеме 32к или 64к, в зависимости от контроллера, почему бы и нет, учитывая, что в итоге мы получаем полноценный графический трехцветный индикатор, с которым удобно работать во всех отношениях.
Библиотека работы с индикатором, как я уже сказал, разделилась на 2 части: Driver и Canvas. Для ускорения работы драйвера – я посадил его на FIQ прерывание. При появлении сигнала от индикатора о готовности принимать информацию срабатывает прерывание, обработчик прерывания выталкивает часть информации и снова освобождает процессор. Остается только подготовить эту информацию. В итоге у меня получилось воспроизводить около 10 кадров в секунду (анимацию можно воспроизводить). Видал я аналогичные устройства, которые прорисовывали экран по несколько секунд – «небо и земля». Сам драйвер естественно написан на ассемблере под 32 разрядной архитектурой ARM для соответствующего контроллера. В процессе работы я также столкнулся с двумя индикаторами: черно-белый и бело-черный, то есть инверсный. Писать драйвер для каждого, естественно не целесообразно и подстраивать функции рисования изображения тоже. Поэтому я сделал прямо в драйвере возможность переключения инверсии в режиме рантайма, и основной программе даже знать не надо какой там индикатор, за это будет отвечать драйвер. Также, драйвер я написал так, чтобы его можно было применять для любых индикаторов на основе контролера SED1335 с различным разрешением экрана.
Теперь Canvas. Это компонент с соответствующими методами и данными. Пишу я на C++ и компонент, соответственно, создан на классах. Но при желании его можно перевести на структуры и статические функции рисования для C. Немного опишу типии, применяемые в данном компоненте: enum TColor – цвет; Styles[] – массив заливок; enum TAngle – угол поворота изображения; TsRect – класс работы с координатами; TBitMap – класс, описывающий какую либо картинку; Font[] – массив данных шрифтов; TCanvas – непосредственно сам класс рисования изображения. Что умеет TCanvas. Имея опыт работы с графическими индикаторами, я сразу поставил для себя задачу, что компонент должен уметь ограничивать область рисования. То есть, устанавливаться ограничительное окно, в котором можно рисовать, а за пределами его информация должна быть незатронутой. Это необходимо когда надо восстановить часть изображения не затронув рядом лежащую информацию или просто ограничить, например, текст, чтобы он не вылез за границы поля, в котором он должен быть отображен. Так у канвы появилось ограничивающее окно TsRect Win. Возможности наложения изображения AND, OR, XOR в процессе эволюции отмерла, так как необходимость в них появляется крайне редко, а нагрузку на малый цикл рисования несет большую. А с вводом прозрачного цвета – практически полностью отпала. Изучив все необходимое для полноценного рисования задачи – написал следующие функции: Рисование точки заданным цветом; Заливка прямоугольника с заданным стилем заливки, цветом фона и чернил; Рисование картинки хранящейся в объекте TBitMap под разным углом поворота (0, 90, 180, 270). А учитывая, что канва также состоит из TBitMap – то можно как рисовать на канве, так и копировать с нее кусок изображения; Выводить текст заданным шрифтом, цветом фона, чернил и углом поворота. Шрифт имеет плавающую ширину символов. Также при выводе текста сделал ограничение выводимого текста, когда нужно вывести текст с переносам по словам, и автоматическим ограничением вывода при появления в тексте символа переноса строки. Функция возвращает количество выведенных символов. На реализацию возможности выводить жирный, курсивный и подчеркнутый текст у меня просто не хватило сил; Рисование произвольной линии заданным стилем пунктирности, цвета фона и чернил. Функция принимает стиль линии и возвращает этот же стиль модифицированный после рисования, чтобы можно было продолжить с этой же позиции пунктирности; Ну и другие вспомогательные функции для рисования. Все эти функции также ограничиваются областью прорисовки не искажая свою форму, например, при выводе наклонной линии, если бы ее координаты пользователь ограничил сам. Вся библиотека также написана на ассемблере для ARM архитектуры. Из всего перечисленного я так и не дописал вывод текста под углом 90, 180 и 270 градусов, и рисование картинки сделал только под углом 0 и 90 градусов. Все функции отлажены и вылизаны до последнего байтика, и оптимизированы на максимальную скорость работы.
Если кому-то будет интересно применить у себя эту графическую библиотеку – могу выложить все исходники. Возможно, кто-то закончит мою работу, на которую я потратил почти год. Конечно, продать эту библиотеку я не могу, но я думаю, каждый понимает, сколько стоило сил на ее написание и для предприятия, занимающегося разработкой устройств, не затруднит купить ее за символическую сумму. Просто жалко потраченных ночами сил, которые никто не сможет по достоинству оценить.
--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
|