mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-16 21:24:54 +00:00
Merge branch 'feature/ecs-407' of http://code.pepperdash.net/scm/pec/essentials into feature/cisco-spark-2
Conflicts: Essentials Devices Common/Essentials Devices Common/Codec/iHasScheduleAwareness.cs
This commit is contained in:
@@ -73,6 +73,40 @@ namespace PepperDash.Essentials.Core
|
||||
return SetSigHeldAction(tl, sigNum, heldMs, heldAction, null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets an action to a held sig as well as a released-without-hold action
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static BoolOutputSig SetSigHeldAction(this BoolOutputSig sig, uint heldMs, Action heldAction, Action releaseAction)
|
||||
{
|
||||
CTimer heldTimer = null;
|
||||
bool wasHeld = false;
|
||||
return sig.SetBoolSigAction(press =>
|
||||
{
|
||||
if (press)
|
||||
{
|
||||
wasHeld = false;
|
||||
// Could insert a pressed action here
|
||||
heldTimer = new CTimer(o =>
|
||||
{
|
||||
// if still held and there's an action
|
||||
if (sig.BoolValue && heldAction != null)
|
||||
{
|
||||
wasHeld = true;
|
||||
// Hold action here
|
||||
heldAction();
|
||||
}
|
||||
}, heldMs);
|
||||
}
|
||||
else if (!wasHeld) // released
|
||||
{
|
||||
heldTimer.Stop();
|
||||
if (releaseAction != null)
|
||||
releaseAction();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets an action to a held sig as well as a released-without-hold action
|
||||
@@ -80,35 +114,9 @@ namespace PepperDash.Essentials.Core
|
||||
/// <returns>The sig</returns>
|
||||
public static BoolOutputSig SetSigHeldAction(this BasicTriList tl, uint sigNum, uint heldMs, Action heldAction, Action releaseAction)
|
||||
{
|
||||
CTimer heldTimer = null;
|
||||
bool wasHeld = false;
|
||||
return tl.SetBoolSigAction(sigNum, press =>
|
||||
{
|
||||
if (press)
|
||||
{
|
||||
wasHeld = false;
|
||||
// Could insert a pressed action here
|
||||
heldTimer = new CTimer(o =>
|
||||
{
|
||||
// if still held and there's an action
|
||||
if (tl.BooleanOutput[sigNum].BoolValue && heldAction != null)
|
||||
{
|
||||
wasHeld = true;
|
||||
// Hold action here
|
||||
heldAction();
|
||||
}
|
||||
}, heldMs);
|
||||
}
|
||||
else if(!wasHeld) // released
|
||||
{
|
||||
heldTimer.Stop();
|
||||
if (releaseAction != null)
|
||||
releaseAction();
|
||||
}
|
||||
});
|
||||
return tl.BooleanOutput[sigNum].SetSigHeldAction(heldMs, heldAction, releaseAction);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
||||
@@ -6,15 +6,6 @@ using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
{
|
||||
public enum eMeetingEventChangeType
|
||||
{
|
||||
Unkown = 0,
|
||||
MeetingStartWarning,
|
||||
MeetingStart,
|
||||
MeetingEndWarning,
|
||||
MeetingEnd
|
||||
}
|
||||
|
||||
public interface IHasScheduleAwareness
|
||||
{
|
||||
CodecScheduleAwareness CodecSchedule { get; }
|
||||
@@ -22,52 +13,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
|
||||
public class CodecScheduleAwareness
|
||||
{
|
||||
public event EventHandler<MeetingEventArgs> MeetingEventChange;
|
||||
|
||||
public event EventHandler<EventArgs> MeetingsListHasChanged;
|
||||
|
||||
public List<Meeting> Meetings { get; set; }
|
||||
|
||||
private CTimer ScheduleChecker;
|
||||
|
||||
public CodecScheduleAwareness()
|
||||
{
|
||||
Meetings = new List<Meeting>();
|
||||
|
||||
ScheduleChecker = new CTimer(CheckSchedule, null, 1000, 1000);
|
||||
}
|
||||
|
||||
private void OnMeetingChange(eMeetingEventChangeType changeType, Meeting meeting)
|
||||
{
|
||||
var handler = MeetingEventChange;
|
||||
if (handler != null)
|
||||
{
|
||||
handler(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting });
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckSchedule(object o)
|
||||
{
|
||||
// Iterate the meeting list and check if any meeting need to do anythingk
|
||||
|
||||
foreach (Meeting m in Meetings)
|
||||
{
|
||||
eMeetingEventChangeType changeType = eMeetingEventChangeType.Unkown;
|
||||
|
||||
if (m.TimeToMeetingStart.TotalMinutes == m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to start
|
||||
changeType = eMeetingEventChangeType.MeetingStartWarning;
|
||||
else if (m.TimeToMeetingStart.TotalMinutes == 0) // Meeting Start
|
||||
changeType = eMeetingEventChangeType.MeetingStart;
|
||||
else if (m.TimeToMeetingEnd.TotalMinutes == m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to end
|
||||
changeType = eMeetingEventChangeType.MeetingEndWarning;
|
||||
else if (m.TimeToMeetingEnd.TotalMinutes == 0) // Meeting has ended
|
||||
changeType = eMeetingEventChangeType.MeetingEnd;
|
||||
|
||||
if(changeType != eMeetingEventChangeType.Unkown)
|
||||
OnMeetingChange(changeType, m);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,25 +26,10 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
/// </summary>
|
||||
public class Meeting
|
||||
{
|
||||
public TimeSpan MeetingWarningMinutes = TimeSpan.FromMinutes(5);
|
||||
|
||||
public string Id { get; set; }
|
||||
public string Organizer { get; set; }
|
||||
public string Title { get; set; }
|
||||
public string Agenda { get; set; }
|
||||
public TimeSpan TimeToMeetingStart {
|
||||
get
|
||||
{
|
||||
return StartTime - DateTime.Now;
|
||||
}
|
||||
}
|
||||
public TimeSpan TimeToMeetingEnd
|
||||
{
|
||||
get
|
||||
{
|
||||
return EndTime - DateTime.Now;
|
||||
}
|
||||
}
|
||||
public DateTime StartTime { get; set; }
|
||||
public DateTime EndTime { get; set; }
|
||||
public TimeSpan Duration
|
||||
@@ -109,20 +44,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
{
|
||||
get
|
||||
{
|
||||
// Meeting is joinable from 5 minutes before start until 5 minutes before end
|
||||
if (TimeToMeetingStart.TotalMinutes <= MeetingWarningMinutes.TotalMinutes && TimeToMeetingEnd.TotalMinutes >= MeetingWarningMinutes.TotalMinutes)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
return StartTime.AddMinutes(-5) <= DateTime.Now
|
||||
&& DateTime.Now <= EndTime.AddMinutes(-5);
|
||||
}
|
||||
}
|
||||
public string ConferenceNumberToDial { get; set; }
|
||||
public string ConferencePassword { get; set; }
|
||||
}
|
||||
|
||||
public class MeetingEventArgs : EventArgs
|
||||
{
|
||||
public eMeetingEventChangeType ChangeType { get; set; }
|
||||
public Meeting Meeting { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Displays
|
||||
{
|
||||
public interface IInputHdmi1 { void InputHdmi1(); }
|
||||
public interface IInputHdmi2 { void InputHdmi2(); }
|
||||
public interface IInputHdmi3 { void InputHdmi3(); }
|
||||
public interface IInputHdmi4 { void InputHdmi4(); }
|
||||
public interface IInputDisplayPort1 { void InputDisplayPort1(); }
|
||||
public interface IInputDisplayPort2 { void InputDisplayPort2(); }
|
||||
|
||||
}
|
||||
@@ -14,7 +14,8 @@ namespace PepperDash.Essentials.Devices.Displays
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class SamsungMDC : TwoWayDisplayBase, IBasicVolumeWithFeedback, ICommunicationMonitor
|
||||
public class SamsungMDC : TwoWayDisplayBase, IBasicVolumeWithFeedback, ICommunicationMonitor, IInputDisplayPort1, IInputDisplayPort2,
|
||||
IInputHdmi1, IInputHdmi2, IInputHdmi3, IInputHdmi4
|
||||
{
|
||||
public IBasicCommunication Communication { get; private set; }
|
||||
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
<Compile Include="Codec\iHasScheduleAwareness.cs" />
|
||||
<Compile Include="Crestron\Gateways\CenRfgwController.cs" />
|
||||
<Compile Include="Display\ComTcpDisplayBase.cs" />
|
||||
<Compile Include="Display\InputInterfaces.cs" />
|
||||
<Compile Include="Display\SamsungMDCDisplay.cs" />
|
||||
<Compile Include="Display\DeviceFactory.cs" />
|
||||
<Compile Include="Display\NecPaSeriesProjector.cs" />
|
||||
|
||||
@@ -11,7 +11,7 @@ using PepperDash.Essentials.Devices.Common.Codec;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
{
|
||||
public class MockVC : VideoCodecBase, IRoutingSource
|
||||
public class MockVC : VideoCodecBase, IRoutingSource, IHasCallHistory, IHasScheduleAwareness
|
||||
{
|
||||
public RoutingInputPort CodecOsdIn { get; private set; }
|
||||
public RoutingInputPort HdmiIn1 { get; private set; }
|
||||
@@ -43,6 +43,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
InputPorts.Add(HdmiIn2);
|
||||
OutputPorts.Add(HdmiOut);
|
||||
|
||||
CallHistory = new CodecCallHistory();
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
var call = new CodecCallHistory.CallHistoryEntry();
|
||||
call.Name = "Call " + i;
|
||||
call.Number = i + "@call.com";
|
||||
CallHistory.RecentCalls.Add(call);
|
||||
}
|
||||
// eventually fire history event here
|
||||
|
||||
SetIsReady();
|
||||
}
|
||||
|
||||
@@ -302,7 +312,39 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
Debug.Console(1, this, "TestFarEndHangup");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#region IHasCallHistory Members
|
||||
|
||||
public CodecCallHistory CallHistory { get; private set; }
|
||||
|
||||
public void RemoveCallHistoryEntry(CodecCallHistory.CallHistoryEntry entry)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IHasScheduleAwareness Members
|
||||
|
||||
public CodecScheduleAwareness CodecSchedule
|
||||
{
|
||||
get {
|
||||
var sch = new CodecScheduleAwareness();
|
||||
for(int i = 0; i < 5; i++)
|
||||
{
|
||||
var m = new Meeting();
|
||||
m.StartTime = DateTime.Now.AddMinutes(3).AddHours(i);
|
||||
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(30);
|
||||
m.Title = "Meeting " + i;
|
||||
m.ConferenceNumberToDial = i + "meeting@fake.com";
|
||||
sch.Meetings.Add(m);
|
||||
}
|
||||
return sch;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation for the mock VC
|
||||
|
||||
@@ -144,6 +144,7 @@
|
||||
<Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" />
|
||||
<Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" />
|
||||
<Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" />
|
||||
<Compile Include="Room\Config\EssentialsRoomEmergencyConfig.cs" />
|
||||
<Compile Include="Room\Cotija\CotijaConfig.cs" />
|
||||
<Compile Include="Room\Cotija\CotijaRoomBridge.cs" />
|
||||
<Compile Include="Room\Cotija\DeviceTypeInterfaces\IChannelExtensions.cs" />
|
||||
@@ -154,6 +155,7 @@
|
||||
<Compile Include="Room\Cotija\DeviceTypeInterfaces\IPowerExtensions.cs" />
|
||||
<Compile Include="Room\Cotija\DeviceTypeInterfaces\ISetTopBoxControlsExtensions.cs" />
|
||||
<Compile Include="Room\Cotija\DeviceTypeInterfaces\ITransportExtensions.cs" />
|
||||
<Compile Include="Room\Emergency\EsentialsRoomEmergencyContactClosure.cs" />
|
||||
<Compile Include="Room\Types\EssentialsHuddleVtc1Room.cs" />
|
||||
<Compile Include="Room\Types\EssentialsPresentationRoom.cs" />
|
||||
<Compile Include="Room\Types\EssentialsRoomBase.cs" />
|
||||
@@ -168,6 +170,7 @@
|
||||
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
|
||||
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddleTechPageDriver.cs" />
|
||||
<Compile Include="UI\HttpLogoServer.cs" />
|
||||
<Compile Include="UI\SmartObjectHeaderButtonList.cs" />
|
||||
<Compile Include="UI\SubpageReferenceListCallStagingItem.cs" />
|
||||
<Compile Include="UIDrivers\VC\EssentialsVideoCodecUiDriver.cs" />
|
||||
<Compile Include="UIDrivers\JoinedSigInterlock.cs" />
|
||||
|
||||
@@ -69,11 +69,30 @@ namespace PepperDash.Essentials.Room.Config
|
||||
rm.DefaultSourceItem = props.DefaultSourceItem;
|
||||
rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
|
||||
|
||||
rm.Emergency = GetEmergency(props, rm); // Get emergency object, if any
|
||||
|
||||
return rm;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets and operating, standalone emergegncy object that can be plugged into a room.
|
||||
/// Returns null if there is no emergency defined
|
||||
/// </summary>
|
||||
EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
|
||||
{
|
||||
// This emergency
|
||||
var emergency = props.Emergency;
|
||||
if (emergency != null)
|
||||
{
|
||||
//switch on emergency type here. Right now only contact and shutdown
|
||||
var e = new EssentialsRoomEmergencyContactClosure(room.Key + "-emergency", props.Emergency, room);
|
||||
DeviceManager.AddDevice(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -81,6 +100,7 @@ namespace PepperDash.Essentials.Room.Config
|
||||
/// </summary>
|
||||
public class EssentialsRoomPropertiesConfig
|
||||
{
|
||||
public EssentialsRoomEmergencyConfig Emergency { get; set; }
|
||||
public string HelpMessage { get; set; }
|
||||
public string Description { get; set; }
|
||||
public int ShutdownVacancySeconds { get; set; }
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Room.Config
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class EssentialsRoomEmergencyConfig
|
||||
{
|
||||
public EssentialsRoomEmergencyTriggerConfig Trigger { get; set; }
|
||||
|
||||
public string Behavior { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class EssentialsRoomEmergencyTriggerConfig
|
||||
{
|
||||
/// <summary>
|
||||
/// contact,
|
||||
/// </summary>
|
||||
public string Type { get; set; }
|
||||
/// <summary>
|
||||
/// Input number if contact
|
||||
/// </summary>
|
||||
public int Number { get; set; }
|
||||
|
||||
public bool TriggerOnClose { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Room.Config;
|
||||
|
||||
namespace PepperDash.Essentials.Room
|
||||
{
|
||||
public abstract class EssentialsRoomEmergencyBase : IKeyed
|
||||
{
|
||||
public string Key { get; private set; }
|
||||
|
||||
public EssentialsRoomEmergencyBase(string key)
|
||||
{
|
||||
Key = key;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
|
||||
{
|
||||
EssentialsRoomBase Room;
|
||||
string Behavior;
|
||||
bool TriggerOnClose;
|
||||
|
||||
public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, EssentialsRoomBase room) :
|
||||
base(key)
|
||||
{
|
||||
Room = room;
|
||||
var cs = Global.ControlSystem;
|
||||
|
||||
if (config.Trigger.Type.Equals("contact", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var portNum = (uint)config.Trigger.Number;
|
||||
if (portNum <= cs.NumberOfDigitalInputPorts)
|
||||
{
|
||||
cs.DigitalInputPorts[portNum].Register();
|
||||
cs.DigitalInputPorts[portNum].StateChange += EsentialsRoomEmergencyContactClosure_StateChange;
|
||||
}
|
||||
}
|
||||
Behavior = config.Behavior;
|
||||
TriggerOnClose = config.Trigger.TriggerOnClose;
|
||||
}
|
||||
|
||||
void EsentialsRoomEmergencyContactClosure_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
|
||||
{
|
||||
if (args.State && TriggerOnClose || !args.State && !TriggerOnClose)
|
||||
RunEmergencyBehavior();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void RunEmergencyBehavior()
|
||||
{
|
||||
if (Behavior.Equals("shutdown"))
|
||||
Room.Shutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -184,6 +184,12 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
public string DefaultCodecRouteString { get { return "codecOsd"; } }
|
||||
|
||||
/// <summary>
|
||||
/// Temporary implementation. Returns the schedule-ready object or null if none. Fow now,
|
||||
/// always returns the VideoCodec if it is capable
|
||||
/// </summary>
|
||||
public IHasScheduleAwareness ScheduleSource { get { return VideoCodec as IHasScheduleAwareness; } }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -218,6 +224,10 @@ namespace PepperDash.Essentials
|
||||
CurrentSourceInfo = null;
|
||||
OnFeedback.FireUpdate();
|
||||
}
|
||||
if (disp.PowerIsOnFeedback.BoolValue)
|
||||
{
|
||||
SetDefaultLevels();
|
||||
}
|
||||
};
|
||||
|
||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||
@@ -291,9 +301,9 @@ namespace PepperDash.Essentials
|
||||
/// route or commands
|
||||
/// </summary>
|
||||
/// <param name="name"></param>
|
||||
public void RunRouteAction(string routeKey, Action successCallback)
|
||||
{
|
||||
// Run this on a separate thread
|
||||
public void RunRouteAction(string routeKey, Action successCallback)
|
||||
{
|
||||
// Run this on a separate thread
|
||||
new CTimer(o =>
|
||||
{
|
||||
try
|
||||
@@ -336,7 +346,10 @@ namespace PepperDash.Essentials
|
||||
// Let's run it
|
||||
var item = dict[routeKey];
|
||||
if (routeKey.ToLower() != "roomoff")
|
||||
{
|
||||
|
||||
LastSourceKey = routeKey;
|
||||
}
|
||||
else
|
||||
CurrentSourceInfoKey = null;
|
||||
|
||||
@@ -375,17 +388,6 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
|
||||
}, 0); // end of CTimer
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does what it says
|
||||
/// </summary>
|
||||
public override void SetDefaultLevels()
|
||||
{
|
||||
Debug.Console(1, this, "Restoring default levels");
|
||||
var vc = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
||||
if (vc != null)
|
||||
vc.SetVolume(DefaultVolume);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -451,6 +453,16 @@ namespace PepperDash.Essentials
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does what it says
|
||||
/// </summary>
|
||||
public override void SetDefaultLevels()
|
||||
{
|
||||
Debug.Console(1, this, "Restoring default levels");
|
||||
var vc = CurrentVolumeControls as IBasicVolumeWithFeedback;
|
||||
if (vc != null)
|
||||
vc.SetVolume(DefaultVolume);
|
||||
}
|
||||
/// <summary>
|
||||
/// Will power the room on with the last-used source
|
||||
/// </summary>
|
||||
|
||||
@@ -45,6 +45,8 @@ namespace PepperDash.Essentials
|
||||
public int ShutdownVacancySeconds { get; set; }
|
||||
public ShutdownType ShutdownType { get; private set; }
|
||||
|
||||
public PepperDash.Essentials.Room.EssentialsRoomEmergencyBase Emergency { get; set; }
|
||||
|
||||
public string LogoUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -346,6 +346,9 @@ namespace PepperDash.Essentials
|
||||
/// 12345
|
||||
/// </summary>
|
||||
public const uint AvNoControlsSubVisible = 12345;
|
||||
|
||||
// 10000 - 14999 are general "source" pages
|
||||
|
||||
/// <summary>
|
||||
/// 15001
|
||||
/// </summary>
|
||||
@@ -402,6 +405,10 @@ namespace PepperDash.Essentials
|
||||
/// 15017
|
||||
/// </summary>
|
||||
public const uint StagingPageAdditionalArrowsVisible = 15017;
|
||||
/// <summary>
|
||||
/// 15018 The Header with dynamic buttons
|
||||
/// </summary>
|
||||
public const uint TopBarHabaneroDynamicVisible = 15018;
|
||||
/// <summary>
|
||||
/// 15020
|
||||
/// </summary>
|
||||
@@ -417,31 +424,31 @@ namespace PepperDash.Essentials
|
||||
/// <summary>
|
||||
/// 15023
|
||||
/// </summary>
|
||||
public const uint LightsHeaderButtonVisible = 15023;
|
||||
public const uint HeaderLightsButtonVisible = 15023;
|
||||
/// <summary>
|
||||
/// 15024
|
||||
/// </summary>
|
||||
public const uint CallRightHeaderButtonVisible = 15024;
|
||||
public const uint HeaderCallRightButtonVisible = 15024;
|
||||
/// <summary>
|
||||
/// 15025
|
||||
/// </summary>
|
||||
public const uint CallLeftHeaderButtonVisible = 15025;
|
||||
public const uint HeaderCallLeftButtonVisible = 15025;
|
||||
/// <summary>
|
||||
/// 15026
|
||||
/// </summary>
|
||||
public const uint LightsHeaderButtonPress = 15026;
|
||||
public const uint HeaderLightsButtonPress = 15026;
|
||||
/// <summary>[-
|
||||
/// 15027
|
||||
/// </summary>
|
||||
public const uint CallHeaderButtonPress = 15027;
|
||||
public const uint HeaderCallButtonPress = 15027;
|
||||
/// <summary>
|
||||
/// 15028 The gear button in header
|
||||
/// </summary>
|
||||
public const uint GearHeaderButtonPress = 15028;
|
||||
public const uint HeaderGearButtonPress = 15028;
|
||||
/// <summary>
|
||||
/// 15029 the room button in header
|
||||
/// </summary>
|
||||
public const uint RoomHeaderButtonPress = 15029;
|
||||
public const uint HeaderRoomButtonPress = 15029;
|
||||
/// <summary>
|
||||
/// 15030 Visibility for room data popup
|
||||
/// </summary>
|
||||
@@ -510,6 +517,10 @@ namespace PepperDash.Essentials
|
||||
/// 15045 - Visibility for the bar containing call navigation button list
|
||||
/// </summary>
|
||||
public const uint CallStagingBarVisible = 15045;
|
||||
/// <summary>
|
||||
/// 15046
|
||||
/// </summary>
|
||||
public const uint MeetingsListVisible = 15046;
|
||||
/// <summary>
|
||||
/// 15051
|
||||
/// </summary>
|
||||
@@ -610,5 +621,36 @@ namespace PepperDash.Essentials
|
||||
/// 15091
|
||||
/// </summary>
|
||||
public const uint SetupFullDistrib = 15091;
|
||||
|
||||
// PIN dialogs ************************************
|
||||
|
||||
/// <summary>
|
||||
/// 15201
|
||||
/// </summary>
|
||||
public const uint PinDialog4DigitVisible = 15201;
|
||||
/// <summary>
|
||||
/// 15206
|
||||
/// </summary>
|
||||
public const uint PinDialogCancelPress = 15206;
|
||||
/// <summary>
|
||||
/// 15207
|
||||
/// </summary>
|
||||
public const uint PinDialogErrorVisible = 15207;
|
||||
/// <summary>
|
||||
/// 15211
|
||||
/// </summary>
|
||||
public const uint PinDialogDot1 = 15211;
|
||||
/// <summary>
|
||||
/// 15212
|
||||
/// </summary>
|
||||
public const uint PinDialogDot2 = 15212;
|
||||
/// <summary>
|
||||
/// 15213
|
||||
/// </summary>
|
||||
public const uint PinDialogDot3 = 15213;
|
||||
/// <summary>
|
||||
/// 15214
|
||||
/// </summary>
|
||||
public const uint PinDialogDot4 = 15214;
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,19 @@
|
||||
/// </summary>
|
||||
public const uint VCDialKeypad = 1201;
|
||||
|
||||
/// <summary>
|
||||
/// 1202
|
||||
/// </summary>
|
||||
public const uint VCDirectoryList = 1202;
|
||||
/// <summary>
|
||||
/// 1203
|
||||
/// </summary>
|
||||
public const uint VCRecentsList = 1203;
|
||||
/// <summary>
|
||||
/// 1204
|
||||
/// </summary>
|
||||
public const uint VCFavoritesList = 1204;
|
||||
|
||||
|
||||
//******************************************************
|
||||
// General
|
||||
@@ -26,10 +38,6 @@
|
||||
/// </summary>
|
||||
public const uint SourceStagingSRL = 3200;
|
||||
/// <summary>
|
||||
/// 15022 The main activity footer
|
||||
/// </summary>
|
||||
public const uint ActivityFooterSRL = 15022;
|
||||
/// <summary>
|
||||
/// 3901 The Tech page menu list
|
||||
/// </summary>
|
||||
public const uint TechMenuList = 3901;
|
||||
@@ -37,6 +45,25 @@
|
||||
/// 3902 Tech page statuses
|
||||
/// </summary>
|
||||
public const uint TechStatusList = 3902;
|
||||
|
||||
/// <summary>
|
||||
/// 3903
|
||||
/// </summary>
|
||||
public const uint TechPinDialogKeypad = 3903;
|
||||
/// <summary>
|
||||
/// 3904 - Display controls on the tech page
|
||||
/// </summary>
|
||||
public const uint TechDisplayControlsList = 3904;
|
||||
/// <summary>
|
||||
/// 15018
|
||||
/// </summary>
|
||||
public const uint HeaderButtonList = 15018;
|
||||
/// <summary>
|
||||
/// 15022 The main activity footer
|
||||
/// </summary>
|
||||
public const uint ActivityFooterSRL = 15022;
|
||||
/// <summary>
|
||||
/// 15023 - The header meetings SRL
|
||||
/// </summary>
|
||||
public const uint MeetingListSRL = 15023;
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,11 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
public const uint CodecAddressEntryText = 1001;
|
||||
|
||||
/// <summary>
|
||||
/// 1201 - 1230 range of joins for recents list
|
||||
/// </summary>
|
||||
public const uint VCRecentListTextStart = 1201;
|
||||
|
||||
|
||||
//******************************************************
|
||||
// Keyboard
|
||||
@@ -106,6 +111,10 @@ namespace PepperDash.Essentials
|
||||
/// 3915
|
||||
/// </summary>
|
||||
public const uint NotificationRibbonText = 3915;
|
||||
/// <summary>
|
||||
/// 3916 The "active call" label
|
||||
/// </summary>
|
||||
public const uint HeaderCallLabel = 3916;
|
||||
|
||||
/// <summary>
|
||||
/// 3922
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.SmartObjects;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
public class SmartObjectHeaderButtonList : SmartObjectHelperBase
|
||||
{
|
||||
|
||||
public SmartObjectHeaderButtonList(SmartObject so)
|
||||
: base(so, true)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class HeaderListButton
|
||||
{
|
||||
public BoolInputSig SelectedSig { get; private set; }
|
||||
public BoolInputSig VisibleSig { get; private set; }
|
||||
public BoolOutputSig OutputSig { get; private set; }
|
||||
StringInputSig IconSig;
|
||||
|
||||
public HeaderListButton(SmartObjectHeaderButtonList list, uint index)
|
||||
{
|
||||
var so = list.SmartObject;
|
||||
OutputSig = so.BooleanOutput["Item " + index + " Pressed"];
|
||||
SelectedSig = so.BooleanInput["Item " + index + " Selected"];
|
||||
VisibleSig = so.BooleanInput["Item " + index + " Visible"];
|
||||
IconSig = so.StringInput["Set Item " + index + " Icon Serial"];
|
||||
}
|
||||
|
||||
public void SetIcon(string i)
|
||||
{
|
||||
IconSig.StringValue = i;
|
||||
}
|
||||
|
||||
public void ClearIcon()
|
||||
{
|
||||
IconSig.StringValue = "Blank";
|
||||
}
|
||||
|
||||
public static string Calendar = "Calendar";
|
||||
public static string Camera = "Camera";
|
||||
public static string Gear = "Gear";
|
||||
public static string Lights = "Lights";
|
||||
public static string Help = "Help";
|
||||
public static string OnHook = "Phone Down";
|
||||
public static string Phone = "Phone";
|
||||
}
|
||||
}
|
||||
@@ -218,7 +218,7 @@ namespace PepperDash.Essentials
|
||||
// ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
|
||||
|
||||
// Setup button
|
||||
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
||||
TriList.SetSigHeldAction(UIBoolJoin.HeaderGearButtonPress, 2000,
|
||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible));// ShowInterlockedModal(UIBoolJoin.TechPanelSetupVisible));
|
||||
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||
PopupInterlock.HideAndClear()); // HideCurrentInterlockedModal());
|
||||
|
||||
@@ -229,10 +229,10 @@ namespace PepperDash.Essentials
|
||||
ShowInterlockedModal(UIBoolJoin.HelpPageVisible);
|
||||
});
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||
ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () =>
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderGearButtonPress, () =>
|
||||
ShowInterlockedModal(UIBoolJoin.VolumesPageVisible));
|
||||
|
||||
// power-related functions
|
||||
|
||||
@@ -11,6 +11,7 @@ using PepperDash.Essentials;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.SmartObjects;
|
||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||
using PepperDash.Essentials.Devices.Displays;
|
||||
|
||||
namespace PepperDash.Essentials.UIDrivers
|
||||
{
|
||||
@@ -25,6 +26,10 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
/// </summary>
|
||||
SubpageReferenceList StatusList;
|
||||
/// <summary>
|
||||
/// The list of display controls
|
||||
/// </summary>
|
||||
SubpageReferenceList DisplayList;
|
||||
/// <summary>
|
||||
/// References lines in the list against device instances
|
||||
/// </summary>
|
||||
Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes;
|
||||
@@ -42,6 +47,16 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
/// </summary>
|
||||
public const uint JoinText = 1;
|
||||
|
||||
CTimer PinAuthorizedTimer;
|
||||
|
||||
string Pin;
|
||||
|
||||
StringBuilder PinEntryBuilder = new StringBuilder(4);
|
||||
|
||||
bool IsAuthorized;
|
||||
|
||||
SmartObjectNumeric PinKeypad;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -49,10 +64,12 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
/// </summary>
|
||||
/// <param name="trilist"></param>
|
||||
/// <param name="parent"></param>
|
||||
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, IAVDriver parent)
|
||||
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, IAVDriver parent, string pin)
|
||||
: base(trilist)
|
||||
{
|
||||
Parent = parent;
|
||||
Pin = pin;
|
||||
|
||||
PagesInterlock = new JoinedSigInterlock(trilist);
|
||||
PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
|
||||
|
||||
@@ -83,6 +100,10 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
MenuList.Count = 3;
|
||||
|
||||
BuildStatusList();
|
||||
|
||||
BuildDisplayList();
|
||||
|
||||
SetupPinModal();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -90,9 +111,21 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
/// </summary>
|
||||
public override void Show()
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
|
||||
PagesInterlock.Show();
|
||||
base.Show();
|
||||
// divert to PIN if we need auth
|
||||
if (IsAuthorized)
|
||||
{
|
||||
// Cancel the auth timer so we don't deauth after coming back in
|
||||
if (PinAuthorizedTimer != null)
|
||||
PinAuthorizedTimer.Stop();
|
||||
|
||||
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
|
||||
PagesInterlock.Show();
|
||||
base.Show();
|
||||
}
|
||||
else
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -100,11 +133,93 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
/// </summary>
|
||||
public override void Hide()
|
||||
{
|
||||
// Leave it authorized for 60 seconds.
|
||||
if (IsAuthorized)
|
||||
PinAuthorizedTimer = new CTimer(o => {
|
||||
IsAuthorized = false;
|
||||
PinAuthorizedTimer = null;
|
||||
}, 60000);
|
||||
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
|
||||
PagesInterlock.Hide();
|
||||
base.Hide();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wire up the keypad and buttons
|
||||
/// </summary>
|
||||
void SetupPinModal()
|
||||
{
|
||||
TriList.SetSigFalseAction(UIBoolJoin.PinDialogCancelPress, CancelPinDialog);
|
||||
PinKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.TechPinDialogKeypad], true);
|
||||
PinKeypad.Digit0.UserObject = new Action<bool>(b => { if (b)DialPinDigit('0'); });
|
||||
PinKeypad.Digit1.UserObject = new Action<bool>(b => { if (b)DialPinDigit('1'); });
|
||||
PinKeypad.Digit2.UserObject = new Action<bool>(b => { if (b)DialPinDigit('2'); });
|
||||
PinKeypad.Digit3.UserObject = new Action<bool>(b => { if (b)DialPinDigit('3'); });
|
||||
PinKeypad.Digit4.UserObject = new Action<bool>(b => { if (b)DialPinDigit('4'); });
|
||||
PinKeypad.Digit5.UserObject = new Action<bool>(b => { if (b)DialPinDigit('5'); });
|
||||
PinKeypad.Digit6.UserObject = new Action<bool>(b => { if (b)DialPinDigit('6'); });
|
||||
PinKeypad.Digit7.UserObject = new Action<bool>(b => { if (b)DialPinDigit('7'); });
|
||||
PinKeypad.Digit8.UserObject = new Action<bool>(b => { if (b)DialPinDigit('8'); });
|
||||
PinKeypad.Digit9.UserObject = new Action<bool>(b => { if (b)DialPinDigit('9'); });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="d"></param>
|
||||
void DialPinDigit(char d)
|
||||
{
|
||||
PinEntryBuilder.Append(d);
|
||||
var len = PinEntryBuilder.Length;
|
||||
SetPinDotsFeedback(len);
|
||||
|
||||
// check it!
|
||||
if (len == 4)
|
||||
{
|
||||
if (Pin == PinEntryBuilder.ToString())
|
||||
{
|
||||
IsAuthorized = true;
|
||||
SetPinDotsFeedback(0);
|
||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
||||
Show();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetPinDotsFeedback(0);
|
||||
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, true);
|
||||
new CTimer(o =>
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.PinDialogErrorVisible, false);
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
PinEntryBuilder.Remove(0, len); // clear it either way
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the dots as pin is entered
|
||||
/// </summary>
|
||||
/// <param name="len"></param>
|
||||
void SetPinDotsFeedback(int len)
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.PinDialogDot1, len >= 1);
|
||||
TriList.SetBool(UIBoolJoin.PinDialogDot2, len >= 2);
|
||||
TriList.SetBool(UIBoolJoin.PinDialogDot3, len >= 3);
|
||||
TriList.SetBool(UIBoolJoin.PinDialogDot4, len == 4);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Does what it says
|
||||
/// </summary>
|
||||
void CancelPinDialog()
|
||||
{
|
||||
PinEntryBuilder.Remove(0, PinEntryBuilder.Length);
|
||||
TriList.SetBool(UIBoolJoin.PinDialog4DigitVisible, false);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -131,6 +246,47 @@ namespace PepperDash.Essentials.UIDrivers
|
||||
StatusList.Count = (ushort)i;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builds the list of display controls
|
||||
/// </summary>
|
||||
void BuildDisplayList()
|
||||
{
|
||||
DisplayList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechDisplayControlsList, 10, 3, 3);
|
||||
|
||||
var devKeys = ConfigReader.ConfigObject.Devices.Where(d =>
|
||||
d.Group.Equals("display", StringComparison.OrdinalIgnoreCase)
|
||||
|| d.Group.Equals("projector", StringComparison.OrdinalIgnoreCase))
|
||||
.Select(dd => dd.Key);
|
||||
Debug.Console(1, "#################### Config has {0} displays", devKeys.Count());
|
||||
var disps = DeviceManager.AllDevices.Where(d =>
|
||||
devKeys.Contains(d.Key));
|
||||
Debug.Console(1, "#################### Devices has {0} displays", disps.Count());
|
||||
ushort i = 0;
|
||||
foreach (var disp in disps)
|
||||
{
|
||||
var display = disp as DisplayBase;
|
||||
if (display != null)
|
||||
{
|
||||
i++;
|
||||
DisplayList.StringInputSig(i, 1).StringValue = display.Name;
|
||||
DisplayList.GetBoolFeedbackSig(i, 1).SetSigFalseAction(display.PowerOn);
|
||||
DisplayList.GetBoolFeedbackSig(i, 2).SetSigFalseAction(display.PowerOff);
|
||||
DisplayList.GetBoolFeedbackSig(i, 3).SetSigFalseAction(() =>
|
||||
{ if (display is IInputHdmi1) (display as IInputHdmi1).InputHdmi1(); });
|
||||
DisplayList.GetBoolFeedbackSig(i, 4).SetSigFalseAction(() =>
|
||||
{ if (display is IInputHdmi2) (display as IInputHdmi2).InputHdmi2(); });
|
||||
DisplayList.GetBoolFeedbackSig(i, 5).SetSigFalseAction(() =>
|
||||
{ if (display is IInputHdmi3) (display as IInputHdmi3).InputHdmi3(); });
|
||||
DisplayList.GetBoolFeedbackSig(i, 6).SetSigFalseAction(() =>
|
||||
{ if (display is IInputHdmi4) (display as IInputHdmi4).InputHdmi4(); });
|
||||
DisplayList.GetBoolFeedbackSig(i, 7).SetSigFalseAction(() =>
|
||||
{ if (display is IInputDisplayPort1) (display as IInputDisplayPort1).InputDisplayPort1(); });
|
||||
}
|
||||
}
|
||||
|
||||
DisplayList.Count = i;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
|
||||
@@ -10,6 +10,7 @@ using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.SmartObjects;
|
||||
using PepperDash.Essentials.Core.PageManagers;
|
||||
using PepperDash.Essentials.Room.Config;
|
||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
@@ -85,6 +86,16 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
SubpageReferenceList ActivityFooterSrl;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
SubpageReferenceList MeetingsSrl;
|
||||
|
||||
/// <summary>
|
||||
/// The list of buttons on the header. Managed with visibility only
|
||||
/// </summary>
|
||||
SmartObjectHeaderButtonList HeaderButtonsList;
|
||||
|
||||
/// <summary>
|
||||
/// The AV page mangagers that have been used, to keep them alive for later
|
||||
/// </summary>
|
||||
@@ -139,7 +150,8 @@ namespace PepperDash.Essentials
|
||||
get
|
||||
{
|
||||
if (_TechDriver == null)
|
||||
_TechDriver = new PepperDash.Essentials.UIDrivers.EssentialsHuddleTechPageDriver(TriList, this);
|
||||
#warning Make PIN come from config!
|
||||
_TechDriver = new PepperDash.Essentials.UIDrivers.EssentialsHuddleTechPageDriver(TriList, this, "1234");
|
||||
return _TechDriver;
|
||||
}
|
||||
}
|
||||
@@ -182,6 +194,12 @@ namespace PepperDash.Essentials
|
||||
ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
|
||||
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1);
|
||||
|
||||
MeetingsSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
|
||||
|
||||
|
||||
// buttons are added in SetCurrentRoom
|
||||
HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
|
||||
|
||||
SetupActivityFooterWhenRoomOff();
|
||||
|
||||
ShowVolumeGauge = true;
|
||||
@@ -213,7 +231,7 @@ namespace PepperDash.Essentials
|
||||
if (Config.HeaderStyle == UiHeaderStyle.Habanero)
|
||||
{
|
||||
TriList.SetString(UIStringJoin.CurrentRoomName, CurrentRoom.Name);
|
||||
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible));
|
||||
}
|
||||
else if (Config.HeaderStyle == UiHeaderStyle.Verbose)
|
||||
@@ -234,7 +252,9 @@ namespace PepperDash.Essentials
|
||||
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
|
||||
TriList.SetBool(UIBoolJoin.DateOnlyVisible, Config.ShowDate && !Config.ShowTime);
|
||||
TriList.SetBool(UIBoolJoin.TimeOnlyVisible, !Config.ShowDate && Config.ShowTime);
|
||||
TriList.SetBool(UIBoolJoin.TopBarHabaneroVisible, true);
|
||||
|
||||
TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, true);
|
||||
|
||||
TriList.SetBool(UIBoolJoin.ActivityFooterVisible, true);
|
||||
|
||||
// Privacy mute button
|
||||
@@ -258,60 +278,47 @@ namespace PepperDash.Essentials
|
||||
// Generic "close" button for these modals
|
||||
TriList.SetSigFalseAction(UIBoolJoin.InterlockedModalClosePress, PopupInterlock.HideAndClear);
|
||||
|
||||
// Help button and popup
|
||||
if (CurrentRoom.Config.Help != null)
|
||||
{
|
||||
TriList.SetString(UIStringJoin.HelpMessage, roomConf.Help.Message);
|
||||
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, roomConf.Help.ShowCallButton);
|
||||
TriList.SetString(UIStringJoin.HelpPageCallButtonText, roomConf.Help.CallButtonText);
|
||||
if(roomConf.Help.ShowCallButton)
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HelpPageShowCallButtonPress, () => { }); // ************ FILL IN
|
||||
else
|
||||
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
}
|
||||
else // older config
|
||||
{
|
||||
TriList.SetString(UIStringJoin.HelpMessage, CurrentRoom.Config.HelpMessage);
|
||||
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, false);
|
||||
TriList.SetString(UIStringJoin.HelpPageCallButtonText, null);
|
||||
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
}
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () =>
|
||||
{
|
||||
string message = null;
|
||||
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
||||
as EssentialsHuddleSpaceRoom;
|
||||
if (room != null)
|
||||
message = room.Config.HelpMessage;
|
||||
else
|
||||
message = "Sorry, no help message available. No room connected.";
|
||||
//TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HelpPageVisible);
|
||||
});
|
||||
//// Help button and popup
|
||||
//if (CurrentRoom.Config.Help != null)
|
||||
//{
|
||||
// TriList.SetString(UIStringJoin.HelpMessage, roomConf.Help.Message);
|
||||
// TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, roomConf.Help.ShowCallButton);
|
||||
// TriList.SetString(UIStringJoin.HelpPageCallButtonText, roomConf.Help.CallButtonText);
|
||||
// if(roomConf.Help.ShowCallButton)
|
||||
// TriList.SetSigFalseAction(UIBoolJoin.HelpPageShowCallButtonPress, () => { }); // ************ FILL IN
|
||||
// else
|
||||
// TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
//}
|
||||
//else // older config
|
||||
//{
|
||||
// TriList.SetString(UIStringJoin.HelpMessage, CurrentRoom.Config.HelpMessage);
|
||||
// TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, false);
|
||||
// TriList.SetString(UIStringJoin.HelpPageCallButtonText, null);
|
||||
// TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
//}
|
||||
//TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () =>
|
||||
//{
|
||||
// string message = null;
|
||||
// var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
||||
// as EssentialsHuddleSpaceRoom;
|
||||
// if (room != null)
|
||||
// message = room.Config.HelpMessage;
|
||||
// else
|
||||
// message = "Sorry, no help message available. No room connected.";
|
||||
// //TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
|
||||
// PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HelpPageVisible);
|
||||
//});
|
||||
|
||||
// Lights button
|
||||
TriList.SetSigFalseAction(UIBoolJoin.LightsHeaderButtonPress, () => // ******************** FILL IN
|
||||
{ });
|
||||
//// Lights button
|
||||
//TriList.SetSigFalseAction(UIBoolJoin.HeaderLightsButtonPress, () => // ******************** FILL IN
|
||||
// { });
|
||||
|
||||
// Call header button
|
||||
if(roomConf.OneButtonMeeting != null && roomConf.OneButtonMeeting.Enable)
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.CalendarHeaderButtonVisible, true);
|
||||
TriList.SetBool(UIBoolJoin.CallLeftHeaderButtonVisible, true);
|
||||
}
|
||||
else
|
||||
TriList.SetBool(UIBoolJoin.CallRightHeaderButtonVisible, true);
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.CallHeaderButtonPress, () =>
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible));
|
||||
|
||||
|
||||
// Setup button - shows volumes with default button OR hold for tech page
|
||||
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
||||
ShowTech,
|
||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
|
||||
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||
PopupInterlock.HideAndClear());
|
||||
//// Setup button - shows volumes with default button OR hold for tech page
|
||||
//TriList.SetSigHeldAction(UIBoolJoin.HeaderGearButtonPress, 2000,
|
||||
// ShowTech,
|
||||
// () => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
|
||||
//TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||
// PopupInterlock.HideAndClear());
|
||||
|
||||
// Volume related things
|
||||
TriList.SetSigFalseAction(UIBoolJoin.VolumeDefaultPress, () => CurrentRoom.SetDefaultLevels());
|
||||
@@ -369,7 +376,7 @@ namespace PepperDash.Essentials
|
||||
public override void Hide()
|
||||
{
|
||||
HideAndClearCurrentDisplayModeSigsInUse();
|
||||
TriList.BooleanInput[UIBoolJoin.TopBarHabaneroVisible].BoolValue = false;
|
||||
TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, false);
|
||||
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
|
||||
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
|
||||
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
|
||||
@@ -410,6 +417,15 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calendar should only be visible when it's supposed to
|
||||
/// </summary>
|
||||
void CalendarPress()
|
||||
{
|
||||
RefreshMeetingsList();
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.MeetingsListVisible);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reveals the tech page and puts away anything that's in the way.
|
||||
/// </summary>
|
||||
@@ -774,7 +790,7 @@ namespace PepperDash.Essentials
|
||||
_CurrentRoom.ShutdownPromptTimer.HasFinished += ShutdownPromptTimer_HasFinished;
|
||||
_CurrentRoom.ShutdownPromptTimer.WasCancelled += ShutdownPromptTimer_WasCancelled;
|
||||
|
||||
// Link up all the change events from the room
|
||||
// Link up all the change events from the room
|
||||
_CurrentRoom.OnFeedback.OutputChange += CurrentRoom_OnFeedback_OutputChange;
|
||||
CurrentRoom_SyncOnFeedback();
|
||||
_CurrentRoom.IsWarmingUpFeedback.OutputChange += CurrentRoom_IsWarmingFeedback_OutputChange;
|
||||
@@ -784,6 +800,8 @@ namespace PepperDash.Essentials
|
||||
RefreshAudioDeviceConnections();
|
||||
_CurrentRoom.CurrentSingleSourceChange += CurrentRoom_SourceInfoChange;
|
||||
RefreshSourceInfo();
|
||||
|
||||
SetupHeaderButtons();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -792,10 +810,120 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For room on/off changes
|
||||
/// </summary>
|
||||
void CurrentRoom_OnFeedback_OutputChange(object sender, EventArgs e)
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
void SetupHeaderButtons()
|
||||
{
|
||||
TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, true);
|
||||
|
||||
var roomConf = CurrentRoom.Config;
|
||||
//
|
||||
var setupButton = new HeaderListButton(HeaderButtonsList, 5);
|
||||
setupButton.SetIcon(HeaderListButton.Gear);
|
||||
setupButton.OutputSig.SetSigHeldAction(2000,
|
||||
ShowTech,
|
||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
|
||||
|
||||
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||
PopupInterlock.HideAndClear());
|
||||
|
||||
// Help button and popup
|
||||
if (CurrentRoom.Config.Help != null)
|
||||
{
|
||||
TriList.SetString(UIStringJoin.HelpMessage, roomConf.Help.Message);
|
||||
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, roomConf.Help.ShowCallButton);
|
||||
TriList.SetString(UIStringJoin.HelpPageCallButtonText, roomConf.Help.CallButtonText);
|
||||
if (roomConf.Help.ShowCallButton)
|
||||
TriList.SetSigFalseAction(UIBoolJoin.HelpPageShowCallButtonPress, () => { }); // ************ FILL IN
|
||||
else
|
||||
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
}
|
||||
else // older config
|
||||
{
|
||||
TriList.SetString(UIStringJoin.HelpMessage, CurrentRoom.Config.HelpMessage);
|
||||
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, false);
|
||||
TriList.SetString(UIStringJoin.HelpPageCallButtonText, null);
|
||||
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
|
||||
}
|
||||
var helpButton = new HeaderListButton(HeaderButtonsList, 4);
|
||||
helpButton.SetIcon(HeaderListButton.Help);
|
||||
helpButton.OutputSig.SetSigFalseAction(() =>
|
||||
{
|
||||
string message = null;
|
||||
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
||||
as EssentialsHuddleSpaceRoom;
|
||||
if (room != null)
|
||||
message = room.Config.HelpMessage;
|
||||
else
|
||||
message = "Sorry, no help message available. No room connected.";
|
||||
//TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HelpPageVisible);
|
||||
});
|
||||
uint nextIndex = 3;
|
||||
|
||||
// Lights button
|
||||
//if (WHATEVER MAKES LIGHTS WORK)
|
||||
//{
|
||||
// // do lights
|
||||
// nextIndex--;
|
||||
//}
|
||||
|
||||
// Calendar button
|
||||
if (_CurrentRoom.ScheduleSource != null) // ******************* Do we need a config option here as well?
|
||||
{
|
||||
var calBut = new HeaderListButton(HeaderButtonsList, nextIndex);
|
||||
calBut.SetIcon(HeaderListButton.Calendar);
|
||||
calBut.OutputSig.SetSigFalseAction(CalendarPress);
|
||||
nextIndex--;
|
||||
}
|
||||
|
||||
// Call button
|
||||
var callBut = new HeaderListButton(HeaderButtonsList, nextIndex);
|
||||
callBut.SetIcon(HeaderListButton.OnHook);
|
||||
callBut.OutputSig.SetSigFalseAction(() =>
|
||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible));
|
||||
nextIndex--;
|
||||
|
||||
// blank any that remain
|
||||
for (var i = nextIndex; i > 0; i--)
|
||||
{
|
||||
var blankBut = new HeaderListButton(HeaderButtonsList, i);
|
||||
blankBut.ClearIcon();
|
||||
blankBut.OutputSig.SetSigFalseAction(() => { });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
void RefreshMeetingsList()
|
||||
{
|
||||
ushort i = 0;
|
||||
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
||||
{
|
||||
i++;
|
||||
MeetingsSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToShortTimeString();
|
||||
MeetingsSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToShortTimeString();
|
||||
MeetingsSrl.StringInputSig(i, 3).StringValue = m.Title;
|
||||
MeetingsSrl.StringInputSig(i, 4).StringValue = "Join";
|
||||
MeetingsSrl.BoolInputSig(i, 2).BoolValue = m.Joinable;
|
||||
var mm = m; // lambda scope
|
||||
MeetingsSrl.GetBoolFeedbackSig(i, 1).SetSigFalseAction(() =>
|
||||
{
|
||||
PopupInterlock.Hide();
|
||||
var d = CurrentRoom.ScheduleSource as VideoCodecBase;
|
||||
if (d != null)
|
||||
d.Dial(mm.ConferenceNumberToDial);
|
||||
});
|
||||
}
|
||||
MeetingsSrl.Count = i;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// For room on/off changes
|
||||
/// </summary>
|
||||
void CurrentRoom_OnFeedback_OutputChange(object sender, EventArgs e)
|
||||
{
|
||||
CurrentRoom_SyncOnFeedback();
|
||||
}
|
||||
|
||||
@@ -47,17 +47,19 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
/// <summary>
|
||||
/// For the different staging bars: Active, inactive
|
||||
/// </summary>
|
||||
JoinedSigInterlock StagingBarInterlock;
|
||||
JoinedSigInterlock StagingBarsInterlock;
|
||||
|
||||
/// <summary>
|
||||
/// For the staging button feedbacks
|
||||
/// </summary>
|
||||
JoinedSigInterlock StagingButtonFeedbackInterlock;
|
||||
JoinedSigInterlock StagingButtonsFeedbackInterlock;
|
||||
|
||||
SmartObjectNumeric DialKeypad;
|
||||
|
||||
SubpageReferenceList ActiveCallsSRL;
|
||||
|
||||
SmartObjectDynamicList RecentCallsList;
|
||||
|
||||
// These are likely temp until we get a keyboard built
|
||||
StringFeedback DialStringFeedback;
|
||||
StringBuilder DialStringBuilder = new StringBuilder();
|
||||
@@ -82,6 +84,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
SetupCallStagingPopover();
|
||||
SetupDialKeypad();
|
||||
ActiveCallsSRL = new SubpageReferenceList(TriList, UISmartObjectJoin.CodecActiveCallsHeaderList, 3, 3, 3);
|
||||
SetupRecentCallsList();
|
||||
|
||||
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange);
|
||||
|
||||
@@ -97,11 +100,11 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
VCControlsInterlock = new JoinedSigInterlock(triList);
|
||||
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCKeypadVisible);
|
||||
|
||||
StagingBarInterlock = new JoinedSigInterlock(triList);
|
||||
StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
|
||||
StagingBarsInterlock = new JoinedSigInterlock(triList);
|
||||
StagingBarsInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
|
||||
|
||||
StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList);
|
||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
|
||||
StagingButtonsFeedbackInterlock = new JoinedSigInterlock(triList);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||
|
||||
// Return formatted when dialing, straight digits when in call
|
||||
DialStringFeedback = new StringFeedback(() =>
|
||||
@@ -153,6 +156,8 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
DialStringFeedback.FireUpdate();
|
||||
TriList.SetBool(UIBoolJoin.VCKeypadBackspaceVisible, false);
|
||||
Parent.ShowNotificationRibbon("Connected", 2000);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
|
||||
break;
|
||||
case eCodecCallStatus.Connecting:
|
||||
// fire at SRL item
|
||||
@@ -196,7 +201,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
break;
|
||||
}
|
||||
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(Codec.IsInCall ? 1 : 0);
|
||||
StagingBarInterlock.ShowInterlocked(Codec.IsInCall ?
|
||||
StagingBarsInterlock.ShowInterlocked(Codec.IsInCall ?
|
||||
UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
|
||||
|
||||
// Set mode of header button
|
||||
@@ -268,7 +273,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
public override void Show()
|
||||
{
|
||||
VCControlsInterlock.Show();
|
||||
StagingBarInterlock.Show();
|
||||
StagingBarsInterlock.Show();
|
||||
DialStringFeedback.FireUpdate();
|
||||
base.Show();
|
||||
}
|
||||
@@ -279,7 +284,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
public override void Hide()
|
||||
{
|
||||
VCControlsInterlock.Hide();
|
||||
StagingBarInterlock.Hide();
|
||||
StagingBarsInterlock.Hide();
|
||||
base.Hide();
|
||||
}
|
||||
|
||||
@@ -333,6 +338,41 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
TriList.ID, UISmartObjectJoin.VCDialKeypad);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
void SetupRecentCallsList()
|
||||
{
|
||||
var codec = Codec as IHasCallHistory;
|
||||
codec.CallHistory.RecentCallsListHasChanged += (o, a) => RefreshRecentCallsList();
|
||||
if (codec != null)
|
||||
{
|
||||
// EVENT??????????????? Pointed at refresh
|
||||
RefreshRecentCallsList();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
void RefreshRecentCallsList()
|
||||
{
|
||||
var codec = Codec as IHasCallHistory;
|
||||
if (codec != null)
|
||||
{
|
||||
RecentCallsList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCRecentsList], true, 1200);
|
||||
ushort i = 0;
|
||||
foreach (var c in codec.CallHistory.RecentCalls)
|
||||
{
|
||||
i++;
|
||||
RecentCallsList.SetItemMainText(i, c.Name);
|
||||
var call = c; // for lambda scope
|
||||
RecentCallsList.SetItemButtonAction(i, b => { if(!b) Codec.Dial(call.Number); });
|
||||
}
|
||||
RecentCallsList.Count = i;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -384,28 +424,28 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
||||
void ShowCameraControls()
|
||||
{
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible);
|
||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
|
||||
}
|
||||
|
||||
void ShowKeypad()
|
||||
{
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
|
||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||
}
|
||||
|
||||
void ShowDirectory()
|
||||
{
|
||||
// populate directory
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
|
||||
|
||||
}
|
||||
|
||||
void ShowRecents()
|
||||
{
|
||||
//populate recents
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
|
||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -17,3 +17,5 @@ devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingAudioCall", "params
|
||||
devjson:1 {"deviceKey":"mockVc-1", "methodName":"TestIncomingVideoCall", "params": ["444-444-4444"]}
|
||||
|
||||
devjson:1 {"deviceKey":"mockVc-1", "methodName":"ListCalls"}
|
||||
|
||||
devjson:1 {"deviceKey":"room1-emergency", "methodName":"RunEmergencyBehavior"}
|
||||
Reference in New Issue
Block a user