Attempt at modifying device factory mechanism

This commit is contained in:
Neil Dorin
2020-03-26 16:10:54 -06:00
parent ca27e01f94
commit a403a8b81f
7 changed files with 120 additions and 12 deletions

View File

@@ -70,6 +70,11 @@ namespace PepperDash.Essentials
{ {
version = Global.AssemblyVersion; version = Global.AssemblyVersion;
assembly = Assembly.GetExecutingAssembly(); assembly = Assembly.GetExecutingAssembly();
break;
}
case ("PepperDashEssentialsBase.dll"):
{
break; break;
} }
case ("PepperDash_Core.dll"): case ("PepperDash_Core.dll"):
@@ -339,9 +344,9 @@ namespace PepperDash.Essentials
{ {
try try
{ {
if (typeof(IPluginDeviceConfig).IsAssignableFrom(type)) if (typeof(IPluginDeviceFactory).IsAssignableFrom(type))
{ {
var plugin = (IPluginDeviceConfig)Crestron.SimplSharp.Reflection.Activator.CreateInstance(type); var plugin = (IPluginDeviceFactory)Crestron.SimplSharp.Reflection.Activator.CreateInstance(type);
LoadCustomPlugin(plugin, loadedAssembly); LoadCustomPlugin(plugin, loadedAssembly);
} }
else else
@@ -377,7 +382,7 @@ namespace PepperDash.Essentials
/// Loads a /// Loads a
/// </summary> /// </summary>
/// <param name="plugin"></param> /// <param name="plugin"></param>
static void LoadCustomPlugin(IPluginDeviceConfig plugin, LoadedAssembly loadedAssembly) static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
{ {
var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion); var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
@@ -392,7 +397,7 @@ namespace PepperDash.Essentials
} }
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading plugin: {0}", loadedAssembly.Name); Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading plugin: {0}", loadedAssembly.Name);
plugin.LoadPlugin(); plugin.LoadTypeFactories();
} }
/// <summary> /// <summary>

View File

@@ -13,12 +13,14 @@ using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// Serves as a generic wrapper class for all styles of IBasicCommuncation ports /// Serves as a generic wrapper class for all styles of IBasicCommuncation ports
/// </summary> /// </summary>
public class public class GenericComm : ReconfigurableDevice
GenericComm : ReconfigurableDevice
{ {
EssentialsControlPropertiesConfig PropertiesConfig; EssentialsControlPropertiesConfig PropertiesConfig;
public IBasicCommunication CommPort { get; private set; } public IBasicCommunication CommPort { get; private set; }
@@ -29,6 +31,14 @@ namespace PepperDash.Essentials.Core
PropertiesConfig = CommFactory.GetControlPropertiesConfig(config); PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
CommPort = CommFactory.CreateCommForDevice(config); CommPort = CommFactory.CreateCommForDevice(config);
}
public static IKeyed BuildDevice(DeviceConfig dc)
{
Debug.Console(1, "Factory Attempting to create new Generic Comm Device");
return new GenericComm(dc);
} }
public void SetPortConfig(string portConfig) public void SetPortConfig(string portConfig)
@@ -51,6 +61,22 @@ namespace PepperDash.Essentials.Core
ConfigWriter.UpdateDeviceConfig(config); ConfigWriter.UpdateDeviceConfig(config);
} }
public class Factory : EssentialsDevice.Factory
{
#region IDeviceFactory Members
List<string> TypeNames = new List<string>() { "genericComm" };
#endregion
public override IKeyed BuildDevice(DeviceConfig dc)
{
Debug.Console(1, "Factory Attempting to create new Generic Comm Device");
return new GenericComm(dc);
}
}
} }
} }

View File

@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Core;
using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.Core
{
/// <summary>
/// Defines the basic needs for an EssentialsDevice to enable it to be build by an IDeviceFactory class
/// </summary>
public abstract class EssentialsDevice : Device
{
public EssentialsDevice(string key)
: base(key)
{
}
public abstract class Factory : IDeviceFactory
{
#region IDeviceFactory Members
public List<string> TypeNames { get; protected set; }
public virtual void LoadTypeFactories()
{
foreach (var typeName in TypeNames)
{
DeviceFactory.AddFactoryForType(typeName, BuildDevice);
}
}
#endregion
public abstract IKeyed BuildDevice(DeviceConfig dc);
public Factory()
{
TypeNames = new List<string>();
}
}
}
}

View File

@@ -12,7 +12,7 @@ namespace PepperDash.Essentials.Core.Devices
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public abstract class ReconfigurableDevice : Device public abstract class ReconfigurableDevice : EssentialsDevice
{ {
public event EventHandler<EventArgs> ConfigChanged; public event EventHandler<EventArgs> ConfigChanged;

View File

@@ -87,4 +87,17 @@ namespace PepperDash.Essentials.Core
return null; return null;
} }
} }
/// <summary>
/// Responsible for loading all of the device types
/// </summary>
public class CoreDeviceFactory
{
public CoreDeviceFactory()
{
var genComm = new GenericComm.Factory() as IDeviceFactory;
genComm.LoadTypeFactories();
}
}
} }

View File

@@ -132,6 +132,7 @@
<Compile Include="Devices\CrestronProcessor.cs" /> <Compile Include="Devices\CrestronProcessor.cs" />
<Compile Include="Devices\DeviceApiBase.cs" /> <Compile Include="Devices\DeviceApiBase.cs" />
<Compile Include="Devices\DeviceFeedbackExtensions.cs" /> <Compile Include="Devices\DeviceFeedbackExtensions.cs" />
<Compile Include="Devices\EssentialsDevice.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" />

View File

@@ -1,15 +1,28 @@
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.Core.Plugins namespace PepperDash.Essentials.Core
{ {
/// <summary> /// <summary>
/// Defines a class that is capable of loading custom plugin device types /// Defines a class that is capable of loading custom plugin device types
/// </summary> /// </summary>
public interface IPluginDeviceConfig public interface IPluginDeviceFactory : IDeviceFactory
{ {
/// <summary>
/// Required to define the minimum version for Essentials in the format xx.yy.zz
/// </summary>
string MinimumEssentialsFrameworkVersion { get; } string MinimumEssentialsFrameworkVersion { get; }
void LoadPlugin();
IKeyed BuildDevice(DeviceConfig dc); }
/// <summary>
/// Defines a class that is capable of loading device types
/// </summary>
public interface IDeviceFactory
{
/// <summary>
/// Will be called when the plugin is loaded by Essentials. Must add any new types to the DeviceFactory using DeviceFactory.AddFactoryForType() for each new type
/// </summary>
void LoadTypeFactories();
} }
} }