mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-14 04:04:58 +00:00
Merge remote-tracking branch 'origin/feature/ecs-407' into feature/cisco-spark-2
This commit is contained in:
@@ -26,11 +26,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// StatusUnknown = 0, IsOk = 1, InWarning = 2, InError = 3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum MonitorStatus
|
public enum MonitorStatus
|
||||||
{
|
{
|
||||||
IsOk, InWarning, InError, StatusUnknown
|
StatusUnknown = 0,
|
||||||
|
IsOk = 1,
|
||||||
|
InWarning = 2,
|
||||||
|
InError = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MonitorStatusChangeEventArgs : EventArgs
|
public class MonitorStatusChangeEventArgs : EventArgs
|
||||||
|
|||||||
@@ -217,7 +217,6 @@
|
|||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="SigHelper.cs" />
|
<Compile Include="SigHelper.cs" />
|
||||||
<Compile Include="REMOVE SigId.cs" />
|
<Compile Include="REMOVE SigId.cs" />
|
||||||
<Compile Include="SmartObjects\SubpageReferencList\DeviceStatusListController.cs" />
|
|
||||||
<Compile Include="SmartObjects\SubpageReferencList\SubpageReferenceList.cs" />
|
<Compile Include="SmartObjects\SubpageReferencList\SubpageReferenceList.cs" />
|
||||||
<Compile Include="SmartObjects\SubpageReferencList\SubpageReferenceListItem.cs" />
|
<Compile Include="SmartObjects\SubpageReferencList\SubpageReferenceListItem.cs" />
|
||||||
<None Include="app.config" />
|
<None Include="app.config" />
|
||||||
|
|||||||
@@ -33,6 +33,12 @@ namespace PepperDash.Essentials.Core.SmartObjects
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int MaxCount { get; private set; }
|
public int MaxCount { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wrapper for smart object
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="so"></param>
|
||||||
|
/// <param name="useUserObjectHandler">True if the standard user object action handler will be used</param>
|
||||||
|
/// <param name="nameSigOffset">The starting join of the string sigs for the button labels</param>
|
||||||
public SmartObjectDynamicList(SmartObject so, bool useUserObjectHandler, uint nameSigOffset) : base(so, useUserObjectHandler)
|
public SmartObjectDynamicList(SmartObject so, bool useUserObjectHandler, uint nameSigOffset) : base(so, useUserObjectHandler)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -1,111 +0,0 @@
|
|||||||
//using System;
|
|
||||||
//using System.Collections.Generic;
|
|
||||||
//using System.Linq;
|
|
||||||
//using System.Text;
|
|
||||||
//using Crestron.SimplSharp;
|
|
||||||
//using Crestron.SimplSharpPro;
|
|
||||||
//using Crestron.SimplSharpPro.UI;
|
|
||||||
|
|
||||||
//namespace PepperDash.Essentials.Core
|
|
||||||
//{
|
|
||||||
// /// <summary>
|
|
||||||
// /// Controls the device/tech status list - links in to the first 10, 1, 5 statuses in an item's StatusProperties
|
|
||||||
// /// </summary>
|
|
||||||
// public class DeviceStatusListController : SubpageReferenceListController
|
|
||||||
// {
|
|
||||||
// Dictionary<uint, Device> Items = new Dictionary<uint, Device>();
|
|
||||||
|
|
||||||
// public DeviceStatusListController(SmartObject list)
|
|
||||||
// {
|
|
||||||
// TheList = new SubpageReferenceList(list, 10, 1, 5);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// /// <summary>
|
|
||||||
// /// Attaches an item's StatusProperties to the list item.
|
|
||||||
// /// THIS METHOD MAY BE BETTER ABSORBED INTO SOME OTHER CONTROLLER CLASS AS A
|
|
||||||
// /// PSIG -> LIST ITEM ADAPTER
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="index">List position</param>
|
|
||||||
// /// <param name="device"></param>
|
|
||||||
// public void AddItem(uint listIndex, Device device)
|
|
||||||
// {
|
|
||||||
// if (device == null) throw new ArgumentNullException("device");
|
|
||||||
// Items[listIndex] = device;
|
|
||||||
|
|
||||||
// // Feedback - read the status properties and if there is room for them on the list sigs
|
|
||||||
// // link them up.
|
|
||||||
// //foreach (PValue statusPsig in device.StatusProperties)
|
|
||||||
// //{
|
|
||||||
// // uint num = statusPsig.Number;
|
|
||||||
// // Sig listSig = null;
|
|
||||||
// // switch (statusPsig.Type) // Switch on the PSig type and whether the PSig number is within the increment range
|
|
||||||
// // {
|
|
||||||
// // case eSigType.Bool:
|
|
||||||
// // if (num > TheList.BoolIncrement) return;
|
|
||||||
// // listSig = TheList.BoolInputSig(listIndex, num); // Pull the appropriate list sig.
|
|
||||||
// // break;
|
|
||||||
// // case eSigType.String:
|
|
||||||
// // if (num > TheList.StringIncrement) return;
|
|
||||||
// // listSig = TheList.StringInputSig(listIndex, num);
|
|
||||||
// // break;
|
|
||||||
// // case eSigType.UShort:
|
|
||||||
// // if (num > TheList.UShortIncrement) return;
|
|
||||||
// // listSig = TheList.UShortInputSig(listIndex, num);
|
|
||||||
// // break;
|
|
||||||
// // default:
|
|
||||||
// // return;
|
|
||||||
// // }
|
|
||||||
// // if (listSig != null) // If we got a sig, plug it into the PSig for updates.
|
|
||||||
// // statusPsig.AddLinkedSig(listSig, true);
|
|
||||||
// //}
|
|
||||||
|
|
||||||
// // Press/other handlers - read the Commands and if there is room, add them as Sig handlers.
|
|
||||||
// //foreach (var id in device.Commands.Keys)
|
|
||||||
// //{
|
|
||||||
// // var pValueNumber = id.Number;
|
|
||||||
// // Sig listSig = null;
|
|
||||||
// // // Switch on type of a command and if it's in range, get it's list Sig.
|
|
||||||
// // switch (id.Type)
|
|
||||||
// // {
|
|
||||||
// // case eSigType.Bool:
|
|
||||||
// // if (pValueNumber > TheList.BoolIncrement) return;
|
|
||||||
// // listSig = TheList.BoolFeedbackSig(listIndex, pValueNumber);
|
|
||||||
// // break;
|
|
||||||
// // case eSigType.String:
|
|
||||||
// // if (pValueNumber > TheList.StringIncrement) return;
|
|
||||||
// // listSig = TheList.StringOutputSig(listIndex, pValueNumber);
|
|
||||||
// // break;
|
|
||||||
// // case eSigType.UShort:
|
|
||||||
// // if (pValueNumber > TheList.UShortIncrement) return;
|
|
||||||
// // listSig = TheList.UShortOutputSig(listIndex, pValueNumber);
|
|
||||||
// // break;
|
|
||||||
// // default:
|
|
||||||
// // return;
|
|
||||||
// // }
|
|
||||||
// // if (listSig != null) // If we got a sig, add the command to its ChangeAction
|
|
||||||
// // SigToAction.GetSigToActionUserObjectForSig(listSig).SigChangeAction += device.Commands[id];
|
|
||||||
// // // This will need to be undone when detached MAKE A HELPER!!!!
|
|
||||||
// //}
|
|
||||||
|
|
||||||
// // "Custom things" below
|
|
||||||
// // Set the name on sig 1 - just an assignment. Don't
|
|
||||||
// var nameSig = TheList.StringInputSig(listIndex, 1);
|
|
||||||
// if (nameSig != null)
|
|
||||||
// nameSig.StringValue = device.Key;
|
|
||||||
|
|
||||||
// // Map IsOnline bool to a 0 / 1 state analog icon
|
|
||||||
// // Add an action to the online PValue that maps to a ushort sig on the list POTENTIAL LEAK HERE IF
|
|
||||||
// // this isn't cleaned up on disconnect
|
|
||||||
// var onlineSig = TheList.UShortInputSig(listIndex, 1);
|
|
||||||
// //var onlinePValue = device.StatusProperties[Device.JoinIsOnline];
|
|
||||||
// //if (onlineSig != null && onlinePValue != null)
|
|
||||||
// // onlinePValue.AddChangeAction(pv => onlineSig.UShortValue = (ushort)(onlinePValue.BoolValue ? 1 : 0));
|
|
||||||
// // //OR onlinePValue.AddLinkedSig(onlineSig, true);
|
|
||||||
|
|
||||||
// // Set the list length based on largest key
|
|
||||||
// TheList.Count = (ushort)Items.Keys.DefaultIfEmpty().Max(); // The count will be the largest key or 0
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
//}
|
|
||||||
@@ -81,21 +81,25 @@ namespace PepperDash.Essentials.Core
|
|||||||
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;
|
CTimer heldTimer = null;
|
||||||
|
bool wasHeld = false;
|
||||||
return tl.SetBoolSigAction(sigNum, press =>
|
return tl.SetBoolSigAction(sigNum, press =>
|
||||||
{
|
{
|
||||||
if (press)
|
if (press)
|
||||||
{
|
{
|
||||||
|
wasHeld = false;
|
||||||
// Could insert a pressed action here
|
// Could insert a pressed action here
|
||||||
heldTimer = new CTimer(o =>
|
heldTimer = new CTimer(o =>
|
||||||
{
|
{
|
||||||
// if still held and there's an action
|
// if still held and there's an action
|
||||||
if (tl.BooleanOutput[sigNum].BoolValue && heldAction != null)
|
if (tl.BooleanOutput[sigNum].BoolValue && heldAction != null)
|
||||||
|
{
|
||||||
|
wasHeld = true;
|
||||||
// Hold action here
|
// Hold action here
|
||||||
heldAction();
|
heldAction();
|
||||||
|
}
|
||||||
}, heldMs);
|
}, heldMs);
|
||||||
}
|
}
|
||||||
else if (heldTimer != null) // released
|
else if(!wasHeld) // released
|
||||||
{
|
{
|
||||||
heldTimer.Stop();
|
heldTimer.Stop();
|
||||||
if (releaseAction != null)
|
if (releaseAction != null)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ namespace PepperDash.Essentials
|
|||||||
public class ControlSystem : CrestronControlSystem
|
public class ControlSystem : CrestronControlSystem
|
||||||
{
|
{
|
||||||
PepperDashPortalSyncClient PortalSync;
|
PepperDashPortalSyncClient PortalSync;
|
||||||
|
HttpLogoServer LogoServer;
|
||||||
|
|
||||||
public ControlSystem()
|
public ControlSystem()
|
||||||
: base()
|
: base()
|
||||||
@@ -63,6 +64,8 @@ namespace PepperDash.Essentials
|
|||||||
LoadTieLines();
|
LoadTieLines();
|
||||||
LoadRooms();
|
LoadRooms();
|
||||||
|
|
||||||
|
LogoServer = new HttpLogoServer(8080, @"\html\logo");
|
||||||
|
|
||||||
DeviceManager.ActivateAll();
|
DeviceManager.ActivateAll();
|
||||||
Debug.Console(0, "Essentials load complete\r" +
|
Debug.Console(0, "Essentials load complete\r" +
|
||||||
"-------------------------------------------------------------");
|
"-------------------------------------------------------------");
|
||||||
@@ -206,6 +209,5 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, "WARNING: Cannot create room from config, key '{0}'", roomConfig.Key);
|
Debug.Console(0, "WARNING: Cannot create room from config, key '{0}'", roomConfig.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,11 +164,14 @@
|
|||||||
<Compile Include="FOR REFERENCE UI\PageControllers\PageControllerLargeSetTopBoxGeneric.cs" />
|
<Compile Include="FOR REFERENCE UI\PageControllers\PageControllerLargeSetTopBoxGeneric.cs" />
|
||||||
<Compile Include="FOR REFERENCE UI\PageControllers\LargeTouchpanelControllerBase.cs" />
|
<Compile Include="FOR REFERENCE UI\PageControllers\LargeTouchpanelControllerBase.cs" />
|
||||||
<Compile Include="FOR REFERENCE UI\Panels\SmartGraphicsTouchpanelControllerBase.cs" />
|
<Compile Include="FOR REFERENCE UI\Panels\SmartGraphicsTouchpanelControllerBase.cs" />
|
||||||
|
<Compile Include="UIDrivers\SigInterlock.cs" />
|
||||||
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
|
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddlePresentationUiDriver.cs" />
|
||||||
|
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddleTechPageDriver.cs" />
|
||||||
|
<Compile Include="UI\HttpLogoServer.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" />
|
||||||
<Compile Include="UIDrivers\EssentialsHuddleVTC\HuddleVTCPanelAvFunctionsDriver.cs" />
|
<Compile Include="UIDrivers\EssentialsHuddleVTC\EssentialsHuddleVtc1PanelAvFunctionsDriver.cs" />
|
||||||
<Compile Include="UIDrivers\VolumeAndSourceChangeArgs.cs" />
|
<Compile Include="UIDrivers\VolumeAndSourceChangeArgs.cs" />
|
||||||
<Compile Include="UI\JoinConstants\UISmartObjectJoin.cs" />
|
<Compile Include="UI\JoinConstants\UISmartObjectJoin.cs" />
|
||||||
<Compile Include="UI\JoinConstants\UIStringlJoin.cs" />
|
<Compile Include="UI\JoinConstants\UIStringlJoin.cs" />
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
if (Type == "url")
|
if (Type == "url")
|
||||||
return Url;
|
return Url;
|
||||||
if (Type == "system")
|
if (Type == "system")
|
||||||
return string.Format("http://{0}:5646/logo",
|
return string.Format("http://{0}:8080/logo.png",
|
||||||
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
|
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
108
Essentials/PepperDashEssentials/UI/HttpLogoServer.cs
Normal file
108
Essentials/PepperDashEssentials/UI/HttpLogoServer.cs
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
|
using Crestron.SimplSharp.Net.Http;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
public class HttpLogoServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
HttpServer Server;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
string FileDirectory;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public static Dictionary<string, string> ExtensionContentTypes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="port"></param>
|
||||||
|
/// <param name="directory"></param>
|
||||||
|
public HttpLogoServer(int port, string directory)
|
||||||
|
{
|
||||||
|
ExtensionContentTypes = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
//{ ".css", "text/css" },
|
||||||
|
//{ ".htm", "text/html" },
|
||||||
|
//{ ".html", "text/html" },
|
||||||
|
{ ".jpg", "image/jpeg" },
|
||||||
|
{ ".jpeg", "image/jpeg" },
|
||||||
|
//{ ".js", "application/javascript" },
|
||||||
|
//{ ".json", "application/json" },
|
||||||
|
//{ ".map", "application/x-navimap" },
|
||||||
|
{ ".pdf", "application.pdf" },
|
||||||
|
{ ".png", "image/png" },
|
||||||
|
//{ ".txt", "text/plain" },
|
||||||
|
};
|
||||||
|
|
||||||
|
Server = new HttpServer();
|
||||||
|
Server.Port = port;
|
||||||
|
FileDirectory = directory;
|
||||||
|
Server.OnHttpRequest += new OnHttpRequestHandler(Server_OnHttpRequest);
|
||||||
|
Server.Open();
|
||||||
|
|
||||||
|
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
void Server_OnHttpRequest(object sender, OnHttpRequestArgs args)
|
||||||
|
{
|
||||||
|
var path = args.Request.Path;
|
||||||
|
if (File.Exists(FileDirectory + @"\" + path))
|
||||||
|
{
|
||||||
|
string filePath = path.Replace('/', '\\');
|
||||||
|
string localPath = string.Format(@"{0}{1}", FileDirectory, filePath);
|
||||||
|
if (File.Exists(localPath))
|
||||||
|
{
|
||||||
|
args.Response.Header.ContentType = GetContentType(new FileInfo(localPath).Extension);
|
||||||
|
args.Response.ContentStream = new FileStream(localPath, FileMode.Open, FileAccess.Read);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
args.Response.ContentString = string.Format("Not found: '{0}'", filePath);
|
||||||
|
args.Response.Code = 404;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
||||||
|
{
|
||||||
|
if (programEventType == eProgramStatusEventType.Stopping)
|
||||||
|
Server.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="extension"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetContentType(string extension)
|
||||||
|
{
|
||||||
|
string type;
|
||||||
|
if (ExtensionContentTypes.ContainsKey(extension))
|
||||||
|
type = ExtensionContentTypes[extension];
|
||||||
|
else
|
||||||
|
type = "text/plain";
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -206,6 +206,43 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
// Letter joins start at 2921;
|
// Letter joins start at 2921;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 3101
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechExitButton = 3101;
|
||||||
|
/// <summary>
|
||||||
|
/// 3106
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechCommonItemsVisbible = 3106;
|
||||||
|
/// <summary>
|
||||||
|
/// 3107
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechSystemStatusVisible = 3107;
|
||||||
|
/// <summary>
|
||||||
|
/// 3108
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechDisplayControlsVisible = 3108;
|
||||||
|
/// <summary>
|
||||||
|
/// 3109
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechPanelSetupVisible = 3109;
|
||||||
|
/// <summary>
|
||||||
|
/// 3110
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechAdvancedVolumeVisible = 3110;
|
||||||
|
/// <summary>
|
||||||
|
/// 3111
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechAboutVisible = 3111;
|
||||||
|
/// <summary>
|
||||||
|
/// 3112
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechSchedulerVisible = 3112;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//******************************************************
|
//******************************************************
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3811
|
/// 3811
|
||||||
@@ -300,14 +337,8 @@ namespace PepperDash.Essentials
|
|||||||
/// 3891
|
/// 3891
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VolumeDefaultPress = 3891;
|
public const uint VolumeDefaultPress = 3891;
|
||||||
/// <summary>
|
|
||||||
/// 3901
|
|
||||||
/// </summary>
|
|
||||||
public const uint TechPagesExitButton = 3901;
|
|
||||||
/// <summary>
|
|
||||||
/// 3902
|
|
||||||
/// </summary>
|
|
||||||
public const uint TechPanelSetupVisible = 3902;
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3999
|
/// 3999
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -29,6 +29,14 @@
|
|||||||
/// 15022 The main activity footer
|
/// 15022 The main activity footer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint ActivityFooterSRL = 15022;
|
public const uint ActivityFooterSRL = 15022;
|
||||||
|
/// <summary>
|
||||||
|
/// 3901 The Tech page menu list
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechMenuList = 3901;
|
||||||
|
/// <summary>
|
||||||
|
/// 3902 Tech page statuses
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechStatusList = 3902;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -28,6 +28,14 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
//public const uint KeypadText = 2901;
|
//public const uint KeypadText = 2901;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 3101 - This is the start of the range 3101 - 3120
|
||||||
|
/// </summary>
|
||||||
|
public const uint TechMenuButtonTextStart = 3101;
|
||||||
|
|
||||||
|
//----- through 3120
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3812
|
/// 3812
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ namespace PepperDash.Essentials
|
|||||||
// Setup button
|
// Setup button
|
||||||
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
||||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible));// ShowInterlockedModal(UIBoolJoin.TechPanelSetupVisible));
|
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible));// ShowInterlockedModal(UIBoolJoin.TechPanelSetupVisible));
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.TechPagesExitButton, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||||
PopupInterlock.HideAndClear()); // HideCurrentInterlockedModal());
|
PopupInterlock.HideAndClear()); // HideCurrentInterlockedModal());
|
||||||
#warning This gets overridden by config after NYU demo
|
#warning This gets overridden by config after NYU demo
|
||||||
if(TriList is CrestronApp)
|
if(TriList is CrestronApp)
|
||||||
|
|||||||
@@ -0,0 +1,147 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
|
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.UIDrivers
|
||||||
|
{
|
||||||
|
public class EssentialsHuddleTechPageDriver : PanelDriverBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
SmartObjectDynamicList MenuList;
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
SubpageReferenceList StatusList;
|
||||||
|
/// <summary>
|
||||||
|
/// References lines in the list against device instances
|
||||||
|
/// </summary>
|
||||||
|
Dictionary<ICommunicationMonitor, uint> StatusListDeviceIndexes;
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
IAVDriver Parent;
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
JoinedSigInterlock PagesInterlock;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1
|
||||||
|
/// </summary>
|
||||||
|
public const uint JoinText = 1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="trilist"></param>
|
||||||
|
/// <param name="parent"></param>
|
||||||
|
public EssentialsHuddleTechPageDriver(BasicTriListWithSmartObject trilist, IAVDriver parent)
|
||||||
|
: base(trilist)
|
||||||
|
{
|
||||||
|
Parent = parent;
|
||||||
|
PagesInterlock = new JoinedSigInterlock(trilist);
|
||||||
|
PagesInterlock.SetButDontShow(UIBoolJoin.TechSystemStatusVisible);
|
||||||
|
|
||||||
|
trilist.SetSigFalseAction(UIBoolJoin.TechExitButton, Hide);
|
||||||
|
|
||||||
|
MenuList = new SmartObjectDynamicList(trilist.SmartObjects[UISmartObjectJoin.TechMenuList],
|
||||||
|
true, 3100);
|
||||||
|
|
||||||
|
MenuList.SetFeedback(1, true); // initial fb
|
||||||
|
|
||||||
|
MenuList.SetItemMainText(1, "System Status");
|
||||||
|
MenuList.SetItemButtonAction(1, b => {
|
||||||
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechSystemStatusVisible);
|
||||||
|
MenuList.SetFeedback(1, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
MenuList.SetItemMainText(2, "Display Controls");
|
||||||
|
MenuList.SetItemButtonAction(2, b => {
|
||||||
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechDisplayControlsVisible);
|
||||||
|
MenuList.SetFeedback(2, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
MenuList.SetItemMainText(3, "Panel Setup");
|
||||||
|
MenuList.SetItemButtonAction(3, b => {
|
||||||
|
if (b) PagesInterlock.ShowInterlocked(UIBoolJoin.TechPanelSetupVisible);
|
||||||
|
MenuList.SetFeedback(3, true);
|
||||||
|
});
|
||||||
|
MenuList.Count = 3;
|
||||||
|
|
||||||
|
BuildStatusList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public override void Show()
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, true);
|
||||||
|
PagesInterlock.Show();
|
||||||
|
base.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public override void Hide()
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.TechCommonItemsVisbible, false);
|
||||||
|
PagesInterlock.Hide();
|
||||||
|
base.Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
void BuildStatusList()
|
||||||
|
{
|
||||||
|
StatusList = new SubpageReferenceList(TriList, UISmartObjectJoin.TechStatusList, 3, 3, 3);
|
||||||
|
StatusListDeviceIndexes = new Dictionary<ICommunicationMonitor, uint>();
|
||||||
|
uint i = 0;
|
||||||
|
foreach (var d in DeviceManager.AllDevices)
|
||||||
|
{
|
||||||
|
// make sure it is both ICommunicationMonitor and a Device
|
||||||
|
var sd = d as ICommunicationMonitor;
|
||||||
|
if (sd == null)
|
||||||
|
continue;
|
||||||
|
var dd = sd as Device;
|
||||||
|
if(dd == null)
|
||||||
|
continue;
|
||||||
|
i++;
|
||||||
|
StatusList.StringInputSig(i, 1).StringValue = dd.Name;
|
||||||
|
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)sd.CommunicationMonitor.Status;
|
||||||
|
StatusListDeviceIndexes.Add(sd, i);
|
||||||
|
sd.CommunicationMonitor.StatusChange += CommunicationMonitor_StatusChange ;
|
||||||
|
}
|
||||||
|
StatusList.Count = (ushort)i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
|
||||||
|
{
|
||||||
|
var c = sender as ICommunicationMonitor;
|
||||||
|
if (StatusListDeviceIndexes.ContainsKey(c))
|
||||||
|
{
|
||||||
|
var i = StatusListDeviceIndexes[c];
|
||||||
|
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -121,16 +121,47 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
JoinedSigInterlock StagingBarInterlock;
|
JoinedSigInterlock StagingBarInterlock;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Interlocks the various call-related subpages
|
||||||
|
/// </summary>
|
||||||
JoinedSigInterlock CallPagesInterlock;
|
JoinedSigInterlock CallPagesInterlock;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The Video codec driver
|
||||||
|
/// </summary>
|
||||||
PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver VCDriver;
|
PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver VCDriver;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The driver for the tech page. Lazy getter for memory usage
|
||||||
|
/// </summary>
|
||||||
|
PepperDash.Essentials.UIDrivers.EssentialsHuddleTechPageDriver TechDriver
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_TechDriver == null)
|
||||||
|
_TechDriver = new PepperDash.Essentials.UIDrivers.EssentialsHuddleTechPageDriver(TriList, this);
|
||||||
|
return _TechDriver;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PepperDash.Essentials.UIDrivers.EssentialsHuddleTechPageDriver _TechDriver;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Controls timeout of notification ribbon timer
|
||||||
|
/// </summary>
|
||||||
CTimer RibbonTimer;
|
CTimer RibbonTimer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The keyboard
|
||||||
|
/// </summary>
|
||||||
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The mode showing. Presentation or call.
|
||||||
|
/// </summary>
|
||||||
UiDisplayMode CurrentMode = UiDisplayMode.Start;
|
UiDisplayMode CurrentMode = UiDisplayMode.Start;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -277,14 +308,14 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
// Setup button - shows volumes with default button OR hold for tech page
|
// Setup button - shows volumes with default button OR hold for tech page
|
||||||
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
TriList.SetSigHeldAction(UIBoolJoin.GearHeaderButtonPress, 2000,
|
||||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.TechPanelSetupVisible),
|
ShowTech,
|
||||||
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
|
() => PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.VolumesPageVisible));
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.TechPagesExitButton, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.TechExitButton, () =>
|
||||||
PopupInterlock.HideAndClear());
|
PopupInterlock.HideAndClear());
|
||||||
|
|
||||||
// Default Volume button
|
// Volume related things
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VolumeDefaultPress, () => CurrentRoom.SetDefaultLevels());
|
TriList.SetSigFalseAction(UIBoolJoin.VolumeDefaultPress, () => CurrentRoom.SetDefaultLevels());
|
||||||
|
TriList.SetString(UIStringJoin.AdvancedVolumeSlider1Text, "Room");
|
||||||
|
|
||||||
if (TriList is CrestronApp)
|
if (TriList is CrestronApp)
|
||||||
TriList.BooleanInput[UIBoolJoin.GearButtonVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.GearButtonVisible].BoolValue = false;
|
||||||
@@ -379,6 +410,15 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reveals the tech page and puts away anything that's in the way.
|
||||||
|
/// </summary>
|
||||||
|
void ShowTech()
|
||||||
|
{
|
||||||
|
PopupInterlock.HideAndClear();
|
||||||
|
TechDriver.Show();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// When the room is off, set the footer SRL
|
/// When the room is off, set the footer SRL
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -710,13 +750,13 @@ namespace PepperDash.Essentials
|
|||||||
if (!srcConfig.IncludeInSourceList) // Skip sources marked this way
|
if (!srcConfig.IncludeInSourceList) // Skip sources marked this way
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var actualSource = DeviceManager.GetDeviceForKey(srcConfig.SourceKey) as Device;
|
//var actualSource = DeviceManager.GetDeviceForKey(srcConfig.SourceKey) as Device;
|
||||||
if (actualSource == null)
|
//if (actualSource == null)
|
||||||
{
|
//{
|
||||||
Debug.Console(1, "Cannot assign missing source '{0}' to source UI list",
|
// Debug.Console(1, "Cannot assign missing source '{0}' to source UI list",
|
||||||
srcConfig.SourceKey);
|
// srcConfig.SourceKey);
|
||||||
continue;
|
// continue;
|
||||||
}
|
//}
|
||||||
var routeKey = kvp.Key;
|
var routeKey = kvp.Key;
|
||||||
var item = new SubpageReferenceListSourceItem(i++, SourceStagingSrl, srcConfig,
|
var item = new SubpageReferenceListSourceItem(i++, SourceStagingSrl, srcConfig,
|
||||||
b => { if (!b) UiSelectSource(routeKey); });
|
b => { if (!b) UiSelectSource(routeKey); });
|
||||||
99
Essentials/PepperDashEssentials/UIDrivers/SigInterlock.cs
Normal file
99
Essentials/PepperDashEssentials/UIDrivers/SigInterlock.cs
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Used for interlocking sigs, using a set-clears-last-set model.
|
||||||
|
/// </summary>
|
||||||
|
public class SigInterlock
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public BoolInputSig CurrentSig { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public SigInterlock()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hides CurrentJoin and shows join. Does nothing when resending CurrentJoin
|
||||||
|
/// </summary>
|
||||||
|
public void ShowInterlocked(BoolInputSig sig)
|
||||||
|
{
|
||||||
|
if (CurrentSig == sig)
|
||||||
|
return;
|
||||||
|
SetButDontShow(sig);
|
||||||
|
sig.BoolValue = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="join"></param>
|
||||||
|
public void ShowInterlockedWithToggle(BoolInputSig sig)
|
||||||
|
{
|
||||||
|
if(CurrentSig == sig)
|
||||||
|
HideAndClear();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(CurrentSig != null)
|
||||||
|
CurrentSig.BoolValue = false;
|
||||||
|
CurrentSig = sig;
|
||||||
|
CurrentSig.BoolValue = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hides current Sig and clears CurrentSig
|
||||||
|
/// </summary>
|
||||||
|
public void HideAndClear()
|
||||||
|
{
|
||||||
|
Hide();
|
||||||
|
CurrentSig = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hides the current Sig but does not clear the selected Sig in case
|
||||||
|
/// it needs to be reshown
|
||||||
|
/// </summary>
|
||||||
|
public void Hide()
|
||||||
|
{
|
||||||
|
if(CurrentSig != null)
|
||||||
|
CurrentSig.BoolValue = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If CurrentSig is set, it restores that Sig
|
||||||
|
/// </summary>
|
||||||
|
public void Show()
|
||||||
|
{
|
||||||
|
if(CurrentSig != null)
|
||||||
|
CurrentSig.BoolValue = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Useful for pre-setting the interlock but not enabling it. Sets CurrentSig
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="join"></param>
|
||||||
|
public void SetButDontShow(BoolInputSig sig)
|
||||||
|
{
|
||||||
|
if (CurrentSig != null)
|
||||||
|
CurrentSig.BoolValue = false;
|
||||||
|
CurrentSig = sig;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user