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).
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.
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>
Both entries were forward-looking stubs: IHasCodecLayouts has no
string-based layout-select method, so neither join was ever wired in
LinkVideoCodecCameraLayoutsToApi. String-based layout selection is
Zoom-specific (eLayoutStyle enum) and lives on serial 215 in the EPI.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Capability metadata only — no wiring/behavior change. Verified against the actual
LinkToApi wiring and a SIMPL EISC bridge signal dump:
- CameraPresetSelect (a121), FarEndPresetSelect (a122): ToSIMPL -> ToFromSIMPL
(driven as input via SetUShortSigAction, also fed back)
- SelectedContactMethodCount (a102): FromSIMPL -> ToSIMPL ("Reports..." feedback)
- CurrentDialString (s1): ToSIMPL -> ToFromSIMPL (read as the dial input by ManualDial,
echoed back as FB)
- Participant audio/video/pin toggles (d501/801/1101): ToSIMPL -> FromSIMPL (commands)
Makes the generated join-map docs accurate for every video-codec EPI.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Removed ITxRouting and ITxRoutingWithFeedback interfaces as they were redundant.
- Updated RouteDescriptor and RouteSwitchDescriptor to use new feedback interfaces.
- Modified RoutingFeedbackManager to utilize IRoutingSinkWithFeedback and IRoutingMidpointWithFeedback.
- Adjusted GenericAudioOut, BlueJeansPc, and other device classes to implement new feedback interfaces.
- Introduced new messenger classes for IRoutingSinkWithFeedback and IRoutingMidpointWithFeedback.
- Cleaned up unused messenger interfaces and consolidated routing logic.
- Updated MobileControlEssentialsRoomBridge to remove dependency on IHasCurrentSourceInfoChange.
- Implemented IHasCodecCamerasMessenger to handle camera selection and control actions.
- Created IHasCodecLayoutsMessenger for managing codec layouts.
- Developed IHasCodecSelfViewMessenger to manage self-view functionality.
- Added IHasDirectoryMessenger for directory operations including fetching and searching.
- Introduced IHasFarEndContentStatusMessenger to report far-end content status.
- Implemented IPasswordPromptMessenger for handling password prompts.
- Updated VideoCodecBaseMessenger to remove redundant directory and call history handling.
- Registered new messenger types in MessengerFactoryRegistry.
- Added necessary using directives in ControlSystem.cs for UC functionalities.
Co-authored-by: Copilot <copilot@github.com>