Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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);
            }
        }
Esempio n. 4
0
        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;
                    }
                }
            }
        }
Esempio n. 5
0
        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);
            }
        }