From 0244b0e585d90dcf2b2927ef273f9d95e773a461 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Wed, 27 May 2026 19:04:32 -0600 Subject: [PATCH] feat: Add IBasicVolumeControlsMessenger and update MessengerFactoryRegistry for volume control integration --- .../IBasicVolumeWithFeedbackAdvanced.cs | 5 +++++ .../Devices/LevelControlListItem.cs | 2 +- ...nger.cs => IBasicVolumeControlsMessenger.cs} | 17 +++++++++++++---- .../MessengerFactoryRegistry.cs | 10 +++++++++- 4 files changed, 28 insertions(+), 6 deletions(-) rename src/PepperDash.Essentials.MobileControl.Messengers/Messengers/{DeviceVolumeMessenger.cs => IBasicVolumeControlsMessenger.cs} (88%) diff --git a/src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedbackAdvanced.cs b/src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedbackAdvanced.cs index f0a018c5..5baece21 100644 --- a/src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedbackAdvanced.cs +++ b/src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedbackAdvanced.cs @@ -14,5 +14,10 @@ namespace PepperDash.Essentials.Core /// Gets the volume level units /// eVolumeLevelUnits Units { get; } + + /// + /// Gets the maximum volume level + /// + int MaxVolumeLevel { get; } } } \ No newline at end of file diff --git a/src/PepperDash.Essentials.Core/Devices/LevelControlListItem.cs b/src/PepperDash.Essentials.Core/Devices/LevelControlListItem.cs index 04f14ac9..229197f3 100644 --- a/src/PepperDash.Essentials.Core/Devices/LevelControlListItem.cs +++ b/src/PepperDash.Essentials.Core/Devices/LevelControlListItem.cs @@ -8,7 +8,7 @@ namespace PepperDash.Essentials.Core; /// /// Represents a level control item in a list, which can be used to control volume or mute functionality. /// -public class LevelControlListItem : AudioControlListItemBase +public class LevelControlListItem : AudioConptrolListItemBase { /// diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DeviceVolumeMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IBasicVolumeControlsMessenger.cs similarity index 88% rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DeviceVolumeMessenger.cs rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IBasicVolumeControlsMessenger.cs index ff38a784..91b01f78 100644 --- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DeviceVolumeMessenger.cs +++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IBasicVolumeControlsMessenger.cs @@ -9,19 +9,19 @@ using PepperDash.Essentials.Core; namespace PepperDash.Essentials.AppServer.Messengers { /// - /// Represents a DeviceVolumeMessenger + /// Represents a IBasicVolumeControlsMessenger /// - public class DeviceVolumeMessenger : MessengerBase + public class IBasicVolumeControlsMessenger : MessengerBase { private readonly IBasicVolumeControls device; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The key. /// The message path. /// The device. - public DeviceVolumeMessenger(string key, string messagePath, IBasicVolumeControls device) + public IBasicVolumeControlsMessenger(string key, string messagePath, IBasicVolumeControls device) : base(key, messagePath, device) { this.device = device; @@ -40,6 +40,7 @@ namespace PepperDash.Essentials.AppServer.Messengers { Volume = new Volume { + Label = device.Name, Level = feedbackDevice?.VolumeLevelFeedback.IntValue ?? -1, Muted = feedbackDevice?.MuteFeedback.BoolValue ?? false, HasMute = true, // assume all devices have mute for now @@ -50,6 +51,7 @@ namespace PepperDash.Essentials.AppServer.Messengers { messageObj.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString(); messageObj.Volume.Units = volumeAdvanced.Units; + messageObj.Volume.MaxLevel = volumeAdvanced.MaxVolumeLevel; } PostStatusMessage(messageObj, id); @@ -155,6 +157,7 @@ namespace PepperDash.Essentials.AppServer.Messengers { message.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString(); message.Volume.Units = volumeAdvanced.Units; + message.Volume.MaxLevel = volumeAdvanced.MaxVolumeLevel; } PostStatusMessage(JToken.FromObject(message)); @@ -220,5 +223,11 @@ namespace PepperDash.Essentials.AppServer.Messengers [JsonConverter(typeof(StringEnumConverter))] [JsonProperty("units", NullValueHandling = NullValueHandling.Ignore)] public eVolumeLevelUnits? Units { get; set; } + + /// + /// Gets or sets the MaxLevel. Defaults to 65535, which is the standard for Crestron devices. This is used by the mobile control app to determine how to scale the volume level for display and input purposes. + /// + [JsonProperty("maxLevel", NullValueHandling = NullValueHandling.Ignore)] + public int MaxLevel { get; set; } = 65535; } } \ No newline at end of file diff --git a/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs b/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs index e3454031..1b81a5b0 100644 --- a/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs +++ b/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs @@ -14,6 +14,7 @@ using PepperDash.Essentials.Devices.Common.Codec; using PepperDash.Essentials.Devices.Common.VideoCodec; using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces; using PepperDash.Essentials.Room.MobileControl; +using PepperDash.Essentials.RoomBridges; namespace PepperDash.Essentials { @@ -134,7 +135,7 @@ namespace PepperDash.Essentials // ── Audio / Video ───────────────────────────────────────────────────────── new MessengerFactoryEntry( typeof(IBasicVolumeControls), - (d, mp, ck) => new DeviceVolumeMessenger( + (d, mp, ck) => new IBasicVolumeControlsMessenger( $"{d.Key}-volume-{ck}", mp, (IBasicVolumeControls)d) ), new MessengerFactoryEntry( @@ -404,6 +405,13 @@ namespace PepperDash.Essentials (d, mp, ck) => new ILevelControlsMessenger( $"{d.Key}-levelControls-{ck}", mp, (ILevelControls)d) ), + + // ── Essentials Room ───────────────────────────────────────────────────────── + new MessengerFactoryEntry( + typeof(IEssentialsRoom), + (d, mp, ck) => new MobileControlEssentialsRoomBridge( + (IEssentialsRoom)d) + ), }; } }