Skip to content

Latest commit

 

History

History
244 lines (193 loc) · 8.51 KB

File metadata and controls

244 lines (193 loc) · 8.51 KB

GameDAC / Nova Pro Display Support

SteelClock supports GameDAC Gen 2 and Arctis Nova Pro base stations via the direct USB HID driver.

Supported Devices

Device PID Display USB Interface
Arctis Nova Pro (Wired) 12cb 128x64 mi_04
Arctis Nova Pro Wireless (Base Station) 12cd 128x64 mi_04
Arctis Nova Pro Wireless (USB-C Dongle) 12e0 128x64 mi_04
Arctis Nova Pro Wireless (Xbox) 12e5 128x64 mi_04
Arctis Nova 5P (USB-C Dongle) 225d 128x64 mi_04
Arctis Nova Pro Omni 2290 128x64 mi_03 col 01

All devices use SteelSeries VID 1038. The correct USB interface is selected automatically, so the interface config field is not needed.

Note on the Nova Pro Omni: it uses the same image protocol as the other Nova Pro devices, but exposes its OLED on interface mi_03 (collection 01) with HID feature report ID 0x01 instead of mi_04/0x06. SteelClock auto-detects this at runtime (it picks the interface whose feature report is large enough for a frame and discovers the accepted report ID), so no extra configuration is needed.

Note: GameDAC Gen 1 (PID 1280) is not supported due to an undocumented USB protocol. It may work via the GameSense backend on Windows if SteelSeries GG is running.

Quick Start

1. Linux: Install udev Rules

On Linux, USB access requires udev rules (one-time setup):

sudo cp profiles/99-steelseries.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

Then unplug and replug the device, or reboot.

2. Create a Configuration

Create a profile JSON file (e.g. profiles/gamedac.json):

{
  "$schema": ".schema/config.schema.json",
  "config_name": "GameDAC",
  "game_name": "STEELCLOCK",
  "game_display_name": "SteelClock",
  "refresh_rate_ms": 100,
  "backend": "direct",
  "display": {
    "width": 128,
    "height": 64,
    "background": 0
  },
  "direct_driver": {
    "vid": "1038",
    "pid": "12cb",
    "brightness": 5
  },
  "widgets": [
    {
      "type": "clock",
      "enabled": true,
      "position": { "x": 0, "y": 0, "w": 128, "h": 64 },
      "mode": "segment",
      "segment": {
        "format": "%H:%M:%S",
        "colon_blink": true
      },
      "update_interval": 0.1
    }
  ]
}

3. Run

# With a specific profile:
./steelclock -config profiles/gamedac.json

# Or select from tray menu if placed in profiles/ directory

Configuration Reference

Direct Driver Settings

{
  "direct_driver": {
    "vid": "1038",
    "pid": "12cb",
    "brightness": 5
  }
}
Field Type Required Description
vid string No Vendor ID in hex (e.g. "1038"). Omit for auto-detection.
pid string No Product ID in hex (e.g. "12cb"). Omit for auto-detection.
brightness integer No Display brightness, 0 (darkest) to 10 (brightest). Omit to keep device default.

The interface field is not needed for Nova Pro devices — the correct USB interface is auto-detected (mi_04 on most units, mi_03 on the Omni). SteelClock picks the interface whose HID feature report is large enough to carry a frame, so it adapts across device generations.

Auto-Detection

If you have only one SteelSeries device connected, you can omit vid and pid entirely:

{
  "backend": "direct",
  "display": { "width": 128, "height": 64, "background": 0 },
  "direct_driver": {
    "brightness": 5
  }
}

SteelClock scans all known device PIDs and connects to the first one found. For multi-device setups, explicit VID/PID is required.

Multi-Device Setup (Keyboard + GameDAC)

SteelClock can drive multiple displays simultaneously. Use the devices array instead of top-level display/widgets:

