using NLua; using MP.MONO.DECODER; using MP.MONO.Data; using MP.MONO.Core; using StackExchange.Redis; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using MP.MONO.Core.DTO; using MP.MONO.Data.Controllers; using NLog; using MP.MONO.Data.DbModels; // See https://aka.ms/new-console-template for more information // init parte config, vedere https://blog.hildenco.com/2020/05/configuration-in-net-core-console.html var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); var builder = new ConfigurationBuilder() .AddJsonFile($"appsettings.json", true, true) .AddJsonFile($"appsettings.{env}.json", true, true) .AddEnvironmentVariables(); var config = builder.Build(); // init LOG Logger Log = LogManager.GetCurrentClassLogger(); // initi va di base string lineSep = "---------------------------------------------"; Console.WriteLine(lineSep); Console.WriteLine("Start DECODER with LUA integration!"); Console.WriteLine(""); Console.WriteLine("Running - press CTRL-C to stop"); Console.WriteLine(lineSep); Console.WriteLine(""); // init DB MpDbController dbController = null!; string connStr = config.GetConnectionString("MP.MONO.Data"); if (string.IsNullOrEmpty(connStr)) { Log.Error("ConnString empty!"); } else { dbController = new MpDbController(config); Log.Info("DbController OK"); Console.WriteLine("DbController OK"); } // init info di base int MachineId = 1; int.TryParse(config.GetValue("MachineId"), out MachineId); // init oggetti REDIS + messagePipe... ConnectionMultiplexer redisConn = ConnectionMultiplexer.Connect(config.GetConnectionString("Redis")); MessagePipe alarmPipe = new MessagePipe(redisConn, Constants.ALARM_M_QUEUE); MessagePipe alarmValPipe = new MessagePipe(redisConn, Constants.ALARM_ACT_VAL); alarmValPipe.EA_NewMessage += AlarmValPipe_EA_NewMessage; // init classe gestione allarmi con LUA AlarmManager alarmMan = new AlarmManager(); void AlarmValPipe_EA_NewMessage(object? sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // conversione on-the-fly List --> allarmi if (!string.IsNullOrEmpty(currArgs.newMessage)) { try { var alarmList = JsonConvert.DeserializeObject>(currArgs.newMessage); if (alarmList != null) { List activeAlarmList = new List(); List alarmLogList = new List(); foreach (var bankVal in alarmList) { var bankAlarmList = AlarmManager.processData(bankVal); // aggiungo... activeAlarmList.AddRange(bankAlarmList); // preparo OBJ x DB AlarmLogModel newAlarm = new AlarmLogModel() { MachineId = MachineId, DtRif = DateTime.Now, MemAddress = "SIM.DB", Index = 0, Status = (uint)bankVal, ValDecoded = activeAlarmList.Count > 0 ? JsonConvert.SerializeObject(activeAlarmList) : "All OK" }; alarmLogList.Add(newAlarm); } // serializzo... string serAlarms = "All OK"; if (activeAlarmList.Count > 0) { serAlarms= JsonConvert.SerializeObject(activeAlarmList); } // invio sulla message pipeline corretta TUTTI gli allarmi serializzati alarmPipe.sendMessage(serAlarms); if (dbController != null) { // salvo nel DB lo stato dei bank di allarme foreach (var dbItem in alarmLogList) { _ = dbController.AlarmLogInsert(dbItem).Result; } } } } catch { } } } Lua state; state = new Lua(); // preparo variabile x avvisare script che il modo è da NLua state.DoString(" callMode = 'NLua' "); int numTest = 0; if (numTest == 1) { // inserisco dati in LUA... List alarmList = new List(); string alarmStatus = ""; bool valueChanged = false; string luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "AlarmDecoder.lua"); state.NewTable("alarmListTable"); LuaTable tabA = state.GetTable("alarmListTable"); // aggiorno valori alarmList = new List() { "Allarme01", "Allarme02", "##Allarme03", "Allarme04", "##Allarme05", "Allarme06", "Allarme07", "Allarme08" }; state["alarmList"] = alarmList; state["numAlarm"] = alarmList.Count; //state.DoString(@" //function setupAlarms() // for i = numAlarm,1, -1 // do // alarmListTable[i] = alarmList[i-1] // end //end //"); //var scriptFunc = state["setupAlarms"] as LuaFunction; //var res2 = scriptFunc.Call(); // eseguo state["lastVal"] = 0; state["currVal"] = 3; state.DoFile(luaPath); alarmStatus = state.GetString("alarmStatus"); bool.TryParse(state.GetString("valueChanged"), out valueChanged); Console.WriteLine($"Changed: {valueChanged}"); Console.WriteLine(alarmStatus); //tabA = state.GetTable("alarmListActive"); //foreach (var item in tabA.Values) //{ // Console.WriteLine(item); //} Thread.Sleep(800); state["currVal"] = 7; state.DoFile(luaPath); alarmStatus = state.GetString("alarmStatus"); bool.TryParse(state.GetString("valueChanged"), out valueChanged); Console.WriteLine($"Changed: {valueChanged}"); Console.WriteLine(alarmStatus); //tabA = state.GetTable("alarmListActive"); //foreach (var item in tabA.Values) //{ // Console.WriteLine(item); //} Thread.Sleep(800); state["currVal"] = 15; state.DoFile(luaPath); alarmStatus = state.GetString("alarmStatus"); bool.TryParse(state.GetString("valueChanged"), out valueChanged); Console.WriteLine($"Changed: {valueChanged}"); Console.WriteLine(alarmStatus); //tabA = state.GetTable("alarmListActive"); //foreach (var item in tabA.Values) //{ // Console.WriteLine(item); //} Thread.Sleep(800); state["currVal"] = 0; state.DoFile(luaPath); alarmStatus = state.GetString("alarmStatus"); bool.TryParse(state.GetString("valueChanged"), out valueChanged); Console.WriteLine($"Changed: {valueChanged}"); Console.WriteLine(alarmStatus); //tabA = state.GetTable("alarmListActive"); //foreach (var item in tabA.Values) //{ // Console.WriteLine(item); //} //state.DoString("a={b={c=2}}"); //LuaTable tabA = state.GetTable("a"); //LuaTable tabB = state.GetTable("a.b"); //state.DoString(" print(a) "); //foreach (var item in tabB) //{ // Console.WriteLine(item); //} //tabA = state.GetTable("alarmListActive"); //foreach (var item in tabA.Values) //{ // Console.WriteLine(item); //} } else if (numTest == 2) { static double Compute(double x) { return x * (x - 1); } var myobj = new MyClass(); myobj.IntegerProperty = 17; state["var1"] = "someValue"; state["obj"] = myobj; state["compute"] = new Func(Compute); // Will print "output: someValue" state.DoString(" print('output: ' .. var1) "); // Will print 18 state.DoString(" print(obj.IntegerProperty + 1) "); // Will print "Doing something: hello" state.DoString(" obj:DoSomething('hello') "); state.DoString(" obj:SaveData('redis:key:name','{John = 320, Mary = 340, Bob = 880, Rob = 860}') "); state.DoString("a={b={c=2}}"); LuaTable tabA = state.GetTable("a"); LuaTable tabB = state.GetTable("a.b"); state.DoString(" print(a) "); foreach (var item in tabA) { Console.WriteLine(item); } foreach (var item in tabB) { Console.WriteLine(item); } // Will print "-0.1875" state.DoString(" print(compute(0.25)) "); // Reading values back state.DoString(" x = compute(0.75) "); state.DoString(" y = 2.0 * (obj.IntegerProperty * x) "); double x = state.GetNumber("x"); double y = state.GetNumber("y"); // Will print: x = -0.1875, y = -6.375 Console.WriteLine($"x = {x}, y = {y}"); double val = 12.0; state["x"] = val; // Create a global value 'x' var resRaw = state.DoString("return 10 + x*(5 + 2)")[0]; double res = 0; double.TryParse($"{resRaw}", out res); Console.WriteLine($"{res}"); state.DoString("y = 10 + x*(4 + 2)"); var rawState = state["y"]; // Retrieve the value of y double y2 = 0; double.TryParse($"{rawState}", out y2); Console.WriteLine($"{y2}"); state.DoString(@" function ScriptFunc (val1, val2) if val1 > val2 then return val1 + 1 else return val2 - 1 end end "); var scriptFunc = state["ScriptFunc"] as LuaFunction; var res2 = (long)scriptFunc.Call(3, 9).First(); Console.WriteLine($"risultato script: {res2}"); // LuaFunction.Call will also return a array of objects, since a Lua function // can return multiple values } else if (numTest == 99) { string luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "prova.lua"); state.DoFile(luaPath); } // Ciclo infinito x attesa chiusura con CTRL-C do { Thread.Sleep(100); } while (true);