Human-facing detented dial input module for LibXR/XRobot projects.
Dial consumes two LibXR::GPIO phase inputs and publishes discrete clockwise /
counter-clockwise events through LibXR::Event. GPIO callbacks sample the Gray
code phase changes, while OnMonitor() aggregates them into detent events.
Event payloads are stored in an internal queue and can be read with
GetEventResult().
Typical aliases:
dialfor the logical event sourcedial_afor phase Adial_bfor phase B
The module intentionally models a hand-operated dial, not a motor feedback
encoder. Push-button handling should stay in a button module such as
BitsButtonXR.