Basics of presentation

This commit is contained in:
Heath Volmer
2017-02-10 14:31:43 -07:00
parent c2d4ff4079
commit 13dd7a3914
15 changed files with 228 additions and 80 deletions

View File

@@ -154,8 +154,8 @@
<Compile Include="FOR REFERENCE UI\PageControllers\LargeTouchpanelControllerBase.cs" />
<Compile Include="FOR REFERENCE UI\Panels\SmartGraphicsTouchpanelControllerBase.cs" />
<Compile Include="Room\VolumeAndSourceChangeArgs.cs" />
<Compile Include="UI Drivers\SingleSubpageModalDriver.cs" />
<Compile Include="UI Drivers\EssentialsPresentationPanelAvFunctionsDriver.cs" />
<Compile Include="UI Drivers\SingleSubpageModalDriver.cs" />
<Compile Include="UI Drivers\EssentialsPanelMainInterfaceDriver.cs" />
<Compile Include="UI Drivers\enums and base.cs" />
<Compile Include="UI Drivers\EssentialsHuddlePanelAvFunctionsDriver.cs" />

View File

@@ -16,15 +16,11 @@ namespace PepperDash.Essentials
public EssentialsPresentationRoomPropertiesConfig Config { get; private set; }
public Dictionary<int, IRoutingSinkWithSwitching> Displays { get; private set; }
public Dictionary<uint, IRoutingSinkNoSwitching> Displays { get; private set; }
public IRoutingSinkWithSwitching Display1 { get; private set; }
public IRoutingSinkWithSwitching Display2 { get; private set; }
public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; }
public IBasicVolumeControls DefaultVolumeControls { get; private set; }
public bool ExcludeFromGlobalFunctions { get; set; }
/// <summary>
/// The config name of the source list
/// </summary>
@@ -36,6 +32,18 @@ namespace PepperDash.Essentials
public bool EnablePowerOnToLastSource { get; set; }
string LastSourceKey;
public enum eVideoRoutingMode
{
SelectSourceSelectDisplay, SourceToAllDisplays
}
public eVideoRoutingMode VideoRoutingMode { get; set; }
public enum eAudioRoutingMode
{
AudioFollowsLastVideo, SelectAudioFromDisplay
}
/// <summary>
///
/// </summary>
@@ -103,13 +111,12 @@ namespace PepperDash.Essentials
/// <param name="key"></param>
/// <param name="name"></param>
public EssentialsPresentationRoom(string key, string name,
IRoutingSinkWithSwitching display1, IRoutingSinkWithSwitching display2,
Dictionary<uint, IRoutingSinkNoSwitching> displays,
IRoutingSinkNoSwitching defaultAudio, EssentialsPresentationRoomPropertiesConfig config)
: base(key, name)
{
Config = config;
Display1 = display1;
Display2 = display2;
Displays = displays;
DefaultAudioDevice = defaultAudio;
if (defaultAudio is IBasicVolumeControls)
DefaultVolumeControls = defaultAudio as IBasicVolumeControls;
@@ -123,6 +130,39 @@ namespace PepperDash.Essentials
EnablePowerOnToLastSource = true;
}
public void DoSourceToAllDestinationsRoute(string sourceKey)
{
foreach (var display in Displays.Values)
DoVideoRoute(sourceKey, display.Key);
}
/// <summary>
/// Basic source -> destination routing
/// </summary>
void DoVideoRoute(string sourceKey, string destinationKey)
{
new CTimer(o =>
{
var source = DeviceManager.GetDeviceForKey(sourceKey) as IRoutingSource;
if (source == null)
{
Debug.Console(1, this, "Cannot route. Source '{0}' not found", sourceKey);
return;
}
var dest = DeviceManager.GetDeviceForKey(destinationKey) as IRoutingSinkNoSwitching;
if (dest == null)
{
Debug.Console(1, this, "Cannot route. Destination '{0}' not found", destinationKey);
return;
}
dest.ReleaseAndMakeRoute(source, eRoutingSignalType.Video);
}, 0);
}
public void RunRouteAction(string routeKey)
{
RunRouteAction(routeKey, null);
@@ -194,8 +234,8 @@ namespace PepperDash.Essentials
if (string.IsNullOrEmpty(item.VolumeControlKey)
|| item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
volDev = DefaultVolumeControls;
else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
volDev = DefaultDisplay as IBasicVolumeControls;
//else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
// volDev = DefaultDisplay as IBasicVolumeControls;
// Or a specific device, probably rarely used.
else
{
@@ -242,8 +282,8 @@ namespace PepperDash.Essentials
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
dest = DefaultAudioDevice;
else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
dest = DefaultDisplay;
//else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
// dest = DefaultDisplay;
else
dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
@@ -271,16 +311,5 @@ namespace PepperDash.Essentials
}
return true;
}
/// <summary>
/// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
/// </summary>
public static void AllRoomsOff()
{
var allRooms = DeviceManager.AllDevices.Where(d =>
d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
foreach (var room in allRooms)
(room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
}
}
}

View File

@@ -20,26 +20,32 @@ namespace PepperDash.Essentials
public Device GetRoomObject()
{
var typeName = Type.ToLower();
EssentialsHuddleSpaceRoom room = null;
if (typeName == "huddle")
{
var props = JsonConvert.DeserializeObject<EssentialsHuddleRoomPropertiesConfig>
(this.Properties.ToString());
var disp = DeviceManager.GetDeviceForKey(props.DefaultDisplayKey) as IRoutingSinkWithSwitching;
var audio = DeviceManager.GetDeviceForKey(props.DefaultAudioKey) as IRoutingSinkNoSwitching;
room = new EssentialsHuddleSpaceRoom(Key, Name, disp, audio, props);
room.SourceListKey = props.SourceListKey;
var huddle = new EssentialsHuddleSpaceRoom(Key, Name, disp, audio, props);
huddle.SourceListKey = props.SourceListKey;
return huddle;
}
else if (typeName == "presentation")
{
var props = JsonConvert.DeserializeObject<EssentialsPresentationRoomPropertiesConfig>
(this.Properties.ToString());
// assign displays
// assign audio. How??????
var displaysDict = new Dictionary<uint, IRoutingSinkNoSwitching>();
uint i = 1;
foreach (var dispKey in props.DisplayKeys) // read in the ordered displays list
{
var disp = DeviceManager.GetDeviceForKey(dispKey) as IRoutingSinkWithSwitching;
displaysDict.Add(i++, disp);
}
var presRoom = new EssentialsPresentationRoom(Key, Name, displaysDict, null, props);
return presRoom;
}
return room;
return null;
}
}

