Commit graph

4195 commits

Author SHA1 Message Date
Nick Genovese
25693c7071 fix: Add debug logs for touchscreen slot selection in controller
Improved logging to indicate which touchscreen slot is used during Mpc4TouchpanelController initialization. Updated error log to report processor.TouchscreenType for clearer diagnostics.
2026-08-12 14:40:54 -04:00
Nick Genovese
8c56623641 fix: Support multiple MPC4 touchscreen slot types in ctor
Updated Mpc4TouchpanelController constructor to assign _touchpanel from the first available slot among MPC4x102, MPC4x201, MPC4x301, or MPC4x302 touchscreen slots, improving compatibility with various MPC4 touchscreen models.
2026-08-12 14:17:50 -04:00
Nick Genovese
31fd665594 fix: Simplify touchscreen slot selection logic
Replaced switch statement for touchscreen type selection with a single cast assignment to MPC3Basic. This streamlines initialization and removes explicit handling for each touchscreen type. Error logging is retained for failed casts.
2026-08-12 12:44:43 -04:00
Nick Genovese
d713d65c7a fix: Refactor touchpanel init and error logging
Change _touchpanel type to MPC3Basic. Update constructor to select touchscreen slot by TouchscreenType using switch. Improve error logging with error level and detailed type info.
2026-08-12 12:35:21 -04:00
Nick Genovese
f5d6a076ad feat: Add Mpc4TouchpanelController for MPC4 processors
Introduced Mpc4TouchpanelController to manage touchpanel behavior for MPC4 class processors, including button initialization, feedback, and event handling. Updated ControlSystem.cs to detect MPC4 models, deserialize button configs, and register the controller with DeviceManager.
2026-08-12 11:22:03 -04:00
Andrew Knous
e23c987516
Merge pull request #1448 from PepperDash/fix-cecportcontroller-null-streamcec-guard
Fix cecportcontroller null streamcec guard
2026-07-16 09:40:19 -04:00
copilot-swe-agent[bot]
14cd082076
Remove redundant IRoutingInputsOutputs filtering in route mapping loops 2026-07-16 13:26:25 +00:00
copilot-swe-agent[bot]
36c15b8d95
Clarify CecPortController subscription XML comment 2026-07-16 13:25:25 +00:00
erikdred
fbf4c56403
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 09:23:18 -04:00
erikdred
f4cb17314d
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 09:21:45 -04:00
Erik Meyer
aa76551500 fix: guard CecPortController against null StreamCec and lazily subscribe 2026-07-16 08:40:33 -04:00
Neil Dorin
12828e8dd4
Merge pull request #1446 from PepperDash/feature-add-iHasDspPresetSave
feat: add IHasDspPresetSave interface for DSP preset management
2026-07-14 11:29:44 -06:00
Jonathan Arndt
4dca16e9bd
fix: Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-13 16:09:45 -07:00
Jonathan Arndt
d4284bd59f
fix: Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-13 16:08:10 -07:00
Jonathan Arndt
a8ec831064 feat: add IHasDspPresetSave interface for DSP preset management 2026-07-13 12:58:52 -07:00
Jason DeVito
6ceddcf571
Merge pull request #1439 from PepperDash/feature/version-data-touchpanel-ui-schema
fix(config): version data, packageManifest API, and v1/v2 config detection
2026-07-08 10:25:55 -05:00
jkdevito
02f507ccb1 fix(mobile-control): address PR review feedback on version tracking
- ConnectedClientVersions now deep-copies each ConnectedClientVersionInfo
  when snapshotting, so external callers can't mutate the internally
  tracked, lock-protected instances (Copilot review).
- ShowInfo now prints "(not configured)" for an empty ExpectedAppVersion,
  matching the match/mismatch calculation which already treats empty the
  same as not-configured (Copilot review).
- GetPackageManifestRequestHandler.PopulatePackages filters out null
  entries from the config-supplied packages list before processing, so a
  malformed "packages": [null, ...] in user-edited config JSON degrades
  gracefully instead of throwing (Copilot review).
