Merge branch 'development' into feature/device-info

This commit is contained in:
Andrew Welker
2020-11-11 13:04:58 -07:00
26 changed files with 3484 additions and 2943 deletions

View File

@@ -273,15 +273,18 @@ namespace PepperDash.Essentials.Fusion
// Display to fusion room sigs // Display to fusion room sigs
FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction; FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction;
FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction; FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction;
defaultDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
var defaultDisplayTwoWay = defaultDisplay as IHasPowerControlWithFeedback;
if (defaultDisplayTwoWay != null)
{
defaultDisplayTwoWay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
}
if (defaultDisplay is IDisplayUsage) if (defaultDisplay is IDisplayUsage)
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig); (defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
MapDisplayToRoomJoins(1, 158, defaultDisplay); MapDisplayToRoomJoins(1, 158, defaultDisplay);
var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(defaultDisplay.Key)); var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(defaultDisplay.Key));
//Check for existing asset in GUIDs collection //Check for existing asset in GUIDs collection
@@ -302,8 +305,18 @@ namespace PepperDash.Essentials.Fusion
var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId); var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId);
dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction; dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction;
dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction; dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction;
defaultDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
// NO!! display.PowerIsOn.LinkComplementInputSig(dispAsset.PowerOff.InputSig);
var defaultTwoWayDisplay = defaultDisplay as IHasPowerControlWithFeedback;
if (defaultTwoWayDisplay != null)
{
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
if (defaultDisplay is IDisplayUsage)
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
}
// Use extension methods // Use extension methods
dispAsset.TrySetMakeModel(defaultDisplay); dispAsset.TrySetMakeModel(defaultDisplay);
dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay); dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay);
@@ -325,12 +338,17 @@ namespace PepperDash.Essentials.Fusion
// Power on // Power on
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig); var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); }); defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); });
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
// Power Off // Power Off
var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig); var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig);
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ; defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ;
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
var displayTwoWay = display as IHasPowerControlWithFeedback;
if (displayTwoWay != null)
{
displayTwoWay.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
displayTwoWay.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
}
// Current Source // Current Source
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig); var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);

View File

@@ -71,7 +71,7 @@
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath> <HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
</Reference> </Reference>
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PepperDash_Core, Version=1.0.41.31808, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath> <HintPath>..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
</Reference> </Reference>

View File

@@ -283,19 +283,23 @@ namespace PepperDash.Essentials
if (disp != null) if (disp != null)
{ {
// Link power, warming, cooling to display // Link power, warming, cooling to display
disp.PowerIsOnFeedback.OutputChange += (o, a) => var dispTwoWay = disp as IHasPowerControlWithFeedback;
if (dispTwoWay != null)
{ {
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue) dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
{ {
if (!disp.PowerIsOnFeedback.BoolValue) if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
{
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
disp.CurrentSourceInfo = null; disp.CurrentSourceInfo = null;
OnFeedback.FireUpdate(); OnFeedback.FireUpdate();
} }
if (disp.PowerIsOnFeedback.BoolValue) if (dispTwoWay.PowerIsOnFeedback.BoolValue)
{ {
SetDefaultLevels(); SetDefaultLevels();
} }
}; };
}
disp.IsWarmingUpFeedback.OutputChange += (o, a) => disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
{ {
@@ -579,8 +583,8 @@ namespace PepperDash.Essentials
if (dest is IPower) if (dest is IHasPowerControl)
(dest as IPower).PowerOff(); (dest as IHasPowerControl).PowerOff();
} }
else else
{ {

View File

@@ -176,15 +176,19 @@ namespace PepperDash.Essentials
if (disp != null) if (disp != null)
{ {
// Link power, warming, cooling to display // Link power, warming, cooling to display
disp.PowerIsOnFeedback.OutputChange += (o, a) => var dispTwoWay = disp as IHasPowerControlWithFeedback;
if (dispTwoWay != null)
{ {
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue) dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
{ {
if (!disp.PowerIsOnFeedback.BoolValue) if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
{
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
CurrentSourceInfo = null; CurrentSourceInfo = null;
OnFeedback.FireUpdate(); OnFeedback.FireUpdate();
} }
}; };
}
disp.IsWarmingUpFeedback.OutputChange += (o, a) => disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
{ {
@@ -495,8 +499,8 @@ namespace PepperDash.Essentials
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase)) if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
{ {
dest.ReleaseRoute(); dest.ReleaseRoute();
if (dest is IPower) if (dest is IHasPowerControl)
(dest as IPower).PowerOff(); (dest as IHasPowerControl).PowerOff();
} }
else else
{ {

View File

@@ -190,6 +190,12 @@ namespace PepperDash.Essentials
(_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control"); (_CurrentSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control");
if (handler != null) if (handler != null)
handler(_CurrentSourceInfo, ChangeType.DidChange); handler(_CurrentSourceInfo, ChangeType.DidChange);
var vc = VideoCodec as IHasExternalSourceSwitching;
if (vc != null)
{
vc.SetSelectedSource(CurrentSourceInfoKey);
}
} }
} }
SourceListItem _CurrentSourceInfo; SourceListItem _CurrentSourceInfo;
@@ -273,19 +279,23 @@ namespace PepperDash.Essentials
if (disp != null) if (disp != null)
{ {
// Link power, warming, cooling to display // Link power, warming, cooling to display
disp.PowerIsOnFeedback.OutputChange += (o, a) => var dispTwoWay = disp as IHasPowerControlWithFeedback;
if (dispTwoWay != null)
{ {
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue) dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
{ {
if (!disp.PowerIsOnFeedback.BoolValue) if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
{
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
CurrentSourceInfo = null; CurrentSourceInfo = null;
OnFeedback.FireUpdate(); OnFeedback.FireUpdate();
} }
if (disp.PowerIsOnFeedback.BoolValue) if (dispTwoWay.PowerIsOnFeedback.BoolValue)
{ {
SetDefaultLevels(); SetDefaultLevels();
} }
}; };
}
disp.IsWarmingUpFeedback.OutputChange += (o, a) => disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
{ {
@@ -640,8 +650,8 @@ namespace PepperDash.Essentials
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase)) if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
{ {
dest.ReleaseRoute(); dest.ReleaseRoute();
if (dest is IPower) if (dest is IHasPowerControl)
(dest as IPower).PowerOff(); (dest as IHasPowerControl).PowerOff();
} }
else else
{ {

View File

@@ -306,8 +306,8 @@ namespace PepperDash.Essentials
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () => TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
{ {
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IPower) if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IHasPowerControl)
(CurrentRoom.DefaultDisplay as IPower).PowerToggle(); (CurrentRoom.DefaultDisplay as IHasPowerControl).PowerToggle();
}); });
base.Show(); base.Show();
@@ -984,8 +984,8 @@ namespace PepperDash.Essentials
(previousDev as IDvr).UnlinkButtons(TriList); (previousDev as IDvr).UnlinkButtons(TriList);
if (previousDev is INumericKeypad) if (previousDev is INumericKeypad)
(previousDev as INumericKeypad).UnlinkButtons(TriList); (previousDev as INumericKeypad).UnlinkButtons(TriList);
if (previousDev is IPower) if (previousDev is IHasPowerControl)
(previousDev as IPower).UnlinkButtons(TriList); (previousDev as IHasPowerControl).UnlinkButtons(TriList);
if (previousDev is ITransport) if (previousDev is ITransport)
(previousDev as ITransport).UnlinkButtons(TriList); (previousDev as ITransport).UnlinkButtons(TriList);
//if (previousDev is IRadio) //if (previousDev is IRadio)
@@ -1044,8 +1044,8 @@ namespace PepperDash.Essentials
(dev as IDvr).LinkButtons(TriList); (dev as IDvr).LinkButtons(TriList);
if (dev is INumericKeypad) if (dev is INumericKeypad)
(dev as INumericKeypad).LinkButtons(TriList); (dev as INumericKeypad).LinkButtons(TriList);
if (dev is IPower) if (dev is IHasPowerControl)
(dev as IPower).LinkButtons(TriList); (dev as IHasPowerControl).LinkButtons(TriList);
if (dev is ITransport) if (dev is ITransport)
(dev as ITransport).LinkButtons(TriList); (dev as ITransport).LinkButtons(TriList);
//if (dev is IRadio) //if (dev is IRadio)

View File

@@ -319,8 +319,8 @@ namespace PepperDash.Essentials
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () => TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
{ {
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IPower) if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IHasPowerControl)
(CurrentRoom.DefaultDisplay as IPower).PowerToggle(); (CurrentRoom.DefaultDisplay as IHasPowerControl).PowerToggle();
}); });
SetupNextMeetingTimer(); SetupNextMeetingTimer();
@@ -1293,8 +1293,8 @@ namespace PepperDash.Essentials
(previousDev as IDvr).UnlinkButtons(TriList); (previousDev as IDvr).UnlinkButtons(TriList);
if (previousDev is INumericKeypad) if (previousDev is INumericKeypad)
(previousDev as INumericKeypad).UnlinkButtons(TriList); (previousDev as INumericKeypad).UnlinkButtons(TriList);
if (previousDev is IPower) if (previousDev is IHasPowerControl)
(previousDev as IPower).UnlinkButtons(TriList); (previousDev as IHasPowerControl).UnlinkButtons(TriList);
if (previousDev is ITransport) if (previousDev is ITransport)
(previousDev as ITransport).UnlinkButtons(TriList); (previousDev as ITransport).UnlinkButtons(TriList);
} }
@@ -1351,8 +1351,8 @@ namespace PepperDash.Essentials
(dev as IDvr).LinkButtons(TriList); (dev as IDvr).LinkButtons(TriList);
if (dev is INumericKeypad) if (dev is INumericKeypad)
(dev as INumericKeypad).LinkButtons(TriList); (dev as INumericKeypad).LinkButtons(TriList);
if (dev is IPower) if (dev is IHasPowerControl)
(dev as IPower).LinkButtons(TriList); (dev as IHasPowerControl).LinkButtons(TriList);
if (dev is ITransport) if (dev is ITransport)
(dev as ITransport).LinkButtons(TriList); (dev as ITransport).LinkButtons(TriList);
} }

