Head position 0 is left, 1 centre, 2 right, as seen by someone facing the droid. The reported position uses different codes, which the controller translates back, so what you command is what you read.
Sequence blocks play the toy's own stored routines. They finish in their own time, so follow one with a Wait if the next step should not interrupt it.
The cam selects what the single motor drives. Choose a cam position, then drive.
red 0%, blue 0%
0x17 type 2), set volume (0x23), read
volume (0x22), battery (0x21) and playlist variables
(0x11) are not in this build.
Power-down is excluded deliberately, not by omission: a typing error should not
end the lesson.
Clicking Run sends one message: the word RUN, then one line
per step. The controller holds the list in memory and steps through it, so nothing is
compiled or flashed. It is line-based rather than JSON because the controller parsing it
is already running a Bluetooth stack, a web server and a calculator link, and a JSON
library bought to read four fields is a dependency bought for nothing.
Each line is bytes|milliseconds|mirror text. The milliseconds
are how long the controller waits after issuing that command before moving on. An empty
bytes field is a Wait: it transmits nothing. Live Control sends
NOW bytes|mirror for a single command, and HALT stops a run.
The controller replies with STEP n as each step begins,
DONE at the end, HALT why if it stops early, and
TEL ir holdage head link freelance twice a second. The second field is
the age of the app-mode hold in tenths of a second, the same number the calculator
shows. The last field is
set when the droid has chosen its own mode, which it announces in plain text on its
debug channel.
As each step executes the controller emits a short token on Serial2, which
the calculator picks up in its Receive( loop and prints. The tokens are
deliberately short: the calculator's line is 21 characters.