Merge pull request #1337 from PepperDash/Ibasicvolumecontrols-messenger

fix: modify volume messenger to start with IBasicVolumeControls
This commit is contained in:
Andrew Welker
2025-09-26 10:40:44 -04:00
committed by GitHub
2 changed files with 75 additions and 55 deletions

View File

@@ -1,9 +1,10 @@
using Newtonsoft.Json; using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using System;
namespace PepperDash.Essentials.AppServer.Messengers namespace PepperDash.Essentials.AppServer.Messengers
{ {
@@ -12,35 +13,46 @@ namespace PepperDash.Essentials.AppServer.Messengers
/// </summary> /// </summary>
public class DeviceVolumeMessenger : MessengerBase public class DeviceVolumeMessenger : MessengerBase
{ {
private readonly IBasicVolumeWithFeedback _localDevice; private readonly IBasicVolumeControls device;
public DeviceVolumeMessenger(string key, string messagePath, IBasicVolumeWithFeedback device) /// <summary>
/// Initializes a new instance of the <see cref="DeviceVolumeMessenger"/> 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)
: base(key, messagePath, device as IKeyName) : base(key, messagePath, device as IKeyName)
{ {
_localDevice = device; this.device = device;
} }
private void SendStatus() private void SendStatus(string id = null)
{ {
try try
{ {
if (!(device is IBasicVolumeWithFeedback feedbackDevice))
{
return;
}
var messageObj = new VolumeStateMessage var messageObj = new VolumeStateMessage
{ {
Volume = new Volume Volume = new Volume
{ {
Level = _localDevice?.VolumeLevelFeedback.IntValue ?? -1, Level = feedbackDevice?.VolumeLevelFeedback.IntValue ?? -1,
Muted = _localDevice?.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
} }
}; };
if (_localDevice is IBasicVolumeWithFeedbackAdvanced volumeAdvanced) if (device is IBasicVolumeWithFeedbackAdvanced volumeAdvanced)
{ {
messageObj.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString(); messageObj.Volume.RawValue = volumeAdvanced.RawVolumeLevel.ToString();
messageObj.Volume.Units = volumeAdvanced.Units; messageObj.Volume.Units = volumeAdvanced.Units;
} }
PostStatusMessage(messageObj); PostStatusMessage(messageObj, id);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -53,44 +65,23 @@ namespace PepperDash.Essentials.AppServer.Messengers
protected override void RegisterActions() protected override void RegisterActions()
{ {
AddAction("/fullStatus", (id, content) => SendStatus()); AddAction("/volumeUp", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) =>
{
AddAction("/level", (id, content) => Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, "Calling {localDevice} volume up with {value}", DeviceKey, b);
{ try
var volume = content.ToObject<MobileControlSimpleContent<ushort>>(); {
device.VolumeUp(b);
_localDevice.SetVolume(volume.Value); }
}); catch (Exception ex)
{
Debug.LogMessage(ex, "Got exception during volume up: {Exception}", null, ex);
}
}));
AddAction("/muteToggle", (id, content) => AddAction("/muteToggle", (id, content) =>
{ {
_localDevice.MuteToggle(); device.MuteToggle();
}); });
AddAction("/muteOn", (id, content) =>
{
_localDevice.MuteOn();
});
AddAction("/muteOff", (id, content) =>
{
_localDevice.MuteOff();
});
AddAction("/volumeUp", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) =>
{
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, "Calling {localDevice} volume up with {value}", DeviceKey, b);
try
{
_localDevice.VolumeUp(b);
}
catch (Exception ex)
{
Debug.LogMessage(ex, "Got exception during volume up: {Exception}", null, ex);
}
}));
AddAction("/volumeDown", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) => AddAction("/volumeDown", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) =>
{ {
@@ -98,7 +89,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
try try
{ {
_localDevice.VolumeDown(b); device.VolumeDown(b);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -106,7 +97,38 @@ namespace PepperDash.Essentials.AppServer.Messengers
} }
})); }));
_localDevice.MuteFeedback.OutputChange += (sender, args) => if (!(device is IBasicVolumeWithFeedback feedback))
{
this.LogDebug("Skipping feedback methods for {deviceKey}", (device as IKeyName)?.Key);
return;
}
AddAction("/fullStatus", (id, content) => SendStatus(id));
AddAction("/volumeStatus", (id, content) => SendStatus(id));
AddAction("/level", (id, content) =>
{
var volume = content.ToObject<MobileControlSimpleContent<ushort>>();
feedback.SetVolume(volume.Value);
});
AddAction("/muteOn", (id, content) =>
{
feedback.MuteOn();
});
AddAction("/muteOff", (id, content) =>
{
feedback.MuteOff();
});
feedback.MuteFeedback.OutputChange += (sender, args) =>
{ {
PostStatusMessage(JToken.FromObject( PostStatusMessage(JToken.FromObject(
new new
@@ -119,10 +141,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
); );
}; };
_localDevice.VolumeLevelFeedback.OutputChange += (sender, args) => feedback.VolumeLevelFeedback.OutputChange += (sender, args) =>
{ {
var rawValue = ""; var rawValue = "";
if (_localDevice is IBasicVolumeWithFeedbackAdvanced volumeAdvanced) if (feedback is IBasicVolumeWithFeedbackAdvanced volumeAdvanced)
{ {
rawValue = volumeAdvanced.RawVolumeLevel.ToString(); rawValue = volumeAdvanced.RawVolumeLevel.ToString();
} }
@@ -138,8 +160,6 @@ namespace PepperDash.Essentials.AppServer.Messengers
PostStatusMessage(JToken.FromObject(message)); PostStatusMessage(JToken.FromObject(message));
}; };
} }
#endregion #endregion

View File

@@ -486,15 +486,15 @@ namespace PepperDash.Essentials
messengerAdded = true; messengerAdded = true;
} }
if (device is IBasicVolumeWithFeedback) if (device is IBasicVolumeControls)
{ {
var deviceKey = device.Key; var deviceKey = device.Key;
this.LogVerbose( this.LogVerbose(
"Adding IBasicVolumeControlWithFeedback for {deviceKey}", "Adding IBasicVolumeControls for {deviceKey}",
deviceKey deviceKey
); );
var volControlDevice = device as IBasicVolumeWithFeedback; var volControlDevice = device as IBasicVolumeControls;
var messenger = new DeviceVolumeMessenger( var messenger = new DeviceVolumeMessenger(
$"{device.Key}-volume-{Key}", $"{device.Key}-volume-{Key}",
string.Format("/device/{0}", deviceKey), string.Format("/device/{0}", deviceKey),