diff --git a/src/PepperDash.Essentials.Devices.Common/AudioCodec/AudioCodecBase.cs b/src/PepperDash.Essentials.Devices.Common/AudioCodec/AudioCodecBase.cs
index dc0f98a6..5c0f3885 100644
--- a/src/PepperDash.Essentials.Devices.Common/AudioCodec/AudioCodecBase.cs
+++ b/src/PepperDash.Essentials.Devices.Common/AudioCodec/AudioCodecBase.cs
@@ -6,11 +6,19 @@ using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.AudioCodec;
-public abstract class AudioCodecBase : EssentialsDevice, IHasDialer, IUsageTracking, IAudioCodecInfo
+///
+/// Base class for audio codecs. Provides common properties and methods for audio codecs,
+/// as well as a common implementation of IDialerCallStatus to allow the AudioCodecBaseMessenger
+/// to get call status information without requiring the full AudioCodecBase class.
+/// This is useful for devices that have dialer call status information but do not need to implement
+/// the full AudioCodecBase class.
+///
+public abstract class AudioCodecBase : EssentialsDevice, IDialerCallStatus, IUsageTracking, IAudioCodecInfo
{
-
+ ///
public event EventHandler CallStatusChange;
+ ///
public AudioCodecInfo CodecInfo { get; protected set; }
#region IUsageTracking Members
@@ -41,8 +49,14 @@ public abstract class AudioCodecBase : EssentialsDevice, IHasDialer, IUsageTrack
}
// In most cases only a single call can be active
+ ///
public List ActiveCalls { get; set; }
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
public AudioCodecBase(string key, string name)
: base(key, name)
{
@@ -83,16 +97,22 @@ public abstract class AudioCodecBase : EssentialsDevice, IHasDialer, IUsageTrack
#region IHasDialer Members
+ ///
public abstract void Dial(string number);
+ ///
public abstract void EndCall(CodecActiveCallItem activeCall);
+ ///
public abstract void EndAllCalls();
+ ///
public abstract void AcceptCall(CodecActiveCallItem item);
+
public abstract void RejectCall(CodecActiveCallItem item);
+
public abstract void SendDtmf(string digit);
#endregion
diff --git a/src/PepperDash.Essentials.Devices.Common/AudioCodec/Interfaces/IDialerCallStatus.cs b/src/PepperDash.Essentials.Devices.Common/AudioCodec/Interfaces/IDialerCallStatus.cs
new file mode 100644
index 00000000..7c32eecf
--- /dev/null
+++ b/src/PepperDash.Essentials.Devices.Common/AudioCodec/Interfaces/IDialerCallStatus.cs
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+using PepperDash.Essentials.Devices.Common.Codec;
+
+namespace PepperDash.Essentials.Devices.Common.AudioCodec;
+
+///
+/// Defines the contract for a device that has dialer call status information. This is used to provide a common interface for the AudioCodecBaseMessenger to get call status information without requiring the full AudioCodecBase class
+///
+public interface IDialerCallStatus : IHasDialer
+{
+ ///
+ ///
+ ///
+ AudioCodecInfo CodecInfo { get; }
+
+ ///
+ /// Gets or sets the list of active calls for the device.
+ ///
+ List ActiveCalls { get; set; }
+}
diff --git a/src/PepperDash.Essentials.Devices.Common/Cameras/CameraBase.cs b/src/PepperDash.Essentials.Devices.Common/Cameras/CameraBase.cs
index a7b880c9..3ee7b7be 100644
--- a/src/PepperDash.Essentials.Devices.Common/Cameras/CameraBase.cs
+++ b/src/PepperDash.Essentials.Devices.Common/Cameras/CameraBase.cs
@@ -1,6 +1,4 @@
-
-
-using System;
+using System;
using System.Collections.Generic;
using System.Linq;
using Crestron.SimplSharpPro.DeviceSupport;
diff --git a/src/PepperDash.Essentials.Devices.Common/Displays/Interfaces/IDisplayCurrentInput.cs b/src/PepperDash.Essentials.Devices.Common/Displays/Interfaces/IDisplayCurrentInput.cs
new file mode 100644
index 00000000..dde208c8
--- /dev/null
+++ b/src/PepperDash.Essentials.Devices.Common/Displays/Interfaces/IDisplayCurrentInput.cs
@@ -0,0 +1,14 @@
+using PepperDash.Core;
+
+namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
+{
+ ///
+ /// Defines the contract for a display device that has current input information. This is used to provide a common interface for the TwoWayDisplayBaseMessenger to get current input information without requiring the full TwoWayDisplayBase class
+ ///
+ public interface IDisplayCurrentInput : IKeyName
+{
+ ///
+ /// Gets the Current Input feedback for the display device.
+ ///
+ StringFeedback CurrentInputFeedback { get; }
+}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/DeviceTypeExtensions/DisplayBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/DeviceTypeExtensions/IRoutingSinkWithSwitchingMessenger.cs
similarity index 100%
rename from src/PepperDash.Essentials.MobileControl.Messengers/DeviceTypeExtensions/DisplayBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/DeviceTypeExtensions/IRoutingSinkWithSwitchingMessenger.cs
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraControlMessenger.cs
similarity index 98%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraControlMessenger.cs
index 8c9f0451..3c02ee59 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraBaseMessenger.cs
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraControlMessenger.cs
@@ -11,7 +11,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
///
/// Messenger for a CameraBase device
///
- public class CameraBaseMessenger : MessengerBase where T : IKeyed
+ public class CameraControlMessenger : MessengerBase where T : IKeyed
{
///
/// Gets or sets the Camera
@@ -24,7 +24,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
///
///
///
- public CameraBaseMessenger(string key, T camera, string messagePath)
+ public CameraControlMessenger(string key, T camera, string messagePath)
: base(key, messagePath, camera as IKeyName)
{
if (camera == null)
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/AudioCodecBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDialerCallStatusMessenger.cs
similarity index 90%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/AudioCodecBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDialerCallStatusMessenger.cs
index a1b30341..d9eacecd 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/AudioCodecBaseMessenger.cs
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDialerCallStatusMessenger.cs
@@ -1,20 +1,21 @@
using System;
using System.Linq;
using Newtonsoft.Json.Linq;
+using PepperDash.Core;
using PepperDash.Essentials.Devices.Common.AudioCodec;
using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.AppServer.Messengers
{
///
- /// Provides a messaging bridge for an AudioCodecBase device
+ /// Provides a messaging bridge for an IDialerCallStatus device
///
- public class AudioCodecBaseMessenger : MessengerBase
+ public class IDialerCallStatusMessenger : MessengerBase
{
///
/// Device being bridged
///
- public AudioCodecBase Codec { get; private set; }
+ public IDialerCallStatus Codec { get; private set; }
///
/// Constuctor
@@ -22,8 +23,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
///
///
///
- public AudioCodecBaseMessenger(string key, AudioCodecBase codec, string messagePath)
- : base(key, messagePath, codec)
+ public IDialerCallStatusMessenger(string key, IDialerCallStatus codec, string messagePath)
+ : base(key, messagePath, codec as IKeyName)
{
Codec = codec ?? throw new ArgumentNullException("codec");
codec.CallStatusChange += Codec_CallStatusChange;
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/TwoWayDisplayBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDisplayCurrentInputMessenger.cs
similarity index 57%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/TwoWayDisplayBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDisplayCurrentInputMessenger.cs
index 77a7cc95..0239ecf9 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/TwoWayDisplayBaseMessenger.cs
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IDisplayCurrentInputMessenger.cs
@@ -1,25 +1,27 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
+using PepperDash.Core;
using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.DeviceTypeInterfaces;
using PepperDash.Essentials.Devices.Common.Displays;
namespace PepperDash.Essentials.AppServer.Messengers
{
///
- /// Represents a TwoWayDisplayBaseMessenger
+ /// Represents a messenger for a display device that has current input information.
///
- public class TwoWayDisplayBaseMessenger : MessengerBase
+ public class IDisplayCurrentInputMessenger : MessengerBase
{
- private readonly TwoWayDisplayBase _display;
+ private readonly IDisplayCurrentInput _display;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
///
///
///
- public TwoWayDisplayBaseMessenger(string key, string messagePath, TwoWayDisplayBase display)
- : base(key, messagePath, display)
+ public IDisplayCurrentInputMessenger(string key, string messagePath, IDisplayCurrentInput display)
+ : base(key, messagePath, display as IKeyName)
{
_display = display;
}
@@ -31,9 +33,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
///
public void SendFullStatus(string id = null)
{
- var messageObj = new TwoWayDisplayBaseStateMessage
+ var messageObj = new CurrentInputStateMessage
{
- //PowerState = _display.PowerIsOnFeedback.BoolValue,
CurrentInput = _display.CurrentInputFeedback.StringValue
};
@@ -47,11 +48,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
- AddAction("/displayStatus", (id, content) => SendFullStatus(id));
+ AddAction("/currentInputStatus", (id, content) => SendFullStatus(id));
_display.CurrentInputFeedback.OutputChange += CurrentInputFeedbackOnOutputChange;
- _display.IsCoolingDownFeedback.OutputChange += IsCoolingFeedbackOnOutputChange;
- _display.IsWarmingUpFeedback.OutputChange += IsWarmingFeedbackOnOutputChange;
}
private void CurrentInputFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
@@ -61,24 +60,6 @@ namespace PepperDash.Essentials.AppServer.Messengers
currentInput = feedbackEventArgs.StringValue
})
);
- }
-
- private void IsWarmingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
- {
- PostStatusMessage(JToken.FromObject(new
- {
- isWarming = feedbackEventArgs.BoolValue
- })
- );
- }
-
- private void IsCoolingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
- {
- PostStatusMessage(JToken.FromObject(new
- {
- isCooling = feedbackEventArgs.BoolValue
- })
- );
}
@@ -89,7 +70,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
///
/// Represents a TwoWayDisplayBaseStateMessage
///
- public class TwoWayDisplayBaseStateMessage : DeviceStateMessageBase
+ public class CurrentInputStateMessage : DeviceStateMessageBase
{
//[JsonProperty("powerState", NullValueHandling = NullValueHandling.Ignore)]
//public bool? PowerState { get; set; }
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/LightingBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ILightingScenesMessenger.cs
similarity index 100%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/LightingBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ILightingScenesMessenger.cs
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/RoomEventScheduleMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IRoomEventScheduleMessenger.cs
similarity index 90%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/RoomEventScheduleMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IRoomEventScheduleMessenger.cs
index 8969dcd3..1112a85d 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/RoomEventScheduleMessenger.cs
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IRoomEventScheduleMessenger.cs
@@ -11,17 +11,17 @@ namespace PepperDash.Essentials.AppServer.Messengers;
///
/// Represents a RoomEventScheduleMessenger
///
-public class RoomEventScheduleMessenger : MessengerBase
+public class IRoomEventScheduleMessenger : MessengerBase
{
private readonly IRoomEventSchedule _room;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
///
///
///
- public RoomEventScheduleMessenger(string key, string messagePath, IRoomEventSchedule room)
+ public IRoomEventScheduleMessenger(string key, string messagePath, IRoomEventSchedule room)
: base(key, messagePath, room as IKeyName)
{
_room = room;
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ShadeBaseMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IShadesOpenCloseStopMessenger.cs
similarity index 100%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ShadeBaseMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IShadesOpenCloseStopMessenger.cs
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DevicePresetsModelMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ITvPresetsProviderMessenger.cs
similarity index 93%
rename from src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DevicePresetsModelMessenger.cs
rename to src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ITvPresetsProviderMessenger.cs
index 833a781b..fa9bd3b4 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/DevicePresetsModelMessenger.cs
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/ITvPresetsProviderMessenger.cs
@@ -10,19 +10,19 @@ using PepperDash.Essentials.Core.Presets;
namespace PepperDash.Essentials.AppServer.Messengers
{
///
- /// Represents a DevicePresetsModelMessenger
+ /// Represents a ITvPresetsProviderMessenger
///
- public class DevicePresetsModelMessenger : MessengerBase
+ public class ITvPresetsProviderMessenger : MessengerBase
{
private readonly ITvPresetsProvider _presetsDevice;
///
- /// Constructor for DevicePresetsModelMessenger
+ /// Constructor for ITvPresetsProviderMessenger
///
/// The key.
/// The message path.
/// The presets device.
- public DevicePresetsModelMessenger(string key, string messagePath, ITvPresetsProvider presetsDevice)
+ public ITvPresetsProviderMessenger(string key, string messagePath, ITvPresetsProvider presetsDevice)
: base(key, messagePath, presetsDevice as Device)
{
_presetsDevice = presetsDevice;
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IWarmingCoolingMessenger.cs b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IWarmingCoolingMessenger.cs
new file mode 100644
index 00000000..54687e7b
--- /dev/null
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/Messengers/IWarmingCoolingMessenger.cs
@@ -0,0 +1,86 @@
+using System.Text.Json.Serialization;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.AppServer.Messengers;
+
+///
+/// Messenger for devices that implement
+///
+public class IWarmingCoolingMessenger : MessengerBase
+{
+ private readonly IWarmingCooling device;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ ///
+ ///
+ public IWarmingCoolingMessenger(string key, string messagePath, EssentialsDevice device)
+ : base(key, messagePath, device)
+ {
+ this.device = device as IWarmingCooling;
+ }
+
+ ///
+ protected override void RegisterActions()
+ {
+ base.RegisterActions();
+
+ AddAction("/fullStatus", (id, content) => SendFullStatus(id));
+
+ AddAction("/warmingCoolingStatus", (id, content) => SendFullStatus(id));
+
+ device.IsWarmingUpFeedback.OutputChange += IsWarmingFeedbackOnOutputChange;
+ device.IsCoolingDownFeedback.OutputChange += IsCoolingFeedbackOnOutputChange;
+ }
+
+ private void IsWarmingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
+ {
+ PostStatusMessage(JToken.FromObject(new
+ {
+ isWarming = feedbackEventArgs.BoolValue
+ }));
+ }
+
+ private void IsCoolingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
+ {
+ PostStatusMessage(JToken.FromObject(new
+ {
+ isCooling = feedbackEventArgs.BoolValue
+ }));
+ }
+
+ private void SendFullStatus(string id = null)
+ {
+ var messageObj = new IWarmingCoolingStateMessage
+ {
+ IsWarming = device.IsWarmingUpFeedback.BoolValue,
+ IsCooling = device.IsCoolingDownFeedback.BoolValue
+ };
+
+ PostStatusMessage(messageObj, id);
+ }
+}
+
+
+///
+/// Message object for warming/cooling status
+///
+public class IWarmingCoolingStateMessage : DeviceStateMessageBase
+{
+ ///
+ /// Indicates whether the device is currently warming up.
+ ///
+ [JsonProperty("isWarming", NullValueHandling = NullValueHandling.Ignore)]
+ public bool IsWarming { get; set; }
+
+ ///
+ /// Indicates whether the device is currently cooling down.
+ ///
+ [JsonProperty("isCooling", NullValueHandling = NullValueHandling.Ignore)]
+ public bool IsCooling { get; set; }
+}
+
diff --git a/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs b/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs
index 73e3dc22..060e594f 100644
--- a/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs
+++ b/src/PepperDash.Essentials.MobileControl/MessengerFactoryRegistry.cs
@@ -83,14 +83,14 @@ namespace PepperDash.Essentials
// CameraBase only when the device does NOT also implement IHasCameraControls
new MessengerFactoryEntry(
typeof(CameraBase),
- (d, mp, ck) => new CameraBaseMessenger(
+ (d, mp, ck) => new CameraControlMessenger(
$"{d.Key}-cameraBase-{ck}", (CameraBase)d, mp),
predicate: d => d is CameraBase && !(d is IHasCameraControls)
),
new MessengerFactoryEntry(
typeof(IHasCameraControls),
- (d, mp, ck) => new CameraBaseMessenger(
+ (d, mp, ck) => new CameraControlMessenger(
$"{d.Key}-hasCamerasWithControls-{ck}", (IHasCameraControls)d, mp)
),
new MessengerFactoryEntry(
@@ -102,7 +102,7 @@ namespace PepperDash.Essentials
// ── Routing ──────────────────────────────────────────────────────────────
// BlueJeansPc implements IRunRouteAction
new MessengerFactoryEntry(
- typeof(BlueJeansPc),
+ typeof(IRunRouteAction),
(d, mp, ck) => new RunRouteActionMessenger(
$"{d.Key}-runRouteAction-{ck}", (IRunRouteAction)d, mp)
),
@@ -110,7 +110,7 @@ namespace PepperDash.Essentials
// ── Presets ──────────────────────────────────────────────────────────────
new MessengerFactoryEntry(
typeof(ITvPresetsProvider),
- (d, mp, ck) => new DevicePresetsModelMessenger(
+ (d, mp, ck) => new ITvPresetsProviderMessenger(
$"{d.Key}-presets-{ck}", mp, (ITvPresetsProvider)d)
),
@@ -121,9 +121,14 @@ namespace PepperDash.Essentials
$"{d.Key}-displayBase-{ck}", mp, (IRoutingSinkWithSwitching)d)
),
new MessengerFactoryEntry(
- typeof(TwoWayDisplayBase),
- (d, mp, ck) => new TwoWayDisplayBaseMessenger(
- $"{d.Key}-twoWayDisplay-{ck}", mp, (TwoWayDisplayBase)d)
+ typeof(IDisplayCurrentInput),
+ (d, mp, ck) => new IDisplayCurrentInputMessenger(
+ $"{d.Key}-twoWayDisplay-{ck}", mp, (IDisplayCurrentInput)d)
+ ),
+ new MessengerFactoryEntry(
+ typeof(IWarmingCooling),
+ (d, mp, ck) => new IWarmingCoolingMessenger(
+ $"{d.Key}-warmingCooling-{ck}", mp, d)
),
// ── Audio / Video ─────────────────────────────────────────────────────────
@@ -160,9 +165,9 @@ namespace PepperDash.Essentials
$"{d.Key}-videoCodec-{ck}", (VideoCodecBase)d, mp)
),
new MessengerFactoryEntry(
- typeof(AudioCodecBase),
- (d, mp, ck) => new AudioCodecBaseMessenger(
- $"{d.Key}-audioCodec-{ck}", (AudioCodecBase)d, mp)
+ typeof(IDialerCallStatus),
+ (d, mp, ck) => new IDialerCallStatusMessenger(
+ $"{d.Key}-audioCodec-{ck}", (IDialerCallStatus)d, mp)
),
// ── Set-top box controls ──────────────────────────────────────────────────
@@ -294,7 +299,7 @@ namespace PepperDash.Essentials
// ── Event schedule ────────────────────────────────────────────────────────
new MessengerFactoryEntry(
typeof(IRoomEventSchedule),
- (d, mp, ck) => new RoomEventScheduleMessenger(
+ (d, mp, ck) => new IRoomEventScheduleMessenger(
$"{d.Key}-schedule-{ck}", mp, (IRoomEventSchedule)d)
),