From 372274d9fa3e0eed8b16610f56218379bc08363b Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 9 Apr 2025 10:49:31 -0500 Subject: [PATCH 1/4] fix: add constructor that takes IHasInputs In order to satisfy the requirements for the `MessengerBase` class, the `ISelectableItemsMessenger` class needs to take an `IHasInputs`, as that is the device that implements `IKeyName`. We may want to consider adding a `IHasInputsMessenger` specifically for those devices that implement that interface vs the `ISelectableItemsMessenger`. --- .../Messengers/ISelectableItemsMessenger.cs | 26 ++++++++++++++++--- .../MobileControlSystemController.cs | 6 ++--- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs index 553d31c6..4fb8f912 100644 --- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs +++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs @@ -1,6 +1,4 @@ using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using Newtonsoft.Json.Linq; using PepperDash.Core; using PepperDash.Core.Logging; using PepperDash.Essentials.Core.DeviceTypeInterfaces; @@ -10,17 +8,37 @@ using System.Collections.Generic; namespace PepperDash.Essentials.AppServer.Messengers { public class ISelectableItemsMessenger : MessengerBase - { - private static readonly JsonSerializer serializer = new JsonSerializer { Converters = { new StringEnumConverter() } }; + { private readonly ISelectableItems itemDevice; private readonly string _propName; + + /// + /// Constructs a messenger for a device that implements ISelectableItems + /// + /// + /// + /// + /// public ISelectableItemsMessenger(string key, string messagePath, ISelectableItems device, string propName) : base(key, messagePath, device as IKeyName) { itemDevice = device; _propName = propName; } + /// + /// Constructs a messenger for a device that implements IHasInputs + /// + /// + /// + /// + /// + public ISelectableItemsMessenger(string key, string messagePath, IHasInputs device, string propName) : base(key, messagePath, device) + { + itemDevice = device.Inputs; + _propName = propName; + } + protected override void RegisterActions() { base.RegisterActions(); diff --git a/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs b/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs index 76823bb4..496fd332 100644 --- a/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs +++ b/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs @@ -766,7 +766,7 @@ namespace PepperDash.Essentials var messenger = new ISelectableItemsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - stringInputs.Inputs, + stringInputs, "inputs" ); @@ -782,7 +782,7 @@ namespace PepperDash.Essentials var messenger = new ISelectableItemsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - byteInputs.Inputs, + byteInputs, "inputs" ); @@ -798,7 +798,7 @@ namespace PepperDash.Essentials var messenger = new ISelectableItemsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - intInputs.Inputs, + intInputs, "inputs" ); From 8d3fd343f1953ebaf8146312cfcc3004a12f60a0 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 9 Apr 2025 10:53:42 -0500 Subject: [PATCH 2/4] fix: remove extraneous param for message logging --- src/PepperDash.Essentials.MobileControl/TransmitMessage.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/PepperDash.Essentials.MobileControl/TransmitMessage.cs b/src/PepperDash.Essentials.MobileControl/TransmitMessage.cs index 14f928ca..b9ca686b 100644 --- a/src/PepperDash.Essentials.MobileControl/TransmitMessage.cs +++ b/src/PepperDash.Essentials.MobileControl/TransmitMessage.cs @@ -113,10 +113,7 @@ namespace PepperDash.Essentials _server.SendMessageToAllClients(message); - _server.LogVerbose("Message TX To all clients: {message}", null, message); - - - + _server.LogVerbose("Message TX To all clients: {message}", message); } catch (ThreadAbortException) { @@ -126,8 +123,6 @@ namespace PepperDash.Essentials { Debug.LogMessage(ex, "Caught an exception in the Transmit Processor"); } - - } #endregion } From 0b5999053233e44238cb10af5274b2568a67cc37 Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 9 Apr 2025 11:48:05 -0500 Subject: [PATCH 3/4] fix: add `IHasInputsMessenger` In order to match up with how existing front-end apps are expecting to recieve data for devices that implement the `IHasInputs` interface, there is now an IHasInputsMessengers that is implemented for devices that implement `IHasInputs`, `IHasInputs` or `IHasInputs` interfaces. --- .../Messengers/IHasInputsMessenger.cs | 101 ++++++++++++++++++ .../MobileControlSystemController.cs | 15 ++- 2 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IHasInputsMessenger.cs diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IHasInputsMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IHasInputsMessenger.cs new file mode 100644 index 00000000..8eb693d5 --- /dev/null +++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IHasInputsMessenger.cs @@ -0,0 +1,101 @@ +using Newtonsoft.Json; +using PepperDash.Core; +using PepperDash.Core.Logging; +using PepperDash.Essentials.Core.DeviceTypeInterfaces; +using System; +using System.Collections.Generic; + +namespace PepperDash.Essentials.AppServer.Messengers +{ + public class IHasInputsMessenger : MessengerBase + { + private readonly IHasInputs itemDevice; + + + /// + /// Constructs a messenger for a device that implements IHasInputs + /// + /// + /// + /// + public IHasInputsMessenger(string key, string messagePath, IHasInputs device) : base(key, messagePath, device) + { + itemDevice = device; + } + + protected override void RegisterActions() + { + base.RegisterActions(); + + AddAction("/fullStatus", (id, context) => + { + SendFullStatus(); + }); + + itemDevice.Inputs.ItemsUpdated += (sender, args) => + { + SendFullStatus(); + }; + + itemDevice.Inputs.CurrentItemChanged += (sender, args) => + { + SendFullStatus(); + }; + + foreach (var input in itemDevice.Inputs.Items) + { + var key = input.Key; + var localItem = input.Value; + + AddAction($"/{key}", (id, content) => + { + localItem.Select(); + }); + + localItem.ItemUpdated += (sender, args) => + { + SendFullStatus(); + }; + } + } + + private void SendFullStatus() + { + try + { + this.LogInformation("Sending full status"); + + var stateObject = new IHasInputsStateMessage + { + Inputs = new Inputs + { + Items = itemDevice.Inputs.Items, + CurrentItem = itemDevice.Inputs.CurrentItem + } + }; + + PostStatusMessage(stateObject); + } + catch (Exception e) + { + this.LogError("Error sending full status: {0}", e.Message); + } + } + } + + public class IHasInputsStateMessage : DeviceStateMessageBase + { + [JsonProperty("inputs")] + public Inputs Inputs { get; set; } + } + + public class Inputs + { + [JsonProperty("items")] + public Dictionary Items { get; set; } + + [JsonProperty("currentItem")] + public TKey CurrentItem { get; set; } + } + +} diff --git a/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs b/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs index 496fd332..b17e0490 100644 --- a/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs +++ b/src/PepperDash.Essentials.MobileControl/MobileControlSystemController.cs @@ -763,11 +763,10 @@ namespace PepperDash.Essentials { this.LogVerbose("Adding InputsMessenger for {deviceKey}", device.Key); - var messenger = new ISelectableItemsMessenger( + var messenger = new IHasInputsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - stringInputs, - "inputs" + stringInputs ); AddDefaultDeviceMessenger(messenger); @@ -779,11 +778,10 @@ namespace PepperDash.Essentials { this.LogVerbose("Adding InputsMessenger for {deviceKey}", device.Key); - var messenger = new ISelectableItemsMessenger( + var messenger = new IHasInputsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - byteInputs, - "inputs" + byteInputs ); AddDefaultDeviceMessenger(messenger); @@ -795,11 +793,10 @@ namespace PepperDash.Essentials { this.LogVerbose("Adding InputsMessenger for {deviceKey}", device.Key); - var messenger = new ISelectableItemsMessenger( + var messenger = new IHasInputsMessenger( $"{device.Key}-inputs-{Key}", $"/device/{device.Key}", - intInputs, - "inputs" + intInputs ); AddDefaultDeviceMessenger(messenger); From ee8776cfb1919e196451fa52703c7cfeb7c5e95c Mon Sep 17 00:00:00 2001 From: Andrew Welker Date: Wed, 9 Apr 2025 12:04:32 -0500 Subject: [PATCH 4/4] chore: remove unnecessary constructor overload --- .../Messengers/ISelectableItemsMessenger.cs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs index 4fb8f912..d7c4a59f 100644 --- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs +++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ISelectableItemsMessenger.cs @@ -26,19 +26,6 @@ namespace PepperDash.Essentials.AppServer.Messengers _propName = propName; } - /// - /// Constructs a messenger for a device that implements IHasInputs - /// - /// - /// - /// - /// - public ISelectableItemsMessenger(string key, string messagePath, IHasInputs device, string propName) : base(key, messagePath, device) - { - itemDevice = device.Inputs; - _propName = propName; - } - protected override void RegisterActions() { base.RegisterActions();