using System.Collections.Generic; using System.Linq; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PepperDash.Core; using PepperDash.Essentials.Core.DeviceTypeInterfaces; namespace PepperDash.Essentials.AppServer.Messengers { /// /// Messenger for devices that implement ILevelControls interface /// public class ILevelControlsMessenger : MessengerBase { private ILevelControls levelControlsDevice; /// /// Initializes a new instance of the ILevelControlsMessenger class /// /// Unique identifier for the messenger /// Path for message routing /// Device that implements ILevelControls public ILevelControlsMessenger(string key, string messagePath, ILevelControls device) : base(key, messagePath, device as IKeyName) { levelControlsDevice = device; } /// protected override void RegisterActions() { base.RegisterActions(); AddAction("/fullStatus", (id, context) => { var message = new LevelControlStateMessage { Levels = levelControlsDevice.LevelControlPoints.ToDictionary(kv => kv.Key, kv => new Volume { Level = kv.Value.VolumeLevelFeedback.IntValue, Muted = kv.Value.MuteFeedback.BoolValue }) }; PostStatusMessage(message, id); }); foreach (var levelControl in levelControlsDevice.LevelControlPoints) { // reassigning here just in case of lambda closure issues var key = levelControl.Key; var control = levelControl.Value; AddAction($"/{key}/level", (id, content) => { var request = content.ToObject>(); control.SetVolume(request.Value); }); AddAction($"/{key}/muteToggle", (id, content) => { control.MuteToggle(); }); AddAction($"/{key}/muteOn", (id, content) => control.MuteOn()); AddAction($"/{key}/muteOff", (id, content) => control.MuteOff()); AddAction($"/{key}/volumeUp", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) => control.VolumeUp(b))); AddAction($"/{key}/volumeDown", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) => control.VolumeDown(b))); control.VolumeLevelFeedback.OutputChange += (o, a) => PostStatusMessage(JToken.FromObject(new { levelControls = new Dictionary { {key, new Volume{Level = a.IntValue} } } })); control.MuteFeedback.OutputChange += (o, a) => PostStatusMessage(JToken.FromObject(new { levelControls = new Dictionary { {key, new Volume{Muted = a.BoolValue} } } })); } } } /// /// State message for level controls /// public class LevelControlStateMessage : DeviceStateMessageBase { /// /// Gets or sets the level controls /// [JsonProperty("levelControls")] public Dictionary Levels { get; set; } } /// /// Request message for level control operations /// public class LevelControlRequestMessage { /// /// Gets or sets the control key /// [JsonProperty("key")] public string Key { get; set; } /// /// Gets or sets the level /// [JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)] public ushort? Level { get; set; } } }