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:
Neil Dorin
2017-10-03 15:09:31 -06:00
25 changed files with 818 additions and 223 deletions

View File

@@ -73,6 +73,40 @@ namespace PepperDash.Essentials.Core
return SetSigHeldAction(tl, sigNum, heldMs, heldAction, null); 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> /// <summary>
/// Sets an action to a held sig as well as a released-without-hold action /// 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> /// <returns>The sig</returns>
public static BoolOutputSig SetSigHeldAction(this BasicTriList tl, uint sigNum, uint heldMs, Action heldAction, Action releaseAction) public static BoolOutputSig SetSigHeldAction(this BasicTriList tl, uint sigNum, uint heldMs, Action heldAction, Action releaseAction)
{ {
CTimer heldTimer = null; return tl.BooleanOutput[sigNum].SetSigHeldAction(heldMs, heldAction, releaseAction);
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();
}
});
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

View File

@@ -6,15 +6,6 @@ using Crestron.SimplSharp;
namespace PepperDash.Essentials.Devices.Common.Codec namespace PepperDash.Essentials.Devices.Common.Codec
{ {
public enum eMeetingEventChangeType
{
Unkown = 0,
MeetingStartWarning,
MeetingStart,
MeetingEndWarning,
MeetingEnd
}
public interface IHasScheduleAwareness public interface IHasScheduleAwareness
{ {
CodecScheduleAwareness CodecSchedule { get; } CodecScheduleAwareness CodecSchedule { get; }
@@ -22,52 +13,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
public class CodecScheduleAwareness public class CodecScheduleAwareness
{ {
public event EventHandler<MeetingEventArgs> MeetingEventChange;
public event EventHandler<EventArgs> MeetingsListHasChanged;
public List<Meeting> Meetings { get; set; } public List<Meeting> Meetings { get; set; }
private CTimer ScheduleChecker;
public CodecScheduleAwareness() public CodecScheduleAwareness()
{ {
Meetings = new List<Meeting>(); 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> /// </summary>
public class Meeting public class Meeting
{ {
public TimeSpan MeetingWarningMinutes = TimeSpan.FromMinutes(5);
public string Id { get; set; } public string Id { get; set; }
public string Organizer { get; set; } public string Organizer { get; set; }
public string Title { get; set; } public string Title { get; set; }
public string Agenda { 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 StartTime { get; set; }
public DateTime EndTime { get; set; } public DateTime EndTime { get; set; }
public TimeSpan Duration public TimeSpan Duration
@@ -109,20 +44,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
{ {
get get
{ {
// Meeting is joinable from 5 minutes before start until 5 minutes before end return StartTime.AddMinutes(-5) <= DateTime.Now
if (TimeToMeetingStart.TotalMinutes <= MeetingWarningMinutes.TotalMinutes && TimeToMeetingEnd.TotalMinutes >= MeetingWarningMinutes.TotalMinutes) && DateTime.Now <= EndTime.AddMinutes(-5);
return true;
else
return false;
} }
} }
public string ConferenceNumberToDial { get; set; } public string ConferenceNumberToDial { get; set; }
public string ConferencePassword { get; set; } public string ConferencePassword { get; set; }
} }
public class MeetingEventArgs : EventArgs
{
public eMeetingEventChangeType ChangeType { get; set; }
public Meeting Meeting { get; set; }
}
} }

View File

@@ -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(); }
}

View File

@@ -14,7 +14,8 @@ namespace PepperDash.Essentials.Devices.Displays
/// <summary> /// <summary>
/// ///
/// </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; } public IBasicCommunication Communication { get; private set; }

View File

@@ -116,6 +116,7 @@
<Compile Include="Codec\iHasScheduleAwareness.cs" /> <Compile Include="Codec\iHasScheduleAwareness.cs" />
<Compile Include="Crestron\Gateways\CenRfgwController.cs" /> <Compile Include="Crestron\Gateways\CenRfgwController.cs" />
<Compile Include="Display\ComTcpDisplayBase.cs" /> <Compile Include="Display\ComTcpDisplayBase.cs" />
<Compile Include="Display\InputInterfaces.cs" />
<Compile Include="Display\SamsungMDCDisplay.cs" /> <Compile Include="Display\SamsungMDCDisplay.cs" />
<Compile Include="Display\DeviceFactory.cs" /> <Compile Include="Display\DeviceFactory.cs" />
<Compile Include="Display\NecPaSeriesProjector.cs" /> <Compile Include="Display\NecPaSeriesProjector.cs" />

View File

@@ -262,13 +262,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
HdmiIn1 = new RoutingInputPort(RoutingPortNames.HdmiIn1, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource1), this); HdmiIn1 = new RoutingInputPort(RoutingPortNames.HdmiIn1, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource1), this);
HdmiIn2 = new RoutingInputPort(RoutingPortNames.HdmiIn2, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource2), this); HdmiIn2 = new RoutingInputPort(RoutingPortNames.HdmiIn2, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource2), this);
HdmiOut = new RoutingOutputPort(RoutingPortNames.HdmiOut, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, null, this); HdmiOut = new RoutingOutputPort(RoutingPortNames.HdmiOut, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, null, this);
InputPorts.Add(CodecOsdIn); InputPorts.Add(CodecOsdIn);
InputPorts.Add(HdmiIn1); InputPorts.Add(HdmiIn1);
InputPorts.Add(HdmiIn2); InputPorts.Add(HdmiIn2);
OutputPorts.Add(HdmiOut); OutputPorts.Add(HdmiOut);
string prefix = "xFeedback register "; string prefix = "xFeedback register ";

View File

@@ -11,7 +11,7 @@ using PepperDash.Essentials.Devices.Common.Codec;
namespace PepperDash.Essentials.Devices.Common.VideoCodec 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 CodecOsdIn { get; private set; }
public RoutingInputPort HdmiIn1 { get; private set; } public RoutingInputPort HdmiIn1 { get; private set; }
@@ -43,6 +43,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
InputPorts.Add(HdmiIn2); InputPorts.Add(HdmiIn2);
OutputPorts.Add(HdmiOut); 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(); SetIsReady();
} }
@@ -302,7 +312,39 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
Debug.Console(1, this, "TestFarEndHangup"); 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> /// <summary>
/// Implementation for the mock VC /// Implementation for the mock VC

