mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-13 04:24:54 +00:00
Compare commits
34 Commits
1.13.3-alp
...
feature/Ge
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbba6e089a | ||
|
|
cef78c881e | ||
|
|
e1ce35863f | ||
|
|
acd3bad1f2 | ||
|
|
08514915b2 | ||
|
|
ea464038b9 | ||
|
|
c4c44d02f5 | ||
|
|
3fe5d89904 | ||
|
|
c0d78e8978 | ||
|
|
3716dd0824 | ||
|
|
ebe8ee5653 | ||
|
|
432934ad00 | ||
|
|
372cf86613 | ||
|
|
67c99a9ad4 | ||
|
|
31085d42a9 | ||
|
|
0df315426b | ||
|
|
6ddbdd90c7 | ||
|
|
39e1e5167b | ||
|
|
7f916d1d2f | ||
|
|
7c7f087898 | ||
|
|
898dab1d9a | ||
|
|
b221d2f0cb | ||
|
|
9656269826 | ||
|
|
ba182c1d98 | ||
|
|
c53cad8119 | ||
|
|
82e8b4b203 | ||
|
|
8c3b891255 | ||
|
|
10fc8ee30b | ||
|
|
8da8b8c584 | ||
|
|
c7e0326b8c | ||
|
|
465aa947cf | ||
|
|
3b2fa8aec5 | ||
|
|
ffa864c71b | ||
|
|
112a2b7382 |
37
.github/workflows/add-issues-to-project.yml
vendored
37
.github/workflows/add-issues-to-project.yml
vendored
@@ -1,37 +0,0 @@
|
||||
name: Add bugs to bugs project
|
||||
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- opened
|
||||
- labeled
|
||||
|
||||
jobs:
|
||||
check-secret:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
my-key: ${{ steps.my-key.outputs.defined }}
|
||||
steps:
|
||||
- id: my-key
|
||||
if: "${{ env.MY_KEY != '' }}"
|
||||
run: echo "::set-output name=defined::true"
|
||||
env:
|
||||
MY_KEY: ${{ secrets.PROJECT_URL }}
|
||||
throw-error:
|
||||
name: Check
|
||||
runs-on: ubuntu-latest
|
||||
needs: [check-secret]
|
||||
if: needs.check-secret.outputs.my-key != 'true'
|
||||
steps:
|
||||
- run: echo "The Project URL Repo Secret is empty"
|
||||
add-to-project:
|
||||
name: Add issue to project
|
||||
runs-on: ubuntu-latest
|
||||
needs: [check-secret]
|
||||
if: needs.check-secret.outputs.my-key == 'true'
|
||||
steps:
|
||||
- uses: actions/add-to-project@main
|
||||
with:
|
||||
project-url: ${{ secrets.PROJECT_URL }}
|
||||
github-token: ${{ secrets.GH_PROJECTS_PASSWORD }}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using System.ComponentModel;
|
||||
using Crestron.SimplSharp.Net.Http;
|
||||
using Crestron.SimplSharp.Ssh;
|
||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Core.DebugThings;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
@@ -17,52 +16,130 @@ namespace PepperDash.Essentials.Core
|
||||
public GenericHttpClient(string key, string name, string hostname)
|
||||
: base(key, name)
|
||||
{
|
||||
Client = new HttpClient();
|
||||
Client.HostName = hostname;
|
||||
|
||||
|
||||
Client = new HttpClient {HostName = hostname};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
public GenericHttpClient(string key, string name, string hostname, GenericHttpClientConnectionOptions options)
|
||||
: base(key, name)
|
||||
{
|
||||
Client = new HttpClient
|
||||
{
|
||||
HostName = hostname,
|
||||
Accept = options.Accept,
|
||||
KeepAlive = options.KeepAlive,
|
||||
Password = options.Password,
|
||||
Timeout = options.Timeout,
|
||||
TimeoutEnabled = options.TimeoutEnabled,
|
||||
UserAgent = options.UserAgent,
|
||||
UserName = options.UserName,
|
||||
Version = options.Version
|
||||
};
|
||||
if (options.Port > 0) Client.Port = options.Port;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a HTTP Get Request to a client
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
public void SendText(string path)
|
||||
{
|
||||
HttpClientRequest request = new HttpClientRequest();
|
||||
string url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||
request.Url = new UrlParser(url);
|
||||
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
public void SendText(string format, params object[] items)
|
||||
{
|
||||
HttpClientRequest request = new HttpClientRequest();
|
||||
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
request.Url = new UrlParser(url);
|
||||
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
/// <param name="path">Path to request node</param>
|
||||
public void SendText(string path)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
public void SendTextNoResponse(string format, params object[] items)
|
||||
{
|
||||
HttpClientRequest request = new HttpClientRequest();
|
||||
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
request.Url = new UrlParser(url);
|
||||
Client.Dispatch(request);
|
||||
}
|
||||
/// <summary>
|
||||
/// Send a HTTP Get Request to a client using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendText(string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a unidirectional HTTP Get Request to a client using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendTextNoResponse(string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
Client.Dispatch(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an HTTP Request of a specific request type
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="path">Path to request node</param>
|
||||
public void SendText(RequestType requestType, string path)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url),
|
||||
RequestType = requestType
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an HTTP Request of a specific request type using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendText(RequestType requestType, string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url),
|
||||
RequestType = requestType
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a unidirectional HTTP Request of a specific request type using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendTextNoResponse(RequestType requestType, string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
Client.Dispatch(request);
|
||||
}
|
||||
|
||||
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
||||
{
|
||||
if (error == HTTP_CALLBACK_ERROR.COMPLETED)
|
||||
{
|
||||
var responseReceived = response;
|
||||
|
||||
if (responseReceived.ContentString.Length > 0)
|
||||
{
|
||||
if (ResponseRecived != null)
|
||||
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
|
||||
}
|
||||
}
|
||||
if (error != HTTP_CALLBACK_ERROR.COMPLETED) return;
|
||||
var responseReceived = response;
|
||||
|
||||
if (responseReceived.ContentString.Length <= 0) return;
|
||||
if (ResponseRecived == null) return;
|
||||
var httpClientRequest = request as HttpClientRequest;
|
||||
if (httpClientRequest != null)
|
||||
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, httpClientRequest.Url.ToString(), error));
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +177,8 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
public class GenericHttpClientEventArgs : EventArgs
|
||||
{
|
||||
public string ResponseText { get; private set; }
|
||||
@@ -112,4 +191,84 @@ namespace PepperDash.Essentials.Core
|
||||
Error = error;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Objedct to set parameters for HTTP Requests
|
||||
/// </summary>
|
||||
public class GenericHttpClientConnectionOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets content types that are acceptable for the response. The default
|
||||
/// value is "text/html, image/gif, image/jpeg, image/png, */*".
|
||||
/// </summary>
|
||||
[DefaultValue("text/html, image/gif, image/jpeg, image/png")]
|
||||
public string Accept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controls whether to use HTTP Keep-Alive to keep the connection alive between
|
||||
/// requests. If enabled (true) , once a request is made and a connection is
|
||||
/// established, this connection is kept open and used for future requests. If
|
||||
/// disabled, the connection is closed, and a new connection is created for future
|
||||
/// requests.
|
||||
/// </summary>
|
||||
[DefaultValue(true)]
|
||||
public bool KeepAlive { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This property controls whether the request operation will do an automatic
|
||||
/// timeout checking. If timeout handling is turned on (i.e. this property is
|
||||
/// set to true) and a request takes longer than Timeout, it will be terminated.
|
||||
/// </summary>
|
||||
[DefaultValue(true)]
|
||||
public bool TimeoutEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the maximum amount of time (in seconds) that a client will wait
|
||||
/// for a server response within a single request. The default value is 60 seconds
|
||||
/// (1 minute). The timeout handling can be activated via the TimeoutEnabled
|
||||
/// property.
|
||||
/// </summary>
|
||||
[DefaultValue(60)]
|
||||
public int Timeout { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the version identifier of the UserAgent. Can be used to mimic
|
||||
/// particular browsers like Internet Explorer 6.0
|
||||
/// </summary>
|
||||
[DefaultValue("1.1")]
|
||||
public string Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the identifier of the software being used to retrieve data via
|
||||
/// the URL. Some custom HTTP servers check this HTTP header to provide content
|
||||
/// optimized for particular HTTP browsers.
|
||||
/// </summary>
|
||||
[DefaultValue("Crestron SimplSharp HTTP Client")]
|
||||
public string UserAgent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name that will be inserted into the Authorization HTTP header in the request
|
||||
/// to the server.
|
||||
/// </summary>
|
||||
public string UserName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Password that will be inserted into the Authorization HTTP header in the
|
||||
/// request to the server.
|
||||
/// </summary>
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The server Port that you intend the client to connect to. If you do not
|
||||
/// assign a port number on this property, the port number in the parsed URL
|
||||
/// will be used. If a port number is assigned in the parsed URL, it will take
|
||||
/// precedence over this property.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If you do not assign a port number on this property, the port number in the
|
||||
/// parsed URL will be used.
|
||||
/// </remarks>
|
||||
///
|
||||
public int Port { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
@@ -8,6 +9,7 @@ namespace PepperDash_Essentials_Core.Devices
|
||||
/// <summary>
|
||||
/// Interface for any device that is able to control it'spower and has a configurable reboot time
|
||||
/// </summary>
|
||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
||||
{
|
||||
/// <summary>
|
||||
@@ -24,6 +26,7 @@ namespace PepperDash_Essentials_Core.Devices
|
||||
/// <summary>
|
||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
||||
/// </summary>
|
||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||
public interface IHasControlledPowerOutlets : IKeyName
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
using Crestron.SimplSharp;
|
||||
using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Interface for any device that has a battery that can be monitored
|
||||
/// </summary>
|
||||
public interface IHasBatteryStats : IKeyName
|
||||
{
|
||||
int BatteryPercentage { get; }
|
||||
int BatteryCautionThresholdPercentage { get; }
|
||||
int BatteryWarningThresholdPercentage { get; }
|
||||
BoolFeedback BatteryIsWarningFeedback { get; }
|
||||
BoolFeedback BatteryIsCautionFeedback { get; }
|
||||
BoolFeedback BatteryIsOkFeedback { get; }
|
||||
IntFeedback BatteryPercentageFeedback { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface for any device that has a battery that can be monitored and the ability to charge and discharge
|
||||
/// </summary>
|
||||
public interface IHasBatteryCharging : IHasBatteryStats
|
||||
{
|
||||
BoolFeedback BatteryIsCharging { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface for any device that has multiple batteries that can be monitored
|
||||
/// </summary>
|
||||
public interface IHasBatteries : IKeyName
|
||||
{
|
||||
ReadOnlyDictionary<string, IHasBatteryStats> Batteries { get; }
|
||||
}
|
||||
|
||||
public interface IHasBatteryStatsExtended : IHasBatteryStats
|
||||
{
|
||||
int InputVoltage { get; }
|
||||
int OutputVoltage { get; }
|
||||
int InptuCurrent { get; }
|
||||
int OutputCurrent { get; }
|
||||
|
||||
IntFeedback InputVoltageFeedback { get; }
|
||||
IntFeedback OutputVoltageFeedback { get; }
|
||||
IntFeedback InputCurrentFeedback { get; }
|
||||
IntFeedback OutputCurrentFeedback { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface for any device that is able to control its power, has a configurable reboot time, and has batteries that can be monitored
|
||||
/// </summary>
|
||||
public interface IHasPowerCycleWithBattery : IHasPowerCycle, IHasBatteryStats
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface for any device that is able to control it's power and has a configurable reboot time
|
||||
/// </summary>
|
||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
||||
{
|
||||
/// <summary>
|
||||
/// Delay between power off and power on for reboot
|
||||
/// </summary>
|
||||
int PowerCycleTimeMs { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Reboot outlet
|
||||
/// </summary>
|
||||
void PowerCycle();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
||||
/// </summary>
|
||||
public interface IHasControlledPowerOutlets : IKeyName
|
||||
{
|
||||
/// <summary>
|
||||
/// Collection of IPduOutlets
|
||||
/// </summary>
|
||||
ReadOnlyDictionary<int, IHasPowerCycle> PduOutlets { get; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -21,35 +21,37 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
/// <param name="fileName"></param>
|
||||
/// <returns></returns>
|
||||
public static FileInfo[] GetFiles(string fileName)
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static FileInfo[] GetFiles(string fileName)
|
||||
{
|
||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static FileInfo GetFile(string fileName)
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files.FirstOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static FileInfo GetFile(string fileName)
|
||||
{
|
||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files.FirstOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -81,7 +83,7 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
if (fileLock.TryEnter())
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(file.DirectoryName);
|
||||
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
|
||||
|
||||
if (File.Exists(file.FullName))
|
||||
@@ -202,7 +204,7 @@ namespace PepperDash.Essentials.Core
|
||||
public static void WriteDataToFile(string data, string filePath)
|
||||
{
|
||||
Thread _WriteFileThread;
|
||||
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
||||
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, Global.FilePathPrefix + "/" + filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
||||
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
|
||||
_WriteFileThread.Start();
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
||||
@@ -217,7 +219,8 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
if (fileLock.TryEnter())
|
||||
{
|
||||
using (StreamWriter sw = new StreamWriter(filePath))
|
||||
|
||||
using (StreamWriter sw = new StreamWriter(filePath))
|
||||
{
|
||||
sw.Write(data);
|
||||
sw.Flush();
|
||||
|
||||
@@ -200,6 +200,7 @@
|
||||
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
||||
<Compile Include="Crestron IO\Relay\ISwitchedOutput.cs" />
|
||||
<Compile Include="Crestron IO\StatusSign\StatusSignController.cs" />
|
||||
<Compile Include="Devices\PowerInterfaces.cs" />
|
||||
<Compile Include="Web\RequestHandlers\AppDebugRequestHandler.cs" />
|
||||
<Compile Include="Web\RequestHandlers\GetFeedbacksForDeviceRequestHandler.cs" />
|
||||
<Compile Include="Web\EssentialsWebApiHelpers.cs" />
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace PepperDash.Essentials.DM
|
||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
||||
///
|
||||
/// </summary>
|
||||
public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumericWithFeedback
|
||||
public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitchWithEndpointOnlineFeedback, IRoutingNumericWithFeedback
|
||||
{
|
||||
private const string NonePortKey = "inputCard0--None";
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.DM
|
||||
///
|
||||
/// </summary>
|
||||
[Description("Wrapper class for all DM-MD chassis variants from 8x8 to 32x32")]
|
||||
public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumericWithFeedback
|
||||
public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitchWithEndpointOnlineFeedback, IRoutingNumericWithFeedback
|
||||
{
|
||||
private const string NonePortKey = "inputCard0--None";
|
||||
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
|
||||
|
||||
@@ -436,9 +436,9 @@ namespace PepperDash.Essentials.DM
|
||||
}
|
||||
return rx;
|
||||
}
|
||||
else if (parentDev is DmChassisController)
|
||||
else if (parentDev is IDmSwitchWithEndpointOnlineFeedback)
|
||||
{
|
||||
var controller = parentDev as DmChassisController;
|
||||
var controller = parentDev as IDmSwitchWithEndpointOnlineFeedback;
|
||||
var chassis = controller.Chassis;
|
||||
var num = props.ParentOutputNumber;
|
||||
Debug.Console(1, "Creating DM Chassis device '{0}'. Output number '{1}'.", key, num);
|
||||
|
||||
@@ -121,7 +121,7 @@ namespace PepperDash.Essentials.DM
|
||||
|
||||
Tx.HdmiInputs[1].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.HdmiInputs[2].InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.DisplayPortInput.InputStreamChange += DisplayPortInputStreamChange;
|
||||
Tx.DisplayPortInput.InputStreamChange += InputStreamChangeEvent;
|
||||
Tx.BaseEvent += Tx_BaseEvent;
|
||||
Tx.OnlineStatusChange += Tx_OnlineStatusChange;
|
||||
|
||||
@@ -131,8 +131,7 @@ namespace PepperDash.Essentials.DM
|
||||
HdmiIn1HdcpCapabilityFeedback = new IntFeedback("HdmiIn1HdcpCapability", () => (int)tx.HdmiInputs[1].HdcpCapabilityFeedback);
|
||||
|
||||
HdmiIn2HdcpCapabilityFeedback = new IntFeedback("HdmiIn2HdcpCapability", () => (int)tx.HdmiInputs[2].HdcpCapabilityFeedback);
|
||||
|
||||
DisplayPortInHdcpCapabilityFeedback = new IntFeedback("DisplayPortHdcpCapability",
|
||||
DisplayPortInHdcpCapabilityFeedback = new IntFeedback("DisplayPortInHdcpCapability",
|
||||
() => (int)tx.DisplayPortInput.HdcpCapabilityFeedback);
|
||||
|
||||
|
||||
@@ -171,13 +170,19 @@ namespace PepperDash.Essentials.DM
|
||||
(ActualActiveVideoInput == eVst.Hdmi1
|
||||
&& tx.HdmiInputs[1].VideoAttributes.HdcpActiveFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue),
|
||||
&& tx.HdmiInputs[2].VideoAttributes.HdcpActiveFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.DisplayPort
|
||||
&& tx.DisplayPortInput.VideoAttributes.HdcpActiveFeedback.BoolValue),
|
||||
|
||||
HdcpStateFeedbackFunc = () =>
|
||||
{
|
||||
if (ActualActiveVideoInput == eVst.Hdmi1)
|
||||
return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
return ActualActiveVideoInput == eVst.Hdmi2 ? tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString() : "";
|
||||
return tx.HdmiInputs[1].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.HdcpStateFeedback.ToString();
|
||||
return ActualActiveVideoInput == eVst.DisplayPort
|
||||
? tx.DisplayPortInput.VideoAttributes.HdcpStateFeedback.ToString()
|
||||
: "";
|
||||
},
|
||||
|
||||
VideoResolutionFeedbackFunc = () =>
|
||||
@@ -186,6 +191,8 @@ namespace PepperDash.Essentials.DM
|
||||
return tx.HdmiInputs[1].VideoAttributes.GetVideoResolutionString();
|
||||
if (ActualActiveVideoInput == eVst.Hdmi2)
|
||||
return tx.HdmiInputs[2].VideoAttributes.GetVideoResolutionString();
|
||||
if (ActualActiveVideoInput == eVst.DisplayPort)
|
||||
return tx.DisplayPortInput.VideoAttributes.GetVideoResolutionString();
|
||||
return ActualActiveVideoInput == eVst.Vga ? tx.DisplayPortInput.VideoAttributes.GetVideoResolutionString() : "";
|
||||
},
|
||||
VideoSyncFeedbackFunc = () =>
|
||||
@@ -193,6 +200,8 @@ namespace PepperDash.Essentials.DM
|
||||
&& tx.HdmiInputs[1].SyncDetectedFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Hdmi2
|
||||
&& tx.HdmiInputs[2].SyncDetectedFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.DisplayPort
|
||||
&& tx.DisplayPortInput.SyncDetectedFeedback.BoolValue)
|
||||
|| (ActualActiveVideoInput == eVst.Vga
|
||||
&& tx.DisplayPortInput.SyncDetectedFeedback.BoolValue)
|
||||
|
||||
@@ -211,28 +220,15 @@ namespace PepperDash.Essentials.DM
|
||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiIn1HdcpCapabilityFeedback, HdmiIn2HdcpCapabilityFeedback,
|
||||
Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback, DisplayPortVideoSyncFeedback);
|
||||
Hdmi1VideoSyncFeedback, Hdmi2VideoSyncFeedback, DisplayPortVideoSyncFeedback, DisplayPortInHdcpCapabilityFeedback);
|
||||
|
||||
// Set Ports for CEC
|
||||
HdmiIn1.Port = Tx.HdmiInputs[1];
|
||||
HdmiIn2.Port = Tx.HdmiInputs[2];
|
||||
DisplayPortIn.Port = Tx.DisplayPortInput;
|
||||
HdmiLoopOut.Port = Tx.HdmiOutput;
|
||||
DmOut.Port = Tx.DmOutput;
|
||||
}
|
||||
|
||||
void DisplayPortInputStreamChange(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
||||
{
|
||||
Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
|
||||
|
||||
switch (args.EventId)
|
||||
{
|
||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
||||
DisplayPortVideoSyncFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
@@ -344,11 +340,17 @@ namespace PepperDash.Essentials.DM
|
||||
case EndpointInputStreamEventIds.HdcpCapabilityFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) HdmiIn1HdcpCapabilityFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) HdmiIn2HdcpCapabilityFeedback.FireUpdate();
|
||||
if (inputStream == Tx.DisplayPortInput) DisplayPortInHdcpCapabilityFeedback.FireUpdate();
|
||||
|
||||
Debug.Console(2, this, "DisplayPortHDCP Mode Trigger = {0}",
|
||||
DisplayPortInHdcpCapabilityFeedback.IntValue);
|
||||
|
||||
HdcpStateFeedback.FireUpdate();
|
||||
break;
|
||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
||||
if (inputStream == Tx.HdmiInputs[1]) Hdmi1VideoSyncFeedback.FireUpdate();
|
||||
if (inputStream == Tx.HdmiInputs[2]) Hdmi2VideoSyncFeedback.FireUpdate();
|
||||
if (inputStream == Tx.DisplayPortInput) DisplayPortVideoSyncFeedback.FireUpdate();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Crestron.SimplSharpPro.DM;
|
||||
@@ -44,7 +42,7 @@ namespace PepperDash.Essentials.DM
|
||||
if (typeName.StartsWith("dmtx401"))
|
||||
return new DmTx401CController(key, name, new DmTx401C(dmInput), true);
|
||||
if (typeName.StartsWith("hdbasettx"))
|
||||
new HDBaseTTxController(key, name, new HDTx3CB(dmInput));
|
||||
return new HDBaseTTxController(key, name, new HDTx3CB(dmInput));
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -83,6 +81,7 @@ namespace PepperDash.Essentials.DM
|
||||
/// <param name="key"></param>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="props"></param>
|
||||
/// <param name="typeName"></param>
|
||||
/// <returns></returns>
|
||||
public static BasicDmTxControllerBase GetDmTxController(string key, string name, string typeName, DmTxPropertiesConfig props)
|
||||
{
|
||||
@@ -128,10 +127,10 @@ namespace PepperDash.Essentials.DM
|
||||
BasicDmTxControllerBase tx;
|
||||
bool useChassisForOfflineFeedback = false;
|
||||
|
||||
if (parentDev is DmChassisController)
|
||||
if (parentDev is IDmSwitchWithEndpointOnlineFeedback)
|
||||
{
|
||||
// Get the Crestron chassis and link stuff up
|
||||
var switchDev = (parentDev as DmChassisController);
|
||||
var switchDev = (parentDev as IDmSwitchWithEndpointOnlineFeedback);
|
||||
var chassis = switchDev.Chassis;
|
||||
|
||||
//Check that the input is within range of this chassis' possible inputs
|
||||
@@ -180,7 +179,8 @@ namespace PepperDash.Essentials.DM
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (parentDev is DmpsRoutingController)
|
||||
|
||||
if (parentDev is DmpsRoutingController)
|
||||
{
|
||||
// Get the DMPS chassis and link stuff up
|
||||
var dmpsDev = (parentDev as DmpsRoutingController);
|
||||
@@ -237,11 +237,8 @@ namespace PepperDash.Essentials.DM
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
|
||||
return null;
|
||||
}
|
||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a processor, DM Chassis or DMPS.", key, pKey);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,8 +333,6 @@ namespace PepperDash.Essentials.DM
|
||||
txR.VideoSourceNumericFeedback.LinkInputSig(trilist.UShortInput[joinMap.VideoInput.JoinNumber]);
|
||||
txR.AudioSourceNumericFeedback.LinkInputSig(trilist.UShortInput[joinMap.AudioInput.JoinNumber]);
|
||||
|
||||
trilist.UShortInput[joinMap.HdcpSupportCapability.JoinNumber].UShortValue = (ushort)tx.HdcpSupportCapability;
|
||||
|
||||
if (txR.InputPorts[DmPortName.HdmiIn] != null)
|
||||
{
|
||||
var inputPort = txR.InputPorts[DmPortName.HdmiIn];
|
||||
@@ -384,7 +379,7 @@ namespace PepperDash.Essentials.DM
|
||||
{
|
||||
var intFeedback = tx.Feedbacks["HdmiIn2HdcpCapability"] as IntFeedback;
|
||||
if (intFeedback != null)
|
||||
intFeedback.LinkInputSig(trilist.UShortInput[joinMap.Port1HdcpState.JoinNumber]);
|
||||
intFeedback.LinkInputSig(trilist.UShortInput[joinMap.Port2HdcpState.JoinNumber]);
|
||||
}
|
||||
|
||||
if (inputPort.ConnectionType == eRoutingPortConnectionType.Hdmi && inputPort.Port != null)
|
||||
@@ -401,16 +396,17 @@ namespace PepperDash.Essentials.DM
|
||||
|
||||
if (tx.Feedbacks["DisplayPortInHdcpCapability"] != null)
|
||||
{
|
||||
|
||||
var intFeedback = tx.Feedbacks["DisplayPortInHdcpCapability"] as IntFeedback;
|
||||
if (intFeedback != null)
|
||||
|
||||
intFeedback.LinkInputSig(trilist.UShortInput[joinMap.Port3HdcpState.JoinNumber]);
|
||||
}
|
||||
|
||||
if (inputPort.ConnectionType == eRoutingPortConnectionType.Hdmi && inputPort.Port != null)
|
||||
{
|
||||
var port = inputPort.Port as EndpointDisplayPortInput;
|
||||
|
||||
SetHdcpCapabilityAction(hdcpTypeSimple, port, joinMap.Port3HdcpState.JoinNumber, trilist);
|
||||
if (inputPort.ConnectionType == eRoutingPortConnectionType.DisplayPort && inputPort.Port != null)
|
||||
{
|
||||
var port = inputPort.Port as EndpointDisplayPortInput;
|
||||
SetHdcpCapabilityAction(port, joinMap.Port3HdcpState.JoinNumber, trilist);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -467,7 +463,7 @@ namespace PepperDash.Essentials.DM
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
trilist.SetUShortSigAction(join,
|
||||
s =>
|
||||
{
|
||||
@@ -476,17 +472,15 @@ namespace PepperDash.Essentials.DM
|
||||
}
|
||||
}
|
||||
|
||||
private void SetHdcpCapabilityAction(bool hdcpTypeSimple, EndpointDisplayPortInput port, uint join,
|
||||
private void SetHdcpCapabilityAction(EndpointDisplayPortInput port, uint join,
|
||||
BasicTriList trilist)
|
||||
{
|
||||
|
||||
|
||||
trilist.SetUShortSigAction(join,
|
||||
s =>
|
||||
{
|
||||
port.HdcpCapability = (eHdcpCapabilityType)s;
|
||||
Debug.Console(0, this, "Trying to set HDCP to {0} on port {1}", s, port.ToString());
|
||||
port.HdcpCapability = (eHdcpCapabilityType) s;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -495,8 +489,22 @@ namespace PepperDash.Essentials.DM
|
||||
{
|
||||
public DmTxControllerFactory()
|
||||
{
|
||||
TypeNames = new List<string>() { "dmtx200c", "dmtx201c", "dmtx201s", "dmtx4k100c", "dmtx4k202c", "dmtx4kz202c", "dmtx4k302c", "dmtx4kz302c",
|
||||
"dmtx401c", "dmtx401s", "dmtx4k100c1g", "dmtx4kz100c1g", "hdbasettx" };
|
||||
TypeNames = new List<string>
|
||||
{
|
||||
"dmtx200c",
|
||||
"dmtx201c",
|
||||
"dmtx201s",
|
||||
"dmtx4k100c",
|
||||
"dmtx4k202c",
|
||||
"dmtx4kz202c",
|
||||
"dmtx4k302c",
|
||||
"dmtx4kz302c",
|
||||
"dmtx401c",
|
||||
"dmtx401s",
|
||||
"dmtx4k100c1g",
|
||||
"dmtx4kz100c1g",
|
||||
"hdbasettx"
|
||||
};
|
||||
}
|
||||
|
||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||
@@ -506,8 +514,8 @@ namespace PepperDash.Essentials.DM
|
||||
Debug.Console(1, "Factory Attempting to create new DM-TX Device");
|
||||
|
||||
var props = JsonConvert.DeserializeObject
|
||||
<PepperDash.Essentials.DM.Config.DmTxPropertiesConfig>(dc.Properties.ToString());
|
||||
return PepperDash.Essentials.DM.DmTxHelper.GetDmTxController(dc.Key, dc.Name, type, props);
|
||||
<DmTxPropertiesConfig>(dc.Properties.ToString());
|
||||
return DmTxHelper.GetDmTxController(dc.Key, dc.Name, type, props);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,10 +16,17 @@ using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.DM.Config;
|
||||
|
||||
namespace PepperDash.Essentials.DM {
|
||||
public interface IDmSwitch {
|
||||
public interface IDmSwitch
|
||||
{
|
||||
Switch Chassis { get; }
|
||||
|
||||
Dictionary<uint, string> TxDictionary { get; }
|
||||
Dictionary<uint, string> RxDictionary { get; }
|
||||
}
|
||||
|
||||
public interface IDmSwitchWithEndpointOnlineFeedback : IDmSwitch
|
||||
{
|
||||
Dictionary<uint, BoolFeedback> InputEndpointOnlineFeedbacks { get; }
|
||||
Dictionary<uint, BoolFeedback> OutputEndpointOnlineFeedbacks { get; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user