2026-07-08 10:07:20 -05:00
Jason DeVito
22ef9cf7c2
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-08 09:54:14 -05:00
jkdevito
02216372bc feat(mobile-control): track and validate UI client app versions
Extend the /system/clientJoined handler to accept an optional
`appVersion` field reported by connecting UI clients (e.g. the
React app's build-time APP_VERSION), so Essentials can record and
validate what's actually running against the configured
versions.touchpanelWrapperApp version.

- Add ConnectedClientVersionInfo to capture clientId, roomKey,
  touchpanelKey, reported/expected app version, and last-seen time.
- Add MobileControlSystemController.TrackClientAppVersion(), storing
  results in a new thread-safe ConnectedClientVersions dictionary and
  logging a warning on version mismatch.
- Expose ConnectedClientVersions as a public read-only property for
  diagnostics.
- Surface reported vs. expected versions per client in the
  `mobileinfo` console command output.

No wire protocol changes required; content is passed as-is over the
existing clientJoined message.
2026-07-07 17:41:04 -05:00
jkdevito
c323c872fc fix: match main assembly by PackageId metadata instead of AssemblyName 2026-07-07 17:20:22 -05:00
jkdevito
1e63b10aa4 fix: report main assembly's PackageId (PepperDashEssentials) in packageManifest API 2026-07-07 17:14:34 -05:00
jkdevito
47e186d8f4 fix(config): correctly detect v1 vs v2 config and preserve versions node
- Determine config version by presence of "system" and "template" nodes
  instead of "versions", since a v2 config can also include "versions"
  and was previously being skipped from merging as a result.
- Preserve the "versions" node after merging a v1 config, since
  PortalConfigReader.MergeConfigs does not carry it forward.
2026-07-07 16:55:43 -05:00
jkdevito
2f7789b374 fix: prefer embedded PackageId assembly metadata in packageManifest API
WHAT / WHY
----------
GetPackageManifestRequestHandler previously identified a loaded plugin's
NuGet PackageId by fuzzy-matching AssemblyTitle/AssemblyName against the
config's packageId - a chain that silently fails for any plugin whose
AssemblyTitle/AssemblyName doesn't happen to match its PackageId (verified
against real shipped plugin DLLs; see FINDINGS-nuget-packageid-gaps.md).

epi-symetrix-dsp and epi-shure-mxa have already backported a
Directory.Build.props change that embeds
`<AssemblyMetadata Include="PackageId" Value="$(PackageId)" />`, giving
Essentials an unambiguous, authoritative PackageId via
AssemblyMetadataAttribute("PackageId", ...) instead of guessing. Validated
by building both plugins and inspecting the generated AssemblyInfo.cs.

Changes:
- src/Directory.Build.props: add the same AssemblyMetadata PackageId item,
  so every Essentials-owned assembly (Core, Essentials, Devices.Common,
  MobileControl, MobileControl.Messengers) now embeds its real PackageId
  too - previously none of them did.
- GetPackageManifestRequestHandler.cs:
  - PopulatePackages: read AssemblyMetadataAttribute("PackageId", ...) from
    loaded plugin assemblies and use it as the first-priority match/identity
    signal, ahead of the AssemblyTitle -> AssemblyName -> AssemblyName-minus-
    ".4Series" fallback chain. Loaded-but-unconfigured plugins that carry
    this metadata now report a PackageId in the manifest instead of null.
  - PopulateEssentials: replace the hardcoded "PepperDash.Essentials"
    fallback (which matched none of the real PackageIds) with the reflected
    value from PepperDash.Essentials.Core's own assembly metadata.

Fully backward compatible: plugins without the updated Directory.Build.props
(most existing epi-* repos today) fall through to the prior fallback chain
unchanged.

RECOMMENDATIONS - Essentials & sub-projects (this repo)
--------------------------------------------------------
- AssemblyName/AssemblyTitle drift from PackageId across sub-projects
  (confirmed via generated AssemblyInfo.cs, not assumed):
    PepperDash.Essentials.Core:                 PackageId "PepperDash.Essentials.Core"
                                                 vs AssemblyName "PepperDash_Essentials_Core"
    PepperDash.Essentials.Devices.Common:        PackageId "PepperDash.Essentials.Devices.Common"
                                                 vs AssemblyName "Essentials Devices Common"
    PepperDash.Essentials.MobileControl:         PackageId "PepperDash.Essentials.MobileControl"
                                                 vs AssemblyName "epi-essentials-mobile-control"
    PepperDash.Essentials.MobileControl.Messengers: PackageId "...Messengers"
                                                 vs AssemblyName "mobile-control-messengers"
  Only PepperDash.Essentials and PepperDash.Core happen to agree. Fixing
  AssemblyName changes the physical .dll filename for existing consumers,
  so this needs a deliberate, versioned decision - not bundled here.
