Skip to content

Waratah Samples

Matthew Williams edited this page Jun 18, 2025 · 3 revisions

Keyboard

Simple keyboard with capability of reporting of up to 8 regular keys and 1 modifier key.

[[applicationCollection]]
usage = ['Generic Desktop', 'Keyboard']

    [[applicationCollection.inputReport]]

        # Special buttons
        #
        # N.B. Windows applies special buttons only to subsequent keys, so
        # must appear in report beforehand.
        [[applicationCollection.inputReport.variableItem]]
        usageRange = ['Keyboard/Keypad', 'Keyboard LeftControl', 'Keyboard Right GUI']
        logicalValueRange = [0, 1]

        # Regular Buttons
        [[applicationCollection.inputReport.arrayItem]]
        usageRange = ['Keyboard/Keypad', 'ErrorRollOver', 'Keyboard Application']
        count = 8

    # LEDS
    [[applicationCollection.outputReport]]

        [[applicationCollection.outputReport.variableItem]]
        usageRange = ['LED', 'Num Lock', 'Kana']
        logicalValueRange = [0, 1]

Mouse

Simple mouse with 3 buttons.

[[applicationCollection]]
usage = ['Generic Desktop', 'Mouse']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.physicalCollection]]
        usage = ['Generic Desktop', 'Pointer']

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'X']
            sizeInBits = 8
            logicalValueRange = 'maxSignedSizeRange'
            reportFlags = ['relative']

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'Y']
            sizeInBits = 8
            logicalValueRange = 'maxSignedSizeRange'
            reportFlags = ['relative']

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usageRange = ['Button', 'Button 1', 'Button 3']
            logicalValueRange = [0, 1]

Joystick

Flight joystick with throttle, variable stick position, hat switch rocker and 4 buttons.

[[applicationCollection]]
usage = ['Generic Desktop', 'Joystick']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Simulation Controls', 'Throttle']
        sizeInBits = 8

        [[applicationCollection.inputReport.physicalCollection]]
        usage = ['Generic Desktop', 'Pointer']

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'X']
            sizeInBits = 8

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'Y']
            sizeInBits = 8

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Generic Desktop', 'Hat Switch']
        logicalValueRange = [0, 3]
        physicalValueRange = [0, 270]
        unit = 'degrees'

        [[applicationCollection.inputReport.variableItem]]
        usageRange = ['Button', 'Button 1', 'Button 4']
        logicalValueRange = [0, 1]

Gamepad

Simple gamepad with Up/down and left/right and 6 buttons.

[[applicationCollection]]
usage = ['Generic Desktop', 'Gamepad']

    [[applicationCollection.inputReport]]

        # Two axis rocker (tilting forward/backward and left/right)
        [[applicationCollection.inputReport.physicalCollection]]
        usage = ['Generic Desktop', 'Pointer']

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'X']
            logicalValueRange = [-1, 1]

            [[applicationCollection.inputReport.physicalCollection.variableItem]]
            usage = ['Generic Desktop', 'Y']
            logicalValueRange = [-1, 1]

        # 6 buttons
        [[applicationCollection.inputReport.variableItem]]
        usageRange = ['Button', 'Button 1', 'Button 6']
        logicalValueRange = [0, 1]

Telephony Headset

Telephony headset with 2 buttons (Mute and answer/hang-up calls), and 4 LEDs.

[[applicationCollection]]
usage = ['Telephony Device', 'Headset']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Telephony Device', 'Phone Mute']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Telephony Device', 'Hook Switch']
        logicalValueRange = [0, 1]

    [[applicationCollection.outputReport]]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['LED', 'Off-Hook']
        logicalValueRange = [0, 1]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['LED', 'Mute']
        logicalValueRange = [0, 1]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['LED', 'Microphone']
        logicalValueRange = [0, 1]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['LED', 'Ring']
        logicalValueRange = [0, 1]

Consumer Control

Simple consumer control multimedia device with volume up/down, mute, play/pause + stop, scan Next/previous track.

[[applicationCollection]]
usage = ['Consumer', 'Consumer Control']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Volume Increment']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Volume Decrement']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Mute']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Play/Pause']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Stop']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Scan Next Track']
        logicalValueRange = [0, 1]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Scan Previous Track']
        logicalValueRange = [0, 1]

