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
/// </summary>
eVolumeLevelUnits Units { get; }
/// <summary>
/// Gets the maximum volume level
/// </summary>
int MaxVolumeLevel { get; }
}
}

View file

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

View file

@ -9,19 +9,19 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.AppServer.Messengers
{
/// <summary>
/// Represents a DeviceVolumeMessenger
/// Represents a IBasicVolumeControlsMessenger
/// </summary>
public class DeviceVolumeMessenger : MessengerBase
public class IBasicVolumeControlsMessenger : MessengerBase
{
private readonly IBasicVolumeControls device;
/// <summary>
/// Initializes a new instance of the <see cref="DeviceVolumeMessenger"/> class.
/// Initializes a new instance of the <see cref="IBasicVolumeControlsMessenger"/> class.
/// </summary>
/// <param name="key">The key.</param>
/// <param name="messagePath">The message path.</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)
{
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; }
/// <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.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)
),
};
}
}