News:

Precision Simulator update 10.189 (5 August 2026) is now available.
Navburo update 13 (23 November 2022) is now available.
NG FMC and More is released.

Main Menu

Plugin for WinWing Devices (CDU PFP4/7/MCP/EFIS/EICAS) & FO

Started by TCASSE, Tue, 31 Mar 2026 08:00

TCASSE

Quote from: Symphysodon on Thu, 16 Apr 2026 17:39Hello !

My right EFIS is different PID

C:\CDU_GLOBAL_VS>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 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}'
2 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}'
3 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}'

The PAP-3 window:

C:\CDU_GLOBAL_VS>cdu_gllobal_vs_delay
'cdu_gllobal_vs_delay' is not recognized as an internal or external command,
operable program or batch file.

C:\CDU_GLOBAL_VS>cdu_global_vs_delay
[CONFIG] CDU=1 EFIS_CAP=1 EFIS_FO=1 PAP=1 ECAM=0
[CONFIG FILE] trying to load: configK.ini
[CONFIG OPEN] OK
[INI PARSE] section='PSX' key='host' val='127.0.0.1'
[INI PARSE] section='PSX' key='port' val='10747'
[INI PARSE] section='CDU' key='VID' val='0x4098'
[INI PARSE] section='CDU' key='PID' val='0xbb38'
[CONFIG] PSX 127.0.0.1:10747
[CONFIG] CDU VID=0x4098 PID=0xbb38
[CONFIG READ] CDU VID=0x4098 PID=0xbb38
[MAP] loaded 71 entries
[HID DETECT] VID=0x4098 PID=0xbf0f IF=0 usage_page=1 usage=4
[HID DETECT] VID=0x4098 PID=0xbb52 IF=0 usage_page=1 usage=4
[HID DETECT] VID=0x4098 PID=0xbb51 IF=0 usage_page=1 usage=4
[HID DETECT] VID=0x4098 PID=0xbb38 IF=0 usage_page=1 usage=4
[MODULE] CDU      1
[MODULE] EFIS CAP 1
[MODULE] EFIS FO  0
[MODULE] PAP      1
[MODULE] ECAM     0
[CDU] HID opened
[PSX] CONNECT TRY -> 127.0.0.1 10747
[PSX] connected 127.0.0.1:10747
[EFIS] opened [PAP3] opened [PAP_IN] start()
[PAP_IN] run() entered
[PAP DISPLAY] initialized
[PSX] TX#1 -> Qh13=1
[PAP BIT] idx=27 pressed=1
[PAP BTN] 27 -> Qh56=1
[PAP_BIT] idx=27 pressed=1
[PAP BIT] idx=29 pressed=1
[PAP BTN] 29 -> Qh57=1
[PAP_BIT] idx=29 pressed=1
[PAP BIT] idx=31 pressed=1
[PAP BTN] 31 -> Qh55=1
[PAP_BIT] idx=31 pressed=1
[PAP BIT] idx=33 pressed=1
[PAP BTN] 33 -> Qh76=0
[PAP_BIT] idx=33 pressed=1
[PAP BIT] idx=41 pressed=1
g_pap_disp.vs] 0
[DISPLAY] connected ws://localhost:8320/winwing/cdu-captain
[BRT] value = 180
[RUN] CDU global C++: KEY + LED + DISPLAY(stub). MobiFlight required only for display. Ctrl+C to quit.
[Qi86] 8                        [Qh68] 0
[Qh69] 0
[Qh70] 0
[Qh114] 0
[PSX] TX#2 -> Qh14=1
[ECAM] Qh114=0 -> LED1=OFF LED2=OFF
[ECAM QH114 RX] value=0
[PSX] TX#3 -> Qh29=1
[PSX] TX#4 -> Qh31=1
[PSX] TX#5 -> Qh32=2
[PSX] TX#6 -> Qh56=1
[PSX] TX#7 -> Qh57=1
[PSX] TX#8 -> Qh55=1
[PSX] TX#9 -> Qh76=0
[PAP BIT] idx=20 pressed=1
[PAP BTN] 20 -> Qh77=1
[PAP_BIT] idx=20 pressed=1
[PSX] TX#10 -> Qh77=1
[PAP BIT] idx=20 pressed=1
[PAP BTN] 20 -> Qh77=1
[PAP_BIT] idx=20 pressed=1
[PSX] TX#11 -> Qh77=1

