A blocks packet consists of a stream of packed bits. The first 7 bits of a message is the index of the device within the topology to which the message should be delivered, or from which it originated. The 0x40 bit of this will be set to indicate that it's a device->host message, or clear for host->device The next 32 bits are a timestamp, in milliseconds since the source device was booted. If sending from the host to the device, or for types of packet where the timestamp is irrelevant, this can be 0. This is followed by a sequence of 1 or more messages. Each message starts with a 7 bit message type, followed by message-type-specific data. --------------------------------------------------------------------------------------- Device topology update (device -> host) 7 bits - message type (0x01) 7 bits - number of device-info blocks to follow 8 bits - number of connection-info blocks to follow This is followed by a series of device-info blocks of the form: 10 bits - device model identifier (see code for list of types) 32 bits - device GUID 10 bits - device firmware version 6 bits - battery status Next follows by a series of connection-info blocks of ths form: 7 bits - device 1 index (i.e. index in the list of devices sent above) 5 bits - device 1 port type 7 bits - device 2 index 5 bits - device 2 port type Ports are indicated by being either North, South, East or West on a device, plus an index to indicate their position along that edge. --------------------------------------------------------------------------------------- Control button down/up (device -> host) 7 bits - message type (down = 0x20, up = 0x21) 7 bits - device index 12 bits - control button ID (see code for values) --------------------------------------------------------------------------------------- Touch start/move/end (device -> host) 7 bits - message type (start = 0x10, move = 0x11, end = 0x12) 7 bits - device index 5 bits - touch index 12 bits - touch X position 12 bits - touch Y position 8 bits - touch Z position --------------------------------------------------------------------------------------- Touch start/move/end with velocity (device -> host) 7 bits - message type (start = 0x13, move = 0x14, end = 0x15) 7 bits - device index 5 bits - touch index 12 bits - touch X position 12 bits - touch Y position 8 bits - touch Z position 8 bits - X velocity 8 bits - Y velocity 8 bits - Z velocity --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- Device command message (host -> device) 7 bits - message type (0x01) 8 bits - command type Command types: resetDevice = 0x00, requestTopologyMessage = 0x01, setHighResTouchDetectionMode = 0x02, setLowResTouchDetectionMode = 0x03, --------------------------------------------------------------------------------------- Modify shared state data block 7 bits - message type (0x02) ..then repeatedly: 3 bits - type of data change command ...extra command-specific bits.. 3 bits - type of data change command ..etc.. 3 bits - end of sequence command