- Once this ships and bakes for a release or two, consider deleting the
  now-redundant "PepperDash.Essentials" hardcoded string entirely and the
  Product/AssemblyTitle-based Name fallback, since AssemblyMetadata PackageId
  supersedes both for any assembly built after this change.

RECOMMENDATIONS - EPI plugin repos (epi-*)
-------------------------------------------
- Backport `<AssemblyMetadata Include="PackageId" Value="$(PackageId)" />`
  into every existing epi-* repo's src/Directory.Build.props (recommendation
  E from FINDINGS-nuget-packageid-gaps.md). This is opt-in and additive -
  repos that skip it keep working via the existing fallback chain, but gain
  nothing until they backport it and cut a new release.
- Land the corresponding fix in EssentialsPluginTemplate
  (src/Directory.Build.props + src/epi-make-model.4Series.csproj) so all
  *new* plugin repos get this by default, and fix the template's own
  AssemblyTitle/PackageId drift ("Plugin" vs "Plugins") while there.
- Already-published plugin versions can't be retroactively fixed - this only
  takes effect on a plugin's next release after adopting the template change.

WORKFLOW RECOMMENDATIONS
-------------------------
- Extend workflow-templates' essentialsplugins-4Series-builds.yml "Check
  Package Name" step to validate the built DLL's embedded
  AssemblyMetadataAttribute("PackageId", ...) (and/or AssemblyTitle as a
  fallback) against the repo-derived expected package name - today it only
  compares the .nupkg filename, which would not have caught drift like
  epi-display-samsung-mdc's AssemblyTitle mismatch.
- Sequence this after the template + per-repo backports have landed and
  baked for a release cycle, otherwise it will fail CI for every epi-*
  repo that hasn't picked up the Directory.Build.props change yet. Gate it
  behind the existing bypassPackageCheck input for repos not yet ready.
2026-07-07 16:22:23 -05:00
jkdevito
588057f3ba feat: add packageManifest CWS API route
New GET https://{ip}/cws/app{xx}/api/packageManifest route returning a JSON
package manifest (Essentials + plugins + user interfaces) shaped to hydrate
the vsce-essentials-version-manager extension's VersionsSnapshot object.

- EssentialsConfig.cs: add [JsonProperty("versions")] to EssentialsConfig.Versions
  (was attribute-less); add NugetVersion.Name; NullValueHandling.Ignore on
  PackageId/RepoUrl/Name.