With the same delay.

I have PFP-4 works but the LEDs

THX.

Hi, My script wait for  0xbb51 and  0xbb61 and you have  0xbb52 that's why the module is not found. i made an exe for you to read your right Efis.-> https://1drv.ms/u/c/9078b8581e0fcab6/IQBr5ZfXVtFwRJAhOkprW4imAfGuyVwX0bbu0EZ7nrX_2zU?e=P3k1lz
About the leds, all leds do not work or only the exec led?

Please run the attached script **test_led_pfp4.py** to help identify the correct LED configuration for your device.
Steps:
1. Make sure the device is connected (PFP-4 / PID 0xBB38).
2. Run the script:      py test_led_pfp4.py
3. The script will try different IDENT values.

For each IDENT:

* Look at your device.
* Do any LEDs or backlights turn on?

If you see any reaction:

* Type **y** and press Enter.
* The script will then scan LED IDs (0–39).

During the scan:

* Watch which LED turns on.
* Note which `led_id` corresponds to which light (DSPY, EXEC, MSG, backlight, etc.).

At the end, please send me:

* The IDENT value that worked
* A short list of LED IDs and what they control
* Or a photo/video if easier

If nothing happens at all for any IDENT, please tell me.

Thank you!

py test_led_pfp4.py -> https://1drv.ms/u/c/9078b8581e0fcab6/IQCvLo6MQSebSIxuFMjPQ2AYAdIz-Rf73vt4ivBao8W9L0E?e=MiXydY

Symphysodon

Quote from: TCASSE on Fri, 17 Apr 2026 05:53Hi, My script wait for  0xbb51 and  0xbb61 and you have  0xbb52 that's why the module is not found. i made an exe for you to read your right Efis.-> https://1drv.ms/u/c/9078b8581e0fcab6/IQBr5ZfXVtFwRJAhOkprW4imAfGuyVwX0bbu0EZ7nrX_2zU?e=P3k1lz
About the leds, all leds do not work or only the exec led?

Please run the attached script **test_led_pfp4.py** to help identify the correct LED configuration for your device.
Steps:
1. Make sure the device is connected (PFP-4 / PID 0xBB38).
2. Run the script:      py test_led_pfp4.py
3. The script will try different IDENT values.

For each IDENT:

* Look at your device.
* Do any LEDs or backlights turn on?

If you see any reaction:

* Type **y** and press Enter.
* The script will then scan LED IDs (0–39).

During the scan:

* Watch which LED turns on.
* Note which `led_id` corresponds to which light (DSPY, EXEC, MSG, backlight, etc.).

At the end, please send me:

* The IDENT value that worked
* A short list of LED IDs and what they control
* Or a photo/video if easier

If nothing happens at all for any IDENT, please tell me.

Thank you!

py test_led_pfp4.py -> https://1drv.ms/u/c/9078b8581e0fcab6/IQCvLo6MQSebSIxuFMjPQ2AYAdIz-Rf73vt4ivBao8W9L0E?e=MiXydY

Hello !
My EFIS_FO now is sending incorrect signal and some are missing.

And the LED test shows:
C:\CDU_GLOBAL_VS>py test_led_pfp4.py
Devices found:
0 {'path': b'\\\\?\\HID#VID_4098&PID_BB38#8&3002801e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}', 'vendor_id': 16536, 'product_id': 47928, 'serial_number': '8565F721E66060A2A376C023', 'release_number': 259, 'manufacturer_string': 'Winwing', 'product_string': 'WINWING PFP-4-CAPTAIN', 'usage_page': 1, 'usage': 4, 'interface_number': 0, 'bus_type': 1}
Traceback (most recent call last):
  File "C:\CDU_GLOBAL_VS\test_led_pfp4.py", line 127, in <module>
    main()
    ~~~~^^
  File "C:\CDU_GLOBAL_VS\test_led_pfp4.py", line 81, in main
    dev = hid.Device(path=devs[0]["path"])
          ^^^^^^^^^^
AttributeError: module 'hid' has no attribute 'Device'. Did you mean: 'device'?

The delay isn't present in PFP4.
Efis_Cap Efis_FO and PAP3 with delay.

THX

TCASSE

