Сообщения используются на участках ПК–телефон и телефон–контроллер для передачи
команд и
сигналов с сенсоров.
Связь между телефоном и контроллером будет реализована посредством Bluetooth, поэтому, возможно управление контроллером непосредственно с ПК.
Формат сообщения
Длина сообщения всегда 5 символов (байт).
cXXXX, где c –
идентификатор сообщения (всегда 1 ASCI символ), XXXX –
значение сообщения – знаковое или беззнаковое число в шестнадцатиричном представлении от 0000 до FFFF (всегда 4 символа).
Идентификаторы сообщения
Заглавная литера – сообщение с числовым значением (скорость, угол поворота, значение с сенсора и т.д.). Строчная литера – разовое сообщение (кивнуть, повилять хвостом и т.д.).
L
[left] – команда задания скорости и направления левому двигателю
R
[right] – команда задания скорости и направления правому двигателю
D
[drive] – команда задания одинаковой скорости и направления обоим двигателям
H
[horizontal] – команда поворота головы на заданный угол в горизонтальной плоскости
V
[vertical] – команда поворота головы на заданный угол в вертикальной плоскости
E [error] – сообщение об ошибке
F
[face] – команда смены настроения
I [illumination] – команда управления фарами: I0001 – включить, I0000 – выключить
T [tail] – команда поворота хвоста на заданный угол
t
[tail] – команда на виляние хвостом: t0001, t0002, t0000
y [yes] – команда кивания головой: y0001, y0000
n
[no] – команда мотания головой: n0001, n0000
f
[fire] – команда на выстрел (ИК пушка): f0001, f0000
h
[hit] – сигнал попадания (ИК сенсор): h0001, h0000
Передача сообщений от ПК к телефону производится посредством UDP-датаграмм. Т.е. возможны потери пакетов. Сообщения управления двигателями и сервоприводами
передаются постоянно – так устроено Windows-приложение. Поэтому потери отдельных пакетов не страшны. Однако, могут быть потеряны неповторяющиеся сообщения: y, n, f и т.д. Поэтому они передаются трижды подряд.
И ещё одно важное замечание. В Android-приложении для исключения повторного выполнения одинаковых команд применяется хэш-таблица. Ключ таблицы – идентификатор сообщения, значение – значение сообщения. Каждое обработанное сообщение сохраняется в хэш-таблице. Когда приходит новое сообщение, его идентификатор ищется в хэш-таблице, если находится и значение совпадает со значением нового сообщения, то новое сообщение игнорируется. Этот алгоритм работает при управлении двигателями и сервоприводами, но для одиночных команд (y, n, f...) требует пояснения. Для таких команд, сообщения передаются парами: сначала со значением "0001", потом "0000". Это делается специально для смены значения в хэш-таблице. А для передачи в UDP-датаграммах, из-за возможных потерь пакетов каждое сообщение в паре ещё и троекратно повторяется. Вот как передаётся команда на выстрел:
f0001
f0001
f0001
f0000
f0000
f0000
Далее, описывая значения некоторых команд, я не буду упоминать нулевые значения одиночных команд и трёхкратные повторения, но это не значит что их нет.
Команды смены настроения
F0001
– обычное выражение лица
F0002
– счастливое лицо
F0003
– грустное лицо
F0004
– злое лицо
F0005
– лицо тяжело больного робота
F0102
– хочется играть (прыгает, на сколько это позволяет платформа)
F0103
– сильно расстроен (грустно и повесил голову)
Сообщения об ошибках
На всех трёх уровнях могут возникать ошибки. Но если на уровне ПК вывод сообщения об ошибке сложностей не вызывает, то с уровней контроллера робота (тела) и с уровня Android-приложения (головы), информацию об ошибке надо ещё доставить на уровень ПК. Для этого используется событие "E". Ошибки уровня контроллера имеют вид "E00xx", где xx – код ошибки от 00 до FF.
Ошибки уровня Android-приложения имеют вид "E01xx".
E0001 – Неверное сообщение – возникает, если сообщение не удалось разобрать на команды/событие и значение
E0002 – Неизвестная команда
E0003 – Недопустимая команда в РобоСкрипт
E0004 – Неверная последовательность команд в РобоСкрипт
E0005 – Невозможно выделить необходимый объём памяти
E0006 – Попытка выхода за границы выделенной для РобоСкрипт памяти
E0007 – Недопустимая команда вне РобоСкрипт
Команды РобоСкрипт
r00xx – Воспроизведение РобоСкрипта. xx задаёт номер программы (от 00 до 0A)
r01хх – Старт записи программы на РобоСкрипт. xx задаёт номер записываемой программы (от 00 до 0A)
r02xx – Служебная, не использовать. Формируется в скетче robo_body и передаётся в RoboHead для сигнализации об окончании режима записи РобоСкрипта
Zxxxx – Если xxxx больше 0, то команда выполняет выделение оперативной памяти для записи и временного хранения программы на РобоСкрипт. xxxx – количество действий в РобоСкрипте. Действие – это всегда две команды: команда на выполнение роботу и команда, определяющая задержку до следующего действия (W).
Z0000 – Признак окончания программы на РобоСкрипт.
Wxxxx – Задержка в миллисекундах до выполнения следующего действия.
Подробней о РобоСкрипте можно почитать
здесь.