Accelerometer and Gyroscope (Gyrometer)

A device with accelerometer and gyroscope, with 3 axes each. This format is compatible with the Windows Sensor API.

[[applicationCollection]]
usage = ['Sensors', 'Sensor']

    # Accelerometer
    [[applicationCollection.featureReport]]
    usageRelation = ['Sensors', 'Motion: Accelerometer 3D']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Sensor Connection Type']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Connection Type: PC Integrated', 'Connection Type: PC External']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Reporting State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Reporting State: Report No Events', 'Reporting State: Report All Events']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Power State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Power State: Undefined', 'Power State: D4 Power Off']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor State: Undefined', 'Sensor State: Error']

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Sensors', 'Property: Report Interval']
        logicalValueRange = [0, 0xFFFFFFF]

        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Acceleration', 'Modifier: Change Sensitivity Absolute']
        logicalValueRange = [0, 0xFFFF]

        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Acceleration', 'Modifier: Maximum']
        logicalValueRange = [-32767, 32767]
        
        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Acceleration', 'Modifier: Minimum']
        logicalValueRange = [-32767, 32767]

    [[applicationCollection.inputReport]]
    usageRelation = ['Sensors', 'Motion: Accelerometer 3D']

        [[applicationCollection.inputReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor State']

            [[applicationCollection.inputReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor State: Undefined', 'Sensor State: Error']

        [[applicationCollection.inputReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor Event']

            [[applicationCollection.inputReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor Event: Unknown', 'Sensor Event: Change Sensitivity']

        # X, Y, Z axes of acceleration, reported as milli-g's
        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Acceleration Axis X']
        logicalValueRange = [-32767, 32767]
        usageUnitMultiplier = 0.001

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Acceleration Axis Y']
        logicalValueRange = [-32767, 32767]
        usageUnitMultiplier = 0.001

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Acceleration Axis Z']
        logicalValueRange = [-32767, 32767]
        usageUnitMultiplier = 0.001
    
        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Motion State']
        logicalValueRange = [0, 1]

    # Gyrometer
    [[applicationCollection.featureReport]]
    usageRelation = ['Sensors', 'Motion: Gyrometer 3D']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Sensor Connection Type']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Connection Type: PC Integrated', 'Connection Type: PC External']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Reporting State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Reporting State: Report No Events', 'Reporting State: Report All Events']

        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Property: Power State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Power State: Undefined', 'Power State: D4 Power Off']
        
        [[applicationCollection.featureReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor State']

            [[applicationCollection.featureReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor State: Undefined', 'Sensor State: Error']

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Sensors', 'Property: Report Interval']
        logicalValueRange = [0, 0xFFFFFFF]

        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Angular Velocity', 'Modifier: Change Sensitivity Absolute']
        logicalValueRange = [0, 0xFFFF]

        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Angular Velocity', 'Modifier: Maximum']
        logicalValueRange = [-32767, 32767]
        
        [[applicationCollection.featureReport.variableItem]]
        usageTransform = ['Sensors', 'Data Field: Angular Velocity', 'Modifier: Minimum']
        logicalValueRange = [-32767, 32767]

    [[applicationCollection.inputReport]]
    usageRelation = ['Sensors', 'Motion: Gyrometer 3D']

        [[applicationCollection.inputReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor State']

            [[applicationCollection.inputReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor State: Undefined', 'Sensor State: Error']

        [[applicationCollection.inputReport.logicalCollection]]
        usage = ['Sensors', 'Event: Sensor Event']

            [[applicationCollection.inputReport.logicalCollection.arrayItem]]
            usageRange = ['Sensors', 'Sensor Event: Unknown', 'Sensor Event: Change Sensitivity']

        # X, Y, Z axes of angular velocity, reported as degrees per second
        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Angular Velocity about X Axis']
        logicalValueRange = [-32767, 32767]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Angular Velocity about Y Axis']
        logicalValueRange = [-32767, 32767]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Sensors', 'Data Field: Angular Velocity about Z Axis']
        logicalValueRange = [-32767, 32767]

Clone this wiki locally