Quote from: Symphysodon on Fri, 17 Apr 2026 17:12Hello !
My EFIS_FO now is sending incorrect signal and some are missing.

And the LED test shows:
C:\CDU_GLOBAL_VS>py test_led_pfp4.py
Devices found:
0 {'path': b'\\\\?\\HID#VID_4098&PID_BB38#8&3002801e&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}', 'vendor_id': 16536, 'product_id': 47928, 'serial_number': '8565F721E66060A2A376C023', 'release_number': 259, 'manufacturer_string': 'Winwing', 'product_string': 'WINWING PFP-4-CAPTAIN', 'usage_page': 1, 'usage': 4, 'interface_number': 0, 'bus_type': 1}
Traceback (most recent call last):
  File "C:\CDU_GLOBAL_VS\test_led_pfp4.py", line 127, in <module>
    main()
    ~~~~^^
  File "C:\CDU_GLOBAL_VS\test_led_pfp4.py", line 81, in main
    dev = hid.Device(path=devs[0]["path"])
          ^^^^^^^^^^
AttributeError: module 'hid' has no attribute 'Device'. Did you mean: 'device'?

The delay isn't present in PFP4.
Efis_Cap Efis_FO and PAP3 with delay.

THX
Please replace this line in the script:

dev = hid.Device(path=devs[0]["path"])

with:

dev = hid.device()
dev.open_path(devs[0]["path"])

Then run the script again.

Let me know if any LEDs or backlight turn on when testing IDENT values.

Jamie

Quote from: TCASSE on Thu, 16 Apr 2026 11:52Hi Jamie, "ATC" is just a label. I'm not sure that if I replace by ALTN, it could switch to this. "2,7" is the  "key" on the hardware and this is what is used  to send via  Qh401 to PSX (and thank for the information for the font. I think this is the way to modify)
Hi TCASSE, the ALTN part was just a suggestion, but I understand there are higher priority things :-) Great work! These WINCtrl stuff is crazy cheap and quality is pretty good. I do hope you can implement this MobiFlight font stuff, especially the Magenta/green colors from the NG FMC.
Jamie

roccod

Quote from: Jamie on Sat, 11 Apr 2026 18:50O wow can I use them and post a 'modified' version here? Again I'm not sure how the WinCTRL PFPx FMCs handle the fonts, I can upload one and use it. That's how far my knowledge goes.

Edit: Look at this! Boxes, degrees and arrows!



Edit2: I see the add-on, in this case MobiFlight, uploads the font to the unit upon startup, like the PMDG 777/737 does every time you start it.
Location is here: MobiFlight\Scripts\Winwing\Fonts\Default\PFP
Mobiflight fonts are in .DAT. I have no idea what file-format this is, I will ask if they could implement some sort of *.ttf compatibility. That would save some time to overwrite it every time.

Edit3: I guess it's up to TCASSE to translate these special characters. In the MobiFlight\Scripts\Winwing\ directory there are lot's of scripts with examples. \u2610 = box, \u2192 = right arrow, etc.

Sorry for being a bit dense on this topic, but are we able to use the font identified by Jeroen and how do we accomplish that?

TCASSE

Quote from: roccod on Mon, 20 Apr 2026 17:55Sorry for being a bit dense on this topic, but are we able to use the font identified by Jeroen and how do we accomplish that?
Change some ascii character (not perfect but better than the previous model) b, l, r, o replaced by #,<,>,%. The % symbol is prettier than o, please see page 1

Eloy Perez

Quote from: TCASSE on Tue, 14 Apr 2026 15:24Hi, do you have a delay with the Efis or PAP? The error message is because the display is not connected. no relation with any delay of the PAP/EFIS.
please test this for the delay -> https://1drv.ms/u/c/9078b8581e0fcab6/IQDQ-EXR95SFTaGp5yCX-4tiAUr3JmptiJ8I0ysvJHrE8wI?e=DemNYE                            for the pb of the EFIS, do you have one or two EFIS? and could you copy the message of the plugin you have in a cmd windows? That could tell me why one efis does not run
I need the text from the black console window.

After you start the program:

test EFIS CAP and EFIS FO
go to the black window
select all text
press Enter to copy
paste it here

A screenshot is also OK if copying the text is difficult.
Hello

