Building DevScan — A Tool We Needed to Build a Tool
Before we could do anything with the SW7C wheel, we needed to see it.
Not in Device Manager — anyone can open Device Manager. We needed to see it properly. VID, PID, driver type, HID usage page, report sizes. The kind of detail that tells you what you're actually dealing with before you write a single line of code.
The standard answer is NirSoft USBDeview. It's a fine tool. But it's someone else's tool, with someone else's interface, and no way to extend it. We're building a workshop here, not borrowing one.
So we built DevScan first.
What DevScan Does
Three tabs. Three views of the same system.
USB — every device with a USB or HID device ID in the system. Name, VID, PID, driver, status. Pulled via wmic — no pywin32 dependency, no WMI COM object weirdness, just a subprocess call that works regardless of which Python is running the script.
HID — the HID layer specifically, via hidapi. Usage page, usage, interface number, path. This is where you see the device as the OS sees it for input purposes.
COM — serial ports via pyserial. Port name, VID/PID if USB-backed, manufacturer, hardware ID. Essential for anything that presents as a virtual COM port.
Filter bar across all three tabs. Click any device for full detail. Copy VID:PID to clipboard in one click. Export the full scan to JSON.
The Build
Stack is Python and CustomTkinter — same as every other Indigo-Nx tool. Dark theme, monospace font, cyan accent. It takes about thirty seconds to recognise as part of the same family as the X52 configurator.
The interesting part wasn't the UI. It was the dependency problem.
The script runs fine from one terminal and fails in another because Python 3.14 is installed alongside Python 3.12 and pip install went to the wrong one. hidapi is installed. pyserial is installed. Just not for the Python that's actually running the script.
The fix: a bootstrap block at the top of the script that uses sys.executable — the actual Python binary running right now — to install any missing packages. Self-healing on first launch, never needs manual setup.
def _ensure(pkg, import_as=None):
try:
__import__(import_as or pkg)
except ImportError:
subprocess.run([sys.executable, "-m", "pip", "install", pkg, "-q"])
_ensure("hidapi", "hid")
_ensure("pyserial", "serial")
_ensure("pywin32", "win32com")
Three lines of pattern. Works on any machine, any Python version, any install location.
What It Found
The SW7C wheel, VID 1CBE, PID 0277. Enumerated immediately in both USB and HID tabs. HID usage page 0x01 (Generic Desktop), usage 0x04 (Joystick). No custom driver — standard HID, readable with hidapi, writable with a file handle.
That one result told us everything we needed to know about the next step.
The Wider Point
DevScan will get used again. The next time we pick up a piece of hardware with stale software, the first thing we'll do is open it. It'll find the device, show us the VID/PID, and we'll know where to start.
That's the thing about building your own tools — they compound. Each one makes the next project faster.
The reverse engineering work for each device lives in its own named subfolder. Clean structure from the start, because there will be more devices.
It's Out
DevScan v1.0 BETA is available now. Single-file Windows executable — no install, no setup, no strings.
USB, HID, and COM in one window. Plug something in, see exactly what Windows sees. VID, PID, driver, report descriptors, serial ports. Self-bootstrapping if you run from source.
Download DevScan v1.0 BETA — free.
If it saves you time, buy me a coffee.
Next: decompiling the SW7 Compact executable and reading the full USB protocol from source.