mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-23 08:35:19 +00:00
Compare commits
99 Commits
1.9.2-hotf
...
1.9.5-hotf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a54cd9e1df | ||
|
|
8af7b4b1db | ||
|
|
3edb0145d0 | ||
|
|
0a1af09830 | ||
|
|
532f3ba237 | ||
|
|
e1d9a46284 | ||
|
|
bfd383dfc7 | ||
|
|
8ab87af859 | ||
|
|
47035d8386 | ||
|
|
c84ec4c899 | ||
|
|
4444328600 | ||
|
|
0d3eb42495 | ||
|
|
540a00861c | ||
|
|
0014dd7a14 | ||
|
|
f922b871a1 | ||
|
|
b2331fa1e5 | ||
|
|
8bf4b0d568 | ||
|
|
621205e65c | ||
|
|
62fcf3856f | ||
|
|
dad986414c | ||
|
|
f298b5cc41 | ||
|
|
f8129fe7ae | ||
|
|
dbdaedcca3 | ||
|
|
893950d8c4 | ||
|
|
b780351bf0 | ||
|
|
6a1671aae1 | ||
|
|
9a1a23c88a | ||
|
|
2e4bb7466c | ||
|
|
36a41ac477 | ||
|
|
92f4d37cd6 | ||
|
|
b9479bab70 | ||
|
|
fd94a94ee9 | ||
|
|
3fa2954ca0 | ||
|
|
c4f6afa412 | ||
|
|
6bdda5451b | ||
|
|
3ee8c07ecd | ||
|
|
01b713e6e1 | ||
|
|
ffd0fbc57b | ||
|
|
23e8280904 | ||
|
|
6708be0d15 | ||
|
|
d193de79da | ||
|
|
87ab43c745 | ||
|
|
2a37e44d7d | ||
|
|
efa801137c | ||
|
|
4b4f1f3c3d | ||
|
|
6e7bf061cf | ||
|
|
7f6160eb44 | ||
|
|
b5004d5b1d | ||
|
|
cea1d2fcdd | ||
|
|
22aea3089d | ||
|
|
43256acfcd | ||
|
|
1696ef3ac1 | ||
|
|
19cbe480a6 | ||
|
|
49c1c61a88 | ||
|
|
0cd3c1bdc5 | ||
|
|
d64cbc639a | ||
|
|
8404e7d5a4 | ||
|
|
e4135a958c | ||
|
|
f4ac4e6319 | ||
|
|
b026174cd2 | ||
|
|
66ff6b2e07 | ||
|
|
e7bbfbd40a | ||
|
|
eec86fde48 | ||
|
|
7b57ce439e | ||
|
|
5d120391a5 | ||
|
|
db5aa319ec | ||
|
|
10f5516a5a | ||
|
|
45e6dff26d | ||
|
|
10129b8178 | ||
|
|
9128e108f7 | ||
|
|
760ec8be92 | ||
|
|
bbcdd3e179 | ||
|
|
7a649f4ea8 | ||
|
|
6946946c12 | ||
|
|
dca73e1508 | ||
|
|
990090e1de | ||
|
|
3b843104d8 | ||
|
|
a37814ab3c | ||
|
|
2181410927 | ||
|
|
d4191ceb75 | ||
|
|
5f6d15c6c0 | ||
|
|
4cc40227fd | ||
|
|
d0dbbe095f | ||
|
|
c7180db2b7 | ||
|
|
d95ee27979 | ||
|
|
e964172200 | ||
|
|
840934502b | ||
|
|
a76f4c15dc | ||
|
|
b19e2e38ad | ||
|
|
9a7fe553f9 | ||
|
|
e6ecaf3a1e | ||
|
|
895b76a0cd | ||
|
|
5c9996e728 | ||
|
|
0cc2328276 | ||
|
|
54769ce270 | ||
|
|
6b85323949 | ||
|
|
4e81859695 | ||
|
|
1ebacf3f0f | ||
|
|
7de0251188 |
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,6 +7,9 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
**Was this bug identified in a specific build version?**
|
||||||
|
Please note the build version where this bug was identified
|
||||||
|
|
||||||
**Describe the bug**
|
**Describe the bug**
|
||||||
A clear and concise description of what the bug is.
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/docker.yml
vendored
6
.github/workflows/docker.yml
vendored
@@ -8,12 +8,9 @@ on:
|
|||||||
- bugfix/*
|
- bugfix/*
|
||||||
- release/*
|
- release/*
|
||||||
- development
|
- development
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- development
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# solution path doesn't need slashes unless there it is multiple folders deep
|
# solution path doesn't need slashes unless it is multiple folders deep
|
||||||
# solution name does not include extension. .sln is assumed
|
# solution name does not include extension. .sln is assumed
|
||||||
SOLUTION_PATH: PepperDashEssentials
|
SOLUTION_PATH: PepperDashEssentials
|
||||||
SOLUTION_FILE: PepperDashEssentials
|
SOLUTION_FILE: PepperDashEssentials
|
||||||
@@ -90,7 +87,6 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
# Upload the build package to the release
|
# Upload the build package to the release
|
||||||
- name: Upload Release Package
|
- name: Upload Release Package
|
||||||
if: contains(env.VERSION,'-rc-') || contains(env.VERSION,'-hotfix-')
|
|
||||||
id: upload_release
|
id: upload_release
|
||||||
uses: actions/upload-release-asset@v1
|
uses: actions/upload-release-asset@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -131,29 +131,46 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS
|
if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on {1} Appliance", Global.AssemblyVersion, Global.ProcessorSeries.ToString());
|
string userFolder;
|
||||||
|
string nvramFolder;
|
||||||
|
bool is4series = false;
|
||||||
|
|
||||||
|
if (eCrestronSeries.Series4 == (Global.ProcessorSeries & eCrestronSeries.Series4)) // Handle 4-series
|
||||||
|
{
|
||||||
|
is4series = true;
|
||||||
|
// Set path to user/
|
||||||
|
userFolder = "user";
|
||||||
|
nvramFolder = "nvram";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
userFolder = "User";
|
||||||
|
nvramFolder = "Nvram";
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on {1} Appliance", Global.AssemblyVersion, is4series ? "4-series" : "3-series");
|
||||||
|
|
||||||
// Check if User/ProgramX exists
|
// Check if User/ProgramX exists
|
||||||
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + "User"
|
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"User/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"{0}/program{1} directory found", userFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
// Check if Nvram/Programx exists
|
// Check if Nvram/Programx exists
|
||||||
else if (Directory.Exists(directoryPrefix + dirSeparator + "Nvram"
|
else if (Directory.Exists(directoryPrefix + dirSeparator + nvramFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"Nvram/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"{0}/program{1} directory found", nvramFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "Nvram"
|
filePathPrefix = directoryPrefix + dirSeparator + nvramFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
// If neither exists, set path to User/ProgramX
|
// If neither exists, set path to User/ProgramX
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, @"No previous directory found. Using User/program{0}", InitialParametersClass.ApplicationNumber);
|
Debug.Console(0, @"No previous directory found. Using {0}/program{1}", userFolder, InitialParametersClass.ApplicationNumber);
|
||||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,7 +452,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
foreach (var roomConfig in ConfigReader.ConfigObject.Rooms)
|
foreach (var roomConfig in ConfigReader.ConfigObject.Rooms)
|
||||||
{
|
{
|
||||||
var room = EssentialsRoomConfigHelper.GetRoomObject(roomConfig) as EssentialsRoomBase;
|
var room = EssentialsRoomConfigHelper.GetRoomObject(roomConfig) as IEssentialsRoom;
|
||||||
if (room != null)
|
if (room != null)
|
||||||
{
|
{
|
||||||
// default IPID
|
// default IPID
|
||||||
@@ -457,7 +474,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (room is EssentialsHuddleSpaceRoom)
|
if (room is IEssentialsHuddleSpaceRoom)
|
||||||
{
|
{
|
||||||
DeviceManager.AddDevice(room);
|
DeviceManager.AddDevice(room);
|
||||||
|
|
||||||
@@ -469,12 +486,12 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
CreateMobileControlBridge(room);
|
CreateMobileControlBridge(room);
|
||||||
}
|
}
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
else if (room is IEssentialsHuddleVtc1Room)
|
||||||
{
|
{
|
||||||
DeviceManager.AddDevice(room);
|
DeviceManager.AddDevice(room);
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleVtc1Room, attempting to add to DeviceManager with Fusion");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleVtc1Room, attempting to add to DeviceManager with Fusion");
|
||||||
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((EssentialsHuddleVtc1Room)room, fusionIpId, fusionJoinMapKey));
|
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((IEssentialsHuddleVtc1Room)room, fusionIpId, fusionJoinMapKey));
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
|
||||||
|
|
||||||
@@ -507,13 +524,22 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void CreateMobileControlBridge(EssentialsRoomBase room)
|
private static void CreateMobileControlBridge(object room)
|
||||||
{
|
{
|
||||||
var mobileControl = GetMobileControlDevice();
|
var mobileControl = GetMobileControlDevice();
|
||||||
|
|
||||||
if (mobileControl == null) return;
|
if (mobileControl == null) return;
|
||||||
|
|
||||||
mobileControl.CreateMobileControlRoomBridge(room, mobileControl);
|
var mobileControl3 = mobileControl as IMobileControl3;
|
||||||
|
|
||||||
|
if (mobileControl3 != null)
|
||||||
|
{
|
||||||
|
mobileControl3.CreateMobileControlRoomBridge(room as IEssentialsRoom, mobileControl);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mobileControl.CreateMobileControlRoomBridge(room as EssentialsRoomBase, mobileControl);
|
||||||
|
}
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Mobile Control Bridge Added...");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
{
|
{
|
||||||
BooleanSigData CodecIsInCall;
|
BooleanSigData CodecIsInCall;
|
||||||
|
|
||||||
public EssentialsHuddleVtc1FusionController(EssentialsHuddleVtc1Room room, uint ipId, string joinMapKey)
|
public EssentialsHuddleVtc1FusionController(IEssentialsHuddleVtc1Room room, uint ipId, string joinMapKey)
|
||||||
: base(room, ipId, joinMapKey)
|
: base(room, ipId, joinMapKey)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var codec = (Room as EssentialsHuddleVtc1Room).VideoCodec;
|
var codec = (Room as IEssentialsHuddleVtc1Room).VideoCodec;
|
||||||
|
|
||||||
if (codec == null)
|
if (codec == null)
|
||||||
{
|
{
|
||||||
@@ -141,7 +141,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
|
|
||||||
void codec_CallStatusChange(object sender, PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs e)
|
void codec_CallStatusChange(object sender, PepperDash.Essentials.Devices.Common.Codec.CodecCallStatusItemChangeEventArgs e)
|
||||||
{
|
{
|
||||||
var codec = (Room as EssentialsHuddleVtc1Room).VideoCodec;
|
var codec = (Room as IEssentialsHuddleVtc1Room).VideoCodec;
|
||||||
|
|
||||||
CodecIsInCall.InputSig.BoolValue = codec.IsInCall;
|
CodecIsInCall.InputSig.BoolValue = codec.IsInCall;
|
||||||
}
|
}
|
||||||
@@ -174,11 +174,11 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
// Moved to
|
// Moved to
|
||||||
CurrentRoomSourceNameSig = FusionRoom.CreateOffsetStringSig(JoinMap.Display1CurrentSourceName.JoinNumber, JoinMap.Display1CurrentSourceName.AttributeName, eSigIoMask.InputSigOnly);
|
CurrentRoomSourceNameSig = FusionRoom.CreateOffsetStringSig(JoinMap.Display1CurrentSourceName.JoinNumber, JoinMap.Display1CurrentSourceName.AttributeName, eSigIoMask.InputSigOnly);
|
||||||
// Don't think we need to get current status of this as nothing should be alive yet.
|
// Don't think we need to get current status of this as nothing should be alive yet.
|
||||||
(Room as EssentialsHuddleVtc1Room).CurrentSourceChange += Room_CurrentSourceInfoChange;
|
(Room as IEssentialsHuddleVtc1Room).CurrentSourceChange += Room_CurrentSourceInfoChange;
|
||||||
|
|
||||||
|
|
||||||
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as EssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
FusionRoom.SystemPowerOn.OutputSig.SetSigFalseAction((Room as IEssentialsHuddleVtc1Room).PowerOnToDefaultOrLastSource);
|
||||||
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey));
|
FusionRoom.SystemPowerOff.OutputSig.SetSigFalseAction(() => (Room as IEssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey));
|
||||||
|
|
||||||
|
|
||||||
CrestronEnvironment.EthernetEventHandler += CrestronEnvironment_EthernetEventHandler;
|
CrestronEnvironment.EthernetEventHandler += CrestronEnvironment_EthernetEventHandler;
|
||||||
@@ -187,7 +187,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
protected override void SetUpSources()
|
protected override void SetUpSources()
|
||||||
{
|
{
|
||||||
// Sources
|
// Sources
|
||||||
var dict = ConfigReader.ConfigObject.GetSourceListForKey((Room as EssentialsHuddleVtc1Room).SourceListKey);
|
var dict = ConfigReader.ConfigObject.GetSourceListForKey((Room as IEssentialsHuddleVtc1Room).SourceListKey);
|
||||||
if (dict != null)
|
if (dict != null)
|
||||||
{
|
{
|
||||||
// NEW PROCESS:
|
// NEW PROCESS:
|
||||||
@@ -238,7 +238,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "WARNING: Config source list '{0}' not found for room '{1}'",
|
Debug.Console(1, this, "WARNING: Config source list '{0}' not found for room '{1}'",
|
||||||
(Room as EssentialsHuddleVtc1Room).SourceListKey, Room.Key);
|
(Room as IEssentialsHuddleVtc1Room).SourceListKey, Room.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +259,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
display.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
display.UsageTracker.DeviceUsageEnded += new EventHandler<DeviceUsageEventArgs>(UsageTracker_DeviceUsageEnded);
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultDisplay = (Room as EssentialsHuddleVtc1Room).DefaultDisplay as DisplayBase;
|
var defaultDisplay = (Room as IEssentialsHuddleVtc1Room).DefaultDisplay as DisplayBase;
|
||||||
if (defaultDisplay == null)
|
if (defaultDisplay == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Cannot link null display to Fusion because default display is null");
|
Debug.Console(1, this, "Cannot link null display to Fusion because default display is null");
|
||||||
@@ -332,7 +332,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
string displayName = string.Format("Display {0} - ", displayIndex);
|
string displayName = string.Format("Display {0} - ", displayIndex);
|
||||||
|
|
||||||
|
|
||||||
if (display == (Room as EssentialsHuddleVtc1Room).DefaultDisplay)
|
if (display == (Room as IEssentialsHuddleVtc1Room).DefaultDisplay)
|
||||||
{
|
{
|
||||||
// Power on
|
// Power on
|
||||||
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
|
var defaultDisplayPowerOn = FusionRoom.CreateOffsetBoolSig((uint)joinOffset, displayName + "Power On", eSigIoMask.InputOutputSig);
|
||||||
@@ -351,7 +351,7 @@ namespace PepperDash.Essentials.Fusion
|
|||||||
|
|
||||||
// Current Source
|
// Current Source
|
||||||
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);
|
var defaultDisplaySourceNone = FusionRoom.CreateOffsetBoolSig((uint)joinOffset + 8, displayName + "Source None", eSigIoMask.InputOutputSig);
|
||||||
defaultDisplaySourceNone.OutputSig.UserObject = new Action<bool>(b => { if (!b) (Room as EssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey); }); ;
|
defaultDisplaySourceNone.OutputSig.UserObject = new Action<bool>(b => { if (!b) (Room as IEssentialsHuddleVtc1Room).RunRouteAction("roomOff", Room.SourceListKey); }); ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,6 +149,7 @@
|
|||||||
<Compile Include="Room\Types\EssentialsNDisplayRoomBase.cs" />
|
<Compile Include="Room\Types\EssentialsNDisplayRoomBase.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsRoomConfig.cs" />
|
<Compile Include="Room\Config\EssentialsRoomConfig.cs" />
|
||||||
<Compile Include="Room\Types\EssentialsTechRoom.cs" />
|
<Compile Include="Room\Types\EssentialsTechRoom.cs" />
|
||||||
|
<Compile Include="Room\Types\IEssentialsHuddleSpaceRoom.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsEnvironmentDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsEnvironmentDriver.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsLightingDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsLightingDriver.cs" />
|
||||||
<Compile Include="UIDrivers\Environment Drivers\EssentialsShadeDriver.cs" />
|
<Compile Include="UIDrivers\Environment Drivers\EssentialsShadeDriver.cs" />
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
/// Gets and operating, standalone emergegncy object that can be plugged into a room.
|
/// Gets and operating, standalone emergegncy object that can be plugged into a room.
|
||||||
/// Returns null if there is no emergency defined
|
/// Returns null if there is no emergency defined
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, EssentialsRoomBase room)
|
public static EssentialsRoomEmergencyBase GetEmergency(EssentialsRoomPropertiesConfig props, IEssentialsRoom room)
|
||||||
{
|
{
|
||||||
// This emergency
|
// This emergency
|
||||||
var emergency = props.Emergency;
|
var emergency = props.Emergency;
|
||||||
@@ -96,7 +96,7 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
if (behaviour == "trackroomstate")
|
if (behaviour == "trackroomstate")
|
||||||
{
|
{
|
||||||
// Tie LED enable to room power state
|
// Tie LED enable to room power state
|
||||||
var essRoom = room as EssentialsRoomBase;
|
var essRoom = room as IEssentialsRoom;
|
||||||
essRoom.OnFeedback.OutputChange += (o, a) =>
|
essRoom.OnFeedback.OutputChange += (o, a) =>
|
||||||
{
|
{
|
||||||
if (essRoom.OnFeedback.BoolValue)
|
if (essRoom.OnFeedback.BoolValue)
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ namespace PepperDash.Essentials.Room
|
|||||||
|
|
||||||
public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
|
public class EssentialsRoomEmergencyContactClosure : EssentialsRoomEmergencyBase
|
||||||
{
|
{
|
||||||
EssentialsRoomBase Room;
|
IEssentialsRoom Room;
|
||||||
string Behavior;
|
string Behavior;
|
||||||
bool TriggerOnClose;
|
bool TriggerOnClose;
|
||||||
|
|
||||||
public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, EssentialsRoomBase room) :
|
public EssentialsRoomEmergencyContactClosure(string key, EssentialsRoomEmergencyConfig config, IEssentialsRoom room) :
|
||||||
base(key)
|
base(key)
|
||||||
{
|
{
|
||||||
Room = room;
|
Room = room;
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -215,7 +215,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||||
@@ -645,9 +645,9 @@ namespace PepperDash.Essentials
|
|||||||
public static void AllRoomsOff()
|
public static void AllRoomsOff()
|
||||||
{
|
{
|
||||||
var allRooms = DeviceManager.AllDevices.Where(d =>
|
var allRooms = DeviceManager.AllDevices.Where(d =>
|
||||||
d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
d is IEssentialsHuddleSpaceRoom && !(d as IEssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
||||||
foreach (var room in allRooms)
|
foreach (var room in allRooms)
|
||||||
(room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff", (room as EssentialsHuddleSpaceRoom).SourceListKey);
|
(room as IEssentialsHuddleSpaceRoom).RunRouteAction("roomOff", (room as IEssentialsHuddleSpaceRoom).SourceListKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IPrivacy Members
|
#region IPrivacy Members
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using PepperDash.Essentials.Room.Config;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasCurrentVolumeControls, IHasDefaultDisplay
|
public class EssentialsHuddleSpaceRoom : EssentialsRoomBase, IEssentialsHuddleSpaceRoom
|
||||||
{
|
{
|
||||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
public event SourceInfoChangeHandler CurrentSourceChange;
|
public event SourceInfoChangeHandler CurrentSourceChange;
|
||||||
@@ -156,7 +156,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSinkWithSwitching;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IRoutingSinkWithSwitching;
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||||
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IHasCurrentSourceInfoChange,
|
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IEssentialsHuddleVtc1Room
|
||||||
IPrivacy, IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay, IHasInCallFeedback
|
|
||||||
{
|
{
|
||||||
private bool _codecExternalSourceChange;
|
private bool _codecExternalSourceChange;
|
||||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
@@ -227,7 +226,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
DefaultAudioDevice = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultAudioKey) as IBasicVolumeControls;
|
||||||
|
|
||||||
Initialize();
|
InitializeRoom();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -235,7 +234,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Initialize()
|
void InitializeRoom()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -455,7 +454,8 @@ namespace PepperDash.Essentials
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
||||||
throw new NotImplementedException();
|
|
||||||
|
RunRouteAction(routeKey, new Action(() => { }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,7 +472,11 @@ namespace PepperDash.Essentials
|
|||||||
RunRouteAction(routeKey, successCallback);
|
RunRouteAction(routeKey, successCallback);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new NotImplementedException();
|
{
|
||||||
|
Debug.Console(1, this, "sourceListKey present but not yet implemented");
|
||||||
|
|
||||||
|
RunRouteAction(routeKey, successCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -734,9 +738,9 @@ namespace PepperDash.Essentials
|
|||||||
public static void AllRoomsOff()
|
public static void AllRoomsOff()
|
||||||
{
|
{
|
||||||
var allRooms = DeviceManager.AllDevices.Where(d =>
|
var allRooms = DeviceManager.AllDevices.Where(d =>
|
||||||
d is EssentialsHuddleSpaceRoom && !(d as EssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
d is IEssentialsRoom && !(d as IEssentialsHuddleSpaceRoom).ExcludeFromGlobalFunctions);
|
||||||
foreach (var room in allRooms)
|
foreach (var room in allRooms)
|
||||||
(room as EssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
|
(room as IEssentialsHuddleSpaceRoom).RunRouteAction("roomOff");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices;
|
||||||
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||||
|
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
bool ExcludeFromGlobalFunctions { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
EssentialsHuddleRoomPropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||||
|
|
||||||
|
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEssentialsHuddleVtc1Room : IEssentialsRoom, IHasCurrentSourceInfoChange,
|
||||||
|
IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
EssentialsHuddleVtc1PropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
IHasScheduleAwareness ScheduleSource { get; }
|
||||||
|
|
||||||
|
string DefaultCodecRouteString { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -79,6 +79,16 @@ namespace PepperDash.Essentials
|
|||||||
Panel = new Tsw1052(id, Global.ControlSystem);
|
Panel = new Tsw1052(id, Global.ControlSystem);
|
||||||
else if (type == "tsw1060")
|
else if (type == "tsw1060")
|
||||||
Panel = new Tsw1060(id, Global.ControlSystem);
|
Panel = new Tsw1060(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw570")
|
||||||
|
Panel = new Tsw570(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw770")
|
||||||
|
Panel = new Tsw770(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts770")
|
||||||
|
Panel = new Ts770(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1070")
|
||||||
|
Panel = new Tsw1070(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts1070")
|
||||||
|
Panel = new Ts1070(id, Global.ControlSystem);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
||||||
@@ -203,7 +213,7 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
public EssentialsTouchpanelControllerFactory()
|
public EssentialsTouchpanelControllerFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string>() { "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "xpanel" };
|
TypeNames = new List<string>() { "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "tsw570", "tsw770", "ts770", "tsw1070", "ts1070", "xpanel" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
@@ -222,7 +232,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
// spin up different room drivers depending on room type
|
// spin up different room drivers depending on room type
|
||||||
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
var room = DeviceManager.GetDeviceForKey(props.DefaultRoomKey);
|
||||||
if (room is EssentialsHuddleSpaceRoom)
|
if (room is IEssentialsHuddleSpaceRoom)
|
||||||
{
|
{
|
||||||
// Screen Saver Driver
|
// Screen Saver Driver
|
||||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, props);
|
||||||
@@ -236,7 +246,7 @@ namespace PepperDash.Essentials
|
|||||||
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props);
|
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, props);
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleSpaceRoom;
|
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
|
||||||
|
|
||||||
// Environment Driver
|
// Environment Driver
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
@@ -270,7 +280,7 @@ namespace PepperDash.Essentials
|
|||||||
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
tsw.Down.UserObject = new Action<bool>(avDriver.VolumeDownPress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (room is EssentialsHuddleVtc1Room)
|
else if (room is IEssentialsHuddleVtc1Room)
|
||||||
{
|
{
|
||||||
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
Debug.Console(0, panelController, "Adding huddle space VTC AV driver");
|
||||||
|
|
||||||
@@ -284,11 +294,11 @@ namespace PepperDash.Essentials
|
|||||||
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props);
|
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, props);
|
||||||
|
|
||||||
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(panelController.Panel, avDriver,
|
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(panelController.Panel, avDriver,
|
||||||
(room as EssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
||||||
avDriver.SetVideoCodecDriver(codecDriver);
|
avDriver.SetVideoCodecDriver(codecDriver);
|
||||||
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
avDriver.DefaultRoomKey = props.DefaultRoomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as EssentialsHuddleVtc1Room;
|
avDriver.CurrentRoom = room as IEssentialsHuddleVtc1Room;
|
||||||
|
|
||||||
// Environment Driver
|
// Environment Driver
|
||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
|
|||||||
@@ -49,6 +49,15 @@ namespace PepperDash.Essentials
|
|||||||
/// 1006
|
/// 1006
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint CallEndAllConfirmVisible = 1006;
|
public const uint CallEndAllConfirmVisible = 1006;
|
||||||
|
/// <summary>
|
||||||
|
/// 1007
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingPasswordVisible = 1007;
|
||||||
|
/// <summary>
|
||||||
|
/// 1008
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingLeavePress = 1008;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -103,7 +112,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1202
|
/// 1202
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCStagingInactivePopoverVisible = 1202;
|
public const uint VCStagingInactivePopoverWithRecentsVisible = 1202;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -121,6 +130,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCRecentsVisible = 1206;
|
public const uint VCRecentsVisible = 1206;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1202
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCStagingInactivePopoverWithoutRecentsVisible = 1207;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1208
|
/// 1208
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -148,6 +162,11 @@ namespace PepperDash.Essentials
|
|||||||
public const uint VCFavoriteVisibleStart = 1221;
|
public const uint VCFavoriteVisibleStart = 1221;
|
||||||
// RANGE IN USE
|
// RANGE IN USE
|
||||||
public const uint VCFavoriteVisibleEnd = 1225;
|
public const uint VCFavoriteVisibleEnd = 1225;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1230
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCStagingMeetNowPress = 1230;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1231
|
/// 1231
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -243,6 +262,10 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint VCCameraSelectBarWithoutModeVisible = 1261;
|
public const uint VCCameraSelectBarWithoutModeVisible = 1261;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 1262
|
||||||
|
/// </summary>
|
||||||
|
public const uint VCCameraAutoModeIsOnFb = 1262;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 1271
|
/// 1271
|
||||||
@@ -743,10 +766,10 @@ namespace PepperDash.Essentials
|
|||||||
/// 15044 Close button for source modal overlay
|
/// 15044 Close button for source modal overlay
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint SourceBackgroundOverlayClosePress = 15044;
|
public const uint SourceBackgroundOverlayClosePress = 15044;
|
||||||
/// <summary>
|
///// <summary>
|
||||||
/// 15045 - Visibility for the bar containing call navigation button list
|
///// 15045 - Visibility for the bar containing call navigation button list
|
||||||
/// </summary>
|
///// </summary>
|
||||||
public const uint CallStagingBarVisible = 15045;
|
//public const uint CallStagingBarVisible = 15045;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 15046
|
/// 15046
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -764,6 +787,10 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint NextMeetingModalVisible = 15049;
|
public const uint NextMeetingModalVisible = 15049;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 15050
|
||||||
|
/// </summary>
|
||||||
|
public const uint NextMeetingNotificationRibbonVisible = 15050;
|
||||||
|
/// <summary>
|
||||||
/// 15051
|
/// 15051
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint Display1SelectPressAndFb = 15051;
|
public const uint Display1SelectPressAndFb = 15051;
|
||||||
@@ -831,6 +858,11 @@ namespace PepperDash.Essentials
|
|||||||
/// 15067
|
/// 15067
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint NotificationRibbonVisible = 15067;
|
public const uint NotificationRibbonVisible = 15067;
|
||||||
|
/// <summary>
|
||||||
|
/// 15068
|
||||||
|
/// </summary>
|
||||||
|
public const uint HeaderMeetingInfoVisible = 15068;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 15083 - Press for Call help desk on AC/VC
|
/// 15083 - Press for Call help desk on AC/VC
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -935,5 +967,24 @@ namespace PepperDash.Essentials
|
|||||||
/// 15214
|
/// 15214
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint PinDialogDot4 = 15214;
|
public const uint PinDialogDot4 = 15214;
|
||||||
|
|
||||||
|
// Password Prompt Dialog **************************
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 15301
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptDialogVisible = 15301;
|
||||||
|
/// <summary>
|
||||||
|
/// 15302
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptTextPress = 15302;
|
||||||
|
/// <summary>
|
||||||
|
/// 15306
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptCancelPress = 15306;
|
||||||
|
/// <summary>
|
||||||
|
/// 15307
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptErrorVisible = 15307;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,23 @@ namespace PepperDash.Essentials
|
|||||||
/// 1004
|
/// 1004
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const uint CallSharedSourceNameText = 1004;
|
public const uint CallSharedSourceNameText = 1004;
|
||||||
|
/// <summary>
|
||||||
|
/// 1005
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingIdText = 1005;
|
||||||
|
/// <summary>
|
||||||
|
/// 1006
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingHostText = 1006;
|
||||||
|
/// <summary>
|
||||||
|
/// 1007
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingPasswordText = 1007;
|
||||||
|
/// <summary>
|
||||||
|
/// 1008
|
||||||
|
/// </summary>
|
||||||
|
public const uint MeetingNameText = 1008;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -118,6 +135,14 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
//----- through 3120
|
//----- through 3120
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 3201
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptMessageText = 3201;
|
||||||
|
/// <summary>
|
||||||
|
/// 3202
|
||||||
|
/// </summary>
|
||||||
|
public const uint PasswordPromptPasswordText = 3202;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 3812
|
/// 3812
|
||||||
|
|||||||
@@ -146,18 +146,18 @@
|
|||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentSourceInfoChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentSourceInfoChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentDisplay1SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentDisplay1SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// TriList.StringInput[UIStringJoin.Display1SourceLabel].StringValue = PendingSource.PreferredName;
|
// TriList.StringInput[UIStringJoin.Display1SourceLabel].StringValue = PendingSource.PreferredName;
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// void CurrentRoom_CurrentDisplay2SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void CurrentRoom_CurrentDisplay2SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// TriList.StringInput[UIStringJoin.Display2SourceLabel].StringValue = PendingSource.PreferredName;
|
// TriList.StringInput[UIStringJoin.Display2SourceLabel].StringValue = PendingSource.PreferredName;
|
||||||
// }
|
// }
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ namespace PepperDash.Essentials
|
|||||||
CaretInterlock = new JoinedSigInterlock(TriList);
|
CaretInterlock = new JoinedSigInterlock(TriList);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetUpGear(IAVDriver avDriver, EssentialsRoomBase currentRoom)
|
void SetUpGear(IAVDriver avDriver, IEssentialsRoom currentRoom)
|
||||||
{
|
{
|
||||||
// Gear
|
// Gear
|
||||||
TriList.SetString(UIStringJoin.HeaderButtonIcon5, "Gear");
|
TriList.SetString(UIStringJoin.HeaderButtonIcon5, "Gear");
|
||||||
@@ -105,7 +105,7 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
string message = null;
|
string message = null;
|
||||||
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
var room = DeviceManager.GetDeviceForKey(Config.DefaultRoomKey)
|
||||||
as EssentialsHuddleSpaceRoom;
|
as IEssentialsHuddleSpaceRoom;
|
||||||
if (room != null)
|
if (room != null)
|
||||||
message = room.PropertiesConfig.HelpMessage;
|
message = room.PropertiesConfig.HelpMessage;
|
||||||
else
|
else
|
||||||
@@ -164,7 +164,7 @@ namespace PepperDash.Essentials
|
|||||||
CallCaretVisible = tempJoin + 10;
|
CallCaretVisible = tempJoin + 10;
|
||||||
TriList.SetSigFalseAction(tempJoin, () =>
|
TriList.SetSigFalseAction(tempJoin, () =>
|
||||||
{
|
{
|
||||||
avDriver.ShowActiveCallsList();
|
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||||
if(avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
if(avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||||
});
|
});
|
||||||
@@ -207,6 +207,7 @@ namespace PepperDash.Essentials
|
|||||||
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 1);
|
//TriList.SetUshort(UIUshortJoin.CallHeaderButtonMode, 1);
|
||||||
|
|
||||||
// Set the call status text
|
// Set the call status text
|
||||||
|
Debug.Console(1, "Active Call Count: {0}", codec.ActiveCalls.Count);
|
||||||
if (codec.ActiveCalls.Count > 0)
|
if (codec.ActiveCalls.Count > 0)
|
||||||
{
|
{
|
||||||
if (codec.ActiveCalls.Count == 1)
|
if (codec.ActiveCalls.Count == 1)
|
||||||
@@ -221,7 +222,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up Header Buttons for the EssentialsHuddleVtc1Room type
|
/// Sets up Header Buttons for the EssentialsHuddleVtc1Room type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetupHeaderButtons(EssentialsHuddleVtc1PanelAvFunctionsDriver avDriver, EssentialsHuddleVtc1Room currentRoom)
|
public void SetupHeaderButtons(EssentialsHuddleVtc1PanelAvFunctionsDriver avDriver, IEssentialsHuddleVtc1Room currentRoom)
|
||||||
{
|
{
|
||||||
HeaderButtonsAreSetUp = false;
|
HeaderButtonsAreSetUp = false;
|
||||||
|
|
||||||
@@ -255,7 +256,7 @@ namespace PepperDash.Essentials
|
|||||||
TriList.SetSigFalseAction(UIBoolJoin.HeaderCallStatusLabelPress,
|
TriList.SetSigFalseAction(UIBoolJoin.HeaderCallStatusLabelPress,
|
||||||
() =>
|
() =>
|
||||||
{
|
{
|
||||||
avDriver.ShowActiveCallsList();
|
avDriver.ShowActiveCallsListOrMeetingInfo();
|
||||||
if (avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
if (avDriver.CurrentRoom.InCallFeedback.BoolValue)
|
||||||
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
CaretInterlock.ShowInterlocked(CallCaretVisible);
|
||||||
});
|
});
|
||||||
@@ -283,7 +284,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up Header Buttons for the EssentialsHuddleSpaceRoom type
|
/// Sets up Header Buttons for the EssentialsHuddleSpaceRoom type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetupHeaderButtons(EssentialsHuddlePanelAvFunctionsDriver avDriver, EssentialsHuddleSpaceRoom currentRoom)
|
public void SetupHeaderButtons(EssentialsHuddlePanelAvFunctionsDriver avDriver, IEssentialsHuddleSpaceRoom currentRoom)
|
||||||
{
|
{
|
||||||
HeaderButtonsAreSetUp = false;
|
HeaderButtonsAreSetUp = false;
|
||||||
|
|
||||||
@@ -353,6 +354,8 @@ namespace PepperDash.Essentials
|
|||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
else if (e.NewJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
|
else if (e.NewJoin == UIBoolJoin.HeaderMeetingInfoVisible)
|
||||||
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.HelpPageVisible)
|
else if (e.NewJoin == UIBoolJoin.HelpPageVisible)
|
||||||
headerPopupShown = true;
|
headerPopupShown = true;
|
||||||
else if (e.NewJoin == UIBoolJoin.MeetingsOrContacMethodsListVisible)
|
else if (e.NewJoin == UIBoolJoin.MeetingsOrContacMethodsListVisible)
|
||||||
|
|||||||
@@ -983,7 +983,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// /// Handles source change
|
// /// Handles source change
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_SourceInfoChange(EssentialsRoomBase room,
|
// void _CurrentRoom_SourceInfoChange(IEssentialsRoom room,
|
||||||
// SourceListItem info, ChangeType change)
|
// SourceListItem info, ChangeType change)
|
||||||
// {
|
// {
|
||||||
// if (change == ChangeType.WillChange)
|
// if (change == ChangeType.WillChange)
|
||||||
@@ -995,7 +995,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// ///
|
// ///
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_CurrentDisplay1SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void _CurrentRoom_CurrentDisplay1SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// if (type == ChangeType.DidChange)
|
// if (type == ChangeType.DidChange)
|
||||||
// {
|
// {
|
||||||
@@ -1021,7 +1021,7 @@
|
|||||||
// /// <summary>
|
// /// <summary>
|
||||||
// ///
|
// ///
|
||||||
// /// </summary>
|
// /// </summary>
|
||||||
// void _CurrentRoom_CurrentDisplay2SourceChange(EssentialsRoomBase room, SourceListItem info, ChangeType type)
|
// void _CurrentRoom_CurrentDisplay2SourceChange(IEssentialsRoom room, SourceListItem info, ChangeType type)
|
||||||
// {
|
// {
|
||||||
// if (type == ChangeType.DidChange)
|
// if (type == ChangeType.DidChange)
|
||||||
// {
|
// {
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsHuddleSpaceRoom CurrentRoom
|
public IEssentialsHuddleSpaceRoom CurrentRoom
|
||||||
{
|
{
|
||||||
get { return _CurrentRoom; }
|
get { return _CurrentRoom; }
|
||||||
set
|
set
|
||||||
@@ -86,7 +86,7 @@ namespace PepperDash.Essentials
|
|||||||
SetCurrentRoom(value);
|
SetCurrentRoom(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EssentialsHuddleSpaceRoom _CurrentRoom;
|
IEssentialsHuddleSpaceRoom _CurrentRoom;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -498,7 +498,7 @@ namespace PepperDash.Essentials
|
|||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = true;
|
||||||
// Run default source when room is off and share is pressed
|
// Run default source when room is off and share is pressed
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||||
CurrentRoom.RunDefaultPresentRoute();
|
(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -583,7 +583,7 @@ namespace PepperDash.Essentials
|
|||||||
void UiSelectSource(string key)
|
void UiSelectSource(string key)
|
||||||
{
|
{
|
||||||
// Run the route and when it calls back, show the source
|
// Run the route and when it calls back, show the source
|
||||||
CurrentRoom.RunRouteAction(key, new Action(() => { }));
|
CurrentRoom.RunRouteAction(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -745,7 +745,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RefreshCurrentRoom(EssentialsHuddleSpaceRoom room)
|
public void RefreshCurrentRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
{
|
{
|
||||||
@@ -836,7 +836,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCurrentRoom(EssentialsHuddleSpaceRoom room)
|
void SetCurrentRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom == room) return;
|
if (_CurrentRoom == room) return;
|
||||||
// Disconnect current (probably never called)
|
// Disconnect current (probably never called)
|
||||||
@@ -871,7 +871,7 @@ namespace PepperDash.Essentials
|
|||||||
UpdateMCJoins(_CurrentRoom);
|
UpdateMCJoins(_CurrentRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateMCJoins(EssentialsHuddleSpaceRoom room)
|
void UpdateMCJoins(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
||||||
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
||||||
@@ -918,6 +918,7 @@ namespace PepperDash.Essentials
|
|||||||
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = true;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.VolumeSingleMute1Visible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
||||||
|
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ namespace PepperDash.Essentials.UIDrivers
|
|||||||
void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
|
void CommunicationMonitor_StatusChange(object sender, MonitorStatusChangeEventArgs e)
|
||||||
{
|
{
|
||||||
var c = sender as ICommunicationMonitor;
|
var c = sender as ICommunicationMonitor;
|
||||||
if (StatusListDeviceIndexes.ContainsKey(c))
|
if (c != null && StatusListDeviceIndexes.ContainsKey(c))
|
||||||
{
|
{
|
||||||
var i = StatusListDeviceIndexes[c];
|
var i = StatusListDeviceIndexes[c];
|
||||||
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
|
StatusList.UShortInputSig(i, 1).UShortValue = (ushort)e.Status;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.UI;
|
using Crestron.SimplSharpPro.UI;
|
||||||
@@ -13,6 +14,7 @@ using PepperDash.Essentials.Core.PageManagers;
|
|||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -50,7 +52,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsHuddleVtc1Room CurrentRoom
|
public IEssentialsHuddleVtc1Room CurrentRoom
|
||||||
{
|
{
|
||||||
get { return _CurrentRoom; }
|
get { return _CurrentRoom; }
|
||||||
set
|
set
|
||||||
@@ -58,7 +60,7 @@ namespace PepperDash.Essentials
|
|||||||
SetCurrentRoom(value);
|
SetCurrentRoom(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EssentialsHuddleVtc1Room _CurrentRoom;
|
IEssentialsHuddleVtc1Room _CurrentRoom;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For hitting feedbacks
|
/// For hitting feedbacks
|
||||||
@@ -98,6 +100,9 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public SubpageReferenceList MeetingOrContactMethodModalSrl { get; set; }
|
public SubpageReferenceList MeetingOrContactMethodModalSrl { get; set; }
|
||||||
|
|
||||||
|
public uint CallListOrMeetingInfoPopoverVisibilityJoin { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The list of buttons on the header. Managed with visibility only
|
/// The list of buttons on the header. Managed with visibility only
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -173,10 +178,28 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
public PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; private set; }
|
||||||
|
|
||||||
|
|
||||||
|
private UiDisplayMode _currentMode;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The mode showing. Presentation or call.
|
/// The mode showing. Presentation or call.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
UiDisplayMode CurrentMode = UiDisplayMode.Start;
|
UiDisplayMode CurrentMode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _currentMode;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _currentMode)
|
||||||
|
{
|
||||||
|
_currentMode = value;
|
||||||
|
|
||||||
|
SetActivityFooterFeedbacks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CTimer NextMeetingTimer;
|
CTimer NextMeetingTimer;
|
||||||
|
|
||||||
@@ -207,6 +230,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
MeetingOrContactMethodModalSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
|
MeetingOrContactMethodModalSrl = new SubpageReferenceList(TriList, UISmartObjectJoin.MeetingListSRL, 3, 3, 5);
|
||||||
|
|
||||||
|
CurrentMode = UiDisplayMode.Start;
|
||||||
|
|
||||||
// buttons are added in SetCurrentRoom
|
// buttons are added in SetCurrentRoom
|
||||||
//HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
|
//HeaderButtonsList = new SmartObjectHeaderButtonList(TriList.SmartObjects[UISmartObjectJoin.HeaderButtonList]);
|
||||||
@@ -331,15 +355,17 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Allows PopupInterlock to be toggled if the calls list is already visible, or if the codec is in a call
|
/// Allows PopupInterlock to be toggled if the calls list is already visible, or if the codec is in a call
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void ShowActiveCallsList()
|
public void ShowActiveCallsListOrMeetingInfo()
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.CallEndAllConfirmVisible, true);
|
TriList.SetBool(UIBoolJoin.CallEndAllConfirmVisible, true);
|
||||||
if(PopupInterlock.CurrentJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
|
||||||
|
if(PopupInterlock.CurrentJoin == CallListOrMeetingInfoPopoverVisibilityJoin)
|
||||||
|
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if((CurrentRoom.ScheduleSource as VideoCodecBase).IsInCall)
|
if(CurrentRoom.VideoCodec.IsInCall)
|
||||||
PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
PopupInterlock.ShowInterlockedWithToggle(CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,12 +477,16 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, "*#* Room on: {0}, lastMeetingDismissedId: {1} {2} *#*",
|
Debug.Console(0, "*#* Room on: {0}, lastMeetingDismissedId: {1} {2} *#*",
|
||||||
CurrentRoom.OnFeedback.BoolValue,
|
CurrentRoom.OnFeedback.BoolValue,
|
||||||
LastMeetingDismissedId,
|
LastMeetingDismissedId,
|
||||||
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToShortTimeString() : "");
|
lastMeetingDismissed != null ? lastMeetingDismissed.StartTime.ToString("t", Global.Culture) : "");
|
||||||
|
|
||||||
var meeting = meetings.LastOrDefault(m => m.Joinable);
|
var meeting = meetings.LastOrDefault(m => m.Joinable);
|
||||||
if (CurrentRoom.OnFeedback.BoolValue
|
if (CurrentRoom.OnFeedback.BoolValue
|
||||||
&& lastMeetingDismissed == meeting)
|
&& lastMeetingDismissed == meeting)
|
||||||
{
|
{
|
||||||
|
// meeting no longer joinable, hide popup
|
||||||
|
if(meeting == null)
|
||||||
|
HideNextMeetingPopup();
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,9 +498,11 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Upcoming meeting");
|
TriList.SetString(UIStringJoin.MeetingsOrContactMethodListTitleText, "Upcoming meeting");
|
||||||
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToShortTimeString());
|
TriList.SetString(UIStringJoin.NextMeetingStartTimeText, meeting.StartTime.ToString("t", Global.Culture));
|
||||||
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToShortTimeString());
|
TriList.SetString(UIStringJoin.NextMeetingEndTimeText, meeting.EndTime.ToString("t", Global.Culture));
|
||||||
TriList.SetString(UIStringJoin.NextMeetingTitleText, meeting.Title);
|
TriList.SetString(UIStringJoin.NextMeetingTitleText, meeting.Title);
|
||||||
TriList.SetString(UIStringJoin.NextMeetingNameText, meeting.Organizer);
|
TriList.SetString(UIStringJoin.NextMeetingNameText, meeting.Organizer);
|
||||||
TriList.SetString(UIStringJoin.NextMeetingButtonLabel, "Join");
|
TriList.SetString(UIStringJoin.NextMeetingButtonLabel, "Join");
|
||||||
@@ -493,7 +525,7 @@ namespace PepperDash.Essentials
|
|||||||
// indexOf = 3, 4 meetings :
|
// indexOf = 3, 4 meetings :
|
||||||
if (indexOfNext < meetings.Count)
|
if (indexOfNext < meetings.Count)
|
||||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText,
|
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText,
|
||||||
meetings[indexOfNext].StartTime.ToShortTimeString());
|
meetings[indexOfNext].StartTime.ToString("t", Global.Culture));
|
||||||
else
|
else
|
||||||
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText, "No more meetings today");
|
TriList.SetString(UIStringJoin.NextMeetingFollowingMeetingText, "No more meetings today");
|
||||||
|
|
||||||
@@ -607,12 +639,25 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetActivityFooterFeedbacks()
|
void SetActivityFooterFeedbacks()
|
||||||
{
|
{
|
||||||
CallButtonSig.BoolValue = CurrentMode == UiDisplayMode.Call
|
if (CurrentRoom != null)
|
||||||
|
{
|
||||||
|
var startMode = CurrentMode == UiDisplayMode.Start;
|
||||||
|
var presentationMode = CurrentMode == UiDisplayMode.Presentation;
|
||||||
|
var callMode = CurrentMode == UiDisplayMode.Call;
|
||||||
|
|
||||||
|
TriList.SetBool(StartPageVisibleJoin, startMode ? true : false);
|
||||||
|
|
||||||
|
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, presentationMode ? true : false);
|
||||||
|
if (!presentationMode)
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
|
||||||
|
CallButtonSig.BoolValue = callMode
|
||||||
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
||||||
ShareButtonSig.BoolValue = CurrentMode == UiDisplayMode.Presentation
|
ShareButtonSig.BoolValue = presentationMode
|
||||||
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
&& CurrentRoom.ShutdownType == eShutdownType.None;
|
||||||
EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
|
EndMeetingButtonSig.BoolValue = CurrentRoom.ShutdownType != eShutdownType.None;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@@ -623,14 +668,13 @@ namespace PepperDash.Essentials
|
|||||||
return;
|
return;
|
||||||
HideLogo();
|
HideLogo();
|
||||||
HideNextMeetingPopup();
|
HideNextMeetingPopup();
|
||||||
TriList.SetBool(StartPageVisibleJoin, false);
|
//TriList.SetBool(StartPageVisibleJoin, false);
|
||||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
//TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, false);
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
//TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
if (CurrentSourcePageManager != null)
|
if (CurrentSourcePageManager != null)
|
||||||
CurrentSourcePageManager.Hide();
|
CurrentSourcePageManager.Hide();
|
||||||
PowerOnFromCall();
|
PowerOnFromCall();
|
||||||
CurrentMode = UiDisplayMode.Call;
|
CurrentMode = UiDisplayMode.Call;
|
||||||
SetActivityFooterFeedbacks();
|
|
||||||
VCDriver.Show();
|
VCDriver.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -643,29 +687,25 @@ namespace PepperDash.Essentials
|
|||||||
if (VCDriver.IsVisible)
|
if (VCDriver.IsVisible)
|
||||||
VCDriver.Hide();
|
VCDriver.Hide();
|
||||||
HideNextMeetingPopup();
|
HideNextMeetingPopup();
|
||||||
TriList.SetBool(StartPageVisibleJoin, false);
|
|
||||||
TriList.SetBool(UIBoolJoin.CallStagingBarVisible, false);
|
|
||||||
TriList.SetBool(UIBoolJoin.SourceStagingBarVisible, true);
|
|
||||||
// Run default source when room is off and share is pressed
|
// Run default source when room is off and share is pressed
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
if (!CurrentRoom.OnFeedback.BoolValue)
|
if (!CurrentRoom.OnFeedback.BoolValue)
|
||||||
{
|
{
|
||||||
// If there's no default, show UI elements
|
// If there's no default, show UI elements
|
||||||
if (!CurrentRoom.RunDefaultPresentRoute())
|
if (!(CurrentRoom as IRunDefaultPresentRoute).RunDefaultPresentRoute())
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else // room is on show what's active or select a source if nothing is yet active
|
else // room is on show what's active or select a source if nothing is yet active
|
||||||
{
|
{
|
||||||
if(CurrentRoom.CurrentSourceInfo == null || CurrentRoom.CurrentSourceInfoKey == CurrentRoom.DefaultCodecRouteString)
|
if(CurrentRoom.CurrentSourceInfo == null || (CurrentRoom.VideoCodec != null && CurrentRoom.CurrentSourceInfo.SourceDevice.Key == CurrentRoom.VideoCodec.OsdSource.Key))
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
else if (CurrentSourcePageManager != null)
|
else if (CurrentSourcePageManager != null)
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
CurrentSourcePageManager.Show();
|
CurrentSourcePageManager.Show();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
CurrentMode = UiDisplayMode.Presentation;
|
CurrentMode = UiDisplayMode.Presentation;
|
||||||
SetupSourceList();
|
SetupSourceList();
|
||||||
SetActivityFooterFeedbacks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -707,6 +747,8 @@ namespace PepperDash.Essentials
|
|||||||
if (CurrentRoom.CurrentSourceInfo == null)
|
if (CurrentRoom.CurrentSourceInfo == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
CurrentMode = UiDisplayMode.Presentation;
|
||||||
|
|
||||||
if (CurrentRoom.CurrentSourceInfo.SourceDevice == null)
|
if (CurrentRoom.CurrentSourceInfo.SourceDevice == null)
|
||||||
{
|
{
|
||||||
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
@@ -743,7 +785,7 @@ namespace PepperDash.Essentials
|
|||||||
void UiSelectSource(string key)
|
void UiSelectSource(string key)
|
||||||
{
|
{
|
||||||
// Run the route and when it calls back, show the source
|
// Run the route and when it calls back, show the source
|
||||||
CurrentRoom.RunRouteAction(key, new Action(() => { }));
|
CurrentRoom.RunRouteAction(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -894,7 +936,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
/// Helper for property setter. Sets the panel to the given room, latching up all functionality
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void RefreshCurrentRoom(EssentialsHuddleVtc1Room room)
|
void RefreshCurrentRoom(IEssentialsHuddleVtc1Room room)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
@@ -912,6 +954,18 @@ namespace PepperDash.Essentials
|
|||||||
_CurrentRoom.IsWarmingUpFeedback.OutputChange -= CurrentRoom_IsWarmingFeedback_OutputChange;
|
_CurrentRoom.IsWarmingUpFeedback.OutputChange -= CurrentRoom_IsWarmingFeedback_OutputChange;
|
||||||
_CurrentRoom.IsCoolingDownFeedback.OutputChange -= CurrentRoom_IsCoolingDownFeedback_OutputChange;
|
_CurrentRoom.IsCoolingDownFeedback.OutputChange -= CurrentRoom_IsCoolingDownFeedback_OutputChange;
|
||||||
_CurrentRoom.InCallFeedback.OutputChange -= CurrentRoom_InCallFeedback_OutputChange;
|
_CurrentRoom.InCallFeedback.OutputChange -= CurrentRoom_InCallFeedback_OutputChange;
|
||||||
|
|
||||||
|
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||||
|
if (scheduleAwareCodec != null)
|
||||||
|
{
|
||||||
|
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged -= CodecSchedule_MeetingsListHasChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||||
|
if (meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
meetingInfoCodec.MeetingInfoChanged -= meetingInfoCodec_MeetingInfoChanged;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_CurrentRoom = room;
|
_CurrentRoom = room;
|
||||||
@@ -944,9 +998,23 @@ namespace PepperDash.Essentials
|
|||||||
_CurrentRoom.CurrentSourceChange += CurrentRoom_SourceInfoChange;
|
_CurrentRoom.CurrentSourceChange += CurrentRoom_SourceInfoChange;
|
||||||
RefreshSourceInfo();
|
RefreshSourceInfo();
|
||||||
|
|
||||||
if (_CurrentRoom.VideoCodec is IHasScheduleAwareness)
|
|
||||||
|
var scheduleAwareCodec = _CurrentRoom.VideoCodec as IHasScheduleAwareness;
|
||||||
|
if (scheduleAwareCodec != null)
|
||||||
{
|
{
|
||||||
(_CurrentRoom.VideoCodec as IHasScheduleAwareness).CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
scheduleAwareCodec.CodecSchedule.MeetingsListHasChanged += CodecSchedule_MeetingsListHasChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
var meetingInfoCodec = _CurrentRoom.VideoCodec as IHasMeetingInfo;
|
||||||
|
if (meetingInfoCodec != null)
|
||||||
|
{
|
||||||
|
meetingInfoCodec.MeetingInfoChanged += new EventHandler<MeetingInfoEventArgs>(meetingInfoCodec_MeetingInfoChanged);
|
||||||
|
|
||||||
|
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderMeetingInfoVisible;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CallListOrMeetingInfoPopoverVisibilityJoin = UIBoolJoin.HeaderActiveCallsListVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
CallSharingInfoVisibleFeedback = new BoolFeedback(() => _CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
CallSharingInfoVisibleFeedback = new BoolFeedback(() => _CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||||
@@ -958,7 +1026,8 @@ namespace PepperDash.Essentials
|
|||||||
if (_CurrentRoom != null)
|
if (_CurrentRoom != null)
|
||||||
_CurrentRoom.CurrentSourceChange += new SourceInfoChangeHandler(CurrentRoom_CurrentSingleSourceChange);
|
_CurrentRoom.CurrentSourceChange += new SourceInfoChangeHandler(CurrentRoom_CurrentSingleSourceChange);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
// Moved to EssentialsVideoCodecUiDriver
|
||||||
|
//TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, () => _CurrentRoom.RunRouteAction("codecOsd", _CurrentRoom.SourceListKey));
|
||||||
|
|
||||||
(Parent as EssentialsPanelMainInterfaceDriver).HeaderDriver.SetupHeaderButtons(this, CurrentRoom);
|
(Parent as EssentialsPanelMainInterfaceDriver).HeaderDriver.SetupHeaderButtons(this, CurrentRoom);
|
||||||
}
|
}
|
||||||
@@ -969,7 +1038,20 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetCurrentRoom(EssentialsHuddleVtc1Room room)
|
void meetingInfoCodec_MeetingInfoChanged(object sender, MeetingInfoEventArgs e)
|
||||||
|
{
|
||||||
|
TriList.SetString(UIStringJoin.MeetingIdText, e.Info.Id);
|
||||||
|
TriList.SetString(UIStringJoin.MeetingHostText, e.Info.Host);
|
||||||
|
TriList.SetString(UIStringJoin.MeetingNameText, e.Info.Name);
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.MeetingPasswordText, e.Info.Password);
|
||||||
|
// Show the password fields if one is present
|
||||||
|
TriList.SetBool(UIBoolJoin.MeetingPasswordVisible, string.IsNullOrEmpty(e.Info.Password) ? false : true);
|
||||||
|
|
||||||
|
TriList.SetString(UIStringJoin.CallSharedSourceNameText, e.Info.ShareStatus);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCurrentRoom(IEssentialsHuddleVtc1Room room)
|
||||||
{
|
{
|
||||||
if (_CurrentRoom == room) return;
|
if (_CurrentRoom == room) return;
|
||||||
// Disconnect current (probably never called)
|
// Disconnect current (probably never called)
|
||||||
@@ -1004,7 +1086,7 @@ namespace PepperDash.Essentials
|
|||||||
UpdateMCJoins(_CurrentRoom);
|
UpdateMCJoins(_CurrentRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateMCJoins(EssentialsHuddleVtc1Room room)
|
void UpdateMCJoins(IEssentialsHuddleVtc1Room room)
|
||||||
{
|
{
|
||||||
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
TriList.SetString(UIStringJoin.RoomMcUrl, room.MobileControlRoomBridge.McServerUrl);
|
||||||
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
TriList.SetString(UIStringJoin.RoomMcQrCodeUrl, room.MobileControlRoomBridge.QrCodeUrl);
|
||||||
@@ -1035,7 +1117,7 @@ namespace PepperDash.Essentials
|
|||||||
if (CurrentRoom.CurrentSourceInfo != null && CurrentRoom.CurrentSourceInfo.DisableCodecSharing)
|
if (CurrentRoom.CurrentSourceInfo != null && CurrentRoom.CurrentSourceInfo.DisableCodecSharing)
|
||||||
{
|
{
|
||||||
Debug.Console(1, CurrentRoom, "Transitioning to in-call, cancelling non-sharable source");
|
Debug.Console(1, CurrentRoom, "Transitioning to in-call, cancelling non-sharable source");
|
||||||
CurrentRoom.RunRouteAction("codecOsd", CurrentRoom.SourceListKey);
|
CurrentRoom.RunRouteAction("codecOsd");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1105,6 +1187,30 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="type"></param>
|
/// <param name="type"></param>
|
||||||
void CurrentRoom_CurrentSingleSourceChange(SourceListItem info, ChangeType type)
|
void CurrentRoom_CurrentSingleSourceChange(SourceListItem info, ChangeType type)
|
||||||
{
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange");
|
||||||
|
|
||||||
|
// Show the Select a source subpage
|
||||||
|
if (TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange SourceStagingBarVisisble: true");
|
||||||
|
|
||||||
|
if (_CurrentRoom.CurrentSourceInfo == null || (_CurrentRoom.VideoCodec != null && _CurrentRoom.CurrentSourceInfo.SourceDevice.Key == _CurrentRoom.VideoCodec.OsdSource.Key))
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Showing SelectASourceVisible");
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Hiding SelectASourceVisible");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, "AvFunctionsDriver: CurrentSingleSourceChange Hiding SelectASourceVisible");
|
||||||
|
TriList.SetBool(UIBoolJoin.SelectASourceVisible, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (_CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue && _CurrentRoom.CurrentSourceInfo != null)
|
if (_CurrentRoom.VideoCodec.SharingContentIsOnFeedback.BoolValue && _CurrentRoom.CurrentSourceInfo != null)
|
||||||
TriList.StringInput[UIStringJoin.CallSharedSourceNameText].StringValue = _CurrentRoom.CurrentSourceInfo.PreferredName;
|
TriList.StringInput[UIStringJoin.CallSharedSourceNameText].StringValue = _CurrentRoom.CurrentSourceInfo.PreferredName;
|
||||||
}
|
}
|
||||||
@@ -1156,8 +1262,8 @@ namespace PepperDash.Essentials
|
|||||||
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
foreach (var m in CurrentRoom.ScheduleSource.CodecSchedule.Meetings)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToShortTimeString();
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 1).StringValue = m.StartTime.ToString("t", Global.Culture);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToShortTimeString();
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 2).StringValue = m.EndTime.ToString("t", Global.Culture);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 3).StringValue = m.Title;
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 3).StringValue = m.Title;
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 4).StringValue = string.Format("<br>{0}",m.Organizer);
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 4).StringValue = string.Format("<br>{0}",m.Organizer);
|
||||||
MeetingOrContactMethodModalSrl.StringInputSig(i, 5).StringValue = "Join";
|
MeetingOrContactMethodModalSrl.StringInputSig(i, 5).StringValue = "Join";
|
||||||
@@ -1202,12 +1308,12 @@ namespace PepperDash.Essentials
|
|||||||
var value = _CurrentRoom.OnFeedback.BoolValue;
|
var value = _CurrentRoom.OnFeedback.BoolValue;
|
||||||
TriList.BooleanInput[UIBoolJoin.RoomIsOn].BoolValue = value;
|
TriList.BooleanInput[UIBoolJoin.RoomIsOn].BoolValue = value;
|
||||||
|
|
||||||
TriList.BooleanInput[StartPageVisibleJoin].BoolValue = !value;
|
//TriList.BooleanInput[StartPageVisibleJoin].BoolValue = !value;
|
||||||
|
|
||||||
if (value) //ON
|
if (value) //ON
|
||||||
{
|
{
|
||||||
SetupActivityFooterWhenRoomOn();
|
SetupActivityFooterWhenRoomOn();
|
||||||
TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
//TriList.BooleanInput[UIBoolJoin.SelectASourceVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = true;
|
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1218,9 +1324,8 @@ namespace PepperDash.Essentials
|
|||||||
VCDriver.Hide();
|
VCDriver.Hide();
|
||||||
SetupActivityFooterWhenRoomOff();
|
SetupActivityFooterWhenRoomOff();
|
||||||
ShowLogo();
|
ShowLogo();
|
||||||
SetActivityFooterFeedbacks();
|
//TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.VolumeDualMute1Visible].BoolValue = false;
|
//TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
||||||
TriList.BooleanInput[UIBoolJoin.SourceStagingBarVisible].BoolValue = false;
|
|
||||||
// Clear this so that the pesky meeting warning can resurface every minute when off
|
// Clear this so that the pesky meeting warning can resurface every minute when off
|
||||||
LastMeetingDismissedId = null;
|
LastMeetingDismissedId = null;
|
||||||
}
|
}
|
||||||
@@ -1443,7 +1548,7 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IAVWithVCDriver : IAVDriver
|
public interface IAVWithVCDriver : IAVDriver
|
||||||
{
|
{
|
||||||
EssentialsHuddleVtc1Room CurrentRoom { get; }
|
IEssentialsHuddleVtc1Room CurrentRoom { get; }
|
||||||
|
|
||||||
PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; }
|
PepperDash.Essentials.Core.Touchpanels.Keyboards.HabaneroKeyboardController Keyboard { get; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1455,6 +1560,8 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void PrepareForCodecIncomingCall();
|
void PrepareForCodecIncomingCall();
|
||||||
|
|
||||||
|
uint CallListOrMeetingInfoPopoverVisibilityJoin { get; }
|
||||||
|
|
||||||
SubpageReferenceList MeetingOrContactMethodModalSrl { get; }
|
SubpageReferenceList MeetingOrContactMethodModalSrl { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets feedback for the given room
|
/// Sets feedback for the given room
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetFeedbackForRoom(EssentialsHuddleSpaceRoom room)
|
public void SetFeedbackForRoom(IEssentialsHuddleSpaceRoom room)
|
||||||
{
|
{
|
||||||
var itemToSet = Items.FirstOrDefault(i => i.Room == room);
|
var itemToSet = Items.FirstOrDefault(i => i.Room == room);
|
||||||
if (itemToSet != null)
|
if (itemToSet != null)
|
||||||
@@ -48,11 +48,11 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
public class SmartObjectRoomsListItem
|
public class SmartObjectRoomsListItem
|
||||||
{
|
{
|
||||||
public EssentialsHuddleSpaceRoom Room { get; private set; }
|
public IEssentialsHuddleSpaceRoom Room { get; private set; }
|
||||||
SmartObjectRoomsList Parent;
|
SmartObjectRoomsList Parent;
|
||||||
public uint Index { get; private set; }
|
public uint Index { get; private set; }
|
||||||
|
|
||||||
public SmartObjectRoomsListItem(EssentialsHuddleSpaceRoom room, uint index, SmartObjectRoomsList parent,
|
public SmartObjectRoomsListItem(IEssentialsHuddleSpaceRoom room, uint index, SmartObjectRoomsList parent,
|
||||||
Action<bool> buttonAction)
|
Action<bool> buttonAction)
|
||||||
{
|
{
|
||||||
Room = room;
|
Room = room;
|
||||||
|
|||||||
@@ -12,5 +12,5 @@ namespace PepperDash.Essentials
|
|||||||
///// <summary>
|
///// <summary>
|
||||||
///// The handler type for a Room's SourceInfoChange
|
///// The handler type for a Room's SourceInfoChange
|
||||||
///// </summary>
|
///// </summary>
|
||||||
//public delegate void SourceInfoChangeHandler(EssentialsRoomBase room, SourceListItem info, ChangeType type);
|
//public delegate void SourceInfoChangeHandler(IEssentialsRoom room, SourceListItem info, ChangeType type);
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Globalization;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
@@ -14,6 +15,7 @@ using PepperDash.Essentials.Core.SmartObjects;
|
|||||||
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
using PepperDash.Essentials.Core.Touchpanels.Keyboards;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
using PepperDash.Essentials.Devices.Common.Cameras;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.UIDrivers.VC
|
namespace PepperDash.Essentials.UIDrivers.VC
|
||||||
@@ -83,6 +85,9 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
StringBuilder SearchStringBuilder = new StringBuilder();
|
StringBuilder SearchStringBuilder = new StringBuilder();
|
||||||
BoolFeedback SearchStringBackspaceVisibleFeedback;
|
BoolFeedback SearchStringBackspaceVisibleFeedback;
|
||||||
|
|
||||||
|
StringFeedback PasswordStringFeedback;
|
||||||
|
StringBuilder PasswordStringBuilder = new StringBuilder();
|
||||||
|
|
||||||
ModalDialog IncomingCallModal;
|
ModalDialog IncomingCallModal;
|
||||||
|
|
||||||
eKeypadMode KeypadMode;
|
eKeypadMode KeypadMode;
|
||||||
@@ -123,12 +128,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
|
|
||||||
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange);
|
codec.CallStatusChange += new EventHandler<CodecCallStatusItemChangeEventArgs>(Codec_CallStatusChange);
|
||||||
|
|
||||||
// If the codec is ready, then get the values we want, otherwise wait
|
|
||||||
if (Codec.IsReady)
|
|
||||||
Codec_IsReady();
|
|
||||||
else
|
|
||||||
codec.IsReadyChange += (o, a) => Codec_IsReady();
|
|
||||||
|
|
||||||
//InCall = new BoolFeedback(() => false);
|
//InCall = new BoolFeedback(() => false);
|
||||||
LocalPrivacyIsMuted = new BoolFeedback(() => false);
|
LocalPrivacyIsMuted = new BoolFeedback(() => false);
|
||||||
|
|
||||||
@@ -142,7 +141,10 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCKeypadVisible);
|
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCKeypadVisible);
|
||||||
|
|
||||||
StagingBarsInterlock = new JoinedSigInterlock(triList);
|
StagingBarsInterlock = new JoinedSigInterlock(triList);
|
||||||
StagingBarsInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
|
if(Codec is IHasCallHistory)
|
||||||
|
StagingBarsInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverWithRecentsVisible);
|
||||||
|
else
|
||||||
|
StagingBarsInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverWithoutRecentsVisible);
|
||||||
|
|
||||||
StagingButtonsFeedbackInterlock = new JoinedSigInterlock(triList);
|
StagingButtonsFeedbackInterlock = new JoinedSigInterlock(triList);
|
||||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
|
||||||
@@ -150,7 +152,8 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
// Return formatted when dialing, straight digits when in call
|
// Return formatted when dialing, straight digits when in call
|
||||||
DialStringFeedback = new StringFeedback(() =>
|
DialStringFeedback = new StringFeedback(() =>
|
||||||
{
|
{
|
||||||
if (KeypadMode == eKeypadMode.Dial)
|
// Format the number feedback if in dial mode and the codec is not IHasStartMeeting (ZoomRoom)
|
||||||
|
if (KeypadMode == eKeypadMode.Dial && !(Codec is IHasStartMeeting))
|
||||||
return GetFormattedDialString(DialStringBuilder.ToString());
|
return GetFormattedDialString(DialStringBuilder.ToString());
|
||||||
else
|
else
|
||||||
return DialStringBuilder.ToString();
|
return DialStringBuilder.ToString();
|
||||||
@@ -177,8 +180,22 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
});
|
});
|
||||||
SearchStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.CodecDirectorySearchEntryText]);
|
SearchStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.CodecDirectorySearchEntryText]);
|
||||||
|
|
||||||
SetupDirectoryList();
|
PasswordStringFeedback = new StringFeedback(() =>
|
||||||
|
{
|
||||||
|
if (PasswordStringBuilder.Length > 0)
|
||||||
|
{
|
||||||
|
Parent.Keyboard.EnableGoButton();
|
||||||
|
return PasswordStringBuilder.ToString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Parent.Keyboard.DisableGoButton();
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
PasswordStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.PasswordPromptPasswordText]);
|
||||||
|
|
||||||
|
SetupDirectoryList();
|
||||||
|
|
||||||
SearchStringBackspaceVisibleFeedback = new BoolFeedback(() => SearchStringBuilder.Length > 0);
|
SearchStringBackspaceVisibleFeedback = new BoolFeedback(() => SearchStringBuilder.Length > 0);
|
||||||
SearchStringBackspaceVisibleFeedback.LinkInputSig(triList.BooleanInput[UIBoolJoin.VCDirectoryBackspaceVisible]);
|
SearchStringBackspaceVisibleFeedback.LinkInputSig(triList.BooleanInput[UIBoolJoin.VCDirectoryBackspaceVisible]);
|
||||||
@@ -196,6 +213,18 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
triList.SetSigHeldAction(UIBoolJoin.VCDirectoryBackspacePress, 500,
|
triList.SetSigHeldAction(UIBoolJoin.VCDirectoryBackspacePress, 500,
|
||||||
StartSearchBackspaceRepeat, StopSearchBackspaceRepeat, SearchKeypadBackspacePress);
|
StartSearchBackspaceRepeat, StopSearchBackspaceRepeat, SearchKeypadBackspacePress);
|
||||||
|
|
||||||
|
|
||||||
|
if (Codec is IPasswordPrompt)
|
||||||
|
{
|
||||||
|
SetupPasswordPrompt();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// If the codec is ready, then get the values we want, otherwise wait
|
||||||
|
if (Codec.IsReady)
|
||||||
|
Codec_IsReady();
|
||||||
|
else
|
||||||
|
codec.IsReadyChange += (o, a) => Codec_IsReady();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -296,6 +325,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
{
|
{
|
||||||
case eCodecCallStatus.Connected:
|
case eCodecCallStatus.Connected:
|
||||||
// fire at SRL item
|
// fire at SRL item
|
||||||
|
HidePasswordPrompt();
|
||||||
KeypadMode = eKeypadMode.DTMF;
|
KeypadMode = eKeypadMode.DTMF;
|
||||||
DialStringBuilder.Remove(0, DialStringBuilder.Length);
|
DialStringBuilder.Remove(0, DialStringBuilder.Length);
|
||||||
DialStringFeedback.FireUpdate();
|
DialStringFeedback.FireUpdate();
|
||||||
@@ -354,7 +384,12 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
if (Codec.IsInCall)
|
if (Codec.IsInCall)
|
||||||
stageJoin = UIBoolJoin.VCStagingActivePopoverVisible;
|
stageJoin = UIBoolJoin.VCStagingActivePopoverVisible;
|
||||||
else
|
else
|
||||||
stageJoin = UIBoolJoin.VCStagingInactivePopoverVisible;
|
{
|
||||||
|
if (Codec is IHasCallHistory)
|
||||||
|
stageJoin = UIBoolJoin.VCStagingInactivePopoverWithRecentsVisible;
|
||||||
|
else
|
||||||
|
stageJoin = UIBoolJoin.VCStagingInactivePopoverWithoutRecentsVisible;
|
||||||
|
}
|
||||||
if (IsVisible)
|
if (IsVisible)
|
||||||
StagingBarsInterlock.ShowInterlocked(stageJoin);
|
StagingBarsInterlock.ShowInterlocked(stageJoin);
|
||||||
else
|
else
|
||||||
@@ -389,8 +424,8 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
ActiveCallsSRL.Count = (ushort)activeList.Count;
|
ActiveCallsSRL.Count = (ushort)activeList.Count;
|
||||||
|
|
||||||
// If Active Calls list is visible and codec is not in a call, hide the list
|
// If Active Calls list is visible and codec is not in a call, hide the list
|
||||||
if (!Codec.IsInCall && Parent.PopupInterlock.CurrentJoin == UIBoolJoin.HeaderActiveCallsListVisible)
|
if (!Codec.IsInCall && Parent.PopupInterlock.CurrentJoin == Parent.CallListOrMeetingInfoPopoverVisibilityJoin)
|
||||||
Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.HeaderActiveCallsListVisible);
|
Parent.PopupInterlock.ShowInterlockedWithToggle(Parent.CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -481,15 +516,19 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingCameraPress, ShowCameraControls);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingCameraPress, ShowCameraControls);
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.VCStagingMeetNowPress, MeetNowPress);
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.CallStopSharingPress, CallStopSharingPress);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.CallEndPress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.CallEndPress, () =>
|
||||||
{
|
{
|
||||||
if (Codec.ActiveCalls.Count > 1)
|
if (Codec.ActiveCalls.Count > 1)
|
||||||
{
|
{
|
||||||
Parent.PopupInterlock.ShowInterlocked(UIBoolJoin.HeaderActiveCallsListVisible);
|
Parent.PopupInterlock.ShowInterlocked(Parent.CallListOrMeetingInfoPopoverVisibilityJoin);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Codec.EndAllCalls();
|
Codec.EndAllCalls();
|
||||||
});
|
});
|
||||||
|
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.CallEndAllConfirmPress, () =>
|
TriList.SetSigFalseAction(UIBoolJoin.CallEndAllConfirmPress, () =>
|
||||||
{
|
{
|
||||||
Parent.PopupInterlock.HideAndClear();
|
Parent.PopupInterlock.HideAndClear();
|
||||||
@@ -513,13 +552,18 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
|
|
||||||
var codecOffCameras = Codec as IHasCameraOff;
|
var codecOffCameras = Codec as IHasCameraOff;
|
||||||
|
|
||||||
|
var supportsCameraOffMode = Codec.SupportsCameraOff;
|
||||||
|
|
||||||
var codecAutoCameras = Codec as IHasCameraAutoMode;
|
var codecAutoCameras = Codec as IHasCameraAutoMode;
|
||||||
|
|
||||||
if (codecAutoCameras != null)
|
var supportsAutoCameraMode = Codec.SupportsCameraAutoMode;
|
||||||
|
|
||||||
|
if (codecAutoCameras != null && supportsAutoCameraMode)
|
||||||
{
|
{
|
||||||
CameraModeList.SetItemButtonAction(1,(b) => codecAutoCameras.CameraAutoModeOn());
|
CameraModeList.SetItemButtonAction(1,(b) => codecAutoCameras.CameraAutoModeOn());
|
||||||
TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanInput["Item 1 Visible"].BoolValue = true;
|
TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanInput["Item 1 Visible"].BoolValue = true;
|
||||||
codecAutoCameras.CameraAutoModeIsOnFeedback.LinkInputSig(CameraModeList.SmartObject.BooleanInput["Item 1 Selected"]);
|
codecAutoCameras.CameraAutoModeIsOnFeedback.LinkInputSig(CameraModeList.SmartObject.BooleanInput["Item 1 Selected"]);
|
||||||
|
codecAutoCameras.CameraAutoModeIsOnFeedback.LinkInputSig(TriList.BooleanInput[UIBoolJoin.VCCameraAutoModeIsOnFb]);
|
||||||
//TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanOutput["Item 1 Pressed"].SetSigFalseAction(
|
//TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanOutput["Item 1 Pressed"].SetSigFalseAction(
|
||||||
//() => codecAutoCameras.CameraAutoModeOn());
|
//() => codecAutoCameras.CameraAutoModeOn());
|
||||||
|
|
||||||
@@ -554,7 +598,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
//TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanOutput["Item 2 Pressed"].SetSigFalseAction(
|
//TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanOutput["Item 2 Pressed"].SetSigFalseAction(
|
||||||
// () => ShowCameraManualMode());
|
// () => ShowCameraManualMode());
|
||||||
|
|
||||||
if (codecOffCameras != null)
|
if (codecOffCameras != null && supportsCameraOffMode)
|
||||||
{
|
{
|
||||||
TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanInput["Item 3 Visible"].BoolValue = true;
|
TriList.SmartObjects[UISmartObjectJoin.VCCameraMode].BooleanInput["Item 3 Visible"].BoolValue = true;
|
||||||
codecOffCameras.CameraIsOffFeedback.LinkInputSig(CameraModeList.SmartObject.BooleanInput["Item 3 Selected"]);
|
codecOffCameras.CameraIsOffFeedback.LinkInputSig(CameraModeList.SmartObject.BooleanInput["Item 3 Selected"]);
|
||||||
@@ -769,12 +813,14 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
|
|
||||||
if (camerasCodec != null && camerasCodec.SelectedCamera != null)
|
if (camerasCodec != null && camerasCodec.SelectedCamera != null)
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, "Attempting to map camera actions to selected camera: '{0}'", camerasCodec.SelectedCamera.Key);
|
||||||
var dpad = CameraPtzPad;
|
var dpad = CameraPtzPad;
|
||||||
|
|
||||||
var camera = camerasCodec.SelectedCamera as IHasCameraPtzControl;
|
var camera = camerasCodec.SelectedCamera as IHasCameraPtzControl;
|
||||||
if (camera != null)
|
if (camera != null)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
Debug.Console(2, "Selected camera is IHasCameraPtzControl");
|
||||||
if (camerasCodec.SelectedCamera.CanTilt)
|
if (camerasCodec.SelectedCamera.CanTilt)
|
||||||
{
|
{
|
||||||
dpad.SigUp.SetBoolSigAction((b) =>
|
dpad.SigUp.SetBoolSigAction((b) =>
|
||||||
@@ -839,25 +885,46 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Selected Camera is not IHasCameraPtzControl. No controls to map");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Codec does not have cameras of selected camera is null");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determines if codec is in manual camera control mode and shows feedback
|
// Determines if codec is in manual camera control mode and shows feedback
|
||||||
void ShowCameraManualMode()
|
void ShowCameraManualMode()
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, "ShowCameraManualMode");
|
||||||
|
|
||||||
var inManualMode = true;
|
var inManualMode = true;
|
||||||
|
|
||||||
var codecOffCameras = Codec as IHasCameraOff;
|
var codecOffCameras = Codec as IHasCameraOff;
|
||||||
|
|
||||||
var codecAutoCameras = Codec as IHasCameraAutoMode;
|
var codecAutoCameras = Codec as IHasCameraAutoMode;
|
||||||
|
|
||||||
|
var supportsAutoCameras = codecAutoCameras != null && Codec.SupportsCameraAutoMode;
|
||||||
|
|
||||||
if (codecOffCameras != null && codecOffCameras.CameraIsOffFeedback.BoolValue)
|
if (codecOffCameras != null && codecOffCameras.CameraIsOffFeedback.BoolValue)
|
||||||
{
|
{
|
||||||
inManualMode = false;
|
inManualMode = false;
|
||||||
|
|
||||||
|
var codecCameraMute = Codec as IHasCameraMute;
|
||||||
|
|
||||||
|
if (codecCameraMute != null)
|
||||||
|
{
|
||||||
|
codecCameraMute.CameraMuteOff();
|
||||||
|
inManualMode = true;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear auto mode
|
// Clear auto mode
|
||||||
if (codecAutoCameras != null )
|
if (supportsAutoCameras)
|
||||||
{
|
{
|
||||||
if (codecAutoCameras.CameraAutoModeIsOnFeedback.BoolValue)
|
if (codecAutoCameras.CameraAutoModeIsOnFeedback.BoolValue)
|
||||||
{
|
{
|
||||||
@@ -948,7 +1015,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
// if it's today, show a simpler string
|
// if it's today, show a simpler string
|
||||||
string timeText = null;
|
string timeText = null;
|
||||||
if (c.StartTime.Date == DateTime.Now.Date)
|
if (c.StartTime.Date == DateTime.Now.Date)
|
||||||
timeText = c.StartTime.ToShortTimeString();
|
timeText = c.StartTime.ToString("t", Global.Culture);
|
||||||
else if (c.StartTime == DateTime.MinValue)
|
else if (c.StartTime == DateTime.MinValue)
|
||||||
timeText = "";
|
timeText = "";
|
||||||
else
|
else
|
||||||
@@ -1005,21 +1072,20 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
void SetupDirectoryList()
|
void SetupDirectoryList()
|
||||||
{
|
{
|
||||||
var codec = Codec as IHasDirectory;
|
var codec = Codec as IHasDirectory;
|
||||||
if (codec != null)
|
if (codec == null)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DirectoryList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCDirectoryList],
|
DirectoryList = new SmartObjectDynamicList(TriList.SmartObjects[UISmartObjectJoin.VCDirectoryList],
|
||||||
true, 1300);
|
true, 1300);
|
||||||
codec.DirectoryResultReturned += new EventHandler<DirectoryEventArgs>(dir_DirectoryResultReturned);
|
codec.DirectoryResultReturned += dir_DirectoryResultReturned;
|
||||||
|
|
||||||
if (codec.PhonebookSyncState.InitialSyncComplete)
|
if (codec.PhonebookSyncState.InitialSyncComplete)
|
||||||
SetCurrentDirectoryToRoot();
|
SetCurrentDirectoryToRoot();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
codec.PhonebookSyncState.InitialSyncCompleted += new EventHandler<EventArgs>(PhonebookSyncState_InitialSyncCompleted);
|
codec.PhonebookSyncState.InitialSyncCompleted += PhonebookSyncState_InitialSyncCompleted;
|
||||||
}
|
|
||||||
|
|
||||||
RefreshDirectory();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1028,11 +1094,15 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetCurrentDirectoryToRoot()
|
void SetCurrentDirectoryToRoot()
|
||||||
{
|
{
|
||||||
(Codec as IHasDirectory).SetCurrentDirectoryToRoot();
|
var hasDirectory = Codec as IHasDirectory;
|
||||||
|
|
||||||
|
if (hasDirectory == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasDirectory.SetCurrentDirectoryToRoot();
|
||||||
SearchKeypadClear();
|
SearchKeypadClear();
|
||||||
|
|
||||||
RefreshDirectory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1044,10 +1114,17 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
{
|
{
|
||||||
var codec = Codec as IHasDirectory;
|
var codec = Codec as IHasDirectory;
|
||||||
|
|
||||||
|
if (codec == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!codec.CurrentDirectoryResultIsNotDirectoryRoot.BoolValue)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SetCurrentDirectoryToRoot();
|
SetCurrentDirectoryToRoot();
|
||||||
|
|
||||||
RefreshDirectory();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1057,8 +1134,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
/// <param name="e"></param>
|
/// <param name="e"></param>
|
||||||
void dir_DirectoryResultReturned(object sender, DirectoryEventArgs e)
|
void dir_DirectoryResultReturned(object sender, DirectoryEventArgs e)
|
||||||
{
|
{
|
||||||
|
RefreshDirectory(e.Directory);
|
||||||
RefreshDirectory();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1090,13 +1166,24 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dir"></param>
|
|
||||||
void RefreshDirectory()
|
void RefreshDirectory()
|
||||||
{
|
{
|
||||||
if ((Codec as IHasDirectory).CurrentDirectoryResult.CurrentDirectoryResults.Count > 0)
|
var codec = Codec as IHasDirectory;
|
||||||
|
|
||||||
|
if (codec == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RefreshDirectory(codec.CurrentDirectoryResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RefreshDirectory(CodecDirectory directory)
|
||||||
|
{
|
||||||
|
if (directory.CurrentDirectoryResults.Count > 0)
|
||||||
{
|
{
|
||||||
ushort i = 0;
|
ushort i = 0;
|
||||||
foreach (var r in (Codec as IHasDirectory).CurrentDirectoryResult.CurrentDirectoryResults)
|
foreach (var r in directory.CurrentDirectoryResults)
|
||||||
{
|
{
|
||||||
if (i == DirectoryList.MaxCount)
|
if (i == DirectoryList.MaxCount)
|
||||||
{
|
{
|
||||||
@@ -1116,21 +1203,35 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
// If more than one contact method, show contact method modal dialog
|
// If more than one contact method, show contact method modal dialog
|
||||||
DirectoryList.SetItemButtonAction(i, b =>
|
DirectoryList.SetItemButtonAction(i, b =>
|
||||||
{
|
{
|
||||||
if (!b)
|
if (b)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Refresh the contact methods list
|
// Refresh the contact methods list
|
||||||
RefreshContactMethodsModalList(dc);
|
RefreshContactMethodsModalList(dc);
|
||||||
Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.MeetingsOrContacMethodsListVisible);
|
Parent.PopupInterlock.ShowInterlockedWithToggle(UIBoolJoin.MeetingsOrContacMethodsListVisible);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (dc.ContactMethods.Count == 1)
|
||||||
|
{
|
||||||
|
var invitableContact = dc as IInvitableContact;
|
||||||
|
|
||||||
|
if (invitableContact != null)
|
||||||
|
{
|
||||||
|
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(invitableContact); });
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If only one contact method, just dial that method
|
// If only one contact method, just dial that method
|
||||||
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
|
DirectoryList.SetItemButtonAction(i, b => { if (!b) Codec.Dial(dc.ContactMethods[0].Number); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Unable to dial contact. No availble ContactMethod(s) specified");
|
||||||
|
}
|
||||||
|
}
|
||||||
else // is DirectoryFolder
|
else // is DirectoryFolder
|
||||||
{
|
{
|
||||||
DirectoryList.SetItemMainText(i, string.Format("[+] {0}", r.Name));
|
DirectoryList.SetItemMainText(i, string.Format("[+] {0}", r.Name));
|
||||||
@@ -1155,7 +1256,6 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
|
|
||||||
DirectoryList.SetItemMainText(1, "No Results Found");
|
DirectoryList.SetItemMainText(1, "No Results Found");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefreshContactMethodsModalList(DirectoryContact contact)
|
void RefreshContactMethodsModalList(DirectoryContact contact)
|
||||||
@@ -1201,7 +1301,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
var lc = Codec as IHasCodecLayouts;
|
var lc = Codec as IHasCodecLayouts;
|
||||||
if (lc != null)
|
if (lc != null)
|
||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(UIBoolJoin.VCLayoutTogglePress, lc.LocalLayoutToggleSingleProminent);
|
|
||||||
lc.LocalLayoutFeedback.LinkInputSig(TriList.StringInput[UIStringJoin.VCLayoutModeText]);
|
lc.LocalLayoutFeedback.LinkInputSig(TriList.StringInput[UIStringJoin.VCLayoutModeText]);
|
||||||
lc.LocalLayoutFeedback.OutputChange += (o,a) =>
|
lc.LocalLayoutFeedback.OutputChange += (o,a) =>
|
||||||
{
|
{
|
||||||
@@ -1214,6 +1314,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
var cisco = Codec as PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoSparkCodec;
|
var cisco = Codec as PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoSparkCodec;
|
||||||
if (cisco != null)
|
if (cisco != null)
|
||||||
{
|
{
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.VCLayoutTogglePress, lc.LocalLayoutToggleSingleProminent);
|
||||||
// Cisco has min/max buttons that need special sauce
|
// Cisco has min/max buttons that need special sauce
|
||||||
cisco.SharingContentIsOnFeedback.OutputChange += CiscoSharingAndPresentation_OutputChanges;
|
cisco.SharingContentIsOnFeedback.OutputChange += CiscoSharingAndPresentation_OutputChanges;
|
||||||
//cisco.PresentationViewMaximizedFeedback.OutputChange += CiscoSharingAndPresentation_OutputChanges;
|
//cisco.PresentationViewMaximizedFeedback.OutputChange += CiscoSharingAndPresentation_OutputChanges;
|
||||||
@@ -1221,7 +1322,16 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
TriList.SetSigFalseAction(UIBoolJoin.VCMinMaxPress, cisco.MinMaxLayoutToggle);
|
TriList.SetSigFalseAction(UIBoolJoin.VCMinMaxPress, cisco.MinMaxLayoutToggle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var zoomRoom = Codec as PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom.ZoomRoom;
|
||||||
|
if (zoomRoom != null)
|
||||||
|
{
|
||||||
|
TriList.BooleanInput[UIBoolJoin.VCLayoutToggleEnable].BoolValue = true;
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.VCLayoutTogglePress, lc.LocalLayoutToggle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1249,7 +1359,21 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void RevealKeyboard()
|
void RevealKeyboard()
|
||||||
{
|
{
|
||||||
if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial)
|
if (_passwordPromptDialogVisible)
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Attaching Keyboard to PasswordPromptDialog");
|
||||||
|
DetachDialKeyboard();
|
||||||
|
DetachSearchKeyboard();
|
||||||
|
var kb = Parent.Keyboard;
|
||||||
|
kb.KeyPress -= Keyboard_PasswordKeyPress;
|
||||||
|
kb.KeyPress += Keyboard_PasswordKeyPress;
|
||||||
|
kb.HideAction = this.DetachPasswordKeyboard;
|
||||||
|
kb.GoButtonText = "Submit";
|
||||||
|
kb.GoButtonVisible = true;
|
||||||
|
PasswordStringCheckEnables();
|
||||||
|
kb.Show();
|
||||||
|
}
|
||||||
|
else if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial)
|
||||||
{
|
{
|
||||||
var kb = Parent.Keyboard;
|
var kb = Parent.Keyboard;
|
||||||
kb.KeyPress -= Keyboard_DialKeyPress;
|
kb.KeyPress -= Keyboard_DialKeyPress;
|
||||||
@@ -1271,6 +1395,7 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
SearchStringKeypadCheckEnables();
|
SearchStringKeypadCheckEnables();
|
||||||
kb.Show();
|
kb.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1326,6 +1451,32 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event handler for keyboard dialing
|
||||||
|
/// </summary>
|
||||||
|
void Keyboard_PasswordKeyPress(object sender, PepperDash.Essentials.Core.Touchpanels.Keyboards.KeyboardControllerPressEventArgs e)
|
||||||
|
{
|
||||||
|
if (_passwordPromptDialogVisible)
|
||||||
|
{
|
||||||
|
if (e.Text != null)
|
||||||
|
PasswordStringBuilder.Append(e.Text);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (e.SpecialKey == KeyboardSpecialKey.Backspace)
|
||||||
|
PasswordKeypadBackspacePress();
|
||||||
|
else if (e.SpecialKey == KeyboardSpecialKey.Clear)
|
||||||
|
PasswordKeypadClear();
|
||||||
|
else if (e.SpecialKey == KeyboardSpecialKey.GoButton)
|
||||||
|
{
|
||||||
|
(Codec as IPasswordPrompt).SubmitPassword(PasswordStringBuilder.ToString());
|
||||||
|
HidePasswordPrompt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PasswordStringFeedback.FireUpdate();
|
||||||
|
PasswordStringCheckEnables();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Call
|
/// Call
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1339,6 +1490,11 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
Parent.Keyboard.KeyPress -= Keyboard_SearchKeyPress;
|
Parent.Keyboard.KeyPress -= Keyboard_SearchKeyPress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DetachPasswordKeyboard()
|
||||||
|
{
|
||||||
|
Parent.Keyboard.KeyPress -= Keyboard_PasswordKeyPress;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Shows the camera controls subpage
|
/// Shows the camera controls subpage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1416,6 +1572,22 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Meet Now button
|
||||||
|
/// </summary>
|
||||||
|
void MeetNowPress()
|
||||||
|
{
|
||||||
|
var startMeetingCodec = Codec as IHasStartMeeting;
|
||||||
|
if (startMeetingCodec != null)
|
||||||
|
{
|
||||||
|
startMeetingCodec.StartMeeting(startMeetingCodec.DefaultMeetingDurationMin);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(2, "Codce does not implment IHasStartMeeting. Cannot meet now");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Connect call button
|
/// Connect call button
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1426,6 +1598,16 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
Codec.Dial(DialStringBuilder.ToString());
|
Codec.Dial(DialStringBuilder.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stop Sharing button
|
||||||
|
/// </summary>
|
||||||
|
void CallStopSharingPress()
|
||||||
|
{
|
||||||
|
Codec.StopSharing();
|
||||||
|
Parent.CurrentRoom.RunRouteAction("codecOsd", Parent.CurrentRoom.SourceListKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1592,6 +1774,40 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
Parent.Keyboard.DisableGoButton();
|
Parent.Keyboard.DisableGoButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clears the Password keypad
|
||||||
|
/// </summary>
|
||||||
|
void PasswordKeypadClear()
|
||||||
|
{
|
||||||
|
PasswordStringBuilder.Remove(0, SearchStringBuilder.Length);
|
||||||
|
PasswordStringFeedback.FireUpdate();
|
||||||
|
PasswordStringCheckEnables();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
void PasswordKeypadBackspacePress()
|
||||||
|
{
|
||||||
|
PasswordStringBuilder.Remove(PasswordStringBuilder.Length - 1, 1);
|
||||||
|
|
||||||
|
PasswordStringFeedback.FireUpdate();
|
||||||
|
PasswordStringCheckEnables();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks the enabled states of various elements around the keypad
|
||||||
|
/// </summary>
|
||||||
|
void PasswordStringCheckEnables()
|
||||||
|
{
|
||||||
|
var textIsEntered = PasswordStringBuilder.Length > 0;
|
||||||
|
if (textIsEntered)
|
||||||
|
Parent.Keyboard.EnableGoButton();
|
||||||
|
else
|
||||||
|
Parent.Keyboard.DisableGoButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the text value for the keypad dial entry field
|
/// Returns the text value for the keypad dial entry field
|
||||||
@@ -1637,5 +1853,61 @@ namespace PepperDash.Essentials.UIDrivers.VC
|
|||||||
Dial = 0,
|
Dial = 0,
|
||||||
DTMF
|
DTMF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetupPasswordPrompt()
|
||||||
|
{
|
||||||
|
var passwordPromptCodec = Codec as IPasswordPrompt;
|
||||||
|
|
||||||
|
passwordPromptCodec.PasswordRequired += new EventHandler<PasswordPromptEventArgs>(passwordPromptCodec_PasswordRequired);
|
||||||
|
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.PasswordPromptCancelPress, HidePasswordPrompt);
|
||||||
|
TriList.SetSigFalseAction(UIBoolJoin.PasswordPromptTextPress, RevealKeyboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
void passwordPromptCodec_PasswordRequired(object sender, PasswordPromptEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.LoginAttemptCancelled)
|
||||||
|
{
|
||||||
|
HidePasswordPrompt();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(e.Message))
|
||||||
|
{
|
||||||
|
TriList.SetString(UIStringJoin.PasswordPromptMessageText, e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.LoginAttemptFailed)
|
||||||
|
{
|
||||||
|
// TODO: Show a message modal to indicate the login attempt failed
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TriList.SetBool(UIBoolJoin.PasswordPromptErrorVisible, e.LastAttemptWasIncorrect);
|
||||||
|
|
||||||
|
ShowPasswordPrompt();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool _passwordPromptDialogVisible;
|
||||||
|
|
||||||
|
void ShowPasswordPrompt()
|
||||||
|
{
|
||||||
|
// Clear out any previous data
|
||||||
|
PasswordKeypadClear();
|
||||||
|
|
||||||
|
_passwordPromptDialogVisible = true;
|
||||||
|
TriList.SetBool(UIBoolJoin.PasswordPromptDialogVisible, _passwordPromptDialogVisible);
|
||||||
|
RevealKeyboard();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HidePasswordPrompt()
|
||||||
|
{
|
||||||
|
if (_passwordPromptDialogVisible)
|
||||||
|
{
|
||||||
|
_passwordPromptDialogVisible = false;
|
||||||
|
Parent.Keyboard.Hide();
|
||||||
|
TriList.SetBool(UIBoolJoin.PasswordPromptDialogVisible, _passwordPromptDialogVisible);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -385,7 +385,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
{
|
{
|
||||||
public EiscApiAdvancedFactory()
|
public EiscApiAdvancedFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "vceiscapiadv", "vceiscapiadvanced" };
|
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
@@ -403,6 +403,16 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
return new EiscApiAdvanced(dc, eisc);
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
}
|
}
|
||||||
|
case "eiscapiadvancedserver":
|
||||||
|
{
|
||||||
|
var eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
|
case "eiscapiadvancedclient":
|
||||||
|
{
|
||||||
|
var eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
|
}
|
||||||
case "vceiscapiadv":
|
case "vceiscapiadv":
|
||||||
case "vceiscapiadvanced":
|
case "vceiscapiadvanced":
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
|
using Crestron.SimplSharpPro.GeneralIO;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.CrestronIO
|
||||||
|
{
|
||||||
|
public class C2NIoController:CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IRelayPorts
|
||||||
|
{
|
||||||
|
private C2nIo _device;
|
||||||
|
|
||||||
|
public C2NIoController(string key, Func<DeviceConfig, C2nIo> preActivationFunc, DeviceConfig config):base(key, config.Name)
|
||||||
|
{
|
||||||
|
AddPreActivationAction(() =>
|
||||||
|
{
|
||||||
|
_device = preActivationFunc(config);
|
||||||
|
|
||||||
|
RegisterCrestronGenericBase(_device);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Implementation of IComPorts
|
||||||
|
|
||||||
|
public CrestronCollection<ComPort> ComPorts
|
||||||
|
{
|
||||||
|
get { return _device.ComPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfComPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfComPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Implementation of IIROutputPorts
|
||||||
|
|
||||||
|
public CrestronCollection<IROutputPort> IROutputPorts
|
||||||
|
{
|
||||||
|
get { return _device.IROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfIROutputPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfIROutputPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Implementation of IRelayPorts
|
||||||
|
|
||||||
|
public CrestronCollection<Relay> RelayPorts
|
||||||
|
{
|
||||||
|
get { return _device.RelayPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int NumberOfRelayPorts
|
||||||
|
{
|
||||||
|
get { return _device.NumberOfRelayPorts; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
public class C2NIoControllerFactory : EssentialsDeviceFactory<C2nRthsController>
|
||||||
|
{
|
||||||
|
public C2NIoControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "c2nio" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new C2N-IO Device");
|
||||||
|
|
||||||
|
return new C2NIoController(dc.Key, GetC2NIoDevice, dc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static C2nIo GetC2NIoDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
var cresnetId = control.CresnetIdInt;
|
||||||
|
var branchId = control.ControlPortNumber;
|
||||||
|
var parentKey = string.IsNullOrEmpty(control.ControlPortDevKey) ? "processor" : control.ControlPortDevKey;
|
||||||
|
|
||||||
|
if (parentKey.Equals("processor", StringComparison.CurrentCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Device {0} is a valid cresnet master - creating new C2nIo", parentKey);
|
||||||
|
return new C2nIo(cresnetId, Global.ControlSystem);
|
||||||
|
}
|
||||||
|
var cresnetBridge = DeviceManager.GetDeviceForKey(parentKey) as IHasCresnetBranches;
|
||||||
|
|
||||||
|
if (cresnetBridge != null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Device {0} is a valid cresnet master - creating new C2nIo", parentKey);
|
||||||
|
return new C2nIo(cresnetId, cresnetBridge.CresnetBranches[branchId]);
|
||||||
|
}
|
||||||
|
Debug.Console(0, "Device {0} is not a valid cresnet master", parentKey);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,6 +13,14 @@ namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
|||||||
void LinkSystemMonitorToAppServer();
|
void LinkSystemMonitorToAppServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Describes a MobileSystemController that accepts IEssentialsRoom
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControl3 : IMobileControl
|
||||||
|
{
|
||||||
|
void CreateMobileControlRoomBridge(IEssentialsRoom room, IMobileControl parent);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Describes a MobileControl Room Bridge
|
/// Describes a MobileControl Room Bridge
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes the functionality required to prompt a user to enter a password
|
||||||
|
/// </summary>
|
||||||
|
public interface IPasswordPrompt
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Notifies when a password is required or is entered incorrectly
|
||||||
|
/// </summary>
|
||||||
|
event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Submits the password
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
void SubmitPassword(string password);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PasswordPromptEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates if the last submitted password was incorrect
|
||||||
|
/// </summary>
|
||||||
|
public bool LastAttemptWasIncorrect { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the login attempt has failed
|
||||||
|
/// </summary>
|
||||||
|
public bool LoginAttemptFailed { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the process was cancelled and the prompt should be dismissed
|
||||||
|
/// </summary>
|
||||||
|
public bool LoginAttemptCancelled { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A message to be displayed to the user
|
||||||
|
/// </summary>
|
||||||
|
public string Message { get; private set; }
|
||||||
|
|
||||||
|
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||||
|
{
|
||||||
|
LastAttemptWasIncorrect = lastAttemptIncorrect;
|
||||||
|
LoginAttemptFailed = loginFailed;
|
||||||
|
LoginAttemptCancelled = loginCancelled;
|
||||||
|
Message = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -77,10 +77,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
var mParams = method.GetParameters();
|
var mParams = method.GetParameters();
|
||||||
|
|
||||||
var convertedParams = mParams
|
var convertedParams = mParams
|
||||||
.Select((p, i) => Convert.ChangeType(action.Params[i], p.ParameterType,
|
.Select((p, i) => ConvertType(action.Params[i], p.ParameterType))
|
||||||
System.Globalization.CultureInfo.InvariantCulture))
|
|
||||||
.ToArray();
|
.ToArray();
|
||||||
var ret = method.Invoke(obj, convertedParams);
|
method.Invoke(obj, convertedParams);
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Method {0} successfully called on device {1}", method.Name,
|
CrestronConsole.ConsoleCommandResponse("Method {0} successfully called on device {1}", method.Name,
|
||||||
action.DeviceKey);
|
action.DeviceKey);
|
||||||
@@ -91,6 +90,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
ex.Message);}
|
ex.Message);}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static object ConvertType(object value, Type conversionType)
|
||||||
|
{
|
||||||
|
if (!conversionType.IsEnum)
|
||||||
|
{
|
||||||
|
return Convert.ChangeType(value, conversionType, System.Globalization.CultureInfo.InvariantCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
var stringValue = Convert.ToString(value);
|
||||||
|
|
||||||
|
if (String.IsNullOrEmpty(stringValue))
|
||||||
|
{
|
||||||
|
throw new InvalidCastException(
|
||||||
|
String.Format("{0} cannot be converted to a string prior to conversion to enum"));
|
||||||
|
}
|
||||||
|
return Enum.Parse(conversionType, stringValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the properties on a device
|
/// Gets the properties on a device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -275,6 +291,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
//var props = t.GetProperties().Select(p => new PropertyNameType(p, obj));
|
//var props = t.GetProperties().Select(p => new PropertyNameType(p, obj));
|
||||||
//return JsonConvert.SerializeObject(props, Formatting.Indented);
|
//return JsonConvert.SerializeObject(props, Formatting.Indented);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DeviceActionWrapper
|
public class DeviceActionWrapper
|
||||||
|
|||||||
@@ -435,7 +435,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
var min = Convert.ToUInt32(timeout);
|
var min = Convert.ToUInt32(timeout);
|
||||||
|
|
||||||
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
||||||
Debug.Console(0, "Device: '{0}' debug level set to {1) for {2} minutes", deviceKey, debugSetting, min);
|
Debug.Console(0, "Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.Devices
|
||||||
|
{
|
||||||
|
public interface IReconfigurableDevice
|
||||||
|
{
|
||||||
|
event EventHandler<EventArgs> ConfigChanged;
|
||||||
|
|
||||||
|
DeviceConfig Config { get; }
|
||||||
|
|
||||||
|
void SetConfig(DeviceConfig config);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class ReconfigurableDevice : EssentialsDevice
|
public abstract class ReconfigurableDevice : EssentialsDevice, IReconfigurableDevice
|
||||||
{
|
{
|
||||||
public event EventHandler<EventArgs> ConfigChanged;
|
public event EventHandler<EventArgs> ConfigChanged;
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
VolumeLevelFeedback = new IntFeedback(() => { return _FakeVolumeLevel; });
|
VolumeLevelFeedback = new IntFeedback(() => { return _FakeVolumeLevel; });
|
||||||
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
||||||
|
|
||||||
|
WarmupTime = 10000;
|
||||||
|
CooldownTime = 5000;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PowerOn()
|
public override void PowerOn()
|
||||||
|
|||||||
@@ -156,6 +156,15 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Exception occurred while creating device {0}: {1}", dc.Key, ex.Message);
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Exception occurred while creating device {0}: {1}", dc.Key, ex.Message);
|
||||||
|
|
||||||
Debug.Console(2, "{0}", ex.StackTrace);
|
Debug.Console(2, "{0}", ex.StackTrace);
|
||||||
|
|
||||||
|
if (ex.InnerException == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Inner exception while creating device {0}: {1}", dc.Key,
|
||||||
|
ex.InnerException.Message);
|
||||||
|
Debug.Console(2, "{0}", ex.InnerException.StackTrace);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
protected bool ComputedValue;
|
protected bool ComputedValue;
|
||||||
|
|
||||||
public BoolFeedbackLogic()
|
protected BoolFeedbackLogic()
|
||||||
{
|
{
|
||||||
Output = new BoolFeedback(() => ComputedValue);
|
Output = new BoolFeedback(() => ComputedValue);
|
||||||
}
|
}
|
||||||
@@ -40,11 +40,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public void AddOutputsIn(List<BoolFeedback> outputs)
|
public void AddOutputsIn(List<BoolFeedback> outputs)
|
||||||
{
|
{
|
||||||
foreach (var o in outputs)
|
foreach (var o in outputs.Where(o => !OutputsIn.Contains(o)))
|
||||||
{
|
{
|
||||||
// skip existing
|
|
||||||
if (OutputsIn.Contains(o)) continue;
|
|
||||||
|
|
||||||
OutputsIn.Add(o);
|
OutputsIn.Add(o);
|
||||||
o.OutputChange += AnyInput_OutputChange;
|
o.OutputChange += AnyInput_OutputChange;
|
||||||
}
|
}
|
||||||
@@ -54,7 +51,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public void RemoveOutputIn(BoolFeedback output)
|
public void RemoveOutputIn(BoolFeedback output)
|
||||||
{
|
{
|
||||||
// Don't double up outputs
|
// Don't double up outputs
|
||||||
if (OutputsIn.Contains(output)) return;
|
if (!OutputsIn.Contains(output)) return;
|
||||||
|
|
||||||
OutputsIn.Remove(output);
|
OutputsIn.Remove(output);
|
||||||
output.OutputChange -= AnyInput_OutputChange;
|
output.OutputChange -= AnyInput_OutputChange;
|
||||||
@@ -71,6 +68,12 @@ namespace PepperDash.Essentials.Core
|
|||||||
Evaluate();
|
Evaluate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ClearOutputs()
|
||||||
|
{
|
||||||
|
OutputsIn.Clear();
|
||||||
|
Evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
void AnyInput_OutputChange(object sender, EventArgs e)
|
void AnyInput_OutputChange(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Evaluate();
|
Evaluate();
|
||||||
@@ -85,13 +88,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
var prevValue = ComputedValue;
|
var prevValue = ComputedValue;
|
||||||
var newValue = OutputsIn.All(o => o.BoolValue);
|
var newValue = OutputsIn.All(o => o.BoolValue);
|
||||||
if (newValue != prevValue)
|
if (newValue == prevValue)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
ComputedValue = newValue;
|
ComputedValue = newValue;
|
||||||
Output.FireUpdate();
|
Output.FireUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public class BoolFeedbackOr : BoolFeedbackLogic
|
public class BoolFeedbackOr : BoolFeedbackLogic
|
||||||
{
|
{
|
||||||
@@ -99,33 +103,35 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
var prevValue = ComputedValue;
|
var prevValue = ComputedValue;
|
||||||
var newValue = OutputsIn.Any(o => o.BoolValue);
|
var newValue = OutputsIn.Any(o => o.BoolValue);
|
||||||
if (newValue != prevValue)
|
if (newValue == prevValue)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
ComputedValue = newValue;
|
ComputedValue = newValue;
|
||||||
Output.FireUpdate();
|
Output.FireUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public class BoolFeedbackLinq : BoolFeedbackLogic
|
public class BoolFeedbackLinq : BoolFeedbackLogic
|
||||||
{
|
{
|
||||||
Func<IEnumerable<BoolFeedback>, bool> Predicate;
|
readonly Func<IEnumerable<BoolFeedback>, bool> _predicate;
|
||||||
|
|
||||||
public BoolFeedbackLinq(Func<IEnumerable<BoolFeedback>, bool> predicate)
|
public BoolFeedbackLinq(Func<IEnumerable<BoolFeedback>, bool> predicate)
|
||||||
: base()
|
: base()
|
||||||
{
|
{
|
||||||
Predicate = predicate;
|
_predicate = predicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Evaluate()
|
protected override void Evaluate()
|
||||||
{
|
{
|
||||||
var prevValue = ComputedValue;
|
var prevValue = ComputedValue;
|
||||||
var newValue = Predicate(OutputsIn);
|
var newValue = _predicate(OutputsIn);
|
||||||
if (newValue != prevValue)
|
if (newValue == prevValue)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
ComputedValue = newValue;
|
ComputedValue = newValue;
|
||||||
Output.FireUpdate();
|
Output.FireUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@ namespace PepperDash.Essentials.Core.Fusion
|
|||||||
protected FusionRoom FusionRoom;
|
protected FusionRoom FusionRoom;
|
||||||
protected Dictionary<int, FusionAsset> FusionStaticAssets;
|
protected Dictionary<int, FusionAsset> FusionStaticAssets;
|
||||||
public long PushNotificationTimeout = 5000;
|
public long PushNotificationTimeout = 5000;
|
||||||
protected EssentialsRoomBase Room;
|
protected IEssentialsRoom Room;
|
||||||
public long SchedulePollInterval = 300000;
|
public long SchedulePollInterval = 300000;
|
||||||
|
|
||||||
private Event _currentMeeting;
|
private Event _currentMeeting;
|
||||||
@@ -86,7 +86,7 @@ namespace PepperDash.Essentials.Core.Fusion
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public EssentialsHuddleSpaceFusionSystemControllerBase(EssentialsRoomBase room, uint ipId, string joinMapKey)
|
public EssentialsHuddleSpaceFusionSystemControllerBase(IEssentialsRoom room, uint ipId, string joinMapKey)
|
||||||
: base(room.Key + "-fusion")
|
: base(room.Key + "-fusion")
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ namespace PepperDash.Essentials.Core.Fusion
|
|||||||
|
|
||||||
deviceConfig.Properties = JToken.FromObject(devProps);
|
deviceConfig.Properties = JToken.FromObject(devProps);
|
||||||
}
|
}
|
||||||
else if (device is EssentialsRoomBase)
|
else if (device is IEssentialsRoom)
|
||||||
{
|
{
|
||||||
// Set the room name
|
// Set the room name
|
||||||
if (!string.IsNullOrEmpty(roomInfo.Name))
|
if (!string.IsNullOrEmpty(roomInfo.Name))
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
@@ -28,6 +29,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public static eCrestronSeries ProcessorSeries { get { return CrestronEnvironment.ProgramCompatibility; } }
|
public static eCrestronSeries ProcessorSeries { get { return CrestronEnvironment.ProgramCompatibility; } }
|
||||||
|
|
||||||
|
// TODO: consider making this configurable later
|
||||||
|
public static IFormatProvider Culture = CultureInfo.CreateSpecificCulture("en-US");
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The file path prefix to the folder containing configuration files
|
/// The file path prefix to the folder containing configuration files
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -3,16 +3,17 @@ 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.GeneralIO;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Aggregates the RoomIsOccupied feedbacks of one or more IOccupancyStatusProvider objects
|
/// Aggregates the RoomIsOccupied feedbacks of one or more IOccupancyStatusProvider objects
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class IOccupancyStatusProviderAggregator : Device, IOccupancyStatusProvider
|
public class IOccupancyStatusProviderAggregator : EssentialsDevice, IOccupancyStatusProvider
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Aggregated feedback of all linked IOccupancyStatusProvider devices
|
/// Aggregated feedback of all linked IOccupancyStatusProvider devices
|
||||||
@@ -21,16 +22,51 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return AggregatedOccupancyStatus.Output;
|
return _aggregatedOccupancyStatus.Output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BoolFeedbackOr AggregatedOccupancyStatus;
|
private readonly BoolFeedbackOr _aggregatedOccupancyStatus;
|
||||||
|
|
||||||
public IOccupancyStatusProviderAggregator(string key, string name)
|
public IOccupancyStatusProviderAggregator(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
AggregatedOccupancyStatus = new BoolFeedbackOr();
|
_aggregatedOccupancyStatus = new BoolFeedbackOr();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IOccupancyStatusProviderAggregator(string key, string name, OccupancyAggregatorConfig config)
|
||||||
|
: this(key, name)
|
||||||
|
{
|
||||||
|
AddPostActivationAction(() =>
|
||||||
|
{
|
||||||
|
if (config.DeviceKeys.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var deviceKey in config.DeviceKeys)
|
||||||
|
{
|
||||||
|
var device = DeviceManager.GetDeviceForKey(deviceKey);
|
||||||
|
|
||||||
|
if (device == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
||||||
|
"Unable to retrieve Occupancy provider with key {0}", deviceKey);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var provider = device as IOccupancyStatusProvider;
|
||||||
|
|
||||||
|
if (provider == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
||||||
|
"Device with key {0} does NOT implement IOccupancyStatusProvider. Please check configuration.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddOccupancyStatusProvider(provider);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -39,7 +75,35 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="statusProvider"></param>
|
/// <param name="statusProvider"></param>
|
||||||
public void AddOccupancyStatusProvider(IOccupancyStatusProvider statusProvider)
|
public void AddOccupancyStatusProvider(IOccupancyStatusProvider statusProvider)
|
||||||
{
|
{
|
||||||
AggregatedOccupancyStatus.AddOutputIn(statusProvider.RoomIsOccupiedFeedback);
|
_aggregatedOccupancyStatus.AddOutputIn(statusProvider.RoomIsOccupiedFeedback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveOccupancyStatusProvider(IOccupancyStatusProvider statusProvider)
|
||||||
|
{
|
||||||
|
_aggregatedOccupancyStatus.RemoveOutputIn(statusProvider.RoomIsOccupiedFeedback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearOccupancyStatusProviders()
|
||||||
|
{
|
||||||
|
_aggregatedOccupancyStatus.ClearOutputs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OccupancyAggregatorFactory : EssentialsDeviceFactory<IOccupancyStatusProviderAggregator>
|
||||||
|
{
|
||||||
|
public OccupancyAggregatorFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string> { "occupancyAggregator", "occAggregate" };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Factory Attempting to create new GlsOccupancySensorBaseController Device");
|
||||||
|
|
||||||
|
var config = dc.Properties.ToObject<OccupancyAggregatorConfig>();
|
||||||
|
|
||||||
|
return new IOccupancyStatusProviderAggregator(dc.Key, dc.Name, config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
public class OccupancyAggregatorConfig
|
||||||
|
{
|
||||||
|
[JsonProperty("deviceKeys")] public List<string> DeviceKeys { get; set; }
|
||||||
|
|
||||||
|
public OccupancyAggregatorConfig()
|
||||||
|
{
|
||||||
|
DeviceKeys = new List<string>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -162,6 +162,7 @@
|
|||||||
<Compile Include="Config\Essentials\ConfigWriter.cs" />
|
<Compile Include="Config\Essentials\ConfigWriter.cs" />
|
||||||
<Compile Include="Config\Essentials\EssentialsConfig.cs" />
|
<Compile Include="Config\Essentials\EssentialsConfig.cs" />
|
||||||
<Compile Include="Config\SourceDevicePropertiesConfigBase.cs" />
|
<Compile Include="Config\SourceDevicePropertiesConfigBase.cs" />
|
||||||
|
<Compile Include="Crestron IO\C2nIo\C2nIoController.cs" />
|
||||||
<Compile Include="Crestron IO\C2nRts\C2nRthsController.cs" />
|
<Compile Include="Crestron IO\C2nRts\C2nRthsController.cs" />
|
||||||
<Compile Include="Crestron IO\Cards\C3CardControllerBase.cs" />
|
<Compile Include="Crestron IO\Cards\C3CardControllerBase.cs" />
|
||||||
<Compile Include="Crestron IO\Cards\C3Com3Controller.cs" />
|
<Compile Include="Crestron IO\Cards\C3Com3Controller.cs" />
|
||||||
@@ -197,10 +198,12 @@
|
|||||||
<Compile Include="Devices\GenericIRController.cs" />
|
<Compile Include="Devices\GenericIRController.cs" />
|
||||||
<Compile Include="Devices\IDspPreset.cs" />
|
<Compile Include="Devices\IDspPreset.cs" />
|
||||||
<Compile Include="Devices\IProjectorInterfaces.cs" />
|
<Compile Include="Devices\IProjectorInterfaces.cs" />
|
||||||
|
<Compile Include="Devices\IReconfigurableDevice.cs" />
|
||||||
<Compile Include="Devices\PC\InRoomPc.cs" />
|
<Compile Include="Devices\PC\InRoomPc.cs" />
|
||||||
<Compile Include="Devices\PC\Laptop.cs" />
|
<Compile Include="Devices\PC\Laptop.cs" />
|
||||||
<Compile Include="Devices\ReconfigurableDevice.cs" />
|
<Compile Include="Devices\ReconfigurableDevice.cs" />
|
||||||
<Compile Include="Devices\VolumeDeviceChangeEventArgs.cs" />
|
<Compile Include="Devices\VolumeDeviceChangeEventArgs.cs" />
|
||||||
|
<Compile Include="DeviceTypeInterfaces\IPasswordPrompt.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\ITvPresetsProvider.cs" />
|
<Compile Include="DeviceTypeInterfaces\ITvPresetsProvider.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\LanguageLabel.cs" />
|
<Compile Include="DeviceTypeInterfaces\LanguageLabel.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\ILanguageProvider.cs" />
|
<Compile Include="DeviceTypeInterfaces\ILanguageProvider.cs" />
|
||||||
@@ -232,6 +235,7 @@
|
|||||||
<Compile Include="Interfaces\ILogStringsWithLevel.cs" />
|
<Compile Include="Interfaces\ILogStringsWithLevel.cs" />
|
||||||
<Compile Include="Occupancy\GlsOccupancySensorPropertiesConfig.cs" />
|
<Compile Include="Occupancy\GlsOccupancySensorPropertiesConfig.cs" />
|
||||||
<Compile Include="Occupancy\GlsOirOccupancySensorController.cs" />
|
<Compile Include="Occupancy\GlsOirOccupancySensorController.cs" />
|
||||||
|
<Compile Include="Occupancy\OccupancyAggregatorConfig.cs" />
|
||||||
<Compile Include="Queues\ComsMessage.cs" />
|
<Compile Include="Queues\ComsMessage.cs" />
|
||||||
<Compile Include="Queues\ProcessStringMessage.cs" />
|
<Compile Include="Queues\ProcessStringMessage.cs" />
|
||||||
<Compile Include="Queues\GenericQueue.cs" />
|
<Compile Include="Queues\GenericQueue.cs" />
|
||||||
@@ -288,6 +292,7 @@
|
|||||||
<Compile Include="Room\Behaviours\RoomOnToDefaultSourceWhenOccupied.cs" />
|
<Compile Include="Room\Behaviours\RoomOnToDefaultSourceWhenOccupied.cs" />
|
||||||
<Compile Include="Room\EssentialsRoomBase.cs" />
|
<Compile Include="Room\EssentialsRoomBase.cs" />
|
||||||
<Compile Include="Room\Config\EssentialsRoomScheduledEventsConfig.cs" />
|
<Compile Include="Room\Config\EssentialsRoomScheduledEventsConfig.cs" />
|
||||||
|
<Compile Include="Room\IEssentialsRoom.cs" />
|
||||||
<Compile Include="Room\Interfaces.cs" />
|
<Compile Include="Room\Interfaces.cs" />
|
||||||
<Compile Include="Room\iOccupancyStatusProvider.cs" />
|
<Compile Include="Room\iOccupancyStatusProvider.cs" />
|
||||||
<Compile Include="Routing\DummyRoutingInputsDevice.cs" />
|
<Compile Include="Routing\DummyRoutingInputsDevice.cs" />
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
ScheduledEventGroup FeatureEventGroup;
|
ScheduledEventGroup FeatureEventGroup;
|
||||||
|
|
||||||
public EssentialsRoomBase Room { get; private set; }
|
public IEssentialsRoom Room { get; private set; }
|
||||||
|
|
||||||
private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
|
private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetUpDevice()
|
void SetUpDevice()
|
||||||
{
|
{
|
||||||
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as EssentialsRoomBase;
|
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as IEssentialsRoom;
|
||||||
|
|
||||||
if (Room != null)
|
if (Room != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class EssentialsRoomBase : ReconfigurableDevice
|
public abstract class EssentialsRoomBase : ReconfigurableDevice, IEssentialsRoom
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes the basic functionality of an EssentialsRoom
|
||||||
|
/// </summary>
|
||||||
|
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute
|
||||||
|
{
|
||||||
|
BoolFeedback OnFeedback { get; }
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> RoomOccupancyIsSet;
|
||||||
|
|
||||||
|
BoolFeedback IsWarmingUpFeedback { get; }
|
||||||
|
BoolFeedback IsCoolingDownFeedback { get; }
|
||||||
|
|
||||||
|
IOccupancyStatusProvider RoomOccupancy { get; }
|
||||||
|
bool OccupancyStatusProviderIsRemote { get; }
|
||||||
|
|
||||||
|
bool IsMobileControlEnabled { get; }
|
||||||
|
IMobileControlRoomBridge MobileControlRoomBridge { get; }
|
||||||
|
|
||||||
|
string SourceListKey { get; }
|
||||||
|
|
||||||
|
SecondsCountdownTimer ShutdownPromptTimer { get; }
|
||||||
|
int ShutdownPromptSeconds { get; }
|
||||||
|
int ShutdownVacancySeconds { get; }
|
||||||
|
eShutdownType ShutdownType { get; }
|
||||||
|
|
||||||
|
EssentialsRoomEmergencyBase Emergency { get; }
|
||||||
|
|
||||||
|
Core.Privacy.MicrophonePrivacyController MicrophonePrivacy { get; }
|
||||||
|
|
||||||
|
string LogoUrlLightBkgnd { get; }
|
||||||
|
string LogoUrlDarkBkgnd { get; }
|
||||||
|
|
||||||
|
eVacancyMode VacancyMode { get; }
|
||||||
|
|
||||||
|
bool ZeroVolumeWhenSwtichingVolumeDevices { get; }
|
||||||
|
|
||||||
|
void StartShutdown(eShutdownType type);
|
||||||
|
void StartRoomVacancyTimer(eVacancyMode mode);
|
||||||
|
|
||||||
|
void Shutdown();
|
||||||
|
|
||||||
|
void SetRoomOccupancy(IOccupancyStatusProvider statusProvider, int timeoutMinutes);
|
||||||
|
|
||||||
|
void PowerOnToDefaultOrLastSource();
|
||||||
|
|
||||||
|
void SetDefaultLevels();
|
||||||
|
|
||||||
|
void RoomVacatedForTimeoutPeriod(object o);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -65,4 +66,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
bool RunDefaultCallRoute();
|
bool RunDefaultCallRoute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -313,7 +313,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
var localVideoInputPort =
|
var localVideoInputPort =
|
||||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
var localAudioInputPort =
|
var localAudioInputPort =
|
||||||
InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
ActiveVideoInputFeedback.FireUpdate();
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
VideoSourceNumericFeedback.FireUpdate();
|
||||||
@@ -338,8 +338,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
||||||
break;
|
break;
|
||||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
||||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
Debug.Console(2, this, " Audio Source: {0}", Tx.VideoSourceFeedback);
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
AudioSourceNumericFeedback.FireUpdate();
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -339,7 +339,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
var localVideoInputPort =
|
var localVideoInputPort =
|
||||||
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
var localAudioInputPort =
|
var localAudioInputPort =
|
||||||
InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
ActiveVideoInputFeedback.FireUpdate();
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
VideoSourceNumericFeedback.FireUpdate();
|
||||||
@@ -364,8 +364,8 @@ namespace PepperDash.Essentials.DM
|
|||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
||||||
break;
|
break;
|
||||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
||||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eAst)p.Selector == Tx.AudioSourceFeedback);
|
var localInputAudioPort = InputPorts.FirstOrDefault(p => (eVst)p.Selector == Tx.VideoSourceFeedback);
|
||||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
Debug.Console(2, this, " Audio Source: {0}", Tx.VideoSourceFeedback);
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
AudioSourceNumericFeedback.FireUpdate();
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -11,10 +11,9 @@ namespace PepperDash.Essentials.Devices.Common.AudioCodec
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// For rooms that have audio codec
|
/// For rooms that have audio codec
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IHasAudioCodec
|
public interface IHasAudioCodec:IHasInCallFeedback
|
||||||
{
|
{
|
||||||
AudioCodecBase AudioCodec { get; }
|
AudioCodecBase AudioCodec { get; }
|
||||||
BoolFeedback InCallFeedback { get; }
|
|
||||||
|
|
||||||
///// <summary>
|
///// <summary>
|
||||||
///// Make this more specific
|
///// Make this more specific
|
||||||
|
|||||||
@@ -69,6 +69,22 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
[JsonProperty("directoryResults")]
|
[JsonProperty("directoryResults")]
|
||||||
public List<DirectoryItem> CurrentDirectoryResults { get; private set; }
|
public List<DirectoryItem> CurrentDirectoryResults { get; private set; }
|
||||||
|
|
||||||
|
public List<DirectoryItem> Contacts
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return CurrentDirectoryResults.OfType<DirectoryContact>().Cast<DirectoryItem>().ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DirectoryItem> Folders
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return CurrentDirectoryResults.OfType<DirectoryFolder>().Cast<DirectoryItem>().ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used to store the ID of the current folder for CurrentDirectoryResults
|
/// Used to store the ID of the current folder for CurrentDirectoryResults
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -104,6 +120,15 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
SortDirectory();
|
SortDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Filters the CurrentDirectoryResults by the predicate
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="predicate"></param>
|
||||||
|
public void FilterContacts(Func<DirectoryItem, bool> predicate)
|
||||||
|
{
|
||||||
|
CurrentDirectoryResults = CurrentDirectoryResults.Where(predicate).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically
|
/// Sorts the DirectoryResults list to display all folders alphabetically, then all contacts alphabetically
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -135,7 +160,19 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IInvitableContact
|
public interface IInvitableContact
|
||||||
{
|
{
|
||||||
|
bool IsInvitableContact { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InvitableDirectoryContact : DirectoryContact, IInvitableContact
|
||||||
|
{
|
||||||
|
[JsonProperty("isInvitableContact")]
|
||||||
|
public bool IsInvitableContact
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this is IInvitableContact;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -184,8 +221,6 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
[JsonProperty("title")]
|
[JsonProperty("title")]
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty("contactMethods")]
|
[JsonProperty("contactMethods")]
|
||||||
public List<ContactMethod> ContactMethods { get; set; }
|
public List<ContactMethod> ContactMethods { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -4,15 +4,20 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.Codec
|
namespace PepperDash.Essentials.Devices.Common.Codec
|
||||||
{
|
{
|
||||||
|
[Flags]
|
||||||
public enum eMeetingEventChangeType
|
public enum eMeetingEventChangeType
|
||||||
{
|
{
|
||||||
Unkown = 0,
|
Unknown = 0,
|
||||||
MeetingStartWarning,
|
MeetingStartWarning = 1,
|
||||||
MeetingStart,
|
MeetingStart = 2,
|
||||||
MeetingEndWarning,
|
MeetingEndWarning = 4,
|
||||||
MeetingEnd
|
MeetingEnd = 8
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IHasScheduleAwareness
|
public interface IHasScheduleAwareness
|
||||||
@@ -32,6 +37,10 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
|
|
||||||
private int _meetingWarningMinutes = 5;
|
private int _meetingWarningMinutes = 5;
|
||||||
|
|
||||||
|
private Meeting _previousChangedMeeting;
|
||||||
|
|
||||||
|
private eMeetingEventChangeType _previousChangeType = eMeetingEventChangeType.Unknown;
|
||||||
|
|
||||||
public int MeetingWarningMinutes
|
public int MeetingWarningMinutes
|
||||||
{
|
{
|
||||||
get { return _meetingWarningMinutes; }
|
get { return _meetingWarningMinutes; }
|
||||||
@@ -75,38 +84,72 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
_scheduleChecker = new CTimer(CheckSchedule, null, pollTime, pollTime);
|
_scheduleChecker = new CTimer(CheckSchedule, null, pollTime, pollTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper method to fire MeetingEventChange. Should only fire once for each changeType on each meeting
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="changeType"></param>
|
||||||
|
/// <param name="meeting"></param>
|
||||||
private void OnMeetingChange(eMeetingEventChangeType changeType, Meeting meeting)
|
private void OnMeetingChange(eMeetingEventChangeType changeType, Meeting meeting)
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, "*****************OnMeetingChange. id: {0} changeType: {1}**********************", meeting.Id, changeType);
|
||||||
|
if (changeType != (changeType & meeting.NotifiedChangeTypes))
|
||||||
|
{
|
||||||
|
// Add this change type to the NotifiedChangeTypes
|
||||||
|
meeting.NotifiedChangeTypes |= changeType;
|
||||||
|
|
||||||
var handler = MeetingEventChange;
|
var handler = MeetingEventChange;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
{
|
{
|
||||||
handler(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting });
|
handler(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
private void CheckSchedule(object o)
|
|
||||||
{
|
{
|
||||||
// Iterate the meeting list and check if any meeting need to do anythingk
|
Debug.Console(2, "Meeting: {0} already notified of changeType: {1}", meeting.Id, changeType);
|
||||||
|
}
|
||||||
const double meetingTimeEpsilon = 0.0001;
|
|
||||||
foreach (var m in Meetings)
|
|
||||||
{
|
|
||||||
var changeType = eMeetingEventChangeType.Unkown;
|
|
||||||
|
|
||||||
if (m.TimeToMeetingStart.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to start
|
|
||||||
changeType = eMeetingEventChangeType.MeetingStartWarning;
|
|
||||||
else if (Math.Abs(m.TimeToMeetingStart.TotalMinutes) < meetingTimeEpsilon) // Meeting Start
|
|
||||||
changeType = eMeetingEventChangeType.MeetingStart;
|
|
||||||
else if (m.TimeToMeetingEnd.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to end
|
|
||||||
changeType = eMeetingEventChangeType.MeetingEndWarning;
|
|
||||||
else if (Math.Abs(m.TimeToMeetingEnd.TotalMinutes) < meetingTimeEpsilon) // Meeting has ended
|
|
||||||
changeType = eMeetingEventChangeType.MeetingEnd;
|
|
||||||
|
|
||||||
if (changeType != eMeetingEventChangeType.Unkown)
|
|
||||||
OnMeetingChange(changeType, m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks the schedule to see if any MeetingEventChange updates should be fired
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="o"></param>
|
||||||
|
private void CheckSchedule(object o)
|
||||||
|
{
|
||||||
|
// Iterate the meeting list and check if any meeting need to do anything
|
||||||
|
|
||||||
|
const double meetingTimeEpsilon = 0.05;
|
||||||
|
foreach (var m in Meetings)
|
||||||
|
{
|
||||||
|
var changeType = eMeetingEventChangeType.Unknown;
|
||||||
|
|
||||||
|
if (eMeetingEventChangeType.MeetingStartWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStartWarning) && m.TimeToMeetingStart.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingStart.Seconds > 0) // Meeting is about to start
|
||||||
|
{
|
||||||
|
Debug.Console(2, "********************* MeetingStartWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingStart.TotalMinutes, m.TimeToMeetingStart.Seconds);
|
||||||
|
changeType = eMeetingEventChangeType.MeetingStartWarning;
|
||||||
|
}
|
||||||
|
else if (eMeetingEventChangeType.MeetingStart != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStart) && Math.Abs(m.TimeToMeetingStart.TotalMinutes) < meetingTimeEpsilon) // Meeting Start
|
||||||
|
{
|
||||||
|
Debug.Console(2, "********************* MeetingStart");
|
||||||
|
changeType = eMeetingEventChangeType.MeetingStart;
|
||||||
|
}
|
||||||
|
else if (eMeetingEventChangeType.MeetingEndWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEndWarning) && m.TimeToMeetingEnd.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingEnd.Seconds > 0) // Meeting is about to end
|
||||||
|
{
|
||||||
|
Debug.Console(2, "********************* MeetingEndWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingEnd.TotalMinutes, m.TimeToMeetingEnd.Seconds);
|
||||||
|
changeType = eMeetingEventChangeType.MeetingEndWarning;
|
||||||
|
}
|
||||||
|
else if (eMeetingEventChangeType.MeetingEnd != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEnd) && Math.Abs(m.TimeToMeetingEnd.TotalMinutes) < meetingTimeEpsilon) // Meeting has ended
|
||||||
|
{
|
||||||
|
Debug.Console(2, "********************* MeetingEnd");
|
||||||
|
changeType = eMeetingEventChangeType.MeetingEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changeType != eMeetingEventChangeType.Unknown)
|
||||||
|
{
|
||||||
|
OnMeetingChange(changeType, m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,17 +158,24 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Meeting
|
public class Meeting
|
||||||
{
|
{
|
||||||
|
[JsonProperty("minutesBeforeMeeting")]
|
||||||
public int MinutesBeforeMeeting;
|
public int MinutesBeforeMeeting;
|
||||||
|
|
||||||
|
[JsonProperty("id")]
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
[JsonProperty("organizer")]
|
||||||
public string Organizer { get; set; }
|
public string Organizer { get; set; }
|
||||||
|
[JsonProperty("title")]
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
[JsonProperty("agenda")]
|
||||||
public string Agenda { get; set; }
|
public string Agenda { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("meetingWarningMinutes")]
|
||||||
public TimeSpan MeetingWarningMinutes
|
public TimeSpan MeetingWarningMinutes
|
||||||
{
|
{
|
||||||
get { return TimeSpan.FromMinutes(MinutesBeforeMeeting); }
|
get { return TimeSpan.FromMinutes(MinutesBeforeMeeting); }
|
||||||
}
|
}
|
||||||
|
[JsonProperty("timeToMeetingStart")]
|
||||||
public TimeSpan TimeToMeetingStart
|
public TimeSpan TimeToMeetingStart
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -133,6 +183,7 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
return StartTime - DateTime.Now;
|
return StartTime - DateTime.Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonProperty("timeToMeetingEnd")]
|
||||||
public TimeSpan TimeToMeetingEnd
|
public TimeSpan TimeToMeetingEnd
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -140,8 +191,11 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
return EndTime - DateTime.Now;
|
return EndTime - DateTime.Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonProperty("startTime")]
|
||||||
public DateTime StartTime { get; set; }
|
public DateTime StartTime { get; set; }
|
||||||
|
[JsonProperty("endTime")]
|
||||||
public DateTime EndTime { get; set; }
|
public DateTime EndTime { get; set; }
|
||||||
|
[JsonProperty("duration")]
|
||||||
public TimeSpan Duration
|
public TimeSpan Duration
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -149,21 +203,34 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
|||||||
return EndTime - StartTime;
|
return EndTime - StartTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[JsonProperty("privacy")]
|
||||||
public eMeetingPrivacy Privacy { get; set; }
|
public eMeetingPrivacy Privacy { get; set; }
|
||||||
|
[JsonProperty("joinable")]
|
||||||
public bool Joinable
|
public bool Joinable
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
||||||
&& DateTime.Now <= EndTime; //.AddMinutes(-5);
|
&& DateTime.Now <= EndTime.AddMinutes(-5);
|
||||||
|
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
|
||||||
|
return joinable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//public string ConferenceNumberToDial { get; set; }
|
//public string ConferenceNumberToDial { get; set; }
|
||||||
|
[JsonProperty("conferencePassword")]
|
||||||
public string ConferencePassword { get; set; }
|
public string ConferencePassword { get; set; }
|
||||||
|
[JsonProperty("isOneButtonToPushMeeting")]
|
||||||
public bool IsOneButtonToPushMeeting { get; set; }
|
public bool IsOneButtonToPushMeeting { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("calls")]
|
||||||
public List<Call> Calls { get; private set; }
|
public List<Call> Calls { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tracks the change types that have already been notified for
|
||||||
|
/// </summary>
|
||||||
|
[JsonIgnore]
|
||||||
|
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
||||||
|
|
||||||
public Meeting()
|
public Meeting()
|
||||||
{
|
{
|
||||||
Calls = new List<Call>();
|
Calls = new List<Call>();
|
||||||
|
|||||||
@@ -120,9 +120,11 @@
|
|||||||
<Compile Include="VideoCodec\CiscoCodec\RoomPresets.cs" />
|
<Compile Include="VideoCodec\CiscoCodec\RoomPresets.cs" />
|
||||||
<Compile Include="Cameras\CameraControl.cs" />
|
<Compile Include="Cameras\CameraControl.cs" />
|
||||||
<Compile Include="Display\PanasonicThDisplay.cs" />
|
<Compile Include="Display\PanasonicThDisplay.cs" />
|
||||||
|
<Compile Include="VideoCodec\Interfaces\IHasMeetingInfo.cs" />
|
||||||
<Compile Include="VideoCodec\Interfaces\IHasParticipants.cs" />
|
<Compile Include="VideoCodec\Interfaces\IHasParticipants.cs" />
|
||||||
<Compile Include="VideoCodec\Interfaces\IHasSelfviewPosition.cs" />
|
<Compile Include="VideoCodec\Interfaces\IHasSelfviewPosition.cs" />
|
||||||
<Compile Include="VideoCodec\Interfaces\IHasSelfviewSize.cs" />
|
<Compile Include="VideoCodec\Interfaces\IHasSelfviewSize.cs" />
|
||||||
|
<Compile Include="VideoCodec\Interfaces\IHasStartMeeting.cs" />
|
||||||
<Compile Include="VideoCodec\Interfaces\iVideoCodecInfo.cs" />
|
<Compile Include="VideoCodec\Interfaces\iVideoCodecInfo.cs" />
|
||||||
<Compile Include="Codec\iHasCallFavorites.cs" />
|
<Compile Include="Codec\iHasCallFavorites.cs" />
|
||||||
<Compile Include="Codec\iHasCallHistory.cs" />
|
<Compile Include="Codec\iHasCallHistory.cs" />
|
||||||
|
|||||||
@@ -314,7 +314,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
FarEndIsSharingContentFeedback = new BoolFeedback(FarEndIsSharingContentFeedbackFunc);
|
FarEndIsSharingContentFeedback = new BoolFeedback(FarEndIsSharingContentFeedbackFunc);
|
||||||
CameraIsOffFeedback = new BoolFeedback(() => CodecStatus.Status.Video.Input.MainVideoMute.BoolValue);
|
CameraIsOffFeedback = new BoolFeedback(() => CodecStatus.Status.Video.Input.MainVideoMute.BoolValue);
|
||||||
CameraIsMutedFeedback = CameraIsOffFeedback;
|
CameraIsMutedFeedback = CameraIsOffFeedback;
|
||||||
|
SupportsCameraOff = true;
|
||||||
|
|
||||||
PresentationViewMaximizedFeedback = new BoolFeedback(() => CurrentPresentationView == "Maximized");
|
PresentationViewMaximizedFeedback = new BoolFeedback(() => CurrentPresentationView == "Maximized");
|
||||||
|
|
||||||
@@ -417,6 +417,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
CodecStatus.Status.RoomAnalytics.PeoplePresence.ValueChangedAction = RoomIsOccupiedFeedback.FireUpdate;
|
CodecStatus.Status.RoomAnalytics.PeoplePresence.ValueChangedAction = RoomIsOccupiedFeedback.FireUpdate;
|
||||||
CodecStatus.Status.RoomAnalytics.PeopleCount.Current.ValueChangedAction = PeopleCountFeedback.FireUpdate;
|
CodecStatus.Status.RoomAnalytics.PeopleCount.Current.ValueChangedAction = PeopleCountFeedback.FireUpdate;
|
||||||
CodecStatus.Status.Cameras.SpeakerTrack.Status.ValueChangedAction = CameraAutoModeIsOnFeedback.FireUpdate;
|
CodecStatus.Status.Cameras.SpeakerTrack.Status.ValueChangedAction = CameraAutoModeIsOnFeedback.FireUpdate;
|
||||||
|
CodecStatus.Status.Cameras.SpeakerTrack.Availability.ValueChangedAction = () => { SupportsCameraAutoMode = CodecStatus.Status.Cameras.SpeakerTrack.Availability.BoolValue; };
|
||||||
CodecStatus.Status.Video.Selfview.Mode.ValueChangedAction = SelfviewIsOnFeedback.FireUpdate;
|
CodecStatus.Status.Video.Selfview.Mode.ValueChangedAction = SelfviewIsOnFeedback.FireUpdate;
|
||||||
CodecStatus.Status.Video.Selfview.PIPPosition.ValueChangedAction = ComputeSelfviewPipStatus;
|
CodecStatus.Status.Video.Selfview.PIPPosition.ValueChangedAction = ComputeSelfviewPipStatus;
|
||||||
CodecStatus.Status.Video.Layout.LayoutFamily.Local.ValueChangedAction = ComputeLocalLayout;
|
CodecStatus.Status.Video.Layout.LayoutFamily.Local.ValueChangedAction = ComputeLocalLayout;
|
||||||
@@ -735,6 +736,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Appends the delimiter and send the command to the codec
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="command"></param>
|
||||||
public void SendText(string command)
|
public void SendText(string command)
|
||||||
{
|
{
|
||||||
if (CommDebuggingIsOn)
|
if (CommDebuggingIsOn)
|
||||||
|
|||||||
@@ -277,9 +277,25 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
public SoftwareID SoftwareID { get; set; }
|
public SoftwareID SoftwareID { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Availability
|
public class Availability : ValueProperty
|
||||||
{
|
{
|
||||||
public string Value { get; set; }
|
string _Value;
|
||||||
|
public bool BoolValue { get; private set; }
|
||||||
|
|
||||||
|
public string Value
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _Value;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
// If the incoming value is "Available" it sets the BoolValue true, otherwise sets it false
|
||||||
|
_Value = value;
|
||||||
|
BoolValue = value == "Available";
|
||||||
|
OnValueChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Status2 : ValueProperty
|
public class Status2 : ValueProperty
|
||||||
@@ -311,6 +327,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
|
|||||||
public SpeakerTrack()
|
public SpeakerTrack()
|
||||||
{
|
{
|
||||||
Status = new Status2();
|
Status = new Status2();
|
||||||
|
Availability = new Availability();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes a device that provides meeting information (like a ZoomRoom)
|
||||||
|
/// </summary>
|
||||||
|
public interface IHasMeetingInfo
|
||||||
|
{
|
||||||
|
event EventHandler<MeetingInfoEventArgs> MeetingInfoChanged;
|
||||||
|
|
||||||
|
MeetingInfo MeetingInfo { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the information about a meeting in progress
|
||||||
|
/// Currently used for Zoom meetings
|
||||||
|
/// </summary>
|
||||||
|
public class MeetingInfo
|
||||||
|
{
|
||||||
|
[JsonProperty("id")]
|
||||||
|
public string Id { get; private set; }
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name { get; private set; }
|
||||||
|
[JsonProperty("host")]
|
||||||
|
public string Host { get; private set; }
|
||||||
|
[JsonProperty("password")]
|
||||||
|
public string Password { get; private set; }
|
||||||
|
[JsonProperty("shareStatus")]
|
||||||
|
public string ShareStatus { get; private set; }
|
||||||
|
[JsonProperty("isHost")]
|
||||||
|
public Boolean IsHost { get; private set; }
|
||||||
|
|
||||||
|
public MeetingInfo(string id, string name, string host, string password, string shareStatus, bool isHost)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
Name = name;
|
||||||
|
Host = host;
|
||||||
|
Password = password;
|
||||||
|
ShareStatus = shareStatus;
|
||||||
|
IsHost = IsHost;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MeetingInfoEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public MeetingInfo Info { get; private set; }
|
||||||
|
|
||||||
|
public MeetingInfoEventArgs(MeetingInfo info)
|
||||||
|
{
|
||||||
|
Info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||||
@@ -15,7 +17,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Describes the ability to mute and unmute a participant's video in a meeting
|
/// Describes the ability to mute and unmute a participant's video in a meeting
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IHasParticipantVideoMute:IHasParticipants
|
public interface IHasParticipantVideoMute : IHasParticipants
|
||||||
{
|
{
|
||||||
void MuteVideoForParticipant(int userId);
|
void MuteVideoForParticipant(int userId);
|
||||||
void UnmuteVideoForParticipant(int userId);
|
void UnmuteVideoForParticipant(int userId);
|
||||||
@@ -49,7 +51,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
{
|
{
|
||||||
private List<Participant> _currentParticipants;
|
private List<Participant> _currentParticipants;
|
||||||
|
|
||||||
public List<Participant> CurrentParticipants {
|
public List<Participant> CurrentParticipants
|
||||||
|
{
|
||||||
get { return _currentParticipants; }
|
get { return _currentParticipants; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
@@ -58,6 +61,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Participant Host
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _currentParticipants.FirstOrDefault(p => p.IsHost);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public event EventHandler<EventArgs> ParticipantsListHasChanged;
|
public event EventHandler<EventArgs> ParticipantsListHasChanged;
|
||||||
|
|
||||||
public CodecParticipants()
|
public CodecParticipants()
|
||||||
@@ -82,6 +93,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
|||||||
{
|
{
|
||||||
public int UserId { get; set; }
|
public int UserId { get; set; }
|
||||||
public bool IsHost { get; set; }
|
public bool IsHost { get; set; }
|
||||||
|
public bool IsMyself { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public bool CanMuteVideo { get; set; }
|
public bool CanMuteVideo { get; set; }
|
||||||
public bool CanUnmuteVideo { get; set; }
|
public bool CanUnmuteVideo { get; set; }
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes the ability to start an ad-hoc meeting
|
||||||
|
/// </summary>
|
||||||
|
public interface IHasStartMeeting
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The default meeting duration in minutes
|
||||||
|
/// </summary>
|
||||||
|
uint DefaultMeetingDurationMin { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Start an ad-hoc meeting for the specified duration
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="duration"></param>
|
||||||
|
void StartMeeting(uint duration);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Leaves a meeting without ending it
|
||||||
|
/// </summary>
|
||||||
|
void LeaveMeeting();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,10 +11,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// For rooms that have video codec
|
/// For rooms that have video codec
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IHasVideoCodec
|
public interface IHasVideoCodec:IHasInCallFeedback,IPrivacy
|
||||||
{
|
{
|
||||||
VideoCodecBase VideoCodec { get; }
|
VideoCodecBase VideoCodec { get; }
|
||||||
BoolFeedback InCallFeedback { get; }
|
|
||||||
|
|
||||||
///// <summary>
|
///// <summary>
|
||||||
///// Make this more specific
|
///// Make this more specific
|
||||||
@@ -26,11 +25,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
IntFeedback CallTypeFeedback { get; }
|
IntFeedback CallTypeFeedback { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
BoolFeedback PrivacyModeIsOnFeedback { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// When something in the room is sharing with the far end or through other means
|
/// When something in the room is sharing with the far end or through other means
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
SetupCameras();
|
SetupCameras();
|
||||||
|
|
||||||
|
CreateOsdSource();
|
||||||
|
|
||||||
SetIsReady();
|
SetIsReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +119,19 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
}
|
}
|
||||||
bool _StandbyIsOn;
|
bool _StandbyIsOn;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates the fake OSD source, and connects it's AudioVideo output to the CodecOsdIn input
|
||||||
|
/// to enable routing
|
||||||
|
/// </summary>
|
||||||
|
private void CreateOsdSource()
|
||||||
|
{
|
||||||
|
OsdSource = new DummyRoutingInputsDevice(Key + "[osd]");
|
||||||
|
DeviceManager.AddDevice(OsdSource);
|
||||||
|
var tl = new TieLine(OsdSource.AudioVideoOutputPort, CodecOsdIn);
|
||||||
|
TieLineCollection.Default.Add(tl);
|
||||||
|
|
||||||
|
//foreach(var input in Status.Video.
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Dials, yo!
|
/// Dials, yo!
|
||||||
@@ -139,7 +154,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
public override void Dial(Meeting meeting)
|
public override void Dial(Meeting meeting)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
Debug.Console(1, this, "Dial Meeting: {0}", meeting.Id);
|
||||||
|
var call = new CodecActiveCallItem() { Name = meeting.Title, Number = meeting.Id, Id = meeting.Id, Status = eCodecCallStatus.Dialing, Direction = eCodecCallDirection.Outgoing, Type = eCodecCallType.Video };
|
||||||
|
ActiveCalls.Add(call);
|
||||||
|
OnCallStatusChange(call);
|
||||||
|
|
||||||
|
//ActiveCallCountFeedback.FireUpdate();
|
||||||
|
// Simulate 2-second ring, then connecting, then connected
|
||||||
|
new CTimer(o =>
|
||||||
|
{
|
||||||
|
call.Type = eCodecCallType.Video;
|
||||||
|
SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connecting, call);
|
||||||
|
new CTimer(oo => SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connected, call), 1000);
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -396,12 +424,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
if (_CodecSchedule == null || _CodecSchedule.Meetings.Count == 0
|
if (_CodecSchedule == null || _CodecSchedule.Meetings.Count == 0
|
||||||
|| _CodecSchedule.Meetings[_CodecSchedule.Meetings.Count - 1].StartTime < DateTime.Now)
|
|| _CodecSchedule.Meetings[_CodecSchedule.Meetings.Count - 1].StartTime < DateTime.Now)
|
||||||
{
|
{
|
||||||
_CodecSchedule = new CodecScheduleAwareness();
|
_CodecSchedule = new CodecScheduleAwareness(1000);
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
{
|
{
|
||||||
var m = new Meeting();
|
var m = new Meeting();
|
||||||
m.StartTime = DateTime.Now.AddMinutes(3).AddHours(i);
|
m.MinutesBeforeMeeting = 5;
|
||||||
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(30);
|
m.Id = i.ToString();
|
||||||
|
m.Organizer = "Employee " + 1;
|
||||||
|
m.StartTime = DateTime.Now.AddMinutes(6).AddHours(i);
|
||||||
|
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(16);
|
||||||
m.Title = "Meeting " + i;
|
m.Title = "Meeting " + i;
|
||||||
m.Calls.Add(new Call() { Number = i + "meeting@fake.com"});
|
m.Calls.Add(new Call() { Number = i + "meeting@fake.com"});
|
||||||
_CodecSchedule.Meetings.Add(m);
|
_CodecSchedule.Meetings.Add(m);
|
||||||
@@ -551,6 +582,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
void SetupCameras()
|
void SetupCameras()
|
||||||
{
|
{
|
||||||
|
SupportsCameraAutoMode = true;
|
||||||
|
|
||||||
|
SupportsCameraOff = false;
|
||||||
|
|
||||||
Cameras = new List<CameraBase>();
|
Cameras = new List<CameraBase>();
|
||||||
|
|
||||||
var internalCamera = new MockVCCamera(Key + "-camera1", "Near End", this);
|
var internalCamera = new MockVCCamera(Key + "-camera1", "Near End", this);
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
|||||||
|
|
||||||
public bool ShowSelfViewByDefault { get; protected set; }
|
public bool ShowSelfViewByDefault { get; protected set; }
|
||||||
|
|
||||||
protected bool SupportsCameraOff;
|
public bool SupportsCameraOff { get; protected set; }
|
||||||
protected bool SupportsCameraAutoMode;
|
public bool SupportsCameraAutoMode { get; protected set; }
|
||||||
|
|
||||||
public bool IsReady { get; protected set; }
|
public bool IsReady { get; protected set; }
|
||||||
|
|
||||||
@@ -836,10 +836,10 @@ ScreenIndexIsPinnedTo: {8} (a{17})
|
|||||||
//serials
|
//serials
|
||||||
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
tokenArray[stringIndex] = new XSigSerialToken(stringIndex + 1, meeting.Organizer);
|
||||||
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
tokenArray[stringIndex + 1] = new XSigSerialToken(stringIndex + 2, meeting.Title);
|
||||||
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToShortDateString());
|
tokenArray[stringIndex + 2] = new XSigSerialToken(stringIndex + 3, meeting.StartTime.ToString("t", Global.Culture));
|
||||||
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToShortTimeString());
|
tokenArray[stringIndex + 3] = new XSigSerialToken(stringIndex + 4, meeting.StartTime.ToString("t", Global.Culture));
|
||||||
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToShortDateString());
|
tokenArray[stringIndex + 4] = new XSigSerialToken(stringIndex + 5, meeting.EndTime.ToString("t", Global.Culture));
|
||||||
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToShortTimeString());
|
tokenArray[stringIndex + 5] = new XSigSerialToken(stringIndex + 6, meeting.EndTime.ToString("t", Global.Culture));
|
||||||
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
tokenArray[stringIndex + 6] = new XSigSerialToken(stringIndex + 7, meeting.Id);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -236,14 +236,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Used to be able to inplement IInvitableContact on DirectoryContact
|
|
||||||
/// </summary>
|
|
||||||
public class ZoomDirectoryContact : DirectoryContact, IInvitableContact
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Phonebook
|
public class Phonebook
|
||||||
{
|
{
|
||||||
[JsonProperty("Contacts")]
|
[JsonProperty("Contacts")]
|
||||||
@@ -276,6 +268,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
if (zoomRooms.Count > 0)
|
if (zoomRooms.Count > 0)
|
||||||
{
|
{
|
||||||
// If so, setup a rooms and contacts folder and add them.
|
// If so, setup a rooms and contacts folder and add them.
|
||||||
|
|
||||||
|
directory.ResultsFolderId = "root";
|
||||||
|
|
||||||
roomFolder.Name = "Rooms";
|
roomFolder.Name = "Rooms";
|
||||||
roomFolder.ParentFolderId = "root";
|
roomFolder.ParentFolderId = "root";
|
||||||
roomFolder.FolderId = "rooms";
|
roomFolder.FolderId = "rooms";
|
||||||
@@ -292,11 +287,16 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (zoomContacts.Count == 0) return directory;
|
if (zoomContacts.Count == 0)
|
||||||
{
|
{
|
||||||
|
return directory;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (Contact c in zoomContacts)
|
foreach (Contact c in zoomContacts)
|
||||||
{
|
{
|
||||||
var contact = new ZoomDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
|
var contact = new InvitableDirectoryContact { Name = c.ScreenName, ContactId = c.Jid };
|
||||||
|
|
||||||
|
contact.ContactMethods.Add(new ContactMethod() { Number = c.Jid, Device = eContactMethodDevice.Video, CallType = eContactMethodCallType.Video, ContactMethodId = c.Jid });
|
||||||
|
|
||||||
if (folders.Count > 0)
|
if (folders.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -308,7 +308,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
|
|
||||||
directory.AddContactsToDirectory(contacts);
|
directory.AddContactsToDirectory(contacts);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Error converting Zoom Phonebook results to generic: {0}", e);
|
Debug.Console(1, "Error converting Zoom Phonebook results to generic: {0}", e);
|
||||||
@@ -432,6 +431,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
{
|
{
|
||||||
private string _dispState;
|
private string _dispState;
|
||||||
private string _password;
|
private string _password;
|
||||||
|
private bool _isAirHostClientConnected;
|
||||||
|
private bool _isSharingBlackMagic;
|
||||||
|
private bool _isDirectPresentationConnected;
|
||||||
|
|
||||||
|
|
||||||
public string directPresentationPairingCode { get; set; }
|
public string directPresentationPairingCode { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -453,11 +456,51 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool isAirHostClientConnected { get; set; }
|
|
||||||
|
public bool isAirHostClientConnected
|
||||||
|
{
|
||||||
|
get { return _isAirHostClientConnected; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _isAirHostClientConnected)
|
||||||
|
{
|
||||||
|
_isAirHostClientConnected = value;
|
||||||
|
NotifyPropertyChanged("isAirHostClientConnected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool isBlackMagicConnected { get; set; }
|
public bool isBlackMagicConnected { get; set; }
|
||||||
public bool isBlackMagicDataAvailable { get; set; }
|
public bool isBlackMagicDataAvailable { get; set; }
|
||||||
public bool isDirectPresentationConnected { get; set; }
|
|
||||||
public bool isSharingBlackMagic { get; set; }
|
public bool isDirectPresentationConnected
|
||||||
|
{
|
||||||
|
get { return _isDirectPresentationConnected; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _isDirectPresentationConnected)
|
||||||
|
{
|
||||||
|
_isDirectPresentationConnected = value;
|
||||||
|
NotifyPropertyChanged("isDirectPresentationConnected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool isSharingBlackMagic
|
||||||
|
{
|
||||||
|
get { return _isSharingBlackMagic; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != _isSharingBlackMagic)
|
||||||
|
{
|
||||||
|
_isSharingBlackMagic = value;
|
||||||
|
NotifyPropertyChanged("isSharingBlackMagic");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IOS Airplay code
|
/// IOS Airplay code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -780,7 +823,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
private bool _paused;
|
private bool _paused;
|
||||||
private eSharingState _state;
|
private eSharingState _state;
|
||||||
|
|
||||||
public bool IsSharing;
|
public bool IsSharing { get; private set; }
|
||||||
|
|
||||||
[JsonProperty("paused")]
|
[JsonProperty("paused")]
|
||||||
public bool Paused
|
public bool Paused
|
||||||
@@ -920,6 +963,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
PhoneCallStatus_InCall,
|
PhoneCallStatus_InCall,
|
||||||
PhoneCallStatus_Init,
|
PhoneCallStatus_Init,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class MeetingNeedsPassword
|
||||||
|
{
|
||||||
|
[JsonProperty("needsPassword")]
|
||||||
|
public bool NeedsPassword { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("wrongAndRetry")]
|
||||||
|
public bool WrongAndRetry { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1161,11 +1213,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value != _hideConfSelfVideo)
|
//if (value != _hideConfSelfVideo)
|
||||||
{
|
//{
|
||||||
_hideConfSelfVideo = value;
|
_hideConfSelfVideo = value;
|
||||||
NotifyPropertyChanged("HideConfSelfVideo");
|
NotifyPropertyChanged("HideConfSelfVideo");
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1371,11 +1423,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
public bool CanEditClosedCaption { get; set; }
|
public bool CanEditClosedCaption { get; set; }
|
||||||
[JsonProperty("can_record")]
|
[JsonProperty("can_record")]
|
||||||
public bool CanRecord { get; set; }
|
public bool CanRecord { get; set; }
|
||||||
// TODO [ ] 2021-07-20, jkd: Evaluate if event can be used to re-poll participant list
|
|
||||||
// - when in waiting room: "event": "ZRCUserChangedEventJoinedMeeting",
|
|
||||||
// - when admitted to call: "event": "ZRCUserChangedEventUserInfoUpdated",
|
|
||||||
// ISSUE [ ] when a zoom rooms device connects to a call with a waiting room, once admitted the zoom rooms device will be present 2x's in the participant list
|
|
||||||
// - each instance of the zoom rooms device will have a unique user id
|
|
||||||
[JsonProperty("event")]
|
[JsonProperty("event")]
|
||||||
public string Event { get; set; }
|
public string Event { get; set; }
|
||||||
[JsonProperty("hand_status")]
|
[JsonProperty("hand_status")]
|
||||||
@@ -1442,6 +1489,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
UserId = p.UserId,
|
UserId = p.UserId,
|
||||||
Name = p.UserName,
|
Name = p.UserName,
|
||||||
IsHost = p.IsHost,
|
IsHost = p.IsHost,
|
||||||
|
IsMyself = p.IsMyself,
|
||||||
CanMuteVideo = p.IsVideoCanMuteByHost,
|
CanMuteVideo = p.IsVideoCanMuteByHost,
|
||||||
CanUnmuteVideo = p.IsVideoCanUnmuteByHost,
|
CanUnmuteVideo = p.IsVideoCanUnmuteByHost,
|
||||||
AudioMuteFb = p.AudioStatusState == "AUDIO_MUTED",
|
AudioMuteFb = p.AudioStatusState == "AUDIO_MUTED",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -63,6 +63,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
|||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
ParentCodec = codec;
|
ParentCodec = codec;
|
||||||
|
|
||||||
|
Capabilities = eCameraCapabilities.Pan | eCameraCapabilities.Tilt | eCameraCapabilities.Zoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user