docs: XML comments for Devices.Common

This commit is contained in:
Andrew Welker
2025-10-09 13:18:36 -05:00
parent a5d409e93a
commit f9d9df9d5c
115 changed files with 5772 additions and 4292 deletions

View File

@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{

View File

@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using PepperDash.Core;
using PepperDash.Essentials.Core.Presets;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
@@ -38,19 +36,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
/// <param name="preset"></param>
/// <param name="description"></param>
void CodecRoomPresetStore(int preset, string description);
void CodecRoomPresetStore(int preset, string description);
/// <summary>
/// Selects a far end preset by its ID. This is typically used to recall a preset that has been defined on the far end codec.
/// </summary>
/// <param name="preset"></param>
void SelectFarEndPreset(int preset);
void SelectFarEndPreset(int preset);
}
/// <summary>
/// Static class for converting non-generic RoomPresets to generic CameraPresets.
/// </summary>
public static class RoomPresets
public static class RoomPresets
{
/// <summary>
/// Converts non-generic RoomPresets to generic CameraPresets

View File

@@ -3,5 +3,23 @@
/// <summary>
/// Enumeration of eExternalSourceMode values
/// </summary>
public enum eExternalSourceMode {Ready, NotReady, Hidden, Error}
public enum eExternalSourceMode
{
/// <summary>
/// Ready state
/// </summary>
Ready,
/// <summary>
/// Not ready state
/// </summary>
NotReady,
/// <summary>
/// Hidden state
/// </summary>
Hidden,
/// <summary>
/// Error state
/// </summary>
Error
}
}

View File

@@ -3,5 +3,35 @@
/// <summary>
/// Enumeration of eExternalSourceType values
/// </summary>
public enum eExternalSourceType {camera, desktop, document_camera, mediaplayer, PC, whiteboard, other}
public enum eExternalSourceType
{
/// <summary>
/// Camera source type
/// </summary>
camera,
/// <summary>
/// Desktop source type
/// </summary>
desktop,
/// <summary>
/// Document camera source type
/// </summary>
document_camera,
/// <summary>
/// Media player source type
/// </summary>
mediaplayer,
/// <summary>
/// PC source type
/// </summary>
PC,
/// <summary>
/// Whiteboard source type
/// </summary>
whiteboard,
/// <summary>
/// Other source type
/// </summary>
other
}
}

View File

@@ -0,0 +1,31 @@
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
/// <summary>
/// Represents a CodecCommandWithLabel
/// </summary>
public class CodecCommandWithLabel
{
/// <summary>
/// Gets or sets the Command
/// </summary>
public string Command { get; private set; }
/// <summary>
/// Gets or sets the Label
/// </summary>
public string Label { get; private set; }
/// <summary>
/// Constructor for <see cref="CodecCommandWithLabel"/>
/// </summary>
/// <param name="command">Command string</param>
/// <param name="label">Label string</param>
public CodecCommandWithLabel(string command, string label)
{
Command = command;
Label = label;
}
}
}

View File

@@ -0,0 +1,150 @@
using System;
using PepperDash.Core;
using Serilog.Events;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
/// <summary>
/// Represents a CodecPhonebookSyncState
/// </summary>
public class CodecPhonebookSyncState : IKeyed
{
private bool _InitialSyncComplete;
/// <summary>
/// Constructor for CodecPhonebookSyncState
/// </summary>
/// <param name="key">Key for the codec phonebook sync state</param>
public CodecPhonebookSyncState(string key)
{
Key = key;
CodecDisconnected();
}
/// <summary>
/// Gets or sets the InitialSyncComplete
/// </summary>
public bool InitialSyncComplete
{
get { return _InitialSyncComplete; }
private set
{
if (value == true)
{
InitialSyncCompleted?.Invoke(this, new EventArgs());
}
_InitialSyncComplete = value;
}
}
/// <summary>
/// Gets or sets the InitialPhonebookFoldersWasReceived
/// </summary>
public bool InitialPhonebookFoldersWasReceived { get; private set; }
/// <summary>
/// Gets or sets the NumberOfContactsWasReceived
/// </summary>
public bool NumberOfContactsWasReceived { get; private set; }
/// <summary>
/// Gets or sets the PhonebookRootEntriesWasRecieved
/// </summary>
public bool PhonebookRootEntriesWasRecieved { get; private set; }
/// <summary>
/// Gets or sets the PhonebookHasFolders
/// </summary>
public bool PhonebookHasFolders { get; private set; }
/// <summary>
/// Gets or sets the NumberOfContacts
/// </summary>
public int NumberOfContacts { get; private set; }
#region IKeyed Members
/// <summary>
/// Gets or sets the Key
/// </summary>
public string Key { get; private set; }
#endregion
/// <summary>
/// Event InitialSyncCompleted
/// </summary>
public event EventHandler<EventArgs> InitialSyncCompleted;
/// <summary>
/// InitialPhonebookFoldersReceived method
/// </summary>
public void InitialPhonebookFoldersReceived()
{
InitialPhonebookFoldersWasReceived = true;
CheckSyncStatus();
}
/// <summary>
/// PhonebookRootEntriesReceived method
/// </summary>
public void PhonebookRootEntriesReceived()
{
PhonebookRootEntriesWasRecieved = true;
CheckSyncStatus();
}
/// <summary>
/// SetPhonebookHasFolders method
/// </summary>
public void SetPhonebookHasFolders(bool value)
{
PhonebookHasFolders = value;
Debug.LogMessage(LogEventLevel.Debug, this, "Phonebook has folders: {0}", PhonebookHasFolders);
}
/// <summary>
/// SetNumberOfContacts method
/// </summary>
public void SetNumberOfContacts(int contacts)
{
NumberOfContacts = contacts;
NumberOfContactsWasReceived = true;
Debug.LogMessage(LogEventLevel.Debug, this, "Phonebook contains {0} contacts.", NumberOfContacts);
CheckSyncStatus();
}
/// <summary>
/// CodecDisconnected method
/// </summary>
public void CodecDisconnected()
{
InitialPhonebookFoldersWasReceived = false;
PhonebookHasFolders = false;
NumberOfContacts = 0;
NumberOfContactsWasReceived = false;
}
private void CheckSyncStatus()
{
if (InitialPhonebookFoldersWasReceived && NumberOfContactsWasReceived && PhonebookRootEntriesWasRecieved)
{
InitialSyncComplete = true;
Debug.LogMessage(LogEventLevel.Debug, this, "Initial Phonebook Sync Complete!");
}
else
{
InitialSyncComplete = false;
}
}
}
}

View File

@@ -2,8 +2,15 @@
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
/// <summary>
/// Base class for presets that can be converted to PresetBase
/// </summary>
public abstract class ConvertiblePreset
{
/// <summary>
/// Converts the preset to a PresetBase
/// </summary>
/// <returns><see cref="PresetBase"/></returns>
public abstract PresetBase ConvertCodecPreset();
}
}

View File

