feat(gamepad): dualsense-windows-test grows --edge (drives device_type 2, cycles R4/L4)

Used for the .173 on-glass verify: the Edge devnode enumerates
(SWD\PUNKTFUNK\PF_EDGE_1, driver pf_dualsenseedge attaches, proto 2),
and Steam's live controller.txt confirms the identity end to end —
'type: 054c 0df2', 'Product: DualSense Edge Wireless Controller',
'Controller using HIDAPI driver, vid=0x054c, pid=0x0df2' — with probe
lightbar/player-LED feedback flowing back on the 0xCD plane.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 11:50:06 +02:00
parent 8d8168b0e0
commit ea2e3578e2
+15 -1
View File
@@ -427,6 +427,15 @@ fn real_main() -> Result<()> {
.unwrap_or(0); .unwrap_or(0);
let ds4 = args.iter().any(|a| a == "--ds4"); let ds4 = args.iter().any(|a| a == "--ds4");
let xbox = args.iter().any(|a| a == "--xbox"); let xbox = args.iter().any(|a| a == "--xbox");
// `--edge` drives the DualSense Edge backend (device_type 2) and additionally holds
// the R4/L4 paddles on the pressed beats, so a HID read shows the Edge bits in
// report byte 10 (0x80|0x40) next to Cross.
let edge = args.iter().any(|a| a == "--edge");
let extra_buttons: u32 = if edge {
punktfunk_core::input::gamepad::BTN_PADDLE1 | punktfunk_core::input::gamepad::BTN_PADDLE2
} else {
0
};
// Same drive loop for either backend (identical method surface): Arrival creates the pad, // Same drive loop for either backend (identical method surface): Arrival creates the pad,
// State pushes a cycling report, pump surfaces a game's rumble/lightbar feedback. // State pushes a cycling report, pump surfaces a game's rumble/lightbar feedback.
macro_rules! drive { macro_rules! drive {
@@ -455,7 +464,7 @@ fn real_main() -> Result<()> {
last = Instant::now(); last = Instant::now();
i += 1; i += 1;
let buttons = if i % 2 == 0 { let buttons = if i % 2 == 0 {
punktfunk_core::input::gamepad::BTN_A // Cross punktfunk_core::input::gamepad::BTN_A | extra_buttons // Cross (+ Edge paddles)
} else { } else {
0 0
}; };
@@ -520,6 +529,11 @@ fn real_main() -> Result<()> {
inject::dualshock4_windows::DualShock4WindowsManager::new(), inject::dualshock4_windows::DualShock4WindowsManager::new(),
"DualShock 4" "DualShock 4"
); );
} else if edge {
drive!(
inject::dualsense_edge_windows::DualSenseEdgeWindowsManager::new(),
"DualSense Edge"
);
} else { } else {
drive!( drive!(
inject::dualsense_windows::DualSenseWindowsManager::new(), inject::dualsense_windows::DualSenseWindowsManager::new(),