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

в 12:54, , рубрики: linux, Raspberry Pi, Программирование

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

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

Подключение

В отличие от 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 точек по вертикали.

Символы закодированы в ПЗУ дисплея и доступны для вывода в диапазоне от 0x20 до 0xFF байта. И если диапазон от 0x20 до 0x7F, это стандартная кодовая страница ANSI, то диапазон от 0x80 до 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

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

Рисование

Это хорошо, если все символы уже запрограммированы в дисплеи, но очень часто, купив дисплей в Китае, приходится сталкиваться с тем, что ПЗУ полностью заполнено иероглифами, а на кириллицу место не осталось. Тогда можно воспользоваться специальной командой 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-ым битом, но в данном примере на дисплей она выведена не будет.
Програмируем символы валют для дисплея покупателя
Итог, для замены символы доллара(код 0x26 в таблице символов нашего дисплея) на символ тенге с таким-же кодом, нам понадобится 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

Результат на экране:
Програмируем символы валют для дисплея покупателя

Программирование

Теперь осталось сделать автоматическим при подключении инициализацию кириллицы и загрузку символа тенге. Для этого нам необходимо установить для 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

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

Заключение

Приведённый здесь пример необязательно выполнять используя Raspberry Pi, все описанные команды доступны независимо от дистрибутива Linux, главное, это наличие в нём службы udev для автоматического выполнения скрипта загружающего символы в дисплей покупателя. В качестве закрепляющего материала, предлагаю запрограммировать символы ещё двух валют из таблицы Юникода, российского рубля и украинской гривны, по матрицам на рисунках, ну а знак евро вы уже сможете сделать самостоятельно.
Програмируем символы валют для дисплея покупателя Програмируем символы валют для дисплея покупателя

Автор: Svininykh

Источник

* - обязательные к заполнению поля