Architecture overview

Class Diagram

classDiagram class Device { +str name +info Tuple[int, int, int] +rdescs List[List[int]] +report_rate int +endpoints List[Endpoint] +actuators List[Actuator] +hw Dict[str, HWComponent] +fw Firmware +destroy() +transform_action(action) %% Passes the action by the actuators and returns the transformed result () +send_hid_action(action) %% Sends HID action to all endpoints (create_report -> call_input_event) +simulate_action(action) %% Transforms high-level action into HID timed events and sends them () } class UHIDDevice UHIDDevice --|> Endpoint : inherits class Endpoint { -_owner Device -_hid_properties List[HIDProperty] +rdesc List[int] +name str +number int +uhid_dev_is_ready bool -_update_hid_properties() %% Parses the report descriptor and populates _hid_properties () -_receive(data, size, rtype) %% HID data receive callback (triggers the firmware callback) +send(data) %% Sends HID data () +create_report(action, skip_empty) %% Creates a report based on the HID data () +populate_hid_data(action, packets) %% Uses the _hid_properties to populate HID events () } Device --> Endpoint : owns class Firmware { -_owner Device +hid_receive(data, size, rtype, endpoint) +hid_send(data, endpoint) } Device --> Firmware : owns class Actuator { -keys List[str] +transforms(action) %% Transform a high-level action () } Device --o Actuator : uses (actuators) class HWComponent Device --o HWComponent : uses (hw) class HIDProperty { -keys List[str] +populate(action) %% Transform a high-level action () } Endpoint --o HIDProperty : uses (_hid_properties)

simulate_action() Sequence Diagram

sequenceDiagram participant API User participant Device participant Actuator participant Endpoint participant HIDProperty API User->>Device: simulate_action(action) Device->>+Device: hid_action = transform_action(action) loop actuators Device-->>Actuator: transform(data) end Device-->>-Device: Device->>+Endpoint: populate_hid_data(hid_action, packets) loop HID properties Endpoint-->>HIDProperty: populate(hid_action, packets) end Endpoint-->>-Device: loop packets Device->>Endpoint: send(create_report(packet)) end Device-->>API User: