News:

Precision Simulator update 10.184 (15 September 2025) is now available.
Navburo update 13 (23 November 2022) is now available.
NG FMC and More is released.

Main Menu

CDU PAP7 WinWinG fully compatible with PSX

Started by TCASSE, Wed, 18 Feb 2026 10:58

Christian_Norway

#40
Quote from: TCASSE on Sun,  1 Mar 2026 23:51Hi,

Since you're on Windows 10 and the hidapi installation completed successfully, the issue is most likely caused by either:

Python/pip mismatch (installed in one Python, running with another), or

32-bit / 64-bit architecture mismatch.

Could you please open the same terminal where you run testhid and execute the following commands, then send me the full output?


py -3 -m pip -V

py -3 -m pip show hidapi
py -3 -m pip show hid

py -3 -c "import hid; print('hid loaded from:', hid.__file__); print('devices:', hid.enumerate()[:3])"

If that still fails, please try this clean reinstall:

py -3 -m pip uninstall -y hid hidapi pyhidapi
py -3 -m pip install --no-cache-dir pyhidapi

Then test again with:

py -3 -c "import hid; print(hid.enumerate())"

Most of the time this resolves the issue on Windows.

Please send me the complete output of the commands so I can see exactly what's happening.

Thanks!

Dear Thierry,
Thanks, ran the commands:



















Reinstalled Python and added PATH




Unfortunately still same error:


Kind regards
Christian

TCASSE

Quote from: Christian_Norway on Tue,  3 Mar 2026 21:48Dear Thierry,
Thanks, ran the commands:



















Reinstalled Python and added PATH




Unfortunately still same error:


Kind regards
Christian
Hi Christiann, the PID is 0xBB38, not 0xBB37. That's why the message is CDU HID not found. Modify the configK.ini and tells me...

TCASSE

Quote from: TCASSE on Wed,  4 Mar 2026 08:31Hi Christiann, the PID is 0xBB38, not 0xBB37. That's why the message is "CDU HID not found". Modify the configK.ini and tells me...  (if pyhidapi not good, reinstall hidapi but it should be ok)

Christian_Norway

#43
Quote from: TCASSE on Wed,  4 Mar 2026 08:31Hi Christiann, the PID is 0xBB38, not 0xBB37. That's why the message is CDU HID not found. Modify the configK.ini and tells me...

Thanks, the PID in the configK has been set to 0xBB38 some time ago :-)
I can also see the HID nr in the picture I sent, but all three config files have 0xBB38
Could it be hardcoded somewhere?


Christian_Norway

Dear Thierry,
Thanks, got some help from a friend with Claudecode and we went through a few processes.  The end was the following: (hope this helps) :-)

 configK.ini

● Look at the section name mismatch:

  configK.ini has:
  [CDU]
  PID = 0xBB38

  The exe log says:
  [CONFIG] CDUK VID=0x4098 PID=0xbb37

  The exe is looking for section [CDUK], but the config file has [CDU]. It didn't find [CDUK], so it fell back to
  the hardcoded default of 0xbb37.

  Fix: change [CDU] to [CDUK] in configK.ini:

● Update(configK.ini)

---

 Still failing even as admin. The exe's bundled hidapi can see the device in PowerShell but hid.enumerate returns
  nothing — likely a usage page filter in the .801 source we don't have.

  First let's fix TestHid.py — it can't find hidapi.dll because Python 3.8+ no longer searches the current
  directory for DLLs. Add os.add_dll_directory before the import:

● Read 1 file (ctrl+o to expand)

● Update(TestHid.py)
  ⎿  Added 2 lines
      1  # hid_scan_winwing.py
      2 +import os, sys
      3 +os.add_dll_directory(os.path.dirname(os.path.abspath(__file__)))
      4  import hid
      5
      6  VID = 0x4098

● Now run it again:

  python TestHid.py

  This will show the actual usage_page and usage values for every WinWing interface — that'll tell us exactly which
   interface the exe needs to open and why enumerate is returning empty.

✻ Cooked for 56s

---


 c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-1980:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>clear
  'clear' is not recognized as an internal or external command,
  operable program or batch file.

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>
 
 
   Good info. TestHid.py (using the local hidapi.dll) finds the device fine. The exe fails because it uses its own
  bundled hidapi.dll (older, compiled into the exe at build time) which can't see this device.

  The device:
  - PID: 0xbb38 ✓ (matches config)
  - Product: WINCTRL 4 PFP CAPTAIN
  - Usage page 1 / usage 4 (joystick)

  The fix requires rebuilding the exe with the newer hidapi.dll from the folder. Do you have the .py source file
  that was used to build CDU_key15.801.exe?

✻ Cogitated for 31s

---
Kind regards
Christian

Christian_Norway

#45
Dear Thierry,
Here is the entire session:

Microsoft Windows [Version 10.0.26200.7922]
(c) Microsoft Corporation. All rights reserved.

C:\Users\chris>npm -v
11.9.0

C:\Users\chris>npm install -g @anthropic-ai/claude-code

added 2 packages in 8s

1 package is looking for funding
  run `npm fund` for details
npm notice
npm notice New minor version of npm available! 11.9.0 -> 11.11.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.11.0
npm notice To update run: npm install -g npm@11.11.0
npm notice

C:\Users\chris> npm install -g npm@11.11.0

added 1 package in 5s

15 packages are looking for funding
  run `npm fund` for details

C:\Users\chris>prøv claude -v
'prøv' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\chris>claude -v
2.1.68 (Claude Code)

C:\Users\chris>cd C:\Aerowinx\Tcasse WinWing

C:\Aerowinx\Tcasse WinWing>claude -h
Usage: claude [options] [command] [prompt]

Claude Code - starts an interactive session by default, use -p/--print for non-interactive output

Arguments:
  prompt                                            Your prompt

