Skip to content

Hex ↔ Main protocol

Transport and ownership

The prototype direction is a compact binary protocol over a shared I²C bus. The Base Board initiates transactions; each Smart Hex is an addressed endpoint. Separate CHAIN input/output GPIOs determine the order in which hexes become eligible for addressing.

The wire protocol has not been implemented or finalized. This page contains proposals. The local OLED is on a separate bus and does not participate in the main protocol.

Enumeration

The fixed chain is MAIN → H0 → H1 → H2 → H3 → H4 → H5 → H6. I²C addresses alone do not encode physical order.

The sequence expresses intended behavior, not the mechanism for the initial address exchange. An unenumerated hex must not collide with another unenumerated hex. Boot address, chain eligibility gating, activation polarity, timing, acknowledgments, reset behavior, and end-of-chain detection all remain TBD.

Illustrative runtime addresses are H0 = 0x20, H1 = 0x21, H2 = 0x22, H3 = 0x23, H4 = 0x24, H5 = 0x25, H6 = 0x26. These are example 7-bit addresses, not a reserved allocation or a definition of shifted address bytes. Check the final bus device inventory before allocation.

Candidate commands

CommandIntended meaningResponse or open detail
PINGCheck device responsivenessHealth/error response TBD
GET_STATUSRead local state and device informationSnapshot schema TBD
GET_SENSORSRead sensor observationsEmpty/unknown/identity encoding TBD
SET_NUMBERSet semantic number tokenValid values and acknowledgment TBD
SET_DISPLAY_MODESelect local display behaviorMode precedence and duration TBD
GET_FIRMWARE_VERSIONQuery installed hex softwareVersion format TBD
ENTER_BOOTLOADEREnter future firmware-update flowRecovery mechanism not defined

For example, SET_NUMBER 8 describes meaning only; it is not a textual command to transmit. The hex renders pixels locally.

Conceptual framing and data contracts

text
[COMMAND] [LENGTH] [PAYLOAD] [CRC]

This is a framing idea, not a packet specification. Field widths, byte order, maximum length, CRC algorithm and coverage, request/response distinction, I²C transaction boundaries, and error codes are unassigned.

The local HexStatus example describes useful data. Firmware version, protocol compatibility, index, sensor identity, and diagnostics need explicit encoding before implementation. Board-global IDs belong in the Base Board mapping layer, not in local sensor reports.

Timing and recovery

The implementation will need bounded request lengths, validation before state changes, timeouts, and defined retry behavior. Repeating SET_NUMBER can be designed to be idempotent; a bootloader command requires its own retry semantics. Do not infer those guarantees from the current command names.

Polling versus change notification, snapshot consistency, missed-update recovery, busy responses, chain restarts, and a device holding the bus low are unresolved. A failed read must preserve an unavailable/stale indication rather than invent empty sensors.

Future versions

When a wire version is defined, add a versioned page here covering transport assumptions, fields, message examples, compatibility negotiation, limits, errors, checksums, retries, and migration behavior. Link the version from this page. There is no protocol v1, assigned opcode table, or deprecated message set yet.

Related: Smart Hex wiring, Base Board software, and firmware updates.