View File

@@ -6,7 +6,7 @@ using PepperDash.Essentials.Core.SmartObjects;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
public interface IDiscPlayerControls : IColor, IDPad, INumericKeypad, IPower, ITransport, IUiDisplayInfo public interface IDiscPlayerControls : IColor, IDPad, INumericKeypad, IHasPowerControl, ITransport, IUiDisplayInfo
{ {
} }

View File

@@ -14,8 +14,9 @@ using PepperDash.Essentials.Core.SmartObjects;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// /// Defines the ability to power a device on and off
/// </summary> /// </summary>
[Obsolete("Will be replaced by IHasPowerControlWithFeedback")]
public interface IPower public interface IPower
{ {
void PowerOn(); void PowerOn();
@@ -24,25 +25,53 @@ namespace PepperDash.Essentials.Core
BoolFeedback PowerIsOnFeedback { get; } BoolFeedback PowerIsOnFeedback { get; }
} }
/// <summary>
/// Adds feedback for current power state
/// </summary>
public interface IHasPowerControlWithFeedback : IHasPowerControl
{
BoolFeedback PowerIsOnFeedback { get; }
}
/// <summary>
/// Defines the ability to power a device on and off
/// </summary>
public interface IHasPowerControl
{
void PowerOn();
void PowerOff();
void PowerToggle();
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public static class IPowerExtensions public static class IHasPowerControlExtensions
{ {
public static void LinkButtons(this IPower dev, BasicTriList triList) public static void LinkButtons(this IHasPowerControl dev, BasicTriList triList)
{ {
triList.SetSigFalseAction(101, dev.PowerOn); triList.SetSigFalseAction(101, dev.PowerOn);
triList.SetSigFalseAction(102, dev.PowerOff); triList.SetSigFalseAction(102, dev.PowerOff);
triList.SetSigFalseAction(103, dev.PowerToggle); triList.SetSigFalseAction(103, dev.PowerToggle);
dev.PowerIsOnFeedback.LinkInputSig(triList.BooleanInput[101]);
var fbdev = dev as IHasPowerControlWithFeedback;
if (fbdev != null)
{
fbdev.PowerIsOnFeedback.LinkInputSig(triList.BooleanInput[101]);
}
} }
public static void UnlinkButtons(this IPower dev, BasicTriList triList) public static void UnlinkButtons(this IHasPowerControl dev, BasicTriList triList)
{ {
triList.ClearBoolSigAction(101); triList.ClearBoolSigAction(101);
triList.ClearBoolSigAction(102); triList.ClearBoolSigAction(102);
triList.ClearBoolSigAction(103); triList.ClearBoolSigAction(103);
dev.PowerIsOnFeedback.UnlinkInputSig(triList.BooleanInput[101]);
var fbdev = dev as IHasPowerControlWithFeedback;
if (fbdev != null)
{
fbdev.PowerIsOnFeedback.UnlinkInputSig(triList.BooleanInput[101]);
}
} }
} }
} }

View File

@@ -20,7 +20,9 @@ namespace PepperDash.Essentials.Core
public IrOutputPortController IrPort { get; private set; } public IrOutputPortController IrPort { get; private set; }
public ushort IrPulseTime { get; set; } public ushort IrPulseTime { get; set; }
protected override Func<bool> PowerIsOnFeedbackFunc public BoolFeedback PowerIsOnFeedback { get; private set; }
protected Func<bool> PowerIsOnFeedbackFunc
{ {
get { return () => _PowerIsOn; } get { return () => _PowerIsOn; }
} }
@@ -43,7 +45,10 @@ namespace PepperDash.Essentials.Core
IrPort = new IrOutputPortController(key + "-ir", port, irDriverFilepath); IrPort = new IrOutputPortController(key + "-ir", port, irDriverFilepath);
DeviceManager.AddDevice(IrPort); DeviceManager.AddDevice(IrPort);
PowerIsOnFeedback.OutputChange += (o, a) => { PowerIsOnFeedback = new BoolFeedback(PowerIsOnFeedbackFunc);
PowerIsOnFeedback.OutputChange += (o, a) =>
{
Debug.Console(2, this, "Power on={0}", _PowerIsOn); Debug.Console(2, this, "Power on={0}", _PowerIsOn);
if (_PowerIsOn) StartWarmingTimer(); if (_PowerIsOn) StartWarmingTimer();
else StartCoolingTimer(); else StartCoolingTimer();

View File

@@ -18,7 +18,7 @@ namespace PepperDash.Essentials.Core
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public abstract class DisplayBase : EssentialsDevice, IHasFeedback, IRoutingSinkWithSwitching, IPower, IWarmingCooling, IUsageTracking public abstract class DisplayBase : EssentialsDevice, IHasFeedback, IRoutingSinkWithSwitching, IHasPowerControl, IWarmingCooling, IUsageTracking
{ {
public event SourceInfoChangeHandler CurrentSourceChange; public event SourceInfoChangeHandler CurrentSourceChange;
@@ -46,7 +46,6 @@ namespace PepperDash.Essentials.Core
} }
SourceListItem _CurrentSourceInfo; SourceListItem _CurrentSourceInfo;
public BoolFeedback PowerIsOnFeedback { get; protected set; }
public BoolFeedback IsCoolingDownFeedback { get; protected set; } public BoolFeedback IsCoolingDownFeedback { get; protected set; }
public BoolFeedback IsWarmingUpFeedback { get; private set; } public BoolFeedback IsWarmingUpFeedback { get; private set; }
@@ -59,7 +58,6 @@ namespace PepperDash.Essentials.Core
/// Bool Func that will provide a value for the PowerIsOn Output. Must be implemented /// Bool Func that will provide a value for the PowerIsOn Output. Must be implemented
/// by concrete sub-classes /// by concrete sub-classes
/// </summary> /// </summary>
abstract protected Func<bool> PowerIsOnFeedbackFunc { get; }
abstract protected Func<bool> IsCoolingDownFeedbackFunc { get; } abstract protected Func<bool> IsCoolingDownFeedbackFunc { get; }
abstract protected Func<bool> IsWarmingUpFeedbackFunc { get; } abstract protected Func<bool> IsWarmingUpFeedbackFunc { get; }
@@ -76,25 +74,14 @@ namespace PepperDash.Essentials.Core
protected DisplayBase(string key, string name) protected DisplayBase(string key, string name)
: base(key, name) : base(key, name)
{ {
PowerIsOnFeedback = new BoolFeedback("PowerOnFeedback", PowerIsOnFeedbackFunc);
IsCoolingDownFeedback = new BoolFeedback("IsCoolingDown", IsCoolingDownFeedbackFunc); IsCoolingDownFeedback = new BoolFeedback("IsCoolingDown", IsCoolingDownFeedbackFunc);
IsWarmingUpFeedback = new BoolFeedback("IsWarmingUp", IsWarmingUpFeedbackFunc); IsWarmingUpFeedback = new BoolFeedback("IsWarmingUp", IsWarmingUpFeedbackFunc);
InputPorts = new RoutingPortCollection<RoutingInputPort>(); InputPorts = new RoutingPortCollection<RoutingInputPort>();
PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange;
} }
void PowerIsOnFeedback_OutputChange(object sender, EventArgs e)
{
if (UsageTracker != null)
{
if (PowerIsOnFeedback.BoolValue)
UsageTracker.StartDeviceUsage();
else
UsageTracker.EndDeviceUsage();
}
}
public abstract void PowerOn(); public abstract void PowerOn();
public abstract void PowerOff(); public abstract void PowerOff();
@@ -106,7 +93,6 @@ namespace PepperDash.Essentials.Core
{ {
return new FeedbackCollection<Feedback> return new FeedbackCollection<Feedback>
{ {
PowerIsOnFeedback,
IsCoolingDownFeedback, IsCoolingDownFeedback,
IsWarmingUpFeedback IsWarmingUpFeedback
}; };
@@ -171,7 +157,10 @@ namespace PepperDash.Essentials.Core
displayDevice.PowerOff(); displayDevice.PowerOff();
}); });
displayDevice.PowerIsOnFeedback.OutputChange += (o, a) => var twoWayDisplayDevice = displayDevice as TwoWayDisplayBase;
if (twoWayDisplayDevice != null)
{
twoWayDisplayDevice.PowerIsOnFeedback.OutputChange += (o, a) =>
{ {
if (!a.BoolValue) if (!a.BoolValue)
{ {
@@ -186,7 +175,9 @@ namespace PepperDash.Essentials.Core
} }
}; };
displayDevice.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]); twoWayDisplayDevice.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]);
twoWayDisplayDevice.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
}
// PowerOn // PowerOn
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () => trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () =>
@@ -197,7 +188,6 @@ namespace PepperDash.Essentials.Core
}); });
displayDevice.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
for (int i = 0; i < displayDevice.InputPorts.Count; i++) for (int i = 0; i < displayDevice.InputPorts.Count; i++)
{ {
@@ -265,12 +255,15 @@ namespace PepperDash.Essentials.Core
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public abstract class TwoWayDisplayBase : DisplayBase, IRoutingFeedback public abstract class TwoWayDisplayBase : DisplayBase, IRoutingFeedback, IHasPowerControlWithFeedback
{ {
public StringFeedback CurrentInputFeedback { get; private set; } public StringFeedback CurrentInputFeedback { get; private set; }
abstract protected Func<string> CurrentInputFeedbackFunc { get; } abstract protected Func<string> CurrentInputFeedbackFunc { get; }
public BoolFeedback PowerIsOnFeedback { get; protected set; }
abstract protected Func<bool> PowerIsOnFeedbackFunc { get; }
public static MockDisplay DefaultDisplay public static MockDisplay DefaultDisplay
{ {
@@ -291,11 +284,26 @@ namespace PepperDash.Essentials.Core
WarmupTime = 7000; WarmupTime = 7000;
CooldownTime = 15000; CooldownTime = 15000;
PowerIsOnFeedback = new BoolFeedback("PowerOnFeedback", PowerIsOnFeedbackFunc);
Feedbacks.Add(CurrentInputFeedback); Feedbacks.Add(CurrentInputFeedback);
Feedbacks.Add(PowerIsOnFeedback);
PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange;
} }
void PowerIsOnFeedback_OutputChange(object sender, EventArgs e)
{
if (UsageTracker != null)
{
if (PowerIsOnFeedback.BoolValue)
UsageTracker.StartDeviceUsage();
else
UsageTracker.EndDeviceUsage();
}
}
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange; public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
/// <summary> /// <summary>

View File

@@ -1227,11 +1227,6 @@ namespace PepperDash.Essentials.Core.Fusion
// Display to fusion room sigs // Display to fusion room sigs
FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction; FusionRoom.DisplayPowerOn.OutputSig.UserObject = dispPowerOnAction;
FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction; FusionRoom.DisplayPowerOff.OutputSig.UserObject = dispPowerOffAction;
defaultDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
if (defaultDisplay is IDisplayUsage)
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
MapDisplayToRoomJoins(1, 158, defaultDisplay); MapDisplayToRoomJoins(1, 158, defaultDisplay);
@@ -1256,8 +1251,18 @@ namespace PepperDash.Essentials.Core.Fusion
var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId); var dispAsset = FusionRoom.CreateStaticAsset(tempAsset.SlotNumber, tempAsset.Name, "Display", tempAsset.InstanceId);
dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction; dispAsset.PowerOn.OutputSig.UserObject = dispPowerOnAction;
dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction; dispAsset.PowerOff.OutputSig.UserObject = dispPowerOffAction;
defaultDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
// NO!! display.PowerIsOn.LinkComplementInputSig(dispAsset.PowerOff.InputSig); var defaultTwoWayDisplay = defaultDisplay as IHasPowerControlWithFeedback;
if (defaultTwoWayDisplay != null)
{
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(FusionRoom.DisplayPowerOn.InputSig);
if (defaultDisplay is IDisplayUsage)
(defaultDisplay as IDisplayUsage).LampHours.LinkInputSig(FusionRoom.DisplayUsage.InputSig);
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(dispAsset.PowerOn.InputSig);
}
// Use extension methods // Use extension methods
dispAsset.TrySetMakeModel(defaultDisplay); dispAsset.TrySetMakeModel(defaultDisplay);
dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay); dispAsset.TryLinkAssetErrorToCommunication(defaultDisplay);
@@ -1289,12 +1294,18 @@ namespace PepperDash.Essentials.Core.Fusion
// Power on // Power on
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig); var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); }); defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOn(); });
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
// Power Off // Power Off
var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig); var defaultDisplayPowerOff = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 1, displayName + "Power Off", eSigIoMask.InputOutputSig);
defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ; defaultDisplayPowerOn.OutputSig.UserObject = new Action<bool>(b => { if (!b) display.PowerOff(); }); ;
display.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
var defaultTwoWayDisplay = display as IHasPowerControlWithFeedback;
if (defaultTwoWayDisplay != null)
{
defaultTwoWayDisplay.PowerIsOnFeedback.LinkInputSig(defaultDisplayPowerOn.InputSig);
defaultTwoWayDisplay.PowerIsOnFeedback.LinkComplementInputSig(defaultDisplayPowerOff.InputSig);
}
// Current Source // Current Source
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig); var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);

