# Sensor Readout Source File Map This table explains the current C# source split used by Sensor Readout. It is intended for contributors and anyone who wants to understand where a feature lives before reading the code. Keep it updated whenever files are added, removed, renamed, or given a materially different responsibility. | Source file | Main responsibility | What it does | Notes | | --- | --- | --- | --- | | `AlarmTriggerState.cs` | Alarm episodes and cooldown | Tracks whether an active condition has already been announced, preserves optional repeats, and re-arms only after a valid non-matching sample. | Runtime-only state; missing readings do not mean recovery. | | `ContextHelp.cs` | Focused-control help service | Routes plain F1 in the main window and owned dialogs to a readable, read-only help dialog with Copy help, Manual, and Close; restores the original focus when help closes. | Plain F1 is reserved even in hotkey-entry fields; modified combinations remain available to their existing handlers. The service removes its message filter when disposed and does not change input values. | | `ControlHelpCatalog.cs` | Localized control-help catalogue | Maps explicit control bindings and accessible names to localized explanations, with control-type fallback help for unmatched controls. | Describes the control's purpose without reading entered passwords, tokens, or other input text. Supplies the English help-topic entries used for language coverage. | | `UiMnemonics.cs` | Translated keyboard accelerators | Keeps menu and Preferences-tab mnemonics unique after translation, preserves explicit shortcut-button keys, escapes literal ampersands, and excludes user-defined menu text. | Shared dialog controls reserve their keys across tabs. Does not change global hotkeys, profile names, or control values. | | `SensorReadoutForm.ContextHelp.cs` | Active-language label lookup bridge | Exposes internal lookup of control-label keys from the active language for control-help topic matching. | Keeps language lookup behind the form's existing language boundary. | | `SensorReadoutForm.ContextHelp.SelfTest.cs` | Control-help regression checks | Covers plain and modified F1 capture, input privacy, seven-language lookup and translation parity, concise Preferences announcements with retained shortcuts, context-specific tool help, watcher file-location shortcuts and menu states, conservative tree fallback, nested owned dialogs, focus return, and held-F1 handling. | Runs in the isolated application self-test. | | `SensorReadoutForm.Localization.SelfTest.cs` | Interface-language regression checks | Rebuilds Help, View and Hotkeys menus in every bundled language, switches back to English, checks About and Preferences text, keyboard mnemonics, preserved profile names, and disposal of replaced menu items. | Runs in the isolated application self-test without opening external pages or changing system settings. | | `SensorReadoutForm.Alarms.SelfTest.cs` | Alarm integration checks | Covers one-time warnings, invalid readings, independent alarms, preference persistence, import, and disabling/re-enabling. | Runs in the isolated application self-test. | | `SensorReadoutForm.Startup.SelfTest.cs` | Startup ownership checks | Covers copied configuration, explicit preference changes, task and legacy-entry ownership, and replacement failure safety. | Uses isolated settings and simulated registration operations. | | `Tests/AlarmTriggerStateTests.cs` | Alarm timing checks | Exercises first warnings, persistent conditions, cooldown boundaries, recovery, missing samples, and fresh sessions with a deterministic clock. | Compiled and run by `Build.ps1 -SelfTest`; not shipped in the portable app. | | `AssemblyInfo.cs` | Assembly metadata | Sets the main executable title, product metadata, and assembly/file/product version numbers compiled into the executable. | `Build.ps1` verifies this against `SensorReadoutForm.AppVersion` and the app manifest. | | `Build.ps1` | Local build and self-test | Compiles the EXE with the multi-resolution Sensor Readout application icon, plug-in SDK, bundled plug-in DLLs, optional bundled plug-in helper EXEs from `PlugIns\\helper`, and managed TraceEvent references for the opt-in Audio Latency diagnostic; generates shared assembly metadata for DLLs; audits source file sizes; validates AppVersion, AssemblyInfo, manifest, dependency binding redirects, EXE, SDK DLL, plug-in DLL, helper EXE, and required Resource-file parity; updates bundled language and plug-in hashes; copies prerequisite and optional app-install helpers into `portable\Install_Scripts`; clears preserved portable folders; compiles and runs optional plug-in parser/self-tests from `PlugIns\\tests`; runs the Python relay protocol suite; and can run the internal app self-test. | Root dependency DLLs are not shipped beside the EXE; they live in `portable\Resources`. Bundled plug-in output folders are rebuilt from an allow-list so stale source, test, or development files cannot leak into packages. The build fails if Sensor Readout binaries report stale file/product versions, if binding redirects point at unshipped Resource assemblies, if required TraceEvent support files are absent, if duplicate stale license files return, if a root dependency DLL appears beside the EXE, or if a source file grows beyond the hard source-size limit. It warns when files cross the large-file review threshold so future cleanup stays visible. Successful self-test runs remove their temporary app/result folder. | | `Update-Data.ps1` | Bundled vendor database updater | Downloads and validates the latest `usb.ids` and IEEE `oui.csv` snapshots, updates `Data`, and mirrors them to `portable\Data`. | Called by the release gate so USB and MAC vendor names stay current without making ordinary compiles depend on the network. | | `Models.cs` | Shared data models | Defines the plain data objects used across the app: settings, sensor rows, category choices, tray selections, fan labels, spoken hotkey profiles, fan profiles, alarms, plug-in preferences, plug-in help links, reading-history selections, update info, update confirmation preferences, and language choices. | Keeps cross-feature data contracts away from UI code. | | `MacVendorDatabase.cs` | MAC/OUI vendor lookup | Loads the bundled OUI vendor database from `Data` and resolves MAC address or OUI-style prefixes to vendor names. | Used by the Network category and USB network/storage details. | | `NativeInterop.cs` | Windows and screen-reader interop | Contains P/Invoke declarations and small wrappers for Windows APIs, global hotkeys, shutdown handling, notification-area tooltip updates, accessibility-state queries, memory-mapped Core Temp data, Prism/Tolk screen-reader speech, cached supported-screen-reader process detection, active-screen-reader-only speech helpers, Resource-folder native DLL search setup, and related native structures. | This is the boundary between managed C# and native DLL/Windows calls. Speech output now prefers Prism on supported Windows 10 or later systems and falls back to Tolk when Prism is unavailable or cannot initialize a usable backend. | | `Program.cs` | Application startup and command line | Configures managed and native dependency loading from `Resources`, parses command-line options, handles single-instance and close behavior, portable-copy install and installed-copy uninstall handoff, normal/anonymized report-only modes, report comparison mode, diagnostics-only mode, build-time self-test mode, updater mode handoff, logging override, TLS setup, conservative bundled plug-in hash manifest repair, crash logging/restart handoff, and starts the WinForms message loop. | Entry point for `Sensor Readout.exe`; close-request signalling is reset after close handling so later launches do not inherit a stale close request. Startup repairs the bundled plug-in hash manifest only when it detects the legacy release-package compatibility pattern, and only for known shipped plug-in folders, so imported plug-ins and user-modified files are not marked as bundled. | | `Program.Updater.cs` | Self-update and signed package installation | Prepares a self-contained temporary updater launcher with its required managed dependency, then runs the internal `--apply-update` flow: downloads the release ZIP or copies a local `--update-zip`, extracts it, verifies the signed package, replaces shipped folders, preserves Config/Logs/Reports, backs up likely user-edited bundled language or plug-in files, cleans stale nested update folders, writes updater logs, and restarts the updated app. The same verified replacement engine accepts the extracted package used by Windows package managers. | Snapshots the previously installed bundled language and plug-in hash manifests before replacing `Data`, so rebuilt shipped files are not mistaken for user edits. Replaces the previous PowerShell updater script so older Windows systems do not need PowerShell 3+ cmdlets such as `Invoke-WebRequest`, `Expand-Archive`, `Get-FileHash`, or `Compress-Archive`. | | `UpdatePackageSignature.cs` | Windows update authenticity | Validates the RSA-signed update manifest, exact packaged file set, SHA-256 file hashes, component, and version before the updater snapshots or replaces the installed program. | Contains only the public verification key. The private release-signing key stays outside repositories and synchronized folders. | | `PreferencesForm.cs` | Preferences window shell | Defines Preferences fields, constructor layout, tab creation, primary control wiring, live-setting event hooks, and the Spoken and visual feedback tab for routine category speech verbosity, optional fallback category speech, and visual spoken-hotkey feedback. | Partial class root for the Preferences dialog. Feature-specific behavior is split into the focused `PreferencesForm.*.cs` files below. | | `PreferencesForm.Core.cs` | Preferences shared behavior | Handles Preferences language refresh, dialog keyboard routing, fixed option text, live saving, desktop shortcut preference application, and shared combo/hotkey helpers. | Shared by every Preferences tab. Global hotkey entry rejects unsafe system shortcuts, single-modifier shortcuts, and reserved Windows combinations before saving. | | `PreferencesForm.Panels.cs` | Preferences panel builders | Builds the Hotkeys profile editor, notification-area/spoken-reading selection panels, fan profile, sound picker, alarms, plug-ins, category visibility/order, hidden items, and language editor panels. Also handles plug-in details/import, language-editor search, language-editor cursor restore, and language-editor file operations. | Construction-only code is kept away from list editing logic where practical. The show/hide global hotkey editor lives at the top of the Hotkeys tab, with General linking to it for discoverability. | | `PreferencesForm.TraySearch.cs` | Tray selection and Preferences list search | Manages notification-area reading selection, ordering, rename, reset-label, status text, list search, live row refresh, tray choice population, and shared drag/drop reordering for ordered preference lists. | Used by the Hotkeys tab notification-area status profile and reusable F3-style list search. | | `PreferencesForm.SpokenHotKeys.cs` | Spoken hotkey preferences | Edits the permanent notification-area status profile, creates/removes/imports spoken hotkey profiles, resolves imported reading keys, edits selected readings, spoken labels, ordering, copy/cut/paste between profiles, preset profiles, removal confirmation, and preview text. | Notification area status uses the same editor and buttons as spoken hotkey profiles, but cannot be removed; user-created spoken profiles are sorted by assigned key for predictable navigation. | | `PreferencesForm.FanProfiles.cs` | Fan profile preferences | Creates/removes fan profiles, edits profile headers/actions, applies a profile from Preferences, filters fan controls, and formats fan-control display names. | Fan runtime behavior remains in `SensorReadoutForm.FanControls.cs` and `SensorReadoutForm.FanCurves.cs`. | | `PreferencesForm.Alarms.cs` | Alarm preferences | Builds alarm reading choices, creates/removes/loads/saves alarms, handles threshold units, threshold conversion, cooldowns, custom spoken messages, and alarm list text. | Alarm runtime evaluation remains in `SensorReadoutForm.Alarms.cs`. | | `PreferencesForm.Helpers.cs` | Preferences helper models | Returns current Preferences state, clones mutable settings, handles hidden keys and speech labels, defines list choice comparers, and contains small nested list item/helper types. | Kept separate so the larger workflow files stay focused. | | `SensorReadoutForm.cs` | Main window shell | Defines the main form fields and constructor, creates the primary UI layout, menu structure, category list, tree view, status/progress area, timers, and high-level event wiring. | The central partial class that the feature-specific files extend. Includes the main-window `Alt+Enter`, Edit-menu, and context-menu entry points for allow-listed related Windows Settings pages. | | `SensorReadoutForm.Alarms.cs` | Alarms and sounds runtime | Evaluates alarm rules against current readings, triggers screen-reader speech using custom alarm text when configured, plays WAV files, flashes the tray icon, plays startup/shutdown sounds, and loads sound file names from the `Sounds` folder. | Uses WAV playback through .NET `SoundPlayer`. | | `SensorReadoutForm.Audio.cs` | Audio device inventory | Reads Windows sound devices and audio endpoint data, including vendor, status, playback/recording direction, and default channel/sample-rate/bit-depth format where exposed. | Used by the Audio category and reports. | | `SensorReadoutForm.AudioLatency.cs` | Explicit audio-latency diagnostic | Builds the accessible setup dialog, starts and stops one uniquely named Windows ETW kernel session, aggregates DPC/ISR duration by responsible driver, counts hard page faults by process and lost events, retains a bounded rolling sample history, exposes grouped current/recent/session rows in the Audio Latency category, and saves a structured HTML report automatically when the test stops. | No tracing runs during ordinary refreshes. The session exists only after explicit user action and is stopped on timeout, shortcut/menu request, or app shutdown. Audio Latency rows are excluded from anonymized reports because driver paths and process names can identify installed software. Uses the MIT-licensed Microsoft TraceEvent library shipped in `Resources`. | | `SensorReadoutForm.AudioLatencyLive.cs` | Live audio-latency monitor | Shows a modeless Windows-style monitor for the active or latest Audio Latency test, with separate DPC/ISR history plots, a stable accessible tree updated in place, current/recent/session summaries, report opening, and explicit stop-and-save control. | Reuses the existing ETW run rather than starting another collector. Stores at most 120 one-second samples, draws at most the latest 60, performs no continuous speech, and does not prepare driver summaries while the monitor is closed. Closing the window only closes the view. | | `SensorReadoutForm.Battery.cs` | Battery and power readings | Reads battery charge, status, capacity, health, cycle count, voltage, battery power-rate, charge/discharge remaining time, Windows power-meter watts, rated power-supply output, and currently connected device-battery percentages where Windows exposes them. | Used by laptops and other systems with batteries or Windows power-meter support. True charger input draw only appears when Windows or the hardware exposes it through power-meter classes. Windows power meter/supply WMI rows are cached during normal refreshes because they are hardware-state rows, not fast live counters. | | `SensorReadoutForm.Bluetooth.cs` | Bluetooth radio and device readings | Uses Windows Bluetooth APIs to collect Bluetooth radio and paired/connected device rows, including addresses, class/type, services, manufacturer, connection state, pairing/remembered state, and last seen/used timestamps where available. | Bluetooth battery percentages remain in Battery. Classic Windows Bluetooth APIs do not expose reliable live RSSI/dBm for ordinary paired devices, so SR only reports signal strength if a reliable source exists. | | `SensorReadoutForm.CommunityStats.cs` | Opt-in anonymous community stats | Builds a small allow-listed aggregate stats payload, previews the exact JSON to the user, stores a random local client id, sends only its SHA-256 hash, and uploads only after the user presses Upload. | Deliberately separate from anonymized reports; excludes computer names, usernames, serials, MAC/IP addresses, paths, drive labels, device IDs, PnP IDs, raw details, installed programs, program usage, per-drive rows, and full report rows while allowing aggregate Windows edition/build, CPU, GPU, memory/storage totals, accessibility setup, configuration, and coverage counters. | | `SensorReadoutForm.Dispose.cs` | Cleanup | Disposes timers, tray icon, hardware computer objects, enabled plug-ins, hidden windows, and other resources when the app exits. | Keeps shutdown cleanup separate from feature logic and gives lifecycle-aware plug-ins a bounded chance to stop background work and release device handles. | | `SensorReadoutForm.Devices.cs` | Windows device inventory | Collects Device Manager-style PnP/driver/resource rows for the Devices category and duplicates problem devices into a top Non-working devices group. | Uses Win32_PnPEntity, Win32_PnPSignedDriver, Win32_PNPAllocatedResource, and selected Enum registry fields; keeps noisy IDs in Details and decodes common Device Manager problem codes. | | `SensorReadoutForm.Display.cs` | Display inventory | Reads graphics adapters and monitor identity data, including adapter memory, current resolution, driver information, monitor vendor, product code, serial, and manufacture date where exposed. | Used by the Display category and reports. | | `SensorReadoutForm.Diagnostics.cs` | One-click diagnostics | Runs Help-menu diagnostics, temporarily enables debug-level logging in memory, creates TXT/HTML reports, records plug-in enabled/disabled state, exercises writable fan controls, restores fan/manual/curve state, writes a summary, zips the diagnostic bundle with the computer name in the file name, removes the temporary staging folder, and opens the Reports folder. | Designed for support cases where users need to send one ZIP instead of several separate files, including enough plug-in state to tell whether matching laptop support was enabled during the run. Diagnostic collection passes a diagnostics-mode plug-in context so live refresh can stay conservative while support bundles still include deeper discovery data. | | `SensorReadoutForm.FanControls.cs` | Fan controls dialog and refresh pipeline | Builds and manages the Fan Controls dialog, including fan selection, friendly labels, manual percentages, automatic/default control, show-stopped behavior, and visible fan command buttons. Also coordinates refresh collection, separating fast live rows from cached slow inventory rows and timing out slow LibreHardwareMonitor passes so Windows-backed rows can still appear. | Fan control depends on LibreHardwareMonitor/PawnIO and writable controls exposed by hardware. Slow refresh rows include SMART, USB, audio, display, device inventory, CPU inventory, and overview data so 1-second refreshes do not repeatedly query heavier hardware/WMI paths. Full LibreHardwareMonitor passes get a longer timeout because first open can be slow and one-shot reports cannot recover on a later refresh. | | `SensorReadoutForm.FirmwareSecurity.cs` | Firmware security inventory | Adds the read-only Firmware Security category, including firmware mode, Secure Boot state, and UEFI Secure Boot certificate database summaries where Windows permits access. | Reads UEFI variables only; it does not modify Secure Boot variables or EFI files. Details include database read status, certificate subjects/issuers, validity dates, thumbprints, serial numbers, hash counts, and possible test-certificate warnings. | | `SensorReadoutForm.FanCurves.cs` | Fan curves | Builds and manages the Fan Curves dialog, stores curve definitions, and applies enabled curves by mapping selected temperature readings to writable fan control percentages. | Curve support still depends on hardware exposing writable fan controls. | | `SensorReadoutForm.Formatting.cs` | Display formatting | Formats numbers, temperatures, bytes, rates, percentages, uptime, fan display text, speech labels, selected meter values, and shared rules for which rows can be used as quick readouts. | Keeps text/value presentation consistent across UI, tray, reports, hotkeys, and alarms, including GPU memory, GPU engine, combined memory, and connected-disk total rows that are safe to expose as selectable readouts. | | `SensorReadoutForm.HotkeysTrayHelp.cs` | Hotkeys, tray, help, and screen-reader speech | Registers and handles global hotkeys, builds the Hotkeys menu, handles show/hide behavior, spoken tray status, custom spoken hotkey profiles, report/remote-mode hotkey wording, conditional skipping of unavailable spoken readings, double-press clipboard copy, configurable tray tooltip overflow behavior, cached tray tooltip/icon updates, Help/About/Donate/Contact links, version history, dynamic enabled plug-in help links, and full-manual opening from Help > Manual and control help. | Main accessibility and notification-area interaction layer. Plain F1 control help is routed by `ContextHelp.cs`. Tray and hotkey row resolution uses exact keys first, then the shared conservative reading resolver so profiles remain useful across loaded reports and remote computers without repeatedly scanning the full row list on exact matches. Explicit spoken hotkeys can feed the optional visual spoken-feedback window. | | `SensorReadoutForm.ReadingKeyResolution.cs` | Portable reading identity | Resolves configured reading keys against current local, report, or remote rows using exact keys, stable identifiers, strict drive letters, and cautious semantic equivalents for common CPU, GPU, memory, battery, network, overview, and task readings. | Shared by settings import and runtime spoken hotkeys. Ambiguous equivalents are refused rather than guessed, and hardware-specific fan/control rows are not remapped. | | `SensorReadoutForm.ReadingKeyResolution.SelfTest.cs` | Portable reading identity tests | Exercises drive-letter preservation, missing-drive refusal, cross-vendor primary CPU-temperature matching, ambiguous multi-CPU refusal, imported profile retention, blank imported global assignments, and custom spoken-label migration. | Runs as part of the build-time application self-test. | | `SensorReadoutForm.SpokenFeedback.cs` | Visual spoken feedback | Shows and positions the optional temporary visual feedback window for explicit spoken hotkeys when no supported screen reader is active. | Kept separate from the speech wrapper so routine diagnostics, alarms, and fan messages do not accidentally create visual overlays. | | `SensorReadoutForm.Visuals.cs` | Application identity and visual state | Loads the application icon, applies restrained Windows-native window styling, classifies visible reading severity, renders shape-and-colour notification-area badges, and selects progress-bar states. | Keeps visual presentation separate from collection, speech, and interaction logic; badge shapes and symbols ensure state is not conveyed by colour alone. | | `SensorReadout.ico` | Application icon | Multi-resolution gauge icon embedded into the main executable and reused by app windows and notification-area fallbacks. | Provides a consistent visual identity from 16-pixel tray use through larger Windows shortcut views. | | `SensorReadoutForm.Install.cs` | Install-to-PC and uninstall flow | Detects whether the app is running from the local install folder, copies the current app folder into the normal Windows programs folder for the current user, registers installed copies in Windows Apps and Features / Programs and Features, manages Start menu, desktop, and startup shortcuts, closes the old copy, relaunches from the installed location, and removes installed app files during uninstall with an explicit option to also delete Config/Logs/Reports. | Used by Preferences > Startup and Install, `Install-Sensor-Readout.cmd` through `--install`, the interactive `--uninstall` command registered with Windows, and the non-interactive `--install-silent` / `--uninstall-silent` package-manager paths. App, shortcut, and `.srconnection` registration writes are skipped when already current. | | `SensorReadoutForm.Languages.cs` | Language loading and translation | Loads language files, detects Windows language, falls back to English, applies translated UI strings, tracks language changes, and resolves translated display text. | Language files live in `Langs` and use `key=value` entries. | | `SensorReadoutForm.OemProviders.cs` | OEM/Plug-In bridge | Provides the sensor-collection hook for optional OEM hardware integrations. | This forwards to the plug-in loader instead of containing vendor-specific code. Normal refresh caches OEM/plug-in rows briefly to avoid repeatedly loading fragile vendor WMI providers, using a shorter foreground cache and a longer minimized/hidden cache; diagnostics mode bypasses that cache so support bundles still include fresh deeper discovery data. | | `SensorReadoutForm.PlugIns.cs` | Plug-in loading | Discovers `plugin.json` files at the `Plug-Ins` root and one folder below it, reads optional manifest help links, respects per-machine enabled settings, loads enabled plug-in DLLs, logs disabled/loaded/failed state and returned row counts, catches plug-in failures, converts SDK readings into normal `SensorRow` objects, and disposes lifecycle-aware plug-ins on disable, reload, or shutdown. | Installed plug-ins remain disabled until the user enables them. Duplicate plug-in ids and nested stale manifests are ignored defensively. Manifest help links appear in Help only when that plug-in is enabled. The plug-in context includes a diagnostics-mode flag so plug-ins can keep normal refreshes lightweight but expose deeper support-only discovery during diagnostics. The shipped app config allows plug-ins to load from extracted downloaded ZIP builds that Windows marks as internet-origin files. | | `SensorReadoutForm.PortableExport.cs` | Portable copy export | Creates a ZIP archive of the current app folder for use on another PC, including settings, Plug-Ins, language files, sounds, and other app files, with optional Reports and Logs. | Used by File > Export portable copy. Writes to a temporary ZIP first so the chosen destination is not accidentally included in the archive, and skips update temp/backup folders. | | `SensorReadoutForm.ProcessWatch.cs` | Process resource watch reports | Lets the user choose one running process, sample CPU, memory, GPU counters where Windows exposes them, thread and handle counts, then automatically save an HTML table report or CSV sample log after the watch stops. Also provides reusable process labels and direct watch-start support from Tasks process rows. | Used by Options > Watch process / Stop process watch and the Tasks process-row context menu. Records resource counters only; it does not inspect keystrokes, app contents, file contents, registry contents, or network payloads. | | `SensorReadoutForm.Printers.cs` | Printer overview | Reads Windows printer status, drivers, ports, sharing, print configuration, queued jobs, and driver-exposed ink/toner percentages where available. | Adds printer summary rows to Performance/Overview and per-printer rows to the Performance > Printers subtree. Offline state, queued jobs, and usable supply percentages can be selected for tray, spoken hotkeys, or alarms. | | `SensorReadoutForm.PreferencesAndCommands.cs` | Commands and preferences integration | Opens Preferences, handles command/menu actions, applies updated settings, manages startup shortcut toggles, category shortcut routing, hidden-item/category commands, undo, reading search, copy/copy-value/rename/review actions, quick notification-area/spoken-hotkey assignment from the selected reading, and report/menu entry points. | Connects main-window commands to settings and dialogs. The quick assignment dialog formats notification-area status with its speak-tray hotkey and selected-reading count, matching spoken hotkey profile entries. | | `SensorReadoutForm.ReadingTree.cs` | Reading tree UI | Builds and refreshes the configurable category list and grouped reading tree, preserves expansion/selection state, applies the user-selected expand/collapse/remember tree mode, handles context menu actions, exposes progress values for percentage readings, announces when selected rows have Details or related Windows Settings pages, and updates visible rows. | Controls what users and screen readers navigate in the main reading area without adding accessibility hints to copied row text; static report placeholders avoid live-refresh wording. Rebuild decisions include selected category and user category visibility/order so visually identical empty states do not leave the previous tree in place. Group construction and display formatting live in the focused ReadingTree partials below. | | `SensorReadoutForm.ReadingTreeGroups.cs` | Reading tree group construction | Builds the grouped tree item models for hardware groups, overview subtrees, USB/audio/display/device summaries, CPU and memory groups, explicit storage groups, other hardware status, task rows, and spoken-hotkey mirror rows before they become WinForms tree nodes. | Storage classification is allow-listed so battery, thermal, firmware, and power-supply rows cannot fall into Storage merely because they are otherwise unmatched. | | `SensorReadoutForm.ReadingTreeFormatting.cs` | Reading tree sorting and display formatting | Defines category sort order, user-visible category names, per-reading sort order, short hardware names, display reading names, value formatting, placeholder text, and small HTML/text helpers used by the reading tree. | Keeps display-name and value-order rules in one place so new categories do not bloat the tree-control file. | | `SensorReadoutForm.RemoteMonitoring.cs` | Remote monitoring integration | Opens the Remote Monitoring dialog, starts and stops the built-in Windows relay, publishes local rows at each connection's configured interval, loads and refreshes remote snapshots, switches the main tree into live remote mode, returns to local readings, and submits allow-listed remote saved fan-profile requests. | Outgoing snapshot preparation and network work run outside the UI thread. Remote view keeps local hardware collection running but does not replace the remote tree with local rows. Diagnostics and community stats explicitly return to local readings first. | | `RemoteMonitoringDialog.cs` | Accessible remote server and computer UI | Adds, edits, imports, enables, and removes server connections; controls local sharing and remote fan-profile permission; lists or removes stored computers; starts built-in hosting; and opens a selected remote computer. | Uses localized labels, stable list focus, unique same-dialog mnemonics, Enter-to-view, F5 refresh, and an explicit announced status line. Connection files never contain the monitoring password. Plain HTTP connections warn unless they are loopback. | | `RemoteMonitoringModels.cs` | Remote protocol and settings models | Defines saved server connections, opaque machine index entries, encrypted delta envelopes, remote snapshots/deltas/rows, fan-profile descriptors, and remote fan command documents. | Separates the versioned wire contract from UI code and normal `SensorRow` models. | | `RemotePayloadCrypto.cs` | Client-side remote encryption | Derives separate encryption and authentication keys from the monitoring password, encrypts snapshots/deltas/commands with random salt and IV, authenticates envelopes with HMAC, and decrypts validated payloads. | The monitoring password and derived keys never go to the relay. Version 1 decryption remains available for compatibility while new payloads use the hardened version 2 envelope. | | `RemoteSnapshotCodec.cs` | Snapshot/delta conversion | Converts normal rows into bounded remote snapshots, calculates changed/removed/reordered rows, applies sequential deltas, validates row and profile limits, and converts loaded snapshots back to normal `SensorRow` objects. | Stable row identities and sequence validation let the existing report-style tree become a live remote view without sending complete data on every refresh. | | `RemoteServerClient.cs` | Relay HTTP client | Authenticates with the server access token and exchanges opaque snapshots, deltas, heartbeats, machine indexes, and encrypted fan command envelopes. | Publishing and command-consumption requests also carry the local computer's private write credential. Loopback requests bypass system proxy discovery, redirects and response sizes are bounded, and server sequence/resync responses are surfaced explicitly. | | `RemoteMonitoringEngine.cs` | Remote publish/load orchestration | Enforces each connection's publication interval, publishes the first complete snapshot, sends efficient changes, compacts periodically, recovers from sequence conflicts, incrementally loads remote changes, removes stored computers, and falls back to a complete snapshot when required. | The relay receives encrypted bytes only; snapshot interpretation stays in Sensor Readout. Remote fan requests are age-checked, acknowledged, and reduced to the newest valid request before local permission and saved-profile validation. | | `RemoteFirewallManager.cs` | Built-in relay firewall access | Creates, updates, and removes Sensor Readout's own inbound TCP rule through the Windows Firewall API. | The rule is limited to the selected relay port and private/domain network profiles; hosting-disable and uninstall paths remove it. | | `EmbeddedRemoteServer.cs` | Built-in Windows relay | Hosts the same opaque remote protocol inside a Sensor Readout copy, using an atomic encrypted checkpoint, bounded in-memory live differences, and bounded persistent command queues. | Lets Windows users host without a separate service while avoiding one disk file per live update. Requests, machines, pending differences, and aggregate buffered bytes are bounded. A per-computer write-credential hash prevents one client in a shared monitoring space from replacing or deleting another computer's data. The independent Python relay provides the same protocol and storage model for Linux and always-on deployment. | | `SensorReadoutForm.RemoteMonitoringSelfTest.cs` | Remote feature self-tests | Exercises encrypted snapshot and delta round trips, tamper/wrong-password rejection, opaque relay storage, reconnect/resync behavior, connection-file privacy, per-computer write protection, explicit computer removal, and constrained newest-request-only remote fan exchange. | Runs only in the isolated build-time self-test and does not publish or alter the user's real remote settings. | | `SensorReadoutForm.ReportImport.cs` | Static report viewing and title text | Opens saved HTML reports, opens ZIP files that contain HTML reports, detects Sensor Readout update ZIPs before report parsing, reads embedded report snapshots, preserves imported report title/machine context, falls back to legacy HTML report parsing where possible, builds the main title bar text, switches the main tree into static report mode, and returns to live readings on request. | Lets support users inspect another machine's report through the normal Sensor Readout UI without manually extracting zipped reports first. TXT reports are reading/sharing output only. Update ZIPs are passed to the normal self-update flow rather than treated as reports. | | `SensorReadoutForm.ReportTools.cs` | Report comparison, privacy, and support flow | Adds two-report comparison, anonymized report saving, command-line report comparison/anonymized report helpers, and guided support report creation from existing diagnostic ZIP output. | Reuses the embedded report snapshot format so before/after support work stays aligned with normal reports. Anonymized reports remove online public-IP lookup rows entirely instead of trying to partially mask location/provider metadata. | | `SensorReadoutForm.ReportsAndLogging.cs` | Reports and logging | Writes TXT/HTML reports, formats report output, opens save dialogs, manages report/log/update-backup folder actions, writes diagnostics, and includes HTML escaping/report helpers. | TXT and HTML reports show the Sensor Readout version near the top for support identification. TXT reports stay human-readable. HTML reports include the hidden structured snapshot used for exact report reopening. Logging is optional and stored under `Logs` when enabled. Update backup menu actions open or delete old updater backup ZIPs without touching current settings, reports, logs, sounds, languages, or plug-ins. | | `SensorReadoutForm.CoreTemp.cs` | Core Temp sensor import | Reads Core Temp shared memory and converts CPU temperature/load data into normal `SensorRow` objects. | Optional fallback path for systems where LibreHardwareMonitor does not expose CPU temperatures. | | `SensorReadoutForm.GpuDetails.cs` | GPU registry helpers | Reads display-adapter BIOS and memory-size fields from the Windows display registry where available. | Shared by Display, Overview, and Performance GPU rows. | | `SensorReadoutForm.HardwareDetails.cs` | Hardware detail collection and decoding | Collects and formats deeper Windows/WMI details for CPU, cache, memory arrays/modules, Windows, firmware, TPM, baseboard, chassis, and expansion slots. | Keeps verbose detail fields behind Details instead of cluttering the main tree. | | `SensorReadoutForm.LibreHardwareMonitor.cs` | LibreHardwareMonitor collection | Opens and refreshes LibreHardwareMonitor, collects temperature/fan/control/storage rows, maintains fast/slow row cache behavior, returns cached rows when a previous LibreHardwareMonitor refresh is still running, and formats LibreHardwareMonitor storage/control names. | Main low-level hardware sensor source and writable fan-control source. | | `SensorReadoutForm.Network.cs` | Network adapter readings | Reads .NET network-interface counters, IP/MAC/OUI details, cached WMI adapter/configuration details, passive local TCP/UDP listening-port summaries with protocol-specific Details and owning process details where Windows exposes them, and cached public-IP lookup metadata where the online provider returns it. | Wi-Fi radio details are added by `SensorReadoutForm.Wifi.cs`; WMI-heavy details are cached so frequent refreshes do not keep `WmiPrvSE.exe` busy. Public-IP lookup runs off the UI thread with a timeout, exposes provider cache metadata in Details, is invalidated by manual Refresh Now/F5, and does not scan remote hosts or test firewall exposure. | | `SensorReadoutForm.NetworkTools.cs` | Explicit Network Tools workflow | Provides the keyboard-accessible IP/host lookup dialog, DNS and reverse-DNS resolution, IPv4/IPv6 scope classification, optional bounded ping test, and public-address metadata lookup. | Runs only on user request, never sends private/local/special-use addresses to the online provider, and performs no speed test, port scan, history, or background polling. | | `SensorReadoutForm.Onboarding.cs` | First-run setup, tips, and settings reset | Shows the initial setup wizard for global hotkeys, the Help-menu hints and tips dialog, optional startup tips, and the Preferences-triggered delete-all-settings restart flow. | Keeps onboarding and recovery UI out of the main form constructor and Preferences implementation. | | `SensorReadoutForm.Overview.cs` | Performance/Overview inventory rows | Builds Windows, firmware, motherboard, graphics summary, accessibility-state, and system uptime overview rows. | Printer overview rows are added by `SensorReadoutForm.Printers.cs`; data-source rows are added by `SensorReadoutForm.TrendsAndSources.cs`. | | `SensorReadoutForm.Performance.cs` | Live performance rows | Builds CPU, memory, paging file, physical-plus-virtual memory, GPU memory, GPU engine, and performance-counter rows for the Performance category. | Keeps fast live refresh logic separate from heavier WMI inventory/detail code; paging file WMI and GPU adapter status WMI are cached so live refresh remains light. Live GPU memory and engine counters remain live. | | `SensorReadoutForm.Pci.cs` | PCIe and expansion-slot inventory | Adds Performance/Overview rows for Windows-reported system slots and PCIe current/maximum link width and speed where Windows configuration-manager properties expose them. | Uses Windows-provided slot and PnP names first, skips obvious dummy devices, formats PCIe generations from Windows link-speed codes, and exposes PnP child-list helpers used by NVMe disk matching. | | `SensorReadoutForm.RegistryFormatting.cs` | Registry value formatting | Converts registry values, binary strings, and DWORD/QWORD-like data into readable text. | Shared by display, device, USB, audio, printer, and GPU detail code. | | `SensorReadoutForm.Storage.cs` | SMART, disk, and storage topology | Collects Windows SMART, physical/logical disk, connected-disk total/used/free summaries, NVMe PCIe link generation/width where Windows exposes matching controller data, SATA connection rows supplied by the SATA partial, direct NVMe SMART fallbacks, BitLocker drive status, logical disk performance counters, and disk/partition/volume Details. | Includes fixed and ready removable logical drives, Windows Storage logical and physical sector-size fields where available, explicitly labels Win32 `BytesPerSector` as logical sector size, backs off failing Windows Storage reliability-counter queries, includes BitLocker details where Windows exposes them, NVMe controller-to-disk matching through PnP child relationships, direct NVMe health-log fallbacks for USB/NVMe bridge cases where Windows permits access, and delegates richer inventory to the storage-inventory partial. | | `SensorReadoutForm.StorageInventory.cs` | Extended storage inventory and file-system identification | Merges Windows Storage disk, partition, and volume metadata; lists persistent mapped network drives; and performs bounded read-only APFS and EXT2/EXT3/EXT4 identification for unmounted partitions. | Does not mount file systems, alter disks, or inspect user files. APFS support is container-level; raw access is attempted only where Windows permits it, and sensitive storage fields are filtered from anonymized reports. | | `SensorReadoutForm.StorageSata.cs` | SATA connection details | Adds SATA connection rows for Windows Storage SATA physical disks and tries ATA IDENTIFY DEVICE data for current/maximum SATA link generation where Windows exposes it. | Falls back to Windows Storage physical location, such as integrated port information, rather than guessing link speed from model names or marketing labels. | | `SensorReadoutForm.Tasks.cs` | Current process summary and inventory rows | Collects compact current-activity rows for the highest CPU, memory, GPU, and GPU-memory processes, plus a read-only running-process list with Details/file-location support where Windows exposes the required process and GPU performance counters. | Exposes only stable summary rows as normal selectable readouts for tray/spoken hotkeys instead of turning every temporary process ID into an alarm or hotkey candidate. Tasks rows are removed from anonymized reports because process names can reveal program usage. | | `SensorReadoutForm.SpokenHotkeysCategory.cs` | Spoken hotkey mirror rows | Builds the Spoken Hotkeys category from the notification-area status profile and configured spoken hotkey profiles, resolving each configured reading against the current live rows. | Makes hotkey contents visible in the main tree for sighted users without changing the actual hotkey profiles. Mirror rows are removed from anonymized reports because custom profile names and selected readings can reveal personal workflow. | | `SensorReadoutForm.WmiHelpers.cs` | Shared WMI helpers | Provides timeout-bound WMI query execution with deterministic result cleanup, optional query telemetry, WMI value extraction, WMI date parsing, firmware/Secure Boot helpers, numeric conversion helpers, and common WMI text cleanup. | Used by device, display, printer, storage, overview, and detail collectors. When Debug logging is enabled, Sensor Readout logs its own WMI query scope, query text, duration, and failures for provider troubleshooting. | | `SensorReadoutForm.SelfTest.cs` | Internal build-time self-tests | Runs the non-interactive `--self-test` workflow used by `Build.ps1 -SelfTest`, exercising settings persistence, global hotkey safety validation, collection, USB SuperSpeedPlus speed decoding, listening-port Details splitting, tree navigation, tree expansion preference modes, tray text, conditional spoken-readout skipping, quick tray/spoken hotkey assignments, alarm spoken-message persistence, fan curves, same-scope UI mnemonic uniqueness, installed-app registration metadata, fragile WMI row caches, report content/payload/privacy sanity, ZIP report selection, static-report speech wording, diagnostics ZIP creation, language/manual presence including stale shortcut wording, conservative bundled plug-in manifest repair, and the exact temporary updater-launcher dependency layout. | Intended for release and development checks on a disposable app copy; not a user-facing diagnostic feature. | | `SensorReadoutForm.SettingsTransfer.cs` | Settings transfer | Exports and imports selective settings/profile packages, shows category checklists, resolves portable reading keys through the shared conservative resolver, carries custom spoken labels with imported hotkey readings, and imports hardware-bound items without active bindings. | Used by File > Export settings and profiles and File > Import settings and profiles. Hidden items also carry hidden category keys and custom category order. | | `SensorReadoutForm.SettingsAndFiles.cs` | Settings and folders | Loads/saves per-computer JSON settings, migrates old top-level config/log files into `Config` and `Logs`, resolves app folders case-insensitively, backs up and removes nested duplicate update folders, removes obsolete root DLL/script files after the Resource-folder layout, normalizes/rejects unsafe global hotkey strings, normalizes shared spoken-feedback options, and manages hidden reading persistence. | Keeps portable folder organization and backward compatibility together. Recovered stale update folders are zipped under `Backups`. | | `SensorReadoutForm.StartupAndPrerequisites.cs` | Startup helpers and prerequisites | Checks/installs prerequisites, detects PawnIO, launches the `Install_Scripts` installer flow, offers optional Core Temp support, manages admin/elevation-related startup checks, creates/removes the Windows logon scheduled task used for Run at startup, cleans up legacy startup shortcuts/Run-key entries, and schedules first-refresh behavior. | Supports first-run and missing-driver guidance. The startup task runs with highest privileges so installed copies can start at logon despite the app's administrator manifest. Existing matching tasks are left untouched; ordinary startup must not delete and recreate persistence entries. | | `SensorReadoutForm.TrendsAndSources.cs` | Reading history and data sources | Adds the Performance/Overview data-source summary rows and optional selected-reading CSV history logging. | Makes source transparency visible in the app and gives temporary troubleshooting trends without adding a database or heavy background monitor. | | `SensorReadoutForm.Updates.cs` | Update checking and installer flow | Checks GitHub Releases, parses update metadata, shows update-available dialog, supports quiet update installs, handles the optional close/install/reopen confirmation, formats release notes, selects ZIP assets, accepts local update ZIPs from File > Open report or update, and launches the temporary .NET updater copy. | The replacement work lives in `Program.Updater.cs`; the normal update UI remains here. Used by Help > Check for updates, optional startup update checks, and local update ZIP installs. | | `SensorReadoutForm.Usb.cs` | USB inventory | Collects USB devices, hubs, controllers, speeds, power where exposed, drive letters, safe-to-unplug status, USB network MAC/OUI data, storage hardware IDs, and detailed copyable fields. | Uses Windows device information plus the bundled `usb.ids` and OUI databases. USB SuperSpeedPlus lane-speed data is decoded from Windows hub connection data and guarded by self-test. Shared Details dialog handling lives in `SensorReadoutForm.Details.cs`. | | `SensorReadoutForm.Details.cs` | Details dialog and related actions | Shows the grouped Details tree, handles Details search/review/copy/copy-value/copy-matching actions, expands/collapses Details groups, formats detail labels, and opens allow-listed related Windows Settings pages or file locations. | Shared by every row with Details; raw WMI/registry fields stay grouped so they do not interrupt practical fields in the main tree. | | `SensorReadoutForm.WmiRecovery.cs` | WMI recovery guard | Probes core WMI before slow Windows inventory refreshes and, when running elevated, makes one guarded `winmgmt` restart attempt for the specific stuck-provider failure that reports the paging file is too small. | Avoids silently leaving USB, Devices, Battery, and other WMI-backed sections blank after Windows WMI wedges, while refusing to restart WMI repeatedly or for unrelated missing-data cases. | | `SensorReadoutForm.Wifi.cs` | Wi-Fi radio details | Uses the Windows WLAN API to collect connected Wi-Fi details such as SSID, access point, signal percentage, RSSI, channel, channel width, frequency, radio type, link speeds, and security fields. | Rows are merged into the normal Network category and can be selected for tray or spoken hotkey output. Channel width is derived only from bounds-checked HT, VHT, HE, or EHT connection information elements; malformed or ambiguous data is omitted. Native BSS-list parsing caps Windows' reported item count to the returned buffer size so changing access-point lists cannot walk past the WLAN API buffer. | | `UsbIdDatabase.cs` | USB vendor/product lookup | Loads the bundled `usb.ids` file and resolves USB VID/PID pairs into friendlier vendor and product names. | Used by the USB category and USB detail view. | | `PlugInZipImporter.cs` | Plug-in ZIP import | Validates imported plug-in ZIP files, finds the manifest, checks the plug-in id, prompts before replacing an existing plug-in folder, and copies the plug-in into `Plug-Ins`. | Imported plug-ins stay disabled until the user enables them in Preferences. | | `server\remote-monitor\sensor_readout_server.py` | Independent Linux remote relay | Implements the same authenticated opaque snapshot, delta, heartbeat, machine-index, removal, and encrypted command protocol as the built-in Windows host using only the Python standard library. | Stores no monitoring password or readable sensor rows, rotates bounded logs, and enforces configured request concurrency/backlog/timeouts, payload and command limits, per-space and global computer counts, per-computer and global storage ceilings, and stale-computer retention. It is packaged as the separate `SensorReadout-Server-.zip` release asset. Wildcard listeners require an explicit root public URL and are never exported as connection addresses. | | `server\remote-monitor\sensor_readout_server_control.py` | Verified Linux install, setup, update, and service control | Verifies the package allow-list, version, and SHA-256 manifest; offers terminal-guided private-network or HTTPS installation and post-install setup; creates the service configuration; installs versioned releases; atomically activates `current`; manages systemd; checks health; and restores the previous release or settings after a failed deployment, setup, update, or rollback. | Managed installs enable a daily randomized update timer by default. Online updates accept only stable `server-vX.Y.Z` releases with exactly one matching server archive, require GitHub's SHA-256 digest plus the internal package manifest, and ignore Windows client releases. Settings, access token, encrypted data, and three verified releases are preserved; explicit non-interactive commands remain available for automation. | | `server\remote-monitor\Manual.html` | Linux server installation and operations manual | Provides the recommended guided install, post-install checks, update and rollback commands, security model, settings reference, storage-endurance behavior, and advanced service notes. | Useful complete commands have accessible local-file copy buttons. Placeholder syntax is clearly labelled and deliberately has no copy button. | | `server\remote-monitor\test_sensor_readout_server.py` | Linux relay protocol and resource-limit tests | Exercises authentication, versioned health checks, snapshot/delta/heartbeat/index behavior, sequence recovery, payload and delta limits, compaction, token validation, concurrent registration, global and per-space computer quotas, global and per-computer storage limits, retention, command bounds, removal, safe connection-file generation, redacted logs, and opaque command queue round trips. | Run automatically with all `test_*.py` files by `Build.ps1`; not included in the server release package. | | `server\remote-monitor\test_sensor_readout_server_control.py` | Linux package, installer, setup, update, and rollback tests | Exercises package allow-list, version and SHA-256 verification, tamper rejection, settings/token preservation, guided private-network and HTTPS choices, post-install setup, dedicated update-channel selection, release-digest and archive rejection, automatic-update timer generation, invalid input, cancellation, unattended behavior, connection-file ownership and collision handling, service activation, and failed install/setup/rollback restoration. | Uses isolated temporary layouts and mocked service operations; it does not alter systemd, contact GitHub, or deploy a live server. | | `server\community-stats\submit.php` | Community stats receiver | Accepts opt-in JSON payloads, rebuilds them through a server-side allow-list, normalizes safe aggregate buckets, and stores one aggregate entry per anonymous client hash. | Does not use IP address, user agent, or hardware-derived identifiers as the stored client key. | | `server\community-stats\index.php` | Community stats page | Displays aggregate hardware, accessibility setup, configuration, and coverage counts from the stored community stats JSON. | Shows only aggregate coverage data, not individual full reports or redundant internal data-source lists; normalizes older stored CPU vendor/type buckets when architecture clearly identifies ARM, and counts submissions without a detected screen reader under a visible "None detected" bucket. | | `Docs\Coding-agent-plug-in-rules.md` | Coding-agent plug-in boundary rules | Tells coding agents and contributors to keep existing plug-in work inside the relevant `PlugIns\...` folder and not touch Sensor Readout core code unless a generic SDK/host limitation is explicitly approved. | Intended to prevent vendor-specific plug-in changes from spilling into app-wide code. | | Source file | Main responsibility | What it does | Notes | | --- | --- | --- | --- | | `src\PluginSdk\PluginSdk.cs` | Plug-in SDK | Defines `ISensorReadoutPlugin`, optional `IPluginLifecycle`, `IPluginContext`, `PluginInfo`, `MachineInfo`, and `SensorReading` for third-party plug-ins. | Built as `SensorReadout.PluginSdk.dll` and shipped under `Resources`. `IPluginContext.DiagnosticsMode` lets plug-ins keep live refresh conservative while still collecting deeper support data during diagnostics. `IPluginLifecycle.Shutdown` lets background plug-ins stop work and release handles when disabled, reloaded, or closed. | | `PlugIns\Framework\plugin.json` | Framework manifest | Describes the Framework plug-in and declares Help-menu support links for Framework BIOS and Drivers plus Framework Control. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\Framework\src\FrameworkPlugIn.cs` | Framework Laptop plug-in | Reads Framework Control's local API, and optional Framework EC helper tools, to expose Framework-specific temperature and fan rows. | Shipped disabled by default like every plug-in. | | `PlugIns\HP\plugin.json` | HP manifest | Describes the HP plug-in and declares Help-menu support links for HP Support Assistant and OMEN Gaming Hub. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\HP\src\HPPlugIn.cs` | HP hardware plug-in | Checks HP/OMEN/Victus WMI interfaces for optional OEM hardware diagnostics. | Experimental, read-only, and disabled by default. | | `PlugIns\DellLatitude\plugin.json` | Dell manifest | Describes the Dell Latitude plug-in and declares a Help-menu support link for Dell Command \| Monitor. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\DellLatitude\src\DellLatitudePlugIn.cs` | Dell Latitude plug-in | Checks Dell Command \| Monitor WMI classes for additional Dell temperature and fan readings when the user enables the plug-in. | Experimental, read-only, and disabled by default. | | `PlugIns\HuaweiMateBook\plugin.json` | Huawei manifest | Describes the Huawei MateBook Support plug-in and declares Help-menu support links for Huawei support and Huawei PC Manager. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\HuaweiMateBook\src\HuaweiMateBookPlugIn.cs` | Huawei MateBook plug-in | Detects Huawei/Honor MateBook-style systems and runs the bundled Huawei helper to expose live fan RPM where Huawei PC Manager's local hardware SDK makes it available. | Experimental, read-only, disabled by default, keeps Huawei SDK calls outside the main process, backs off when the SDK is unavailable, and rejects timed-out or partial helper output. | | `PlugIns\HuaweiMateBook\helper\HuaweiMateBookHelper.cs` | Huawei SDK helper process | Loads Huawei PC Manager's local `HardwareSdk.dll`, reads Fan0/Fan1 RPM plus selected temperature probes, prints a tiny line-based result, and exits without letting Huawei SDK teardown hang Sensor Readout. | Built as `HuaweiMateBookHelper.exe` by `Build.ps1` and shipped beside the Huawei plug-in DLL. | | `PlugIns\AsusRog\plugin.json` | Asus manifest | Describes the Asus ROG Support plug-in and declares a Help-menu support link for G-Helper. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\AsusRog\src\AsusRogPlugIn.cs` | ASUS laptop plug-in | Checks ASUS ATKACPI first, falls back to timeout-bound ASUS WMI read probes with deterministic result cleanup, reports fan tachometer data where exposed, and attempts supported fan control only on explicitly recognised gaming laptop families. | Experimental, disabled by default, read-only on other ASUS systems, refuses a reset when the current firmware mode cannot be read safely, and includes its own third-party notice/GPL text. | | `PlugIns\LenovoThinkPad\plugin.json` | Lenovo manifest | Describes the Lenovo Laptop plug-in and declares Help-menu support links for Lenovo Vantage and Lenovo System Update. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.cs` | Lenovo Laptop plug-in orchestration | Detects Lenovo/ThinkPad/ThinkBook/IdeaPad/Yoga/Legion/LOQ systems, keeps short live and separate diagnostics caches, and coordinates the focused Lenovo partial files. | Experimental, read-only, disabled by default, and deliberately avoids embedded-controller fan control. Normal refresh uses conservative targeted probes; diagnostics mode adds deeper storage and Lenovo WMI discovery for support reports. Feature probes are split into the focused Lenovo partial files below. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Fans.cs` | Lenovo fan probes | Checks Lenovo fan WMI, Lenovo fan test data, Windows `Win32_Fan`, and ACPI fan device presence. | Keeps live fan and fan-capability probing separate from battery, storage, and discovery code. Failed or missing Lenovo fan classes are backed off so normal refresh does not repeat expensive failed WMI probes indefinitely. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Thermal.cs` | Lenovo thermal probes | Checks Lenovo thermal-driver presence, ACPI thermal zones, thermal throttle state, and system thermal state. | Read-only thermal visibility only; no platform thermal policy is changed. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Battery.cs` | Lenovo battery health probes | Reads ACPI battery cycle count, full-charge/design capacity, chemistry, manufacturer, voltage, manufacture date, and related static battery fields where exposed. | Used for deeper Lenovo/ACPI battery detail without cluttering the plug-in entry point. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.BatteryStatus.cs` | Lenovo battery status/runtime probes | Reads battery status, charge/discharge rate, voltage, estimated runtime, power state, and Lenovo/IdeaPad battery information. | Kept separate because status/runtime rows are larger and update-oriented compared with static battery health. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Storage.cs` | Lenovo storage health probes | Reads Windows Storage physical-disk health, temperature, wear, reliability counters, and operational state where Windows exposes them. | Storage probing remains read-only and uses Windows Storage WMI. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Discovery.cs` | Lenovo WMI discovery | Discovers Lenovo/vendor WMI classes, records selected class schemas and instance snapshots, and reads generic sensor-like Lenovo classes. | Diagnostics-oriented support code for finding future safe Lenovo readings. | | `PlugIns\LenovoThinkPad\src\LenovoThinkPadPlugIn.Helpers.cs` | Lenovo plug-in helpers | Contains shared WMI identity, timeout-bound WMI searcher creation, deterministic object cleanup, optional WMI class-presence checks, unavailable-provider backoff, formatting, strict fan-speed parsing, numeric conversion, stable identifier, and cloning helpers used by the Lenovo partials. | Keeps mechanical helper code out of the probe-specific files and centralizes WMI guardrails for Lenovo systems with fragile provider behaviour. | | `PlugIns\MsiLaptop\plugin.json` | MSI manifest | Describes the MSI Laptop plug-in and declares Help-menu support links for MSI Center and MSI Support. | Manifest links appear only when the plug-in is enabled. | | `PlugIns\MsiLaptop\src\MsiLaptopPlugIn.cs` | MSI Laptop plug-in | Checks MSI ACPI WMI, Windows fan, and ACPI thermal-zone interfaces for additional MSI temperature, fan, and fan-control rows when the user enables the plug-in. | Experimental and disabled by default. On compatible MSI models it exposes CPU/GPU MSI fan-table controls; manual writes capture the original table/mode first, and automatic/default restores the original state when available. | | `PlugIns\Corsair\plugin.json` | Corsair manifest | Describes the bundled Corsair iCUE Link and PSU Support plug-in and links to the public protocol-research projects used to cross-check its implementation. | Disabled by default. The plug-in has its own GPL notice and license because part of the protocol research came from GPL-licensed projects. | | `PlugIns\Corsair\src\CorsairPlugIn.cs` | Corsair plug-in entry point | Starts the single background monitoring worker, returns immutable cached sensor snapshots without blocking normal refresh, routes fan-control calls to the worker, and exposes lifecycle shutdown. | Implements the sensor, fan-control, and lifecycle interfaces. Control calls are gated by a parse-only identifier check, so foreign identifiers cost no hardware access. | | `PlugIns\Corsair\src\CorsairPlugIn.Rows.cs` | Corsair row projection | Converts supported iCUE LINK Hub and HXi/RMi digital PSU snapshots into temperature, fan, voltage, power, and fan-control readings with stable internal identifiers and privacy-safe visible names. | Multi-hub visible labels use neutral numbering rather than serial fragments, and raw device IDs are kept out of ordinary Details. Control rows carry safety notes, and the semi-passive PSU fan control carries the `Zero RPM capable` marker. | | `PlugIns\Corsair\src\CorsairWorker.cs` and `CorsairWorker.Devices.cs` | Corsair monitoring and control worker | Owns Corsair HID sessions on one background thread, performs bounded polling and rescans, publishes cloned snapshots, backs off failed devices, routes bounded fan-control calls, remembers the user's control intent across reconnects, and releases sessions on disable or shutdown. | Nothing is written unless a fan control is used. Shutdown restores the power supplies first, then the hubs, because a PSU left in manual mode keeps that duty until it is power-cycled. | | `PlugIns\Corsair\src\CorsairLinkHubDevice.cs`, `CorsairHidPsuDevice.cs`, and `CorsairHidTransport.cs` | Corsair HID protocol and transport | Implements bounded, guard-aware HID discovery, read, and duty-write transactions for allow-listed iCUE LINK Hub and HXi/RMi product IDs. | Response echo/type checks reject unrelated packets rather than presenting unverified readings. Pump channels are floored at 50 percent and a PSU request below 30 percent hands the fan back to the PSU. Corsair iCUE must be closed because it does not use the shared Corsair device guard. | | `PlugIns\Corsair\tests\CorsairPluginSelfTest.cs` | Corsair no-hardware self-test | Exercises the release interface surface, the control-identifier gate, packet bounds, response matching, protocol parsers, known-device mapping, numeric decoding, row generation, privacy, and lifecycle restart behavior without requiring Corsair hardware. | Compiled and run automatically by `Build.ps1`; the test binary is not packaged. It never starts the worker, so no control call in it can reach hardware. |