CARWASHER PROTO v1.2

Здесь описан протокол взаимодействия с устройством управления постом автомойки.

Принцип взаимодействия

Взаимодействие с устройством происходит посредством COM-порта по стандарту RS-232 Baudrate: 115200 Databits: 8 Stopbits: 1 Parity: None Mode: TX-RX

Определения

Все команды и ответы к ним представлены в виде 17-тисимвольных строк. Команды отправляются к исполнению сразу, как контроллер получает все 17 символов без нажатия кнопки [Enter]. CMDARGUMENTARGARG - строка в 17 символов длиной, где первые 3 символа - сама команда (CMD). Остальные 14 символов (ARGUMENTARGARG) - аргумент, и если он не требуется, вместо него указываются нули. Аргумент всегда представляется в виде беззнакового 16-тиричного числа. Невостребованные старшие разряды числа заполняются нулями.

После отправки команды всегда следует 17-тисимвольный ответ в таком же формате: STS00000000000000, где STS обозначает Status, а 00000000000000 - дополнительная информация в 16-тиричном формате, где в случае её отсутствия проставляется 14 нулей, а невостребованные старшие разряды 16-тиричного числа, в случае наличия такового, так же будут заполнены недостающим количеством нулей

Контроллер также может отправлять пользователю некоторые сообщения, не являющиеся ответом на команду. Такие сообщения называются событиями. События не предусматривают ответ от пользователя, следовательно, отправлять какое-либо подтверждение получения события не требуется. События имеют синтаксис, схожий с синтаксисом команд: это такие же 17-тисимвольные последовательности, где первые 3 символа - название события, а последующие 14 символов - полезная нагрузка.

Ошибки

В случае отправки несуществующей команды, либо в случаях нарушения синтаксиса, вы получите в ответ "несуществующую команду". Это значение из 17-ти подряд идущих нолей (00000000000000000) Отправить команду длиной меньше чем 17 символов невозможно.

Синхронизация буфера (сброс)

Если Вы получаете "несуществующую команду" на казалось бы валидную команду от Вас, отправьте в устройство символ @. На отправку этого символа, Вы не получите никакого ответа. Воспринимайте это как очистку консоли. Как только устройство получит этот символ, оно автоматически очистит буфер ввода. Это должно решить проблему.

Почему вообще может возникать эта проблема? Всё дело в том, что пользователь может не уследить за своими действиями и отправить больше 17-ти символов за раз (причин достаточно). Для собственной безопасности, можете считать что каждая команда состоит из 18-ти символов (т.е. @[CMD][ARGARGARGARGAR] - просто с собакой в начале).

Команды, которые отправляет компьютер в контроллер

Give Your Name

Пример: GYN00000000000000 Команда: GYN Аргумент: Не требуется

Команда для запроса уникального имени устройства, полученного при прошивке устройства (Для идентификации постов). Уникальное имя устройства берётся из регистра самой микросхемы из значения, зашитого на заводе изготовителе, следовательно, у пользователя нет возможности изменить это значение.

Ответ DUN00001F4487C4BF - Device Unique Number со значением 00001F4487C4BF

Get Card ID

Пример: GCI00000000000000 Команда: GCI Аргумент: Не требуется

Команда для запроса вставленной карты в считыватель устройства. UID представляет собой 4 байта, представленных в 16-тиричном виде.

Ответ CID000000890F6ED1 - Card UID со значением 000000890F6ED1 либо CID00000000000000, если карта не вставлена

Get Relays Statuses

Пример: GRS00000000000000 Команда: GRS Аргумент: Не требуется

Команда для запроса состояния включённых сейчас реле. В качестве ответа получает 16-тиричное число с маской включённых в настоящий момент реле. Маска читается справа налево.

Response Value HEX BIN Value
00000000000001 0x1 0b001 Включено только 1-е реле, остальные выключены
00000000000005 0x5 0b101 Включены 1-е и 3-е реле, остальные выключены
00000000000011 0x11 0b1011 Включены 1-е, 2-е и 4-е реле, остальные выключены
И так далее

Ответ RES00000000000007 - Relay Statuses, где 00000000000007 и является Response Value, расшифровываемое по вышеописанной схеме.

Turn Relay Enabled

