feat: Add IBasicVolumeControlsMessenger and update MessengerFactoryRegistry for volume control integration

This commit is contained in:
Neil Dorin 2026-05-27 19:04:32 -06:00
parent 101d6c6e79
commit 0244b0e585
4 changed files with 28 additions and 6 deletions

View file

@ -14,5 +14,10 @@ namespace PepperDash.Essentials.Core
/// Gets the volume level units /// Gets the volume level units
/// </summary> /// </summary>
eVolumeLevelUnits Units { get; } eVolumeLevelUnits Units { get; }
/// <summary>
/// Gets the maximum volume level
/// </summary>
int MaxVolumeLevel { get; }
} }
} }

View file

@ -8,7 +8,7 @@ namespace PepperDash.Essentials.Core;
/// <summary> /// <summary>
/// Represents a level control item in a list, which can be used to control volume or mute functionality. /// Represents a level control item in a list, which can be used to control volume or mute functionality.
/// </summary> /// </summary>
public class LevelControlListItem : AudioControlListItemBase public class LevelControlListItem : AudioConptrolListItemBase
{ {
/// <summary> /// <summary>

View file

@ -9,19 +9,19 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.AppServer.Messengers namespace PepperDash.Essentials.AppServer.Messengers
{ {
/// <summary> /// <summary>
/// Represents a DeviceVolumeMessenger /// Represents a IBasicVolumeControlsMessenger
/// </summary> /// </summary>
public class DeviceVolumeMessenger : MessengerBase public class IBasicVolumeControlsMessenger : MessengerBase
{ {
private readonly IBasicVolumeControls device; private readonly IBasicVolumeControls device;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="DeviceVolumeMessenger"/> class. /// Initializes a new instance of the <see cref="IBasicVolumeControlsMessenger"/> class.
/// </summary> /// </summary>
/// <param name="key">The key.</param> /// <param name="key">The key.</param>
/// <param name="messagePath">The message path.</param> /// <param name="messagePath">The message path.</param>
/// <param name="device">The device.</param> /// <param name="device">The device.</param>
public DeviceVolumeMessenger(string key, string messagePath, IBasicVolumeControls device) public IBasicVolumeControlsMessenger(string key, string messagePath, IBasicVolumeControls device)
: base(key, messagePath, device) : base(key, messagePath, device)
{ {
this.device = device; this.device = device;
@ -40,6 +40,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
{ {
Volume = new Volume Volume = new Volume
{ {
Label = device.Name,
Level = feedbackDevice?.VolumeLevelFeedback.IntValue ?? -1, Level = feedbackDevice?.VolumeLevelFeedback.IntValue ?? -1,
Muted = feedbackDevice?.MuteFeedback.BoolValue ?? false, Muted = feedbackDevice?.MuteFeedback.BoolValue ?? false,
HasMute = true, // assume all devices have mute for now 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.RawValue = volumeAdvanced.RawVolumeLevel.ToString();
messageObj.Volume.Units = volumeAdvanced.Units; messageObj.Volume.Units = volumeAdvanced.Units;
messageObj.Volume.MaxLevel = volumeAdvanced.MaxVolumeLevel;
} }
PostStatusMessage(messageObj, id); PostStatusMessage(messageObj, id);
@ -155,6 +157,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
{ {
message.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString(); message.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString();
message.Volume.Units = volumeAdvanced.Units; message.Volume.Units = volumeAdvanced.Units;
message.Volume.MaxLevel = volumeAdvanced.MaxVolumeLevel;
} }
PostStatusMessage(JToken.FromObject(message)); PostStatusMessage(JToken.FromObject(message));
@ -220,5 +223,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
[JsonConverter(typeof(StringEnumConverter))] [JsonConverter(typeof(StringEnumConverter))]
[JsonProperty("units", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("units", NullValueHandling = NullValueHandling.Ignore)]
public eVolumeLevelUnits? Units { get; set; } public eVolumeLevelUnits? Units { get; set; }
/// <summary>
/// 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.
/// </summary>
[JsonProperty("maxLevel", NullValueHandling = NullValueHandling.Ignore)]
public int MaxLevel { get; set; } = 65535;
} }
} }

View file

@ -14,6 +14,7 @@ using PepperDash.Essentials.Devices.Common.Codec;
using PepperDash.Essentials.Devices.Common.VideoCodec; using PepperDash.Essentials.Devices.Common.VideoCodec;
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces; using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
using PepperDash.Essentials.Room.MobileControl; using PepperDash.Essentials.Room.MobileControl;
using PepperDash.Essentials.RoomBridges;
namespace PepperDash.Essentials namespace PepperDash.Essentials
{ {
@ -134,7 +135,7 @@ namespace PepperDash.Essentials
// ── Audio / Video ───────────────────────────────────────────────────────── // ── Audio / Video ─────────────────────────────────────────────────────────
new MessengerFactoryEntry( new MessengerFactoryEntry(
typeof(IBasicVolumeControls), typeof(IBasicVolumeControls),
(d, mp, ck) => new DeviceVolumeMessenger( (d, mp, ck) => new IBasicVolumeControlsMessenger(
$"{d.Key}-volume-{ck}", mp, (IBasicVolumeControls)d) $"{d.Key}-volume-{ck}", mp, (IBasicVolumeControls)d)
), ),
new MessengerFactoryEntry( new MessengerFactoryEntry(
@ -404,6 +405,13 @@ namespace PepperDash.Essentials
(d, mp, ck) => new ILevelControlsMessenger( (d, mp, ck) => new ILevelControlsMessenger(
$"{d.Key}-levelControls-{ck}", mp, (ILevelControls)d) $"{d.Key}-levelControls-{ck}", mp, (ILevelControls)d)
), ),
// ── Essentials Room ─────────────────────────────────────────────────────────
new MessengerFactoryEntry(
typeof(IEssentialsRoom),
(d, mp, ck) => new MobileControlEssentialsRoomBridge(
(IEssentialsRoom)d)
),
}; };
} }
} }