I have the MCP and the EFIS 3N PDC-L or R, depending on how I configure it in SIMAPP.
Set in SimAPP as EFIS 3N PDC-L, the PID is 0XBB61 (it didn't work)
Set in SimAPP as EFIS 3N PDC-R, the PID is 0XBB62 (it only worked as FO with previous exe).
NOW with the version without CDU or the version without delay, the EFIS does not work with the following configurations (delay is reduced but there is still):

CDU=0
EFIS_CAP=1 (or 0 and FO=1)
EFIS_FO=0
PAP=1
ECAM=0

[PSX]
host = 127.0.0.1
port = 10747
[PAP3]
VID = 0x4098
PID = 0xBF0F
[3N PDC L]
VID = 0x4098
PID = 0xBB62

C:\CDU_GLOBAL_VS>cdu_global_vs_delay
[CONFIG] CDU=0 EFIS_CAP=1 EFIS_FO=0 PAP=1 ECAM=0
[CONFIG FILE] trying to load: configK.ini
[CONFIG OPEN] OK
[INI PARSE] section='PSX' key='host' val='127.0.0.1'
[INI PARSE] section='PSX' key='port' val='10747'
[INI PARSE] section='PAP3' key='VID' val='0x4098'
[INI PARSE] section='PAP3' key='PID' val='0xBF0F'
[INI PARSE] section='3N PDC L' key='VID' val='0x4098'
[INI PARSE] section='3N PDC L' key='PID' val='0xBB62'
[CONFIG] PSX 127.0.0.1:10747
[CONFIG] CDU VID=0x4098 PID=0xbb38
[CONFIG READ] CDU VID=0x4098 PID=0xbb38
[MAP] loaded 71 entries
[HID DETECT] VID=0x4098 PID=0xbb62 IF=0 usage_page=1 usage=4
[HID DETECT] VID=0x4098 PID=0xbf0f IF=0 usage_page=1 usage=4
[MODULE] CDU      0
[MODULE] EFIS CAP 0
[MODULE] EFIS FO  0
[MODULE] PAP      1
[MODULE] ECAM     0
[PSX] CONNECT TRY -> 127.0.0.1 10747
[PSX] connected 127.0.0.1:10747
g_pap-disp.vs] 59
[Qi86] 8       [PAP3] opened [PAP_IN] start()
[PAP_IN] run() entered
[PAP DISPLAY] initialized
[RUN] CDU global C++: KEY + LED + DISPLAY(stub). MobiFlight required only for display. Ctrl+C to quit.
[PAP BIT] idx=27 pressed=1
[PAP BTN] 27 -> Qh56=1
[PAP_BIT] idx=27 pressed=1
[PAP BIT] idx=29 pressed=1
[PAP BTN] 29 -> Qh57=1
[PAP_BIT] idx=29 pressed=1
[PAP BIT] idx=31 pressed=1
[PAP BTN] 31 -> Qh55=1
[PAP_BIT] idx=31 pressed=1
[PAP BIT] idx=37 pressed=1
[PAP BTN] 37 -> Qh76=4
[PAP_BIT] idx=37 pressed=1
[PAP BIT] idx=41 pressed=1
[PSX] TX#1 -> Qh56=1
[Qh68] 0
[Qh69] 0
[Qh70] 0
[Qh114] 0
[ECAM] Qh114=0 -> LED1=OFF LED2=OFF
[ECAM QH114 RX] value=0
[PSX] TX#2 -> Qh57=1
[PSX] TX#3 -> Qh55=1
[PSX] TX#4 -> Qh76=4
[DISPLAY] WinHttpSendRequest failed
[PAP BIT] idx=24 pressed=1
[PAP BTN] 24 -> Qh80=1
[PAP BIT] idx=24 pressed=1
[PSX] TX#5 -> Qh80=1
[PAP BIT] idx=24 pressed=1
[PAP BTN] 24 -> Qh80=1
[PAP BIT] idx=24 pressed=1
[PSX] TX#6 -> Qh80=1

With the previous .exe file using CDU, the delay was in the MCP and EFIS
When I configured the EFIS for L in SimApp, the PID changed to 0xBB61; naturally, it didn't work as CAP, it only detected the FO side and only worked for the FO side with PID 0xBB62.

Muchas Gracias
Eloy


Jamie