@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Represents a CodecParticipants
/// </summary>
public class CodecParticipants
{
private List<Participant> _currentParticipants;
/// <summary>
/// Gets or sets the CurrentParticipants
/// </summary>
public List<Participant> CurrentParticipants
{
get { return _currentParticipants; }
set
{
_currentParticipants = value;
OnParticipantsChanged();
}
}
/// <summary>
/// Gets the Host participant
/// </summary>
public Participant Host
{
get
{
return _currentParticipants.FirstOrDefault(p => p.IsHost);
}
}
/// <summary>
/// Event fired when the participants list has changed
/// </summary>
public event EventHandler<EventArgs> ParticipantsListHasChanged;
/// <summary>
/// Initializes a new instance of the CodecParticipants class
/// </summary>
public CodecParticipants()
{
_currentParticipants = new List<Participant>();
}
/// <summary>
/// OnParticipantsChanged method
/// </summary>
public void OnParticipantsChanged()
{
var handler = ParticipantsListHasChanged;
if (handler == null) return;
handler(this, new EventArgs());
}
}
}

View File

@@ -1,14 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using Newtonsoft.Json;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
@@ -17,10 +7,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IHasCodecLayouts
{
/// <summary>
/// Feedback that indicates the current layout on the local display
/// </summary>
StringFeedback LocalLayoutFeedback { get; }
/// <summary>
/// Toggles the local layout
/// </summary>
void LocalLayoutToggle();
void LocalLayoutToggleSingleProminent();
void MinMaxLayoutToggle();
/// <summary>
/// Toggles the local layout to single prominent
/// </summary>
void LocalLayoutToggleSingleProminent();
/// <summary>
/// Toggle the MinMax layout
/// </summary>
void MinMaxLayoutToggle();
}
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
@@ -13,14 +7,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IHasCodecSelfView
{
/// <summary>
/// Feedback that indicates whether Selfview is on
/// </summary>
BoolFeedback SelfviewIsOnFeedback { get; }
/// <summary>
/// Setting that indicates whether the device shows selfview by default
/// </summary>
bool ShowSelfViewByDefault { get; }
/// <summary>
/// Turns selfview on
/// </summary>
void SelfViewModeOn();
/// <summary>
/// Turns selfview off
/// </summary>
void SelfViewModeOff();
/// <summary>
/// Toggles selfview mode
/// </summary>
void SelfViewModeToggle();
}
}

View File

