Merge remote-tracking branch 'origin/feature/ecs-407' into feature/cisco-spark

This commit is contained in:
Neil Dorin
2017-09-15 11:30:04 -06:00
12 changed files with 454 additions and 396 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -237,6 +237,9 @@ namespace PepperDash.Essentials
// Run this on a separate thread // Run this on a separate thread
new CTimer(o => new CTimer(o =>
{ {
try
{
Debug.Console(1, this, "Run route action '{0}'", routeKey); Debug.Console(1, this, "Run route action '{0}'", routeKey);
var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey); var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
if (dict == null) if (dict == null)
@@ -253,78 +256,42 @@ namespace PepperDash.Essentials
return; return;
} }
var item = dict[routeKey];
// 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 try
{ {
if (lastSource != null && lastSource is IUsageTracking) // There MAY have been failures in here. Protect
(lastSource as IUsageTracking).UsageTracker.EndDeviceUsage(); usageLastSource.UsageTracker.EndDeviceUsage();
} }
catch (Exception e) catch (Exception e)
{ {
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", 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;
}
// hand off the individual routes to this helper
foreach (var route in item.RouteList) foreach (var route in item.RouteList)
{ DoRouteItem(route);
// if there is a $defaultAll on route, run two separate
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();
} }
// 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 // store the name and UI info for routes
if (item.SourceKey == "$off") if (item.SourceKey == "$off")
{ {
@@ -342,18 +309,35 @@ namespace PepperDash.Essentials
// 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) // if there is a $defaultAll on route, run two separate
return; if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
RunRouteAction(LastSourceKey); {
// 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>

View File

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

View File

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

View File

@@ -199,12 +199,10 @@ namespace PepperDash.Essentials.UIDrivers.VC
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void InCallFeedback_OutputChange(object sender, EventArgs e) void InCallFeedback_OutputChange(object sender, EventArgs e)
{ {
#warning mode does not change!
var inCall = Codec.InCallFeedback.BoolValue; var inCall = Codec.InCallFeedback.BoolValue;
Debug.Console(2, "*#* Codec Driver InCallFeedback change={0}", InCall); Debug.Console(1, "*#* Codec Driver InCallFeedback change={0}", InCall);
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0); TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0);
StagingBarInterlock.ShowInterlocked( StagingBarInterlock.ShowInterlocked(
inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
@@ -212,13 +210,11 @@ namespace PepperDash.Essentials.UIDrivers.VC
if (Codec.InCallFeedback.BoolValue) // Call is starting if (Codec.InCallFeedback.BoolValue) // Call is starting
{ {
// Header icon // Header icon
// Add end call button to stage
// Volume bar needs to have mic mute // Volume bar needs to have mic mute
} }
else // ending else // ending
{ {
// Header icon // Header icon
// Remove end call
// Volume bar no mic mute (or hidden if no source?) // Volume bar no mic mute (or hidden if no source?)
} }
} }