Quote from: TCASSE on Tue, 19 May 2026 07:14please find the FO's CDU for PFP4 -> https://1drv.ms/u/c/9078b8581e0fcab6/IQCokB5HsnrkSqs4YdTAWPCRAQbgKKd3hbQF1w-4yWfONR0?e=BERX8g
Hi TCASSE, thanks for the fantastic add-on!

I have a small question/suggestion:
- can you add a "clientName=PSX CDU" to send to PSX? Then it shows "PSX CDU" in PSX -> Network -> Main
- mobiflight/WinCTRL supports unicode, '\u2610' = ☐ and '\u00b0'= ° like in 360°, maybe you can add/change that in future. Instead of using # and %.
- maybe an option to use green characters? Instead of sending "w", for white, a "g" for green to simulate the old green CDU? No idea how "green" this would look :)

Thanks again! Great stuff!
Jamie

TCASSE

Hi Jamie,
I'm not sure to understand. When the script is connected to psx, I only can see "Client1 accepted"

Jamie

Quote from: TCASSE on Tue, 26 May 2026 14:44Hi Jamie,
I'm not sure to understand. When the script is connected to psx, I only can see "Client1 accepted"


It's a new feature in PSX: you can tag or name the connection, like here. I made an app myself to connect PSX to Volanta. In this image "Client3" is you program.
Jamie


Jamie

Quote from: TCASSE on Tue, 26 May 2026 15:23Ok, How to do that? What Q to use?
"clientName=PSX CDU", after you have connected. In Python something like this:
psx.sendall("clientName=PSX CDU\n")

It's not a specific Q code.
Jamie



TCASSE

no, this is the last version if  you want to use the cdu cap or fo only.
If you want to use cdu cap, mcp and efis, use New Version of plugin for WinWing Devices (CDU PFP4/PFP7/MCP/EFIS/EICAS)

Jamie

Quote from: TCASSE on Tue, 26 May 2026 20:18no, this is the last version if  you want to use the cdu cap or fo only.
If you want to use cdu cap, mcp and efis, use New Version of plugin for WinWing Devices (CDU PFP4/PFP7/MCP/EFIS/EICAS)
So I made my own PSX CDU to test some things. I found that this works very well for replacing the bbbb to the boxes, correct degrees character and the left and right arrow:
def normalize_psx_display_line(line):
    line = line.replace("o", "\u00b0")
    line = line.replace("b", "\u2610")
    line = line.replace("l", "\u2190")
    line = line.replace("r", "\u2192")
    return line
Jamie

Jamie

Quote from: TCASSE on Tue, 26 May 2026 20:18no, this is the last version if  you want to use the cdu cap or fo only.
If you want to use cdu cap, mcp and efis, use New Version of plugin for WinWing Devices (CDU PFP4/PFP7/MCP/EFIS/EICAS)
Would you be willing to help me control the PFP7 CDU annunciator LEDs? I can't get them working. If you would be willing to share some Python code, I would be very thankful.

I'll post and share the code once it's finished. I already have all CDU screens working, including large/small fonts and the box/degree characters. Optionally old-skool green CDU is available as well.

Edit: Got it working, more or less, via the Mobiflight DLL: tried a load of bits and found the led's IDs.
Jamie

TCASSE

# LED IDs (FMCLed enum PFP)
LED_BACKLIGHT = 0
LED_SCREEN_BACKLIGHT = 1
LED_OVERALL = 2
LED_DSPY = 3 
LED_FAIL = 4
LED_MSG  = 5
LED_OFST = 6
LED_EXEC = 7
# ===================== Qi86 mapping  =====================
QI86_MASK_EXEC = 0x01
QI86_MASK_DSPY = 0x02
QI86_MASK_FAIL = 0x04
QI86_MASK_MSG  = 0x08
QI86_MASK_OFST = 0x10

def set_led(self, led_id: int, brightness: int, force: bool = False):
        brightness = max(0, min(255, int(brightness)))
        if not force and self._cache.get(led_id) == brightness:
            return
        pkt = bytes([ 0x02, IDENT, 0xBB, 0x00, 0x00, 0x03, 0x49, led_id, brightness, 0, 0, 0, 0, 0  ] + [0] * (64 - 14))
        self._write64(pkt)
        self._cache[led_id] = brightness

Jamie

Thanks TCASSE! I hacked my way around in MobiFlight and got it working, couldn't resist, but this looks shorter and more clean. Thanks again!

Jamie