Options:
  --add-dir <directories...>                        Additional directories to allow tool access to
  --agent <agent>                                  Agent for the current session. Overrides the 'agent' setting.
  --agents <json>                                  JSON object defining custom agents (e.g. '{"reviewer":
                                                    {"description": "Reviews code", "prompt": "You are a code
                                                    reviewer"}}')
  --allow-dangerously-skip-permissions              Enable bypassing all permission checks as an option, without it
                                                    being enabled by default. Recommended only for sandboxes with no
                                                    internet access.
  --allowedTools, --allowed-tools <tools...>        Comma or space-separated list of tool names to allow (e.g.
                                                    "Bash(git:*) Edit")
  --append-system-prompt <prompt>                  Append a system prompt to the default system prompt
  --betas <betas...>                                Beta headers to include in API requests (API key users only)
  --chrome                                          Enable Claude in Chrome integration
  -c, --continue                                    Continue the most recent conversation in the current directory
  --dangerously-skip-permissions                    Bypass all permission checks. Recommended only for sandboxes with
                                                    no internet access.
  -d, --debug [filter]                              Enable debug mode with optional category filtering (e.g.,
                                                    "api,hooks" or "!1p,!file")
  --debug-file <path>                              Write debug logs to a specific file path (implicitly enables debug
                                                    mode)
  --disable-slash-commands                          Disable all skills
  --disallowedTools, --disallowed-tools <tools...>  Comma or space-separated list of tool names to deny (e.g.
                                                    "Bash(git:*) Edit")
  --effort <level>                                  Effort level for the current session (low, medium, high)
  --fallback-model <model>                          Enable automatic fallback to specified model when default model is
                                                    overloaded (only works with --print)
  --file <specs...>                                File resources to download at startup. Format:
                                                    file_id:relative_path (e.g., --file file_abc:doc.txt
                                                    file_def:img.png)
  --fork-session                                    When resuming, create a new session ID instead of reusing the
                                                    original (use with --resume or --continue)
  --from-pr [value]                                Resume a session linked to a PR by PR number/URL, or open
                                                    interactive picker with optional search term
  -h, --help                                        Display help for command
  --ide                                            Automatically connect to IDE on startup if exactly one valid IDE is
                                                    available
  --include-partial-messages                        Include partial message chunks as they arrive (only works with
                                                    --print and --output-format=stream-json)
  --input-format <format>                          Input format (only works with --print): "text" (default), or
                                                    "stream-json" (realtime streaming input) (choices: "text",
                                                    "stream-json")
  --json-schema <schema>                            JSON Schema for structured output validation. Example:
                                                    {"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}
  --max-budget-usd <amount>                        Maximum dollar amount to spend on API calls (only works with
                                                    --print)
  --mcp-config <configs...>                        Load MCP servers from JSON files or strings (space-separated)
  --mcp-debug                                      [DEPRECATED. Use --debug instead] Enable MCP debug mode (shows MCP
                                                    server errors)
  --model <model>                                  Model for the current session. Provide an alias for the latest
                                                    model (e.g. 'sonnet' or 'opus') or a model's full name (e.g.
                                                    'claude-sonnet-4-6').
  --no-chrome                                      Disable Claude in Chrome integration
  --no-session-persistence                          Disable session persistence - sessions will not be saved to disk
                                                    and cannot be resumed (only works with --print)
  --output-format <format>                          Output format (only works with --print): "text" (default), "json"
                                                    (single result), or "stream-json" (realtime streaming) (choices:
                                                    "text", "json", "stream-json")
  --permission-mode <mode>                          Permission mode to use for the session (choices: "acceptEdits",
                                                    "bypassPermissions", "default", "dontAsk", "plan")
  --plugin-dir <paths...>                          Load plugins from directories for this session only (repeatable)
  -p, --print                                      Print response and exit (useful for pipes). Note: The workspace
                                                    trust dialog is skipped when Claude is run with the -p mode. Only
                                                    use this flag in directories you trust.
  --replay-user-messages                            Re-emit user messages from stdin back on stdout for acknowledgment
                                                    (only works with --input-format=stream-json and
                                                    --output-format=stream-json)
  -r, --resume [value]                              Resume a conversation by session ID, or open interactive picker
                                                    with optional search term
  --session-id <uuid>                              Use a specific session ID for the conversation (must be a valid
                                                    UUID)
  --setting-sources <sources>                      Comma-separated list of setting sources to load (user, project,
                                                    local).
  --settings <file-or-json>                        Path to a settings JSON file or a JSON string to load additional
                                                    settings from
  --strict-mcp-config                              Only use MCP servers from --mcp-config, ignoring all other MCP
                                                    configurations
  --system-prompt <prompt>                          System prompt to use for the session
  --tmux                                            Create a tmux session for the worktree (requires --worktree). Uses
                                                    iTerm2 native panes when available; use --tmux=classic for
                                                    traditional tmux.
  --tools <tools...>                                Specify the list of available tools from the built-in set. Use ""
                                                    to disable all tools, "default" to use all tools, or specify tool
                                                    names (e.g. "Bash,Edit,Read").
  --verbose                                        Override verbose mode setting from config
  -v, --version                                    Output the version number
  -w, --worktree [name]                            Create a new git worktree for this session (optionally specify a
                                                    name)

Commands:
  agents [options]                                  List configured agents
  auth                                              Manage authentication
  doctor                                            Check the health of your Claude Code auto-updater
  install [options] [target]                        Install Claude Code native build. Use [target] to specify version
                                                    (stable, latest, or specific version)
  mcp                                              Configure and manage MCP servers
  plugin                                            Manage Claude Code plugins
  setup-token                                      Set up a long-lived authentication token (requires Claude
                                                    subscription)
  update|upgrade                                    Check for updates and install if available

C:\Aerowinx\Tcasse WinWing>claude --dangerously-skip-permissions
Claude Code on Windows requires git-bash (https://git-scm.com/downloads/win). If installed but not in PATH, set environment variable pointing to your bash.exe, similar to: CLAUDE_CODE_GIT_BASH_PATH=C:\Program Files\Git\bin\bash.exe

C:\Aerowinx\Tcasse WinWing>https://git-scm.com/downloads/win
'https:' is not recognized as an internal or external command,
operable program or batch file.

C:\Aerowinx\Tcasse WinWing>claude --dangerously-skip-permissions
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING: Claude Code running in Bypass Permissions mode

In Bypass Permissions mode, Claude Code will not ask for your approval before running potentially dangerous commands.
This mode should only be used in a sandboxed container/VM that has restricted internet access and can easily be
restored if damaged.

By proceeding, you accept all responsibility for actions taken while running in Bypass Permissions mode.

https://code.claude.com/docs/en/security

> 1. No, exit √
  2. Yes, I accept

Enter to confirm · Esc to cancel

C:\Aerowinx\Tcasse WinWing>2
'2' is not recognized as an internal or external command,
operable program or batch file.

C:\Aerowinx\Tcasse WinWing>claude --dangerously-skip-permissions

╭─── Claude Code v2.1.68 ──────────────────────────────────────────────────────────────────────────────────────────────╮
│                                                    │ Tips for getting started                                        │
│              Welcome back               │ Run /init to create a CLAUDE.md file with instructions for Cla... │
│                                                    │ ─────────────────────────────────────────────────────────────── │
│                                                    │ Recent activity                                                │
│                      ▐▛███▜▌                      │ No recent activity                                              │
│                      ▝▜█████▛▘                    │                                                                │
│                        ▘▘ ▝▝                      │                                                                │
│  Sonnet 4.6 · Claude Pro ·  │                                                                │
│  Organization                                      │                                                                │
│            C:\Aerowinx\Tcasse WinWing            │                                                                │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

  Welcome to Opus 4.6

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
>
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  ⏵⏵ bypass permissions on (shift+tab to cycle)

╭─── Claude Code v2.1.68 ─────────────────────────────────────────────────────────────────────────────────────────╮
│                                                    │ Tips for getting started                                  │
│              Welcome back                │ Run /init to create a CLAUDE.md file with instructions fo... │
│                                                    │ ────────────────────────────────────────────────────────── │
│                                                    │ Recent activity                                            │
│                      ▐▛███▜▌                      │ No recent activity                                        │
│                      ▝▜█████▛▘                    │                                                            │
│                        ▘▘ ▝▝                      │                                                            │
│  Sonnet 4.6 · Claude Pro ·  │                                                            │
│  Organization                                      │                                                            │
│            C:\Aerowinx\Tcasse WinWing            │                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

  Welcome to Opus 4.6

> c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb37
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-10428:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>

● Recalled 1 memory, searched for 2 patterns, read 2 files (ctrl+o to expand)

● The error is RuntimeError: CDU HID not found at line 271. The program found your config (VID=0x4098, PID=0xbb37)
  but couldn't open the HID device. Let me look at the source code around that error.

● Read 1 file (ctrl+o to expand)

● The error is clear: at line 197-199 of the source, hid.enumerate(0x4098, 0xbb37) returned an empty list — no HID
  device with that VID/PID was found by Windows.

  Most likely causes:

  1. Device not plugged in — the WinWing CDU panel is not connected via USB
  2. Wrong PID — the device is connected but has a different Product ID than 0xbb37
  3. Driver issue — Windows sees the device but not as a HID device

  You already have TestHid.py that scans for all WinWing (VID=0x4098) devices. Run it to see what's actually
  detected:

  python TestHid.py

  This will list every WinWing device Windows can see, with their actual PIDs. If your CDU shows up with a
  different PID than 0xbb37, that's the mismatch to fix in map.json or the config.

  If TestHid.py finds nothing at all, the issue is physical (cable, USB port, or device not powered on).

✻ Brewed for 32s

> where is PID defined?

● Read 4 files (ctrl+o to expand)

● There's a mismatch. The exe is using PID=0xbb37 but all three config files (configK.ini, configL.ini,
  configS.ini) specify PID=0xBB38.

  The exe reads its PID from a config file — likely configK.ini since the log says [CONFIG] CDUK. But the exe
  loaded 0xbb37, not 0xBB38 from the config. This means either:

  1. The exe has 0xbb37 hardcoded as a default/fallback, or
  2. It's reading a different config file not in this directory

  Which config file does CDU_key15.801.exe actually read? The source (OLDFILES2 version) hardcoded PID = 0xBB37 at
  line 6. The compiled exe may have that baked in rather than reading from the config.

  Either way: run python TestHid.py to find out what PID your physical device actually reports, then we know which
  value needs to match.

> why is it not reading pid from kconfig.json

● Read 1 file (ctrl+o to expand)

● Because the source code (CDU_key15.7.py) never reads from a config file at all — VID and PID are hardcoded
  constants at lines 5–6:

  VID = 0x4098
  PID = 0xBB37

  The [CONFIG] CDUK VID=0x4098 PID=0xbb37 line in the output is just the exe printing those hardcoded values. No
  configK.ini parsing code exists in this version.

  The .801 exe was compiled from a newer version of the source (not present in the directory) that does read from
  configK.ini — hence the [CONFIG] log line — but the PID it read was still 0xbb37, not 0xBB38. So either:

  - The .801 source reads configK.ini but fell back to a hardcoded default of 0xbb37, or
  - configK.ini had 0xbb37 at compile/run time and was later changed to 0xBB38

  Do you have the .py source that was used to build CDU_key15.801.exe?

> configK.ini

● Look at the section name mismatch:

  configK.ini has:
  [CDU]
  PID = 0xBB38

  The exe log says:
  [CONFIG] CDUK VID=0x4098 PID=0xbb37

  The exe is looking for section [CDUK], but the config file has [CDU]. It didn't find [CDUK], so it fell back to
  the hardcoded default of 0xbb37.

  Fix: change [CDU] to [CDUK] in configK.ini:

● Update(configK.ini)
  ⎿  Added 1 line, removed 1 line
      1  [PSX]
      2  host =  127.0.0.1
      3  port = 10747
      4 -[CDU]
      4 +[CDUK]
      5  VID = 0x4098
      6  PID = 0xBB38
      7  No newline at end of file

● Now run CDU_key15.801.exe again — it should read PID=0xBB38 and find the device.

> c:\Aerowinx\Tcasse WinWing>
  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-44196:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>

● Good — it's now reading PID=0xbb38. But it still can't find the device, meaning no HID device with VID=0x4098
  PID=0xbb38 is visible to Windows right now.

  Run the scanner to see what's actually connected:

  python TestHid.py

  This will tell us the real PID your device is reporting (or confirm it's not detected at all).

> c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing>

● The hidapi.dll is in the project folder but Python's hid module isn't finding it. Use PowerShell instead to list
  WinWing HID devices:

● Bash(powershell -Command "Get-PnpDevice | Where-Object { $_.HardwareID -like '*VID_4098*' } | Select-Object
      Status, Class, FriendlyName, HardwareID | Format-List")
  ⎿  Error: Exit code 1
    Where-Object : The term 'extglob.HardwareID' is not recognized as the name of a cmdlet, function, script file,
      or
    operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
    and try
    again.
    At line:1 char:17
    + ... PnpDevice | Where-Object { extglob.HardwareID -like '*VID_4098*' } |  ...
    +                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (extglob.HardwareID:String) [Where-Object],
    CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.WhereObjectCommand


    ... +9 lines (ctrl+o to see all)

● Bash(powershell -Command "Get-PnpDevice | Where-Object { $_.InstanceId -like '*VID_4098*' } | Select-Object
      Status, Class, FriendlyName, InstanceId | Format-List")
  ⎿  Error: Exit code 1
    Where-Object : The term 'extglob.InstanceId' is not recognized as the name of a cmdlet, function, script file,
      or
    operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
    and try
    again.
    At line:1 char:17
    + ... PnpDevice | Where-Object { extglob.InstanceId -like '*VID_4098*' } |  ...
    +                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (extglob.InstanceId:String) [Where-Object],
    CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.WhereObjectCommand


    ... +9 lines (ctrl+o to see all)

● Bash(powershell -Command "Get-PnpDevice | Where-Object InstanceId -like '*VID_4098*' | Select-Object Status,
      Class, FriendlyName, InstanceId | Format-List")
  ⎿  Status      : OK
    Class        : HIDClass
    FriendlyName : USB Input Device
    ... +16 lines (ctrl+o to expand)

● The device is connected and Windows sees it (PID_BB38, Status: OK). The problem is with TestHid.py not finding
  hidapi.dll — but that's not blocking the exe.

  The exe should work. The issue is likely that hid.enumerate in the compiled exe is finding the device on a
  specific interface/usage that isn't the keyboard report. Notice there are multiple HID entries for BB38:

  - USB\VID_4098&PID_BB38 — USB composite device (OK)
  - HID\VID_4098&PID_BB38 — HID game controller (OK)

  The exe calls hid.enumerate(VID, PID) and uses devs
[o]— if the first result is an interface that requires
  elevated permissions or exclusive access, it fails silently before the open, and the if not devs check would pass
  but hid.Device(path=path) would throw.

  But the error says CDU HID not found which is the if not devs check — so hid.enumerate is returning empty. This
  could be a permissions issue: the exe's bundled hidapi.dll may need to run as Administrator to enumerate the
  device.

  Try: right-click CDU_key15.801.exe → Run as administrator

✻ Baked for 36s

> Microsoft Windows [Version 10.0.26200.7922]
  (c) Microsoft Corporation. All rights reserved.

  C:\Windows\System32>cd c:\Aerowinx

  c:\Aerowinx>cd "Tcasse WinWing"

  c:\Aerowinx\Tcasse WinWing>dir
  Volume in drive C is OS
  Volume Serial Number is B03C-C107

  Directory of c:\Aerowinx\Tcasse WinWing

  04/03/2026  18:19    <DIR>          .
  02/03/2026  22:51    <DIR>          ..
  26/02/2026  22:48        10,732,632 CDU01.exe
  19/02/2026  05:44            1,180 cdu_hid_map.json
  28/02/2026  15:50        9,520,981 CDU_key15.801.exe
  26/02/2026  22:48        9,493,994 CDU_led01.exe
  04/03/2026  18:19                74 configK.ini
  26/02/2026  22:52                74 configL.ini
  26/02/2026  22:52                75 configS.ini
  03/03/2026  23:03          166,912 hidapi.dll
  03/03/2026  23:03            7,542 hidapi.lib
  03/03/2026  23:03        3,690,496 hidapi.pdb
  26/02/2026  22:49            1,180 map.json
  02/03/2026  22:51    <DIR>          Old files
  02/03/2026  22:51    <DIR>          OLDFILES2
  02/03/2026  22:51    <DIR>          Oldfiles3
  01/03/2026  17:51              534 TestHid.py
  28/02/2026  15:53          528,266 Video_2026-02-28_155317.mp4
  28/02/2026  18:34        1,161,595 Video_2026-02-28_183430.mp4
  28/02/2026  18:39          387,611 Video_2026-02-28_183903.mp4
  01/03/2026  17:52          543,845 Video_2026-03-01_175218.mp4
  01/03/2026  17:55          471,907 Video_2026-03-01_175542.mp4
  01/03/2026  18:04          442,076 Video_2026-03-01_180402.mp4
  01/03/2026  20:58          310,194 Video_2026-03-01_205801.mp4
  01/03/2026  21:02          186,316 Video_2026-03-01_210208.mp4
                20 File(s)    37,647,484 bytes
                5 Dir(s)  444,745,310,208 bytes free

  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-1980:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing> run as administrator

● Still failing even as admin. The exe's bundled hidapi can see the device in PowerShell but hid.enumerate returns
  nothing — likely a usage page filter in the .801 source we don't have.

  First let's fix TestHid.py — it can't find hidapi.dll because Python 3.8+ no longer searches the current
  directory for DLLs. Add os.add_dll_directory before the import:

● Read 1 file (ctrl+o to expand)

● Update(TestHid.py)
  ⎿  Added 2 lines
      1  # hid_scan_winwing.py
      2 +import os, sys
      3 +os.add_dll_directory(os.path.dirname(os.path.abspath(__file__)))
      4  import hid
      5
      6  VID = 0x4098

● Now run it again:

  python TestHid.py

  This will show the actual usage_page and usage values for every WinWing interface — that'll tell us exactly which
  interface the exe needs to open and why enumerate is returning empty.

✻ Cooked for 56s

> Microsoft Windows [Version 10.0.26200.7922]
  (c) Microsoft Corporation. All rights reserved.

  C:\Windows\System32>cd c:\Aerowinx

  c:\Aerowinx>cd "Tcasse WinWing"

  c:\Aerowinx\Tcasse WinWing>dir
  Volume in drive C is OS
  Volume Serial Number is B03C-C107

  Directory of c:\Aerowinx\Tcasse WinWing

  04/03/2026  18:19    <DIR>          .
  02/03/2026  22:51    <DIR>          ..
  26/02/2026  22:48        10,732,632 CDU01.exe
  19/02/2026  05:44            1,180 cdu_hid_map.json
  28/02/2026  15:50        9,520,981 CDU_key15.801.exe
  26/02/2026  22:48        9,493,994 CDU_led01.exe
  04/03/2026  18:19                74 configK.ini
  26/02/2026  22:52                74 configL.ini
  26/02/2026  22:52                75 configS.ini
  03/03/2026  23:03          166,912 hidapi.dll
  03/03/2026  23:03            7,542 hidapi.lib
  03/03/2026  23:03        3,690,496 hidapi.pdb
  26/02/2026  22:49            1,180 map.json
  02/03/2026  22:51    <DIR>          Old files
  02/03/2026  22:51    <DIR>          OLDFILES2
  02/03/2026  22:51    <DIR>          Oldfiles3
  01/03/2026  17:51              534 TestHid.py
  28/02/2026  15:53          528,266 Video_2026-02-28_155317.mp4
  28/02/2026  18:34        1,161,595 Video_2026-02-28_183430.mp4
  28/02/2026  18:39          387,611 Video_2026-02-28_183903.mp4
  01/03/2026  17:52          543,845 Video_2026-03-01_175218.mp4
  01/03/2026  17:55          471,907 Video_2026-03-01_175542.mp4
  01/03/2026  18:04          442,076 Video_2026-03-01_180402.mp4
  01/03/2026  20:58          310,194 Video_2026-03-01_205801.mp4
  01/03/2026  21:02          186,316 Video_2026-03-01_210208.mp4
                20 File(s)    37,647,484 bytes
                5 Dir(s)  444,745,310,208 bytes free

  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-1980:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>clear
  'clear' is not recognized as an internal or external command,
  operable program or batch file.

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>

✶ Warping...
  ⎿  Tip: Run claude --continue or claude --resume to resume a conversation

───────────────────────────────────────────────────────────────────────────────────────────────────────────────────
>
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  ⏵⏵ bypass permissions on (shift+tab to cycle) · esc to interrupt

╭─── Claude Code v2.1.68 ─────────────────────────────────────────────────────────────────────────────────────────╮
│                                                    │ Tips for getting started                                  │
│              Welcome back B              │ Run /init to create a CLAUDE.md file with instructions fo... │
│                                                    │ ────────────────────────────────────────────────────────── │
│                                                    │ Recent activity                                            │
│                      ▐▛███▜▌                      │ No recent activity                                        │
│                      ▝▜█████▛▘                    │                                                            │
│                        ▘▘ ▝▝                      │                                                            │
│  Sonnet 4.6 · Claude Pro ·    │                                                            │
│  Organization                                      │                                                            │
│            C:\Aerowinx\Tcasse WinWing            │                                                            │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

  Welcome to Opus 4.6

> c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb37
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-10428:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>

● Recalled 1 memory, searched for 2 patterns, read 2 files (ctrl+o to expand)

● The error is RuntimeError: CDU HID not found at line 271. The program found your config (VID=0x4098, PID=0xbb37)
  but couldn't open the HID device. Let me look at the source code around that error.

● Read 1 file (ctrl+o to expand)

● The error is clear: at line 197-199 of the source, hid.enumerate(0x4098, 0xbb37) returned an empty list — no HID
  device with that VID/PID was found by Windows.

  Most likely causes:

  1. Device not plugged in — the WinWing CDU panel is not connected via USB
  2. Wrong PID — the device is connected but has a different Product ID than 0xbb37
  3. Driver issue — Windows sees the device but not as a HID device

  You already have TestHid.py that scans for all WinWing (VID=0x4098) devices. Run it to see what's actually
  detected:

  python TestHid.py

  This will list every WinWing device Windows can see, with their actual PIDs. If your CDU shows up with a
  different PID than 0xbb37, that's the mismatch to fix in map.json or the config.

  If TestHid.py finds nothing at all, the issue is physical (cable, USB port, or device not powered on).

✻ Brewed for 32s

> where is PID defined?

● Read 4 files (ctrl+o to expand)

● There's a mismatch. The exe is using PID=0xbb37 but all three config files (configK.ini, configL.ini,
  configS.ini) specify PID=0xBB38.

  The exe reads its PID from a config file — likely configK.ini since the log says [CONFIG] CDUK. But the exe
  loaded 0xbb37, not 0xBB38 from the config. This means either:

  1. The exe has 0xbb37 hardcoded as a default/fallback, or
  2. It's reading a different config file not in this directory

  Which config file does CDU_key15.801.exe actually read? The source (OLDFILES2 version) hardcoded PID = 0xBB37 at
  line 6. The compiled exe may have that baked in rather than reading from the config.

  Either way: run python TestHid.py to find out what PID your physical device actually reports, then we know which
  value needs to match.

> why is it not reading pid from kconfig.json

● Read 1 file (ctrl+o to expand)

● Because the source code (CDU_key15.7.py) never reads from a config file at all — VID and PID are hardcoded
  constants at lines 5–6:

  VID = 0x4098
  PID = 0xBB37

  The [CONFIG] CDUK VID=0x4098 PID=0xbb37 line in the output is just the exe printing those hardcoded values. No
  configK.ini parsing code exists in this version.

  The .801 exe was compiled from a newer version of the source (not present in the directory) that does read from
  configK.ini — hence the [CONFIG] log line — but the PID it read was still 0xbb37, not 0xBB38. So either:

  - The .801 source reads configK.ini but fell back to a hardcoded default of 0xbb37, or
  - configK.ini had 0xbb37 at compile/run time and was later changed to 0xBB38

  Do you have the .py source that was used to build CDU_key15.801.exe?

> configK.ini

● Look at the section name mismatch:

  configK.ini has:
  [CDU]
  PID = 0xBB38

  The exe log says:
  [CONFIG] CDUK VID=0x4098 PID=0xbb37

  The exe is looking for section [CDUK], but the config file has [CDU]. It didn't find [CDUK], so it fell back to
  the hardcoded default of 0xbb37.

  Fix: change [CDU] to [CDUK] in configK.ini:

● Update(configK.ini)
  ⎿  Added 1 line, removed 1 line
      1  [PSX]
      2  host =  127.0.0.1
      3  port = 10747
      4 -[CDU]
      4 +[CDUK]
      5  VID = 0x4098
      6  PID = 0xBB38
      7  No newline at end of file

● Now run CDU_key15.801.exe again — it should read PID=0xBB38 and find the device.

> c:\Aerowinx\Tcasse WinWing>
  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-44196:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>

● Good — it's now reading PID=0xbb38. But it still can't find the device, meaning no HID device with VID=0x4098
  PID=0xbb38 is visible to Windows right now.

  Run the scanner to see what's actually connected:

  python TestHid.py

  This will tell us the real PID your device is reporting (or confirm it's not detected at all).

> c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing>

● The hidapi.dll is in the project folder but Python's hid module isn't finding it. Use PowerShell instead to list
  WinWing HID devices:

● Bash(powershell -Command "Get-PnpDevice | Where-Object { $_.HardwareID -like '*VID_4098*' } | Select-Object
      Status, Class, FriendlyName, HardwareID | Format-List")
  ⎿  Error: Exit code 1
    Where-Object : The term 'extglob.HardwareID' is not recognized as the name of a cmdlet, function, script file,
      or
    operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
    and try
    again.
    At line:1 char:17
    + ... PnpDevice | Where-Object { extglob.HardwareID -like '*VID_4098*' } |  ...
    +                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (extglob.HardwareID:String) [Where-Object],
    CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.WhereObjectCommand


    ... +9 lines (ctrl+o to see all)

● Bash(powershell -Command "Get-PnpDevice | Where-Object { $_.InstanceId -like '*VID_4098*' } | Select-Object
      Status, Class, FriendlyName, InstanceId | Format-List")
  ⎿  Error: Exit code 1
    Where-Object : The term 'extglob.InstanceId' is not recognized as the name of a cmdlet, function, script file,
      or
    operable program. Check the spelling of the name, or if a path was included, verify that the path is correct
    and try
    again.
    At line:1 char:17
    + ... PnpDevice | Where-Object { extglob.InstanceId -like '*VID_4098*' } |  ...
    +                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (extglob.InstanceId:String) [Where-Object],
    CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException,Microsoft.PowerShell.Commands.WhereObjectCommand


    ... +9 lines (ctrl+o to see all)

● Bash(powershell -Command "Get-PnpDevice | Where-Object InstanceId -like '*VID_4098*' | Select-Object Status,
      Class, FriendlyName, InstanceId | Format-List")
  ⎿  Status      : OK
    Class        : HIDClass
    FriendlyName : USB Input Device
    ... +16 lines (ctrl+o to expand)

● The device is connected and Windows sees it (PID_BB38, Status: OK). The problem is with TestHid.py not finding
  hidapi.dll — but that's not blocking the exe.

  The exe should work. The issue is likely that hid.enumerate in the compiled exe is finding the device on a
  specific interface/usage that isn't the keyboard report. Notice there are multiple HID entries for BB38:

  - USB\VID_4098&PID_BB38 — USB composite device (OK)
  - HID\VID_4098&PID_BB38 — HID game controller (OK)

  The exe calls hid.enumerate(VID, PID) and uses devs
[o]— if the first result is an interface that requires
  elevated permissions or exclusive access, it fails silently before the open, and the if not devs check would pass
  but hid.Device(path=path) would throw.

  But the error says CDU HID not found which is the if not devs check — so hid.enumerate is returning empty. This
  could be a permissions issue: the exe's bundled hidapi.dll may need to run as Administrator to enumerate the
  device.

  Try: right-click CDU_key15.801.exe → Run as administrator

✻ Baked for 36s

> Microsoft Windows [Version 10.0.26200.7922]
  (c) Microsoft Corporation. All rights reserved.

  C:\Windows\System32>cd c:\Aerowinx

  c:\Aerowinx>cd "Tcasse WinWing"

  c:\Aerowinx\Tcasse WinWing>dir
  Volume in drive C is OS
  Volume Serial Number is B03C-C107

  Directory of c:\Aerowinx\Tcasse WinWing

  04/03/2026  18:19    <DIR>          .
  02/03/2026  22:51    <DIR>          ..
  26/02/2026  22:48        10,732,632 CDU01.exe
  19/02/2026  05:44            1,180 cdu_hid_map.json
  28/02/2026  15:50        9,520,981 CDU_key15.801.exe
  26/02/2026  22:48        9,493,994 CDU_led01.exe
  04/03/2026  18:19                74 configK.ini
  26/02/2026  22:52                74 configL.ini
  26/02/2026  22:52                75 configS.ini
  03/03/2026  23:03          166,912 hidapi.dll
  03/03/2026  23:03            7,542 hidapi.lib
  03/03/2026  23:03        3,690,496 hidapi.pdb
  26/02/2026  22:49            1,180 map.json
  02/03/2026  22:51    <DIR>          Old files
  02/03/2026  22:51    <DIR>          OLDFILES2
  02/03/2026  22:51    <DIR>          Oldfiles3
  01/03/2026  17:51              534 TestHid.py
  28/02/2026  15:53          528,266 Video_2026-02-28_155317.mp4
  28/02/2026  18:34        1,161,595 Video_2026-02-28_183430.mp4
  28/02/2026  18:39          387,611 Video_2026-02-28_183903.mp4
  01/03/2026  17:52          543,845 Video_2026-03-01_175218.mp4
  01/03/2026  17:55          471,907 Video_2026-03-01_175542.mp4
  01/03/2026  18:04          442,076 Video_2026-03-01_180402.mp4
  01/03/2026  20:58          310,194 Video_2026-03-01_205801.mp4
  01/03/2026  21:02          186,316 Video_2026-03-01_210208.mp4
                20 File(s)    37,647,484 bytes
                5 Dir(s)  444,745,310,208 bytes free

  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-1980:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing> run as administrator

● Still failing even as admin. The exe's bundled hidapi can see the device in PowerShell but hid.enumerate returns
  nothing — likely a usage page filter in the .801 source we don't have.

  First let's fix TestHid.py — it can't find hidapi.dll because Python 3.8+ no longer searches the current
  directory for DLLs. Add os.add_dll_directory before the import:

● Read 1 file (ctrl+o to expand)

● Update(TestHid.py)
  ⎿  Added 2 lines
      1  # hid_scan_winwing.py
      2 +import os, sys
      3 +os.add_dll_directory(os.path.dirname(os.path.abspath(__file__)))
      4  import hid
      5
      6  VID = 0x4098

● Now run it again:

  python TestHid.py

  This will show the actual usage_page and usage values for every WinWing interface — that'll tell us exactly which
  interface the exe needs to open and why enumerate is returning empty.

✻ Cooked for 56s

> Microsoft Windows [Version 10.0.26200.7922]
  (c) Microsoft Corporation. All rights reserved.

  C:\Windows\System32>cd c:\Aerowinx

  c:\Aerowinx>cd "Tcasse WinWing"

  c:\Aerowinx\Tcasse WinWing>dir
  Volume in drive C is OS
  Volume Serial Number is B03C-C107

  Directory of c:\Aerowinx\Tcasse WinWing

  04/03/2026  18:19    <DIR>          .
  02/03/2026  22:51    <DIR>          ..
  26/02/2026  22:48        10,732,632 CDU01.exe
  19/02/2026  05:44            1,180 cdu_hid_map.json
  28/02/2026  15:50        9,520,981 CDU_key15.801.exe
  26/02/2026  22:48        9,493,994 CDU_led01.exe
  04/03/2026  18:19                74 configK.ini
  26/02/2026  22:52                74 configL.ini
  26/02/2026  22:52                75 configS.ini
  03/03/2026  23:03          166,912 hidapi.dll
  03/03/2026  23:03            7,542 hidapi.lib
  03/03/2026  23:03        3,690,496 hidapi.pdb
  26/02/2026  22:49            1,180 map.json
  02/03/2026  22:51    <DIR>          Old files
  02/03/2026  22:51    <DIR>          OLDFILES2
  02/03/2026  22:51    <DIR>          Oldfiles3
  01/03/2026  17:51              534 TestHid.py
  28/02/2026  15:53          528,266 Video_2026-02-28_155317.mp4
  28/02/2026  18:34        1,161,595 Video_2026-02-28_183430.mp4
  28/02/2026  18:39          387,611 Video_2026-02-28_183903.mp4
  01/03/2026  17:52          543,845 Video_2026-03-01_175218.mp4
  01/03/2026  17:55          471,907 Video_2026-03-01_175542.mp4
  01/03/2026  18:04          442,076 Video_2026-03-01_180402.mp4
  01/03/2026  20:58          310,194 Video_2026-03-01_205801.mp4
  01/03/2026  21:02          186,316 Video_2026-03-01_210208.mp4
                20 File(s)    37,647,484 bytes
                5 Dir(s)  444,745,310,208 bytes free

  c:\Aerowinx\Tcasse WinWing>CDU_key15.801.exe
  [MAP] loaded from c:\Aerowinx\Tcasse WinWing\map.json
  [CONFIG] PSX 127.0.0.1:10747
  [CONFIG] CDUK VID=0x4098 PID=0xbb38
  [MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2),
  (2, 3)]
  [MAP] loaded 71 bitpos (<17) from c:\Aerowinx\Tcasse WinWing\map.json
  [MAP] resolvable to PSX codes: 69
  Traceback (most recent call last):
    File "CDU_key15.py", line 370, in <module>
    File "CDU_key15.py", line 271, in main
  RuntimeError: CDU HID not found
  [PYI-1980:ERROR] Failed to execute script 'CDU_key15.801' due to unhandled exception!

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Traceback (most recent call last):
    File "c:\Aerowinx\Tcasse WinWing\TestHid.py", line 2, in <module>
      import hid
    File "C:\Users\chris\AppData\Roaming\Python\Python314\site-packages\hid\__init__.py", line 31, in <module>
      raise ImportError(error)
  ImportError: Unable to load any of the following libraries:libhidapi-hidraw.so libhidapi-hidraw.so.0
  libhidapi-libusb.so libhidapi-libusb.so.0 libhidapi-iohidmanager.so libhidapi-iohidmanager.so.0
  libhidapi.dylib hidapi.dll libhidapi-0.dll

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>clear
  'clear' is not recognized as an internal or external command,
  operable program or batch file.

  c:\Aerowinx\Tcasse WinWing>python TestHid.py
  Winwing devices found: 1
  0 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINCTRL 4 PFP CAPTAIN mfg Winwing path
  b'\\\\?\\HID#VID_4098&PID_BB38#7&1829b075&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'

  c:\Aerowinx\Tcasse WinWing>

● Good info. TestHid.py (using the local hidapi.dll) finds the device fine. The exe fails because it uses its own
  bundled hidapi.dll (older, compiled into the exe at build time) which can't see this device.

  The device:
  - PID: 0xbb38 ✓ (matches config)
  - Product: WINCTRL 4 PFP CAPTAIN
  - Usage page 1 / usage 4 (joystick)

  The fix requires rebuilding the exe with the newer hidapi.dll from the folder. Do you have the .py source file
  that was used to build CDU_key15.801.exe?

✻ Cogitated for 31s


Christian_Norway

#46
Dear Thierry,
Amazing enough, I asked Claudecode AI to write a py script, and now it WORKS!!! :-)

Thank you so much for all you support and for spending all this time getting the WinWing products to work on PSX!!

You are amazing, thanks!!
Kind regards
Christian

---


#!/usr/bin/env python3
import os, sys

# Allow Python to find hidapi.dll in the same folder as this script
os.add_dll_directory(os.path.dirname(os.path.abspath(__file__)))

import hid, configparser, json, socket, time, threading, queue
from collections import defaultdict

SCRIPT_DIR  = os.path.dirname(os.path.abspath(__file__))
CONFIG_FILE = os.path.join(SCRIPT_DIR, "configK.ini")
MAP_FILE    = os.path.join(SCRIPT_DIR, "map.json")

READ_SIZE        = 64
BYTE_LIMIT      = 17
QH              = "Qh401"
MIN_SEND_INTERVAL = 0.03
STABLE_FRAMES    = 2
RISING_COOLDOWN  = 0.20

NEED_RELEASE = {37, 39, 60}  # DEL, CLR, ATC

PSX_NAME_TO_CODE = {
    "LSKL1": 41, "LSKL2": 42, "LSKL3": 43, "LSKL4": 44, "LSKL5": 45, "LSKL6": 46,
    "LSKR1": 51, "LSKR2": 52, "LSKR3": 53, "LSKR4": 54, "LSKR5": 55, "LSKR6": 56,
    "A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17, "I": 18, "J": 19,
    "K": 20, "L": 21, "M": 22, "N": 23, "O": 24, "P": 25, "Q": 26, "R": 27, "S": 28, "T": 29,
    "U": 30, "V": 31, "W": 32, "X": 33, "Y": 34, "Z": 35,
    "0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9,
    "SP": 36, "DEL": 37, "/": 38, "CLR": 39,
    "+/-": 68, "+": 68, ".": 67,
    "INIT": 57, "INITREF": 57, "INIT REF": 57,
    "ROUTE": 58, "DEPARR": 59, "DEP/ARR": 59, "ATC": 60, "VNAV": 61, "FIX": 62,
    "LEGS": 63, "HOLD": 64, "FMC": 65, "PROG": 66,
    "MENU": 47, "NAVRAD": 48, "NAV/RAD": 48, "PREV": 49, "NEXT": 50,
    "EXEC": 40,
}


def load_config():
    cfg = configparser.ConfigParser()
    cfg.read(CONFIG_FILE, encoding="utf-8")
    host = cfg.get("PSX", "host", fallback="127.0.0.1").strip()
    port = cfg.getint("PSX", "port", fallback=10747)
    vid  = int(cfg.get("CDUK", "VID", fallback="0x4098"), 16)
    pid  = int(cfg.get("CDUK", "PID", fallback="0xBB38"), 16)
    print(f"[CONFIG] PSX {host}:{port}")
    print(f"[CONFIG] CDUK VID={hex(vid)} PID={hex(pid)}")
    return host, port, vid, pid


def load_map():
    with open(MAP_FILE, "r", encoding="utf-8") as f:
        raw = json.load(f)
    mapping = {}
    for k, v in raw.items():
        by, bi = map(int, k.split(","))
        if by < BYTE_LIMIT:
            mapping[(by, bi)] = str(v).strip()
    print(f"[MAP] loaded {len(mapping)} bitpos (<{BYTE_LIMIT}) from {MAP_FILE}")
    return mapping


def pressed_from_mapping(frame, mapped_bps):
    pressed = set()
    flen = min(len(frame), BYTE_LIMIT)
    for (by, bi) in mapped_bps:
        if by < flen and (frame[by] & (1 << bi)):
            pressed.add((by, bi))
    return pressed


class PsxSender:
    def __init__(self, host, port, qh_name, min_interval_s=0.03):
        self.host = host
        self.port = port
        self.qh_name = qh_name
        self.min_interval = float(min_interval_s)
        self.q = queue.Queue()
        self.stop_evt = threading.Event()
        self.sock = None
        self.sock_lock = threading.Lock()
        self.tx_thread = threading.Thread(target=self._tx_loop, daemon=True)
        self.rx_thread = threading.Thread(target=self._rx_drain, daemon=True)
        self.last_send = 0.0
        self.tx_count = 0

    def start(self):
        self.rx_thread.start()
        self.tx_thread.start()

    def stop(self):
        self.stop_evt.set()
        self.q.put(None)
        try:
            self.tx_thread.join(timeout=1.0)
            self.rx_thread.join(timeout=1.0)
        except Exception:
            pass
        self._close()

    def send_code(self, code):
        self.q.put(code)

    def _connect(self):
        with self.sock_lock:
            if self.sock:
                return
            s = socket.create_connection((self.host, self.port), timeout=3.0)
            s.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
            s.settimeout(1.0)
            self.sock = s
        print(f"[PSX] connected {self.host}:{self.port}")

    def _close(self):
        with self.sock_lock:
            try:
                if self.sock:
                    self.sock.close()
            except Exception:
                pass
            self.sock = None

    def _rx_drain(self):
        while not self.stop_evt.is_set():
            with self.sock_lock:
                s = self.sock
            if not s:
                time.sleep(0.05)
                continue
            try:
                _ = s.recv(4096)
                if not _:
                    time.sleep(0.05)
            except socket.timeout:
                continue
            except OSError:
                time.sleep(0.1)

    def _tx_loop(self):
        while not self.stop_evt.is_set():
            code = self.q.get()
            if code is None:
                break
            now = time.monotonic()
            dt = now - self.last_send
            if dt < self.min_interval:
                time.sleep(self.min_interval - dt)
            line = f"{self.qh_name}={code}\n".encode("ascii", errors="ignore")
            try:
                self._connect()
                with self.sock_lock:
                    s = self.sock
                if not s:
                    continue
                self.tx_count += 1
                print(f"[PSX] TX#{self.tx_count} -> {line!r}")
                s.sendall(line)
                self.last_send = time.monotonic()
            except Exception as e:
                print("[PSX] send error:", repr(e), "-> reconnect")
                self._close()


def main():
    psx_host, psx_port, VID, PID = load_config()
    mapping = load_map()

    LSK_BPS = {bp for bp, name in mapping.items() if name.upper().startswith("LSK")}
    print(f"[MAP] LSK bitpos: {sorted(LSK_BPS)}")

    bp_to_code = {}
    for bp, name in mapping.items():
        code = PSX_NAME_TO_CODE.get(name.upper())
        if code is not None:
            bp_to_code[bp] = code
    print(f"[MAP] resolvable to PSX codes: {len(bp_to_code)}")
    mapped_bps = set(bp_to_code.keys())

    devs = hid.enumerate(VID, PID)
    if not devs:
        raise RuntimeError(f"CDU HID not found (VID={hex(VID)} PID={hex(PID)})")
    d = devs
[o]
    print(f"[HID] Using '{d.get('product_string')}' if={d.get('interface_number')} usage_page={d.get('usage_page')} usage={d.get('usage')}")
    h = hid.device()
    h.open_path(d["path"])
    try:
        h.nonblocking = True
    except Exception:
        pass

    psx = PsxSender(psx_host, psx_port, QH, MIN_SEND_INTERVAL)
    psx.start()
    print("[RUN] rising-edge -> PSX. Ctrl+C to quit.\n")

    prev_pressed = set()
    stable_count = defaultdict(int)
    last_rise_time = {}

    try:
        while True:
            data = h.read(READ_SIZE)
            if not data:
                time.sleep(0.001)
                continue
            frame = bytes(data)
            if len(frame) < 1 or frame
[o]!= 0x01:
                continue

            cur_pressed_raw = pressed_from_mapping(frame, mapped_bps)

            cur_pressed = set()
            for bp in cur_pressed_raw:
                if bp in LSK_BPS:
                    cur_pressed.add(bp)
                    continue
                stable_count[bp] += 1
                if stable_count[bp] >= STABLE_FRAMES:
                    cur_pressed.add(bp)

            for bp in list(stable_count):
                if bp not in cur_pressed_raw:
                    stable_count.pop(bp, None)

            rising = cur_pressed - prev_pressed
            prev_pressed = cur_pressed

            now = time.monotonic()
            for bp in rising:
                if (now - last_rise_time.get(bp, 0.0)) < RISING_COOLDOWN:
                    continue
                last_rise_time[bp] = now
                code = bp_to_code.get(bp)
                if code is None:
                    continue
                print(f"[HID] {bp} {mapping.get(bp)} -> {code}")
                psx.send_code(code)
                if code in NEED_RELEASE:
                    time.sleep(0.02)
                    psx.send_code(-1)

    except KeyboardInterrupt:
        pass
    finally:
        try:
            h.close()
        except Exception:
            pass
        psx.stop()
        print("\n[END]")


if __name__ == "__main__":
    main()



-----
File for download:
https://1drv.ms/u/c/7d7f83ce4bbfb549/IQDaE2dS5U-UTrmc-crEjiFpAcujg3Hv9CldrYvFdGN2ngc?e=v0Zra8

Screenshot CD_KEY: :-)




TCASSE

Quote from: Christian_Norway on Wed,  4 Mar 2026 21:56Dear Thierry,
Amazing enough, I asked Claudecode AI to write a py script, and now it WORKS!!! :-)

Thank you so much for all you support and for spending all this time getting the WinWing products to work on PSX!!

You are amazing, thanks!!
Kind regards
Christian

---





Hi Christian, please test the CDU_key15.806.exe. If OK, delete your script. Thanks.

Christian_Norway

Quote from: TCASSE on Thu,  5 Mar 2026 10:09Hi Christian, please test the CDU_key15.806.exe. If OK, delete your script. Thanks.

Dear Thierry,
Thanks, ran CDU_key15.806.exe and got the following message.
Kind regards,
Christian


Symphysodon

Quote from: PanosI on Sat, 21 Feb 2026 21:05from the error I think that you don't have this file

cdu_hid_map.json

in the folder with all the files

Hello,
I having the same error.
Where is the link for: cdu_hid_map.jason
THX.

TCASSE

#50
Quote from: Symphysodon on Sun, 15 Mar 2026 11:37Hello,
I having the same error.
Where is the link for: cdu_hid_map.jason
THX.
Give me exactly the error message (and a printscreen is't better). Thank you

Ok I put the file, see page 1

roccod

Quote from: Symphysodon on Sun, 15 Mar 2026 11:37Hello,
I having the same error.
Where is the link for: cdu_hid_map.jason
THX.

I can't find this file either.  Is it supposed to be in the directory?

TCASSE

Quote from: roccod on Thu, 19 Mar 2026 16:39I can't find this file either.  Is it supposed to be in the directory?
Ok I put the file, see page 1

Symphysodon

Quote from: TCASSE on Sun, 15 Mar 2026 12:43Give me exactly the error message (and a printscreen is't better). Thank you

Ok I put the file, see page 1
Hello !
C:\Winwing>py testhid.py
Winwing devices found: 4
0 vid 0x4098 pid 0xbf0f if 0 up 1 u 4 prod WINWING PAP-3 mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BF0F#8&5e88051&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
1 vid 0x4098 pid 0xbb51 if 0 up 1 u 4 prod WINWING 3M PDC L mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB51#8&15bd514&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
2 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINWING PFP-4-CAPTAIN mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB38#8&3002801e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
3 vid 0x4098 pid 0xbb52 if 0 up 1 u 4 prod WINWING 3M PDC R mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB52#8&292c7041&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'



C:\Winwing>cdu_key15.806
[MAP] loaded from C:\Winwing\map.json
[CONFIG] PSX 127.0.0.1:10747
[CONFIG] CDUK VID=0x4098 PID=0xbb38
[MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2), (2, 3)]
[MAP] loaded 71 bitpos (<17) from C:\Winwing\map.json
[MAP] resolvable to PSX codes: 69
[BRT] PAP3 opened for backlight
[EFIS] enumerate found 1
  0 path= b'\\\\?\\HID#VID_4098&PID_BB51#8&15bd514&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}' if= 0 usage_page= 1 usage= 4 product= WINWING 3M PDC L
[BRT] EFIS opened for backlight
Traceback (most recent call last):
  File "CDU_key15.py", line 641, in <module>
  File "CDU_key15.py", line 493, in main
RuntimeError: CDU HID not found
[PYI-4944:ERROR] Failed to execute script 'CDU_key15.806' due to unhandled exception!

TCASSE

Quote from: Symphysodon on Sat, 21 Mar 2026 16:46Hello !
C:\Winwing>py testhid.py
Winwing devices found: 4
0 vid 0x4098 pid 0xbf0f if 0 up 1 u 4 prod WINWING PAP-3 mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BF0F#8&5e88051&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
1 vid 0x4098 pid 0xbb51 if 0 up 1 u 4 prod WINWING 3M PDC L mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB51#8&15bd514&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
2 vid 0x4098 pid 0xbb38 if 0 up 1 u 4 prod WINWING PFP-4-CAPTAIN mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB38#8&3002801e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'
3 vid 0x4098 pid 0xbb52 if 0 up 1 u 4 prod WINWING 3M PDC R mfg Winwing path b'\\\\?\\HID#VID_4098&PID_BB52#8&292c7041&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}'



C:\Winwing>cdu_key15.806
[MAP] loaded from C:\Winwing\map.json
[CONFIG] PSX 127.0.0.1:10747
[CONFIG] CDUK VID=0x4098 PID=0xbb38
[MAP] LSK bitpos: [(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 0), (2, 1), (2, 2), (2, 3)]
[MAP] loaded 71 bitpos (<17) from C:\Winwing\map.json
[MAP] resolvable to PSX codes: 69
[BRT] PAP3 opened for backlight
[EFIS] enumerate found 1
  0 path= b'\\\\?\\HID#VID_4098&PID_BB51#8&15bd514&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}' if= 0 usage_page= 1 usage= 4 product= WINWING 3M PDC L
[BRT] EFIS opened for backlight
Traceback (most recent call last):
  File "CDU_key15.py", line 641, in <module>
  File "CDU_key15.py", line 493, in main
RuntimeError: CDU HID not found
[PYI-4944:ERROR] Failed to execute script 'CDU_key15.806' due to unhandled exception!

try this https://1drv.ms/u/c/9078b8581e0fcab6/IQCd_kghom3uTIE7-ruOPkWeAZ4ANMkij41rUpi0Rh80J1A?e=Ig25Z7


Jamie

Quote from: TCASSE on Wed, 18 Feb 2026 10:58Hi All,
 A plugin fully compatible to use CDU PAP7 with PSX (stand alone)
Great work! Some confusion: PAP7 -> you mean PFP7?

I have Mobiflight 10.5.3.20 installed and see > MOBIFLIGHT < on my PFP7 display. Found out the PID=0xBB3F, but doesn't seem to work. The CDU.exe displays "Connected", PSX is running. Any suggestions?
Jamie
No Kangaroos In Austria!

Jamie

#57
Quote from: TCASSE on Mon, 30 Mar 2026 16:13try this https://1drv.ms/u/c/9078b8581e0fcab6/IQCd_kghom3uTIE7-ruOPkWeAZ4ANMkij41rUpi0Rh80J1A?e=Ig25Z7

OK got it partly working:
important is what you have your device setup (via SimAppPro from Winwing) as Captain side, my FMC was in COpilot mode. It gave a PID = 0xBB3F, but that did not work when changed in the INI files.

Question:
Maybe you can update your first page? Because filenames are wrong and that makes it quite confusing.

Remark:
- LED bridge not working > [CONFIG] CDUL VID=0x4098 PID=0x4098
Maybe related to a hardcoded PID/VID, doesn't read the [CDU] config tag. Changed it to [CDUL}, but then fills default values not corresponding my PID or VID. I can only change the PID, but that changes the VID as well.

- Colors and some characters do not work.

- no need to start SimAppPro (the WinWing app)
- Latest MobiFlight 11.x.x works as well


I see you opened a new topic: https://aerowinx.com/board/index.php/topic,7951.0.html

That would have helped a lot today :-D

VERY cool that this works so far! Thank you so much for your work!
Jamie
No Kangaroos In Austria!