View File

@@ -83,7 +83,7 @@
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath> <HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
</Reference> </Reference>
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PepperDash_Core, Version=1.0.41.31808, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath> <HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
</Reference> </Reference>

View File

@@ -59,7 +59,7 @@
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath> <HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
</Reference> </Reference>
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PepperDash_Core, Version=1.0.41.31808, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath> <HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
</Reference> </Reference>

View File

@@ -181,14 +181,18 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
}); });
} }
if (cameraDevice is IPower) var powerCamera = cameraDevice as IHasPowerControl;
if (powerCamera != null)
{ {
var powerCamera = cameraDevice as IPower;
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () => powerCamera.PowerOn()); trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () => powerCamera.PowerOn());
trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, () => powerCamera.PowerOff()); trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, () => powerCamera.PowerOff());
powerCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]); var powerFbCamera = powerCamera as IHasPowerControlWithFeedback;
powerCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]); if (powerFbCamera != null)
{
powerFbCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
powerFbCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]);
}
} }
if (cameraDevice is ICommunicationMonitor) if (cameraDevice is ICommunicationMonitor)

View File

@@ -92,8 +92,6 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
/// </summary> /// </summary>
public interface IHasCameraPanControl : IHasCameraControls public interface IHasCameraPanControl : IHasCameraControls
{ {
// void PanLeft(bool pressRelease);
// void PanRight(bool pressRelease);
void PanLeft(); void PanLeft();
void PanRight(); void PanRight();
void PanStop(); void PanStop();
@@ -104,8 +102,6 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
/// </summary> /// </summary>
public interface IHasCameraTiltControl : IHasCameraControls public interface IHasCameraTiltControl : IHasCameraControls
{ {
// void TiltDown(bool pressRelease);
// void TildUp(bool pressRelease);
void TiltDown(); void TiltDown();
void TiltUp(); void TiltUp();
void TiltStop(); void TiltStop();
@@ -116,8 +112,6 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
/// </summary> /// </summary>
public interface IHasCameraZoomControl : IHasCameraControls public interface IHasCameraZoomControl : IHasCameraControls
{ {
// void ZoomIn(bool pressRelease);
// void ZoomOut(bool pressRelease);
void ZoomIn(); void ZoomIn();
void ZoomOut(); void ZoomOut();
void ZoomStop(); void ZoomStop();
@@ -135,6 +129,13 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
void TriggerAutoFocus(); void TriggerAutoFocus();
} }
public interface IHasAutoFocusMode
{
void SetFocusModeAuto();
void SetFocusModeManual();
void ToggleFocusMode();
}
public interface IHasCameraAutoMode : IHasCameraControls public interface IHasCameraAutoMode : IHasCameraControls
{ {
void CameraAutoModeOn(); void CameraAutoModeOn();

View File

@@ -12,29 +12,86 @@ using PepperDash.Essentials.Devices.Common.Codec;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Crestron.SimplSharp.Reflection; using Crestron.SimplSharp.Reflection;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.Cameras namespace PepperDash.Essentials.Devices.Common.Cameras
{ {
public class CameraVisca : CameraBase, IHasCameraPtzControl, ICommunicationMonitor, IHasCameraPresets, IPower, IBridgeAdvanced public class CameraVisca : CameraBase, IHasCameraPtzControl, ICommunicationMonitor, IHasCameraPresets, IHasPowerControlWithFeedback, IBridgeAdvanced, IHasCameraFocusControl, IHasAutoFocusMode
{ {
CameraViscaPropertiesConfig PropertiesConfig;
public IBasicCommunication Communication { get; private set; } public IBasicCommunication Communication { get; private set; }
public CommunicationGather PortGather { get; private set; }
public StatusMonitorBase CommunicationMonitor { get; private set; } public StatusMonitorBase CommunicationMonitor { get; private set; }
public byte PanSpeed = 0x10; /// <summary>
public byte TiltSpeed = 0x10; /// Used to store the actions to parse inquiry responses as the inquiries are sent
/// </summary>
private CrestronQueue<Action<byte[]>> InquiryResponseQueue;
/// <summary>
/// Camera ID (Default 1)
/// </summary>
public byte ID = 0x01;
public byte ResponseID;
public byte PanSpeedSlow = 0x10;
public byte TiltSpeedSlow = 0x10;
public byte PanSpeedFast = 0x13;
public byte TiltSpeedFast = 0x13;
private bool IsMoving; private bool IsMoving;
private bool IsZooming; private bool IsZooming;
public bool PowerIsOn { get; private set; }
bool _powerIsOn;
public bool PowerIsOn
{
get
{
return _powerIsOn;
}
private set
{
if (value != _powerIsOn)
{
_powerIsOn = value;
PowerIsOnFeedback.FireUpdate();
CameraIsOffFeedback.FireUpdate();
}
}
}
const byte ZoomInCmd = 0x02;
const byte ZoomOutCmd = 0x03;
const byte ZoomStopCmd = 0x00;
/// <summary>
/// Used to determine when to move the camera at a faster speed if a direction is held
/// </summary>
CTimer SpeedTimer;
// TODO: Implment speed timer for PTZ controls
long FastSpeedHoldTimeMs = 2000;
byte[] IncomingBuffer = new byte[] { }; byte[] IncomingBuffer = new byte[] { };
public BoolFeedback PowerIsOnFeedback { get; private set; } public BoolFeedback PowerIsOnFeedback { get; private set; }
public CameraVisca(string key, string name, IBasicCommunication comm, CameraPropertiesConfig props) : public CameraVisca(string key, string name, IBasicCommunication comm, CameraViscaPropertiesConfig props) :
base(key, name) base(key, name)
{ {
InquiryResponseQueue = new CrestronQueue<Action<byte[]>>(15);
Presets = props.Presets; Presets = props.Presets;
PropertiesConfig = props;
ID = (byte)(props.Id + 0x80);
ResponseID = (byte)((props.Id * 0x10) + 0x80);
SetupCameraSpeeds();
OutputPorts.Add(new RoutingOutputPort("videoOut", eRoutingSignalType.Video, eRoutingPortConnectionType.None, null, this, true)); OutputPorts.Add(new RoutingOutputPort("videoOut", eRoutingSignalType.Video, eRoutingPortConnectionType.None, null, this, true));
// Default to all capabilties // Default to all capabilties
@@ -51,11 +108,10 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
{ {
// This instance uses RS-232 control // This instance uses RS-232 control
} }
PortGather = new CommunicationGather(Communication, "\xFF");
Communication.BytesReceived += new EventHandler<GenericCommMethodReceiveBytesArgs>(Communication_BytesReceived); Communication.BytesReceived += new EventHandler<GenericCommMethodReceiveBytesArgs>(Communication_BytesReceived);
PowerIsOnFeedback = new BoolFeedback(() => { return PowerIsOn; }); PowerIsOnFeedback = new BoolFeedback(() => { return PowerIsOn; });
CameraIsOffFeedback = new BoolFeedback(() => { return !PowerIsOn; });
if (props.CommunicationMonitorProperties != null) if (props.CommunicationMonitorProperties != null)
{ {
@@ -66,9 +122,38 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 20000, 120000, 300000, "\x81\x09\x04\x00\xFF"); CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 20000, 120000, 300000, "\x81\x09\x04\x00\xFF");
} }
DeviceManager.AddDevice(CommunicationMonitor); DeviceManager.AddDevice(CommunicationMonitor);
} }
/// <summary>
/// Sets up camera speed values based on config
/// </summary>
void SetupCameraSpeeds()
{
if (PropertiesConfig.FastSpeedHoldTimeMs > 0)
{
FastSpeedHoldTimeMs = PropertiesConfig.FastSpeedHoldTimeMs;
}
if (PropertiesConfig.PanSpeedSlow > 0)
{
PanSpeedSlow = (byte)PropertiesConfig.PanSpeedSlow;
}
if (PropertiesConfig.PanSpeedFast > 0)
{
PanSpeedFast = (byte)PropertiesConfig.PanSpeedFast;
}
if (PropertiesConfig.TiltSpeedSlow > 0)
{
TiltSpeedSlow = (byte)PropertiesConfig.TiltSpeedSlow;
}
if (PropertiesConfig.TiltSpeedFast > 0)
{
TiltSpeedFast = (byte)PropertiesConfig.TiltSpeedFast;
}
}
public override bool CustomActivate() public override bool CustomActivate()
{ {
Communication.Connect(); Communication.Connect();
@@ -110,39 +195,244 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
Communication.SendBytes(b); Communication.SendBytes(b);
} }
void Communication_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs e) void Communication_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs e)
{
var newBytes = new byte[IncomingBuffer.Length + e.Bytes.Length];
try
{ {
// This is probably not thread-safe buffering // This is probably not thread-safe buffering
// Append the incoming bytes with whatever is in the buffer // Append the incoming bytes with whatever is in the buffer
var newBytes = new byte[IncomingBuffer.Length + e.Bytes.Length];
IncomingBuffer.CopyTo(newBytes, 0); IncomingBuffer.CopyTo(newBytes, 0);
e.Bytes.CopyTo(newBytes, IncomingBuffer.Length); e.Bytes.CopyTo(newBytes, IncomingBuffer.Length);
if (Debug.Level == 2) // This check is here to prevent following string format from building unnecessarily on level 0 or 1 if (Debug.Level == 2) // This check is here to prevent following string format from building unnecessarily on level 0 or 1
Debug.Console(2, this, "Received:{0}", ComTextHelper.GetEscapedText(newBytes)); Debug.Console(2, this, "Received:{0}", ComTextHelper.GetEscapedText(newBytes));
byte[] message = new byte[] { };
// Search for the delimiter 0xFF character
for (int i = 0; i < newBytes.Length; i++)
{
if (newBytes[i] == 0xFF)
{
// i will be the index of the delmiter character
message = newBytes.Take(i).ToArray();
// Skip over what we just took and save the rest for next time
newBytes = newBytes.Skip(i).ToArray();
}
} }
if (message.Length > 0)
private void SendPanTiltCommand (byte[] cmd)
{ {
var temp = new Byte[] { 0x81, 0x01, 0x06, 0x01, PanSpeed, TiltSpeed }; // Check for matching ID
if (message[0] != ResponseID)
{
return;
}
switch (message[1])
{
case 0x40:
{
// ACK received
Debug.Console(2, this, "ACK Received");
break;
}
case 0x50:
{
if (message[2] == 0xFF)
{
// Completion received
Debug.Console(2, this, "Completion Received");
}
else
{
// Inquiry response received. Dequeue the next response handler and invoke it
if (InquiryResponseQueue.Count > 0)
{
var inquiryAction = InquiryResponseQueue.Dequeue();
inquiryAction.Invoke(message.Skip(2).ToArray());
}
else
{
Debug.Console(2, this, "Response Queue is empty. Nothing to dequeue.");
}
}
break;
}
case 0x60:
{
// Error message
switch (message[2])
{
case 0x01:
{
// Message Length Error
Debug.Console(2, this, "Error from device: Message Length Error");
break;
}
case 0x02:
{
// Syntax Error
Debug.Console(2, this, "Error from device: Syntax Error");
break;
}
case 0x03:
{
// Command Buffer Full
Debug.Console(2, this, "Error from device: Command Buffer Full");
break;
}
case 0x04:
{
// Command Cancelled
Debug.Console(2, this, "Error from device: Command Cancelled");
break;
}
case 0x05:
{
// No Socket
Debug.Console(2, this, "Error from device: No Socket");
break;
}
case 0x41:
{
// Command not executable
Debug.Console(2, this, "Error from device: Command not executable");
break;
}
}
break;
}
}
if (message == new byte[] { ResponseID, 0x50, 0x02, 0xFF })
{
PowerIsOn = true;
}
else if (message == new byte[] { ResponseID, 0x50, 0x03, 0xFF })
{
PowerIsOn = false;
}
}
}
catch (Exception err)
{
Debug.Console(2, this, "Error parsing feedback: {0}", err);
}
finally
{
// Save whatever partial message is here
IncomingBuffer = newBytes;
}
}
/// <summary>
/// Sends a pan/tilt command. If the command is not for fastSpeed then it starts a timer to initiate fast speed.
/// </summary>
/// <param name="cmd"></param>
/// <param name="fastSpeed"></param>
private void SendPanTiltCommand (byte[] cmd, bool fastSpeedEnabled)
{
SendBytes(GetPanTiltCommand(cmd, fastSpeedEnabled));
if (!fastSpeedEnabled)
{
if (SpeedTimer != null)
{
StopSpeedTimer();
}
// Start the timer to send fast speed if still moving after FastSpeedHoldTime elapses
SpeedTimer = new CTimer((o) => SendPanTiltCommand(GetPanTiltCommand(cmd, true), true), FastSpeedHoldTimeMs);
}
}
private void StopSpeedTimer()
{
if (SpeedTimer != null)
{
SpeedTimer.Stop();
SpeedTimer.Dispose();
SpeedTimer = null;
}
}
/// <summary>
/// Generates the pan/tilt command with either slow or fast speed
/// </summary>
/// <param name="cmd"></param>
/// <param name="fastSpeed"></param>
/// <returns></returns>
private byte[] GetPanTiltCommand(byte[] cmd, bool fastSpeed)
{
byte panSpeed;
byte tiltSpeed;
if (!fastSpeed)
{
panSpeed = PanSpeedSlow;
tiltSpeed = TiltSpeedSlow;
}
else
{
panSpeed = PanSpeedFast;
tiltSpeed = TiltSpeedFast;
}
var temp = new byte[] { ID, 0x01, 0x06, 0x01, panSpeed, tiltSpeed };
int length = temp.Length + cmd.Length + 1; int length = temp.Length + cmd.Length + 1;
byte[] sum = new byte[length]; byte[] sum = new byte[length];
temp.CopyTo(sum, 0); temp.CopyTo(sum, 0);
cmd.CopyTo(sum, temp.Length); cmd.CopyTo(sum, temp.Length);
sum[length - 1] = 0xFF; sum[length - 1] = 0xFF;
SendBytes(sum);
return sum;
}
void SendPowerQuery()
{
SendBytes(new byte[] { ID, 0x09, 0x04, 0x00, 0xFF });
InquiryResponseQueue.Enqueue(HandlePowerResponse);
} }
public void PowerOn() public void PowerOn()
{ {
SendBytes(new byte[] { ID, 0x01, 0x04, 0x00, 0x02, 0xFF });
SendPowerQuery();
}
SendBytes(new Byte[] { 0x81, 0x01, 0x04, 0x00, 0x02, 0xFF }); void HandlePowerResponse(byte[] response)
{
switch (response[0])
{
case 0x02:
{
PowerIsOn = true;
break;
}
case 0x03:
{
PowerIsOn = false;
break;
}
}
} }
public void PowerOff() public void PowerOff()
{ {
SendBytes(new Byte[] {0x81, 0x01, 0x04, 0x00, 0x03, 0xFF}); SendBytes(new byte[] {ID, 0x01, 0x04, 0x00, 0x03, 0xFF});
SendPowerQuery();
} }
public void PowerToggle() public void PowerToggle()
@@ -155,12 +445,12 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
public void PanLeft() public void PanLeft()
{ {
SendPanTiltCommand(new byte[] {0x01, 0x03}); SendPanTiltCommand(new byte[] {0x01, 0x03}, false);
IsMoving = true; IsMoving = true;
} }
public void PanRight() public void PanRight()
{ {
SendPanTiltCommand(new byte[] { 0x02, 0x03 }); SendPanTiltCommand(new byte[] { 0x02, 0x03 }, false);
IsMoving = true; IsMoving = true;
} }
public void PanStop() public void PanStop()
@@ -169,12 +459,12 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
} }
public void TiltDown() public void TiltDown()
{ {
SendPanTiltCommand(new byte[] { 0x03, 0x02 }); SendPanTiltCommand(new byte[] { 0x03, 0x02 }, false);
IsMoving = true; IsMoving = true;
} }
public void TiltUp() public void TiltUp()
{ {
SendPanTiltCommand(new byte[] { 0x03, 0x01 }); SendPanTiltCommand(new byte[] { 0x03, 0x01 }, false);
IsMoving = true; IsMoving = true;
} }
public void TiltStop() public void TiltStop()
@@ -184,16 +474,18 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
private void SendZoomCommand (byte cmd) private void SendZoomCommand (byte cmd)
{ {
SendBytes(new byte[] {0x81, 0x01, 0x04, 0x07, cmd, 0xFF} ); SendBytes(new byte[] {ID, 0x01, 0x04, 0x07, cmd, 0xFF} );
} }
public void ZoomIn() public void ZoomIn()
{ {
SendZoomCommand(0x02); SendZoomCommand(ZoomInCmd);
IsZooming = true; IsZooming = true;
} }
public void ZoomOut() public void ZoomOut()
{ {
SendZoomCommand(0x03); SendZoomCommand(ZoomOutCmd);
IsZooming = true; IsZooming = true;
} }
public void ZoomStop() public void ZoomStop()
@@ -205,26 +497,28 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
{ {
if (IsZooming) if (IsZooming)
{ {
SendZoomCommand(0x00); SendZoomCommand(ZoomStopCmd);
IsZooming = false; IsZooming = false;
} }
else else
{ {
SendPanTiltCommand(new byte[] {0x03, 0x03}); StopSpeedTimer();
SendPanTiltCommand(new byte[] { 0x03, 0x03 }, false);
IsMoving = false; IsMoving = false;
} }
} }
public void PositionHome() public void PositionHome()
{ {
throw new NotImplementedException(); SendBytes(new byte[] { ID, 0x01, 0x06, 0x02, PanSpeedFast, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF });
SendBytes(new byte[] { ID, 0x01, 0x04, 0x47, 0x00, 0x00, 0x00, 0x00, 0xFF });
} }
public void RecallPreset(int presetNumber) public void RecallPreset(int presetNumber)
{ {
SendBytes(new byte[] {0x81, 0x01, 0x04, 0x3F, 0x02, (byte)presetNumber, 0xFF} ); SendBytes(new byte[] {ID, 0x01, 0x04, 0x3F, 0x02, (byte)presetNumber, 0xFF} );
} }
public void SavePreset(int presetNumber) public void SavePreset(int presetNumber)
{ {
SendBytes(new byte[] { 0x81, 0x01, 0x04, 0x3F, 0x01, (byte)presetNumber, 0xFF }); SendBytes(new byte[] { ID, 0x01, 0x04, 0x3F, 0x01, (byte)presetNumber, 0xFF });
} }
#region IHasCameraPresets Members #region IHasCameraPresets Members
@@ -244,6 +538,90 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
} }
#endregion #endregion
#region IHasCameraFocusControl Members
public void FocusNear()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x08, 0x03, 0xFF });
}
public void FocusFar()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x08, 0x02, 0xFF });
}
public void FocusStop()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x08, 0x00, 0xFF });
}
public void TriggerAutoFocus()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x18, 0x01, 0xFF });
SendAutoFocusQuery();
}
#endregion
#region IHasAutoFocus Members
public void SetFocusModeAuto()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x38, 0x02, 0xFF });
SendAutoFocusQuery();
}
public void SetFocusModeManual()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x38, 0x03, 0xFF });
SendAutoFocusQuery();
}
public void ToggleFocusMode()
{
SendBytes(new byte[] { ID, 0x01, 0x04, 0x38, 0x10, 0xFF });
SendAutoFocusQuery();
}
#endregion
void SendAutoFocusQuery()
{
SendBytes(new byte[] { ID, 0x09, 0x04, 0x38, 0xFF });
InquiryResponseQueue.Enqueue(HandleAutoFocusResponse);
}
void HandleAutoFocusResponse(byte[] response)
{
switch (response[0])
{
case 0x02:
{
// Auto Mode
PowerIsOn = true;
break;
}
case 0x03:
{
// Manual Mode
PowerIsOn = false;
break;
}
}
}
#region IHasCameraOff Members
public BoolFeedback CameraIsOffFeedback { get; private set; }
public void CameraOff()
{
PowerOff();
}
#endregion
} }
public class CameraViscaFactory : EssentialsDeviceFactory<CameraVisca> public class CameraViscaFactory : EssentialsDeviceFactory<CameraVisca>
@@ -257,10 +635,51 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
{ {
Debug.Console(1, "Factory Attempting to create new CameraVisca Device"); Debug.Console(1, "Factory Attempting to create new CameraVisca Device");
var comm = CommFactory.CreateCommForDevice(dc); var comm = CommFactory.CreateCommForDevice(dc);
var props = Newtonsoft.Json.JsonConvert.DeserializeObject<Cameras.CameraPropertiesConfig>( var props = Newtonsoft.Json.JsonConvert.DeserializeObject<Cameras.CameraViscaPropertiesConfig>(
dc.Properties.ToString()); dc.Properties.ToString());
return new Cameras.CameraVisca(dc.Key, dc.Name, comm, props); return new Cameras.CameraVisca(dc.Key, dc.Name, comm, props);
} }
} }
public class CameraViscaPropertiesConfig : CameraPropertiesConfig
{
/// <summary>
/// Control ID of the camera (1-7)
/// </summary>
[JsonProperty("id")]
public uint Id { get; set; }
/// <summary>
/// Slow Pan speed (0-18)
/// </summary>
[JsonProperty("panSpeedSlow")]
public uint PanSpeedSlow { get; set; }
/// <summary>
/// Fast Pan speed (0-18)
/// </summary>
[JsonProperty("panSpeedFast")]
public uint PanSpeedFast { get; set; }
/// <summary>
/// Slow tilt speed (0-18)
/// </summary>
[JsonProperty("tiltSpeedSlow")]
public uint TiltSpeedSlow { get; set; }
/// <summary>
/// Fast tilt speed (0-18)
/// </summary>
[JsonProperty("tiltSpeedFast")]
public uint TiltSpeedFast { get; set; }
/// <summary>
/// Time a button must be held before fast speed is engaged (Milliseconds)
/// </summary>
[JsonProperty("fastSpeedHoldTimeMs")]
public uint FastSpeedHoldTimeMs { get; set; }
}
} }

