Skip to content

History / Virtual Controllers

Revisions

  • Semicolon → period across dev pages The "X; Y" pattern where the two clauses are separately complete reads as the AI-tell pseudo-period semicolon called out in the project's writing style notes. Replace with a period (or comma where the relation is conjunctive) across: - Architecture-Overview (PtpDeviceState description, added in this sweep) - Controller-Slots (Impulse Triggers parenthetical) - Engine-Library (three slot-assignment / template-preprocess paragraphs added in this sweep) - Home (Driver-Installation-Internals table row) - Services-Layer (move-slot-to-group-tail flow) - Settings-and-Serialization (v2 Preset enum migration note) - Troubleshooting (UAC accept step) - Virtual-Controllers (Gamepad struct dispatch note) No semantic changes.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Wiki: scrub pseudo-colon em-dashes across user + dev pages

    @hifihedgehog hifihedgehog committed May 26, 2026
  • Virtual-Controllers: align See-also blurb with no-HIDMaestro-uninstall Same fix as commit fd7e151 — link text claimed 'HIDMaestro... driver install / uninstall' which is misleading since HIDMaestro has no uninstall path in PadForge or in HM's design itself.

    @hifihedgehog hifihedgehog committed May 26, 2026
  • SDL3 rumble fn is SDL_RumbleJoystick, not SDL_RumbleGamepad (fix 5 wiki sites + release notes draft)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HM filter surfaces: Step 1 has no HM filter; the four real surfaces are SDL3 fork, OpenXInput fork, XboxImpulseHidWriter, HidHideController

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Virtual-Controllers diagram: HMController exposes SubmitState (not SubmitGamepadState — that's the PadForge IVirtualController method)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • HM SDK event is OutputReceived, not FeedbackReceived (Virtual-Controllers, Input-Pipeline)

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Polish: Xbox writer HID-not-XUSB, fold ScpVBus comparison to ViGEm+vJoy, list v3.2 effect-writer files in tree, fix Adaptive-Triggers sentence

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Polish: more pseudo-period semicolons fixed; correct stale v2-dev branch refs in Build-and-Publish

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Wiki: per-pad-family rumble routing replaces 'SDL_RumbleJoystick' claim Two prose passages still described rumble as a single SDL_RumbleJoystick forward, dropping the v3.x sole-writer architecture for Sony and Xbox One+ pads. Virtual-Controllers (HM FeedbackReceived threading note): now lists the three writers (UserEffectsDispatcher for Sony, XboxImpulseHidWriter for Xbox One+, SDL for everything else) and calls out that SDL is explicitly skipped on Sony and Xbox One+ per the architecture-invariant memory rules. Input-Pipeline (Step 2 ForceFeedbackState.SetDeviceForces): rewrote from 'uses SDL_RumbleJoystick' to early-routes-by-VID/PID, matching the actual dispatch in code.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Virtual-Controllers: refresh stale HMaestroVirtualController.cs line citations File-line citations were all v3.0-era and had drifted by 100-400+ lines as the class grew. Updated all 11 citations to current file positions: Connect :44 -> :150 Disconnect :65 -> :181 SubmitRawReport:86 -> :269 (two occurrences) SubmitGamepadState:92 -> :275 (two occurrences) SubmitExtendedRawState:145 -> :457 (two occurrences) RegisterFeedbackCallback:233 -> :567 MapButtons :325-340 -> :748 MapHat :342-358 -> :803 Also noted the v3.2 second SubmitGamepadState overload at :359 that carries touchpad/motion/battery payload for PlayStation slots. InputManager.Step5.VirtualDevices.cs cites likewise refreshed: _hmaestroContext :1019 -> :100 CreateHMaestroController :1358 -> :1430 HMProfileBuilder.FromProfile :1301 -> :1500

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Wiki dev pages: more prose semicolons -> periods Virtual-Controllers.md and Services-Layer.md had several 'X; Y' constructions where Y was glossing X. Periods read cleaner and match the project style rule. Semicolons retained inside code blocks and inside short table-cell phrases where they act as series separators.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Pass 73: fix broken gollum-pipe-in-table-cell links (Devices/Dashboard/Virtual-Controllers) — table column pipe collided with link-target pipe, rendering as literal '[[Slot' text on the published wiki. Replaced with regular markdown links.

    @hifihedgehog hifihedgehog committed May 21, 2026
  • Pass 9: Virtual-Controllers HMaestroFfbDecoder dispatch list — break the run-on semicolon clause into a bulleted list

    @hifihedgehog hifihedgehog committed May 20, 2026
  • Wiki: Pass 2 — dev-deep-dive accuracy + Home page voice match Architecture-Overview: AssemblyInfo.cs → SharedVersion.cs; expanded Data/ file list to include MappingSet/MappingSource/MappingRow/ ShiftActivator/MappingSetMigrator/DeviceTuning. Input-Pipeline: drop preserveExtendedNodes parameter; rebuild field table to match current InputService. Virtual-Controllers: VendorId==0xBEEF check replaced with DescriptorHasPidFfbBlock(descriptorHex) gate in three locations. HIDMaestro-Deep-Dive: Microsoft.HIDMaestro.SDK → HIDMaestro.Core (bundled at Resources/HIDMaestro/HIDMaestro.Core.dll); fix context.CreateController(profile) call shape. Services-Layer: drop preserveExtendedNodes from Stop(); remove the "step 9" preserve-nodes branch. Engine-Library: add TOUCHPAD = 0x0800 button flag row. SDL3-Integration: SDL3 fork now filters HM virtuals at SDL_GetJoysticks, so the engine no longer maintains _filteredVigemInstanceIds. Updated Mermaid flowchart and renumbered the connect-side step list. Home: "New in 3.2" rewritten from bullet lists to story paragraphs to match the website voice. Added Gyro / Impulse Triggers / Shift Layers to the navigation tables.

    @hifihedgehog hifihedgehog committed May 20, 2026
  • Pass 1/25: wiki link audit + empty-header table cleanup + 2026 Steam Controller mention - All 29 reversed [[Display|Target]] gollum links fixed - 1 broken anchor on Virtual-Controllers link to HIDMaestro Deep Dive resolved against actual heading slug - Lighting.md image path corrected (lighting.png -> pad-lighting.png) - 10 empty-header 2-col "| | |" label tables rewritten as prose paragraphs across Controller-Slots, Installation, Devices, Dashboard, Settings, Web-Controller - Home.md "New in 3.2" now lists 2026 Steam Controller support via the bundled SDL3 fork

    @hifihedgehog hifihedgehog committed May 20, 2026
  • Lighting tab reset buttons + v3 terminology sweep Refreshes pad-lighting screenshot to capture the four new reset buttons (Lightbar Mode, LED Brightness, Player Pattern, Mute LED Mode) plus the rest of the slot-0 PadPage tabs and slot-type config bars against the post-deploy build. Wiki prose: drops residual v2 phrasing (ExtendedConfig.IsGamepadPreset, DualShock4 / Xbox 360 enum names, "Microsoft" / "Sony") and routes through the v3 OutputType / VirtualControllerType vocabulary instead.

    @hifihedgehog hifihedgehog committed May 4, 2026
  • Wiki refresh: VC reorder model (visual-position kernel-slot anchor) Reorder behavior just changed: same-profile reorders are pointer-only (no kernel teardown, no game disconnection); different-profile reorders destroy and recreate only the specific positions whose profile changed; matching positions in the same reorder still pointer-swap. Wiki refreshed to reflect this. User-facing: - Controller-Slots: rewrote "What rebuilds on reorder" with the visual-position-as-kernel-anchor model, three-bullet behavior breakdown (same-profile pointer swap, different-profile selective rebuild, disabled/awaiting invisible to kernel), and the data- identity vs kernel-slot-anchor rule. - Dashboard: tightened drag-reorder paragraph to one sentence on the pointer-swap behavior with link to Controller-Slots. Dev-facing: - Services-Layer: rewrote the Slot Reordering subsection with the five-rule spec (data identity / kernel-slot anchor / repoint-not- rebuild / same-profile zero-flicker / different-profile destroy+ recreate), per-pad vs per-VC state split, RebuildKernelOrderAfterReorder as a thin delegator, and a new RerouteVirtualControllersForReorder subsection covering the three-step implementation. Dropped v2 prose about "lowest changed position". - Input-Pipeline: cross-reference the intra-group reroute path (pointer move + same-profile reuse) vs cross-group / type-change destroy+recreate. - HIDMaestro-Deep-Dive: distinguish bubble-up cascade (deletion / inactivity-timeout) from intra-group reroute (no cascade). - Architecture-Overview: one short paragraph in Slot System covering the model + cross-reference to Services-Layer. - Virtual-Controllers: two inline corrections naming RerouteVirtualControllersForReorder (intra-group) alongside SwapSlotData (cross-group). Page-level rewrite still pending per the existing editor's note.

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • Wiki sync: drag-reorder rebuild logic + DS4/Microsoft identifier renames User-facing: documents the profile-aware drag-reorder behavior on the Dashboard. Active controllers in a group constitute their own ordering; the kernel rebuild fires only when an active VC's relative position to other actives changes such that a profile mismatch results. - Controller-Slots: new "What rebuilds on reorder" subsection. - Dashboard: drag-reorder paragraph extended with one-sentence summary. - 3D-and-2D-Visualization, Devices, Profiles, Macros, Troubleshooting: residual Xbox 360 / DualShock 4 family-name leakage replaced with Xbox / PlayStation in user-visible prose. Web-controller layout slugs and specific HM profile names left as-is. Dev pages: reflects the v2-era identifier renames in code that landed in 005ef8e + dc5b9fd: - Architecture-Overview, Settings-and-Serialization, Virtual-Controllers: MaxDS4Slots -> MaxPlayStationSlots. - ViewModels, XAML-Views: DS4Count -> PlayStationCount. - Services-Layer: rewrote SwapSlots / MoveSlot entries + added a new RebuildKernelOrderAfterReorder subsection covering the simplified single-pass live-subsequence comparison (replacing the older ShouldRebuildKernelOrder predicate). Also corrected a stale Xbox360 enum default in the CreateSlot row to Microsoft (the actual preserved enum identifier). - Input-Pipeline: cross-reference added to the Services-Layer reorder section since kernel-allocation rebuild lives in InputService. Preserved: VirtualControllerType.Microsoft enum value, MaxXbox360Slots constant, [XmlArray("MicrosoftSlotOrder")] attribute string, web layout slugs, ControllerModelDS4 / ControllerModelXbox360 class names, asset folder paths, HM JSON vendor "Microsoft"/"Sony" filter strings, all genuine Microsoft.Win32 / Microsoft.Windows.Devices.Midi2 / registry references.

    @hifihedgehog hifihedgehog committed Apr 28, 2026
  • Deep v3 resync: vJoy purge, Microsoft→Xbox terminology, current features Sweep residual v2 vJoy / ViGEmBus content out of user-facing pages and replace stale dev-page class names with the v3 unified HIDMaestro pipeline. Restore correct family-name terminology (Xbox / PlayStation / Extended, not Microsoft / Sony — those enum identifiers exist purely for v2 PadForge.xml back-compat per the in-source enum comment). User-facing pages (Home, Dashboard, Controller-Slots, Devices, Settings, Driver-Management, Troubleshooting, Force-Feedback, Web-Controller, 3D-and-2D-Visualization, 2D-Overlay-System, Installation, Stick-Deadzones, Trigger-Deadzones, Input-Precision): - vJoy slot type, "vJoy driver limit", and vJoy install steps removed - Troubleshooting: "vJoy Phantom Controllers" section deleted (v2 N²-bug, doesn't exist in HIDMaestro), other vJoy sections rewritten for HM - Force-Feedback: HID PID 1.0 framing for Extended; new Sony Report 0x01 rumble passthrough section - 3D-and-2D-Visualization: PlayStation touchpad preview (live finger spheres) and click-to-map TouchpadClick documented - 2D-Overlay-System: touchpad highlight visual spec (sampled colors) - Web-Controller: DS4 layout button-11 collapse for TouchpadClick Dev pages (Architecture-Overview, Engine-Library, Build-and-Publish, HIDMaestro-Deep-Dive, Input-Pipeline, SDL3-Integration, Services-Layer, Settings-and-Serialization, Driver-Installation-Internals, ViewModels, XAML-Views, Virtual-Controllers, Button-and-Axis-Mappings): - Stale Xbox360VirtualController / DS4VirtualController / ExtendedVirtualController / VJoyRawState references replaced with the v3 unified HMaestroVirtualController + ExtendedRawState - Step 5 prose updated to HMContext.SubmitState / SubmitRawReport with Sony Report 0x01 passthrough - HIDMaestro-Deep-Dive: HM 1.1.x → 1.2.0 - Services-Layer: false claim that Extended slots reset to "Microsoft (Xbox 360) gamepad preset" replaced with the actual behavior (ProfileId = GetDefaultProfileId(type), Custom "PadForge Game Controller" for Extended) - Three broken [[vJoy Deep Dive]] links retargeted to [[HIDMaestro Deep Dive]] - Virtual-Controllers gets a top-of-page editor's note flagging it for a full hand-rewrite (the deep sections still describe deleted v2 classes) Microsoft references kept where they are real: NuGet package Microsoft.Windows.Devices.Midi2, registry paths under SOFTWARE\Microsoft\, ".NET runtime download from Microsoft", literal VirtualControllerType.Microsoft enum-value citations, MaxXbox360Slots constant name (preserved from v2), [XmlEnum("Sony")] attribute string, OpenXInput Microsoft-trademark disclaimer.

    @hifihedgehog hifihedgehog committed Apr 27, 2026
  • Fix mojibake throughout the wiki + rewrite Input-Precision Stage 5 for v3 Mojibake sweep: 1067 sequences across 17 .md files. Earlier passes had round-tripped UTF-8 punctuation through a CP1252 layer, baking the literal three-character mojibake into the files (em-dash → â + € + ", en-dash, right arrow, box-drawing chars, middle dot, multiplication sign, etc.). Restored to the proper Unicode codepoints: — – → ↔ ← │ ├ └ · ×. Input-Precision Stage 5 rewrite: the page still described 'Stage 5: vJoy Output (15-bit unsigned)' which doesn't exist in v3. v3 has a single HIDMaestro Output stage with three sub-cases: - Microsoft (Xbox 360): signed 16-bit sticks, 8-bit triggers - PlayStation (DS4): 8-bit sticks AND triggers (DS4 protocol) - Extended (HM custom HID): 16-bit unsigned sticks, 8-bit triggers by default, raisable to 16-bit per profile Verified against HIDMaestro's HidDescriptorBuilder.cs (AddStick default bits=16, AddTrigger default bits=8) and PadForge's HMaestroVirtualController.cs (SubmitGamepadState normalizes through float at the SDK boundary). Output Throughput section: dropped the vJoy single-IOCTL note, replaced with HIDMaestro single-call SubmitState description. Summary table axis-resolution rows now reflect per-VC-type wire bit depth. Stage 3 callout pointing at Stage 5. Pseudo-colon em-dash converted to period per the project style rule.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
  • Virtual-Controllers: rewrite Architecture Overview for v3 single-HMaestroVirtualController model Three v2 classes (Xbox360VirtualController, DS4VirtualController, ExtendedVirtualController) collapsed into one HMaestroVirtualController that takes the user-facing category and an HM profile at construction. The Mermaid diagram and Quick Comparison table now reflect that. Source file list shrunk to 3 implementations (HMaestro, KBM, MIDI). Lifecycle detail (thread pool, inactivity timeout, bubble-up cascade) is cross-referenced to HIDMaestro-Deep-Dive instead of duplicated here. Deeper per-class internal-mechanics sections of this page still describe v2 implementations and need a follow-up content rewrite.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
  • Architecture-Overview: refresh Mermaid diagram for v3 (HM thread pool, OpenXInput, 5 categories) + add v3 caveat banner to 7 dev pages The Mermaid diagram now reflects: - 5 controller categories (Microsoft / PlayStation / Extended / KBM / MIDI) instead of v2's Xbox360 / DualShock4 / vJoy. - HM lifecycle thread pool as a separate node feeding the three HM-backed categories (Microsoft, PlayStation, Extended). - OpenXInput shim as a sibling to SDL3.dll under External Systems. - HIDMaestro driver as the single virtual-HID-output driver (replacing ViGEm + vJoy nodes). - Windows MIDI Services as the MIDI backend. The 7 deeper dev pages (Driver-Installation-Internals, Input-Pipeline, Virtual-Controllers, Engine-Library, ViewModels, XAML-Views, Settings-and-Serialization) get a 'Note for v3' banner pointing readers to HIDMaestro-Deep-Dive as the canonical source for v3 implementation detail. The terminology in those pages was already swept; the implementation-detail sections still describe v2 mechanics until a follow-up content rewrite.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
  • Bulk v3 terminology sweep across remaining wiki pages (23 files) Mechanical s/// pass on the names that don't depend on architectural context: ViGEmBus -> HIDMaestro, ViGEmClient -> HIDMaestro SDK, VJoy -> Extended (the C# enum value name appearing in narrative text), 'DirectInput (vJoy)' -> 'Extended (HIDMaestro)', 'Xbox 360 / DualShock 4' (slot type pair) -> 'Microsoft / PlayStation', etc. Pages already hand-rewritten upstream were left alone (Home, Installation, Driver-Management, HIDMaestro-Deep-Dive). Virtual-Controllers got the same pass since it's a central reference. Caveat: many of the deeper architecture pages (Driver-Installation- Internals, Input-Pipeline, ViewModels, XAML-Views, Engine-Library, etc.) still describe v2-era *implementation* (vjoy.sys SetupAPI device-node creation, ViGEm.Client P/Invoke surface, etc.). The TERMINOLOGY now matches v3 but the IMPLEMENTATION DETAILS in those pages are still v2 and need a follow-up content pass to reflect the HIDMaestro SDK surface, the OpenXInput shim, the HM thread-pool lifecycle, the bubble-up cascade, etc. See HIDMaestro-Deep-Dive.md for the v3-correct version of that material.

    @hifihedgehog hifihedgehog committed Apr 26, 2026
  • Sweep em-dash pseudo-colons across developer reference pages

    @hifihedgehog hifihedgehog committed Apr 18, 2026
  • Wave 5: Visual overhaul, second polish, cross-page consistency, TOCs, diagrams Home.md: Hero section with centered about.jpg, "New in this release" callout, 6 themed sub-sections, Unicode symbols, verb-led descriptions. Visual: 3 unused dropdown screenshots added to Sticks/Triggers pages. TOCs added to 5 long dev docs. 3 new Mermaid diagrams (save/load flow, class relationships, device discovery). Cross-page consistency (user + dev): Bidirectional Related Pages across all 31 pages (94 dev cross-links, 60+ user cross-links). Feature naming standardized ("Force Raw Joystick Mode", "DualShock 4", "DirectInput (vJoy)"). Setting names matched to UI labels. 9 screenshot alt texts made descriptive. Dev doc links removed from user pages. Second polish (all pages): 200+ edits tightening prose, removing AI voice ("robust", "This ensures", "you can"), standardizing See Also sections, cutting filler. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    @hifihedgehog hifihedgehog committed Mar 19, 2026
  • Numeric accuracy sweep: 18 agents verified every number against source code Fixes found by accuracy agents: - Virtual-Controllers: Xbox/DS4 max instances 4→16 (3 locations), 5 Gamepad button bit values corrected (A=0x1000, B=0x2000, X=0x4000, Y=0x8000, GUIDE=0x0400) - Controller-Slots: per-type limit reasons now explain XInput 4-slot visibility vs ViGEm 16-slot creation, SDL/DirectInput see all 16 - Input-Pipeline: VJoyRawState axes "up to 16" → "up to 8" - 3D-and-2D-Visualization + Button-and-Axis-Mappings: triggers "up to 4" → "up to 8" (MaxAxes=8, sticks consume 2 each) - Dashboard: Xbox/DS4 per-type limits 4→16 - Build-and-Publish: removed phantom LICENSE.txt from publish output - SDL3-Integration: added missing padding fields to SDL_HapticCondition and SDL_HapticRamp structs - ViewModels: DeadZoneShape.ScaledRadial=2 not 0, tab order corrected, ViewModelBase code snippet fixed - Engine-Library: mouse button order L,R,M → L,M,R - Driver-Installation-Internals: removed phantom EnsureWhitelisted, added 4 missing HidHide API methods - 2D-Overlay: schematic line count 795→794 - 3D-Model: torus offset 0.4→0.8mm Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    @hifihedgehog hifihedgehog committed Mar 19, 2026
  • Professional polish: proper typography, concise writing, 33 agents Replace all 590+ double-hyphen (--) instances with proper em dashes (—) and en dashes (–) for numeric ranges. Remaining -- only inside code blocks. Rewrite every page for professional conciseness: - Simple English, short sentences, active voice - Prose converted to tables and bullet lists - Filler words and AI-tell phrases eliminated - Parallel structure in descriptions - Every section scannable in seconds Net result: 632 fewer lines across 32 files while preserving all detail. Verified: 0 broken cross-references, all 9 Mermaid diagrams valid, all 21 image references valid, README fully synchronized. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    @hifihedgehog hifihedgehog committed Mar 19, 2026
  • Final Virtual-Controllers.md polish from late-finishing 143K token agent Fixed SubmitRawState axis mapping (16→8), added missing methods (UpdateFfbPadIndex, AllDevicesReady, EnsureDriverInStore, etc.), expanded all 5 VC types with constructor/connect/disconnect/dispose details, FfbConditionAxis.DeadBand type fix, polar motor split math. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    @hifihedgehog hifihedgehog committed Mar 19, 2026
  • Complete vJoy-Deep-Dive and Virtual-Controllers rewrites (late-finishing agents) vJoy-Deep-Dive: 530→1097 lines. Full P/Invoke layer, batch output analysis, Y-axis inversion derivation, WriteDeviceDescriptors diff detection, FFB callback routing with polar-to-motor math, device node lifecycle flowcharts, 9-step RestartDeviceNode cascade, DLL namespace cache fix details. Virtual-Controllers: expanded VC type implementations with axis/button tables. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

    @hifihedgehog hifihedgehog committed Mar 19, 2026