mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-02 14:24:59 +00:00
Compare commits
14 Commits
1.6.1-alph
...
1.6.2-hotf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
468aff6e3f | ||
|
|
a30062db71 | ||
|
|
d0a2ccd7d6 | ||
|
|
84099b1d0b | ||
|
|
1b7dd2dd2a | ||
|
|
e5d4ba48fb | ||
|
|
22ff61d7f3 | ||
|
|
f066321f3a | ||
|
|
302603aa54 | ||
|
|
dea858e187 | ||
|
|
ddbee2ed04 | ||
|
|
b7c9677c7a | ||
|
|
d6581cab2e | ||
|
|
829e3eb634 |
@@ -184,6 +184,12 @@ namespace PepperDash.Essentials.Room.Config
|
||||
|
||||
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
||||
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
||||
|
||||
public EssentialsRoomPropertiesConfig()
|
||||
{
|
||||
LogoLight = new EssentialsLogoPropertiesConfig();
|
||||
LogoDark = new EssentialsLogoPropertiesConfig();
|
||||
}
|
||||
}
|
||||
|
||||
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
||||
|
||||
@@ -409,10 +409,14 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
if (string.IsNullOrEmpty(sourceListKey))
|
||||
{
|
||||
Debug.Console(1, this, "No sourceListKey present. RunRouteAction assumes default source list.");
|
||||
RunRouteAction(routeKey, new Action(() => { }));
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -224,6 +224,8 @@ namespace PepperDash.Essentials
|
||||
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
||||
if (room is EssentialsHuddleSpaceRoom)
|
||||
{
|
||||
// Screen Saver Driver
|
||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
||||
|
||||
// Header Driver
|
||||
Debug.Console(0, panelController, "Adding header driver");
|
||||
@@ -272,6 +274,9 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
||||
|
||||
// Screen Saver Driver
|
||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
||||
|
||||
// Header Driver
|
||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, props);
|
||||
|
||||
|
||||
@@ -621,7 +621,7 @@ namespace PepperDash.Essentials
|
||||
/// <summary>
|
||||
/// 15030 Visibility for room data popup
|
||||
/// </summary>
|
||||
public const uint RoomHeaderPageVisible = 15030;
|
||||
public const uint RoomHeaderInfoPageVisible = 15030;
|
||||
/// <summary>
|
||||
/// 15031
|
||||
/// </summary>
|
||||
@@ -812,7 +812,7 @@ namespace PepperDash.Essentials
|
||||
/// <summary>
|
||||
/// 15093
|
||||
/// </summary>
|
||||
public const uint RoomHeaderMCPageVisible = 15093;
|
||||
public const uint RoomHeaderInfoMCPageVisible = 15093;
|
||||
|
||||
/// <summary>
|
||||
/// 15094
|
||||
|
||||
@@ -212,7 +212,7 @@ namespace PepperDash.Essentials
|
||||
/// <summary>
|
||||
/// 3925
|
||||
/// </summary>
|
||||
public const uint LogoUrlDarkBkgnd = 3923;
|
||||
public const uint LogoUrlDarkBkgnd = 3925;
|
||||
|
||||
/// <summary>
|
||||
/// 3951
|
||||
|
||||
@@ -26,7 +26,7 @@ namespace PepperDash.Essentials
|
||||
|
||||
public PanelDriverBase CurrentChildDriver { get; private set; }
|
||||
|
||||
public ScreenSaverController ScreenSaverController { get; private set; }
|
||||
public ScreenSaverController ScreenSaverController { get; set; }
|
||||
|
||||
CrestronTouchpanelPropertiesConfig Config;
|
||||
|
||||
@@ -59,15 +59,17 @@ namespace PepperDash.Essentials
|
||||
|
||||
void ExtenderTouchDetectionReservedSigs_DeviceExtenderSigChange(Crestron.SimplSharpPro.DeviceExtender currentDeviceExtender, Crestron.SimplSharpPro.SigEventArgs args)
|
||||
{
|
||||
var timeoutMs = Config.ScreenSaverTimeoutMin * 60 * 1000;
|
||||
|
||||
if (args.Sig.BoolValue)
|
||||
{
|
||||
if (InactivityTimer != null)
|
||||
{
|
||||
InactivityTimer.Reset();
|
||||
InactivityTimer.Reset(timeoutMs);
|
||||
}
|
||||
else
|
||||
{
|
||||
InactivityTimer = new CTimer((o) => InactivityTimerExpired(), Config.ScreenSaverTimeoutMin * 60 * 1000);
|
||||
InactivityTimer = new CTimer((o) => InactivityTimerExpired(), timeoutMs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -85,7 +87,7 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
CurrentChildDriver = null;
|
||||
ShowSubDriver(AvDriver as PanelDriverBase);
|
||||
base.Show();
|
||||
base.Show();
|
||||
}
|
||||
|
||||
public override void Hide()
|
||||
|
||||
@@ -232,26 +232,31 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
if (CurrentRoom.IsMobileControlEnabled)
|
||||
{
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderMCPageVisible);
|
||||
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||
}
|
||||
else
|
||||
{
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible);
|
||||
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
||||
{
|
||||
// room name on join 1, concat phone and sip on join 2, no button method
|
||||
//var addr = roomConf.Addresses;
|
||||
//if (addr == null) // protect from missing values by using default empties
|
||||
// addr = new EssentialsRoomAddressPropertiesConfig();
|
||||
//// empty string when either missing, pipe when both showing
|
||||
//TriList.SetString(UIStringJoin.RoomAddressPipeText,
|
||||
// (string.IsNullOrEmpty(addr.PhoneNumber.Trim())
|
||||
// || string.IsNullOrEmpty(addr.SipAddress.Trim())) ? "" : " | ");
|
||||
//TriList.SetString(UIStringJoin.RoomPhoneText, addr.PhoneNumber);
|
||||
//TriList.SetString(UIStringJoin.RoomSipText, addr.SipAddress);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||
{
|
||||
if (CurrentRoom.IsMobileControlEnabled)
|
||||
{
|
||||
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
||||
|
||||
@@ -245,26 +245,31 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
if (CurrentRoom.IsMobileControlEnabled)
|
||||
{
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderMCPageVisible);
|
||||
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||
}
|
||||
else
|
||||
{
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible);
|
||||
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (Config.HeaderStyle.ToLower() == CrestronTouchpanelPropertiesConfig.Verbose)
|
||||
{
|
||||
// room name on join 1, concat phone and sip on join 2, no button method
|
||||
//var addr = roomConf.Addresses;
|
||||
//if (addr == null) // protect from missing values by using default empties
|
||||
// addr = new EssentialsRoomAddressPropertiesConfig();
|
||||
//// empty string when either missing, pipe when both showing
|
||||
//TriList.SetString(UIStringJoin.RoomAddressPipeText,
|
||||
// (string.IsNullOrEmpty(addr.PhoneNumber.Trim())
|
||||
// || string.IsNullOrEmpty(addr.SipAddress.Trim())) ? "" : " | ");
|
||||
//TriList.SetString(UIStringJoin.RoomPhoneText, addr.PhoneNumber);
|
||||
//TriList.SetString(UIStringJoin.RoomSipText, addr.SipAddress);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||
{
|
||||
if (CurrentRoom.IsMobileControlEnabled)
|
||||
{
|
||||
Debug.Console(1, "Showing Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoMCPageVisible);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, "Showing Non Mobile Control Header Info");
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderInfoPageVisible);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
||||
@@ -353,7 +358,7 @@ namespace PepperDash.Essentials
|
||||
TriList.SetBool(UIBoolJoin.LogoDefaultVisible, false);
|
||||
TriList.SetBool(UIBoolJoin.LogoUrlVisible, true);
|
||||
TriList.SetString(UIStringJoin.LogoUrlLightBkgnd, _CurrentRoom.LogoUrlLightBkgnd);
|
||||
TriList.SetString(UIStringJoin.LogoUrlLightBkgnd, _CurrentRoom.LogoUrlDarkBkgnd);
|
||||
TriList.SetString(UIStringJoin.LogoUrlDarkBkgnd, _CurrentRoom.LogoUrlDarkBkgnd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace PepperDash.Essentials
|
||||
|
||||
List<uint> PositionJoins;
|
||||
|
||||
int CurrentPositionIndex;
|
||||
int CurrentPositionIndex = 0;
|
||||
|
||||
public ScreenSaverController(EssentialsPanelMainInterfaceDriver parent, CrestronTouchpanelPropertiesConfig config)
|
||||
: base(parent.TriList)
|
||||
@@ -31,12 +31,16 @@ namespace PepperDash.Essentials
|
||||
|
||||
PositionJoins = new List<uint>()
|
||||
{ UIBoolJoin.MCScreenSaverPosition1Visible, UIBoolJoin.MCScreenSaverPosition2Visible, UIBoolJoin.MCScreenSaverPosition3Visible, UIBoolJoin.MCScreenSaverPosition4Visible };
|
||||
|
||||
CrestronConsole.AddNewConsoleCommand((o) => Show(), "showscreensaver", "Shows Panel Screensaver", ConsoleAccessLevelEnum.AccessOperator);
|
||||
}
|
||||
|
||||
public override void Show()
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.MCScreenSaverVisible, true);
|
||||
|
||||
CurrentPositionIndex = 0;
|
||||
SetCurrentPosition();
|
||||
StartPositionTimer();
|
||||
|
||||
base.Show();
|
||||
@@ -62,13 +66,26 @@ namespace PepperDash.Essentials
|
||||
if (PositionTimer == null)
|
||||
{
|
||||
PositionTimer = new CTimer((o) => PositionTimerExpired(), PositionTimeoutMs);
|
||||
SetCurrentPosition();
|
||||
}
|
||||
else
|
||||
{
|
||||
PositionTimer.Reset(PositionTimeoutMs);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void PositionTimerExpired()
|
||||
{
|
||||
if (CurrentPositionIndex <= PositionJoins.Count)
|
||||
IncrementPositionIndex();
|
||||
|
||||
SetCurrentPosition();
|
||||
|
||||
StartPositionTimer();
|
||||
}
|
||||
|
||||
void IncrementPositionIndex()
|
||||
{
|
||||
if (CurrentPositionIndex < PositionJoins.Count - 1)
|
||||
{
|
||||
CurrentPositionIndex++;
|
||||
}
|
||||
@@ -76,6 +93,8 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
CurrentPositionIndex = 0;
|
||||
}
|
||||
|
||||
Debug.Console(1, "ScreenSaver Position Timer Expired: Setting new position: {0}", CurrentPositionIndex);
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -192,22 +192,76 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
/// <param name="e"></param>
|
||||
void Codec_IsReady()
|
||||
{
|
||||
string roomNumberSipUri = "";
|
||||
|
||||
if (!string.IsNullOrEmpty(Codec.CodecInfo.SipUri)) // If both values are present, format the string with a pipe divider
|
||||
roomNumberSipUri = string.Format("{0} | {1}", GetFormattedPhoneNumber(Codec.CodecInfo.SipPhoneNumber), Codec.CodecInfo.SipUri);
|
||||
else // If only one value present, just show the phone number
|
||||
roomNumberSipUri = Codec.CodecInfo.SipPhoneNumber;
|
||||
|
||||
if(string.IsNullOrEmpty(roomNumberSipUri))
|
||||
roomNumberSipUri = string.Format("{0} | {1}", Codec.CodecInfo.E164Alias, Codec.CodecInfo.H323Id);
|
||||
|
||||
TriList.SetString(UIStringJoin.RoomPhoneText, roomNumberSipUri);
|
||||
SetupAddresses();
|
||||
|
||||
if(HeaderDriver.HeaderButtonsAreSetUp)
|
||||
HeaderDriver.ComputeHeaderCallStatus(Codec);
|
||||
}
|
||||
|
||||
void SetupAddresses()
|
||||
{
|
||||
string roomContactNumbers = "";
|
||||
string roomPhoneNumber = "";
|
||||
string roomVideoAddress = "";
|
||||
|
||||
|
||||
Debug.Console(1,
|
||||
@"
|
||||
Codec.CodecInfo.IpAddress: {0}
|
||||
Codec.CodecInfo.SipUri: {1}
|
||||
Codec.CodecInfo.SipPhoneNumber: {2}
|
||||
Codec.CodecInfo.E164Alias: {3}
|
||||
Codec.CodecInfo.H323Id: {4}
|
||||
", Codec.CodecInfo.IpAddress, Codec.CodecInfo.SipUri, Codec.CodecInfo.SipPhoneNumber, Codec.CodecInfo.E164Alias, Codec.CodecInfo.H323Id);
|
||||
|
||||
// Populate phone number
|
||||
if (!string.IsNullOrEmpty(Codec.CodecInfo.SipUri)) // If both values are present, format the string with a pipe divider
|
||||
{
|
||||
roomPhoneNumber = Codec.CodecInfo.SipUri;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(Codec.CodecInfo.SipPhoneNumber)) // If only one value present, just show the phone number
|
||||
{
|
||||
roomPhoneNumber = GetFormattedPhoneNumber(Codec.CodecInfo.SipPhoneNumber);
|
||||
}
|
||||
|
||||
// Populate video number
|
||||
if (!string.IsNullOrEmpty(Codec.CodecInfo.IpAddress))
|
||||
{
|
||||
roomVideoAddress = Codec.CodecInfo.IpAddress;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(Codec.CodecInfo.E164Alias))
|
||||
{
|
||||
roomVideoAddress = Codec.CodecInfo.E164Alias;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(Codec.CodecInfo.H323Id))
|
||||
{
|
||||
roomVideoAddress = Codec.CodecInfo.H323Id;
|
||||
}
|
||||
|
||||
Debug.Console(1,
|
||||
@" Room Contact Numbers:
|
||||
Phone Number: {0}
|
||||
Video Number: {1}
|
||||
", roomPhoneNumber, roomVideoAddress);
|
||||
|
||||
if (!string.IsNullOrEmpty(roomPhoneNumber) && !string.IsNullOrEmpty(roomVideoAddress))
|
||||
{
|
||||
roomContactNumbers = string.Format("{0} | {1}", roomPhoneNumber, roomVideoAddress);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(roomPhoneNumber))
|
||||
{
|
||||
roomContactNumbers = roomPhoneNumber;
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(roomVideoAddress))
|
||||
{
|
||||
roomContactNumbers = roomVideoAddress;
|
||||
}
|
||||
|
||||
TriList.SetString(UIStringJoin.RoomAddressPipeText, roomContactNumbers);
|
||||
TriList.SetString(UIStringJoin.RoomPhoneText, roomPhoneNumber);
|
||||
TriList.SetString(UIStringJoin.RoomVideoAddressText, roomVideoAddress);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles status changes for calls
|
||||
/// </summary>
|
||||
|
||||
@@ -1,83 +1,83 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Crestron.SimplSharpPro;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public static class IRPortHelper
|
||||
{
|
||||
public static string IrDriverPathPrefix
|
||||
{
|
||||
get
|
||||
{
|
||||
return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds either the ControlSystem or a device controller that contains IR ports and
|
||||
/// returns a port from the hardware device
|
||||
/// </summary>
|
||||
/// <param name="propsToken"></param>
|
||||
/// <returns>IrPortConfig object. The port and or filename will be empty/null
|
||||
/// if valid values don't exist on config</returns>
|
||||
public static IrOutPortConfig GetIrPort(JToken propsToken)
|
||||
{
|
||||
var control = propsToken["control"];
|
||||
if (control == null)
|
||||
return null;
|
||||
if (control["method"].Value<string>() != "ir")
|
||||
{
|
||||
Debug.Console(0, "IRPortHelper called with non-IR properties");
|
||||
return null;
|
||||
}
|
||||
|
||||
var port = new IrOutPortConfig();
|
||||
|
||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||
var portNum = control.Value<uint>("controlPortNumber");
|
||||
if (portDevKey == null || portNum == 0)
|
||||
{
|
||||
Debug.Console(1, "WARNING: Properties is missing port device or port number");
|
||||
return port;
|
||||
}
|
||||
|
||||
IIROutputPorts irDev = null;
|
||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||
irDev = Global.ControlSystem;
|
||||
else
|
||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||
|
||||
if (irDev == null)
|
||||
{
|
||||
Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
|
||||
return port;
|
||||
}
|
||||
|
||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||
{
|
||||
var file = IrDriverPathPrefix + control["irFile"].Value<string>();
|
||||
port.Port = irDev.IROutputPorts[portNum];
|
||||
port.FileName = file;
|
||||
return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
|
||||
portDevKey, portNum);
|
||||
return port;
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Crestron.SimplSharpPro;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public static class IRPortHelper
|
||||
{
|
||||
public static string IrDriverPathPrefix
|
||||
{
|
||||
get
|
||||
{
|
||||
return Global.FilePathPrefix + "IR" + Global.DirectorySeparator;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds either the ControlSystem or a device controller that contains IR ports and
|
||||
/// returns a port from the hardware device
|
||||
/// </summary>
|
||||
/// <param name="propsToken"></param>
|
||||
/// <returns>IrPortConfig object. The port and or filename will be empty/null
|
||||
/// if valid values don't exist on config</returns>
|
||||
public static IrOutPortConfig GetIrPort(JToken propsToken)
|
||||
{
|
||||
var control = propsToken["control"];
|
||||
if (control == null)
|
||||
return null;
|
||||
if (control["method"].Value<string>() != "ir")
|
||||
{
|
||||
Debug.Console(0, "IRPortHelper called with non-IR properties");
|
||||
return null;
|
||||
}
|
||||
|
||||
var port = new IrOutPortConfig();
|
||||
|
||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||
var portNum = control.Value<uint>("controlPortNumber");
|
||||
if (portDevKey == null || portNum == 0)
|
||||
{
|
||||
Debug.Console(1, "WARNING: Properties is missing port device or port number");
|
||||
return port;
|
||||
}
|
||||
|
||||
IIROutputPorts irDev = null;
|
||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||
irDev = Global.ControlSystem;
|
||||
else
|
||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||
|
||||
if (irDev == null)
|
||||
{
|
||||
Debug.Console(1, "[Config] Error, device with IR ports '{0}' not found", portDevKey);
|
||||
return port;
|
||||
}
|
||||
|
||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||
{
|
||||
var file = IrDriverPathPrefix + control["irFile"].Value<string>();
|
||||
port.Port = irDev.IROutputPorts[portNum];
|
||||
port.FileName = file;
|
||||
return port; // new IrOutPortConfig { Port = irDev.IROutputPorts[portNum], FileName = file };
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, "[Config] Error, device '{0}' IR port {1} out of range",
|
||||
portDevKey, portNum);
|
||||
return port;
|
||||
}
|
||||
}
|
||||
|
||||
public static IROutputPort GetIrOutputPort(DeviceConfig dc)
|
||||
@@ -124,7 +124,7 @@ namespace PepperDash.Essentials.Core
|
||||
Debug.Console(0, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
||||
return null;
|
||||
}
|
||||
if (portNum >= irDev.NumberOfIROutputPorts)
|
||||
if (portNum > irDev.NumberOfIROutputPorts)
|
||||
{
|
||||
Debug.Console(0, "WARNING: device '{0}' IR port {1} out of range",
|
||||
portDevKey, portNum);
|
||||
@@ -134,10 +134,9 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
var port = irDev.IROutputPorts[portNum];
|
||||
|
||||
port.LoadIRDriver(Global.FilePathPrefix + "IR" + Global.DirectorySeparator + control["irFile"].Value<string>());
|
||||
|
||||
|
||||
return port;
|
||||
|
||||
}
|
||||
|
||||
public static IrOutputPortController GetIrOutputPortController(DeviceConfig config)
|
||||
@@ -149,87 +148,88 @@ namespace PepperDash.Essentials.Core
|
||||
return null;
|
||||
}
|
||||
|
||||
var irDevice = new IrOutputPortController(config.Key, GetIrOutputPort, config);
|
||||
var postActivationFunc = new Func<DeviceConfig,IROutputPort> (GetIrOutputPort);
|
||||
var irDevice = new IrOutputPortController(config.Key + "-ir", postActivationFunc, config);
|
||||
|
||||
return irDevice;
|
||||
}
|
||||
|
||||
/*
|
||||
/// <summary>
|
||||
/// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
|
||||
/// </summary>
|
||||
public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
|
||||
{
|
||||
var irControllerKey = devConf.Key + "-ir";
|
||||
if (devConf.Properties == null)
|
||||
{
|
||||
Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
|
||||
return new IrOutputPortController(irControllerKey, null, "");
|
||||
}
|
||||
|
||||
var control = devConf.Properties["control"];
|
||||
if (control == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
|
||||
return c;
|
||||
}
|
||||
|
||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||
var portNum = control.Value<uint>("controlPortNumber");
|
||||
IIROutputPorts irDev = null;
|
||||
|
||||
if (portDevKey == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: control properties is missing ir device");
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portNum == 0)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: control properties is missing ir port number");
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||
irDev = Global.ControlSystem;
|
||||
else
|
||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||
|
||||
if (irDev == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||
return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
|
||||
IrDriverPathPrefix + control["irFile"].Value<string>());
|
||||
else
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
|
||||
portDevKey, portNum);
|
||||
return c;
|
||||
}
|
||||
/*
|
||||
/// <summary>
|
||||
/// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
|
||||
/// </summary>
|
||||
public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
|
||||
{
|
||||
var irControllerKey = devConf.Key + "-ir";
|
||||
if (devConf.Properties == null)
|
||||
{
|
||||
Debug.Console(0, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
|
||||
return new IrOutputPortController(irControllerKey, null, "");
|
||||
}
|
||||
|
||||
var control = devConf.Properties["control"];
|
||||
if (control == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: Device config does not include control properties. IR will not function");
|
||||
return c;
|
||||
}
|
||||
|
||||
var portDevKey = control.Value<string>("controlPortDevKey");
|
||||
var portNum = control.Value<uint>("controlPortNumber");
|
||||
IIROutputPorts irDev = null;
|
||||
|
||||
if (portDevKey == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: control properties is missing ir device");
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portNum == 0)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: control properties is missing ir port number");
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
|
||||
|| portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
|
||||
irDev = Global.ControlSystem;
|
||||
else
|
||||
irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
|
||||
|
||||
if (irDev == null)
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
|
||||
return c;
|
||||
}
|
||||
|
||||
if (portNum <= irDev.NumberOfIROutputPorts) // success!
|
||||
return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
|
||||
IrDriverPathPrefix + control["irFile"].Value<string>());
|
||||
else
|
||||
{
|
||||
var c = new IrOutputPortController(irControllerKey, null, "");
|
||||
Debug.Console(0, c, "WARNING: device '{0}' IR port {1} out of range",
|
||||
portDevKey, portNum);
|
||||
return c;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wrapper to help in IR port creation
|
||||
/// </summary>
|
||||
public class IrOutPortConfig
|
||||
{
|
||||
public IROutputPort Port { get; set; }
|
||||
public string FileName { get; set; }
|
||||
|
||||
public IrOutPortConfig()
|
||||
{
|
||||
FileName = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wrapper to help in IR port creation
|
||||
/// </summary>
|
||||
public class IrOutPortConfig
|
||||
{
|
||||
public IROutputPort Port { get; set; }
|
||||
public string FileName { get; set; }
|
||||
|
||||
public IrOutPortConfig()
|
||||
{
|
||||
FileName = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +1,45 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
|
||||
|
||||
using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// IR port wrapper. May act standalone
|
||||
/// </summary>
|
||||
public class IrOutputPortController : Device
|
||||
{
|
||||
uint IrPortUid;
|
||||
IROutputPort IrPort;
|
||||
|
||||
public ushort StandardIrPulseTime { get; set; }
|
||||
public string DriverFilepath { get; private set; }
|
||||
public bool DriverIsLoaded { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
||||
/// still function without trying to talk to a port.
|
||||
/// </summary>
|
||||
public IrOutputPortController(string key, IROutputPort port, string irDriverFilepath)
|
||||
: base(key)
|
||||
{
|
||||
//if (port == null) throw new ArgumentNullException("port");
|
||||
IrPort = port;
|
||||
if (port == null)
|
||||
{
|
||||
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
||||
return;
|
||||
}
|
||||
LoadDriver(irDriverFilepath);
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
|
||||
|
||||
using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// IR port wrapper. May act standalone
|
||||
/// </summary>
|
||||
public class IrOutputPortController : Device
|
||||
{
|
||||
uint IrPortUid;
|
||||
IROutputPort IrPort;
|
||||
|
||||
public ushort StandardIrPulseTime { get; set; }
|
||||
public string DriverFilepath { get; private set; }
|
||||
public bool DriverIsLoaded { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
||||
/// still function without trying to talk to a port.
|
||||
/// </summary>
|
||||
public IrOutputPortController(string key, IROutputPort port, string irDriverFilepath)
|
||||
: base(key)
|
||||
{
|
||||
//if (port == null) throw new ArgumentNullException("port");
|
||||
IrPort = port;
|
||||
if (port == null)
|
||||
{
|
||||
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
||||
return;
|
||||
}
|
||||
LoadDriver(irDriverFilepath);
|
||||
}
|
||||
|
||||
public IrOutputPortController(string key, Func<DeviceConfig, IROutputPort> postActivationFunc,
|
||||
@@ -49,90 +49,108 @@ namespace PepperDash.Essentials.Core
|
||||
AddPostActivationAction(() =>
|
||||
{
|
||||
IrPort = postActivationFunc(config);
|
||||
|
||||
if (IrPort == null)
|
||||
{
|
||||
Debug.Console(0, this, "WARNING No valid IR Port assigned to controller. IR will not function");
|
||||
return;
|
||||
}
|
||||
|
||||
var filePath = Global.FilePathPrefix + "ir" + Global.DirectorySeparator + config.Properties["control"]["irFile"].Value<string>();
|
||||
Debug.Console(1, "*************Attemting to load IR file: {0}***************", filePath);
|
||||
|
||||
LoadDriver(filePath);
|
||||
|
||||
Debug.Console(2, this, "Available IR Commands in IR File {0}",IrPortUid);
|
||||
foreach (var cmd in IrPort.AvailableIRCmds())
|
||||
{
|
||||
Debug.Console(2, this, "{0}", cmd);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Loads the IR driver at path
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
public void LoadDriver(string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path)) path = DriverFilepath;
|
||||
try
|
||||
{
|
||||
IrPortUid = IrPort.LoadIRDriver(path);
|
||||
DriverFilepath = path;
|
||||
StandardIrPulseTime = 200;
|
||||
DriverIsLoaded = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
DriverIsLoaded = false;
|
||||
var message = string.Format("WARNING IR Driver '{0}' failed to load", path);
|
||||
Debug.Console(0, this, message);
|
||||
ErrorLog.Error(message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Starts and stops IR command on driver. Safe for missing commands
|
||||
/// </summary>
|
||||
public virtual void PressRelease(string command, bool state)
|
||||
{
|
||||
Debug.Console(2, this, "IR:'{0}'={1}", command, state);
|
||||
if (IrPort == null)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||
return;
|
||||
}
|
||||
if (!DriverIsLoaded)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||
return;
|
||||
}
|
||||
if (state)
|
||||
{
|
||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||
IrPort.Press(IrPortUid, command);
|
||||
else
|
||||
NoIrCommandError(command);
|
||||
}
|
||||
else
|
||||
IrPort.Release();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pulses a command on driver. Safe for missing commands
|
||||
/// </summary>
|
||||
public virtual void Pulse(string command, ushort time)
|
||||
{
|
||||
if (IrPort == null)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||
return;
|
||||
}
|
||||
if (!DriverIsLoaded)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||
return;
|
||||
}
|
||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||
IrPort.PressAndRelease(IrPortUid, command, time);
|
||||
else
|
||||
NoIrCommandError(command);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notifies the console when a bad command is used.
|
||||
/// </summary>
|
||||
protected void NoIrCommandError(string command)
|
||||
{
|
||||
Debug.Console(2, this, "Device {0}: IR Driver {1} does not contain command {2}",
|
||||
Key, IrPort.IRDriverFileNameByIRDriverId(IrPortUid), command);
|
||||
/// <summary>
|
||||
/// Loads the IR driver at path
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
public void LoadDriver(string path)
|
||||
{
|
||||
Debug.Console(2, this, "***Loading IR File***");
|
||||
if (string.IsNullOrEmpty(path)) path = DriverFilepath;
|
||||
try
|
||||
{
|
||||
IrPortUid = IrPort.LoadIRDriver(path);
|
||||
DriverFilepath = path;
|
||||
StandardIrPulseTime = 200;
|
||||
DriverIsLoaded = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
DriverIsLoaded = false;
|
||||
var message = string.Format("WARNING IR Driver '{0}' failed to load", path);
|
||||
Debug.Console(0, this, message);
|
||||
ErrorLog.Error(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Starts and stops IR command on driver. Safe for missing commands
|
||||
/// </summary>
|
||||
public virtual void PressRelease(string command, bool state)
|
||||
{
|
||||
Debug.Console(2, this, "IR:'{0}'={1}", command, state);
|
||||
if (IrPort == null)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||
return;
|
||||
}
|
||||
if (!DriverIsLoaded)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||
return;
|
||||
}
|
||||
if (state)
|
||||
{
|
||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||
IrPort.Press(IrPortUid, command);
|
||||
else
|
||||
NoIrCommandError(command);
|
||||
}
|
||||
else
|
||||
IrPort.Release();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pulses a command on driver. Safe for missing commands
|
||||
/// </summary>
|
||||
public virtual void Pulse(string command, ushort time)
|
||||
{
|
||||
if (IrPort == null)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING No IR Port assigned to controller");
|
||||
return;
|
||||
}
|
||||
if (!DriverIsLoaded)
|
||||
{
|
||||
Debug.Console(2, this, "WARNING IR driver is not loaded");
|
||||
return;
|
||||
}
|
||||
if (IrPort.IsIRCommandAvailable(IrPortUid, command))
|
||||
IrPort.PressAndRelease(IrPortUid, command, time);
|
||||
else
|
||||
NoIrCommandError(command);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Notifies the console when a bad command is used.
|
||||
/// </summary>
|
||||
protected void NoIrCommandError(string command)
|
||||
{
|
||||
Debug.Console(2, this, "Device {0}: IR Driver {1} does not contain command {2}",
|
||||
Key, IrPort.IRDriverFileNameByIRDriverId(IrPortUid), command);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,32 +39,32 @@ namespace PepperDash.Essentials.Devices.Common
|
||||
|
||||
public void Up(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease("+", pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Up, pressRelease);
|
||||
}
|
||||
|
||||
public void Down(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease("-", pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Down, pressRelease);
|
||||
}
|
||||
|
||||
public void Left(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease(IROutputStandardCommands.IROut_TRACK_MINUS, pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Left, pressRelease);
|
||||
}
|
||||
|
||||
public void Right(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease(IROutputStandardCommands.IROut_TRACK_PLUS, pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Right, pressRelease);
|
||||
}
|
||||
|
||||
public void Select(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease(IROutputStandardCommands.IROut_ENTER, pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Enter, pressRelease);
|
||||
}
|
||||
|
||||
public void Menu(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease("Menu", pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.Menu, pressRelease);
|
||||
}
|
||||
|
||||
public void Exit(bool pressRelease)
|
||||
@@ -78,12 +78,12 @@ namespace PepperDash.Essentials.Devices.Common
|
||||
|
||||
public void Play(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease("PLAY/PAUSE", pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.PlayPause, pressRelease);
|
||||
}
|
||||
|
||||
public void Pause(bool pressRelease)
|
||||
{
|
||||
IrPort.PressRelease("PLAY/PAUSE", pressRelease);
|
||||
IrPort.PressRelease(AppleTvIrCommands.PlayPause, pressRelease);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -190,4 +190,16 @@ namespace PepperDash.Essentials.Devices.Common
|
||||
}
|
||||
}
|
||||
|
||||
public static class AppleTvIrCommands
|
||||
{
|
||||
public const string Up = "UP_ARROW";
|
||||
public const string Down = "DOWN_ARROW";
|
||||
public const string Left = "LEFT_ARROW";
|
||||
public const string Right = "RIGHT_ARROW";
|
||||
public const string Enter = "SELECT";
|
||||
public const string PlayPause = "PLAY_PAUSE";
|
||||
public const string Rewind = "REWIND";
|
||||
public const string Menu = "MENU";
|
||||
public const string FastForward = "FASTFORWARD";
|
||||
}
|
||||
}
|
||||
@@ -1699,7 +1699,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
{
|
||||
get
|
||||
{
|
||||
if (CodecConfiguration.Configuration.H323 != null && CodecConfiguration.Configuration.H323.H323Alias.E164 != null)
|
||||
if (CodecConfiguration.Configuration.H323 != null && CodecConfiguration.Configuration.H323.H323Alias != null
|
||||
&& CodecConfiguration.Configuration.H323.H323Alias.ID != null)
|
||||
{
|
||||
return CodecConfiguration.Configuration.H323.H323Alias.ID.Value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user