//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using Crestron.SimplSharp;
//using Crestron.SimplSharpPro.DeviceSupport;
//using PepperDash.Core;
//using PepperDash.Essentials.Core;
//using PepperDash.Essentials.Devices.Common;

//namespace PepperDash.Essentials.Bridges
//{
//    public static class CameraControllerApiExtensions
//    {

//        public static BasicTriList _TriList;
//        public static CameraControllerJoinMap JoinMap; 
//        public static void LinkToApi(this PepperDash.Essentials.Devices.Common.Cameras.CameraBase cameraDevice, BasicTriList trilist, uint joinStart, string joinMapKey)
//        {
//            JoinMap = JoinMapHelper.GetJoinMapForDevice(joinMapKey) as CameraControllerJoinMap;
			
//            _TriList = trilist;
//            if (JoinMap == null)
//            {
//                JoinMap = new CameraControllerJoinMap();
//            }
			
//            JoinMap.OffsetJoinNumbers(joinStart);
//            Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
//            Debug.Console(0, "Linking to Bridge Type {0}", cameraDevice.GetType().Name.ToString());

//            var commMonitor = cameraDevice as ICommunicationMonitor;
//            commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[JoinMap.IsOnline]);


//            trilist.SetBoolSigAction(JoinMap.Left, (b) =>
//                {
//                    if (b)
//                    {
//                        cameraDevice.PanLeft();
//                    }
//                    else
//                    {
//                        cameraDevice.Stop();
//                    }
//                });
//            trilist.SetBoolSigAction(JoinMap.Right, (b) =>
//            {
//                if (b)
//                {
//                    cameraDevice.PanRight();
//                }
//                else
//                {
//                    cameraDevice.Stop();
//                }
//            });

//            trilist.SetBoolSigAction(JoinMap.Up, (b) =>
//            {
//                if (b)
//                {
//                    cameraDevice.TiltUp();
//                }
//                else
//                {
//                    cameraDevice.Stop();
//                }
//            });
//            trilist.SetBoolSigAction(JoinMap.Down, (b) =>
//            {
//                if (b)
//                {
//                    cameraDevice.TiltDown();
//                }
//                else
//                {
//                    cameraDevice.Stop();
//                }
//            });

//            trilist.SetBoolSigAction(JoinMap.ZoomIn, (b) =>
//            {
//                if (b)
//                {
//                    cameraDevice.ZoomIn();
//                }
//                else
//                {
//                    cameraDevice.Stop();
//                }
//            });

//            trilist.SetBoolSigAction(JoinMap.ZoomOut, (b) =>
//            {
//                if (b)
//                {
//                    cameraDevice.ZoomOut();
//                }
//                else
//                {
//                    cameraDevice.Stop();
//                }
//            });


//            if (cameraDevice.GetType().Name.ToString().ToLower() == "cameravisca")
//            {
//                var viscaCamera = cameraDevice as PepperDash.Essentials.Devices.Common.Cameras.CameraVisca;
//                trilist.SetSigTrueAction(JoinMap.PowerOn, () => viscaCamera.PowerOn());
//                trilist.SetSigTrueAction(JoinMap.PowerOff, () => viscaCamera.PowerOff());

//                viscaCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[JoinMap.PowerOn]);
//                viscaCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[JoinMap.PowerOff]);

//                viscaCamera.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[JoinMap.IsOnline]);
//                for (int i = 0; i < JoinMap.NumberOfPresets; i++)
//                    {	
//                        int tempNum = i;
//                        trilist.SetSigTrueAction((ushort)(JoinMap.PresetRecallOffset + tempNum), () =>
//                            {
//                                viscaCamera.RecallPreset(tempNum);
//                            });
//                        trilist.SetSigTrueAction((ushort)(JoinMap.PresetSaveOffset + tempNum), () =>
//                        {
//                            viscaCamera.SavePreset(tempNum);
//                        });
//                    }
//            }

			
			
//        }


//    }
//    public class CameraControllerJoinMap : JoinMapBase
//    {
//        public uint IsOnline { get; set; }
//        public uint PowerOff { get; set; }
//        public uint PowerOn { get; set; }
//        public uint Up { get; set; }
//        public uint Down { get; set; }
//        public uint Left { get; set; }
//        public uint Right { get; set; }
//        public uint ZoomIn { get; set; }
//        public uint ZoomOut { get; set; }
//        public uint PresetRecallOffset { get; set; }
//        public uint PresetSaveOffset { get; set; }
//        public uint NumberOfPresets { get; set;  }

//        public CameraControllerJoinMap()
//        {
//            // Digital
//            IsOnline = 9;
//            PowerOff = 8;
//            PowerOn = 7;
//            Up = 1;
//            Down = 2;
//            Left = 3;
//            Right = 4;
//            ZoomIn = 5;
//            ZoomOut = 6;
//            PresetRecallOffset = 10;
//            PresetSaveOffset = 30;
//            NumberOfPresets = 5;
//            // Analog
//        }

//        public override void OffsetJoinNumbers(uint joinStart)
//        {
//            var joinOffset = joinStart - 1;

//            IsOnline = IsOnline + joinOffset;
//            PowerOff = PowerOff + joinOffset;
//            PowerOn = PowerOn + joinOffset;
//            Up = Up + joinOffset;
//            Down = Down + joinOffset;
//            Left = Left + joinOffset;
//            Right = Right + joinOffset;
//            ZoomIn = ZoomIn + joinOffset;
//            ZoomOut = ZoomOut + joinOffset;
//            PresetRecallOffset = PresetRecallOffset + joinOffset;
//            PresetSaveOffset = PresetSaveOffset + joinOffset;
//        }
//    }
//}