Програмируем символы валют для дисплея покупателя

Предлагаю небольшое руководство тем, кто как и Squier, автор статьи Автоматизация магазина или как конкурировать с супермаркетами, делает автоматизацию в магазине используя свободное программное обеспечение. В качестве наглядного примера я расскажу и покажу, как подключив дисплей покупателя к Raspberry Pi загрузить на него символы валют для последующего вывода при продажах.6cabd3e09c8f4ddeb5acf938291e354c.JPG

ПодключениеВ отличие от Windows, где нужны драйверы, в Linux всё просто, если у вас дисплей с интерфейсом USB, то надо просто его подключить к Raspberry Pi, после чего новое устройство будет доступно через /dev/ttyUSB0. При этом дисплей покупателя выступает в качестве ведомого устройства, а для управления и вывода информации на экран индикации используется протокол управления запрограммированный в контролере самого дисплея. Есть несколько разных протоколов передачи информации для управления дисплеем покупателя, но де-факто все они основаны на формате ESC/POS команд от Epson.Для начала работы инициализируем дисплей покупателя очистив память и экран индикации командой ESC @:

$ echo -n -e \\x1B\\x40 > /dev/ttyUSB0 И стандартная проверка: $ echo -n -e Hello, world!\\n > /dev/ttyUSB0 Если всё сделано правильно, то строка будет выведена на дисплей.Отображение Для индикации в дисплеях покупателя используется VFD или LCD панель обычно содержащая 2-е строки по 20 символов. Каждый символ в зависимости от модели дисплея может состоят из матрицы от 5×7 до 8×8 точек. Для данного примера используется дисплей с размером символа 5 точек по горизонтали и 7 точек по вертикали.Символы закодированы в ПЗУ дисплея и доступны для вывода в диапазоне от 0×20 до 0xFF байта. И если диапазон от 0×20 до 0×7F, это стандартная кодовая страница ANSI, то диапазон от 0×80 до 0xFF выделен для дополнительных кодовых страниц, например кириллицы. Для переключения кодовых страниц используется команда ESC t n, где n, это номер кодовой страницы. Пример:

$ echo -n -e \\x1B\\x74\\x07 > /dev/ttyUSB0 $ echo -n -e \\x87\\xA4\\xE0\\xA0\\xA2\\xE1\\xE2\\xA2\\xE3\\xA9\\x2C\\x20\\x95\\xA0\\xA1\\xE0\\x21\\n > /dev/ttyUSB0 7f6bf6bfcd794940a340326d9d527827.JPGРисование Это хорошо, если все символы уже запрограммированы в дисплеи, но очень часто, купив дисплей в Китае, приходится сталкиваться с тем, что ПЗУ полностью заполнено иероглифами, а на кириллицу место не осталось. Тогда можно воспользоваться специальной командой ESC & s n m [a (p1…pa)]*m-n для загрузки в ОЗУ дисплея недостающих символов. Эта команда подойдёт и нам для загрузки символов валют в память для последующего вывода на дисплей при продажах. Команда программирования символов ESC & содержит аргументы, которые можно разделить на две части, первые, это постоянные, вторые, переменные.Постоянная часть состоит из трёх аргументов s, n и m, где: s — количество байт в строке матрицы символы, в нашем примере значение равно 1; n — байт места в кодовой странице для программирования первого символа; m — байт места для программирования последнего символа, и если программируется один символ, то n=m.

Переменная часть состоит из блоков a p1…pa, где количество блоков зависит от количества программируемых символов. Каждый блок начинается с значения a, это количества вертикальных столбцов в матрице символа, в нашем примере оно может быть в диапазон от 1 до 5. После значения a идут по-байтно закодированные в p1, p2, p3, p4 и p5 значения состояния диодов каждого столбца матрицы символа, где старший бит верхняя строка диодов, а младший соответственно нижняя.

В этом году был официально включён в Юникод символ российского рубля (₽, код 20BD), но за 5 лет до этого был принят символ родной мне с ноября 1993 года казахстанской тенге (₸, код 20B8). По этом начнём программирования с него. Если представить символ тенге в виде по-битной матрице 5×8, то он будет выглядеть так, как представлено на рисунке ниже. Верхняя строка дополнена старшим 8-ым битом, но в данном примере на дисплей она выведена не будет.bc764bd9d42b4dbfb8b782f4ba3497e5.pngИтог, для замены символы доллара (код 0×26 в таблице символов нашего дисплея) на символ тенге с таким-же кодом, нам понадобится ESC/POS команда следующего вида:

$ echo -n -e \\x1b\\x26\\x01\\x24\\x24\\x05\\x50\\x50\\x5f\\x50\\x50 > /dev/ttyUSB0 Включаем загруженные символы командой ESC % n, где значение n единица или ноль в зависимости от того, включены или нет загруженные символы: $ echo -n -e \\x1b\\x25\\x01 > /dev/ttyUSB0 Проверяем работу: $ echo -n -e 1500$ > /dev/ttyUSB0 Результат на экране: 3a74f3e78cd146f5a81e64d6f0877aef.JPGПрограммирование Теперь осталось сделать автоматическим при подключении инициализацию кириллицы и загрузку символа тенге. Для этого нам необходимо установить для udev правила автоматического запуска bash-скрипта при подключение дисплея покупателя к Raspberry Pi. Командой udevadm узнаём код вендора и модели нашего дисплея. $ udevadm info -q all -n /dev/ttyUSB0 | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*' E: ID_MODEL_ID=2303 E: ID_VENDOR_ID=067b Создаём правила 90-init-vfd-display.rules: $ sudo nano /etc/udev/rules.d/90-init-vfd-display.rules , следующего содержания: ACTION==«add», ATTRS{idVendor}==»067b», ATTRS{idProduct}==»2303», RUN+=»/usr/local/bin/init-vfd-display.sh» и скрипт: $ sudo nano /usr/local/bin/init-vfd-display.sh #!/bin/bash

sleep 20

echo -n -e \\x1B\\x40 > /dev/ttyUSB0 echo -n -e \\x1B\\x74\\x07 > /dev/ttyUSB0 echo -n -e \\x1B\\x26\\x01\\x24\\x24\\x05\\x50\\x50\\x5F\\x50\\x50 > /dev/ttyUSB0

sleep 3 Делаем исполняемым bash-скрипт и активируем наши правила: $ sudo chmod +x /usr/local/bin/init-vfd-display.sh $ sudo udevadm control --reload-rules $ sudo udevadm trigger --action=add $ sudo service udev restart Пробуем одновременно использовать символ доллара и тенге переключая их поочерёдно. $ echo -n -e 1$ =\\x1B\\x25\\x01 181,95$ \\x1B\\x25\\x00 > /dev/ttyUSB0 6f6e00c757f94e419a5ef40180a2278b.JPGЗаключение Приведённый здесь пример необязательно выполнять используя Raspberry Pi, все описанные команды доступны независимо от дистрибутива Linux, главное, это наличие в нём службы udev для автоматического выполнения скрипта загружающего символы в дисплей покупателя. В качестве закрепляющего материала, предлагаю запрограммировать символы ещё двух валют из таблицы Юникода, российского рубля и украинской гривны, по матрицам на рисунках, ну, а знак евро вы уже сможете сделать самостоятельно.d8466bbee4204f179197fb9ec83ae244.pngf38b263e141a4a86b7c5f8ee02b6c91f.png

© Habrahabr.ru