@@ -1,12 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
@@ -15,94 +9,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
/// </summary>
public interface IHasMeetingInfo
{
/// <summary>
/// Raised when meeting info changes
/// </summary>
event EventHandler<MeetingInfoEventArgs> MeetingInfoChanged;
/// <summary>
/// Gets the current meeting information
/// </summary>
MeetingInfo MeetingInfo { get; }
}
/// <summary>
/// Represents a MeetingInfo
/// </summary>
public class MeetingInfo
{
[JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the Id
/// </summary>
public string Id { get; private set; }
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; private set; }
[JsonProperty("host", NullValueHandling = NullValueHandling.Ignore)]
public string Host { get; private set; }
[JsonProperty("password", NullValueHandling = NullValueHandling.Ignore)]
public string Password { get; private set; }
[JsonProperty("shareStatus", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the ShareStatus
/// </summary>
public string ShareStatus { get; private set; }
[JsonProperty("isHost", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the IsHost
/// </summary>
public Boolean IsHost { get; private set; }
[JsonProperty("isSharingMeeting", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the IsSharingMeeting
/// </summary>
public Boolean IsSharingMeeting { get; private set; }
[JsonProperty("waitingForHost", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the WaitingForHost
/// </summary>
public Boolean WaitingForHost { get; private set; }
[JsonProperty("isLocked", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the IsLocked
/// </summary>
public Boolean IsLocked { get; private set; }
[JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the IsRecording
/// </summary>
public Boolean IsRecording { get; private set; }
[JsonProperty("canRecord", NullValueHandling = NullValueHandling.Ignore)]
/// <summary>
/// Gets or sets the CanRecord
/// </summary>
public Boolean CanRecord { get; private set; }
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording, bool canRecord)
{
Id = id;
Name = name;
Host = host;
Password = password;
ShareStatus = shareStatus;
IsHost = isHost;
IsSharingMeeting = isSharingMeeting;
WaitingForHost = waitingForHost;
IsLocked = isLocked;
IsRecording = isRecording;
CanRecord = CanRecord;
}
}
/// <summary>
/// Represents a MeetingInfoEventArgs
/// </summary>
public class MeetingInfoEventArgs : EventArgs
{
/// <summary>
/// Gets or sets the Info
/// </summary>
public MeetingInfo Info { get; private set; }
public MeetingInfoEventArgs(MeetingInfo info)
{
Info = info;
}
}
}

View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
@@ -12,10 +7,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
/// </summary>
public interface IHasMeetingLock
{
/// <summary>
/// Feedback that indicates whether the meeting is locked
/// </summary>
BoolFeedback MeetingIsLockedFeedback { get; }
/// <summary>
/// Locks the meeting
/// </summary>
void LockMeeting();
/// <summary>
/// Unlocks the meeting
/// </summary>
void UnLockMeeting();
/// <summary>
/// Toggles the meeting lock state
/// </summary>
void ToggleMeetingLock();
}
}

View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
@@ -12,24 +7,24 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
/// </summary>
public interface IHasMeetingRecording
{
/// <summary>
/// Feedback that indicates whether the meeting is being recorded
/// </summary>
BoolFeedback MeetingIsRecordingFeedback { get; }
/// <summary>
/// Starts recording the meeting
/// </summary>
void StartRecording();
void StopRecording();
void ToggleRecording();
}
/// <summary>
/// Defines the contract for IHasMeetingRecordingWithPrompt
/// </summary>
public interface IHasMeetingRecordingWithPrompt : IHasMeetingRecording
{
BoolFeedback RecordConsentPromptIsVisible { get; }
/// <summary>
/// Used to agree or disagree to the meeting being recorded when prompted
/// Stops recording the meeting
/// </summary>
/// <param name="agree"></param>
void RecordingPromptAcknowledgement(bool agree);
void StopRecording();
/// <summary>
/// Toggles recording the meeting
/// </summary>
void ToggleRecording();
}
}

View File

@@ -0,0 +1,21 @@
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Defines the contract for IHasMeetingRecordingWithPrompt
/// </summary>
public interface IHasMeetingRecordingWithPrompt : IHasMeetingRecording
{
/// <summary>
/// Feedback that indicates whether the recording consent prompt is visible
/// </summary>
BoolFeedback RecordConsentPromptIsVisible { get; }
/// <summary>
/// Used to agree or disagree to the meeting being recorded when prompted
/// </summary>
/// <param name="agree"></param>
void RecordingPromptAcknowledgement(bool agree);
}
}

View File

@@ -0,0 +1,31 @@
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Defines the contract for IHasParticipantAudioMute
/// </summary>
public interface IHasParticipantAudioMute : IHasParticipantVideoMute
{
/// <summary>
/// Mute audio of all participants
/// </summary>
void MuteAudioForAllParticipants();
/// <summary>
/// Mute audio for participant
/// </summary>
/// <param name="userId">The user ID of the participant to mute</param>
void MuteAudioForParticipant(int userId);
/// <summary>
/// Unmute audio for participant
/// </summary>
/// <param name="userId">The user ID of the participant to unmute</param>
void UnmuteAudioForParticipant(int userId);
/// <summary>
/// Toggles audio for participant
/// </summary>
/// <param name="userId">The user ID of the participant to toggle</param>
void ToggleAudioForParticipant(int userId);
}
}

View File

@@ -0,0 +1,40 @@
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Defines the contract for IHasParticipantPinUnpin
/// </summary>
public interface IHasParticipantPinUnpin : IHasParticipants
{
/// <summary>
/// Feedback that indicates the number of screens available for pinning participants
/// </summary>
IntFeedback NumberOfScreensFeedback { get; }
/// <summary>
/// Gets the screen index to pin the user to
/// </summary>
int ScreenIndexToPinUserTo { get; }
/// <summary>
/// Pins a participant to a screen
/// </summary>
/// <param name="userId">The user ID of the participant to pin</param>
/// <param name="screenIndex">The screen index to pin the user to</param>
void PinParticipant(int userId, int screenIndex);
/// <summary>
/// Unpins a participant
/// </summary>
/// <param name="userId">The user ID of the participant to unpin</param>
void UnPinParticipant(int userId);
/// <summary>
/// Toggles the pin state of a participant
/// </summary>
/// <param name="userId">The user ID of the participant to toggle</param>
/// <param name="screenIndex">The screen index to pin the user to</param>
void ToggleParticipantPinState(int userId, int screenIndex);
}
}

View File

@@ -0,0 +1,26 @@
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Describes the ability to mute and unmute a participant's video in a meeting
/// </summary>
public interface IHasParticipantVideoMute : IHasParticipants
{
/// <summary>
/// Mute video of all participants
/// </summary>
/// <param name="userId">The user ID of the participant to mute</param>
void MuteVideoForParticipant(int userId);
/// <summary>
/// Unmute video of all participants
/// </summary>
/// <param name="userId">The user ID of the participant to unmute</param>
void UnmuteVideoForParticipant(int userId);
/// <summary>
/// Toggles video of a participant
/// </summary>
/// <param name="userId">The user ID of the participant to toggle</param>
void ToggleVideoForParticipant(int userId);
}
}

View File

@@ -1,156 +1,31 @@
using System;
using System.Linq;
using System.Collections.Generic;
using PepperDash.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Describes a device that has call participants
/// </summary>
public interface IHasParticipants
{
/// <summary>
/// Gets the collection of participants
/// </summary>
CodecParticipants Participants { get; }
/// <summary>
/// Removes the participant from the meeting
/// </summary>
/// <param name="participant"></param>
void RemoveParticipant(int userId);
/// <summary>
/// Removes the participant from the meeting
/// </summary>
/// <param name="userId"></param>
void RemoveParticipant(int userId);
/// <summary>
/// Sets the participant as the new host
/// </summary>
/// <param name="participant"></param>
void SetParticipantAsHost(int userId);
/// <summary>
/// Sets the participant as the new host
/// </summary>
/// <param name="userId"></param>
void SetParticipantAsHost(int userId);
/// <summary>
/// Admits a participant from the waiting room
/// </summary>
/// <param name="userId"></param>
void AdmitParticipantFromWaitingRoom(int userId);
}
/// <summary>
/// Describes the ability to mute and unmute a participant's video in a meeting
/// </summary>
public interface IHasParticipantVideoMute : IHasParticipants
{
void MuteVideoForParticipant(int userId);
void UnmuteVideoForParticipant(int userId);
void ToggleVideoForParticipant(int userId);
}
/// <summary>
/// Defines the contract for IHasParticipantAudioMute
/// </summary>
public interface IHasParticipantAudioMute : IHasParticipantVideoMute
{
/// <summary>
/// Mute audio of all participants
/// </summary>
void MuteAudioForAllParticipants();
void MuteAudioForParticipant(int userId);
void UnmuteAudioForParticipant(int userId);
void ToggleAudioForParticipant(int userId);
}
/// <summary>
/// Defines the contract for IHasParticipantPinUnpin
/// </summary>
public interface IHasParticipantPinUnpin : IHasParticipants
{
IntFeedback NumberOfScreensFeedback { get; }
int ScreenIndexToPinUserTo { get; }
void PinParticipant(int userId, int screenIndex);
void UnPinParticipant(int userId);
void ToggleParticipantPinState(int userId, int screenIndex);
}
/// <summary>
/// Represents a CodecParticipants
/// </summary>
public class CodecParticipants
{
private List<Participant> _currentParticipants;
public List<Participant> CurrentParticipants
{
get { return _currentParticipants; }
set
{
_currentParticipants = value;
OnParticipantsChanged();
}
}
public Participant Host
{
get
{
return _currentParticipants.FirstOrDefault(p => p.IsHost);
}
}
public event EventHandler<EventArgs> ParticipantsListHasChanged;
public CodecParticipants()
{
_currentParticipants = new List<Participant>();
}
/// <summary>
/// OnParticipantsChanged method
/// </summary>
public void OnParticipantsChanged()
{
var handler = ParticipantsListHasChanged;
if (handler == null) return;
handler(this, new EventArgs());
}
}
/// <summary>
/// Represents a Participant
/// </summary>
public class Participant
{
/// <summary>
/// Gets or sets the UserId
/// </summary>
public int UserId { get; set; }
/// <summary>
/// Gets or sets the IsHost
/// </summary>
public bool IsHost { get; set; }
public bool IsMyself { get; set; }
public string Name { get; set; }
public bool CanMuteVideo { get; set; }
public bool CanUnmuteVideo { get; set; }
public bool VideoMuteFb { get; set; }
public bool AudioMuteFb { get; set; }
/// <summary>
/// Gets or sets the HandIsRaisedFb
/// </summary>
public bool HandIsRaisedFb { get; set; }
/// <summary>
/// Gets or sets the IsPinnedFb
/// </summary>
public bool IsPinnedFb { get; set; }
/// <summary>
/// Gets or sets the ScreenIndexIsPinnedToFb
/// </summary>
public int ScreenIndexIsPinnedToFb { get; set; }
public Participant()
{
// Initialize to -1 (no screen)
ScreenIndexIsPinnedToFb = -1;
}
/// <summary>
/// Admits a participant from the waiting room
/// </summary>
/// <param name="userId"></param>
void AdmitParticipantFromWaitingRoom(int userId);
}
}

View File

@@ -5,10 +5,35 @@
/// </summary>
public interface IHasPresentationOnlyMeeting
{
/// <summary>
/// Starts a presentation only meeting
/// </summary>
void StartSharingOnlyMeeting();
/// <summary>
/// Starts a presentation only meeting with specified display mode
/// </summary>
/// <param name="displayMode">The display mode for the meeting</param>
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode);
/// <summary>
/// Starts a presentation only meeting with specified display mode and duration
/// </summary>
/// <param name="displayMode">The display mode for the meeting</param>
/// <param name="duration">The duration for the meeting</param>
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration);
/// <summary>
/// Starts a presentation only meeting with specified display mode, duration, and password
/// </summary>
/// <param name="displayMode">The display mode for the meeting</param>
/// <param name="duration">The duration for the meeting</param>
/// <param name="password">The password for the meeting</param>
void StartSharingOnlyMeeting(eSharingMeetingMode displayMode, uint duration, string password);
/// <summary>
/// Starts a normal meeting from a sharing only meeting
/// </summary>
void StartNormalMeetingFromSharingOnlyMeeting();
}
@@ -17,8 +42,17 @@
/// </summary>
public enum eSharingMeetingMode
{
/// <summary>
/// No specific sharing mode
/// </summary>
None,
/// <summary>
/// Laptop sharing mode
/// </summary>
Laptop,
/// <summary>
/// iOS sharing mode
/// </summary>
Ios,
}
}