View File

@@ -144,6 +144,7 @@
<Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" /> <Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" /> <Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" /> <Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsRoomEmergencyConfig.cs" />
<Compile Include="Room\Cotija\CotijaConfig.cs" /> <Compile Include="Room\Cotija\CotijaConfig.cs" />
<Compile Include="Room\Cotija\CotijaRoomBridge.cs" /> <Compile Include="Room\Cotija\CotijaRoomBridge.cs" />
<Compile Include="Room\Cotija\DeviceTypeInterfaces\IChannelExtensions.cs" /> <Compile Include="Room\Cotija\DeviceTypeInterfaces\IChannelExtensions.cs" />
@@ -154,6 +155,7 @@
<Compile Include="Room\Cotija\DeviceTypeInterfaces\IPowerExtensions.cs" /> <Compile Include="Room\Cotija\DeviceTypeInterfaces\IPowerExtensions.cs" />
<Compile Include="Room\Cotija\DeviceTypeInterfaces\ISetTopBoxControlsExtensions.cs" /> <Compile Include="Room\Cotija\DeviceTypeInterfaces\ISetTopBoxControlsExtensions.cs" />
<Compile Include="Room\Cotija\DeviceTypeInterfaces\ITransportExtensions.cs" /> <Compile Include="Room\Cotija\DeviceTypeInterfaces\ITransportExtensions.cs" />
<Compile Include="Room\Emergency\EsentialsRoomEmergencyContactClosure.cs" />
<Compile Include="Room\Types\EssentialsHuddleVtc1Room.cs" /> <Compile Include="Room\Types\EssentialsHuddleVtc1Room.cs" />
<Compile Include="Room\Types\EssentialsPresentationRoom.cs" /> <Compile Include="Room\Types\EssentialsPresentationRoom.cs" />
<Compile Include="Room\Types\EssentialsRoomBase.cs" /> <Compile Include="Room\Types\EssentialsRoomBase.cs" />
@@ -168,6 +170,7 @@
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" /> <Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddleTechPageDriver.cs" /> <Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddleTechPageDriver.cs" />
<Compile Include="UI\HttpLogoServer.cs" /> <Compile Include="UI\HttpLogoServer.cs" />
<Compile Include="UI\SmartObjectHeaderButtonList.cs" />
<Compile Include="UI\SubpageReferenceListCallStagingItem.cs" /> <Compile Include="UI\SubpageReferenceListCallStagingItem.cs" />
<Compile Include="UIDrivers\VC\EssentialsVideoCodecUiDriver.cs" /> <Compile Include="UIDrivers\VC\EssentialsVideoCodecUiDriver.cs" />
<Compile Include="UIDrivers\JoinedSigInterlock.cs" /> <Compile Include="UIDrivers\JoinedSigInterlock.cs" />