View File

@@ -14,6 +14,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
void AddExternalSource(string connectorId, string key, string name, eExternalSourceType type); void AddExternalSource(string connectorId, string key, string name, eExternalSourceType type);
void SetExternalSourceState(string key, eExternalSourceMode mode); void SetExternalSourceState(string key, eExternalSourceMode mode);
void ClearExternalSources(); void ClearExternalSources();
void SetSelectedSource(string key);
Action<string, string> RunRouteAction { set;} Action<string, string> RunRouteAction { set;}
} }

View File

@@ -10,26 +10,28 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Displays namespace PepperDash.Essentials.Devices.Displays
{ {
public abstract class ComTcpDisplayBase : DisplayBase, IPower [Obsolete("Please use TwoWayDisplayBase instead")]
public abstract class ComTcpDisplayBase : TwoWayDisplayBase
{ {
/// <summary>
/// Sets the communication method for this - swaps out event handlers and output handlers ///// <summary>
/// </summary> ///// Sets the communication method for this - swaps out event handlers and output handlers
public IBasicCommunication CommunicationMethod ///// </summary>
{ //public IBasicCommunication CommunicationMethod
get { return _CommunicationMethod; } //{
set // get { return _CommunicationMethod; }
{ // set
if (_CommunicationMethod != null) // {
_CommunicationMethod.BytesReceived -= this.CommunicationMethod_BytesReceived; // if (_CommunicationMethod != null)
// Outputs??? // _CommunicationMethod.BytesReceived -= this.CommunicationMethod_BytesReceived;
_CommunicationMethod = value; // // Outputs???
if (_CommunicationMethod != null) // _CommunicationMethod = value;
_CommunicationMethod.BytesReceived += this.CommunicationMethod_BytesReceived; // if (_CommunicationMethod != null)
// Outputs? // _CommunicationMethod.BytesReceived += this.CommunicationMethod_BytesReceived;
} // // Outputs?
} // }
IBasicCommunication _CommunicationMethod; //}
//IBasicCommunication _CommunicationMethod;
public ComTcpDisplayBase(string key, string name) public ComTcpDisplayBase(string key, string name)
: base(key, name) : base(key, name)
@@ -38,6 +40,6 @@ namespace PepperDash.Essentials.Devices.Displays
} }
protected abstract void CommunicationMethod_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args); //protected abstract void CommunicationMethod_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args);
} }
} }