Пример: TRE00000000000008 Команда: TRE Аргумент: Значение двоичного логарифма в 16-тиричном формате

Команда для запроса на включение одного реле, его номер определяется по аргументу

Argument Value HEX BIN Value
00000000000001 0x1 0b001 Включить 1-е реле
00000000000004 0x4 0b100 Включить 3-е реле
00000000000010 0x10 0b10000 Включить 5-е реле
Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к включению нескольких реле одной командой.

Ответ REO00000000000008 - Relay Enabled OK, где 00000000000008 - значение переданного аргумента при отправке команды.

Turn Relay Disabled

Пример: TRD00000000000008 Команда: TRD Аргумент: Значение двоичного логарифма в 16-тиричном формате

Команда для запроса на выключение одного реле, его номер определяется по аргументу, описанному в команде выше (TRE). Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к выключению нескольких реле одной командой.

Ответ RDO00000000000008 - Relay Disabled OK, где 00000000000008 - значение переданного аргумента при отправке команды.

Switch Relay Status (deprecated)

Пример: SRS00000000000008 Команда: SRS Аргумент: Значение двоичного логарифма в 16-тиричном формате

Команда для запроса на переключение состояния одного реле, его номер определяется по аргументу, описанному в команде выше (TRE). Переключение происходит согласно принципу a = !a, где "а" - состояние реле. Команда может принимать в себя дизъюнкцию двух аргументов, это приведёт к переключению нескольких реле одной командой.

Ответ RSO00000000000008 - Relay Switched OK, где 00000000000008 - значение переданного аргумента при отправке команды.

Change Balance Value

Пример: CBV000000000000FF Команда: CBV Аргумент: Значение в 16-тиричном формате. Значимость определена для не более 2-х байт

Команда, служащая для изменения значения баланса, отображаемого на пользовательском экране устройства. Значения свыше 9999 (0x270F) будут игнорироваться и записываться как 9999.

Ответ VBO000000000000FF - Value Balance OK, где 000000000000FF - значение переданного аргумента при отправке команды.

Change Time Value

Пример: CTV00000000000100 Команда: CTV Аргумент: Значение в 16-тиричном формате. Значимость определена для не более 2-х байт

Команда, служащая для изменения значения остатка времени, отображаемого на пользовательском экране устройства. Передаётся количество секунд, в течение которых пользователю будет доступно устройство. Например, при отправке команды CTV00000000000100, переменная TIME будет установлена в значение 256 (т.к. 0x100 = 256). Это значит, что на экран будет выведено 4:16, что символизирует 4 минуты 16 секунд. Значения свыше 3599 (0xEOF) будут проигнорированы и записаны как 3599.

Ответ VTO00000000000100 - Value Time OK, где 00000000000100 - значение переданного аргумента при отправке команды.

События, которые отправляет контроллер в компьютер

A Button Pressed

Пример: ABP00000000000008 Событие: CTV Полезная нагрузка: Значение двоичного логарифма в 16-тиричном формате. Значимость определена только для 1-го байта

Событие, сигнализирующее о нажатии кнопки на устройстве. В качестве полезной нагрузки приходит двоичный логарифм. Например, ABP00000000000008 означает, что нажата кнопка номер 4 (т.к. 0x08 = 0b1000).

New Card Present

Пример: NCPFBC2BD1A552319 Событие: NCP Полезная нагрузка: Значение в 16-тиричном формате

Событие, сигнализирующее о появлении новой карты на считывателе устройства. В качестве полезной нагрузки приходит 4-хбайтовый UID Mifare-карты. Например, NCP0000001A552319 означает, что представлена карта с UID 1A:55:23:19.

Warning! Card Left

Пример: WCL00000000000000 Событие: WCL Полезная нагрузка: Значение в 16-тиричном формате

Событие, сигнализирующее о снятии Mifare-карты со считывателя. В качестве полезной нагрузки приходит 4-хбайтовый UID Mifare-карты. Например, WCL0000001A552319 означает, что со считывателя снята карта с UID 1A:55:23:19. Рекомендуется не опираться на UID карты, т.к. микросхема RC522 умеет самостоятельно решать проблему с антиколлизией, потому если вдруг в створ считывателя попадёт больше одной карты, это не должно привести к проблемам, но стоит быть начеку!.