View File

@@ -69,11 +69,30 @@ namespace PepperDash.Essentials.Room.Config
rm.DefaultSourceItem = props.DefaultSourceItem; rm.DefaultSourceItem = props.DefaultSourceItem;
rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100); rm.DefaultVolume = (ushort)(props.Volumes.Master.Level * 65535 / 100);
rm.Emergency = GetEmergency(props, rm); // Get emergency object, if any
return rm; return rm;
} }
return null; 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> /// <summary>
@@ -81,6 +100,7 @@ namespace PepperDash.Essentials.Room.Config
/// </summary> /// </summary>
public class EssentialsRoomPropertiesConfig public class EssentialsRoomPropertiesConfig
{ {
public EssentialsRoomEmergencyConfig Emergency { get; set; }
public string HelpMessage { get; set; } public string HelpMessage { get; set; }
public string Description { get; set; } public string Description { get; set; }
public int ShutdownVacancySeconds { get; set; } public int ShutdownVacancySeconds { get; set; }

View File

@@ -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; }
}
}

View File

@@ -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();
}
}
}

View File

@@ -182,7 +182,13 @@ namespace PepperDash.Essentials
/// <summary> /// <summary>
/// "codecOsd" /// "codecOsd"
/// </summary> /// </summary>
public string DefaultCodecRouteString { get { return "codecOsd"; } } 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; CurrentSourceInfo = null;
OnFeedback.FireUpdate(); OnFeedback.FireUpdate();
} }
if (disp.PowerIsOnFeedback.BoolValue)
{
SetDefaultLevels();
}
}; };
disp.IsWarmingUpFeedback.OutputChange += (o, a) => disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
@@ -291,9 +301,9 @@ namespace PepperDash.Essentials
/// route or commands /// route or commands
/// </summary> /// </summary>
/// <param name="name"></param> /// <param name="name"></param>
public void RunRouteAction(string routeKey, Action successCallback) public void RunRouteAction(string routeKey, Action successCallback)
{ {
// Run this on a separate thread // Run this on a separate thread
new CTimer(o => new CTimer(o =>
{ {
try try
@@ -336,7 +346,10 @@ namespace PepperDash.Essentials
// Let's run it // Let's run it
var item = dict[routeKey]; var item = dict[routeKey];
if (routeKey.ToLower() != "roomoff") if (routeKey.ToLower() != "roomoff")
{
LastSourceKey = routeKey; LastSourceKey = routeKey;
}
else else
CurrentSourceInfoKey = null; CurrentSourceInfoKey = null;
@@ -375,17 +388,6 @@ namespace PepperDash.Essentials
} }
}, 0); // end of CTimer }, 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> /// <summary>
@@ -450,7 +452,17 @@ namespace PepperDash.Essentials
} }
return true; 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> /// <summary>
/// Will power the room on with the last-used source /// Will power the room on with the last-used source
/// </summary> /// </summary>

View File

@@ -45,6 +45,8 @@ namespace PepperDash.Essentials
public int ShutdownVacancySeconds { get; set; } public int ShutdownVacancySeconds { get; set; }
public ShutdownType ShutdownType { get; private set; } public ShutdownType ShutdownType { get; private set; }
public PepperDash.Essentials.Room.EssentialsRoomEmergencyBase Emergency { get; set; }
public string LogoUrl { get; set; } public string LogoUrl { get; set; }
/// <summary> /// <summary>

View File