View File

@@ -0,0 +1,31 @@
2/10/2017 10:07:37 AM, Info: Initializing SIMPLSharp Services...
2/10/2017 10:07:37 AM, Info: ProjectInfo successfully initialized.
2/10/2017 1:58:49 PM, Info: Saving project information...
2/10/2017 1:58:49 PM, Info: Saving project information...
2/10/2017 1:58:49 PM, Info: Saving project information...
2/10/2017 2:03:49 PM, Info: Saving project information...
2/10/2017 2:03:49 PM, Info: Saving project information...
2/10/2017 2:03:49 PM, Info: Saving project information...
2/10/2017 2:08:49 PM, Info: Saving project information...
2/10/2017 2:08:49 PM, Info: Saving project information...
2/10/2017 2:08:49 PM, Info: Saving project information...
2/10/2017 2:13:49 PM, Info: Saving project information...
2/10/2017 2:13:49 PM, Info: Saving project information...
2/10/2017 2:13:49 PM, Info: Saving project information...
2/10/2017 2:18:49 PM, Info: Saving project information...
2/10/2017 2:18:49 PM, Info: Saving project information...
2/10/2017 2:18:49 PM, Info: Saving project information...
2/10/2017 2:23:49 PM, Info: Saving project information...
2/10/2017 2:23:49 PM, Info: Saving project information...
2/10/2017 2:23:49 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:28:46 PM, Info: Saving project information...
2/10/2017 2:29:51 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll...
2/10/2017 2:29:52 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.dll
2/10/2017 2:29:52 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\essentials\PepperDashEssentials\PepperDashEssentials\bin\PepperDashEssentials.cpz...
2/10/2017 2:29:54 PM, Info: Saving project information...
2/10/2017 2:31:19 PM, Info: Terminating SIMPLSharp Services

