mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 12:44:58 +00:00
Compare commits
10 Commits
feature/ge
...
1.10.9-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75c8dea4d3 | ||
|
|
960c882436 | ||
|
|
d302a1b06b | ||
|
|
780ec0aa4b | ||
|
|
c2deaf9534 | ||
|
|
cf3563d6b6 | ||
|
|
e45643e9ab | ||
|
|
03a640d3d4 | ||
|
|
96cc263dbe | ||
|
|
9860e5f498 |
@@ -398,6 +398,22 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[JoinName("DirectoryClearSelection")]
|
||||||
|
public JoinDataComplete DirectoryClearSelection = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 100,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Directory Search Busy FB",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[JoinName("DirectoryEntryIsContact")]
|
[JoinName("DirectoryEntryIsContact")]
|
||||||
public JoinDataComplete DirectoryEntryIsContact = new JoinDataComplete(
|
public JoinDataComplete DirectoryEntryIsContact = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -1256,11 +1272,12 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
},
|
},
|
||||||
new JoinMetadata
|
new JoinMetadata
|
||||||
{
|
{
|
||||||
Description = "Directory Select Row",
|
Description = "Directory Select Row and Feedback",
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
JoinType = eJoinType.Analog
|
JoinType = eJoinType.Analog
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
[JoinName("SelectedContactMethodCount")]
|
[JoinName("SelectedContactMethodCount")]
|
||||||
public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
|
public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
@@ -1289,6 +1306,22 @@ namespace PepperDash.Essentials.Core.Bridges.JoinMaps
|
|||||||
JoinType = eJoinType.Analog
|
JoinType = eJoinType.Analog
|
||||||
});
|
});
|
||||||
|
|
||||||
|
[JoinName("DirectorySelectRowFeedback")]
|
||||||
|
public JoinDataComplete DirectorySelectRowFeedback = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 104,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Directory Select Row and Feedback",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Analog
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[JoinName("CameraPresetSelect")]
|
[JoinName("CameraPresetSelect")]
|
||||||
public JoinDataComplete CameraPresetSelect = new JoinDataComplete(
|
public JoinDataComplete CameraPresetSelect = new JoinDataComplete(
|
||||||
new JoinData
|
new JoinData
|
||||||
|
|||||||
@@ -131,4 +131,15 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class EssentialsPluginDevelopmentDeviceFactory<T> : EssentialsDeviceFactory<T>, IPluginDevelopmentDeviceFactory where T : EssentialsDevice
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
|
||||||
|
/// </summary>
|
||||||
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
|
|
||||||
|
public List<string> DevelopmentEssentialsFrameworkVersions { get; protected set; }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
public static class StringExtensions
|
||||||
|
{
|
||||||
|
public static string NullIfEmpty(this string s)
|
||||||
|
{
|
||||||
|
return string.IsNullOrEmpty(s) ? null : s;
|
||||||
|
}
|
||||||
|
public static string NullIfWhiteSpace(this string s)
|
||||||
|
{
|
||||||
|
return string.IsNullOrEmpty(s.Trim()) ? null : s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
@@ -162,6 +163,38 @@ namespace PepperDash.Essentials.Core
|
|||||||
AssemblyVersion = assemblyVersion;
|
AssemblyVersion = assemblyVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool IsRunningDevelopmentVersion(List<string> developmentVersions, string minimumVersion)
|
||||||
|
{
|
||||||
|
if (Regex.Match(AssemblyVersion, @"^(\d*).(\d*).(\d*).*").Groups[1].Value == "0")
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Running Local Build. Bypassing Dependency Check.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (developmentVersions == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0,
|
||||||
|
"Development Plugin does not specify a list of versions. Loading plugin may not work as expected. Checking Minumum version");
|
||||||
|
return IsRunningMinimumVersionOrHigher(minimumVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, "Comparing running version '{0}' to minimum versions '{1}'", AssemblyVersion, developmentVersions);
|
||||||
|
|
||||||
|
var versionMatch = developmentVersions.FirstOrDefault(x => x == AssemblyVersion);
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(versionMatch))
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Essentials Build does not match any builds required for plugin load. Bypassing Plugin Load.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, "Essentials Build {0} matches list of development builds", AssemblyVersion);
|
||||||
|
return IsRunningMinimumVersionOrHigher(minimumVersion);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks to see if the running version meets or exceed the minimum specified version. For beta versions (0.xx.yy), will always return true.
|
/// Checks to see if the running version meets or exceed the minimum specified version. For beta versions (0.xx.yy), will always return true.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -218,6 +218,7 @@
|
|||||||
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
||||||
<Compile Include="Extensions\JsonExtensions.cs" />
|
<Compile Include="Extensions\JsonExtensions.cs" />
|
||||||
|
<Compile Include="Extensions\StringExtensions.cs" />
|
||||||
<Compile Include="Factory\DeviceFactory.cs" />
|
<Compile Include="Factory\DeviceFactory.cs" />
|
||||||
<Compile Include="Factory\IDeviceFactory.cs" />
|
<Compile Include="Factory\IDeviceFactory.cs" />
|
||||||
<Compile Include="Factory\ReadyEventArgs.cs" />
|
<Compile Include="Factory\ReadyEventArgs.cs" />
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
@@ -15,5 +16,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IPluginDevelopmentDeviceFactory : IPluginDeviceFactory
|
||||||
|
{
|
||||||
|
List<string> DevelopmentEssentialsFrameworkVersions { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -425,7 +425,11 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="loadedAssembly"></param>
|
/// <param name="loadedAssembly"></param>
|
||||||
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
||||||
{
|
{
|
||||||
var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
|
var developmentPlugin = plugin as IPluginDevelopmentDeviceFactory;
|
||||||
|
|
||||||
|
var passed = developmentPlugin != null ? Global.IsRunningDevelopmentVersion
|
||||||
|
(developmentPlugin.DevelopmentEssentialsFrameworkVersions, developmentPlugin.MinimumEssentialsFrameworkVersion)
|
||||||
|
: Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
|
||||||
|
|
||||||
if (!passed)
|
if (!passed)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
Stack<CodecDirectory> DirectoryBrowseHistoryStack { get; }
|
Stack<CodecDirectory> DirectoryBrowseHistoryStack { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IHasDirectoryClearSelection : IHasDirectory
|
||||||
|
{
|
||||||
|
void DirectoryClearSelection();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
||||||
&& DateTime.Now <= EndTime.AddMinutes(-5);
|
&& DateTime.Now <= EndTime.AddSeconds(-_joinableCooldownSeconds);
|
||||||
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
|
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
|
||||||
return joinable;
|
return joinable;
|
||||||
}
|
}
|
||||||
@@ -231,11 +231,23 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore] private readonly int _joinableCooldownSeconds;
|
||||||
|
|
||||||
|
|
||||||
public Meeting()
|
public Meeting()
|
||||||
{
|
{
|
||||||
Calls = new List<Call>();
|
Calls = new List<Call>();
|
||||||
|
_joinableCooldownSeconds = 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Meeting(int joinableCooldownSeconds)
|
||||||
|
{
|
||||||
|
Calls = new List<Call>();
|
||||||
|
_joinableCooldownSeconds = joinableCooldownSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region Overrides of Object
|
#region Overrides of Object
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
|
|||||||
@@ -108,7 +108,7 @@
|
|||||||
<Compile Include="Codec\eCodecCallStatus.cs" />
|
<Compile Include="Codec\eCodecCallStatus.cs" />
|
||||||
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
||||||
<Compile Include="Codec\iCodecAudio.cs" />
|
<Compile Include="Codec\iCodecAudio.cs" />
|
||||||
<Compile Include="VideoCodec\IConvertiblePreset.cs" />
|
<Compile Include="VideoCodec\ConvertiblePreset.cs" />
|
||||||
<Compile Include="Codec\IHasCallHold.cs" />
|
<Compile Include="Codec\IHasCallHold.cs" />
|
||||||
<Compile Include="Codec\IHasDoNotDisturb.cs" />
|
<Compile Include="Codec\IHasDoNotDisturb.cs" />
|
||||||
<Compile Include="Codec\IHasExternalSourceSwitching.cs" />
|
<Compile Include="Codec\IHasExternalSourceSwitching.cs" />
|
||||||
|
|||||||
@@ -377,5 +377,70 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
return meetings;
|
return meetings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Meeting> GetGenericMeetingsFromBookingResult(List<Booking> bookings, int joinableCooldownSeconds)
|
||||||
|
{
|
||||||
|
var meetings = new List<Meeting>();
|
||||||
|
|
||||||
|
if (Debug.Level > 0)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Meetings List:\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (Booking b in bookings)
|
||||||
|
{
|
||||||
|
var meeting = new Meeting(joinableCooldownSeconds);
|
||||||
|
|
||||||
|
if (b.Id != null)
|
||||||
|
meeting.Id = b.Id.Value;
|
||||||
|
if (b.Organizer != null)
|
||||||
|
meeting.Organizer = string.Format("{0}, {1}", b.Organizer.LastName.Value, b.Organizer.FirstName.Value);
|
||||||
|
if (b.Title != null)
|
||||||
|
meeting.Title = b.Title.Value;
|
||||||
|
if (b.Agenda != null)
|
||||||
|
meeting.Agenda = b.Agenda.Value;
|
||||||
|
if (b.Time != null)
|
||||||
|
{
|
||||||
|
meeting.StartTime = b.Time.StartTime.Value;
|
||||||
|
meeting.EndTime = b.Time.EndTime.Value;
|
||||||
|
}
|
||||||
|
if (b.Privacy != null)
|
||||||
|
meeting.Privacy = CodecCallPrivacy.ConvertToDirectionEnum(b.Privacy.Value);
|
||||||
|
|
||||||
|
//#warning Update this ConnectMode conversion after testing onsite. Expected value is "OBTP", but in PD NYC Test scenarios, "Manual" is being returned for OBTP meetings
|
||||||
|
if (b.DialInfo.ConnectMode != null)
|
||||||
|
if (b.DialInfo.ConnectMode.Value.ToLower() == "obtp" || b.DialInfo.ConnectMode.Value.ToLower() == "manual")
|
||||||
|
meeting.IsOneButtonToPushMeeting = true;
|
||||||
|
|
||||||
|
if (b.DialInfo.Calls.Call != null)
|
||||||
|
{
|
||||||
|
foreach (Call c in b.DialInfo.Calls.Call)
|
||||||
|
{
|
||||||
|
meeting.Calls.Add(new PepperDash.Essentials.Devices.Common.Codec.Call()
|
||||||
|
{
|
||||||
|
Number = c.Number.Value,
|
||||||
|
Protocol = c.Protocol.Value,
|
||||||
|
CallRate = c.CallRate.Value,
|
||||||
|
CallType = c.CallType.Value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
meetings.Add(meeting);
|
||||||
|
|
||||||
|
if (Debug.Level > 0)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Title: {0}, ID: {1}, Organizer: {2}, Agenda: {3}", meeting.Title, meeting.Id, meeting.Organizer, meeting.Agenda);
|
||||||
|
Debug.Console(1, " Start Time: {0}, End Time: {1}, Duration: {2}", meeting.StartTime, meeting.EndTime, meeting.Duration);
|
||||||
|
Debug.Console(1, " Joinable: {0}\n", meeting.Joinable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meetings.OrderBy(m => m.StartTime);
|
||||||
|
|
||||||
|
return meetings;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
{
|
{
|
||||||
enum eCommandType { SessionStart, SessionEnd, Command, GetStatus, GetConfiguration };
|
enum eCommandType { SessionStart, SessionEnd, Command, GetStatus, GetConfiguration };
|
||||||
public enum eExternalSourceType {camera, desktop, document_camera, mediaplayer, PC, whiteboard, other}
|
public enum eExternalSourceType {camera, desktop, document_camera, mediaplayer, PC, whiteboard, other}
|
||||||
public enum eExternalSourceMode {Ready, NotReady, Hidden, Error}
|
public enum eExternalSourceMode {Ready, NotReady, Hidden, Error}
|
||||||
|
|
||||||
public class CiscoSparkCodec : VideoCodecBase, IHasCallHistory, IHasCallFavorites, IHasDirectory,
|
public class CiscoSparkCodec : VideoCodecBase, IHasCallHistory, IHasCallFavorites, IHasDirectoryClearSelection,
|
||||||
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
|
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
|
||||||
ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets,
|
ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets,
|
||||||
IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute, IHasDoNotDisturbMode,
|
IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute, IHasDoNotDisturbMode,
|
||||||
@@ -493,6 +493,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
TieLineCollection.Default.Add(tl);
|
TieLineCollection.Default.Add(tl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DirectoryClearSelection()
|
||||||
|
{
|
||||||
|
DirectoryClearSelectionBase();
|
||||||
|
}
|
||||||
|
|
||||||
public void InitializeBranding(string roomKey)
|
public void InitializeBranding(string roomKey)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Initializing Branding for room {0}", roomKey);
|
Debug.Console(1, this, "Initializing Branding for room {0}", roomKey);
|
||||||
@@ -1023,7 +1028,7 @@ ConnectorID: {2}"
|
|||||||
if (tempPresets.Count > 0)
|
if (tempPresets.Count > 0)
|
||||||
{
|
{
|
||||||
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
|
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
|
||||||
var existingRoomPresets = new List<IConvertiblePreset>();
|
var existingRoomPresets = new List<CiscoCodecStatus.RoomPreset>();
|
||||||
// Add the existing items to the temporary list
|
// Add the existing items to the temporary list
|
||||||
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
|
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
|
||||||
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
|
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
|
||||||
@@ -1031,8 +1036,6 @@ ConnectorID: {2}"
|
|||||||
|
|
||||||
var jResponse = JObject.Parse(response);
|
var jResponse = JObject.Parse(response);
|
||||||
|
|
||||||
List<CiscoCodecStatus.RoomPreset> convertedRoomPresets =
|
|
||||||
existingRoomPresets.Select(a => (CiscoCodecStatus.RoomPreset) a).ToList();
|
|
||||||
|
|
||||||
IList<JToken> roomPresets = jResponse["Status"]["RoomPreset"].Children().ToList();
|
IList<JToken> roomPresets = jResponse["Status"]["RoomPreset"].Children().ToList();
|
||||||
// Iterate the new items in this response agains the temporary list. Overwrite any existing items and add new ones.
|
// Iterate the new items in this response agains the temporary list. Overwrite any existing items and add new ones.
|
||||||
@@ -1041,7 +1044,7 @@ ConnectorID: {2}"
|
|||||||
var preset = camPreset as CiscoCodecStatus.RoomPreset;
|
var preset = camPreset as CiscoCodecStatus.RoomPreset;
|
||||||
if (preset == null) continue;
|
if (preset == null) continue;
|
||||||
// First fine the existing preset that matches the id
|
// First fine the existing preset that matches the id
|
||||||
var existingPreset = convertedRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
|
var existingPreset = existingRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
|
||||||
if (existingPreset != null)
|
if (existingPreset != null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Existing Room Preset with ID: {0} found. Updating.", existingPreset.id);
|
Debug.Console(1, this, "Existing Room Preset with ID: {0} found. Updating.", existingPreset.id);
|
||||||
@@ -1073,7 +1076,7 @@ ConnectorID: {2}"
|
|||||||
CodecStatus.Status.RoomPreset = existingRoomPresets;
|
CodecStatus.Status.RoomPreset = existingRoomPresets;
|
||||||
|
|
||||||
// Generecise the list
|
// Generecise the list
|
||||||
NearEndPresets = existingRoomPresets.GetGenericPresets<CodecRoomPreset>();
|
NearEndPresets = existingRoomPresets.GetGenericPresets<CiscoCodecStatus.RoomPreset, CodecRoomPreset>();
|
||||||
|
|
||||||
var handler = CodecRoomPresetsListHasChanged;
|
var handler = CodecRoomPresetsListHasChanged;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
|
|||||||
@@ -32,12 +32,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="presets"></param>
|
/// <param name="presets"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<T> GetGenericPresets<T>(this List<IConvertiblePreset> presets)
|
public static List<TDestination> GetGenericPresets<TSource, TDestination>(this List<TSource> presets) where TSource : ConvertiblePreset where TDestination : PresetBase
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
presets.Select(preset => preset.ConvertCodecPreset())
|
presets.Select(preset => preset.ConvertCodecPreset())
|
||||||
.Where(newPreset => newPreset != null)
|
.Where(newPreset => newPreset != null)
|
||||||
.Cast<T>()
|
.Cast<TDestination>()
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2186,7 +2186,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RoomPreset : IConvertiblePreset
|
public class RoomPreset : ConvertiblePreset
|
||||||
{
|
{
|
||||||
public string id { get; set; }
|
public string id { get; set; }
|
||||||
public Defined Defined { get; set; }
|
public Defined Defined { get; set; }
|
||||||
@@ -2200,7 +2200,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
Type = new Type5();
|
Type = new Type5();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PresetBase ConvertCodecPreset()
|
public override PresetBase ConvertCodecPreset()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -2240,7 +2240,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
public Proximity Proximity { get; set; }
|
public Proximity Proximity { get; set; }
|
||||||
public RoomAnalytics RoomAnalytics { get; set; }
|
public RoomAnalytics RoomAnalytics { get; set; }
|
||||||
|
|
||||||
public List<IConvertiblePreset> RoomPreset { get; set; }
|
public List<RoomPreset> RoomPreset { get; set; }
|
||||||
|
|
||||||
public SIP SIP { get; set; }
|
public SIP SIP { get; set; }
|
||||||
public Security Security { get; set; }
|
public Security Security { get; set; }
|
||||||
@@ -2257,7 +2257,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
Standby = new Standby();
|
Standby = new Standby();
|
||||||
Cameras = new Cameras();
|
Cameras = new Cameras();
|
||||||
RoomAnalytics = new RoomAnalytics();
|
RoomAnalytics = new RoomAnalytics();
|
||||||
RoomPreset = new List<IConvertiblePreset>();
|
RoomPreset = new List<RoomPreset>();
|
||||||
Conference = new Conference2();
|
Conference = new Conference2();
|
||||||
SystemUnit = new SystemUnit();
|
SystemUnit = new SystemUnit();
|
||||||
Video = new Video();
|
Video = new Video();
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||||
{
|
{
|
||||||
public interface IConvertiblePreset
|
public abstract class ConvertiblePreset
|
||||||
{
|
{
|
||||||
PresetBase ConvertCodecPreset();
|
public abstract PresetBase ConvertCodecPreset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,25 +22,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
void MinMaxLayoutToggle();
|
void MinMaxLayoutToggle();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the required elements for layout control with direct layout selection
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasCodecLayoutsAvailable : IHasCodecLayouts
|
|
||||||
{
|
|
||||||
|
|
||||||
event EventHandler<AvailableLayoutChangedEventArgs> AvailableLayoutsChanged;
|
|
||||||
|
|
||||||
StringFeedback AvailableLocalLayoutsFeedback { get; }
|
|
||||||
List<CodecCommandWithLabel> AvailableLocalLayouts { get; }
|
|
||||||
void LocalLayoutSet(string layout);
|
|
||||||
void LocalLayoutSet(CodecCommandWithLabel layout);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AvailableLayoutChangedEventArgs : EventArgs
|
|
||||||
{
|
|
||||||
public List<CodecCommandWithLabel> AvailableLayouts { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the requirements for Zoom Room layout control
|
/// Defines the requirements for Zoom Room layout control
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Core.Intersystem;
|
using PepperDash.Core.Intersystem;
|
||||||
using PepperDash.Core.Intersystem.Tokens;
|
using PepperDash.Core.Intersystem.Tokens;
|
||||||
using PepperDash.Core.WebApi.Presets;
|
using PepperDash.Core.WebApi.Presets;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
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;
|
||||||
@@ -31,6 +32,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
private const int XSigEncoding = 28591;
|
private const int XSigEncoding = 28591;
|
||||||
protected const int MaxParticipants = 50;
|
protected const int MaxParticipants = 50;
|
||||||
private readonly byte[] _clearBytes = XSigHelpers.ClearOutputs();
|
private readonly byte[] _clearBytes = XSigHelpers.ClearOutputs();
|
||||||
|
|
||||||
|
private IHasDirectory _directoryCodec;
|
||||||
|
private BasicTriList _directoryTrilist;
|
||||||
|
private VideoCodecControllerJoinMap _directoryJoinmap;
|
||||||
|
|
||||||
|
protected string _timeFormatSpecifier;
|
||||||
|
protected string _dateFormatSpecifier;
|
||||||
|
|
||||||
|
|
||||||
protected VideoCodecBase(DeviceConfig config)
|
protected VideoCodecBase(DeviceConfig config)
|
||||||
: base(config)
|
: base(config)
|
||||||
{
|
{
|
||||||
@@ -371,10 +381,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
|
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (codec is IHasCodecLayoutsAvailable)
|
|
||||||
{
|
|
||||||
LinkVideoCodecAvailableLayoutsToApi(codec as IHasCodecLayoutsAvailable, trilist, joinMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (codec is IHasSelfviewPosition)
|
if (codec is IHasSelfviewPosition)
|
||||||
{
|
{
|
||||||
@@ -692,37 +698,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
{
|
{
|
||||||
if (meetingIndex >= maxParticipants * offset) break;
|
if (meetingIndex >= maxParticipants * offset) break;
|
||||||
|
|
||||||
// Debug.Console(2, this,
|
// Debug.Console(2, this,
|
||||||
//@"Updating Participant on xsig:
|
//@"Updating Participant on xsig:
|
||||||
//Name: {0} (s{9})
|
//Name: {0} (s{9})
|
||||||
//AudioMute: {1} (d{10})
|
//AudioMute: {1} (d{10})
|
||||||
//VideoMute: {2} (d{11})
|
//VideoMute: {2} (d{11})
|
||||||
//CanMuteVideo: {3} (d{12})
|
//CanMuteVideo: {3} (d{12})
|
||||||
//CanUMuteVideo: {4} (d{13})
|
//CanUMuteVideo: {4} (d{13})
|
||||||
//IsHost: {5} (d{14})
|
//IsHost: {5} (d{14})
|
||||||
//HandIsRaised: {6} (d{15})
|
//HandIsRaised: {6} (d{15})
|
||||||
//IsPinned: {7} (d{16})
|
//IsPinned: {7} (d{16})
|
||||||
//ScreenIndexIsPinnedTo: {8} (a{17})
|
//ScreenIndexIsPinnedTo: {8} (a{17})
|
||||||
//",
|
//",
|
||||||
// participant.Name,
|
// participant.Name,
|
||||||
// participant.AudioMuteFb,
|
// participant.AudioMuteFb,
|
||||||
// participant.VideoMuteFb,
|
// participant.VideoMuteFb,
|
||||||
// participant.CanMuteVideo,
|
// participant.CanMuteVideo,
|
||||||
// participant.CanUnmuteVideo,
|
// participant.CanUnmuteVideo,
|
||||||
// participant.IsHost,
|
// participant.IsHost,
|
||||||
// participant.HandIsRaisedFb,
|
// participant.HandIsRaisedFb,
|
||||||
// participant.IsPinnedFb,
|
// participant.IsPinnedFb,
|
||||||
// participant.ScreenIndexIsPinnedToFb,
|
// participant.ScreenIndexIsPinnedToFb,
|
||||||
// stringIndex + 1,
|
// stringIndex + 1,
|
||||||
// digitalIndex + 1,
|
// digitalIndex + 1,
|
||||||
// digitalIndex + 2,
|
// digitalIndex + 2,
|
||||||
// digitalIndex + 3,
|
// digitalIndex + 3,
|
||||||
// digitalIndex + 4,
|
// digitalIndex + 4,
|
||||||
// digitalIndex + 5,
|
// digitalIndex + 5,
|
||||||
// digitalIndex + 6,
|
// digitalIndex + 6,
|
||||||
// digitalIndex + 7,
|
// digitalIndex + 7,
|
||||||
// analogIndex + 1
|
// analogIndex + 1
|
||||||
// );
|
// );
|
||||||
|
|
||||||
|
|
||||||
//digitals
|
//digitals
|
||||||
@@ -789,10 +795,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
|
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
|
||||||
trilist.SetSigFalseAction(joinMap.SourceShareEnd.JoinNumber, StopSharing);
|
trilist.SetSigFalseAction(joinMap.SourceShareEnd.JoinNumber, StopSharing);
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, (b) => AutoShareContentWhileInCall = b);
|
trilist.SetBoolSigAction(joinMap.SourceShareAutoStart.JoinNumber, b => AutoShareContentWhileInCall = b);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Meeting> _currentMeetings = new List<Meeting>();
|
private List<Meeting> _currentMeetings = new List<Meeting>();
|
||||||
|
|
||||||
private void LinkVideoCodecScheduleToApi(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecScheduleToApi(IHasScheduleAwareness codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
@@ -800,7 +806,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.MinutesBeforeMeetingStart.JoinNumber, (i) =>
|
trilist.SetUShortSigAction(joinMap.MinutesBeforeMeetingStart.JoinNumber, (i) =>
|
||||||
{
|
{
|
||||||
codec.CodecSchedule.MeetingWarningMinutes = i;
|
codec.CodecSchedule.MeetingWarningMinutes = i;
|
||||||
});
|
});
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DialMeeting1.JoinNumber, () =>
|
trilist.SetSigFalseAction(joinMap.DialMeeting1.JoinNumber, () =>
|
||||||
@@ -904,90 +910,95 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
|
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
|
||||||
public IntFeedback MeetingsToDisplayFeedback { get; set; }
|
public IntFeedback MeetingsToDisplayFeedback { get; set; }
|
||||||
|
|
||||||
private string UpdateMeetingsListXSig(List<Meeting> meetings)
|
private string UpdateMeetingsListXSig(List<Meeting> meetings)
|
||||||
{
|
{
|
||||||
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
|
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
|
||||||
//const int _meetingsToDisplay = 3;
|
//const int _meetingsToDisplay = 3;
|
||||||
const int maxDigitals = 2;
|
const int maxDigitals = 2;
|
||||||
const int maxStrings = 7;
|
const int maxStrings = 7;
|
||||||
const int offset = maxDigitals + maxStrings;
|
const int offset = maxDigitals + maxStrings;
|
||||||
var digitalIndex = maxStrings * _meetingsToDisplay; //15
|
var digitalIndex = maxStrings * _meetingsToDisplay; //15
|
||||||
var stringIndex = 0;
|
var stringIndex = 0;
|
||||||
var meetingIndex = 0;
|
var meetingIndex = 0;
|
||||||
|
|
||||||
var tokenArray = new XSigToken[_meetingsToDisplay * offset];
|
var tokenArray = new XSigToken[_meetingsToDisplay * offset];
|
||||||
/*
|
/*
|
||||||
* Digitals
|
* Digitals
|
||||||
* IsJoinable - 1
|
* IsJoinable - 1
|
||||||
* IsDialable - 2
|
* IsDialable - 2
|
||||||
*
|
*
|
||||||
* Serials
|
* Serials
|
||||||
* Organizer - 1
|
* Organizer - 1
|
||||||
* Title - 2
|
* Title - 2
|
||||||
* Start Date - 3
|
* Start Date - 3
|
||||||
* Start Time - 4
|
* Start Time - 4
|
||||||
* End Date - 5
|
* End Date - 5
|
||||||
* End Time - 6
|
* End Time - 6
|
||||||
* Id - 7
|
* Id - 7
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var meeting in meetings)
|
||||||
|
{
|
||||||
|
var currentTime = DateTime.Now;
|
||||||
|
|
||||||
|
if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
|
||||||
|
|
||||||
|
if (meetingIndex >= _meetingsToDisplay * offset)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Max Meetings reached");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//digitals
|
||||||
|
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, meeting.Joinable);
|
||||||
|
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, meeting.Id != "0");
|
||||||
|
|
||||||
|
//serials
|
||||||
|
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
||||||
|
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
||||||
|
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString(_dateFormatSpecifier.NullIfEmpty() ?? "d", Global.Culture));
|
||||||
|
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString(_timeFormatSpecifier.NullIfEmpty() ?? "t", Global.Culture));
|
||||||
|
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString(_dateFormatSpecifier.NullIfEmpty() ?? "d", Global.Culture));
|
||||||
|
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString(_timeFormatSpecifier.NullIfEmpty() ?? "t", Global.Culture));
|
||||||
|
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
||||||
|
|
||||||
|
|
||||||
foreach (var meeting in meetings)
|
digitalIndex += maxDigitals;
|
||||||
{
|
meetingIndex += offset;
|
||||||
var currentTime = DateTime.Now;
|
stringIndex += maxStrings;
|
||||||
|
}
|
||||||
|
|
||||||
if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
|
while (meetingIndex < _meetingsToDisplay * offset)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
|
||||||
|
meetingIndex, _meetingsToDisplay * offset);
|
||||||
|
|
||||||
if (meetingIndex >= _meetingsToDisplay * offset)
|
//digitals
|
||||||
{
|
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
||||||
Debug.Console(2, this, "Max Meetings reached");
|
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//digitals
|
//serials
|
||||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, meeting.Joinable);
|
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
|
||||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, meeting.Id != "0");
|
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, String.Empty);
|
||||||
|
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, String.Empty);
|
||||||
|
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, String.Empty);
|
||||||
|
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, String.Empty);
|
||||||
|
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, String.Empty);
|
||||||
|
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, String.Empty);
|
||||||
|
|
||||||
//serials
|
digitalIndex += maxDigitals;
|
||||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
meetingIndex += offset;
|
||||||
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
stringIndex += maxStrings;
|
||||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString("t", Global.Culture));
|
}
|
||||||
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString("t", Global.Culture));
|
|
||||||
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString("t", Global.Culture));
|
|
||||||
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString("t", Global.Culture));
|
|
||||||
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
|
||||||
|
|
||||||
|
return GetXSigString(tokenArray);
|
||||||
|
}
|
||||||
|
|
||||||
digitalIndex += maxDigitals;
|
protected void DirectoryClearSelectionBase()
|
||||||
meetingIndex += offset;
|
{
|
||||||
stringIndex += maxStrings;
|
SelectDirectoryEntry(_directoryCodec, 0, _directoryTrilist, _directoryJoinmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (meetingIndex < _meetingsToDisplay * offset)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
|
|
||||||
meetingIndex, _meetingsToDisplay * offset);
|
|
||||||
|
|
||||||
//digitals
|
|
||||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
|
||||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
|
|
||||||
|
|
||||||
//serials
|
|
||||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, String.Empty);
|
|
||||||
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, String.Empty);
|
|
||||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, String.Empty);
|
|
||||||
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, String.Empty);
|
|
||||||
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, String.Empty);
|
|
||||||
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, String.Empty);
|
|
||||||
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, String.Empty);
|
|
||||||
|
|
||||||
digitalIndex += maxDigitals;
|
|
||||||
meetingIndex += offset;
|
|
||||||
stringIndex += maxStrings;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GetXSigString(tokenArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
@@ -998,7 +1009,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.DirectorySelectRow.JoinNumber, (i) => SelectDirectoryEntry(codec, i, trilist, joinMap));
|
trilist.SetUShortSigAction(joinMap.DirectorySelectRow.JoinNumber, (i) => SelectDirectoryEntry(codec, i, trilist, joinMap));
|
||||||
|
|
||||||
// Report feedback for number of contact methods for selected contact
|
//Special Change for protected directory clear
|
||||||
|
_directoryCodec = codec as IHasDirectoryClearSelection;
|
||||||
|
|
||||||
|
if (_directoryCodec != null)
|
||||||
|
{
|
||||||
|
_directoryTrilist = trilist;
|
||||||
|
_directoryJoinmap = joinMap;
|
||||||
|
trilist.SetBoolSigAction(joinMap.DirectoryClearSelection.JoinNumber, (b) => DirectoryClearSelectionBase());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Report feedback for number of contact methods for selected contact
|
||||||
|
|
||||||
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
|
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
|
||||||
|
|
||||||
@@ -1012,7 +1034,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot,
|
||||||
|
codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||||
|
|
||||||
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
||||||
|
|
||||||
@@ -1027,32 +1050,32 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
var directoryXSig = UpdateDirectoryXSig(args.Directory, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
var directoryXSig = UpdateDirectoryXSig(args.Directory,
|
||||||
|
codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||||
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
Debug.Console(2, this, "Directory XSig Length: {0}", directoryXSig.Length);
|
||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
||||||
};
|
};
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (device, args) =>
|
trilist.OnlineStatusChange += (device, args) =>
|
||||||
{
|
{
|
||||||
if (!args.DeviceOnLine) return;
|
if (!args.DeviceOnLine) return;
|
||||||
|
|
||||||
var clearBytes = XSigHelpers.ClearOutputs();
|
var clearBytes = XSigHelpers.ClearOutputs();
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||||
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void SelectDirectoryEntry(IHasDirectory codec, ushort i, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void SelectDirectoryEntry(IHasDirectory codec, ushort i, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
if (i < 1 || i > codec.CurrentDirectoryResult.CurrentDirectoryResults.Count) return;
|
if (i > codec.CurrentDirectoryResult.CurrentDirectoryResults.Count) return;
|
||||||
|
_selectedDirectoryItem = i == 0 ? null : codec.CurrentDirectoryResult.CurrentDirectoryResults[i - 1];
|
||||||
|
trilist.SetUshort(joinMap.DirectorySelectRowFeedback.JoinNumber, i);
|
||||||
|
|
||||||
_selectedDirectoryItem = codec.CurrentDirectoryResult.CurrentDirectoryResults[i - 1];
|
if (_selectedDirectoryItem == null) trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
|
||||||
|
|
||||||
|
|
||||||
if (_selectedDirectoryItem is DirectoryFolder)
|
if (_selectedDirectoryItem is DirectoryFolder)
|
||||||
@@ -1064,6 +1087,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
|
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
|
||||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
|
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
|
||||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
|
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
|
||||||
|
trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1071,13 +1095,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
|
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
|
||||||
|
|
||||||
var selectedContact = _selectedDirectoryItem as DirectoryContact;
|
var selectedContact = _selectedDirectoryItem as DirectoryContact;
|
||||||
if (selectedContact != null)
|
|
||||||
{
|
|
||||||
trilist.SetString(joinMap.DirectoryEntrySelectedName.JoinNumber, selectedContact.Name);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allow auto dial of selected line. Always dials first contact method
|
if (selectedContact != null && selectedContact.ContactMethods.Count >= 1)
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
trilist.SetString(joinMap.DirectoryEntrySelectedName.JoinNumber,
|
||||||
|
selectedContact != null ? selectedContact.Name : string.Empty);
|
||||||
|
|
||||||
|
// Allow auto dial of selected line. Always dials first contact method
|
||||||
if (!trilist.GetBool(joinMap.DirectoryDisableAutoDialSelectedLine.JoinNumber))
|
if (!trilist.GetBool(joinMap.DirectoryDisableAutoDialSelectedLine.JoinNumber))
|
||||||
{
|
{
|
||||||
var invitableEntry = _selectedDirectoryItem as IInvitableContact;
|
var invitableEntry = _selectedDirectoryItem as IInvitableContact;
|
||||||
@@ -1090,12 +1117,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
var entryToDial = _selectedDirectoryItem as DirectoryContact;
|
var entryToDial = _selectedDirectoryItem as DirectoryContact;
|
||||||
|
|
||||||
trilist.SetString(joinMap.DirectoryEntrySelectedNumber.JoinNumber, selectedContact.ContactMethods[0].Number);
|
trilist.SetString(joinMap.DirectoryEntrySelectedNumber.JoinNumber,
|
||||||
|
selectedContact != null ? selectedContact.ContactMethods[0].Number : string.Empty);
|
||||||
|
|
||||||
if (entryToDial == null) return;
|
if (entryToDial == null) return;
|
||||||
|
|
||||||
Dial(entryToDial.ContactMethods[0].Number);
|
Dial(entryToDial.ContactMethods[0].Number);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1183,45 +1210,46 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
||||||
{
|
{
|
||||||
var xSigMaxIndex = 1023;
|
const int xSigMaxIndex = 1023;
|
||||||
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||||
? xSigMaxIndex
|
? xSigMaxIndex
|
||||||
: directory.CurrentDirectoryResults.Count];
|
: directory.CurrentDirectoryResults.Count];
|
||||||
|
|
||||||
Debug.Console(2, this, "IsRoot: {0}, Directory Count: {1}, TokenArray.Length: {2}", isRoot, directory.CurrentDirectoryResults.Count, tokenArray.Length);
|
Debug.Console(2, this, "IsRoot: {0}, Directory Count: {1}, TokenArray.Length: {2}", isRoot, directory.CurrentDirectoryResults.Count, tokenArray.Length);
|
||||||
|
|
||||||
var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||||
? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
|
? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
|
||||||
: directory.CurrentDirectoryResults;
|
: directory.CurrentDirectoryResults;
|
||||||
|
|
||||||
var contactsToDisplay = isRoot
|
|
||||||
? contacts.Where(c => c.ParentFolderId == "root")
|
|
||||||
: contacts.Where(c => c.ParentFolderId != "root");
|
|
||||||
|
|
||||||
var counterIndex = 1;
|
var contactsToDisplay = isRoot
|
||||||
foreach (var entry in contactsToDisplay)
|
? contacts.Where(c => c.ParentFolderId == "root")
|
||||||
{
|
: contacts.Where(c => c.ParentFolderId != "root");
|
||||||
var arrayIndex = counterIndex - 1;
|
|
||||||
var entryIndex = counterIndex;
|
|
||||||
|
|
||||||
Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}, Type: {3}, ParentFolderId: {4}",
|
var counterIndex = 1;
|
||||||
entry.Name, entry.FolderId, entryIndex, entry.GetType().GetCType().FullName, entry.ParentFolderId);
|
foreach (var entry in contactsToDisplay)
|
||||||
|
{
|
||||||
|
var arrayIndex = counterIndex - 1;
|
||||||
|
var entryIndex = counterIndex;
|
||||||
|
|
||||||
if (entry is DirectoryFolder)
|
Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}, Type: {3}, ParentFolderId: {4}",
|
||||||
{
|
entry.Name, entry.FolderId, entryIndex, entry.GetType().GetCType().FullName, entry.ParentFolderId);
|
||||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
|
|
||||||
|
|
||||||
counterIndex++;
|
if (entry is DirectoryFolder)
|
||||||
|
{
|
||||||
|
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
|
||||||
|
|
||||||
continue;
|
counterIndex++;
|
||||||
}
|
|
||||||
|
|
||||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
|
||||||
|
|
||||||
|
counterIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetXSigString(tokenArray);
|
||||||
|
|
||||||
counterIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return GetXSigString(tokenArray);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
@@ -1489,14 +1517,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
codec.LocalLayoutFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentLayoutStringFb.JoinNumber]);
|
codec.LocalLayoutFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentLayoutStringFb.JoinNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LinkVideoCodecAvailableLayoutsToApi(IHasCodecLayoutsAvailable codec, BasicTriList trilist,
|
|
||||||
VideoCodecControllerJoinMap joinMap)
|
|
||||||
{
|
|
||||||
codec.AvailableLocalLayoutsFeedback.LinkInputSig(trilist.StringInput[joinMap.AvailableLayoutsFb.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetStringSigAction(joinMap.SelectLayout.JoinNumber, codec.LocalLayoutSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LinkVideoCodecCameraModeToApi(IHasCameraAutoMode codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
private void LinkVideoCodecCameraModeToApi(IHasCameraAutoMode codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
trilist.SetSigFalseAction(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeOn);
|
trilist.SetSigFalseAction(joinMap.CameraModeAuto.JoinNumber, codec.CameraAutoModeOn);
|
||||||
@@ -2023,4 +2043,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user