@@ -346,6 +346,9 @@ namespace PepperDash.Essentials
/// 12345 /// 12345
/// </summary> /// </summary>
public const uint AvNoControlsSubVisible = 12345; public const uint AvNoControlsSubVisible = 12345;
// 10000 - 14999 are general "source" pages
/// <summary> /// <summary>
/// 15001 /// 15001
/// </summary> /// </summary>
@@ -402,6 +405,10 @@ namespace PepperDash.Essentials
/// 15017 /// 15017
/// </summary> /// </summary>
public const uint StagingPageAdditionalArrowsVisible = 15017; public const uint StagingPageAdditionalArrowsVisible = 15017;
/// <summary>
/// 15018 The Header with dynamic buttons
/// </summary>
public const uint TopBarHabaneroDynamicVisible = 15018;
/// <summary> /// <summary>
/// 15020 /// 15020
/// </summary> /// </summary>
@@ -417,31 +424,31 @@ namespace PepperDash.Essentials
/// <summary> /// <summary>
/// 15023 /// 15023
/// </summary> /// </summary>
public const uint LightsHeaderButtonVisible = 15023; public const uint HeaderLightsButtonVisible = 15023;
/// <summary> /// <summary>
/// 15024 /// 15024
/// </summary> /// </summary>
public const uint CallRightHeaderButtonVisible = 15024; public const uint HeaderCallRightButtonVisible = 15024;
/// <summary> /// <summary>
/// 15025 /// 15025
/// </summary> /// </summary>
public const uint CallLeftHeaderButtonVisible = 15025; public const uint HeaderCallLeftButtonVisible = 15025;
/// <summary> /// <summary>
/// 15026 /// 15026
/// </summary> /// </summary>
public const uint LightsHeaderButtonPress = 15026; public const uint HeaderLightsButtonPress = 15026;
/// <summary>[- /// <summary>[-
/// 15027 /// 15027
/// </summary> /// </summary>
public const uint CallHeaderButtonPress = 15027; public const uint HeaderCallButtonPress = 15027;
/// <summary> /// <summary>
/// 15028 The gear button in header /// 15028 The gear button in header
/// </summary> /// </summary>
public const uint GearHeaderButtonPress = 15028; public const uint HeaderGearButtonPress = 15028;
/// <summary> /// <summary>
/// 15029 the room button in header /// 15029 the room button in header
/// </summary> /// </summary>
public const uint RoomHeaderButtonPress = 15029; public const uint HeaderRoomButtonPress = 15029;
/// <summary> /// <summary>
/// 15030 Visibility for room data popup /// 15030 Visibility for room data popup
/// </summary> /// </summary>
@@ -510,6 +517,10 @@ namespace PepperDash.Essentials
/// 15045 - Visibility for the bar containing call navigation button list /// 15045 - Visibility for the bar containing call navigation button list
/// </summary> /// </summary>
public const uint CallStagingBarVisible = 15045; public const uint CallStagingBarVisible = 15045;
/// <summary>
/// 15046
/// </summary>
public const uint MeetingsListVisible = 15046;
/// <summary> /// <summary>
/// 15051 /// 15051
/// </summary> /// </summary>
@@ -610,5 +621,36 @@ namespace PepperDash.Essentials
/// 15091 /// 15091
/// </summary> /// </summary>
public const uint SetupFullDistrib = 15091; 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;
} }
} }

View File

@@ -16,7 +16,19 @@
/// </summary> /// </summary>
public const uint VCDialKeypad = 1201; public const uint VCDialKeypad = 1201;
/// <summary>
/// 1202
/// </summary>
public const uint VCDirectoryList = 1202; public const uint VCDirectoryList = 1202;
/// <summary>
/// 1203
/// </summary>
public const uint VCRecentsList = 1203;
/// <summary>
/// 1204
/// </summary>
public const uint VCFavoritesList = 1204;
//****************************************************** //******************************************************
// General // General
@@ -26,10 +38,6 @@
/// </summary> /// </summary>
public const uint SourceStagingSRL = 3200; public const uint SourceStagingSRL = 3200;
/// <summary> /// <summary>
/// 15022 The main activity footer
/// </summary>
public const uint ActivityFooterSRL = 15022;
/// <summary>
/// 3901 The Tech page menu list /// 3901 The Tech page menu list
/// </summary> /// </summary>
public const uint TechMenuList = 3901; public const uint TechMenuList = 3901;
@@ -37,6 +45,25 @@
/// 3902 Tech page statuses /// 3902 Tech page statuses
/// </summary> /// </summary>
public const uint TechStatusList = 3902; 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;
} }
} }

View File

@@ -20,6 +20,11 @@ namespace PepperDash.Essentials
/// </summary> /// </summary>
public const uint CodecAddressEntryText = 1001; public const uint CodecAddressEntryText = 1001;
/// <summary>
/// 1201 - 1230 range of joins for recents list
/// </summary>
public const uint VCRecentListTextStart = 1201;
//****************************************************** //******************************************************
// Keyboard // Keyboard
@@ -106,6 +111,10 @@ namespace PepperDash.Essentials
/// 3915 /// 3915
/// </summary> /// </summary>
public const uint NotificationRibbonText = 3915; public const uint NotificationRibbonText = 3915;
/// <summary>
/// 3916 The "active call" label
/// </summary>
public const uint HeaderCallLabel = 3916;
/// <summary> /// <summary>
/// 3922 /// 3922

View File

@@ -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";
}
}

View File