View File

@@ -13,13 +13,13 @@ namespace PepperDash.Essentials
/// <summary>
///
/// </summary>
public class EssentialsPresentationPanelAvFunctionsDriver : PanelDriverBase
public class EssentialsPresentationPanelAvFunctionsDriver : PanelDriverBase
{
CrestronTouchpanelPropertiesConfig Config;
public enum UiDisplayMode
{
AudioSetup, AudioCallMode, PresentationMode
PresentationMode, AudioSetup
}
/// <summary>
@@ -60,7 +60,7 @@ namespace PepperDash.Essentials
set
{
_DefaultRoomKey = value;
CurrentRoom = DeviceManager.GetDeviceForKey(value) as EssentialsPresentationRoom;
CurrentRoom = DeviceManager.GetDeviceForKey(value) as EssentialsPresentationRoom;
}
}
string _DefaultRoomKey;
@@ -78,6 +78,12 @@ namespace PepperDash.Essentials
}
EssentialsPresentationRoom _CurrentRoom;
/// <summary>
/// For hitting feedback
/// </summary>
BoolInputSig ShareButtonSig;
BoolInputSig EndMeetingButtonSig;
/// <summary>
/// Controls the extended period that the volume gauge shows on-screen,
/// as triggered by Volume up/down operations
@@ -90,8 +96,16 @@ namespace PepperDash.Essentials
/// </summary>
BoolFeedbackPulseExtender VolumeButtonsPopupFeedback;
/// <summary>
/// The parent driver for this
/// </summary>
PanelDriverBase Parent;
/// <summary>
/// All children attached to this driver. For hiding and showing as a group.
/// </summary>
List<PanelDriverBase> ChildDrivers = new List<PanelDriverBase>();
List<BoolInputSig> CurrentDisplayModeSigsInUse = new List<BoolInputSig>();
//// Important smart objects
@@ -129,7 +143,8 @@ namespace PepperDash.Essentials
/// <summary>
/// Constructor
/// </summary>
public EssentialsPresentationPanelAvFunctionsDriver(PanelDriverBase parent, CrestronTouchpanelPropertiesConfig config)
public EssentialsPresentationPanelAvFunctionsDriver(PanelDriverBase parent,
CrestronTouchpanelPropertiesConfig config)
: base(parent.TriList)
{
Config = config;
@@ -158,7 +173,6 @@ namespace PepperDash.Essentials
/// </summary>
public override void Show()
{
// We'll want to show the current state of AV, but for now, just show rooms
TriList.BooleanInput[UIBoolJoin.TopBarVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = true;
@@ -168,6 +182,28 @@ namespace PepperDash.Essentials
// Attach actions
TriList.SetSigFalseAction(UIBoolJoin.VolumeButtonPopupPress, VolumeButtonsTogglePress);
//Interlocked modals
TriList.SetSigFalseAction(UIBoolJoin.InterlockedModalClosePress, HideCurrentInterlockedModal);
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;
ShowInterlockedModal(UIBoolJoin.HelpPageVisible);
});
TriList.SetSigFalseAction(UIBoolJoin.RoomHeaderButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.RoomHeaderPageVisible));
#warning Add press and hold to gear button here
TriList.SetSigFalseAction(UIBoolJoin.GearHeaderButtonPress, () =>
ShowInterlockedModal(UIBoolJoin.VolumesPageVisible));
// power-related functions
// Note: some of these are not directly-related to the huddle space UI, but are held over
// in case
@@ -185,11 +221,6 @@ namespace PepperDash.Essentials
EssentialsHuddleSpaceRoom.AllRoomsOff();
CancelPowerOff();
});
TriList.SetSigFalseAction(UIBoolJoin.DisplayPowerTogglePress, () =>
{
if (CurrentRoom != null && CurrentRoom.DefaultDisplay is IPower)
(CurrentRoom.DefaultDisplay as IPower).PowerToggle();
});
base.Show();
}
@@ -199,6 +230,10 @@ namespace PepperDash.Essentials
HideAndClearCurrentDisplayModeSigsInUse();
TriList.BooleanInput[UIBoolJoin.TopBarVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.ActivityFooterVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = false;
VolumeButtonsPopupFeedback.ClearNow();
CancelPowerOff();
@@ -217,8 +252,20 @@ namespace PepperDash.Essentials
switch (mode)
{
case UiDisplayMode.PresentationMode:
CurrentDisplayModeSigsInUse.Add(TriList.BooleanInput[UIBoolJoin.StagingPageVisible]);
// Date/time
// show start page or staging...
if (CurrentRoom.OnFeedback.BoolValue)
{
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
}
else
{
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.TapToBeginVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
}
// Date/time
if (Config.ShowDate && Config.ShowTime)
{
TriList.BooleanInput[UIBoolJoin.DateAndTimeVisible].BoolValue = true;
@@ -244,11 +291,9 @@ namespace PepperDash.Essentials
{
ActivityFooterSrl.Clear();
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0,
b => { if (!b) ShowMode(UiDisplayMode.PresentationMode); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 0,
b => { if (!b) ShowMode(UiDisplayMode.AudioCallMode); }));
ActivityFooterSrl.Count = 2;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1;
b => { if (!b) ShareButtonPressed(); }));
ActivityFooterSrl.Count = 1;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 0;
}
/// <summary>
@@ -257,16 +302,52 @@ namespace PepperDash.Essentials
void SetupActivityFooterWhenRoomOn()
{
ActivityFooterSrl.Clear();
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl, 0,
b => { if (!b) ShowMode(UiDisplayMode.PresentationMode); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl, 0,
b => { if (!b) ShowMode(UiDisplayMode.AudioCallMode); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl,
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(1, ActivityFooterSrl,
0, null));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(2, ActivityFooterSrl,
3, b => { if (!b) PowerButtonPressed(); }));
ActivityFooterSrl.Count = 3;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 2;
ActivityFooterSrl.Count = 2;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1;
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(2, 1);
}
/// <summary>
/// Attached to activity list share button
/// </summary>
void ShareButtonPressed()
{
ShareButtonSig = ActivityFooterSrl.BoolInputSig(1, 1);
if (!_CurrentRoom.OnFeedback.BoolValue)
{
ShareButtonSig.BoolValue = true;
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
TriList.BooleanInput[UIBoolJoin.StagingPageVisible].BoolValue = true;
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
}
}
uint CurrentInterlockedModalJoin;
void ShowInterlockedModal(uint join)
{
if (CurrentInterlockedModalJoin == join)
HideCurrentInterlockedModal();
else
{
TriList.BooleanInput[UIBoolJoin.HelpPageVisible].BoolValue = join == UIBoolJoin.HelpPageVisible;
TriList.BooleanInput[UIBoolJoin.RoomHeaderPageVisible].BoolValue = join == UIBoolJoin.RoomHeaderPageVisible;
TriList.BooleanInput[UIBoolJoin.VolumesPageVisible].BoolValue = join == UIBoolJoin.VolumesPageVisible;
CurrentInterlockedModalJoin = join;
}
}
void HideCurrentInterlockedModal()
{
TriList.BooleanInput[CurrentInterlockedModalJoin].BoolValue = false;
CurrentInterlockedModalJoin = 0;
}
/// <summary>
/// Shows all sigs that are in CurrentDisplayModeSigsInUse
/// </summary>
@@ -315,19 +396,14 @@ namespace PepperDash.Essentials
void ShowCurrentSource()
{
if (CurrentRoom.CurrentSourceInfo == null)
{
//var offPm = new DefaultPageManager(UIBoolJoin.SelectSourcePopupVisible, TriList);
//PageManagers["OFF"] = offPm;
//CurrentSourcePageManager = offPm;
//offPm.Show();
return;
}
var uiDev = CurrentRoom.CurrentSourceInfo.SourceDevice as IUiDisplayInfo;
PageManager pm = null;
// If we need a page manager, get an appropriate one
if (uiDev != null)
{
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
// Got an existing page manager, get it
if (PageManagers.ContainsKey(uiDev))
pm = PageManagers[uiDev];
@@ -343,12 +419,6 @@ namespace PepperDash.Essentials
CurrentSourcePageManager = pm;
pm.Show();
}
else // show some default thing
{
CurrentDisplayModeSigsInUse.Add(TriList.BooleanInput[12345]);
}
ShowCurrentDisplayModeSigsInUse();
}
/// <summary>
@@ -358,8 +428,7 @@ namespace PepperDash.Essentials
/// <param name="key">The key name of the route to run</param>
void UiSelectSource(string key)
{
// Run the route and when it calls back, show the source
CurrentRoom.RunRouteAction(key, null);
CurrentRoom.DoSourceToAllDestinationsRoute(key);
}
/// <summary>
@@ -369,14 +438,23 @@ namespace PepperDash.Essentials
{
if (!CurrentRoom.OnFeedback.BoolValue)
return;
EndMeetingButtonSig.BoolValue = true;
ShareButtonSig.BoolValue = false;
// Timeout or button 1 press will shut down
var modal = new ModalDialog(TriList);
uint time = 60000;
uint seconds = time / 1000;
var message = string.Format("Meeting will end in {0} seconds", seconds);
modal.PresentModalTimerDialog(2, "End Meeting", "Info", message,
modal.PresentModalTimerDialog(2, "End Meeting", "Power", message,
"End Meeting Now", "Cancel", time, true,
but => { if (but != 2) CurrentRoom.RunRouteAction("roomOff"); });
but =>
{
if (but != 2)
CurrentRoom.RunRouteAction("roomOff");
else
ShareButtonSig.BoolValue = true; // restore Share fb
EndMeetingButtonSig.BoolValue = false;
});
}
void CancelPowerOffTimer()
@@ -491,11 +569,9 @@ namespace PepperDash.Essentials
srcConfig.SourceKey);
continue;
}
//Debug.Console(0, "Adding source '{0}'", srcConfig.SourceKey);
//var s = srcConfig; // assign locals for scope in button lambda
var routeKey = kvp.Key;
var sourceKey = srcConfig.SourceKey;
var item = new SubpageReferenceListSourceItem(i++, SourcesSrl, srcConfig,
b => { if (!b) UiSelectSource(routeKey); });
b => { if (!b) UiSelectSource(sourceKey); });
SourcesSrl.AddItem(item); // add to the SRL
item.RegisterForSourceChange(_CurrentRoom);
}
@@ -526,9 +602,15 @@ namespace PepperDash.Essentials
var value = _CurrentRoom.OnFeedback.BoolValue;
TriList.BooleanInput[UIBoolJoin.RoomIsOn].BoolValue = value;
if (value)
{
SetupActivityFooterWhenRoomOn();
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = false;
}
else
{
SetupActivityFooterWhenRoomOff();
TriList.BooleanInput[UIBoolJoin.StartPageVisible].BoolValue = true;
}
}
/// <summary>

View File

@@ -10,8 +10,8 @@
<ArchiveName />
</RequiredInfo>
<OptionalInfo>
<CompiledOn>2/9/2017 2:44:02 PM</CompiledOn>
<CompilerRev>1.0.0.26519</CompilerRev>
<CompiledOn>2/10/2017 2:29:52 PM</CompiledOn>
<CompilerRev>1.0.0.26094</CompilerRev>
</OptionalInfo>
<Plugin>
<Version>Crestron.SIMPLSharp, Version=2.0.48.0, Culture=neutral, PublicKeyToken=812d080f93e2de10</Version>

View File

@@ -1,4 +1,4 @@
MainAssembly=PepperDashEssentials.dll:7c8692784ef9f276843cfa635fe44e4b
MainAssembly=PepperDashEssentials.dll:82beec10314644945c51c91d5582e167
MainAssemblyMinFirmwareVersion=1.009.0029
MainAssemblyResource=SimplSharpData.dat:315526abf906cded47fb0c7510266a7e
ü