View File

@@ -11,217 +11,222 @@ using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.Devices.Displays namespace PepperDash.Essentials.Devices.Displays
{ {
public class NecPaSeriesProjector : ComTcpDisplayBase, IBridgeAdvanced //public class NecPaSeriesProjector : TwoWayDisplayBase, IBridgeAdvanced
{ //{
public readonly IntFeedback Lamp1RemainingPercent; // public readonly IntFeedback Lamp1RemainingPercent;
int _Lamp1RemainingPercent; // int _Lamp1RemainingPercent;
public readonly IntFeedback Lamp2RemainingPercent; // public readonly IntFeedback Lamp2RemainingPercent;
int _Lamp2RemainingPercent; // int _Lamp2RemainingPercent;
protected override Func<bool> PowerIsOnFeedbackFunc
{
get { return () => _PowerIsOn; }
}
bool _PowerIsOn;
protected override Func<bool> IsCoolingDownFeedbackFunc // RoutingInputPort _CurrentInputPort;
{
get { return () => false; }
}
protected override Func<bool> IsWarmingUpFeedbackFunc // protected override Func<string> CurrentInputFeedbackFunc { get { return () => _CurrentInputPort.Key; } }
{
get { return () => false; }
}
public override void PowerToggle() // protected override Func<bool> PowerIsOnFeedbackFunc
{ // {
throw new NotImplementedException(); // get { return () => _PowerIsOn; }
} // }
// bool _PowerIsOn;
public override void ExecuteSwitch(object selector) // protected override Func<bool> IsCoolingDownFeedbackFunc
{ // {
throw new NotImplementedException(); // get { return () => false; }
} // }
Dictionary<string, string> InputMap; // protected override Func<bool> IsWarmingUpFeedbackFunc
// {
// get { return () => false; }
// }
/// <summary> // public override void PowerToggle()
/// Constructor // {
/// </summary> // throw new NotImplementedException();
public NecPaSeriesProjector(string key, string name) // }
: base(key, name)
{
Lamp1RemainingPercent = new IntFeedback("Lamp1RemainingPercent", () => _Lamp1RemainingPercent);
Lamp2RemainingPercent = new IntFeedback("Lamp2RemainingPercent", () => _Lamp2RemainingPercent);
InputMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) // public override void ExecuteSwitch(object selector)
{ // {
{ "computer1", "\x02\x03\x00\x00\x02\x01\x01\x09" }, // throw new NotImplementedException();
{ "computer2", "\x02\x03\x00\x00\x02\x01\x02\x0a" }, // }
{ "computer3", "\x02\x03\x00\x00\x02\x01\x03\x0b" },
{ "hdmi", "\x02\x03\x00\x00\x02\x01\x1a\x22" },
{ "dp", "\x02\x03\x00\x00\x02\x01\x1b\x23" },
{ "video", "\x02\x03\x00\x00\x02\x01\x06\x0e" },
{ "viewer", "\x02\x03\x00\x00\x02\x01\x1f\x27" },
{ "network", "\x02\x03\x00\x00\x02\x01\x20\x28" },
};
}
void IsConnected_OutputChange(object sender, EventArgs e) // Dictionary<string, string> InputMap;
{
} // /// <summary>
// /// Constructor
// /// </summary>
// public NecPaSeriesProjector(string key, string name)
// : base(key, name)
// {
// Lamp1RemainingPercent = new IntFeedback("Lamp1RemainingPercent", () => _Lamp1RemainingPercent);
// Lamp2RemainingPercent = new IntFeedback("Lamp2RemainingPercent", () => _Lamp2RemainingPercent);
public void SetEnable(bool state) // InputMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
{ // {
var tcp = CommunicationMethod as GenericTcpIpClient; // { "computer1", "\x02\x03\x00\x00\x02\x01\x01\x09" },
if (tcp != null) // { "computer2", "\x02\x03\x00\x00\x02\x01\x02\x0a" },
{ // { "computer3", "\x02\x03\x00\x00\x02\x01\x03\x0b" },
tcp.Connect(); // { "hdmi", "\x02\x03\x00\x00\x02\x01\x1a\x22" },
} // { "dp", "\x02\x03\x00\x00\x02\x01\x1b\x23" },
} // { "video", "\x02\x03\x00\x00\x02\x01\x06\x0e" },
// { "viewer", "\x02\x03\x00\x00\x02\x01\x1f\x27" },
// { "network", "\x02\x03\x00\x00\x02\x01\x20\x28" },
// };
// }
public override void PowerOn() // void IsConnected_OutputChange(object sender, EventArgs e)
{ // {
SendText("\x02\x00\x00\x00\x00\x02");
}
public override void PowerOff() // }
{
SendText("\x02\x01\x00\x00\x00\x03");
}
public void PictureMuteOn() // public void SetEnable(bool state)
{ // {
SendText("\x02\x10\x00\x00\x00\x12"); // var tcp = CommunicationMethod as GenericTcpIpClient;
} // if (tcp != null)
// {
// tcp.Connect();
// }
// }
public void PictureMuteOff() // public override void PowerOn()
{ // {
SendText("\x02\x11\x00\x00\x00\x13"); // SendText("\x02\x00\x00\x00\x00\x02");
} // }
public void GetRunningStatus() // public override void PowerOff()
{ // {
SendText("\x00\x85\x00\x00\x01\x01\x87"); // SendText("\x02\x01\x00\x00\x00\x03");
} // }
public void GetLampRemaining(int lampNum) // public void PictureMuteOn()
{ // {
if (!_PowerIsOn) return; // SendText("\x02\x10\x00\x00\x00\x12");
// }
var bytes = new byte[]{0x03,0x96,0x00,0x00,0x02,0x00,0x04}; // public void PictureMuteOff()
if (lampNum == 2) // {
bytes[5] = 0x01; // SendText("\x02\x11\x00\x00\x00\x13");
SendBytes(AppendChecksum(bytes)); // }
}
public void SelectInput(string inputKey) // public void GetRunningStatus()
{ // {
if (InputMap.ContainsKey(inputKey)) // SendText("\x00\x85\x00\x00\x01\x01\x87");
SendText(InputMap[inputKey]); // }
}
void SendText(string text) // public void GetLampRemaining(int lampNum)
{ // {
if (CommunicationMethod != null) // if (!_PowerIsOn) return;
CommunicationMethod.SendText(text);
}
void SendBytes(byte[] bytes) // var bytes = new byte[]{0x03,0x96,0x00,0x00,0x02,0x00,0x04};
{ // if (lampNum == 2)
if (CommunicationMethod != null) // bytes[5] = 0x01;
CommunicationMethod.SendBytes(bytes); // SendBytes(AppendChecksum(bytes));
} // }
byte[] AppendChecksum(byte[] bytes) // public void SelectInput(string inputKey)
{ // {
byte sum = unchecked((byte)bytes.Sum(x => (int)x)); // if (InputMap.ContainsKey(inputKey))
var retVal = new byte[bytes.Length + 1]; // SendText(InputMap[inputKey]);
bytes.CopyTo(retVal, 0); // }
retVal[retVal.Length - 1] = sum;
return retVal;
}
protected override void CommunicationMethod_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args) // void SendText(string text)
{ // {
var bytes = args.Bytes; // if (CommunicationMethod != null)
ParseBytes(args.Bytes); // CommunicationMethod.SendText(text);
} // }
void ParseBytes(byte[] bytes) // void SendBytes(byte[] bytes)
{ // {
if (bytes[0] == 0x22) // if (CommunicationMethod != null)
{ // CommunicationMethod.SendBytes(bytes);
// Power on // }
if (bytes[1] == 0x00)
{
_PowerIsOn = true;
PowerIsOnFeedback.FireUpdate();
}
// Power off
else if (bytes[1] == 0x01)
{
_PowerIsOn = false;
PowerIsOnFeedback.FireUpdate();
}
}
// Running Status
else if (bytes[0] == 0x20 && bytes[1] == 0x85 && bytes[4] == 0x10)
{
var operationStates = new Dictionary<int, string>
{
{ 0x00, "Standby" },
{ 0x04, "Power On" },
{ 0x05, "Cooling" },
{ 0x06, "Standby (error)" },
{ 0x0f, "Standby (power saving" },
{ 0x10, "Network Standby" },
{ 0xff, "Not supported" }
};
var newPowerIsOn = bytes[7] == 0x01; // byte[] AppendChecksum(byte[] bytes)
if (newPowerIsOn != _PowerIsOn) // {
{ // byte sum = unchecked((byte)bytes.Sum(x => (int)x));
_PowerIsOn = newPowerIsOn; // var retVal = new byte[bytes.Length + 1];
PowerIsOnFeedback.FireUpdate(); // bytes.CopyTo(retVal, 0);
} // retVal[retVal.Length - 1] = sum;
// return retVal;
// }
Debug.Console(2, this, "PowerIsOn={0}\rCooling={1}\rPowering on/off={2}\rStatus={3}", // protected override void CommunicationMethod_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args)
_PowerIsOn, // {
bytes[8] == 0x01, // var bytes = args.Bytes;
bytes[9] == 0x01, // ParseBytes(args.Bytes);
operationStates[bytes[10]]); // }
} // void ParseBytes(byte[] bytes)
// Lamp remaining // {
else if (bytes[0] == 0x23 && bytes[1] == 0x96 && bytes[4] == 0x06 && bytes[6] == 0x04) // if (bytes[0] == 0x22)
{ // {
var newValue = bytes[7]; // // Power on
if (bytes[5] == 0x00) // if (bytes[1] == 0x00)
{ // {
if (newValue != _Lamp1RemainingPercent) // _PowerIsOn = true;
{ // PowerIsOnFeedback.FireUpdate();
_Lamp1RemainingPercent = newValue; // }
Lamp1RemainingPercent.FireUpdate(); // // Power off
} // else if (bytes[1] == 0x01)
} // {
else // _PowerIsOn = false;
{ // PowerIsOnFeedback.FireUpdate();
if (newValue != _Lamp2RemainingPercent) // }
{ // }
_Lamp2RemainingPercent = newValue; // // Running Status
Lamp2RemainingPercent.FireUpdate(); // else if (bytes[0] == 0x20 && bytes[1] == 0x85 && bytes[4] == 0x10)
} // {
} // var operationStates = new Dictionary<int, string>
Debug.Console(0, this, "Lamp {0}, {1}% remaining", (bytes[5] + 1), bytes[7]); // {
} // { 0x00, "Standby" },
// { 0x04, "Power On" },
// { 0x05, "Cooling" },
// { 0x06, "Standby (error)" },
// { 0x0f, "Standby (power saving" },
// { 0x10, "Network Standby" },
// { 0xff, "Not supported" }
// };
} // var newPowerIsOn = bytes[7] == 0x01;
// if (newPowerIsOn != _PowerIsOn)
// {
// _PowerIsOn = newPowerIsOn;
// PowerIsOnFeedback.FireUpdate();
// }
public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) // Debug.Console(2, this, "PowerIsOn={0}\rCooling={1}\rPowering on/off={2}\rStatus={3}",
{ // _PowerIsOn,
LinkDisplayToApi(this, trilist, joinStart, joinMapKey, bridge); // bytes[8] == 0x01,
} // bytes[9] == 0x01,
} // operationStates[bytes[10]]);
// }
// // Lamp remaining
// else if (bytes[0] == 0x23 && bytes[1] == 0x96 && bytes[4] == 0x06 && bytes[6] == 0x04)
// {
// var newValue = bytes[7];
// if (bytes[5] == 0x00)
// {
// if (newValue != _Lamp1RemainingPercent)
// {
// _Lamp1RemainingPercent = newValue;
// Lamp1RemainingPercent.FireUpdate();
// }
// }
// else
// {
// if (newValue != _Lamp2RemainingPercent)
// {
// _Lamp2RemainingPercent = newValue;
// Lamp2RemainingPercent.FireUpdate();
// }
// }
// Debug.Console(0, this, "Lamp {0}, {1}% remaining", (bytes[5] + 1), bytes[7]);
// }
// }
// public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
// {
// LinkDisplayToApi(this, trilist, joinStart, joinMapKey, bridge);
// }
//}
} }

