mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-09 09:45:06 +00:00
Merge branch 'development' into hotfix/add-zoomroom-share-info
This commit is contained in:
@@ -49,6 +49,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
Stack<CodecDirectory> DirectoryBrowseHistoryStack { get; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
||||
@@ -211,7 +211,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
get
|
||||
{
|
||||
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);
|
||||
return joinable;
|
||||
}
|
||||
@@ -231,11 +231,23 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
[JsonIgnore]
|
||||
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
||||
|
||||
[JsonIgnore] private readonly int _joinableCooldownSeconds;
|
||||
|
||||
|
||||
public Meeting()
|
||||
{
|
||||
Calls = new List<Call>();
|
||||
_joinableCooldownSeconds = 300;
|
||||
}
|
||||
|
||||
public Meeting(int joinableCooldownSeconds)
|
||||
{
|
||||
Calls = new List<Call>();
|
||||
_joinableCooldownSeconds = joinableCooldownSeconds;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Overrides of Object
|
||||
|
||||
public override string ToString()
|
||||
|
||||
@@ -308,7 +308,7 @@ namespace PepperDash.Essentials.Devices.Displays
|
||||
//Send((string)selector);
|
||||
}
|
||||
|
||||
void SetVolume(ushort level)
|
||||
public void SetVolume(ushort level)
|
||||
{
|
||||
var levelString = string.Format("{0}{1:X4}\x03", VolumeLevelPartialCmd, level);
|
||||
AppendChecksumAndSend(levelString);
|
||||
@@ -333,10 +333,13 @@ namespace PepperDash.Essentials.Devices.Displays
|
||||
Send(MuteOnCmd);
|
||||
}
|
||||
|
||||
void IBasicVolumeWithFeedback.SetVolume(ushort level)
|
||||
|
||||
/*
|
||||
public void IBasicVolumeWithFeedback.SetVolume(ushort level)
|
||||
{
|
||||
SetVolume(level);
|
||||
}
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ namespace PepperDash.Essentials.Devices.Displays
|
||||
//Send((string)selector);
|
||||
}
|
||||
|
||||
void SetVolume(ushort level)
|
||||
public void SetVolume(ushort level)
|
||||
{
|
||||
var levelString = string.Format("{0}{1:X3}\x03", VolumeLevelPartialCmd, level);
|
||||
|
||||
@@ -315,11 +315,12 @@ namespace PepperDash.Essentials.Devices.Displays
|
||||
Send(MuteOnCmd);
|
||||
}
|
||||
|
||||
/*
|
||||
void IBasicVolumeWithFeedback.SetVolume(ushort level)
|
||||
{
|
||||
SetVolume(level);
|
||||
}
|
||||
|
||||
*/
|
||||
#endregion
|
||||
|
||||
#region IBasicVolumeControls Members
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
<Compile Include="Codec\eCodecCallStatus.cs" />
|
||||
<Compile Include="Codec\eMeetingPrivacy.cs" />
|
||||
<Compile Include="Codec\iCodecAudio.cs" />
|
||||
<Compile Include="VideoCodec\ConvertiblePreset.cs" />
|
||||
<Compile Include="Codec\IHasCallHold.cs" />
|
||||
<Compile Include="Codec\IHasDoNotDisturb.cs" />
|
||||
<Compile Include="Codec\IHasExternalSourceSwitching.cs" />
|
||||
|
||||
@@ -377,5 +377,70 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
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,7 +24,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
{
|
||||
enum eCommandType { SessionStart, SessionEnd, Command, GetStatus, GetConfiguration };
|
||||
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,
|
||||
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
|
||||
@@ -1023,18 +1023,21 @@ ConnectorID: {2}"
|
||||
if (tempPresets.Count > 0)
|
||||
{
|
||||
// Create temporary list to store the existing items from the CiscoCodecStatus.RoomPreset collection
|
||||
List<CiscoCodecStatus.RoomPreset> existingRoomPresets = new List<CiscoCodecStatus.RoomPreset>();
|
||||
var existingRoomPresets = new List<CiscoCodecStatus.RoomPreset>();
|
||||
// Add the existing items to the temporary list
|
||||
existingRoomPresets.AddRange(CodecStatus.Status.RoomPreset);
|
||||
// Populate the CodecStatus object (this will append new values to the RoomPreset collection
|
||||
JsonConvert.PopulateObject(response, CodecStatus);
|
||||
|
||||
JObject jResponse = JObject.Parse(response);
|
||||
var jResponse = JObject.Parse(response);
|
||||
|
||||
|
||||
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.
|
||||
foreach (var preset in tempPresets)
|
||||
foreach (var camPreset in tempPresets)
|
||||
{
|
||||
var preset = camPreset as CiscoCodecStatus.RoomPreset;
|
||||
if (preset == null) continue;
|
||||
// First fine the existing preset that matches the id
|
||||
var existingPreset = existingRoomPresets.FirstOrDefault(p => p.id.Equals(preset.id));
|
||||
if (existingPreset != null)
|
||||
@@ -1068,7 +1071,7 @@ ConnectorID: {2}"
|
||||
CodecStatus.Status.RoomPreset = existingRoomPresets;
|
||||
|
||||
// Generecise the list
|
||||
NearEndPresets = RoomPresets.GetGenericPresets(CodecStatus.Status.RoomPreset);
|
||||
NearEndPresets = existingRoomPresets.GetGenericPresets<CiscoCodecStatus.RoomPreset, CodecRoomPreset>();
|
||||
|
||||
var handler = CodecRoomPresetsListHasChanged;
|
||||
if (handler != null)
|
||||
@@ -2465,20 +2468,6 @@ ConnectorID: {2}"
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Represents a codec command that might need to have a friendly label applied for UI feedback purposes
|
||||
/// </summary>
|
||||
public class CodecCommandWithLabel
|
||||
{
|
||||
public string Command { get; set; }
|
||||
public string Label { get; set; }
|
||||
|
||||
public CodecCommandWithLabel(string command, string label)
|
||||
{
|
||||
Command = command;
|
||||
Label = label;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tracks the initial sycnronization state of the codec when making a connection
|
||||
|
||||
@@ -1,14 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core.Presets;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
@@ -33,39 +28,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
public static class RoomPresets
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts Cisco RoomPresets to generic CameraPresets
|
||||
/// Converts non-generic RoomPresets to generic CameraPresets
|
||||
/// </summary>
|
||||
/// <param name="presets"></param>
|
||||
/// <returns></returns>
|
||||
public static List<CodecRoomPreset> GetGenericPresets(List<CiscoCodecStatus.RoomPreset> presets)
|
||||
public static List<TDestination> GetGenericPresets<TSource, TDestination>(this List<TSource> presets) where TSource : ConvertiblePreset where TDestination : PresetBase
|
||||
{
|
||||
var cameraPresets = new List<CodecRoomPreset>();
|
||||
|
||||
if (Debug.Level > 0)
|
||||
{
|
||||
Debug.Console(1, "Presets List:");
|
||||
}
|
||||
|
||||
foreach (CiscoCodecStatus.RoomPreset preset in presets)
|
||||
{
|
||||
try
|
||||
{
|
||||
var cameraPreset = new CodecRoomPreset(UInt16.Parse(preset.id), preset.Description.Value, preset.Defined.BoolValue, true);
|
||||
|
||||
cameraPresets.Add(cameraPreset);
|
||||
|
||||
if (Debug.Level > 0)
|
||||
{
|
||||
Debug.Console(1, "Added Preset ID: {0}, Description: {1}, IsDefined: {2}, isDefinable: {3}", cameraPreset.ID, cameraPreset.Description, cameraPreset.Defined, cameraPreset.IsDefinable);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(2, "Unable to convert preset: {0}. Error: {1}", preset.id, e);
|
||||
}
|
||||
}
|
||||
|
||||
return cameraPresets;
|
||||
return
|
||||
presets.Select(preset => preset.ConvertCodecPreset())
|
||||
.Where(newPreset => newPreset != null)
|
||||
.Cast<TDestination>()
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ using Newtonsoft.Json.Linq;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.CiscoCodec;
|
||||
using PepperDash.Essentials.Core.Presets;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
{
|
||||
@@ -2185,7 +2186,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
}
|
||||
}
|
||||
|
||||
public class RoomPreset
|
||||
public class RoomPreset : ConvertiblePreset
|
||||
{
|
||||
public string id { get; set; }
|
||||
public Defined Defined { get; set; }
|
||||
@@ -2198,7 +2199,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
||||
Description = new Description2();
|
||||
Type = new Type5();
|
||||
}
|
||||
}
|
||||
|
||||
public override PresetBase ConvertCodecPreset()
|
||||
{
|
||||
try
|
||||
{
|
||||
var preset = new CodecRoomPreset(UInt16.Parse(id), Description.Value, Defined.BoolValue, true);
|
||||
|
||||
Debug.Console(2, "Preset ID {0} Converted from Cisco Codec Preset to Essentials Preset");
|
||||
|
||||
return preset;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(2, "Unable to convert preset: {0}. Error: {1}", id, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
using PepperDash.Essentials.Core.Presets;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
public abstract class ConvertiblePreset
|
||||
{
|
||||
public abstract PresetBase ConvertCodecPreset();
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
void MinMaxLayoutToggle();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Defines the requirements for Zoom Room layout control
|
||||
/// </summary>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
|
||||
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Cisco;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
|
||||
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||
{
|
||||
|
||||
@@ -11,6 +11,7 @@ using PepperDash.Core;
|
||||
using PepperDash.Core.Intersystem;
|
||||
using PepperDash.Core.Intersystem.Tokens;
|
||||
using PepperDash.Core.WebApi.Presets;
|
||||
using Crestron.SimplSharp.Reflection;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.Bridges;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
@@ -31,6 +32,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
private const int XSigEncoding = 28591;
|
||||
protected const int MaxParticipants = 50;
|
||||
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)
|
||||
: base(config)
|
||||
{
|
||||
@@ -373,6 +383,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
LinkVideoCodecCameraLayoutsToApi(codec as IHasCodecLayouts, trilist, joinMap);
|
||||
}
|
||||
|
||||
|
||||
if (codec is IHasSelfviewPosition)
|
||||
{
|
||||
LinkVideoCodecSelfviewPositionToApi(codec as IHasSelfviewPosition, trilist, joinMap);
|
||||
@@ -460,10 +471,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
}
|
||||
|
||||
SharingContentIsOnFeedback.FireUpdate();
|
||||
|
||||
trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
|
||||
|
||||
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
|
||||
};
|
||||
}
|
||||
|
||||
@@ -693,37 +700,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
if (meetingIndex >= maxParticipants * offset) break;
|
||||
|
||||
// Debug.Console(2, this,
|
||||
//@"Updating Participant on xsig:
|
||||
//Name: {0} (s{9})
|
||||
//AudioMute: {1} (d{10})
|
||||
//VideoMute: {2} (d{11})
|
||||
//CanMuteVideo: {3} (d{12})
|
||||
//CanUMuteVideo: {4} (d{13})
|
||||
//IsHost: {5} (d{14})
|
||||
//HandIsRaised: {6} (d{15})
|
||||
//IsPinned: {7} (d{16})
|
||||
//ScreenIndexIsPinnedTo: {8} (a{17})
|
||||
//",
|
||||
// participant.Name,
|
||||
// participant.AudioMuteFb,
|
||||
// participant.VideoMuteFb,
|
||||
// participant.CanMuteVideo,
|
||||
// participant.CanUnmuteVideo,
|
||||
// participant.IsHost,
|
||||
// participant.HandIsRaisedFb,
|
||||
// participant.IsPinnedFb,
|
||||
// participant.ScreenIndexIsPinnedToFb,
|
||||
// stringIndex + 1,
|
||||
// digitalIndex + 1,
|
||||
// digitalIndex + 2,
|
||||
// digitalIndex + 3,
|
||||
// digitalIndex + 4,
|
||||
// digitalIndex + 5,
|
||||
// digitalIndex + 6,
|
||||
// digitalIndex + 7,
|
||||
// analogIndex + 1
|
||||
// );
|
||||
// Debug.Console(2, this,
|
||||
//@"Updating Participant on xsig:
|
||||
//Name: {0} (s{9})
|
||||
//AudioMute: {1} (d{10})
|
||||
//VideoMute: {2} (d{11})
|
||||
//CanMuteVideo: {3} (d{12})
|
||||
//CanUMuteVideo: {4} (d{13})
|
||||
//IsHost: {5} (d{14})
|
||||
//HandIsRaised: {6} (d{15})
|
||||
//IsPinned: {7} (d{16})
|
||||
//ScreenIndexIsPinnedTo: {8} (a{17})
|
||||
//",
|
||||
// participant.Name,
|
||||
// participant.AudioMuteFb,
|
||||
// participant.VideoMuteFb,
|
||||
// participant.CanMuteVideo,
|
||||
// participant.CanUnmuteVideo,
|
||||
// participant.IsHost,
|
||||
// participant.HandIsRaisedFb,
|
||||
// participant.IsPinnedFb,
|
||||
// participant.ScreenIndexIsPinnedToFb,
|
||||
// stringIndex + 1,
|
||||
// digitalIndex + 1,
|
||||
// digitalIndex + 2,
|
||||
// digitalIndex + 3,
|
||||
// digitalIndex + 4,
|
||||
// digitalIndex + 5,
|
||||
// digitalIndex + 6,
|
||||
// digitalIndex + 7,
|
||||
// analogIndex + 1
|
||||
// );
|
||||
|
||||
|
||||
//digitals
|
||||
@@ -790,10 +797,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
trilist.SetSigFalseAction(joinMap.SourceShareStart.JoinNumber, StartSharing);
|
||||
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)
|
||||
{
|
||||
@@ -801,7 +808,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
trilist.SetUShortSigAction(joinMap.MinutesBeforeMeetingStart.JoinNumber, (i) =>
|
||||
{
|
||||
codec.CodecSchedule.MeetingWarningMinutes = i;
|
||||
codec.CodecSchedule.MeetingWarningMinutes = i;
|
||||
});
|
||||
|
||||
|
||||
@@ -891,90 +898,90 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
// TODO [ ] hotfix/videocodecbase-max-meeting-xsig-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
|
||||
//const int _meetingsToDisplay = 3;
|
||||
const int maxDigitals = 2;
|
||||
const int maxStrings = 7;
|
||||
const int offset = maxDigitals + maxStrings;
|
||||
var digitalIndex = maxStrings * _meetingsToDisplay; //15
|
||||
var stringIndex = 0;
|
||||
var meetingIndex = 0;
|
||||
const int maxDigitals = 2;
|
||||
const int maxStrings = 7;
|
||||
const int offset = maxDigitals + maxStrings;
|
||||
var digitalIndex = maxStrings * _meetingsToDisplay; //15
|
||||
var stringIndex = 0;
|
||||
var meetingIndex = 0;
|
||||
|
||||
var tokenArray = new XSigToken[_meetingsToDisplay * offset];
|
||||
/*
|
||||
* Digitals
|
||||
* IsJoinable - 1
|
||||
* IsDialable - 2
|
||||
*
|
||||
* Serials
|
||||
* Organizer - 1
|
||||
* Title - 2
|
||||
* Start Date - 3
|
||||
* Start Time - 4
|
||||
* End Date - 5
|
||||
* End Time - 6
|
||||
* Id - 7
|
||||
*/
|
||||
var tokenArray = new XSigToken[_meetingsToDisplay * offset];
|
||||
/*
|
||||
* Digitals
|
||||
* IsJoinable - 1
|
||||
* IsDialable - 2
|
||||
*
|
||||
* Serials
|
||||
* Organizer - 1
|
||||
* Title - 2
|
||||
* Start Date - 3
|
||||
* Start Time - 4
|
||||
* End Date - 5
|
||||
* End Time - 6
|
||||
* Id - 7
|
||||
*/
|
||||
|
||||
|
||||
foreach (var meeting in meetings)
|
||||
{
|
||||
var currentTime = DateTime.Now;
|
||||
|
||||
foreach (var meeting in meetings)
|
||||
{
|
||||
var currentTime = DateTime.Now;
|
||||
if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
|
||||
|
||||
if (meeting.StartTime < currentTime && meeting.EndTime < currentTime) continue;
|
||||
if (meetingIndex >= _meetingsToDisplay * offset)
|
||||
{
|
||||
Debug.Console(2, this, "Max Meetings reached");
|
||||
break;
|
||||
}
|
||||
|
||||
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");
|
||||
|
||||
//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);
|
||||
|
||||
//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("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);
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
}
|
||||
|
||||
while (meetingIndex < _meetingsToDisplay * offset)
|
||||
{
|
||||
Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
|
||||
meetingIndex, _meetingsToDisplay * offset);
|
||||
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
}
|
||||
//digitals
|
||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
|
||||
|
||||
while (meetingIndex < _meetingsToDisplay * offset)
|
||||
{
|
||||
Debug.Console(2, this, "Clearing unused data. Meeting Index: {0} MaxMeetings * Offset: {1}",
|
||||
meetingIndex, _meetingsToDisplay * offset);
|
||||
//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);
|
||||
|
||||
//digitals
|
||||
tokenArray[digitalIndex] = new XSigDigitalToken(digitalIndex + 1, false);
|
||||
tokenArray[digitalIndex + 1] = new XSigDigitalToken(digitalIndex + 2, false);
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
}
|
||||
|
||||
//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);
|
||||
return GetXSigString(tokenArray);
|
||||
}
|
||||
|
||||
digitalIndex += maxDigitals;
|
||||
meetingIndex += offset;
|
||||
stringIndex += maxStrings;
|
||||
}
|
||||
|
||||
return GetXSigString(tokenArray);
|
||||
}
|
||||
|
||||
private void LinkVideoCodecDirectoryToApi(IHasDirectory codec, BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||
{
|
||||
@@ -985,7 +992,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
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
|
||||
|
||||
trilist.SetBoolSigAction(joinMap.DirectoryClearSelected.JoinNumber, (b) => SelectDirectoryEntry(_directoryCodec, 0, _directoryTrilist, _directoryJoinmap));
|
||||
|
||||
// Report feedback for number of contact methods for selected contact
|
||||
|
||||
trilist.SetSigFalseAction(joinMap.DirectoryRoot.JoinNumber, codec.SetCurrentDirectoryToRoot);
|
||||
|
||||
@@ -999,7 +1010,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||
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);
|
||||
|
||||
@@ -1014,30 +1026,32 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||
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);
|
||||
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
||||
};
|
||||
|
||||
|
||||
trilist.OnlineStatusChange += (device, args) =>
|
||||
{
|
||||
if (!args.DeviceOnLine) return;
|
||||
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, "\xFC");
|
||||
UpdateDirectoryXSig(codec.CurrentDirectoryResult,
|
||||
codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||
var clearBytes = XSigHelpers.ClearOutputs();
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber,
|
||||
Encoding.GetEncoding(XSigEncoding).GetString(clearBytes, 0, clearBytes.Length));
|
||||
var directoryXSig = UpdateDirectoryXSig(codec.DirectoryRoot, codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue == false);
|
||||
trilist.SetString(joinMap.DirectoryEntries.JoinNumber, directoryXSig);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
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)
|
||||
@@ -1049,6 +1063,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
trilist.ClearUShortSigAction(joinMap.SelectContactMethod.JoinNumber);
|
||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedLine.JoinNumber);
|
||||
trilist.ClearBoolSigAction(joinMap.DirectoryDialSelectedContactMethod.JoinNumber);
|
||||
trilist.SetBool(joinMap.DirectoryEntryIsContact.JoinNumber, false);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1056,13 +1071,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
trilist.SetString(joinMap.DirectorySelectedFolderName.JoinNumber, string.Empty);
|
||||
|
||||
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))
|
||||
{
|
||||
var invitableEntry = _selectedDirectoryItem as IInvitableContact;
|
||||
@@ -1075,12 +1093,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
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;
|
||||
|
||||
Dial(entryToDial.ContactMethods[0].Number);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1166,50 +1184,49 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
return GetXSigString(tokenArray);
|
||||
}
|
||||
|
||||
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
||||
{
|
||||
var xSigMaxIndex = 1023;
|
||||
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||
? xSigMaxIndex
|
||||
: directory.CurrentDirectoryResults.Count];
|
||||
private string UpdateDirectoryXSig(CodecDirectory directory, bool isRoot)
|
||||
{
|
||||
var xSigMaxIndex = 1023;
|
||||
var tokenArray = new XSigToken[directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||
? xSigMaxIndex
|
||||
: 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
|
||||
? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
|
||||
: directory.CurrentDirectoryResults;
|
||||
|
||||
var contactsToDisplay = isRoot
|
||||
? contacts.Where(c => c.ParentFolderId == "root")
|
||||
: contacts.Where(c => c.ParentFolderId != "root");
|
||||
var contacts = directory.CurrentDirectoryResults.Count > xSigMaxIndex
|
||||
? directory.CurrentDirectoryResults.Take(xSigMaxIndex)
|
||||
: directory.CurrentDirectoryResults;
|
||||
|
||||
var counterIndex = 1;
|
||||
foreach (var entry in contactsToDisplay)
|
||||
{
|
||||
var arrayIndex = counterIndex - 1;
|
||||
var entryIndex = counterIndex;
|
||||
var counterIndex = 1;
|
||||
foreach (var entry in contacts)
|
||||
{
|
||||
var arrayIndex = counterIndex - 1;
|
||||
var entryIndex = counterIndex;
|
||||
|
||||
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);
|
||||
Debug.Console(2, this, "Entry{2:0000} Name: {0}, Folder ID: {1}", entry.Name, entry.FolderId, entryIndex);
|
||||
|
||||
if (entry is DirectoryFolder)
|
||||
{
|
||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
|
||||
if (entry is DirectoryFolder && entry.ParentFolderId == "root")
|
||||
{
|
||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, String.Format("[+] {0}", entry.Name));
|
||||
|
||||
counterIndex++;
|
||||
counterIndex++;
|
||||
counterIndex++;
|
||||
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
|
||||
|
||||
counterIndex++;
|
||||
}
|
||||
|
||||
return GetXSigString(tokenArray);
|
||||
|
||||
tokenArray[arrayIndex] = new XSigSerialToken(entryIndex, entry.Name);
|
||||
|
||||
counterIndex++;
|
||||
}
|
||||
|
||||
return GetXSigString(tokenArray);
|
||||
}
|
||||
|
||||
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||
private void LinkVideoCodecCallControlsToApi(BasicTriList trilist, VideoCodecControllerJoinMap joinMap)
|
||||
{
|
||||
trilist.SetSigFalseAction(joinMap.ManualDial.JoinNumber,
|
||||
() => Dial(trilist.StringOutput[joinMap.CurrentDialString.JoinNumber].StringValue));
|
||||
@@ -1347,9 +1364,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
if (!args.DeviceOnLine) return;
|
||||
|
||||
// TODO [ ] Issue #868
|
||||
// TODO [ ] #983
|
||||
Debug.Console(0, this, "LinkVideoCodecCallControlsToApi: device is {0}, IsInCall {1}", args.DeviceOnLine ? "online" : "offline", IsInCall);
|
||||
trilist.SetBool(joinMap.HookState.JoinNumber, IsInCall);
|
||||
trilist.SetString(joinMap.CurrentCallData.JoinNumber, "\xFC");
|
||||
UpdateCallStatusXSig();
|
||||
trilist.SetString(joinMap.CurrentCallData.JoinNumber, UpdateCallStatusXSig());
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1983,4 +2002,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Represents a codec command that might need to have a friendly label applied for UI feedback purposes
|
||||
/// </summary>
|
||||
public class CodecCommandWithLabel
|
||||
{
|
||||
public string Command { get; private set; }
|
||||
public string Label { get; private set; }
|
||||
|
||||
public CodecCommandWithLabel(string command, string label)
|
||||
{
|
||||
Command = command;
|
||||
Label = label;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user