mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-16 05:05:00 +00:00
Merge remote-tracking branch 'origin/feature/ecs-407' into feature/cisco-spark
This commit is contained in:
@@ -1,61 +1,61 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common
|
namespace PepperDash.Essentials.Devices.Common
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This DVD class should cover most IR, one-way DVD and Bluray fuctions
|
/// This DVD class should cover most IR, one-way DVD and Bluray fuctions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking
|
public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking
|
||||||
{
|
{
|
||||||
public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } }
|
public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } }
|
||||||
public string IconName { get; set; }
|
public string IconName { get; set; }
|
||||||
public BoolFeedback HasPowerOnFeedback { get; private set; }
|
public BoolFeedback HasPowerOnFeedback { get; private set; }
|
||||||
|
|
||||||
public RoutingOutputPort AnyVideoOut { get; private set; }
|
public RoutingOutputPort AnyVideoOut { get; private set; }
|
||||||
|
|
||||||
#region IRoutingOutputs Members
|
#region IRoutingOutputs Members
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Options: hdmi
|
/// Options: hdmi
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public InRoomPc(string key, string name)
|
public InRoomPc(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
IconName = "PC";
|
IconName = "PC";
|
||||||
HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback,
|
HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback,
|
||||||
() => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus);
|
() => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus);
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
||||||
OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo,
|
OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo,
|
||||||
eRoutingPortConnectionType.None, 0, this));
|
eRoutingPortConnectionType.None, 0, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IHasFeedback Members
|
#region IHasFeedback Members
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Passes through the VideoStatuses list
|
/// Passes through the VideoStatuses list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Feedback> Feedbacks
|
public List<Feedback> Feedbacks
|
||||||
{
|
{
|
||||||
get { return this.GetVideoStatuses().ToList(); }
|
get { return this.GetVideoStatuses().ToList(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IUsageTracking Members
|
#region IUsageTracking Members
|
||||||
|
|
||||||
public UsageTracking UsageTracker { get; set; }
|
public UsageTracking UsageTracker { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,6 +63,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Func<bool> MuteFeedbackFunc
|
||||||
|
{
|
||||||
|
get { return () => false; }
|
||||||
|
}
|
||||||
|
|
||||||
//private HttpsClient Client;
|
//private HttpsClient Client;
|
||||||
|
|
||||||
//private HttpApiServer Server;
|
//private HttpApiServer Server;
|
||||||
@@ -703,6 +708,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
{
|
{
|
||||||
SendText("xCommand SystemUnit Boot Action: Restart");
|
SendText("xCommand SystemUnit Boot Action: Restart");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void MuteOff()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MuteOn()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetVolume(ushort level)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MuteToggle()
|
||||||
|
{
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -14,7 +14,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
public MockVC(string key, string name)
|
public MockVC(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
|
MuteFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Mute={0}", _IsMuted);
|
||||||
|
VolumeLevelFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Volume={0}", _VolumeLevel);
|
||||||
|
InCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "InCall={0}", _InCall);
|
||||||
|
IncomingCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "IncomingCall={0}", _IncomingCall);
|
||||||
|
TransmitLevelFeedback.OutputChange += (o,a)=> Debug.Console(1, this, "TransmitLevel={0}", _tra
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Func<bool> InCallFeedbackFunc
|
protected override Func<bool> InCallFeedbackFunc
|
||||||
@@ -29,6 +33,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
bool _IncomingCall;
|
bool _IncomingCall;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected override Func<bool> TransmitMuteFeedbackFunc
|
protected override Func<bool> TransmitMuteFeedbackFunc
|
||||||
{
|
{
|
||||||
get { return () => _TransmitMute; }
|
get { return () => _TransmitMute; }
|
||||||
@@ -49,8 +55,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
protected override Func<int> VolumeLevelFeedbackFunc
|
protected override Func<int> VolumeLevelFeedbackFunc
|
||||||
{
|
{
|
||||||
get { throw new NotImplementedException(); }
|
get { return () => _VolumeLevel; }
|
||||||
}
|
}
|
||||||
|
int _VolumeLevel;
|
||||||
|
|
||||||
|
protected override Func<bool> MuteFeedbackFunc
|
||||||
|
{
|
||||||
|
get { return () => _IsMuted; }
|
||||||
|
}
|
||||||
|
bool _IsMuted;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dials, yo!
|
/// Dials, yo!
|
||||||
@@ -118,6 +131,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void MuteOff()
|
||||||
|
{
|
||||||
|
_IsMuted = false;
|
||||||
|
MuteFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MuteOn()
|
||||||
|
{
|
||||||
|
_IsMuted = true;
|
||||||
|
MuteFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MuteToggle()
|
||||||
|
{
|
||||||
|
_IsMuted = !_IsMuted;
|
||||||
|
MuteFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetVolume(ushort level)
|
||||||
|
{
|
||||||
|
_VolumeLevel = level;
|
||||||
|
VolumeLevelFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -241,5 +279,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
Debug.Console(1, this, "TestFarEndHangup");
|
Debug.Console(1, this, "TestFarEndHangup");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
abstract protected Func<bool> ReceiveMuteFeedbackFunc { get; }
|
abstract protected Func<bool> ReceiveMuteFeedbackFunc { get; }
|
||||||
abstract protected Func<bool> PrivacyModeFeedbackFunc { get; }
|
abstract protected Func<bool> PrivacyModeFeedbackFunc { get; }
|
||||||
|
|
||||||
|
#warning WILL ADD TRANSMIT AND REVEICE LEVEL FUNCS AFTER MERGE
|
||||||
abstract protected Func<int> VolumeLevelFeedbackFunc { get; }
|
abstract protected Func<int> VolumeLevelFeedbackFunc { get; }
|
||||||
|
abstract protected Func<bool> MuteFeedbackFunc { get; }
|
||||||
|
|
||||||
public VideoCodecBase(string key, string name)
|
public VideoCodecBase(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
@@ -42,8 +44,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc);
|
ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc);
|
||||||
TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc);
|
TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc);
|
||||||
PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc);
|
PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc);
|
||||||
|
#warning ADDING TX/RX FEEDBACKS HERE
|
||||||
|
|
||||||
VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc);
|
VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc);
|
||||||
|
MuteFeedback = new BoolFeedback(MuteFeedbackFunc);
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
||||||
|
|
||||||
|
|||||||
@@ -128,12 +128,12 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CODEC TESTING
|
// CODEC TESTING
|
||||||
GenericSshClient TestCodecClient = new GenericSshClient("TestCodec-1--SshClient", "10.11.50.135", 22, "crestron", "2H3Zu&OvgXp6");
|
//GenericSshClient TestCodecClient = new GenericSshClient("TestCodec-1--SshClient", "10.11.50.135", 22, "crestron", "2H3Zu&OvgXp6");
|
||||||
|
|
||||||
PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec TestCodec =
|
//PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec TestCodec =
|
||||||
new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080);
|
// new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080);
|
||||||
|
|
||||||
TestCodec.CustomActivate();
|
//TestCodec.CustomActivate();
|
||||||
|
|
||||||
// CODEC TESTING
|
// CODEC TESTING
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as
|
var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as
|
||||||
PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
|
PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
|
||||||
|
|
||||||
var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, disp, codec, props);
|
var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, codec, codec, props);
|
||||||
rm.LogoUrl = props.Logo.GetUrl();
|
rm.LogoUrl = props.Logo.GetUrl();
|
||||||
rm.SourceListKey = props.SourceListKey;
|
rm.SourceListKey = props.SourceListKey;
|
||||||
rm.DefaultSourceItem = props.DefaultSourceItem;
|
rm.DefaultSourceItem = props.DefaultSourceItem;
|
||||||
|
|||||||
@@ -235,97 +235,64 @@ namespace PepperDash.Essentials
|
|||||||
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 =>
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Run route action '{0}'", routeKey);
|
try
|
||||||
var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
|
{
|
||||||
if(dict == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to get the list item by it's string key
|
Debug.Console(1, this, "Run route action '{0}'", routeKey);
|
||||||
if (!dict.ContainsKey(routeKey))
|
var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
|
||||||
{
|
if (dict == null)
|
||||||
Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
|
{
|
||||||
routeKey, SourceListKey);
|
Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var item = dict[routeKey];
|
// Try to get the list item by it's string key
|
||||||
|
if (!dict.ContainsKey(routeKey))
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
|
||||||
|
routeKey, SourceListKey);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// End usage timer on last source
|
// End usage timer on last source
|
||||||
if (!string.IsNullOrEmpty(LastSourceKey))
|
if (!string.IsNullOrEmpty(LastSourceKey))
|
||||||
{
|
{
|
||||||
var lastSource = dict[LastSourceKey].SourceDevice;
|
var usageLastSource = dict[LastSourceKey].SourceDevice as IUsageTracking;
|
||||||
|
if (usageLastSource != null && usageLastSource.UsageTracker != null)
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (lastSource != null && lastSource is IUsageTracking)
|
try
|
||||||
(lastSource as IUsageTracking).UsageTracker.EndDeviceUsage();
|
{
|
||||||
}
|
// There MAY have been failures in here. Protect
|
||||||
catch (Exception e)
|
usageLastSource.UsageTracker.EndDeviceUsage();
|
||||||
{
|
}
|
||||||
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e);
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking:\r{0}", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's run it
|
// Let's run it
|
||||||
|
var item = dict[routeKey];
|
||||||
if (routeKey.ToLower() != "roomoff")
|
if (routeKey.ToLower() != "roomoff")
|
||||||
{
|
|
||||||
LastSourceKey = routeKey;
|
LastSourceKey = routeKey;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
CurrentSourceInfoKey = null;
|
CurrentSourceInfoKey = null;
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var route in item.RouteList)
|
// hand off the individual routes to this helper
|
||||||
{
|
foreach (var route in item.RouteList)
|
||||||
// if there is a $defaultAll on route, run two separate
|
DoRouteItem(route);
|
||||||
if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
// Going to assume a single-path route for now
|
|
||||||
var tempVideo = new SourceRouteListItem
|
|
||||||
{
|
|
||||||
DestinationKey = "$defaultDisplay",
|
|
||||||
SourceKey = route.SourceKey,
|
|
||||||
Type = eRoutingSignalType.Video
|
|
||||||
};
|
|
||||||
DoRoute(tempVideo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DoRoute(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start usage timer on routed source
|
// Start usage timer on routed source
|
||||||
if (item.SourceDevice is IUsageTracking)
|
var usageNewSource = item.SourceDevice as IUsageTracking;
|
||||||
|
if (usageNewSource != null && usageNewSource.UsageTracker != null) // Have to make sure there is a usage tracker!
|
||||||
{
|
{
|
||||||
(item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
|
(item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// store the name and UI info for routes
|
||||||
// Set volume control on room, using default if non provided
|
|
||||||
IBasicVolumeControls volDev = null;
|
|
||||||
// Handle special cases for volume control
|
|
||||||
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;
|
|
||||||
// Or a specific device, probably rarely used.
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
|
|
||||||
if (dev is IBasicVolumeControls)
|
|
||||||
volDev = dev as IBasicVolumeControls;
|
|
||||||
else if (dev is IHasVolumeDevice)
|
|
||||||
volDev = (dev as IHasVolumeDevice).VolumeDevice;
|
|
||||||
}
|
|
||||||
CurrentVolumeControls = volDev;
|
|
||||||
|
|
||||||
// store the name and UI info for routes
|
|
||||||
if (item.SourceKey == "$off")
|
if (item.SourceKey == "$off")
|
||||||
{
|
{
|
||||||
CurrentSourceInfoKey = routeKey;
|
CurrentSourceInfoKey = routeKey;
|
||||||
@@ -337,24 +304,41 @@ namespace PepperDash.Essentials
|
|||||||
CurrentSourceInfo = item;
|
CurrentSourceInfo = item;
|
||||||
}
|
}
|
||||||
|
|
||||||
OnFeedback.FireUpdate();
|
OnFeedback.FireUpdate();
|
||||||
|
|
||||||
// report back when done
|
// report back when done
|
||||||
if (successCallback != null)
|
if (successCallback != null)
|
||||||
successCallback();
|
successCallback();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "ERROR in routing: {0}", e);
|
||||||
|
}
|
||||||
|
|
||||||
}, 0); // end of CTimer
|
}, 0); // end of CTimer
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Will power the room on with the last-used source
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void PowerOnToDefaultOrLastSource()
|
/// <param name="route"></param>
|
||||||
{
|
void DoRouteItem(SourceRouteListItem route)
|
||||||
if (!EnablePowerOnToLastSource || LastSourceKey == null)
|
{
|
||||||
return;
|
// if there is a $defaultAll on route, run two separate
|
||||||
RunRouteAction(LastSourceKey);
|
if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
|
||||||
}
|
{
|
||||||
|
// Going to assume a single-path route for now
|
||||||
|
var tempVideo = new SourceRouteListItem
|
||||||
|
{
|
||||||
|
DestinationKey = "$defaultDisplay",
|
||||||
|
SourceKey = route.SourceKey,
|
||||||
|
Type = eRoutingSignalType.Video
|
||||||
|
};
|
||||||
|
DoRoute(tempVideo);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
DoRoute(route);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -397,6 +381,16 @@ namespace PepperDash.Essentials
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Will power the room on with the last-used source
|
||||||
|
/// </summary>
|
||||||
|
public void PowerOnToDefaultOrLastSource()
|
||||||
|
{
|
||||||
|
if (!EnablePowerOnToLastSource || LastSourceKey == null)
|
||||||
|
return;
|
||||||
|
RunRouteAction(LastSourceKey);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
|
/// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
{
|
{
|
||||||
// Video Codec
|
// Video Codec
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1234 - 0 = Connect, 1 = End
|
/// 1234: values 0 = Connect, 1 = End
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCStagingConnectButtonMode = 1234;
|
public const uint VCStagingConnectButtonMode = 1234;
|
||||||
|
|
||||||
|
|||||||
@@ -388,7 +388,7 @@ namespace PepperDash.Essentials
|
|||||||
b => { if (!b) ActivityShareButtonPressed(); }));
|
b => { if (!b) ActivityShareButtonPressed(); }));
|
||||||
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl,
|
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl,
|
||||||
3, b => { if (!b) PowerButtonPressed(); }));
|
3, b => { if (!b) PowerButtonPressed(); }));
|
||||||
ActivityFooterSrl.Count = 2;
|
ActivityFooterSrl.Count = 3;
|
||||||
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1;
|
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1;
|
||||||
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1);
|
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1);
|
||||||
|
|
||||||
@@ -757,7 +757,11 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="e"></param>
|
||||||
void IsCoolingDownFeedback_OutputChange(object sender, EventArgs e)
|
void IsCoolingDownFeedback_OutputChange(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var value = CurrentRoom.IsCoolingDownFeedback.BoolValue;
|
var value = CurrentRoom.IsCoolingDownFeedback.BoolValue;
|
||||||
|
|||||||
@@ -1,250 +1,246 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials;
|
using PepperDash.Essentials;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.SmartObjects;
|
using PepperDash.Essentials.Core.SmartObjects;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.UIDrivers.VC
|
namespace PepperDash.Essentials.UIDrivers.VC
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This fella will likely need to interact with the room's source, although that is routed via the spark...
|
/// This fella will likely need to interact with the room's source, although that is routed via the spark...
|
||||||
/// Probably needs event or FB to feed AV driver - to show two-mute volume when appropriate.
|
/// Probably needs event or FB to feed AV driver - to show two-mute volume when appropriate.
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class EssentialsVideoCodecUiDriver : PanelDriverBase
|
public class EssentialsVideoCodecUiDriver : PanelDriverBase
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
VideoCodecBase Codec;
|
VideoCodecBase Codec;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
SmartObjectDynamicList DirectorySrl; // ***************** SRL ???
|
SmartObjectDynamicList DirectorySrl; // ***************** SRL ???
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// To drive UI elements outside of this driver that may be dependent on this.
|
/// To drive UI elements outside of this driver that may be dependent on this.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
BoolFeedback InCall;
|
BoolFeedback InCall;
|
||||||
BoolFeedback LocalPrivacyIsMuted;
|
BoolFeedback LocalPrivacyIsMuted;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For the subpages above the bar
|
/// For the subpages above the bar
|
||||||
/// </summary>
|
/// </summary>
|
||||||
JoinedSigInterlock VCControlsInterlock;
|
JoinedSigInterlock VCControlsInterlock;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For the different staging bars: Active, inactive
|
/// For the different staging bars: Active, inactive
|
||||||
/// </summary>
|
/// </summary>
|
||||||
JoinedSigInterlock StagingBarInterlock;
|
JoinedSigInterlock StagingBarInterlock;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For the staging button feedbacks
|
/// For the staging button feedbacks
|
||||||
/// </summary>
|
/// </summary>
|
||||||
JoinedSigInterlock StagingButtonFeedbackInterlock;
|
JoinedSigInterlock StagingButtonFeedbackInterlock;
|
||||||
|
|
||||||
SmartObjectNumeric DialKeypad;
|
SmartObjectNumeric DialKeypad;
|
||||||
|
|
||||||
// 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();
|
||||||
BoolFeedback DialStringBackspaceVisibleFeedback;
|
BoolFeedback DialStringBackspaceVisibleFeedback;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="triList"></param>
|
/// <param name="triList"></param>
|
||||||
/// <param name="codec"></param>
|
/// <param name="codec"></param>
|
||||||
public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec)
|
public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec)
|
||||||
: base(triList)
|
: base(triList)
|
||||||
{
|
{
|
||||||
Codec = codec;
|
Codec = codec;
|
||||||
SetupCallStagingPopover();
|
SetupCallStagingPopover();
|
||||||
SetupDialKeypad();
|
SetupDialKeypad();
|
||||||
|
|
||||||
InCall = new BoolFeedback(() => false);
|
InCall = new BoolFeedback(() => false);
|
||||||
LocalPrivacyIsMuted = new BoolFeedback(() => false);
|
LocalPrivacyIsMuted = new BoolFeedback(() => false);
|
||||||
|
|
||||||
//DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3);
|
//DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3);
|
||||||
|
|
||||||
VCControlsInterlock = new JoinedSigInterlock(triList);
|
VCControlsInterlock = new JoinedSigInterlock(triList);
|
||||||
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible);
|
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible);
|
||||||
|
|
||||||
StagingBarInterlock = new JoinedSigInterlock(triList);
|
StagingBarInterlock = new JoinedSigInterlock(triList);
|
||||||
StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
|
StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
|
||||||
|
|
||||||
StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList);
|
StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList);
|
||||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
|
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
|
||||||
|
|
||||||
DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString());
|
DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString());
|
||||||
DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]);
|
DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]);
|
||||||
|
|
||||||
DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0);
|
DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0);
|
||||||
DialStringBackspaceVisibleFeedback
|
DialStringBackspaceVisibleFeedback
|
||||||
.LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]);
|
.LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]);
|
||||||
|
|
||||||
Codec.InCallFeedback.OutputChange += new EventHandler<EventArgs>(InCallFeedback_OutputChange);
|
Codec.InCallFeedback.OutputChange += new EventHandler<EventArgs>(InCallFeedback_OutputChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Show()
|
public override void Show()
|
||||||
{
|
{
|
||||||
VCControlsInterlock.Show();
|
VCControlsInterlock.Show();
|
||||||
StagingBarInterlock.Show();
|
StagingBarInterlock.Show();
|
||||||
base.Show();
|
base.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void Hide()
|
public override void Hide()
|
||||||
{
|
{
|
||||||
VCControlsInterlock.Hide();
|
VCControlsInterlock.Hide();
|
||||||
StagingBarInterlock.Hide();
|
StagingBarInterlock.Hide();
|
||||||
base.Hide();
|
base.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Builds the call stage
|
/// Builds the call stage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void SetupCallStagingPopover()
|
void SetupCallStagingPopover()
|
||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory);
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad);
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void SetupDialKeypad()
|
void SetupDialKeypad()
|
||||||
{
|
{
|
||||||
if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad))
|
if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad))
|
||||||
{
|
{
|
||||||
DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true);
|
DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true);
|
||||||
DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0"));
|
DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0"));
|
||||||
DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1"));
|
DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1"));
|
||||||
DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2"));
|
DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2"));
|
||||||
DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3"));
|
DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3"));
|
||||||
DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4"));
|
DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4"));
|
||||||
DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5"));
|
DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5"));
|
||||||
DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6"));
|
DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6"));
|
||||||
DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7"));
|
DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7"));
|
||||||
DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8"));
|
DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8"));
|
||||||
DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9"));
|
DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9"));
|
||||||
DialKeypad.Misc1SigName = "*";
|
DialKeypad.Misc1SigName = "*";
|
||||||
DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*"));
|
DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*"));
|
||||||
DialKeypad.Misc2SigName = "#";
|
DialKeypad.Misc2SigName = "#";
|
||||||
DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#"));
|
DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#"));
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress);
|
TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP",
|
Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP",
|
||||||
TriList.ID, UISmartObjectJoin.VCDialKeypad);
|
TriList.ID, UISmartObjectJoin.VCDialKeypad);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void ShowCameraControls()
|
void ShowCameraControls()
|
||||||
{
|
{
|
||||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible);
|
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible);
|
||||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
|
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowKeypad()
|
void ShowKeypad()
|
||||||
{
|
{
|
||||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
|
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
|
||||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowDirectory()
|
void ShowDirectory()
|
||||||
{
|
{
|
||||||
// populate directory
|
// populate directory
|
||||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
||||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
|
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowRecents()
|
void ShowRecents()
|
||||||
{
|
{
|
||||||
//populate recents
|
//populate recents
|
||||||
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
|
||||||
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void ConnectPress()
|
void ConnectPress()
|
||||||
{
|
{
|
||||||
if (Codec.InCallFeedback.BoolValue)
|
if (Codec.InCallFeedback.BoolValue)
|
||||||
Codec.EndCall();
|
Codec.EndCall();
|
||||||
else
|
else
|
||||||
Codec.Dial(DialStringBuilder.ToString());
|
Codec.Dial(DialStringBuilder.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
void InCallFeedback_OutputChange(object sender, EventArgs e)
|
||||||
void InCallFeedback_OutputChange(object sender, EventArgs e)
|
{
|
||||||
{
|
var inCall = Codec.InCallFeedback.BoolValue;
|
||||||
#warning mode does not change!
|
Debug.Console(1, "*#* Codec Driver InCallFeedback change={0}", InCall);
|
||||||
var inCall = Codec.InCallFeedback.BoolValue;
|
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0);
|
||||||
Debug.Console(2, "*#* Codec Driver InCallFeedback change={0}", InCall);
|
StagingBarInterlock.ShowInterlocked(
|
||||||
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0);
|
inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
|
||||||
StagingBarInterlock.ShowInterlocked(
|
|
||||||
inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
|
if (Codec.InCallFeedback.BoolValue) // Call is starting
|
||||||
|
{
|
||||||
if (Codec.InCallFeedback.BoolValue) // Call is starting
|
// Header icon
|
||||||
{
|
// Volume bar needs to have mic mute
|
||||||
// Header icon
|
}
|
||||||
// Add end call button to stage
|
else // ending
|
||||||
// Volume bar needs to have mic mute
|
{
|
||||||
}
|
// Header icon
|
||||||
else // ending
|
// Volume bar no mic mute (or hidden if no source?)
|
||||||
{
|
}
|
||||||
// Header icon
|
}
|
||||||
// Remove end call
|
|
||||||
// Volume bar no mic mute (or hidden if no source?)
|
/// <summary>
|
||||||
}
|
///
|
||||||
}
|
/// </summary>
|
||||||
|
/// <param name="i"></param>
|
||||||
/// <summary>
|
void DialKeypadPress(string i)
|
||||||
///
|
{
|
||||||
/// </summary>
|
DialStringBuilder.Append(i);
|
||||||
/// <param name="i"></param>
|
DialStringFeedback.FireUpdate();
|
||||||
void DialKeypadPress(string i)
|
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
|
||||||
{
|
DialStringBuilder.Length > 0;
|
||||||
DialStringBuilder.Append(i);
|
}
|
||||||
DialStringFeedback.FireUpdate();
|
|
||||||
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
|
/// <summary>
|
||||||
DialStringBuilder.Length > 0;
|
///
|
||||||
}
|
/// </summary>
|
||||||
|
void DialKeypadBackspacePress()
|
||||||
/// <summary>
|
{
|
||||||
///
|
DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1);
|
||||||
/// </summary>
|
DialStringFeedback.FireUpdate();
|
||||||
void DialKeypadBackspacePress()
|
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
|
||||||
{
|
DialStringBuilder.Length > 0;
|
||||||
DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1);
|
TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0);
|
||||||
DialStringFeedback.FireUpdate();
|
}
|
||||||
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
|
}
|
||||||
DialStringBuilder.Length > 0;
|
|
||||||
TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user