PatHightree / SpaceNavigator

SpaceNavigator driver for Unity3D
MIT License
170 stars 55 forks source link

SpaceNavigatorHIDState does not match device layout of space navigator HID #26

Closed hybridherbst closed 3 years ago

hybridherbst commented 3 years ago

Describe the bug I'm on the development branch, trying out the HID implementation. Seems that the layout that SpaceNavigatorHIDState is matching for does not really match the device layout reported from the navigator:

What it's looking for image The actual layout image

To Reproduce Steps to reproduce the behavior:

  1. Attach a SpacePilot PRO
  2. Try to navigate in the editor
  3. Import samples
  4. Open "Fly around" scene
  5. Press Play

Expected behavior Space Navigator works

Actual behavior Nullref, no editor navigation, layout isn't matched

Desktop:

PatHightree commented 3 years ago

Thank you very much for the detailed bug report. Another such layout mismatch has been found and I suspect there might be more. Can you please help me out further with screenshots of the HID Descriptor ?

With my driver package uninstalled and the input system package installed.

I'll add a layout for the SpacePilot Pro, though I am still figuring out how to apply multiple layouts. (see this forum thread)

hybridherbst commented 3 years ago

For future use, I attached a zip file for "write all attached HID device descriptors to json files" InputDeviceHelper.zip Just add that to a project, run Devices/Save all HID descriptors to files.

image

Here's the full descriptor:

{
    "vendorId": 1133,
    "productId": 50729,
    "usage": 8,
    "usagePage": 1,
    "inputReportSize": 7,
    "outputReportSize": 2,
    "featureReportSize": 29,
    "elements": [
        {
            "usage": 1,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 8,
            "flags": 2
        },
        {
            "usage": 2,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 9,
            "flags": 2
        },
        {
            "usage": 3,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 10,
            "flags": 2
        },
        {
            "usage": 4,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 11,
            "flags": 2
        },
        {
            "usage": 5,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 12,
            "flags": 2
        },
        {
            "usage": 6,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 13,
            "flags": 2
        },
        {
            "usage": 7,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 14,
            "flags": 2
        },
        {
            "usage": 8,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 15,
            "flags": 2
        },
        {
            "usage": 9,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 16,
            "flags": 2
        },
        {
            "usage": 10,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 17,
            "flags": 2
        },
        {
            "usage": 11,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 18,
            "flags": 2
        },
        {
            "usage": 12,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 19,
            "flags": 2
        },
        {
            "usage": 13,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 20,
            "flags": 2
        },
        {
            "usage": 14,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 21,
            "flags": 2
        },
        {
            "usage": 15,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 22,
            "flags": 2
        },
        {
            "usage": 16,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 23,
            "flags": 2
        },
        {
            "usage": 17,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 24,
            "flags": 2
        },
        {
            "usage": 18,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 25,
            "flags": 2
        },
        {
            "usage": 19,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 26,
            "flags": 2
        },
        {
            "usage": 20,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 27,
            "flags": 2
        },
        {
            "usage": 21,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 28,
            "flags": 2
        },
        {
            "usage": 22,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 29,
            "flags": 2
        },
        {
            "usage": 23,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 30,
            "flags": 2
        },
        {
            "usage": 24,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 31,
            "flags": 2
        },
        {
            "usage": 25,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 32,
            "flags": 2
        },
        {
            "usage": 26,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 33,
            "flags": 2
        },
        {
            "usage": 27,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 34,
            "flags": 2
        },
        {
            "usage": 28,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 35,
            "flags": 2
        },
        {
            "usage": 29,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 36,
            "flags": 2
        },
        {
            "usage": 30,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 37,
            "flags": 2
        },
        {
            "usage": 31,
            "usagePage": 9,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": 0,
            "logicalMax": 0,
            "physicalMin": 0,
            "physicalMax": 0,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 3,
            "reportSizeInBits": 1,
            "reportOffsetInBits": 38,
            "flags": 2
        },
        {
            "usage": 50,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 1,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 40,
            "flags": 2
        },
        {
            "usage": 49,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 1,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 24,
            "flags": 2
        },
        {
            "usage": 48,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 1,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 8,
            "flags": 2
        },
        {
            "usage": 53,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 2,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 40,
            "flags": 2
        },
        {
            "usage": 52,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 2,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 24,
            "flags": 2
        },
        {
            "usage": 51,
            "usagePage": 1,
            "unit": 0,
            "unitExponent": 0,
            "logicalMin": -500,
            "logicalMax": 500,
            "physicalMin": -32768,
            "physicalMax": 32767,
            "reportType": 1,
            "collectionIndex": 0,
            "reportId": 2,
            "reportSizeInBits": 16,
            "reportOffsetInBits": 8,
            "flags": 2
        }
    ],
    "collections": []
}
PatHightree commented 3 years ago

You Sir, are a gentleman and a scolar.

Thanks very much, I'll see if I can add the input helper as a sample to the package, in case more situations like this pop up.

PatHightree commented 3 years ago

Input Device Helper was added to the package's samples in beta 5