public override async Task Init(ModuleInitInfo info, VariableValue[] restoreVariableValues, Notifier notifier, ModuleThread moduleThread) { this.moduleID = info.ModuleID; this.notifier = notifier; var config = info.GetConfigReader(); modelFileName = Path.GetFullPath(config.GetString("model-file")); modelAsString = ReadConfigFileToString(modelFileName); model = DeserializeModelFromString(modelAsString); ModifyModelAfterInit(); await OnConfigModelChanged(init : true); }
public override async Task Init(ModuleInitInfo info, VariableValue[] restoreVariableValues, Notifier notifier, ModuleThread moduleThread) { theSyncContext = SynchronizationContext.Current; await base.Init(info, restoreVariableValues, notifier, moduleThread); var config = info.GetConfigReader(); clientPort = info.LoginPort; string baseDir = config.GetString("base-dir"); string host = config.GetString("listen-host"); int port = config.GetInt("listen-port"); string strViewAssemblies = config.GetString("view-assemblies"); const string releaseDebugPlaceHolder = "{RELEASE_OR_DEBUG}"; if (strViewAssemblies.Contains(releaseDebugPlaceHolder)) { #if DEBUG strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Debug"); #else strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Release"); #endif } string[] viewAssemblies = strViewAssemblies .Split(new char[] { ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Trim()) .ToArray(); absolutBaseDir = Path.GetFullPath(baseDir); if (!Directory.Exists(absolutBaseDir)) { throw new Exception($"base-dir does not exist: {absolutBaseDir}"); } string[] absoluteViewAssemblies = viewAssemblies.Select(d => Path.GetFullPath(d)).ToArray(); foreach (string dir in absoluteViewAssemblies) { if (!File.Exists(dir)) { throw new Exception($"view-assembly does not exist: {dir}"); } } viewTypes = ReadAvailableViewTypes(absolutBaseDir, BundlesPrefix, absoluteViewAssemblies); uiModel = MakeUiModel(model, viewTypes); var builder = new WebHostBuilder(); builder.UseKestrel((KestrelServerOptions options) => { if (host.Equals("localhost", StringComparison.InvariantCultureIgnoreCase)) { options.ListenLocalhost(port); } else { options.Listen(IPAddress.Parse(host), port); } }); builder.UseWebRoot(absolutBaseDir); builder.UseStartup <Module>(); //builder.ConfigureLogging(logging => { // logging.AddConsole(); // Microsoft.Extensions.Logging.Console // logging.SetMinimumLevel(LogLevel.Information); //}); webHost = builder.Build(); webHost.Start(); }
public override async Task Init(ModuleInitInfo info, VariableValue[] restoreVariableValues, Notifier notifier, ModuleThread moduleThread) { this.moduleThread = moduleThread; this.initInfo = info; this.moduleConfig = info.GetConfigReader(); await base.Init(info, restoreVariableValues, notifier, moduleThread); string strAssemblies = moduleConfig.GetOptionalString("adapter-assemblies", ""); const string releaseDebugPlaceHolder = "{RELEASE_OR_DEBUG}"; if (strAssemblies.Contains(releaseDebugPlaceHolder)) { #if DEBUG strAssemblies = strAssemblies.Replace(releaseDebugPlaceHolder, "Debug"); #else strAssemblies = strAssemblies.Replace(releaseDebugPlaceHolder, "Release"); #endif } string[] assemblies = strAssemblies .Split(new char[] { ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries) .Select(s => s.Trim()) .ToArray(); string[] absoluteAssemblies = assemblies.Select(d => Path.GetFullPath(d)).ToArray(); foreach (string assembly in absoluteAssemblies) { if (!File.Exists(assembly)) { throw new Exception($"calculation-assembly does not exist: {assembly}"); } } var adapterTypes = Reflect.GetAllNonAbstractSubclasses(typeof(CalculationBase)).ToList(); adapterTypes.AddRange(absoluteAssemblies.SelectMany(fLoadCalcTypesFromAssembly)); adapterTypesAttribute.Clear(); mapAdapterTypes.Clear(); foreach (Type type in adapterTypes) { Identify?id = type.GetCustomAttribute <Identify>(); if (id != null) { mapAdapterTypes[id.ID] = type; adapterTypesAttribute.Add(id); } } foreach (CalcInstance adapter in adapters) { adapter.CreateInstance(mapAdapterTypes); } Dictionary <VariableRef, VTQ> varMap = restoreVariableValues.ToDictionary(v => v.Variable, v => v.Value); foreach (CalcInstance adapter in adapters) { adapter.SetInitialOutputValues(varMap); adapter.SetInitialStateValues(varMap); } try { Task[] initTasks = adapters.Select(InitAdapter).ToArray(); await Task.WhenAll(initTasks); } catch (Exception exp) { string[] failedAdapters = adapters .Where(a => a.State == State.InitError) .Select(a => "Init of calculation '" + a.CalcConfig.Name + "' failed: " + a.LastError) .ToArray(); string errMessage = failedAdapters.Length > 0 ? string.Join("; ", failedAdapters) : exp.Message; Console.Error.WriteLine(errMessage); await Shutdown(); throw new Exception(errMessage); } }
public override async Task Run(Func <bool> shutdown) { var mapConfigVar = new Dictionary <string, string>(); string configVarFile = info.GetConfigReader().GetOptionalString("config-var-file", "").Trim(); if (configVarFile != "") { if (!File.Exists(configVarFile)) { Console.WriteLine($"config-var-file '{configVarFile}' not found!"); } else { string vars = File.ReadAllText(configVarFile, System.Text.Encoding.UTF8); var variables = StdJson.JObjectFromString(vars); Console.WriteLine($"Using variables as specified in config-var-file '{configVarFile}':"); foreach (var prop in variables.Properties()) { string key = "${" + prop.Name + "}"; mapConfigVar[key] = prop.Value.ToString(); Console.WriteLine($"{prop.Name} -> {prop.Value}"); } } } model.ApplyVarConfig(mapConfigVar); string certDir = info.GetConfigReader().GetOptionalString("cert-dir", "."); var tasks = new List <Task>(); Task[] tasksVarPub = model.MQTT .Where(mqtt => mqtt.VarPublish != null) .Select(mqtt => MqttPublisher.MakeVarPubTask(mqtt, info, certDir, shutdown)) .ToArray(); tasks.AddRange(tasksVarPub); Task[] tasksConfigPub = model.MQTT .Where(mqtt => mqtt.ConfigPublish != null) .Select(mqtt => MqttPublisher.MakeConfigPubTask(mqtt, info, certDir, shutdown)) .ToArray(); tasks.AddRange(tasksConfigPub); Task[] tasksVarRec = model.MQTT .Where(mqtt => mqtt.VarReceive != null) .Select(mqtt => MqttPublisher.MakeVarRecTask(mqtt, info, certDir, shutdown)) .ToArray(); tasks.AddRange(tasksVarRec); Task[] tasksConfigRec = model.MQTT .Where(mqtt => mqtt.ConfigReceive != null) .Select(mqtt => MqttPublisher.MakeConfigRecTask(mqtt, info, certDir, shutdown)) .ToArray(); tasks.AddRange(tasksConfigRec); Task[] tasksMethodPub = model.MQTT .Where(mqtt => mqtt.MethodPublish != null) .Select(mqtt => MqttPublisher.MakeMethodPubTask(mqtt, info, certDir, shutdown)) .ToArray(); tasks.AddRange(tasksMethodPub); if (tasks.Count == 0) { while (!shutdown()) { await Task.Delay(100); } } else { try { await Task.WhenAll(tasks); } catch (Exception exp) { if (!shutdown()) { Exception e = exp.GetBaseException() ?? exp; Console.Error.WriteLine($"Run: {e.GetType().FullName} {e.Message}"); return; } } } }
public override async Task Init(ModuleInitInfo info, VariableValue[] restoreVariableValues, Notifier notifier, ModuleThread moduleThread) { this.moduleThread = moduleThread; await base.Init(info, restoreVariableValues, notifier, moduleThread); var config = info.GetConfigReader(); string strAssemblies = config.GetOptionalString("adapter-assemblies", ""); const string releaseDebugPlaceHolder = "{RELEASE_OR_DEBUG}"; if (strAssemblies.Contains(releaseDebugPlaceHolder)) { #if DEBUG strAssemblies = strAssemblies.Replace(releaseDebugPlaceHolder, "Debug"); #else strAssemblies = strAssemblies.Replace(releaseDebugPlaceHolder, "Release"); #endif } string[] assemblies = strAssemblies.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); string[] absoluteAssemblies = assemblies.Select(d => Path.GetFullPath(d)).ToArray(); foreach (string assembly in absoluteAssemblies) { if (!File.Exists(assembly)) { throw new Exception($"adapter-assembly does not exist: {assembly}"); } } foreach (VariableValue v in restoreVariableValues) { string dataItemID = v.Variable.Object.LocalObjectID; if (dataItemsState.ContainsKey(dataItemID)) { dataItemsState[dataItemID].LastReadValue = v.Value; } } var adapterTypes = Reflect.GetAllNonAbstractSubclasses(typeof(AdapterBase)).ToList(); adapterTypes.AddRange(absoluteAssemblies.SelectMany(fLoadAdaptersFromAssembly)); mapAdapterTypes.Clear(); foreach (var type in adapterTypes) { Identify id = type.GetCustomAttribute <Identify>(); if (id != null) { mapAdapterTypes[id.ID] = type; } } foreach (AdapterState adapter in adapters) { adapter.CreateInstance(mapAdapterTypes); } try { Task[] initTasks = adapters.Select(InitAdapter).ToArray(); await Task.WhenAll(initTasks); } catch (Exception exp) { string[] failedAdapters = adapters .Where(a => a.State == State.InitError) .Select(a => "Init of IO adapter '" + a.Config.Name + "' failed: " + a.LastError) .ToArray(); string errMessage = failedAdapters.Length > 0 ? string.Join("; ", failedAdapters) : exp.Message; Console.Error.WriteLine(errMessage); await Shutdown(); throw new Exception(errMessage); } }