{
  "$schema": ".schema/config.schema.json",
  "config_name": "Keyboard + GameDAC",
  "game_name": "STEELCLOCK",
  "game_display_name": "SteelClock",
  "refresh_rate_ms": 100,
  "devices": [
    {
      "id": "keyboard",
      "display": { "width": 128, "height": 40, "background": 0 },
      "backend": "direct",
      "direct_driver": { "interface": "mi_01" },
      "widgets": [
        {
          "type": "clock",
          "enabled": true,
          "position": { "x": 0, "y": 0, "w": 128, "h": 40 },
          "mode": "segment",
          "segment": { "format": "%H:%M", "colon_blink": true },
          "update_interval": 0.1
        }
      ]
    },
    {
      "id": "gamedac",
      "display": { "width": 128, "height": 64, "background": 0 },
      "backend": "direct",
      "direct_driver": { "vid": "1038", "pid": "12cb", "brightness": 5 },
      "widgets": [
        {
          "type": "cpu",
          "enabled": true,
          "position": { "x": 0, "y": 0, "w": 64, "h": 32 },
          "mode": "graph",
          "update_interval": 0.5
        },
        {
          "type": "memory",
          "enabled": true,
          "position": { "x": 64, "y": 0, "w": 64, "h": 32 },
          "mode": "bar",
          "update_interval": 1
        },
        {
          "type": "clock",
          "enabled": true,
          "position": { "x": 0, "y": 32, "w": 128, "h": 32 },
          "mode": "segment",
          "segment": { "format": "%H:%M:%S", "colon_blink": true },
          "update_interval": 0.1
        }
      ]
    }
  ]
}

Each device has its own display dimensions, backend, driver settings, and widget set. Devices operate independently: if one device disconnects, the others continue running.

GameDAC-Specific Features

Brightness Control

Set display brightness (0 to 10) in the direct_driver config. Applied once at startup.

Return-to-UI

When SteelClock exits, it sends a Return-to-UI command to the Nova Pro, restoring the native device screen (volume display, EQ settings, etc.). This happens automatically on clean shutdown.

Backends Comparison

Backend GameDAC Support Brightness Return-to-UI Refresh Rate Requirements
direct Full Yes Yes Up to 60 Hz Device connected via USB
gamesense None No No Does not drive the OLED

The direct backend is required for GameDAC / Nova Pro base stations — GameSense does not drive their OLED (confirmed on the Arctis Nova Pro Omni; SteelSeries GG's own apps use that screen, but third-party GameSense screen events do not reach it). Set "backend": "direct" explicitly: auto-select tries GameSense first and connects without error, so it never falls through to direct and the screen stays blank.

Testing Without Hardware

Use the web editor to preview GameDAC layouts in a browser:

  1. Set "backend": "webclient" in your config, or use the web editor's Apply button (it switches to webclient automatically)
  2. Run SteelClock
  3. Open http://localhost:27302
  4. The preview canvas renders at the configured display resolution (128x64 for GameDAC)
  5. In multi-device mode, each device appears as a separate tab with its own preview

Troubleshooting

Device Not Found

lsusb | grep -i steelseries

Verify the device appears and note the PID. Make sure it matches your direct_driver.pid value.

Permission Denied (Linux)

Install the udev rules as described in the Quick Start section. The device must be unplugged and replugged after installing rules.

Conflicts with SteelSeries GG

The direct driver opens the HID device with shared access, so it generally coexists with SteelSeries GG. However, GG may periodically redraw the base station's native screen (e.g. the volume overlay), briefly overwriting SteelClock's output. For a clean, uninterrupted display, close SteelSeries GG while using the direct backend. (GameSense is not an alternative here — it does not drive the base-station OLED.)

Display Shows Garbage or Nothing

  • Verify display.width and display.height match the device (128x64 for GameDAC Gen 2)
  • Check that direct_driver.pid matches the correct device
  • Review steelclock.log for protocol or connection errors