View File

@@ -1,5 +1,4 @@
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Devices.Common.VideoCodec;
using PepperDash.Essentials.Devices.Common.VideoCodec;
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
{
@@ -8,10 +7,19 @@ namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
/// </summary>
public interface IHasSelfviewPosition
{
/// <summary>
/// Gets the SelfviewPipPositionFeedback
/// </summary>
StringFeedback SelfviewPipPositionFeedback { get; }
/// <summary>
/// Sets the selfview position
/// </summary>
void SelfviewPipPositionSet(CodecCommandWithLabel position);
/// <summary>
/// Toggles the selfview position
/// </summary>
void SelfviewPipPositionToggle();
}
}

View File

@@ -2,15 +2,25 @@
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
{
/// <summary>
/// Defines the contract for IHasSelfviewSize
/// </summary>
/// <summary>
/// Defines the contract for IHasSelfviewSize
/// </summary>
public interface IHasSelfviewSize
{
/// <summary>
/// Gets the SelfviewPipSizeFeedback
/// </summary>
StringFeedback SelfviewPipSizeFeedback { get; }
/// <summary>
/// Sets the selfview size
/// </summary>
/// <param name="size">The new selfview size</param>
void SelfviewPipSizeSet(CodecCommandWithLabel size);
/// <summary>
/// Toggles the selfview size
/// </summary>
void SelfviewPipSizeToggle();
}
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
@@ -13,10 +7,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IHasStandbyMode
{
/// <summary>
/// Feedback that indicates whether Standby Mode is on
/// </summary>
BoolFeedback StandbyIsOnFeedback { get; }
/// <summary>
/// Activates Standby Mode
/// </summary>
void StandbyActivate();
/// <summary>
/// Deactivates Standby Mode
/// </summary>
void StandbyDeactivate();
}
@@ -25,10 +28,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IHasHalfWakeMode : IHasStandbyMode
{
/// <summary>
/// Feedback that indicates whether Half Wake Mode is on
/// </summary>
BoolFeedback HalfWakeModeIsOnFeedback { get; }
/// <summary>
/// Feedback that indicates whether the device is entering Standby Mode
/// </summary>
BoolFeedback EnteringStandbyModeFeedback { get; }
/// <summary>
/// Activates Half Wake Mode
/// </summary>
void HalfwakeActivate();
}
}

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Describes the ability to start an ad-hoc meeting

View File

@@ -1,25 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
/// <summary>
/// For rooms that have video codec
/// </summary>
public interface IHasVideoCodec:IHasInCallFeedback,IPrivacy
public interface IHasVideoCodec : IHasInCallFeedback, IPrivacy
{
/// <summary>
/// Gets the VideoCodecBase instance
/// </summary>
VideoCodecBase VideoCodec { get; }
/// <summary>
/// Make this more specific
/// </summary>
//List<PepperDash.Essentials.Devices.Common.Codec.CodecActiveCallItem> ActiveCalls { get; }
/// <summary>
/// States: 0 for on hook, 1 for video, 2 for audio, 3 for telekenesis
/// </summary>

View File

@@ -1,10 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Essentials.Devices.Common.Codec;
using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
@@ -13,7 +7,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public interface IJoinCalls
{
/// <summary>
/// Joins a call
/// </summary>
/// <param name="activeCall">The active call to join</param>
void JoinCall(CodecActiveCallItem activeCall);
/// <summary>
/// Joins all calls
/// </summary>
void JoinAllCalls();
}
}

View File

@@ -0,0 +1,106 @@
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Represents a MeetingInfo
/// </summary>
public class MeetingInfo
{
/// <summary>
/// Gets or sets the Id
/// </summary>
[JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
public string Id { get; private set; }
/// <summary>
/// Gets or sets the Name
/// </summary>
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; private set; }
/// <summary>
/// Gets or sets the Host
/// </summary>
[JsonProperty("host", NullValueHandling = NullValueHandling.Ignore)]
public string Host { get; private set; }
/// <summary>
/// Gets or sets the Password
/// </summary>
[JsonProperty("password", NullValueHandling = NullValueHandling.Ignore)]
public string Password { get; private set; }
/// <summary>
/// Gets or sets the ShareStatus
/// </summary>
[JsonProperty("shareStatus", NullValueHandling = NullValueHandling.Ignore)]
public string ShareStatus { get; private set; }
/// <summary>
/// Gets or sets the IsHost
/// </summary>
[JsonProperty("isHost", NullValueHandling = NullValueHandling.Ignore)]
public bool IsHost { get; private set; }
/// <summary>
/// Gets or sets the IsSharingMeeting
/// </summary>
[JsonProperty("isSharingMeeting", NullValueHandling = NullValueHandling.Ignore)]
public bool IsSharingMeeting { get; private set; }
/// <summary>
/// Gets or sets the WaitingForHost
/// </summary>
[JsonProperty("waitingForHost", NullValueHandling = NullValueHandling.Ignore)]
public bool WaitingForHost { get; private set; }
/// <summary>
/// Gets or sets the IsLocked
/// </summary>
[JsonProperty("isLocked", NullValueHandling = NullValueHandling.Ignore)]
public bool IsLocked { get; private set; }
/// <summary>
/// Gets or sets the IsRecording
/// </summary>
[JsonProperty("isRecording", NullValueHandling = NullValueHandling.Ignore)]
public bool IsRecording { get; private set; }
/// <summary>
/// Gets or sets the CanRecord
/// </summary>
[JsonProperty("canRecord", NullValueHandling = NullValueHandling.Ignore)]
public bool CanRecord { get; private set; }
/// <summary>
/// Constructor for MeetingInfo
/// </summary>
/// <param name="id">The unique identifier for the meeting</param>
/// <param name="name">The name of the meeting</param>
/// <param name="host">The host of the meeting</param>
/// <param name="password">The password for the meeting</param>
/// <param name="shareStatus">The share status of the meeting</param>
/// <param name="isHost">Indicates whether the current user is the host</param>
/// <param name="isSharingMeeting">Indicates whether the meeting is currently being shared</param>
/// <param name="waitingForHost">Indicates whether the meeting is waiting for the host to join</param>
/// <param name="isLocked">Indicates whether the meeting is locked</param>
/// <param name="isRecording">Indicates whether the meeting is being recorded</param>
/// <param name="canRecord">Indicates whether the meeting can be recorded</param>
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost, bool isSharingMeeting, bool waitingForHost, bool isLocked, bool isRecording, bool canRecord)
{
Id = id;
Name = name;
Host = host;
Password = password;
ShareStatus = shareStatus;
IsHost = isHost;
IsSharingMeeting = isSharingMeeting;
WaitingForHost = waitingForHost;
IsLocked = isLocked;
IsRecording = isRecording;
CanRecord = CanRecord;
}
}
}

