Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Для торгового автомата, описанного в статье, потребовалось дополнить программу новыми функциями. Требовался интерфейс оператора - несколько диалоговых окон:
До этого дисплей 24" выполнял только функции отображения рекламного видео - сразу после включения, и индикации неисправности в виде иконок внизу экрана. Для новой версии автомата закупили мониторы с тачскрином.
Как видно из картинки выше, задача диалоговых экранов - индикация данных от датчиков, выбор видео по умолчанию в режиме "offline", отправка письма в сервисную службу и справочник ( учебные видео как загрузить новый контейнер с сиропом и т.п.).
Для Заказчика была важна зрелищность. Диалоговые экраны должны были быть красивыми и положительно влиять на продажи его автоматов, особенно при демонстрации возможностей на выставках. Вот такой маркетинг. Для этого был нанят дизайнер, дизайн экранов несколько раз переделывался, обсуждался всем коллективом Заказчика. Результат в виде картинок для каждого экрана прислали нам как исходное, например:
Моей задачей было прежде всего - "не испортить дизайн". Надежность, простота в отладке и минимум проблем при последующем сопровождении само собой разумелись.
После некоторых раздумий решил использовать Python с библиотекой Pygame. Скорости Raspberry Pi хватало, даже если постоянно пересылать картинку. Конечно, в оконном режиме и с постоянной пересылкой не всё так радужно, но в полноэкранном режиме и с однократной пересылкой фона никаких задержек не заметно. Основной плюс - короткий простой исходник и мой полный контроль над распределением ресурсов процессора.
Небольшое отступление. Приходилось разрабатывать программы пульта оператора с интерфейсом пользователя для больших корабельных радиоэлектронных комплексов. Сложные правила, большая и непростая программа, но объемы данных от разных источников были небольшими, и Питона хватало. Писали две большие программы пульта оператора для гидроакустических станций, там объемы данных за единицу времени большие и без C/C++ уже никак. На Raspberry Pi не самый производительный процессор, но отличный видеочип и превосходная поддержка его в Pygame. На Raspberry Pi старались избегать тяжеловесных GUI библиотек, обычно ограничивались Pygame, SDL2, Tkinter. Если Заказчик не настаивал на конкретной библиотеке. Но вернемся к нашей задаче.
Одновременно программа должна была выполнять чтение UART с данными о состоянии автомата, опрос модуля АЦП ADS1115 ( подключенного к термопаре ), опрос 3G/4G модема по SNMP протоколу ( уровень сигнала сети и IP ), отправку телеметрии на сервер. Графический интерфейс пользователя не должен была мешать этим задачам. Добавьте к этому периодическое желание Заказчика что-то улучшить в интерфейсе, добавить или убрать кнопку, и т.п.
Для воспроизведения основного видео мы использовали программу hello_video.bin, достоинство - очень быстрый старт повтора, основное ограничение - поддержка только видеофайлов *.h264. Поверх этого видео иконки аварии отображались с помощью программы pngview, пример вызова:
./pngview -b 0x0000 -x 115 -y 360 alert_icon1.png &
Эту же программу использования для показа черного квадрата на весь экран до запуска основной программы. Было такое пожелание Заказчика, меньше показывать тексты и загрузку ОС после включения автомата.
Для показа обучающих видео выбрали omxplayer, пример вызова для отображения видео в окне:
omxplayer "How to clean the filter.mp4" --orientation 90 --no-keys --layer 4 --win 1045,190,1530,880 &
Заказчику требовалось два варианта исполнения GUI, для вертикального ориентированного монитора и горизонтального. Программу писали у себя на своем Raspberry Pi, процесс отладки:
Для отладки взаимодействия с новым "железом" использовали кой-какие простые имитаторы, например потенциометр как имитатор разной температуры от термопары + модуль АЦП ADS1115, три Arduino Uno для эмуляции плат цветной подсветки в тороговом автомате:
Окончательно отлаживали удаленно на торговом автомате Заказчика, для этого уже пришлось на настольном ПК Заказчика устанавливать VNC viewer, одного SSH уже не хватало. Это касается графических окон. Для отладки было удобнее запускать программу в оконном режиме, чтобы одновременно видеть сообщения в терминале.
Видео на нашем мониторе, как выглядит результат:
Заказ был завершен успешно, со слов Заказчика, его ожидания в части маркетинга оправдались и покупать автоматов стали больше, особенно на тематических выставках. Плюс упростилось использование автомата, у покупателей стало меньше вопросов при эксплуатации.
Далее писали версии для другого состава оборудования автомата, добавляли поддержку других 4G модемов, поддержку других протоколов и многое другое. В настоящий момент у Заказчика в сети более 10000 торговых автоматов с различными версиями наших программ. Принципиальных отличий в интерфейсе от описанной версии у них мало, работает без замечаний.