mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-14 20:24:57 +00:00
Got things moved successfully
This commit is contained in:
@@ -111,7 +111,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reads the device keys from the config and gets the devices by key
|
/// Reads the device keys from the config and gets the devices by key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void GetDevicesFromConfig(Room.Config.EssentialsEnvironmentPropertiesConfig EnvironmentPropertiesConfig)
|
public void GetDevicesFromConfig(Core.Rooms.Config.EssentialsEnvironmentPropertiesConfig EnvironmentPropertiesConfig)
|
||||||
{
|
{
|
||||||
if (EnvironmentPropertiesConfig != null)
|
if (EnvironmentPropertiesConfig != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,9 +10,10 @@ using Crestron.SimplSharpPro.DeviceSupport;
|
|||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using PepperDash.Essentials.Core.Config;
|
|||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||||
using PepperDash.Essentials.Devices.Displays;
|
using PepperDash.Essentials.Devices.Displays;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.UIDrivers
|
namespace PepperDash.Essentials.UIDrivers
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -8,9 +8,10 @@ using Crestron.SimplSharpPro.UI;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
|
||||||
|
|||||||
@@ -10,11 +10,12 @@ using Crestron.SimplSharpPro.DeviceSupport;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials;
|
using PepperDash.Essentials;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
using PepperDash.Essentials.Devices.Core.VideoCodec;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.UIDrivers.VC
|
namespace PepperDash.Essentials.UIDrivers.VC
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,9 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace PepperDash.Essentials.Core.Devices.Codec
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices.Codec
|
|
||||||
|
|
||||||
{
|
{
|
||||||
public enum eCodecCallDirection
|
public enum eCodecCallDirection
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace PepperDash.Essentials.Core.Devices.Codec
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices.Codec
|
|
||||||
{
|
{
|
||||||
public enum eCodecCallStatus
|
public enum eCodecCallStatus
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace PepperDash.Essentials.Core.Devices.Codec
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices.Codec
|
|
||||||
|
|
||||||
{
|
{
|
||||||
public enum eCodecCallType
|
public enum eCodecCallType
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace PepperDash.Essentials.Core.Devices.Codec
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices.Codec
|
|
||||||
{
|
{
|
||||||
public enum eMeetingPrivacy
|
public enum eMeetingPrivacy
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,7 +61,12 @@ namespace PepperDash.Essentials.Core.Devices.Codec
|
|||||||
OnRecentCallsListChange();
|
OnRecentCallsListChange();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateCallHistory(List<CallHistoryEntry> newList)
|
||||||
|
{
|
||||||
|
RecentCalls = newList;
|
||||||
|
|
||||||
|
OnRecentCallsListChange();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Generic call history entry, not device specific
|
/// Generic call history entry, not device specific
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using PepperDash.Essentials.Core;
|
namespace PepperDash.Essentials.Core.Devices.AudioCodec
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Core.AudioCodec
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For rooms that have audio codec
|
/// For rooms that have audio codec
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Devices.AudioCodec
|
||||||
|
{
|
||||||
|
public abstract class AudioCodecBase : EssentialsDevice, IHasDialer, IUsageTracking, IAudioCodecInfo
|
||||||
|
{
|
||||||
|
|
||||||
|
public event EventHandler<CodecCallStatusItemChangeEventArgs> CallStatusChange;
|
||||||
|
|
||||||
|
public AudioCodecInfo CodecInfo { get; protected set; }
|
||||||
|
|
||||||
|
#region IUsageTracking Members
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This object can be added by outside users of this class to provide usage tracking
|
||||||
|
/// for various services
|
||||||
|
/// </summary>
|
||||||
|
public UsageTracking UsageTracker { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true when any call is not in state Unknown, Disconnecting, Disconnected
|
||||||
|
/// </summary>
|
||||||
|
public bool IsInCall
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
bool value;
|
||||||
|
|
||||||
|
if (ActiveCalls != null)
|
||||||
|
value = ActiveCalls.Any(c => c.IsActiveCall);
|
||||||
|
else
|
||||||
|
value = false;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// In most cases only a single call can be active
|
||||||
|
public List<CodecActiveCallItem> ActiveCalls { get; set; }
|
||||||
|
|
||||||
|
public AudioCodecBase(string key, string name)
|
||||||
|
: base(key, name)
|
||||||
|
{
|
||||||
|
ActiveCalls = new List<CodecActiveCallItem>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper method to fire CallStatusChange event with old and new status
|
||||||
|
/// </summary>
|
||||||
|
protected void SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus newStatus, CodecActiveCallItem call)
|
||||||
|
{
|
||||||
|
call.Status = newStatus;
|
||||||
|
|
||||||
|
OnCallStatusChange(call);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="previousStatus"></param>
|
||||||
|
/// <param name="newStatus"></param>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
protected void OnCallStatusChange(CodecActiveCallItem item)
|
||||||
|
{
|
||||||
|
var handler = CallStatusChange;
|
||||||
|
if (handler != null)
|
||||||
|
handler(this, new CodecCallStatusItemChangeEventArgs(item));
|
||||||
|
|
||||||
|
if (UsageTracker != null)
|
||||||
|
{
|
||||||
|
if (IsInCall && !UsageTracker.UsageTrackingStarted)
|
||||||
|
UsageTracker.StartDeviceUsage();
|
||||||
|
else if (UsageTracker.UsageTrackingStarted && !IsInCall)
|
||||||
|
UsageTracker.EndDeviceUsage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region IHasDialer Members
|
||||||
|
|
||||||
|
public abstract void Dial(string number);
|
||||||
|
|
||||||
|
public abstract void EndCall(CodecActiveCallItem activeCall);
|
||||||
|
|
||||||
|
public abstract void EndAllCalls();
|
||||||
|
|
||||||
|
public abstract void AcceptCall(CodecActiveCallItem item);
|
||||||
|
|
||||||
|
public abstract void RejectCall(CodecActiveCallItem item);
|
||||||
|
|
||||||
|
public abstract void SendDtmf(string digit);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials;
|
using PepperDash.Essentials;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Fusion
|
namespace PepperDash.Essentials.Core.Fusion
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.Devices;
|
using PepperDash.Essentials.Core.Devices;
|
||||||
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Fusion
|
namespace PepperDash.Essentials.Core.Fusion
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -186,6 +186,7 @@
|
|||||||
<Compile Include="Device Info\DeviceInfo.cs" />
|
<Compile Include="Device Info\DeviceInfo.cs" />
|
||||||
<Compile Include="Device Info\DeviceInfoEventArgs.cs" />
|
<Compile Include="Device Info\DeviceInfoEventArgs.cs" />
|
||||||
<Compile Include="Device Info\IDeviceInfoProvider.cs" />
|
<Compile Include="Device Info\IDeviceInfoProvider.cs" />
|
||||||
|
<Compile Include="Devices\AudioCodecBase.cs" />
|
||||||
<Compile Include="Devices\CodecInterfaces.cs" />
|
<Compile Include="Devices\CodecInterfaces.cs" />
|
||||||
<Compile Include="Devices\CrestronProcessor.cs" />
|
<Compile Include="Devices\CrestronProcessor.cs" />
|
||||||
<Compile Include="Devices\DestinationListItem.cs" />
|
<Compile Include="Devices\DestinationListItem.cs" />
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ namespace PepperDash.Essentials.Core.Rooms.Config
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class EssentialsNDisplayRoomPropertiesConfig : EssentialsConferenceRoomPropertiesConfig
|
public class EssentialsNDisplayRoomPropertiesConfig : EssentialsHuddleRoomPropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("defaultAudioBehavior")]
|
[JsonProperty("defaultAudioBehavior")]
|
||||||
public string DefaultAudioBehavior { get; set; }
|
public string DefaultAudioBehavior { get; set; }
|
||||||
|
|||||||
@@ -40,9 +40,9 @@ namespace PepperDash.Essentials.Core.Rooms.Config
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
rm = new EssentialsDualDisplayRoom(roomConfig);
|
//rm = new EssentialsDualDisplayRoom();
|
||||||
|
|
||||||
return rm;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -7,654 +7,16 @@ using Newtonsoft.Json;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
using PepperDash.Essentials.Core.Devices.AudioCodec;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsDualDisplayRoom : EssentialsNDisplayRoomBase, IHasCurrentVolumeControls,
|
public class EssentialsDualDisplayRoom
|
||||||
IRunRouteAction, IPrivacy, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasInCallFeedback
|
|
||||||
{
|
{
|
||||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
|
||||||
|
|
||||||
public EssentialsDualDisplayRoomPropertiesConfig PropertiesConfig { get; private set; }
|
|
||||||
|
|
||||||
//************************
|
|
||||||
// Call-related stuff
|
|
||||||
|
|
||||||
public BoolFeedback InCallFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// States: 0 for on hook, 1 for video, 2 for audio, 3 for telekenesis
|
|
||||||
/// </summary>
|
|
||||||
public IntFeedback CallTypeFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback PrivacyModeIsOnFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// When something in the room is sharing with the far end or through other means
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback IsSharingFeedback { get; private set; }
|
|
||||||
|
|
||||||
public IRoutingSinkWithSwitching LeftDisplay { get; private set; }
|
|
||||||
public IRoutingSinkWithSwitching RightDisplay { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
protected override Func<bool> OnFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
var leftDisp = LeftDisplay as DisplayBase;
|
|
||||||
var rightDisp = RightDisplay as DisplayBase;
|
|
||||||
var val = leftDisp != null && leftDisp.CurrentSourceInfo != null
|
|
||||||
&& leftDisp.CurrentSourceInfo.Type == eSourceListItemType.Route
|
|
||||||
&& rightDisp != null && rightDisp.CurrentSourceInfo != null
|
|
||||||
&& rightDisp.CurrentSourceInfo.Type == eSourceListItemType.Route;
|
|
||||||
return val;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
protected override Func<bool> IsWarmingFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
var leftDisp = LeftDisplay as DisplayBase;
|
|
||||||
var rightDisp = RightDisplay as DisplayBase;
|
|
||||||
if (leftDisp != null && RightDisplay != null)
|
|
||||||
return rightDisp != null && (leftDisp.IsWarmingUpFeedback.BoolValue || rightDisp.IsWarmingUpFeedback.BoolValue);
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
protected override Func<bool> IsCoolingFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
var leftDisp = LeftDisplay as DisplayBase;
|
|
||||||
var rightDisp = RightDisplay as DisplayBase;
|
|
||||||
if (leftDisp != null && RightDisplay != null)
|
|
||||||
return rightDisp != null && (leftDisp.IsCoolingDownFeedback.BoolValue || rightDisp.IsCoolingDownFeedback.BoolValue);
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IBasicVolumeControls DefaultAudioDevice { get; private set; }
|
|
||||||
public IBasicVolumeControls DefaultVolumeControls { get; private set; }
|
|
||||||
|
|
||||||
public VideoCodecBase VideoCodec { get; private set; }
|
|
||||||
|
|
||||||
public AudioCodecBase AudioCodec { get; private set; }
|
|
||||||
|
|
||||||
public bool ExcludeFromGlobalFunctions { get; set; }
|
|
||||||
|
|
||||||
public string DefaultSourceItem { get; set; }
|
|
||||||
|
|
||||||
public ushort DefaultVolume { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// If room is off, enables power on to last source. Default true
|
|
||||||
/// </summary>
|
|
||||||
public bool EnablePowerOnToLastSource { get; set; }
|
|
||||||
string _lastSourceKey;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the volume control device, and attaches/removes InUseTrackers with "audio"
|
|
||||||
/// tag to device.
|
|
||||||
/// </summary>
|
|
||||||
public IBasicVolumeControls CurrentVolumeControls
|
|
||||||
{
|
|
||||||
get { return _currentAudioDevice; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value == _currentAudioDevice) return;
|
|
||||||
|
|
||||||
var oldDev = _currentAudioDevice;
|
|
||||||
// derigister this room from the device, if it can
|
|
||||||
if (oldDev is IInUseTracking)
|
|
||||||
(oldDev as IInUseTracking).InUseTracker.RemoveUser(this, "audio");
|
|
||||||
var handler = CurrentVolumeDeviceChange;
|
|
||||||
if (handler != null)
|
|
||||||
CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.WillChange));
|
|
||||||
_currentAudioDevice = value;
|
|
||||||
if (handler != null)
|
|
||||||
CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.DidChange));
|
|
||||||
// register this room with new device, if it can
|
|
||||||
if (_currentAudioDevice is IInUseTracking)
|
|
||||||
(_currentAudioDevice as IInUseTracking).InUseTracker.AddUser(this, "audio");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IBasicVolumeControls _currentAudioDevice;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// "codecOsd"
|
|
||||||
/// </summary>
|
|
||||||
public string DefaultCodecRouteString { get { return "codecOsd"; } }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Temporary implementation. Returns the schedule-ready object or null if none. Fow now,
|
|
||||||
/// always returns the VideoCodec if it is capable
|
|
||||||
/// </summary>
|
|
||||||
public IHasScheduleAwareness ScheduleSource { get { return VideoCodec as IHasScheduleAwareness; } }
|
|
||||||
|
|
||||||
readonly CCriticalSection _sourceSelectLock = new CCriticalSection();
|
|
||||||
|
|
||||||
public EssentialsDualDisplayRoom(DeviceConfig config)
|
|
||||||
: base(config)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
PropertiesConfig = JsonConvert.DeserializeObject<EssentialsDualDisplayRoomPropertiesConfig>
|
|
||||||
(config.Properties.ToString());
|
|
||||||
|
|
||||||
var leftDisp = PropertiesConfig.Displays[eSourceListItemDestinationTypes.leftDisplay];
|
|
||||||
if (leftDisp != null)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(leftDisp.Key))
|
|
||||||
{
|
|
||||||
LeftDisplay = DeviceManager.GetDeviceForKey(leftDisp.Key) as IRoutingSinkWithSwitching;
|
|
||||||
Displays.Add(eSourceListItemDestinationTypes.leftDisplay, LeftDisplay);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(0, this, "Unable to get LeftDisplay for Room");
|
|
||||||
}
|
|
||||||
|
|
||||||
var rightDisp = PropertiesConfig.Displays[eSourceListItemDestinationTypes.rightDisplay];
|
|
||||||
if (rightDisp != null)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(rightDisp.Key))
|
|
||||||
{
|
|
||||||
LeftDisplay = DeviceManager.GetDeviceForKey(rightDisp.Key) as IRoutingSinkWithSwitching;
|
|
||||||
Displays.Add(eSourceListItemDestinationTypes.rightDisplay, RightDisplay);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(0, this, "Unable to get LeftDisplay for Room");
|
|
||||||
}
|
|
||||||
|
|
||||||
VideoCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.VideoCodecKey) as
|
|
||||||
VideoCodecBase;
|
|
||||||
if (VideoCodec == null)
|
|
||||||
throw new ArgumentNullException("codec cannot be null");
|
|
||||||
|
|
||||||
AudioCodec = DeviceManager.GetDeviceForKey(PropertiesConfig.AudioCodecKey) as
|
|
||||||
AudioCodecBase;
|
|
||||||
if (AudioCodec == null)
|
|
||||||
Debug.Console(0, this, "No Audio Codec Found");
|
|
||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
|
||||||
|
|
||||||
Initialize();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Error building room \n{0}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Initialize()
|
|
||||||
{
|
|
||||||
if (DefaultAudioDevice != null)
|
|
||||||
DefaultVolumeControls = DefaultAudioDevice;
|
|
||||||
else if (DefaultAudioDevice is IHasVolumeDevice)
|
|
||||||
DefaultVolumeControls = (DefaultAudioDevice as IHasVolumeDevice).VolumeDevice;
|
|
||||||
CurrentVolumeControls = DefaultVolumeControls;
|
|
||||||
|
|
||||||
|
|
||||||
var leftDisp = LeftDisplay as DisplayBase;
|
|
||||||
if (leftDisp != null)
|
|
||||||
InitializeDisplay(leftDisp);
|
|
||||||
|
|
||||||
var rightDisp = RightDisplay as DisplayBase;
|
|
||||||
if (rightDisp != null)
|
|
||||||
InitializeDisplay(rightDisp);
|
|
||||||
|
|
||||||
// Get Microphone Privacy object, if any
|
|
||||||
MicrophonePrivacy = EssentialsRoomConfigHelper.GetMicrophonePrivacy(PropertiesConfig, this);
|
|
||||||
|
|
||||||
Debug.Console(2, this, "Microphone Privacy Config evaluated.");
|
|
||||||
|
|
||||||
// Get emergency object, if any
|
|
||||||
Emergency = EssentialsRoomConfigHelper.GetEmergency(PropertiesConfig, this);
|
|
||||||
|
|
||||||
Debug.Console(2, this, "Emergency Config evaluated.");
|
|
||||||
|
|
||||||
// Combines call feedback from both codecs if available
|
|
||||||
InCallFeedback = new BoolFeedback(() =>
|
|
||||||
{
|
|
||||||
bool inAudioCall = false;
|
|
||||||
bool inVideoCall = false;
|
|
||||||
|
|
||||||
if (AudioCodec != null)
|
|
||||||
inAudioCall = AudioCodec.IsInCall;
|
|
||||||
|
|
||||||
if (VideoCodec != null)
|
|
||||||
inVideoCall = VideoCodec.IsInCall;
|
|
||||||
|
|
||||||
return inAudioCall || inVideoCall;
|
|
||||||
});
|
|
||||||
|
|
||||||
VideoCodec.CallStatusChange += (o, a) => InCallFeedback.FireUpdate();
|
|
||||||
|
|
||||||
if (AudioCodec != null)
|
|
||||||
AudioCodec.CallStatusChange += (o, a) => InCallFeedback.FireUpdate();
|
|
||||||
|
|
||||||
IsSharingFeedback = new BoolFeedback(() => VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
|
||||||
VideoCodec.SharingContentIsOnFeedback.OutputChange += (o, a) => IsSharingFeedback.FireUpdate();
|
|
||||||
|
|
||||||
// link privacy to VC (for now?)
|
|
||||||
PrivacyModeIsOnFeedback = new BoolFeedback(() => VideoCodec.PrivacyModeIsOnFeedback.BoolValue);
|
|
||||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange += (o, a) => PrivacyModeIsOnFeedback.FireUpdate();
|
|
||||||
|
|
||||||
CallTypeFeedback = new IntFeedback(() => 0);
|
|
||||||
|
|
||||||
SourceListKey = "default";
|
|
||||||
EnablePowerOnToLastSource = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InitializeDisplay(DisplayBase disp)
|
|
||||||
{
|
|
||||||
if (disp != null)
|
|
||||||
{
|
|
||||||
// Link power, warming, cooling to display
|
|
||||||
disp.PowerIsOnFeedback.OutputChange += (o, a) =>
|
|
||||||
{
|
|
||||||
if (disp.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
if (!disp.PowerIsOnFeedback.BoolValue)
|
|
||||||
disp.CurrentSourceInfo = null;
|
|
||||||
OnFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
if (disp.PowerIsOnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
SetDefaultLevels();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
|
||||||
{
|
|
||||||
IsWarmingUpFeedback.FireUpdate();
|
|
||||||
if (IsWarmingUpFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var basicVolumeWithFeedback = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
if (basicVolumeWithFeedback != null)
|
|
||||||
{
|
|
||||||
basicVolumeWithFeedback.SetVolume(DefaultVolume);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
disp.IsCoolingDownFeedback.OutputChange += (o, a) => IsCoolingDownFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void CustomSetConfig(DeviceConfig config)
|
|
||||||
{
|
|
||||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsDualDisplayRoomPropertiesConfig>(config.Properties.ToString());
|
|
||||||
|
|
||||||
if (newPropertiesConfig != null)
|
|
||||||
PropertiesConfig = newPropertiesConfig;
|
|
||||||
|
|
||||||
ConfigWriter.UpdateRoomConfig(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
// Add Occupancy object from config
|
|
||||||
if (PropertiesConfig.Occupancy != null)
|
|
||||||
SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
|
||||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
|
||||||
|
|
||||||
LogoUrl = PropertiesConfig.Logo.GetUrl();
|
|
||||||
SourceListKey = PropertiesConfig.SourceListKey;
|
|
||||||
DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
|
||||||
DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
protected override void EndShutdown()
|
|
||||||
{
|
|
||||||
VideoCodec.EndAllCalls();
|
|
||||||
|
|
||||||
SetDefaultLevels();
|
|
||||||
|
|
||||||
RunDefaultPresentRoute();
|
|
||||||
|
|
||||||
CrestronEnvironment.Sleep(1000);
|
|
||||||
|
|
||||||
RunRouteAction("roomOff", SourceListKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Routes the default source item, if any. Returns true when default route exists
|
|
||||||
/// </summary>
|
|
||||||
public override bool RunDefaultPresentRoute()
|
|
||||||
{
|
|
||||||
if (DefaultSourceItem != null)
|
|
||||||
RunRouteAction(DefaultSourceItem, SourceListKey);
|
|
||||||
|
|
||||||
return DefaultSourceItem != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets up the room when started into call mode without presenting a source
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public bool RunDefaultCallRoute()
|
|
||||||
{
|
|
||||||
RunRouteAction(DefaultCodecRouteString, SourceListKey);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="routeKey"></param>
|
|
||||||
/// <param name="sourceListKey"></param>
|
|
||||||
public void RunRouteAction(string routeKey, string sourceListKey)
|
|
||||||
{
|
|
||||||
RunRouteAction(routeKey, sourceListKey, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a source from config list SourceListKey and dynamically build and executes the
|
|
||||||
/// route or commands
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="routeKey"></param>
|
|
||||||
/// <param name="sourceListKey"></param>
|
|
||||||
/// <param name="successCallback"></param>
|
|
||||||
public void RunRouteAction(string routeKey, string sourceListKey, Action successCallback)
|
|
||||||
{
|
|
||||||
// Run this on a separate thread
|
|
||||||
//new CTimer
|
|
||||||
CrestronInvoke.BeginInvoke(o =>
|
|
||||||
{
|
|
||||||
// try to prevent multiple simultaneous selections
|
|
||||||
_sourceSelectLock.TryEnter();
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Run route action '{0}'", routeKey);
|
|
||||||
var dict = ConfigReader.ConfigObject.GetSourceListForKey(sourceListKey);
|
|
||||||
if (dict == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "WARNING: Config source list '{0}' not found", sourceListKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to get the list item by it's string key
|
|
||||||
if (!dict.ContainsKey(routeKey))
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
|
|
||||||
routeKey, SourceListKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// End usage timer on last source
|
|
||||||
if (!string.IsNullOrEmpty(_lastSourceKey))
|
|
||||||
{
|
|
||||||
var usageLastSource = dict[_lastSourceKey].SourceDevice as IUsageTracking;
|
|
||||||
if (usageLastSource != null && usageLastSource.UsageTracker != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// There MAY have been failures in here. Protect
|
|
||||||
usageLastSource.UsageTracker.EndDeviceUsage();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking:\r{0}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Let's run it
|
|
||||||
var item = dict[routeKey];
|
|
||||||
if (routeKey.ToLower() != "roomoff")
|
|
||||||
{
|
|
||||||
|
|
||||||
_lastSourceKey = routeKey;
|
|
||||||
}
|
|
||||||
//else
|
|
||||||
// CurrentSourceInfoKey = null;
|
|
||||||
|
|
||||||
// hand off the individual routes to this helper
|
|
||||||
foreach (var route in item.RouteList)
|
|
||||||
DoRouteItem(route, item, routeKey);
|
|
||||||
|
|
||||||
// Start usage timer on routed source
|
|
||||||
var usageNewSource = item.SourceDevice as IUsageTracking;
|
|
||||||
if (usageNewSource != null && usageNewSource.UsageTracker != null) // Have to make sure there is a usage tracker!
|
|
||||||
{
|
|
||||||
(item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
|
|
||||||
}
|
|
||||||
|
|
||||||
// See if this can be moved into common, base-class method -------------
|
|
||||||
|
|
||||||
|
|
||||||
// Set volume control, using default if non provided
|
|
||||||
IBasicVolumeControls volDev = null;
|
|
||||||
// Handle special cases for volume control
|
|
||||||
if (string.IsNullOrEmpty(item.VolumeControlKey)
|
|
||||||
|| item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
|
|
||||||
volDev = DefaultVolumeControls;
|
|
||||||
|
|
||||||
// Or a specific device, probably rarely used.
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
|
|
||||||
if (dev is IBasicVolumeControls)
|
|
||||||
volDev = dev as IBasicVolumeControls;
|
|
||||||
else if (dev is IHasVolumeDevice)
|
|
||||||
volDev = (dev as IHasVolumeDevice).VolumeDevice;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (volDev != CurrentVolumeControls)
|
|
||||||
{
|
|
||||||
// zero the volume on the device we are leaving.
|
|
||||||
// Set the volume to default on device we are entering
|
|
||||||
if (ZeroVolumeWhenSwtichingVolumeDevices && CurrentVolumeControls is IBasicVolumeWithFeedback)
|
|
||||||
{
|
|
||||||
var vd = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
SavedVolumeLevels[vd] = (uint)vd.VolumeLevelFeedback.IntValue;
|
|
||||||
vd.SetVolume(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
CurrentVolumeControls = volDev;
|
|
||||||
if (ZeroVolumeWhenSwtichingVolumeDevices && CurrentVolumeControls is IBasicVolumeWithFeedback)
|
|
||||||
{
|
|
||||||
var vd = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
ushort vol = (SavedVolumeLevels.ContainsKey(vd) ? (ushort)SavedVolumeLevels[vd] : DefaultVolume);
|
|
||||||
vd.SetVolume(vol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// -----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// store the name and UI info for routes
|
|
||||||
if (item.SourceKey == "$off")
|
|
||||||
{
|
|
||||||
LeftDisplay.CurrentSourceInfoKey = routeKey;
|
|
||||||
LeftDisplay.CurrentSourceInfo = null;
|
|
||||||
RightDisplay.CurrentSourceInfoKey = routeKey;
|
|
||||||
RightDisplay.CurrentSourceInfo = null;
|
|
||||||
}
|
|
||||||
//else if (item.SourceKey != null)
|
|
||||||
//{
|
|
||||||
// if(item.RouteList
|
|
||||||
// CurrentSourceInfoKey = routeKey;
|
|
||||||
// CurrentSourceInfo = item;
|
|
||||||
//}
|
|
||||||
|
|
||||||
OnFeedback.FireUpdate();
|
|
||||||
|
|
||||||
// report back when done
|
|
||||||
if (successCallback != null)
|
|
||||||
successCallback();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "ERROR in routing: {0}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
_sourceSelectLock.Leave();
|
|
||||||
}, 0); // end of CTimer
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="route"></param>
|
|
||||||
/// <param name="sourceItem"></param>
|
|
||||||
/// <param name="sourceItemKey"></param>
|
|
||||||
void DoRouteItem(SourceRouteListItem route, SourceListItem sourceItem, string sourceItemKey)
|
|
||||||
{
|
|
||||||
// if there is a $defaultAll on route, run two separate
|
|
||||||
if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
// Going to assume a single-path route for now
|
|
||||||
var tempVideo = new SourceRouteListItem
|
|
||||||
{
|
|
||||||
DestinationKey = "$defaultDisplay",
|
|
||||||
SourceKey = route.SourceKey,
|
|
||||||
Type = eRoutingSignalType.Video
|
|
||||||
};
|
|
||||||
DoRoute(tempVideo, sourceItem, sourceItemKey);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DoRoute(route, sourceItem, sourceItemKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="route"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private bool DoRoute(SourceRouteListItem route, SourceListItem sourceItem, string sourceItemKey)
|
|
||||||
{
|
|
||||||
IRoutingSink dest = null;
|
|
||||||
|
|
||||||
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
|
|
||||||
dest = DefaultAudioDevice as IRoutingSinkNoSwitching;
|
|
||||||
else if (route.DestinationKey.Equals(LeftDisplay.Key, StringComparison.OrdinalIgnoreCase))
|
|
||||||
dest = LeftDisplay;
|
|
||||||
else if (route.DestinationKey.Equals(RightDisplay.Key, StringComparison.OrdinalIgnoreCase))
|
|
||||||
dest = RightDisplay;
|
|
||||||
else
|
|
||||||
dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
|
|
||||||
|
|
||||||
if (dest == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Cannot route, unknown destination '{0}'", route.DestinationKey);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
dest.ReleaseRoute();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (dest is IPower)
|
|
||||||
(dest as IPower).PowerOff();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var source = DeviceManager.GetDeviceForKey(route.SourceKey) as IRoutingOutputs;
|
|
||||||
if (source == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", route.SourceKey, route.DestinationKey);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
dest.ReleaseAndMakeRoute(source, route.Type);
|
|
||||||
|
|
||||||
dest.CurrentSourceInfoKey = sourceItemKey;
|
|
||||||
dest.CurrentSourceInfo = sourceItem;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void RoomVacatedForTimeoutPeriod(object o)
|
|
||||||
{
|
|
||||||
//Implement this
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Does what it says
|
|
||||||
/// </summary>
|
|
||||||
public override void SetDefaultLevels()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Restoring default levels");
|
|
||||||
var vc = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
|
||||||
if (vc != null)
|
|
||||||
vc.SetVolume(DefaultVolume);
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// Will power the room on with the last-used source
|
|
||||||
/// </summary>
|
|
||||||
public override void PowerOnToDefaultOrLastSource()
|
|
||||||
{
|
|
||||||
if (!EnablePowerOnToLastSource || _lastSourceKey == null)
|
|
||||||
return;
|
|
||||||
RunRouteAction(_lastSourceKey, SourceListKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
|
|
||||||
/// </summary>
|
|
||||||
public static void AllRoomsOff()
|
|
||||||
{
|
|
||||||
var allRooms = DeviceManager.AllDevices.OfType<EssentialsHuddleSpaceRoom>().Where(d => !d.ExcludeFromGlobalFunctions);
|
|
||||||
foreach (var room in allRooms)
|
|
||||||
{
|
|
||||||
room.RunRouteAction("roomOff", room.SourceListKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IPrivacy Members
|
|
||||||
|
|
||||||
|
|
||||||
public void PrivacyModeOff()
|
|
||||||
{
|
|
||||||
VideoCodec.PrivacyModeOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrivacyModeOn()
|
|
||||||
{
|
|
||||||
VideoCodec.PrivacyModeOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PrivacyModeToggle()
|
|
||||||
{
|
|
||||||
VideoCodec.PrivacyModeToggle();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,8 @@ using Newtonsoft.Json;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,9 @@ using Newtonsoft.Json;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices.AudioCodec;
|
||||||
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Core.Rooms;
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
using PepperDash.Essentials.Core.Rooms.Config;
|
using PepperDash.Essentials.Core.Rooms.Config;
|
||||||
|
|
||||||
@@ -91,7 +94,7 @@ namespace PepperDash.Essentials
|
|||||||
if (AudioCodec == null)
|
if (AudioCodec == null)
|
||||||
Debug.Console(0, this, "No Audio Codec Found");
|
Debug.Console(0, this, "No Audio Codec Found");
|
||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSink;
|
||||||
|
|
||||||
Initialize();
|
Initialize();
|
||||||
}
|
}
|
||||||
@@ -106,7 +109,7 @@ namespace PepperDash.Essentials
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (DefaultAudioDevice != null)
|
if (DefaultAudioDevice != null)
|
||||||
DefaultVolumeControls = DefaultAudioDevice;
|
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||||
else if (DefaultAudioDevice is IHasVolumeDevice)
|
else if (DefaultAudioDevice is IHasVolumeDevice)
|
||||||
DefaultVolumeControls = (DefaultAudioDevice as IHasVolumeDevice).VolumeDevice;
|
DefaultVolumeControls = (DefaultAudioDevice as IHasVolumeDevice).VolumeDevice;
|
||||||
CurrentVolumeControls = DefaultVolumeControls;
|
CurrentVolumeControls = DefaultVolumeControls;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using Crestron.SimplSharp;
|
|||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices.AudioCodec;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.AudioCodec
|
namespace PepperDash.Essentials.Devices.Common.AudioCodec
|
||||||
|
|||||||
@@ -100,10 +100,6 @@
|
|||||||
<Compile Include="Cameras\CameraBase.cs" />
|
<Compile Include="Cameras\CameraBase.cs" />
|
||||||
<Compile Include="Cameras\CameraVisca.cs" />
|
<Compile Include="Cameras\CameraVisca.cs" />
|
||||||
<Compile Include="Cameras\IHasCameraPresets.cs" />
|
<Compile Include="Cameras\IHasCameraPresets.cs" />
|
||||||
<Compile Include="Codec\eCodecCallDirection.cs" />
|
|
||||||
<Compile Include="Codec\eCodecCallType.cs" />
|
|
||||||
<Compile Include="Codec\eCodecCallStatus.cs" />
|
|
||||||
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
|
||||||
<Compile Include="ImageProcessors\TVOneCorio.cs" />
|
<Compile Include="ImageProcessors\TVOneCorio.cs" />
|
||||||
<Compile Include="ImageProcessors\TVOneCorioPropertiesConfig.cs" />
|
<Compile Include="ImageProcessors\TVOneCorioPropertiesConfig.cs" />
|
||||||
<Compile Include="Power Controllers\Digitallogger.cs" />
|
<Compile Include="Power Controllers\Digitallogger.cs" />
|
||||||
@@ -152,7 +148,6 @@
|
|||||||
<Compile Include="VideoCodec\CiscoCodec\xConfiguration.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\xConfiguration.cs" />
|
||||||
<Compile Include="VideoCodec\CiscoCodec\xEvent.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\xEvent.cs" />
|
||||||
<Compile Include="VideoCodec\CiscoCodec\HttpApiServer.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\HttpApiServer.cs" />
|
||||||
<Compile Include="Codec\CodecActiveCallItem.cs" />
|
|
||||||
<Compile Include="VideoCodec\MockVC\MockVC.cs" />
|
<Compile Include="VideoCodec\MockVC\MockVC.cs" />
|
||||||
<Compile Include="VideoCodec\CiscoCodec\xStatus.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\xStatus.cs" />
|
||||||
<Compile Include="VideoCodec\ZoomRoom\ResponseObjects.cs" />
|
<Compile Include="VideoCodec\ZoomRoom\ResponseObjects.cs" />
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
|
|||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Rooms;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
using PepperDash.Essentials.Core.Devices;
|
using PepperDash.Essentials.Core.Devices;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
using PepperDash.Essentials.Devices.Common.Cameras;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using Crestron.SimplSharp;
|
|||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Devices.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.Cameras
|
namespace PepperDash.Essentials.Devices.Common.Cameras
|
||||||
|
|||||||
@@ -15,8 +15,7 @@ using PepperDash.Essentials.Core.Devices.VideoCodec;
|
|||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
using PepperDash.Essentials.Devices.Common.Cameras;
|
||||||
using PepperDash.Essentials.Core.Devices.Codec;
|
using PepperDash.Essentials.Core.Devices.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.Occupancy;
|
using PepperDash.Essentials.Devices.Core.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user