View File

@@ -63,7 +63,7 @@
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.Lighting.dll</HintPath> <HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.Lighting.dll</HintPath>
</Reference> </Reference>
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PepperDash_Core, Version=1.0.41.31808, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath> <HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
</Reference> </Reference>

View File

@@ -16,12 +16,12 @@ using PepperDash.Essentials.Core.Routing;
namespace PepperDash.Essentials.Devices.Common namespace PepperDash.Essentials.Devices.Common
{ {
[Description("Wrapper class for an IR Set Top Box")] [Description("Wrapper class for an IR Set Top Box")]
public class IRSetTopBoxBase : EssentialsBridgeableDevice, ISetTopBoxControls, IRoutingOutputs, IUsageTracking, IPower public class IRSetTopBoxBase : EssentialsBridgeableDevice, ISetTopBoxControls, IRoutingOutputs, IUsageTracking, IHasPowerControl
{ {
public IrOutputPortController IrPort { get; private set; } public IrOutputPortController IrPort { get; private set; }
public uint DisplayUiType { get { return DisplayUiConstants.TypeDirecTv; } } public uint DisplayUiType { get { return DisplayUiConstants.TypeDirecTv; } }
public ushort IrPulseTime { get; set; }
public bool HasPresets { get; set; } public bool HasPresets { get; set; }
public bool HasDvr { get; set; } public bool HasDvr { get; set; }
@@ -35,6 +35,13 @@ namespace PepperDash.Essentials.Devices.Common
: base(key, name) : base(key, name)
{ {
IrPort = portCont; IrPort = portCont;
IrPulseTime = 200;
if (props.IrPulseTime > 0)
{
IrPulseTime = (ushort)props.IrPulseTime;
}
DeviceManager.AddDevice(portCont); DeviceManager.AddDevice(portCont);
HasPresets = props.HasPresets; HasPresets = props.HasPresets;
@@ -55,7 +62,6 @@ namespace PepperDash.Essentials.Devices.Common
AnyAudioOut = new RoutingOutputPort(RoutingPortNames.AnyAudioOut, eRoutingSignalType.Audio, AnyAudioOut = new RoutingOutputPort(RoutingPortNames.AnyAudioOut, eRoutingSignalType.Audio,
eRoutingPortConnectionType.DigitalAudio, null, this); eRoutingPortConnectionType.DigitalAudio, null, this);
OutputPorts = new RoutingPortCollection<RoutingOutputPort> { AnyVideoOut, AnyAudioOut }; OutputPorts = new RoutingPortCollection<RoutingOutputPort> { AnyVideoOut, AnyAudioOut };
} }
public void LoadPresets(string filePath) public void LoadPresets(string filePath)
@@ -348,26 +354,17 @@ namespace PepperDash.Essentials.Devices.Common
public void PowerOn() public void PowerOn()
{ {
IrPort.PressRelease(IROutputStandardCommands.IROut_POWER_ON, true); IrPort.Pulse(IROutputStandardCommands.IROut_POWER_ON, IrPulseTime);
IrPort.PressRelease(IROutputStandardCommands.IROut_POWER_ON, false);
} }
public void PowerOff() public void PowerOff()
{ {
IrPort.PressRelease(IROutputStandardCommands.IROut_POWER_OFF, true); IrPort.Pulse(IROutputStandardCommands.IROut_POWER_OFF, IrPulseTime);
IrPort.PressRelease(IROutputStandardCommands.IROut_POWER_OFF, false);
} }
public void PowerToggle() public void PowerToggle()
{ {
throw new NotImplementedException(); IrPort.Pulse(IROutputStandardCommands.IROut_POWER, IrPulseTime);
}
public BoolFeedback PowerIsOnFeedback
{
get { throw new NotImplementedException(); }
} }
#endregion #endregion
@@ -395,7 +392,8 @@ namespace PepperDash.Essentials.Devices.Common
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = Name; trilist.StringInput[joinMap.Name.JoinNumber].StringValue = Name;
var stbBase = this as ISetTopBoxControls; var stbBase = this as ISetTopBoxControls;
if (stbBase != null)
{
trilist.BooleanInput[joinMap.HasDpad.JoinNumber].BoolValue = stbBase.HasDpad; trilist.BooleanInput[joinMap.HasDpad.JoinNumber].BoolValue = stbBase.HasDpad;
trilist.BooleanInput[joinMap.HasNumeric.JoinNumber].BoolValue = stbBase.HasNumeric; trilist.BooleanInput[joinMap.HasNumeric.JoinNumber].BoolValue = stbBase.HasNumeric;
trilist.BooleanInput[joinMap.HasDvr.JoinNumber].BoolValue = stbBase.HasDvr; trilist.BooleanInput[joinMap.HasDvr.JoinNumber].BoolValue = stbBase.HasDvr;
@@ -405,15 +403,19 @@ namespace PepperDash.Essentials.Devices.Common
trilist.SetBoolSigAction(joinMap.Replay.JoinNumber, stbBase.Replay); trilist.SetBoolSigAction(joinMap.Replay.JoinNumber, stbBase.Replay);
trilist.SetStringSigAction(joinMap.LoadPresets.JoinNumber, stbBase.LoadPresets); trilist.SetStringSigAction(joinMap.LoadPresets.JoinNumber, stbBase.LoadPresets);
}
var stbPower = this as IPower; var stbPower = this as IHasPowerControl;
if (stbPower != null)
{
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, stbPower.PowerOn); trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, stbPower.PowerOn);
trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, stbPower.PowerOff); trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, stbPower.PowerOff);
trilist.SetSigTrueAction(joinMap.PowerToggle.JoinNumber, stbPower.PowerToggle); trilist.SetSigTrueAction(joinMap.PowerToggle.JoinNumber, stbPower.PowerToggle);
}
var stbDPad = this as IDPad; var stbDPad = this as IDPad;
if (stbDPad != null)
{
trilist.SetBoolSigAction(joinMap.Up.JoinNumber, stbDPad.Up); trilist.SetBoolSigAction(joinMap.Up.JoinNumber, stbDPad.Up);
trilist.SetBoolSigAction(joinMap.Down.JoinNumber, stbDPad.Down); trilist.SetBoolSigAction(joinMap.Down.JoinNumber, stbDPad.Down);
trilist.SetBoolSigAction(joinMap.Left.JoinNumber, stbDPad.Left); trilist.SetBoolSigAction(joinMap.Left.JoinNumber, stbDPad.Left);
@@ -421,23 +423,31 @@ namespace PepperDash.Essentials.Devices.Common
trilist.SetBoolSigAction(joinMap.Select.JoinNumber, stbDPad.Select); trilist.SetBoolSigAction(joinMap.Select.JoinNumber, stbDPad.Select);
trilist.SetBoolSigAction(joinMap.Menu.JoinNumber, stbDPad.Menu); trilist.SetBoolSigAction(joinMap.Menu.JoinNumber, stbDPad.Menu);
trilist.SetBoolSigAction(joinMap.Exit.JoinNumber, stbDPad.Exit); trilist.SetBoolSigAction(joinMap.Exit.JoinNumber, stbDPad.Exit);
}
var stbChannel = this as IChannel; var stbChannel = this as IChannel;
if (stbChannel != null)
{
trilist.SetBoolSigAction(joinMap.ChannelUp.JoinNumber, stbChannel.ChannelUp); trilist.SetBoolSigAction(joinMap.ChannelUp.JoinNumber, stbChannel.ChannelUp);
trilist.SetBoolSigAction(joinMap.ChannelDown.JoinNumber, stbChannel.ChannelDown); trilist.SetBoolSigAction(joinMap.ChannelDown.JoinNumber, stbChannel.ChannelDown);
trilist.SetBoolSigAction(joinMap.LastChannel.JoinNumber, stbChannel.LastChannel); trilist.SetBoolSigAction(joinMap.LastChannel.JoinNumber, stbChannel.LastChannel);
trilist.SetBoolSigAction(joinMap.Guide.JoinNumber, stbChannel.Guide); trilist.SetBoolSigAction(joinMap.Guide.JoinNumber, stbChannel.Guide);
trilist.SetBoolSigAction(joinMap.Info.JoinNumber, stbChannel.Info); trilist.SetBoolSigAction(joinMap.Info.JoinNumber, stbChannel.Info);
trilist.SetBoolSigAction(joinMap.Exit.JoinNumber, stbChannel.Exit); trilist.SetBoolSigAction(joinMap.Exit.JoinNumber, stbChannel.Exit);
}
var stbColor = this as IColor; var stbColor = this as IColor;
if (stbColor != null)
{
trilist.SetBoolSigAction(joinMap.Red.JoinNumber, stbColor.Red); trilist.SetBoolSigAction(joinMap.Red.JoinNumber, stbColor.Red);
trilist.SetBoolSigAction(joinMap.Green.JoinNumber, stbColor.Green); trilist.SetBoolSigAction(joinMap.Green.JoinNumber, stbColor.Green);
trilist.SetBoolSigAction(joinMap.Yellow.JoinNumber, stbColor.Yellow); trilist.SetBoolSigAction(joinMap.Yellow.JoinNumber, stbColor.Yellow);
trilist.SetBoolSigAction(joinMap.Blue.JoinNumber, stbColor.Blue); trilist.SetBoolSigAction(joinMap.Blue.JoinNumber, stbColor.Blue);
}
var stbKeypad = this as ISetTopBoxNumericKeypad; var stbKeypad = this as ISetTopBoxNumericKeypad;
if (stbKeypad != null)
{
trilist.StringInput[joinMap.KeypadAccessoryButton1Label.JoinNumber].StringValue = stbKeypad.KeypadAccessoryButton1Label; trilist.StringInput[joinMap.KeypadAccessoryButton1Label.JoinNumber].StringValue = stbKeypad.KeypadAccessoryButton1Label;
trilist.StringInput[joinMap.KeypadAccessoryButton2Label.JoinNumber].StringValue = stbKeypad.KeypadAccessoryButton2Label; trilist.StringInput[joinMap.KeypadAccessoryButton2Label.JoinNumber].StringValue = stbKeypad.KeypadAccessoryButton2Label;
@@ -458,8 +468,11 @@ namespace PepperDash.Essentials.Devices.Common
trilist.SetBoolSigAction(joinMap.KeypadAccessoryButton2Press.JoinNumber, stbKeypad.KeypadAccessoryButton1); trilist.SetBoolSigAction(joinMap.KeypadAccessoryButton2Press.JoinNumber, stbKeypad.KeypadAccessoryButton1);
trilist.SetBoolSigAction(joinMap.Dash.JoinNumber, stbKeypad.Dash); trilist.SetBoolSigAction(joinMap.Dash.JoinNumber, stbKeypad.Dash);
trilist.SetBoolSigAction(joinMap.KeypadEnter.JoinNumber, stbKeypad.KeypadEnter); trilist.SetBoolSigAction(joinMap.KeypadEnter.JoinNumber, stbKeypad.KeypadEnter);
}
var stbTransport = this as ITransport; var stbTransport = this as ITransport;
if (stbTransport != null)
{
trilist.SetBoolSigAction(joinMap.Play.JoinNumber, stbTransport.Play); trilist.SetBoolSigAction(joinMap.Play.JoinNumber, stbTransport.Play);
trilist.SetBoolSigAction(joinMap.Pause.JoinNumber, stbTransport.Pause); trilist.SetBoolSigAction(joinMap.Pause.JoinNumber, stbTransport.Pause);
trilist.SetBoolSigAction(joinMap.Rewind.JoinNumber, stbTransport.Rewind); trilist.SetBoolSigAction(joinMap.Rewind.JoinNumber, stbTransport.Rewind);
@@ -470,6 +483,7 @@ namespace PepperDash.Essentials.Devices.Common
trilist.SetBoolSigAction(joinMap.Record.JoinNumber, stbTransport.Record); trilist.SetBoolSigAction(joinMap.Record.JoinNumber, stbTransport.Record);
} }
} }
}
public class IRSetTopBoxBaseFactory : EssentialsDeviceFactory<IRSetTopBoxBase> public class IRSetTopBoxBaseFactory : EssentialsDeviceFactory<IRSetTopBoxBase>
{ {

View File

@@ -14,6 +14,7 @@ namespace PepperDash.Essentials.Devices.Common
public bool HasDvr { get; set; } public bool HasDvr { get; set; }
public bool HasDpad { get; set; } public bool HasDpad { get; set; }
public bool HasNumeric { get; set; } public bool HasNumeric { get; set; }
public int IrPulseTime { get; set; }
public ControlPropertiesConfig Control { get; set; } public ControlPropertiesConfig Control { get; set; }
} }

