PopulatePackages' "configured but not currently loaded" pass-through could
still emit PackageVersion entries with a null/empty Version, reintroducing
the schema issue the loaded-reflection branch's own guard already prevents
(downstream parsers drop entries whose version isn't a string).
Remove ConnectedClientVersionInfo and the per-client version dictionary in
MobileControlSystemController, which grew unbounded and depended on a UI
client connecting and self-reporting its APP_VERSION.
Add TouchpanelWrapperAppVersionChecker, which instead scans the deployed
mcUserApp files on disk for the configured versions.touchpanelWrapperApp
version string. This works without any client connected and doesn't
accumulate state. Wired into the mobileinfo console command output.
Matches the convention used by the other request handlers in this
folder (ReportVersionsRequestHandler.cs, AppDebugRequestHandler.cs,
etc). Addresses PR #1441 review comment.
Backports PepperDash/Essentials#1439 (merged to main at 6ceddcf5) onto
dev/v3-routing (v3.0.0-dev-v3-routing.40):
- New GET /packageManifest CWS route reporting Essentials/plugin/touchpanel
UI package version info (GetPackageManifestRequestHandler).
- EssentialsConfig.Versions now round-trips via [JsonProperty("versions")].
- ConfigReader now detects v1 vs v2 config by presence of system/template
nodes (previously any versions node caused the v1->v2 merge to be
skipped), and re-applies the versions node after merge since
PortalConfigReader.MergeConfigs does not carry it forward.
- Mobile control: track and validate UI client app versions
(ConnectedClientVersionInfo, MobileControlSystemController changes merged
cleanly from the PR).
- Directory.Build.props: adds PackageId AssemblyMetadata item (kept this
branch's 3.0.0-local version).
Conflict resolution notes:
- This branch had already introduced its own AppVersion type (Version +
RepoUrl only) for TouchpanelWrapperApp/UserInterfaces. Replaced it with
the PR's unified NugetVersion (adds PackageId/RepoUrl/Name, all
NullValueHandling.Ignore) to match main's schema, since AppVersion had
no other references in the codebase.
- ConfigReader.LoadConfig on this branch had already fixed a double
Stream.ReadToEnd() bug (reading fileContents once); kept that fix and
layered the PR's v1/v2 detection fix + versions-node preservation on
top of it, plus this branch's null-ConfigObject-after-merge guard.
- EssentialsWebApi.SetupRoutes: inserted the new packageManifest route
into this branch's existing (longer) route list, which already
includes routing-specific endpoints not present on main.
Builds clean (dotnet build on the full solution, 0 errors).
Not pushed - pending local hardware/config testing before push.
feat: update MobileControlConfig to enable messenger subscriptions by default
fix: improve HandleBatchDeviceFullStatus to support granular device status requests and enhance error handling
Both analog 101 (FromSIMPL select) and analog 104 (ToSIMPL feedback echo)
were described "Directory Select Row and Feedback", implying the feedback
was on 101. Clarified: 101 = "Directory Select Row"; 104 = "Directory
Selected Row FB".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
PhoneHookState (ToSIMPL) was labeled "Dial Phone" — a copy of the
DialPhone input description on the same join. Changed to "Phone hook
state FB" to accurately describe the feedback.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
DirectoryLineSelected (digital 101, FromSIMPL) had no handler anywhere in
VideoCodecBase.cs — directory selection is driven by analog 101
(DirectorySelectRow). DirectoryEntryIsContact (ToSIMPL) already documents
the output side of that join. Removed the dead inbound entry.
SelfviewPositionFb (serial 211) description "advance selfview position"
read like a command; updated to "Current selfview PIP position string FB"
to accurately reflect that it is a ToSIMPL feedback.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>