View File

@@ -0,0 +1,27 @@
using System;
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Represents a MeetingInfoEventArgs
/// </summary>
public class MeetingInfoEventArgs : EventArgs
{
/// <summary>
/// Gets or sets the Info
/// </summary>
public MeetingInfo Info { get; private set; }
/// <summary>
/// Initializes a new instance of the <see cref="MeetingInfoEventArgs"/> class.
/// </summary>
/// <param name="info">The meeting information.</param>
public MeetingInfoEventArgs(MeetingInfo info)
{
Info = info;
}
}
}

View File

@@ -0,0 +1,72 @@
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
{
/// <summary>
/// Represents a Participant
/// </summary>
public class Participant
{
/// <summary>
/// Gets or sets the UserId
/// </summary>
public int UserId { get; set; }
/// <summary>
/// Gets or sets the IsHost
/// </summary>
public bool IsHost { get; set; }
/// <summary>
/// Gets or sets the IsMyself
/// </summary>
public bool IsMyself { get; set; }
/// <summary>
/// Gets or sets the Name
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets the Email
/// </summary>
public bool CanMuteVideo { get; set; }
/// <summary>
/// Gets or sets the CanUnmuteVideo
/// </summary>
public bool CanUnmuteVideo { get; set; }
/// <summary>
/// Gets or sets the CanMuteAudio
/// </summary>
public bool VideoMuteFb { get; set; }
/// <summary>
/// Gets or sets the AudioMuteFb
/// </summary>
public bool AudioMuteFb { get; set; }
/// <summary>
/// Gets or sets the HandIsRaisedFb
/// </summary>
public bool HandIsRaisedFb { get; set; }
/// <summary>
/// Gets or sets the IsPinnedFb
/// </summary>
public bool IsPinnedFb { get; set; }
/// <summary>
/// Gets or sets the ScreenIndexIsPinnedToFb
/// </summary>
public int ScreenIndexIsPinnedToFb { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="Participant"/> class
/// </summary>
public Participant()
{
// Initialize to -1 (no screen)
ScreenIndexIsPinnedToFb = -1;
}
}
}

View File

@@ -1,12 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
using Newtonsoft.Json;
namespace PepperDash.Essentials.Devices.Common.Codec
{
@@ -15,6 +7,9 @@ namespace PepperDash.Essentials.Devices.Common.Codec
/// </summary>
public interface iVideoCodecInfo
{
/// <summary>
/// Gets the codec information
/// </summary>
VideoCodecInfo CodecInfo { get; }
}
@@ -23,18 +18,39 @@ namespace PepperDash.Essentials.Devices.Common.Codec
/// </summary>
public abstract class VideoCodecInfo
{
/// <summary>
/// Gets a value indicating whether the multi-site option is enabled
/// </summary>
[JsonProperty("multiSiteOptionIsEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool MultiSiteOptionIsEnabled { get; }
/// <summary>
/// Gets the IP address of the codec
/// </summary>
[JsonProperty("ipAddress", NullValueHandling = NullValueHandling.Ignore)]
public abstract string IpAddress { get; }
/// <summary>
/// Gets the SIP phone number for the codec
/// </summary>
[JsonProperty("sipPhoneNumber", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipPhoneNumber { get; }
/// <summary>
/// Gets the E164 alias for the codec
/// </summary>
[JsonProperty("e164Alias", NullValueHandling = NullValueHandling.Ignore)]
public abstract string E164Alias { get; }
/// <summary>
/// Gets the H323 ID for the codec
/// </summary>
[JsonProperty("h323Id", NullValueHandling = NullValueHandling.Ignore)]
public abstract string H323Id { get; }
/// <summary>
/// Gets the SIP URI for the codec
/// </summary>
[JsonProperty("sipUri", NullValueHandling = NullValueHandling.Ignore)]
public abstract string SipUri { get; }
/// <summary>
/// Gets a value indicating whether auto-answer is enabled
/// </summary>
[JsonProperty("autoAnswerEnabled", NullValueHandling = NullValueHandling.Ignore)]
public abstract bool AutoAnswerEnabled { get; }
}

View File

@@ -1,16 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using System.Collections.Generic;
using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
{
/// <summary>
/// Mock video codec directory structure
/// </summary>
public static class MockVideoCodecDirectory
{
/// <summary>
@@ -18,13 +14,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public enum eFolderId
{
/// <summary>
/// The United States folder
/// </summary>
UnitedStates,
/// <summary>
/// The Canada folder
/// </summary>
Canada,
/// <summary>
/// The New York folder
/// </summary>
NewYork,
/// <summary>
/// The Boston folder
/// </summary>
Boston,
/// <summary>
/// The San Francisco folder
/// </summary>
SanFrancisco,
/// <summary>
/// The Denver folder
/// </summary>
Denver,
/// <summary>
/// The Austin folder
/// </summary>
Austin,
/// <summary>
/// The Calgary folder
/// </summary>
Calgary
}
@@ -51,16 +71,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
public static CodecDirectory DirectoryRoot
/// <summary>
/// The root of the directory structure
/// </summary>
public static CodecDirectory DirectoryRoot
{
get
{
var directory = new CodecDirectory();
directory.AddFoldersToDirectory
(
(
new List<DirectoryItem>()
{
{
new DirectoryFolder()
{
FolderId = eFolderId.UnitedStates.ToString(),
@@ -77,7 +100,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
);
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
@@ -97,23 +120,27 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
}
);
);
return directory;
}
}
}
/// <summary>
/// Contents of the United States folder
/// </summary>
public static CodecDirectory UnitedStatesFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.UnitedStates.ToString();
directory.AddFoldersToDirectory
(
new List<DirectoryItem>()
{
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.UnitedStates.ToString()
};
directory.AddFoldersToDirectory
(
new List<DirectoryItem>()
{
new DirectoryFolder()
{
FolderId = eFolderId.NewYork.ToString(),
@@ -149,24 +176,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
ParentFolderId = eFolderId.UnitedStates.ToString(),
Contacts = null
}
}
);
}
);
return directory;
}
}
/// <summary>
/// Contents of the New York folder
/// </summary>
public static CodecDirectory NewYorkFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.NewYork.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.NewYork.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "nyc_1",
@@ -215,24 +246,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
}
}
);
}
);
return directory;
}
}
/// <summary>
/// Contents of the Boston folder
/// </summary>
public static CodecDirectory BostonFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.Boston.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.Boston.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "bos_1",
@@ -249,24 +284,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
}
}
);
}
);
return directory;
}
}
/// <summary>
/// Contents of the San Francisco folder
/// </summary>
public static CodecDirectory SanFranciscoFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.SanFrancisco.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.SanFrancisco.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "sfo_1",
@@ -282,25 +321,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CallType = eContactMethodCallType.Video
}
}
}
}
);
}
}
);
return directory;
}
}
/// <summary>
/// Contents of the Denver folder
/// </summary>
public static CodecDirectory DenverFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.Denver.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.Denver.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "den_1",
@@ -316,25 +359,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CallType = eContactMethodCallType.Video
}
}
}
}
);
}
}
);
return directory;
}
}
/// <summary>
/// Contents of the Austin folder
/// </summary>
public static CodecDirectory AustinFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.Austin.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.Austin.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "atx_1",
@@ -350,25 +397,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CallType = eContactMethodCallType.Video
}
}
}
}
);
}
}
);
return directory;
}
}
/// <summary>
/// Contents of the Canada folder
/// </summary>
public static CodecDirectory CanadaFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.Canada.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.Canada.ToString()
};
directory.AddFoldersToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryFolder()
{
FolderId = eFolderId.Calgary.ToString(),
@@ -376,24 +427,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
ParentFolderId = eFolderId.Canada.ToString(),
Contacts = null
}
}
);
}
);
return directory;
}
}
/// <summary>
/// Contents of the Calgary folder
/// </summary>
public static CodecDirectory CalgaryFolderContents
{
get
{
var directory = new CodecDirectory();
directory.ResultsFolderId = eFolderId.Calgary.ToString();
var directory = new CodecDirectory
{
ResultsFolderId = eFolderId.Calgary.ToString()
};
directory.AddContactsToDirectory
(
new List<DirectoryItem>()
{
(
new List<DirectoryItem>()
{
new DirectoryContact()
{
ContactId = "cdn_1",
@@ -409,14 +464,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CallType = eContactMethodCallType.Video
}
}
}
}
);
}
}
);
return directory;
}
}
}
}

