diff --git a/PepperDashEssentials/ControlSystem.cs b/PepperDashEssentials/ControlSystem.cs index 6903c1ba..e003cd54 100644 --- a/PepperDashEssentials/ControlSystem.cs +++ b/PepperDashEssentials/ControlSystem.cs @@ -97,9 +97,13 @@ namespace PepperDash.Essentials directoryPrefix = Crestron.SimplSharp.CrestronIO.Directory.GetApplicationRootDirectory(); - if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows OS + var version = Crestron.SimplSharp.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + + Global.SetAssemblyVersion(string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build)); + + if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS { - Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on 3-series Appliance", Global.GetAssemblyVersion()); + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on 3-series Appliance", Global.AssemblyVersion); // Check if User/ProgramX exists if (Directory.Exists(directoryPrefix + dirSeparator + "User" @@ -127,7 +131,7 @@ namespace PepperDash.Essentials } else // Handles Linux OS (Virtual Control) { - Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on Virtual Control Server", Global.GetAssemblyVersion()); + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on Virtual Control Server", Global.AssemblyVersion); // Set path to User/ filePathPrefix = directoryPrefix + dirSeparator + "User" + dirSeparator; @@ -246,11 +250,16 @@ namespace PepperDash.Essentials var loadPlugin = methods.FirstOrDefault(m => m.Name.Equals("LoadPlugin")); if (loadPlugin != null) { - var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Static); - var minimumVersion = properties.FirstOrDefault(p => p.Name.Equals("MinimumEssentialsFrameworkVersion")); + Debug.Console(2, "LoadPlugin method found in {0}", type.Name); + + var fields = type.GetFields(BindingFlags.Public | BindingFlags.Static); + + var minimumVersion = fields.FirstOrDefault(p => p.Name.Equals("MinimumEssentialsFrameworkVersion")); if (minimumVersion != null) { - var minimumVersionString = minimumVersion.GetValue(null, null) as string; + Debug.Console(2, "MinimumEssentialsFrameworkVersion found"); + + var minimumVersionString = minimumVersion.GetValue(null) as string; if (!string.IsNullOrEmpty(minimumVersionString)) { @@ -259,15 +268,24 @@ namespace PepperDash.Essentials if (!passed) { Debug.Console(0, Debug.ErrorLogLevel.Error, "Plugin indicates minimum Essentials version {0}. Dependency check failed. Skipping Plugin", minimumVersionString); + continue; + } + else + { + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Passed plugin passed dependency check (required version {0})", minimumVersionString); } } else { - Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion not defined. Loading plugin, but your mileage may vary."); + Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion found but not set. Loading plugin, but your mileage may vary."); } } + else + { + Debug.Console(0, Debug.ErrorLogLevel.Warning, "MinimumEssentialsFrameworkVersion not found. Loading plugin, but your mileage may vary."); + } - Debug.Console(0, Debug.ErrorLogLevel.Notice, "Adding type {0}", assy.Key, type.FullName); + Debug.Console(0, Debug.ErrorLogLevel.Notice, "Adding plugin: {0}", assy.Key); loadPlugin.Invoke(null, null); } } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs index 39c89828..999191ea 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Global/Global.cs @@ -51,15 +51,31 @@ namespace PepperDash.Essentials.Core FilePathPrefix = prefix; } + static string _AssemblyVersion; + /// /// Gets the Assembly Version of Essentials /// /// The Assembly Version at Runtime - public static string GetAssemblyVersion() + public static string AssemblyVersion { - var version = Crestron.SimplSharp.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + get + { + return _AssemblyVersion; + } + private set + { + _AssemblyVersion = value; + } + } - return string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); + /// + /// Sets the Assembly version to the version of the Essentials Library + /// + /// + public static void SetAssemblyVersion(string assemblyVersion) + { + AssemblyVersion = assemblyVersion; } /// @@ -69,11 +85,16 @@ namespace PepperDash.Essentials.Core /// Returns true if the running version meets or exceeds the minimum specified version public static bool IsRunningMinimumVersionOrHigher(string minimumVersion) { - var runtimeVersion = Crestron.SimplSharp.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + Debug.Console(2, "Comparing running version '{0}' to minimum version '{1}'", AssemblyVersion, minimumVersion); - Debug.Console(2, "Comparing running version '{0}' to minimum version '{1}'", GetAssemblyVersion(), minimumVersion); + var runtimeVersion = Regex.Match(AssemblyVersion, @"^(\d*).(\d*).(\d*)$"); - if (runtimeVersion.Major == 0) + var runtimeVersionMajor = Int16.Parse(runtimeVersion.Groups[1].Value); + var runtimeVersionMinor = Int16.Parse(runtimeVersion.Groups[2].Value); + var runtimeVersionBuild = Int16.Parse(runtimeVersion.Groups[3].Value); + + // Check for beta build version + if (runtimeVersionMajor == 0) { Debug.Console(2, "Running Beta Build. Bypassing Dependency Check."); return true; @@ -85,20 +106,21 @@ namespace PepperDash.Essentials.Core { Debug.Console(2, "minimumVersion String does not match format xx.yy.zz"); return false; - } var minVersionMajor = Int16.Parse(minVersion.Groups[1].Value); var minVersionMinor = Int16.Parse(minVersion.Groups[2].Value); var minVersionBuild = Int16.Parse(minVersion.Groups[3].Value); - if (minVersionMajor < runtimeVersion.Major) + + + if (minVersionMajor > runtimeVersionMajor) return false; - if (minVersionMinor < runtimeVersion.Minor) + if (minVersionMinor > runtimeVersionMinor) return false; - if (minVersionBuild < runtimeVersion.Build) + if (minVersionBuild > runtimeVersionBuild) return false; return true; diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/Config/Schema/DmChassisControllerPropertiesConfigSchema.json b/essentials-framework/Essentials DM/Essentials_DM/Chassis/Config/Schema/DmChassisControllerPropertiesConfigSchema.json new file mode 100644 index 00000000..7769bdbc --- /dev/null +++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/Config/Schema/DmChassisControllerPropertiesConfigSchema.json @@ -0,0 +1,83 @@ +{ + "$schema": "http://json-schema.org/draft-03/schema#", + "title": "DmChassisController Properties Config Schema", + "description": "", + "$ref": "EssentialsConfigSchema.json#definitions/Device", + "properties": { + "properties": { + "$ref": "#/propertiesConfig" + } + }, + "propertiesConfig": { + "type": "object", + "additionalProperties": true, + "properties": { + "control": { + "required":true, + "type": "object", + "$ref": "../../ControlPropertiesConfigSchema.json#/ControlPropertiesConfig" + }, + "volumeControls": { + "title": "Volume Controls", + "type": "object", + "additionalProperties": { + "type": "object", + "$ref": "#/dmAudioCardPropertiesConfig" + } + }, + "inputSlots": { + "required":true, + "title": "Input Slots", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "outputSlots": { + "required":true, + "title": "Output Slots", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "inputNames": { + "title": "Input Names", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "outputNames": { + "title": "Output Names", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "noRouteText": { + "title": "No Route Text", + "type": "string" + }, + "inputSlotSupportsHdcp2": { + "type": "object", + "additionalProperties": { + "type": "boolean" + } + } + } + }, + "dmAudioCardPropertiesConfig": { + "type": "object", + "properties": { + "OutLevel": { + "title": "Output Level", + "type": "integer" + }, + "isVolumeControlPoint": { + "title": "Volume Control Point?", + "type": "boolean" + } + } + } +} \ No newline at end of file