using System; using System.Collections.Generic; using System.Linq; using System.Text; using Crestron.SimplSharp; using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.EthernetCommunication; using PepperDash.Core; using PepperDash.Essentials.Core; using PepperDash.Essentials.Devices.Common.Cameras; namespace PepperDash.Essentials.AppServer.Messengers { public class SIMPLCameraMessenger : MessengerBase { BasicTriList EISC; uint JoinStart; public class BoolJoin { /// /// 1 /// public const uint CameraControlUp = 1; /// /// 2 /// public const uint CameraControlDown = 2; /// /// 3 /// public const uint CameraControlLeft = 3; /// /// 4 /// public const uint CameraControlRight = 4; /// /// 5 /// public const uint CameraControlZoomIn = 5; /// /// 6 /// public const uint CameraControlZoomOut = 6; /// /// 10 /// public const uint CameraHasPresets = 10; /// /// 11 - 20 /// public const uint CameraPresetStart = 10; /// /// 21 /// public const uint CameraModeAuto = 21; /// /// 22 /// public const uint CameraModeManual = 22; /// /// 23 /// public const uint CameraModeOff = 23; /// /// 24 /// public const uint CameraSupportsModeAuto = 24; /// /// 25 /// public const uint CameraSupportsModeOff = 25; } public class UshortJoin { /// /// 10 /// public const uint CameraPresetCount = 10; } public class StringJoin { /// /// 11-20 /// public const uint CameraPresetNameStart = 10; } public SIMPLCameraMessenger(string key, BasicTriList eisc, string messagePath, uint joinStart) : base(key, messagePath) { EISC = eisc; JoinStart = joinStart - 1; EISC.SetUShortSigAction(UshortJoin.CameraPresetCount + JoinStart, (u) => SendCameraFullMessageObject()); EISC.SetBoolSigAction(BoolJoin.CameraModeAuto, (b) => PostCameraMode()); EISC.SetBoolSigAction(BoolJoin.CameraModeManual, (b) => PostCameraMode()); EISC.SetBoolSigAction(BoolJoin.CameraModeOff, (b) => PostCameraMode()); } protected override void CustomRegisterWithAppServer(MobileControlSystemController appServerController) { var asc = appServerController; asc.AddAction(MessagePath + "/fullStatus", new Action(SendCameraFullMessageObject)); // Add press and holds using helper action Action addPHAction = (s, u) => asc.AddAction(MessagePath + s, new PressAndHoldAction(b => EISC.SetBool(u, b))); addPHAction("/cameraUp", BoolJoin.CameraControlUp + JoinStart); addPHAction("/cameraDown", BoolJoin.CameraControlDown + JoinStart); addPHAction("/cameraLeft", BoolJoin.CameraControlLeft + JoinStart); addPHAction("/cameraRight", BoolJoin.CameraControlRight + JoinStart); addPHAction("/cameraZoomIn", BoolJoin.CameraControlZoomIn + JoinStart); addPHAction("/cameraZoomOut", BoolJoin.CameraControlZoomOut + JoinStart); Action addAction = (s, u) => asc.AddAction(MessagePath + s, new Action(() => EISC.PulseBool(u, 100))); addAction("/cameraModeAuto", BoolJoin.CameraModeAuto); addAction("/cameraModeManual", BoolJoin.CameraModeManual); addAction("/cameraModeOff", BoolJoin.CameraModeOff); // camera presets for (uint i = 1; i <= 6; i++) { addAction("/cameraPreset" + (i), BoolJoin.CameraPresetStart + i + JoinStart); } } public void CustomUnregsiterWithAppServer(MobileControlSystemController appServerController) { appServerController.RemoveAction(MessagePath + "/fullStatus"); appServerController.RemoveAction(MessagePath + "/cameraUp"); appServerController.RemoveAction(MessagePath + "/cameraDown"); appServerController.RemoveAction(MessagePath + "/cameraLeft"); appServerController.RemoveAction(MessagePath + "/cameraRight"); appServerController.RemoveAction(MessagePath + "/cameraZoomIn"); appServerController.RemoveAction(MessagePath + "/cameraZoomOut"); appServerController.RemoveAction(MessagePath + "/cameraModeAuto"); appServerController.RemoveAction(MessagePath + "/cameraModeManual"); appServerController.RemoveAction(MessagePath + "/cameraModeOff"); EISC.SetUShortSigAction(UshortJoin.CameraPresetCount + JoinStart, null); EISC.SetBoolSigAction(BoolJoin.CameraModeAuto, null); EISC.SetBoolSigAction(BoolJoin.CameraModeManual, null); EISC.SetBoolSigAction(BoolJoin.CameraModeOff, null); } /// /// Helper method to update the full status of the camera /// void SendCameraFullMessageObject() { var presetList = new List(); // Build a list of camera presets based on the names and count if (EISC.GetBool(JoinStart + BoolJoin.CameraHasPresets)) { for (uint i = 1; i <= EISC.GetUshort(UshortJoin.CameraPresetCount); i++) { var presetName = EISC.GetString(StringJoin.CameraPresetNameStart + i + JoinStart); var preset = new CameraPreset((int)i, presetName, string.IsNullOrEmpty(presetName), true); presetList.Add(preset); } } PostStatusMessage(new { cameraMode = GetCameraMode(), hasPresets = EISC.GetBool(BoolJoin.CameraHasPresets), presets = presetList }); } /// /// /// void PostCameraMode() { PostStatusMessage(new { cameraMode = GetCameraMode() }); } /// /// Computes the current camera mode /// /// string GetCameraMode() { string m; if (EISC.GetBool(BoolJoin.CameraModeAuto)) m = eCameraControlMode.Auto.ToString().ToLower(); else if (EISC.GetBool(BoolJoin.CameraModeManual)) m = eCameraControlMode.Manual.ToString().ToLower(); else m = eCameraControlMode.Off.ToString().ToLower(); return m; } } }