View File

@@ -3,19 +3,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro.DeviceSupport;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Routing;
using PepperDash.Essentials.Devices.Common.Codec;
using PepperDash.Essentials.Devices.Common.Cameras;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PepperDash.Essentials.Devices.Common.Codec;
using Serilog.Events;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
@@ -47,10 +45,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public RoutingOutputPort HdmiOut { get; private set; }
/// <summary>
/// Gets or sets the CallFavorites
/// </summary>
public CodecCallFavorites CallFavorites { get; private set; }
/// <summary>
/// Gets or sets the CallFavorites
/// </summary>
public CodecCallFavorites CallFavorites { get; private set; }
/// <summary>
///
@@ -62,22 +60,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CodecInfo = new MockCodecInfo();
// Get favoritesw
// Get favoritesw
if (PropertiesConfig.Favorites != null)
{
CallFavorites = new CodecCallFavorites();
CallFavorites.Favorites = PropertiesConfig.Favorites;
}
{
CallFavorites = new CodecCallFavorites();
CallFavorites.Favorites = PropertiesConfig.Favorites;
}
DirectoryBrowseHistory = new List<CodecDirectory>();
// Debug helpers
MuteFeedback.OutputChange += (o, a) => Debug.LogMessage(LogEventLevel.Debug, this, "Mute={0}", _IsMuted);
PrivacyModeIsOnFeedback.OutputChange += (o, a) => Debug.LogMessage(LogEventLevel.Debug, this, "Privacy={0}", _PrivacyModeIsOn);
SharingSourceFeedback.OutputChange += (o, a) => Debug.LogMessage(LogEventLevel.Debug, this, "SharingSource={0}", _SharingSource);
SharingSourceFeedback.OutputChange += (o, a) => Debug.LogMessage(LogEventLevel.Debug, this, "SharingSource={0}", _SharingSource);
VolumeLevelFeedback.OutputChange += (o, a) => Debug.LogMessage(LogEventLevel.Debug, this, "Volume={0}", _VolumeLevel);
CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback(() => DirectoryBrowseHistory.Count > 0);
CurrentDirectoryResultIsNotDirectoryRoot = new BoolFeedback("currentDirectoryResultIsNotDirectoryRoot", () => DirectoryBrowseHistory.Count > 0);
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
@@ -105,38 +103,44 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
CreateOsdSource();
SetIsReady();
}
}
/// <inheritdoc />
protected override Func<bool> MuteFeedbackFunc
{
get { return () => _IsMuted; }
}
bool _IsMuted;
/// <inheritdoc />
protected override Func<bool> PrivacyModeIsOnFeedbackFunc
{
get { return () => _PrivacyModeIsOn; }
}
bool _PrivacyModeIsOn;
/// <inheritdoc />
protected override Func<string> SharingSourceFeedbackFunc
{
get { return () => _SharingSource; }
}
string _SharingSource;
/// <inheritdoc />
protected override Func<bool> SharingContentIsOnFeedbackFunc
{
get { return () => _SharingIsOn; }
}
bool _SharingIsOn;
/// <inheritdoc />
protected override Func<int> VolumeLevelFeedbackFunc
{
get { return () => _VolumeLevel; }
}
int _VolumeLevel;
/// <inheritdoc />
protected override Func<bool> StandbyIsOnFeedbackFunc
{
get { return () => _StandbyIsOn; }
@@ -157,9 +161,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
//foreach(var input in Status.Video.
}
/// <summary>
/// Dial method
/// </summary>
/// <inheritdoc />
public override void Dial(string number)
{
@@ -177,9 +178,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}, 2000);
}
/// <summary>
/// Dial method
/// </summary>
/// <inheritdoc />
public override void Dial(Meeting meeting)
{
@@ -199,9 +197,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
/// <summary>
/// EndCall method
/// </summary>
/// <inheritdoc />
public override void EndCall(CodecActiveCallItem call)
{
@@ -211,14 +206,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
//ActiveCallCountFeedback.FireUpdate();
}
/// <summary>
/// EndAllCalls method
/// </summary>
/// <inheritdoc />
public override void EndAllCalls()
{
Debug.LogMessage(LogEventLevel.Debug, this, "EndAllCalls");
for(int i = ActiveCalls.Count - 1; i >= 0; i--)
for (int i = ActiveCalls.Count - 1; i >= 0; i--)
{
var call = ActiveCalls[i];
ActiveCalls.Remove(call);
@@ -227,9 +220,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
//ActiveCallCountFeedback.FireUpdate();
}
/// <summary>
/// AcceptCall method
/// </summary>
/// <inheritdoc />
public override void AcceptCall(CodecActiveCallItem call)
{
@@ -239,9 +230,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
// should already be in active list
}
/// <summary>
/// RejectCall method
/// </summary>
/// <inheritdoc />
public override void RejectCall(CodecActiveCallItem call)
{
@@ -251,65 +239,44 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
//ActiveCallCountFeedback.FireUpdate();
}
/// <summary>
/// Makes horrible tones go out on the wire!
/// </summary>
/// <param name="s"></param>
/// <summary>
/// SendDtmf method
/// </summary>
/// <inheritdoc />
public override void SendDtmf(string s)
{
Debug.LogMessage(LogEventLevel.Debug, this, "SendDTMF: {0}", s);
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void StartSharing()
{
_SharingIsOn = true;
SharingContentIsOnFeedback.FireUpdate();
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void StopSharing()
{
_SharingIsOn = false;
SharingContentIsOnFeedback.FireUpdate();
}
/// <inheritdoc />
public override void StandbyActivate()
{
_StandbyIsOn = true;
}
/// <summary>
/// StandbyDeactivate method
/// </summary>
/// <inheritdoc />
public override void StandbyDeactivate()
{
_StandbyIsOn = false;
}
/// <summary>
/// LinkToApi method
/// </summary>
/// <inheritdoc />
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
throw new NotImplementedException();
}
/// <summary>
/// Called by routing to make it happen
/// </summary>
/// <param name="selector"></param>
/// <summary>
/// ExecuteSwitch method
/// </summary>
/// <inheritdoc />
public override void ExecuteSwitch(object selector)
{
@@ -317,40 +284,27 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
_SharingSource = selector.ToString();
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void MuteOff()
{
_IsMuted = false;
MuteFeedback.FireUpdate();
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void MuteOn()
{
_IsMuted = true;
MuteFeedback.FireUpdate();
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void MuteToggle()
{
_IsMuted = !_IsMuted;
MuteFeedback.FireUpdate();
}
/// <summary>
///
/// </summary>
/// <param name="level"></param>
/// <summary>
/// SetVolume method
/// </summary>
/// <inheritdoc />
public override void SetVolume(ushort level)
{
@@ -358,29 +312,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
VolumeLevelFeedback.FireUpdate();
}
/// <summary>
///
/// </summary>
/// <param name="pressRelease"></param>
/// <summary>
/// VolumeDown method
/// </summary>
/// <inheritdoc />
public override void VolumeDown(bool pressRelease)
{
}
/// <summary>
///
/// </summary>
/// <param name="pressRelease"></param>
/// <inheritdoc />
public override void VolumeUp(bool pressRelease)
{
}
/// <summary>
///
/// </summary>
/// <inheritdoc />
public override void PrivacyModeOn()
{
Debug.LogMessage(LogEventLevel.Debug, this, "PrivacyMuteOn");
@@ -390,9 +333,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
PrivacyModeIsOnFeedback.FireUpdate();
}
/// <summary>
/// PrivacyModeOff method
/// </summary>
/// <inheritdoc />
public override void PrivacyModeOff()
{
@@ -403,45 +344,37 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
PrivacyModeIsOnFeedback.FireUpdate();
}
/// <summary>
/// PrivacyModeToggle method
/// </summary>
/// <inheritdoc />
public override void PrivacyModeToggle()
{
_PrivacyModeIsOn = !_PrivacyModeIsOn;
Debug.LogMessage(LogEventLevel.Debug, this, "PrivacyMuteToggle: {0}", _PrivacyModeIsOn);
PrivacyModeIsOnFeedback.FireUpdate();
Debug.LogMessage(LogEventLevel.Debug, this, "PrivacyMuteToggle: {0}", _PrivacyModeIsOn);
PrivacyModeIsOnFeedback.FireUpdate();
}
//********************************************************
// SIMULATION METHODS
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <summary>
/// TestIncomingVideoCall method
/// </summary>
/// <param name="url"></param>
public void TestIncomingVideoCall(string url)
{
Debug.LogMessage(LogEventLevel.Debug, this, "TestIncomingVideoCall from {0}", url);
var call = new CodecActiveCallItem() { Name = url, Id = url, Number = url, Type= eCodecCallType.Video, Direction = eCodecCallDirection.Incoming };
var call = new CodecActiveCallItem() { Name = url, Id = url, Number = url, Type = eCodecCallType.Video, Direction = eCodecCallDirection.Incoming };
ActiveCalls.Add(call);
SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Ringing, call);
//OnCallStatusChange(eCodecCallStatus.Unknown, eCodecCallStatus.Ringing, call);
}
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <summary>
/// TestIncomingAudioCall method
/// </summary>
/// <param name="url"></param>
public void TestIncomingAudioCall(string url)
{
Debug.LogMessage(LogEventLevel.Debug, this, "TestIncomingAudioCall from {0}", url);
@@ -451,7 +384,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
//OnCallStatusChange(eCodecCallStatus.Unknown, eCodecCallStatus.Ringing, call);
}
/// <summary>
/// TestFarEndHangup method
/// </summary>
@@ -464,6 +397,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
#region IHasCallHistory Members
/// <summary>
/// CallHistory property
/// </summary>
public CodecCallHistory CallHistory { get; private set; }
/// <summary>
@@ -471,12 +407,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public void RemoveCallHistoryEntry(CodecCallHistory.CallHistoryEntry entry)
{
}
#endregion
#region IHasScheduleAwareness Members
#region IHasScheduleAwareness Members
/// <summary>
/// GetSchedule method
@@ -486,47 +422,59 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
public CodecScheduleAwareness CodecSchedule
{
get {
// if the last meeting has past, generate a new list
if (_CodecSchedule == null || _CodecSchedule.Meetings.Count == 0
|| _CodecSchedule.Meetings[_CodecSchedule.Meetings.Count - 1].StartTime < DateTime.Now)
{
_CodecSchedule = new CodecScheduleAwareness(1000);
for (int i = 0; i < 5; i++)
{
var m = new Meeting();
/// <summary>
/// CodecSchedule property
/// </summary>
public CodecScheduleAwareness CodecSchedule
{
get
{
// if the last meeting has past, generate a new list
if (_CodecSchedule == null || _CodecSchedule.Meetings.Count == 0
|| _CodecSchedule.Meetings[_CodecSchedule.Meetings.Count - 1].StartTime < DateTime.Now)
{
_CodecSchedule = new CodecScheduleAwareness(1000);
for (int i = 0; i < 5; i++)
{
var m = new Meeting();
m.MinutesBeforeMeeting = 5;
m.Id = i.ToString();
m.Organizer = "Employee " + 1;
m.StartTime = DateTime.Now.AddMinutes(5).AddHours(i);
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(50);
m.Title = "Meeting " + i;
m.Calls.Add(new Call() { Number = i + "meeting@fake.com"});
_CodecSchedule.Meetings.Add(m);
}
}
return _CodecSchedule;
}
}
CodecScheduleAwareness _CodecSchedule;
m.StartTime = DateTime.Now.AddMinutes(5).AddHours(i);
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(50);
m.Title = "Meeting " + i;
m.Calls.Add(new Call() { Number = i + "meeting@fake.com" });
_CodecSchedule.Meetings.Add(m);
}
}
return _CodecSchedule;
}
}
CodecScheduleAwareness _CodecSchedule;
#endregion
#endregion
#region IHasDirectory Members
/// <summary>
/// DirectoryResultReturned event. Fired when the directory result changes
/// </summary>
public event EventHandler<DirectoryEventArgs> DirectoryResultReturned;
/// <summary>
/// DirectoryRoot property. The root of the directory
/// </summary>
public CodecDirectory DirectoryRoot
{
get
get
{
return MockVideoCodecDirectory.DirectoryRoot;
}
}
/// <summary>
/// CurrentDirectoryResult property. The current directory result
/// </summary>
public CodecDirectory CurrentDirectoryResult
{
get
@@ -538,9 +486,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
}
/// <summary>
/// PhonebookSyncState property. The current state of the phonebook synchronization
/// </summary>
public CodecPhonebookSyncState PhonebookSyncState
{
get
get
{
var syncState = new CodecPhonebookSyncState(Key + "PhonebookSync");
@@ -554,8 +505,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
/// <summary>
/// SearchDirectory method
/// Search the directory for contacts that contain the search string
/// </summary>
/// <param name="searchString">The search string to use</param>
public void SearchDirectory(string searchString)
{
var searchResults = new CodecDirectory();
@@ -577,8 +529,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
/// <summary>
/// GetDirectoryFolderContents method
/// Get the contents of the specified folder
/// </summary>
/// <param name="folderId">The ID of the folder to get the contents of</param>
public void GetDirectoryFolderContents(string folderId)
{
var folderDirectory = new CodecDirectory();
@@ -606,7 +559,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
/// <summary>
/// SetCurrentDirectoryToRoot method
/// Set the current directory to the root
/// </summary>
public void SetCurrentDirectoryToRoot()
{
@@ -616,7 +569,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
}
/// <summary>
/// GetDirectoryParentFolderContents method
/// Get the contents of the parent folder
/// </summary>
public void GetDirectoryParentFolderContents()
{
@@ -656,16 +609,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public void OnDirectoryResultReturned(CodecDirectory result)
{
CurrentDirectoryResultIsNotDirectoryRoot.FireUpdate();
var handler = DirectoryResultReturned;
if (handler != null)
DirectoryResultReturned?.Invoke(this, new DirectoryEventArgs()
{
handler(this, new DirectoryEventArgs()
{
Directory = result,
DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
});
}
Directory = result,
DirectoryIsOnRoot = !CurrentDirectoryResultIsNotDirectoryRoot.BoolValue
});
}
#endregion
@@ -686,11 +634,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
Cameras.Add(farEndCamera);
SelectedCameraFeedback = new StringFeedback(() => SelectedCamera.Key);
SelectedCameraFeedback = new StringFeedback("selectedCamera", () => SelectedCamera.Key);
ControllingFarEndCameraFeedback = new BoolFeedback(() => SelectedCamera is IAmFarEndCamera);
ControllingFarEndCameraFeedback = new BoolFeedback("controllingFarEndCamera", () => SelectedCamera is IAmFarEndCamera);
CameraAutoModeIsOnFeedback = new BoolFeedback(() => _CameraAutoModeIsOn);
CameraAutoModeIsOnFeedback = new BoolFeedback("cameraAutoModeIsOn", () => _CameraAutoModeIsOn);
SupportsCameraAutoMode = true;
@@ -728,10 +676,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
#region IHasCameras Members
/// <summary>
/// CameraSelected event. Fired when a camera is selected
/// </summary>
public event EventHandler<CameraSelectedEventArgs> CameraSelected;
/// <summary>
/// Gets or sets the Cameras
/// Gets the list of cameras associated with this codec
/// </summary>
public List<CameraBase> Cameras { get; private set; }
@@ -751,12 +702,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
_selectedCamera = value;
SelectedCameraFeedback.FireUpdate();
ControllingFarEndCameraFeedback.FireUpdate();
var handler = CameraSelected;
if (handler != null)
{
handler(this, new CameraSelectedEventArgs(SelectedCamera));
}
CameraSelected?.Invoke(this, new CameraSelectedEventArgs(SelectedCamera));
}
}
@@ -788,7 +734,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// Gets or sets the FarEndCamera
/// </summary>
public CameraBase FarEndCamera { get; private set; }
/// <summary>
/// Gets or sets the ControllingFarEndCameraFeedback
/// </summary>
@@ -823,7 +769,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public void CameraAutoModeToggle()
{
if(_CameraAutoModeIsOn)
if (_CameraAutoModeIsOn)
_CameraAutoModeIsOn = false;
else
_CameraAutoModeIsOn = true;
@@ -835,12 +781,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// <summary>
/// Gets or sets the CameraAutoModeIsOnFeedback
/// </summary>
public BoolFeedback CameraAutoModeIsOnFeedback {get; private set;}
public BoolFeedback CameraAutoModeIsOnFeedback { get; private set; }
#endregion
#region IHasCameraPresets Members
/// <summary>
/// CodecRoomPresetsListHasChanged event. Fired when the presets list changes
/// </summary>
public event EventHandler<EventArgs> CodecRoomPresetsListHasChanged;
/// <summary>
@@ -883,11 +832,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
else
NearEndPresets.Add(new CodecRoomPreset(preset, description, true, true));
var handler = CodecRoomPresetsListHasChanged;
if (handler != null)
{
handler(this, new EventArgs());
}
CodecRoomPresetsListHasChanged?.Invoke(this, new EventArgs());
// Update the config
SetConfig(Config);
@@ -903,6 +848,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
#endregion
/// <inheritdoc />
protected override void CustomSetConfig(DeviceConfig config)
{
PropertiesConfig.Presets = NearEndPresets;
@@ -920,11 +866,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public class MockCodecInfo : VideoCodecInfo
{
/// <inheritdoc />
public override bool MultiSiteOptionIsEnabled
{
get { return true; }
}
/// <inheritdoc />
public override string E164Alias
{
get { return "someE164alias"; }
@@ -975,14 +923,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public class MockVCFactory : EssentialsDeviceFactory<MockVC>
{
/// <inheritdoc />
public MockVCFactory()
{
TypeNames = new List<string>() { "mockvc" };
}
/// <summary>
/// BuildDevice method
/// </summary>
/// <inheritdoc />
public override EssentialsDevice BuildDevice(DeviceConfig dc)
{

View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Devices.Common.VideoCodec;
@@ -16,9 +11,17 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
/// </summary>
public class MockVCCamera : CameraBase, IHasCameraPtzControl, IHasCameraFocusControl, IBridgeAdvanced
{
/// <summary>
/// Gets the parent video codec
/// </summary>
protected VideoCodecBase ParentCodec { get; private set; }
/// <summary>
/// Initializes a new instance of the MockVCCamera class
/// </summary>
/// <param name="key">The device key</param>
/// <param name="name">The device name</param>
/// <param name="codec">The parent video codec</param>
public MockVCCamera(string key, string name, VideoCodecBase codec)
: base(key, name)
{
@@ -173,9 +176,17 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
/// </summary>
public class MockFarEndVCCamera : CameraBase, IHasCameraPtzControl, IAmFarEndCamera, IBridgeAdvanced
{
/// <summary>
/// Gets the parent video codec
/// </summary>
protected VideoCodecBase ParentCodec { get; private set; }
/// <summary>
/// Initializes a new instance of the MockFarEndVCCamera class
/// </summary>
/// <param name="key">The device key</param>
/// <param name="name">The device name</param>
/// <param name="codec">The parent video codec</param>
public MockFarEndVCCamera(string key, string name, VideoCodecBase codec)
: base(key, name)
{

View File

@@ -1,14 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using System.Collections.Generic;
using Newtonsoft.Json;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.VideoCodec
@@ -18,18 +9,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
/// </summary>
public class MockVcPropertiesConfig
{
[JsonProperty("favorites")]
/// <summary>
/// Gets or sets the Favorites
/// </summary>
[JsonProperty("favorites")]
public List<CodecActiveCallItem> Favorites { get; set; }
[JsonProperty("presets")]
/// <summary>
/// Gets or sets the Presets
/// </summary>
[JsonProperty("presets")]
public List<CodecRoomPreset> Presets { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="MockVcPropertiesConfig"/> class.
/// </summary>
public MockVcPropertiesConfig()
{
Favorites = new List<CodecActiveCallItem>();