@@ -218,7 +218,7 @@ namespace PepperDash.Essentials
// ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible)); // ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
// Setup button // Setup button
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000, TriList.SetSigHeldAction(UIBoolJoin.HeaderGearButtonPress, 2000,
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible));// ShowInterlockedModal(UIBoolJoin.TechPanelSetupVisible)); () => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible));// ShowInterlockedModal(UIBoolJoin.TechPanelSetupVisible));
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () => TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
PopupInterlock.HideAndClear()); // HideCurrentInterlockedModal()); PopupInterlock.HideAndClear()); // HideCurrentInterlockedModal());

View File

@@ -229,10 +229,10 @@ namespace PepperDash.Essentials
ShowInterlockedModal(UIBoolJoin.HelpPageVisible); ShowInterlockedModal(UIBoolJoin.HelpPageVisible);
}); });
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () => TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible)); ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () => TriList.SetSigFalseAction(UIBoolJoin.HeaderGearButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.VolumesPageVisible)); ShowInterlockedModal(UIBoolJoin.VolumesPageVisible));
// power-related functions // power-related functions

View File

@@ -11,6 +11,7 @@ using PepperDash.Essentials;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects; using PepperDash.Essentials.Core.SmartObjects;
using PepperDash.Essentials.Core.Touchpanels.Keyboards; using PepperDash.Essentials.Core.Touchpanels.Keyboards;
using PepperDash.Essentials.Devices.Displays;
namespace PepperDash.Essentials.UIDrivers namespace PepperDash.Essentials.UIDrivers
{ {
@@ -25,6 +26,10 @@ namespace PepperDash.Essentials.UIDrivers
/// </summary> /// </summary>
SubpageReferenceList StatusList; SubpageReferenceList StatusList;
/// <summary> /// <summary>
/// The list of display controls
/// </summary>
SubpageReferenceList DisplayList;
/// <summary>
/// References lines in the list against device instances /// References lines in the list against device instances
/// </summary> /// </summary>
Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes; Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes;
@@ -42,6 +47,16 @@ namespace PepperDash.Essentials.UIDrivers
/// </summary> /// </summary>
public const uint JoinText = 1; public const uint JoinText = 1;
CTimer PinAuthorizedTimer;
string Pin;
StringBuilder PinEntryBuilder = new StringBuilder(4);
bool IsAuthorized;
SmartObjectNumeric PinKeypad;
/// <summary> /// <summary>
@@ -49,10 +64,12 @@ namespace PepperDash.Essentials.UIDrivers
/// </summary> /// </summary>
/// <param name="trilist"></param> /// <param name="trilist"></param>
/// <param name="parent"></param> /// <param name="parent"></param>
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, IAVDriver parent) public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, IAVDriver parent, string pin)
: base(trilist) : base(trilist)
{ {
Parent = parent; Parent = parent;
Pin = pin;
PagesInterlock = new JoinedSigInterlock(trilist); PagesInterlock = new JoinedSigInterlock(trilist);
PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible); PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
@@ -83,6 +100,10 @@ namespace PepperDash.Essentials.UIDrivers
MenuList.Count = 3; MenuList.Count = 3;
BuildStatusList(); BuildStatusList();
BuildDisplayList();
SetupPinModal();
} }
/// <summary> /// <summary>
@@ -90,9 +111,21 @@ namespace PepperDash.Essentials.UIDrivers
/// </summary> /// </summary>
public override void Show() public override void Show()
{ {
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true); // divert to PIN if we need auth
PagesInterlock.Show(); if (IsAuthorized)
base.Show(); {
// 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> /// <summary>
@@ -100,11 +133,93 @@ namespace PepperDash.Essentials.UIDrivers
/// </summary> /// </summary>
public override void Hide() 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); TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
PagesInterlock.Hide(); PagesInterlock.Hide();
base.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>
/// ///
/// </summary> /// </summary>
@@ -131,6 +246,47 @@ namespace PepperDash.Essentials.UIDrivers
StatusList.Count = (ushort)i; 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>
/// ///
/// </summary> /// </summary>

View File

@@ -10,6 +10,7 @@ using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects; using PepperDash.Essentials.Core.SmartObjects;
using PepperDash.Essentials.Core.PageManagers; using PepperDash.Essentials.Core.PageManagers;
using PepperDash.Essentials.Room.Config; using PepperDash.Essentials.Room.Config;
using PepperDash.Essentials.Devices.Common.VideoCodec;
namespace PepperDash.Essentials namespace PepperDash.Essentials
{ {
@@ -85,6 +86,16 @@ namespace PepperDash.Essentials
/// </summary> /// </summary>
SubpageReferenceList ActivityFooterSrl; SubpageReferenceList ActivityFooterSrl;
/// <summary>
///
/// </summary>
SubpageReferenceList MeetingsSrl;
/// <summary>
/// The list of buttons on the header. Managed with visibility only
/// </summary>
SmartObjectHeaderButtonList HeaderButtonsList;
/// <summary> /// <summary>
/// The AV page mangagers that have been used, to keep them alive for later /// The AV page mangagers that have been used, to keep them alive for later
/// </summary> /// </summary>
@@ -139,7 +150,8 @@ namespace PepperDash.Essentials
get get
{ {
if (_TechDriver == null) 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; return _TechDriver;
} }
} }
@@ -182,6 +194,12 @@ namespace PepperDash.Essentials
ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1); ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 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(); SetupActivityFooterWhenRoomOff();
ShowVolumeGauge = true; ShowVolumeGauge = true;
@@ -213,7 +231,7 @@ namespace PepperDash.Essentials
if (Config.HeaderStyle == UiHeaderStyle.Habanero) if (Config.HeaderStyle == UiHeaderStyle.Habanero)
{ {
TriList.SetString(UIStringJoin.CurrentRoomName, CurrentRoom.Name); TriList.SetString(UIStringJoin.CurrentRoomName, CurrentRoom.Name);
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () => TriList.SetSigFalseAction(UIBoolJoin.HeaderRoomButtonPress, () =>
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible)); PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.RoomHeaderPageVisible));
} }
else if (Config.HeaderStyle == UiHeaderStyle.Verbose) else if (Config.HeaderStyle == UiHeaderStyle.Verbose)
@@ -234,7 +252,9 @@ namespace PepperDash.Essentials
TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime); TriList.SetBool(UIBoolJoin.DateAndTimeVisible, Config.ShowDate && Config.ShowTime);
TriList.SetBool(UIBoolJoin.DateOnlyVisible, Config.ShowDate && !Config.ShowTime); TriList.SetBool(UIBoolJoin.DateOnlyVisible, Config.ShowDate && !Config.ShowTime);
TriList.SetBool(UIBoolJoin.TimeOnlyVisible, !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); TriList.SetBool(UIBoolJoin.ActivityFooterVisible, true);
// Privacy mute button // Privacy mute button
@@ -258,60 +278,47 @@ namespace PepperDash.Essentials
// Generic "close" button for these modals // Generic "close" button for these modals
TriList.SetSigFalseAction(UIBoolJoin.InterlockedModalClosePress, PopupInterlock.HideAndClear); TriList.SetSigFalseAction(UIBoolJoin.InterlockedModalClosePress, PopupInterlock.HideAndClear);
// Help button and popup //// Help button and popup
if (CurrentRoom.Config.Help != null) //if (CurrentRoom.Config.Help != null)
{ //{
TriList.SetString(UIStringJoin.HelpMessage, roomConf.Help.Message); // TriList.SetString(UIStringJoin.HelpMessage, roomConf.Help.Message);
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, roomConf.Help.ShowCallButton); // TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, roomConf.Help.ShowCallButton);
TriList.SetString(UIStringJoin.HelpPageCallButtonText, roomConf.Help.CallButtonText); // TriList.SetString(UIStringJoin.HelpPageCallButtonText, roomConf.Help.CallButtonText);
if(roomConf.Help.ShowCallButton) // if(roomConf.Help.ShowCallButton)
TriList.SetSigFalseAction(UIBoolJoin.HelpPageShowCallButtonPress, () => { }); // ************ FILL IN // TriList.SetSigFalseAction(UIBoolJoin.HelpPageShowCallButtonPress, () => { }); // ************ FILL IN
else // else
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress); // TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
} //}
else // older config //else // older config
{ //{
TriList.SetString(UIStringJoin.HelpMessage, CurrentRoom.Config.HelpMessage); // TriList.SetString(UIStringJoin.HelpMessage, CurrentRoom.Config.HelpMessage);
TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, false); // TriList.SetBool(UIBoolJoin.HelpPageShowCallButtonVisible, false);
TriList.SetString(UIStringJoin.HelpPageCallButtonText, null); // TriList.SetString(UIStringJoin.HelpPageCallButtonText, null);
TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress); // TriList.ClearBoolSigAction(UIBoolJoin.HelpPageShowCallButtonPress);
} //}
TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () => //TriList.SetSigFalseAction(UIBoolJoin.HelpPress, () =>
{ //{
string message = null; // string message = null;
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey) // var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
as EssentialsHuddleSpaceRoom; // as EssentialsHuddleSpaceRoom;
if (room != null) // if (room != null)
message = room.Config.HelpMessage; // message = room.Config.HelpMessage;
else // else
message = "Sorry, no help message available. No room connected."; // message = "Sorry, no help message available. No room connected.";
//TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message; // //TriList.StringInput[UIStringJoin.HelpMessage].StringValue = message;
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HelpPageVisible); // PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HelpPageVisible);
}); //});
// Lights button //// Lights button
TriList.SetSigFalseAction(UIBoolJoin.LightsHeaderButtonPress, () => // ******************** FILL IN //TriList.SetSigFalseAction(UIBoolJoin.HeaderLightsButtonPress, () => // ******************** FILL IN
{ }); // { });
// Call header button //// Setup button - shows volumes with default button OR hold for tech page
if(roomConf.OneButtonMeeting != null && roomConf.OneButtonMeeting.Enable) //TriList.SetSigHeldAction(UIBoolJoin.HeaderGearButtonPress, 2000,
{ // ShowTech,
TriList.SetBool(UIBoolJoin.CalendarHeaderButtonVisible, true); // () => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
TriList.SetBool(UIBoolJoin.CallLeftHeaderButtonVisible, true); //TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
} // PopupInterlock.HideAndClear());
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());
// Volume related things // Volume related things
TriList.SetSigFalseAction(UIBoolJoin.VolumeDefaultPress, () => CurrentRoom.SetDefaultLevels()); TriList.SetSigFalseAction(UIBoolJoin.VolumeDefaultPress, () => CurrentRoom.SetDefaultLevels());
@@ -369,7 +376,7 @@ namespace PepperDash.Essentials
public override void Hide() public override void Hide()
{ {
HideAndClearCurrentDisplayModeSigsInUse(); HideAndClearCurrentDisplayModeSigsInUse();
TriList.BooleanInput[UIBoolJoin.TopBarHabaneroVisible].BoolValue = false; TriList.SetBool(UIBoolJoin.TopBarHabaneroDynamicVisible, false);
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false; TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false; TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].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> /// <summary>
/// Reveals the tech page and puts away anything that's in the way. /// Reveals the tech page and puts away anything that's in the way.
/// </summary> /// </summary>
@@ -774,7 +790,7 @@ namespace PepperDash.Essentials
_CurrentRoom.ShutdownPromptTimer.HasFinished += ShutdownPromptTimer_HasFinished; _CurrentRoom.ShutdownPromptTimer.HasFinished += ShutdownPromptTimer_HasFinished;
_CurrentRoom.ShutdownPromptTimer.WasCancelled += ShutdownPromptTimer_WasCancelled; _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.OnFeedback.OutputChange += CurrentRoom_OnFeedback_OutputChange;
CurrentRoom_SyncOnFeedback(); CurrentRoom_SyncOnFeedback();
_CurrentRoom.IsWarmingUpFeedback.OutputChange += CurrentRoom_IsWarmingFeedback_OutputChange; _CurrentRoom.IsWarmingUpFeedback.OutputChange += CurrentRoom_IsWarmingFeedback_OutputChange;
@@ -784,6 +800,8 @@ namespace PepperDash.Essentials
RefreshAudioDeviceConnections(); RefreshAudioDeviceConnections();
_CurrentRoom.CurrentSingleSourceChange += CurrentRoom_SourceInfoChange; _CurrentRoom.CurrentSingleSourceChange += CurrentRoom_SourceInfoChange;
RefreshSourceInfo(); RefreshSourceInfo();
SetupHeaderButtons();
} }
else else
{ {
@@ -792,10 +810,120 @@ namespace PepperDash.Essentials
} }
} }
/// <summary> /// <summary>
/// For room on/off changes ///
/// </summary> /// </summary>
void CurrentRoom_OnFeedback_OutputChange(object sender, EventArgs e) 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(); CurrentRoom_SyncOnFeedback();
} }