- New GetPackageManifestRequestHandler: deep-copies the config's VersionData
  (never mutates the live config object), then enriches it via reflection:
  - essentials: version from Global.AssemblyVersion, repoUrl/name from the
    RepositoryUrl AssemblyMetadata + AssemblyProduct of
    PepperDash.Essentials.Core's own assembly (PluginLoader.EssentialsAssembly.Assembly
    is null at runtime due to a pre-existing name-matching bug, so this route
    reads its own loaded assembly instead), packageId from config or a constant.
  - packages[]: merges PluginLoader.EssentialsPluginAssemblies (matched to config
    packages by packageId via AssemblyTitle -> AssemblyName -> AssemblyName minus
    a trailing .4Series suffix) with reflection supplying version and filling
    missing repoUrl/name; unmatched loaded assemblies are emitted without a
    packageId; configured-but-not-loaded packages pass through unchanged.
  - userInterfaces/touchpanelWrapperApp are passed through from config as-is.
  - Entries with no resolvable version are skipped (the extension's parser drops
    entries whose version isn't a string).
- EssentialsWebApi.cs: register the new packageManifest route next to versions.

Build verified clean (Core + Essentials program, 0 errors). Not yet tested on
hardware.
2026-07-05 20:57:05 -05:00
jkdevito
64d60dacc2 feat: update version object
Add touchpanelWrapperApp, userInterfaces, and repoUrl to VersionData config schema

VersionData/NugetVersion previously only modeled the essentials and
packages entries under the versions node. This adds support for the
touchpanelWrapperApp (single object) and userInterfaces (array) nodes,
plus a repoUrl property on NugetVersion so it round-trips instead of
being silently dropped, matching the schema produced by the
vsce-essentials-version-manager extension.
2026-07-02 17:13:26 -05:00
Neil Dorin
f34d7223e0
Merge pull request #1438 from PepperDash/set-secrets-formatting 2026-07-02 14:08:32 -06:00
Andrew Welker
68c44e46ae fix: string formatting for console responses was incorrect in some cases and causing exceptions 2026-07-02 15:06:51 -05:00
Neil Dorin
4f1eb979d3
Merge pull request #1436 from PepperDash/claude/deprecate-imobilecontrolmessengerwithsubscriptions 2026-06-26 18:11:17 -06:00
anthropic-code-agent[bot]
8ac4eb7584
refactor: marked mobile control subscription items as obsolete
Co-authored-by: ndorin <18535240+ndorin@users.noreply.github.com>
2026-06-26 22:32:56 +00:00
Neil Dorin
0240887d93
Clarify summary for EnableMessengerSubscriptions property
Updated the summary comment for EnableMessengerSubscriptions property to clarify its purpose.
2026-06-26 15:57:52 -06:00
copilot-swe-agent[bot]
640bd7a8a7
Update XML summary for EnableMessengerSubscriptions to reflect obsolete status 2026-06-26 21:55:49 +00:00
Neil Dorin
2fac0ca926
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-26 14:32:22 -06:00
anthropic-code-agent[bot]
af5611e403
Mark IMobileControlMessengerWithSubscriptions and EnableMessengerSubscriptions as obsolete
All messengers are now subscription based in v3.x, making these
constructs no longer necessary.

Closes #1435

Agent-Logs-Url: https://github.com/PepperDash/Essentials/sessions/bda64c9c-5343-412b-801f-5e60816bc38d

Co-authored-by: ndorin <18535240+ndorin@users.noreply.github.com>
2026-06-26 20:11:48 +00:00
anthropic-code-agent[bot]
3286d27898
Initial plan 2026-06-26 20:09:32 +00:00
aknous
8d3edde28c feat: adds config props to disable power on/off automation 2026-06-17 10:06:00 -04:00
equinoy
a220474101
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:50 -05:00
equinoy
b982219e2f
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:36 -05:00
equinoy
e03e45ccf5
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:25 -05:00
equinoy
a7b839296e
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:14 -05:00
erikdred
a63da82cc3
Merge pull request #1432 from PepperDash/fix/web-debug-url
Fix/web debug url
2026-06-12 17:15:05 -04:00
Neil Dorin
3974455337 fix: add port forward timeout handling in DebugSessionRequestHandler 2026-06-12 15:08:34 -06:00
Neil Dorin
782bb6c057 fix: improve CS LAN IP handling and update fallback debug session URL in DebugSessionRequestHandler 2026-06-12 14:52:35 -06:00
Neil Dorin
907eb2f397 fix: add csIp handling and update debug session URL in DebugSessionRequestHandler 2026-06-12 14:29:49 -06:00
Neil Dorin
72a4c63a06
Merge pull request #1430 from PepperDash/feature/add-escape-handling-for-devjson
Feature/add escape handling for devjson
2026-06-12 11:31:24 -06:00
Neil Dorin
5f26cb98fd
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-12 11:28:39 -06:00
jkdevito
6a4e3d5be2 feat: add port forwarding functionality for debug websocket in DebugSessionRequestHandler 2026-06-12 11:26:56 -05:00
Neil Dorin
d18fca8a98 fix: handle null properties in DeviceMessageBase and DeviceStateMessageBase 2026-06-11 17:36:30 -04:00
aknous
162a06f9e9 feat: adds interface for wireless sharing 2026-06-11 09:41:39 -04:00
Neil Dorin
75587c361f
Merge pull request #1428 from PepperDash/tieline-mapping
Fix cache clearing for impossibleRoutes
2026-06-09 09:25:42 -06:00
Andrew Welker
c3511cd1a6 fix: remove impossibleRoutes cache
The cache wasn't being cleared correctly, and was an unnecessary
add.
2026-06-09 10:18:25 -05:00