using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PepperDash.Essentials.Devices.Common.Cameras; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PepperDash.Essentials.AppServer.Messengers { /// /// Messenger for devices that implement the IHasCameras interface. /// public class IHasCamerasMessenger : MessengerBase { /// /// Device being bridged that implements IHasCameras interface. /// public IHasCameras CameraController { get; private set; } /// /// Messenger for devices that implement IHasCameras interface. /// /// /// /// /// public IHasCamerasMessenger(string key, string messagePath , IHasCameras cameraController) : base(key, messagePath, cameraController) { CameraController = cameraController ?? throw new ArgumentNullException("cameraController"); CameraController.CameraSelected += CameraController_CameraSelected; } private void CameraController_CameraSelected(object sender, CameraSelectedEventArgs e) { PostStatusMessage(new IHasCamerasStateMessage { SelectedCamera = e.SelectedCamera }); } /// /// Registers the actions for this messenger. /// /// protected override void RegisterActions() { base.RegisterActions(); AddAction("/fullStatus", (id, context) => { SendFullStatus(id); }); AddAction("/selectCamera", (id, content) => { var cameraKey = content?.ToObject(); if (!string.IsNullOrEmpty(cameraKey)) { CameraController.SelectCamera(cameraKey); } else { throw new ArgumentException("Content must be a string representing the camera key"); } }); } private void SendFullStatus(string clientId) { var state = new IHasCamerasStateMessage { CameraList = CameraController.Cameras, SelectedCamera = CameraController.SelectedCamera }; PostStatusMessage(state, clientId); } } /// /// State message for devices that implement the IHasCameras interface. /// public class IHasCamerasStateMessage : DeviceStateMessageBase { /// /// List of cameras available in the device. /// [JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)] public List CameraList { get; set; } /// /// The currently selected camera on the device. /// [JsonProperty("selectedCamera", NullValueHandling = NullValueHandling.Ignore)] public CameraBase SelectedCamera { get; set; } } }