View File

@@ -47,17 +47,19 @@ namespace PepperDash.Essentials.UIDrivers.VC
/// <summary> /// <summary>
/// For the different staging bars: Active, inactive /// For the different staging bars: Active, inactive
/// </summary> /// </summary>
JoinedSigInterlock StagingBarInterlock; JoinedSigInterlock StagingBarsInterlock;
/// <summary> /// <summary>
/// For the staging button feedbacks /// For the staging button feedbacks
/// </summary> /// </summary>
JoinedSigInterlock StagingButtonFeedbackInterlock; JoinedSigInterlock StagingButtonsFeedbackInterlock;
SmartObjectNumeric DialKeypad; SmartObjectNumeric DialKeypad;
SubpageReferenceList ActiveCallsSRL; SubpageReferenceList ActiveCallsSRL;
SmartObjectDynamicList RecentCallsList;
// These are likely temp until we get a keyboard built // These are likely temp until we get a keyboard built
StringFeedback DialStringFeedback; StringFeedback DialStringFeedback;
StringBuilder DialStringBuilder = new StringBuilder(); StringBuilder DialStringBuilder = new StringBuilder();
@@ -82,6 +84,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
SetupCallStagingPopover(); SetupCallStagingPopover();
SetupDialKeypad(); SetupDialKeypad();
ActiveCallsSRL = new SubpageReferenceList(TriList, UISmartObjectJoin.CodecActiveCallsHeaderList, 3, 3, 3); ActiveCallsSRL = new SubpageReferenceList(TriList, UISmartObjectJoin.CodecActiveCallsHeaderList, 3, 3, 3);
SetupRecentCallsList();
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange); codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange);
@@ -97,11 +100,11 @@ namespace PepperDash.Essentials.UIDrivers.VC
VCControlsInterlock = new JoinedSigInterlock(triList); VCControlsInterlock = new JoinedSigInterlock(triList);
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCKeypadVisible); VCControlsInterlock.SetButDontShow(UIBoolJoin.VCKeypadVisible);
StagingBarInterlock = new JoinedSigInterlock(triList); StagingBarsInterlock = new JoinedSigInterlock(triList);
StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible); StagingBarsInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList); StagingButtonsFeedbackInterlock = new JoinedSigInterlock(triList);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
// Return formatted when dialing, straight digits when in call // Return formatted when dialing, straight digits when in call
DialStringFeedback = new StringFeedback(() => DialStringFeedback = new StringFeedback(() =>
@@ -153,6 +156,8 @@ namespace PepperDash.Essentials.UIDrivers.VC
DialStringFeedback.FireUpdate(); DialStringFeedback.FireUpdate();
TriList.SetBool(UIBoolJoin.VCKeypadBackspaceVisible, false); TriList.SetBool(UIBoolJoin.VCKeypadBackspaceVisible, false);
Parent.ShowNotificationRibbon("Connected", 2000); Parent.ShowNotificationRibbon("Connected", 2000);
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
break; break;
case eCodecCallStatus.Connecting: case eCodecCallStatus.Connecting:
// fire at SRL item // fire at SRL item
@@ -196,7 +201,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
break; break;
} }
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(Codec.IsInCall ? 1 : 0); TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(Codec.IsInCall ? 1 : 0);
StagingBarInterlock.ShowInterlocked(Codec.IsInCall ? StagingBarsInterlock.ShowInterlocked(Codec.IsInCall ?
UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
// Set mode of header button // Set mode of header button
@@ -268,7 +273,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
public override void Show() public override void Show()
{ {
VCControlsInterlock.Show(); VCControlsInterlock.Show();
StagingBarInterlock.Show(); StagingBarsInterlock.Show();
DialStringFeedback.FireUpdate(); DialStringFeedback.FireUpdate();
base.Show(); base.Show();
} }
@@ -279,7 +284,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
public override void Hide() public override void Hide()
{ {
VCControlsInterlock.Hide(); VCControlsInterlock.Hide();
StagingBarInterlock.Hide(); StagingBarsInterlock.Hide();
base.Hide(); base.Hide();
} }
@@ -333,6 +338,41 @@ namespace PepperDash.Essentials.UIDrivers.VC
TriList.ID, UISmartObjectJoin.VCDialKeypad); 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>
/// ///
/// </summary> /// </summary>
@@ -384,28 +424,28 @@ namespace PepperDash.Essentials.UIDrivers.VC
void ShowCameraControls() void ShowCameraControls()
{ {
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
} }
void ShowKeypad() void ShowKeypad()
{ {
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
} }
void ShowDirectory() void ShowDirectory()
{ {
// populate directory // populate directory
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
} }
void ShowRecents() void ShowRecents()
{ {
//populate recents //populate recents
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
} }
/// <summary> /// <summary>

View File

@@ -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":"TestIncomingVideoCall", "params": ["444-444-4444"]}
devjson:1 {"deviceKey":"mockVc-1", "methodName":"ListCalls"} devjson:1 {"deviceKey":"mockVc-1", "methodName":"ListCalls"}
devjson:1 {"deviceKey":"room1-emergency", "methodName":"RunEmergencyBehavior"}