View File

@@ -106,8 +106,8 @@ namespace PepperDash.Essentials.Devices.Common.SoftCodec
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase)) if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
{ {
dest.ReleaseRoute(); dest.ReleaseRoute();
if (dest is IPower) if (dest is IHasPowerControl)
(dest as IPower).PowerOff(); (dest as IHasPowerControl).PowerOff();
} }
else else
{ {

View File

@@ -1338,12 +1338,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
} }
public override void SendDtmf(string s) public override void SendDtmf(string s)
{
if (CallFavorites != null)
{ {
SendText(string.Format("xCommand Call DTMFSend CallId: {0} DTMFString: \"{1}\"", GetCallId(), s)); SendText(string.Format("xCommand Call DTMFSend CallId: {0} DTMFString: \"{1}\"", GetCallId(), s));
} }
}
public void SelectPresentationSource(int source) public void SelectPresentationSource(int source)
{ {
@@ -1970,6 +1967,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
} }
/// <summary>
/// Sets the selected source of the available external sources on teh Touch10 UI
/// </summary>
public void SetSelectedSource(string key)
{
SendText(string.Format("xCommand UserInterface Presentation ExternalSource Select SourceIdentifier: {0}", key));
}
/// <summary> /// <summary>
/// Action that will run when the External Source is selected. /// Action that will run when the External Source is selected.
/// </summary> /// </summary>