Разработчикам / Структура конфигурационного файла драйвера / Раздел «Обратные связи» (feedbacks)
Шаблон может быть использован для типов text
и binary
. Для текстовых ответов используются регулярные выражения, а для числовых массивов — шаблоны с массивами данных.
Шаблоны с регулярными выражениями (для текстовых данных)
Пример:
MyDriver:
feedbacks:
- input: [0, 1, 2, 3, 4]
value: 0
template: /OUT is INPUT(\d)/
В данном примере BOOCO ожидает текст вида OUT is INPUT*
, где вместо звездочки будет цифра от 0
до 9
. Если цифра больше 4
, то драйвер выдаст ошибку, так как ожидается значение 0
–4
(тип обратной связи).
Тот же самый драйвер можно было бы описать так:
MyDriver:
feedbacks:
- input: [0, 1, 2, 3, 4]
value: 0
template: /OUT is INPUT(0|1|2|3|4)/
В этом варианте ошибки не будет, но если будет указано значение, отличное от 0
–4
, BOOCO его проигнорирует.
Обычно в регулярном выражении должно обрабатываться только одно значение и должна быть одна захватывающая группа (capturing group) со скобками. Можно использовать незахватывающие группы (non-capturing group) вида (?:...
).
Если в одном запросе приходит ответ на несколько обратных связей, то нужно просто добавить свой вариант регулярного выражения для каждой связи. Они все будут обработаны по очереди.
Например, на запрос статуса некоторое устройство отвечает строкой volume=42,mute=0\r
. В этом случае обратные связи могут выглядеть так:
MyDriver:
feedbacks:
- volume: number
template: /volume=(\d+)/
- mute: number
template: /mute=(\d)/
Получив строку, сервер проверяет ее на совпадение со всеми шаблонами и для каждой обратной связи берет свою порцию данных.
Шаблоны с массивами данных (для числовых данных)
Пример:
MyDriver:
data-type: binary
feedbacks:
- power: number
template: [0xAA, 0xFF, 0x01, 0x03, 0x41, 0x11, '$V', any]
В данном примере при получении данных сервер ищет строку, совпадающую с [
0xAA
,
0xFF
,
0x01
, 0x03, 0x41, 0x11, '$V', any]
. Значение в ячейке $V
будет взято как значение для обратной связи.
Значение в ячейке any
может быть любым (например, здесь может быть контрольная сумма).