diff --git a/MP.MONO.DECODER/AlarmManager.cs b/MP.MONO.DECODER/AlarmsManager.cs similarity index 94% rename from MP.MONO.DECODER/AlarmManager.cs rename to MP.MONO.DECODER/AlarmsManager.cs index e9a901b..2721bc5 100644 --- a/MP.MONO.DECODER/AlarmManager.cs +++ b/MP.MONO.DECODER/AlarmsManager.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace MP.MONO.DECODER { - public class AlarmManager + public class AlarmsManager { protected List AlarmList = new List(); protected static Lua state = new Lua(); @@ -17,7 +17,7 @@ namespace MP.MONO.DECODER public static bool valueChanged = false; protected static Logger Log = LogManager.GetCurrentClassLogger(); - public AlarmManager() + public AlarmsManager() { // preparo variabile x avvisare script che il modo è da NLua luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "AlarmDecoder.lua"); @@ -32,8 +32,8 @@ namespace MP.MONO.DECODER state["lastVal"] = 0; state["currVal"] = 0; - Log.Info("AlarmManager OK"); - Console.WriteLine("AlarmManager OK"); + Log.Info("AlarmsManager OK"); + Console.WriteLine("AlarmsManager OK"); } /// diff --git a/MP.MONO.DECODER/ParamsManager.cs b/MP.MONO.DECODER/ParamsManager.cs new file mode 100644 index 0000000..7a34331 --- /dev/null +++ b/MP.MONO.DECODER/ParamsManager.cs @@ -0,0 +1,82 @@ +using NLog; +using NLua; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MP.MONO.DECODER +{ + public class ParamsManager + { + protected List AlarmList = new List(); + protected static Lua state = new Lua(); + protected static string luaPath = ""; + public static string alarmStatus = ""; + public static bool valueChanged = false; + protected static Logger Log = LogManager.GetCurrentClassLogger(); + + public ParamsManager() + { + // preparo variabile x avvisare script che il modo è da NLua + luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "ParamsDecoder.lua"); + +#if false + state.DoString(" callMode = 'NLua' "); + // initi 0/0 + state.DoString(" lastVal = 0 "); + state.DoString(" currVal = 0 "); +#endif + state["callMode"] = "NLua"; + state["lastVal"] = 0; + state["currVal"] = 0; + + Log.Info("ParamsManager OK"); + Console.WriteLine("ParamsManager OK"); + } + + /// + /// Funzione chiamata LUA x calcolo status allarmi + /// + /// + /// + /// + /// + /// + /// + /// + public static List processData(string prefix, List alarmList, uint muteMask, uint disableMask, uint lastVal, ref uint currVal) + { + state["prefix"] = prefix; + state["alarmList"] = alarmList; + state["numAlarm"] = alarmList.Count; + state["muteMask"] = muteMask; + state["disableMask"] = disableMask; + + List answ = new List(); + // invio dati aggiornati a LUA + state["lastVal"] = lastVal; + state["currVal"] = currVal; + + state.DoFile(luaPath); + alarmStatus = state.GetString("alarmStatus"); + // recupero NUOVO valore (filtrato) attuale da salvare + currVal = (uint)state.GetNumber("lastVal"); + bool.TryParse(state.GetString("valueChanged"), out valueChanged); + if (valueChanged) + { + Log.Trace($"Changed: {valueChanged}"); + Log.Trace(alarmStatus); + + LuaTable tabActive = state.GetTable("alarmListActive"); + List activeList = new List(); + foreach (var allarme in tabActive.Values) + { + answ.Add($"{allarme}"); + } + } + return answ; + } + } +} diff --git a/MP.MONO.DECODER/Program.cs b/MP.MONO.DECODER/Program.cs index 44db293..a3f04f4 100644 --- a/MP.MONO.DECODER/Program.cs +++ b/MP.MONO.DECODER/Program.cs @@ -78,26 +78,60 @@ setupConf(); * Setup Gestione ALLARMI * --------------------------------*/ // init classe gestione allarmi con LUA -AlarmManager alarmMan = new AlarmManager(); +AlarmsManager alarmsMan = new AlarmsManager(); // inizializzo gestione messagePipe da Redis x allarmi -MessagePipe alarmPipe = new MessagePipe(redisConn, Constants.ALARM_M_QUEUE); -MessagePipe alarmValPipe = new MessagePipe(redisConn, Constants.ALARM_ACT_VAL); +MessagePipe alarmsPipe = new MessagePipe(redisConn, Constants.ALARM_M_QUEUE); +MessagePipe alarmsValPipe = new MessagePipe(redisConn, Constants.ALARM_ACT_QUEUE); // registro gestione eventi -alarmValPipe.EA_NewMessage += AlarmValPipe_EA_NewMessage; +alarmsValPipe.EA_NewMessage += AlarmsValPipe_EA_NewMessage; /* -------------------------------- * Setup Gestione Parametri * --------------------------------*/ - +ParamsManager paramMan = new ParamsManager(); +// inizializzo gestione messagePipe da Redis x allarmi +MessagePipe paramsPipe = new MessagePipe(redisConn, Constants.PARAMS_M_QUEUE); +MessagePipe paramsValPipe = new MessagePipe(redisConn, Constants.PARAMS_ACT_QUEUE); +// registro gestione eventi +paramsValPipe.EA_NewMessage += ParamsValPipe_EA_NewMessage; /* -------------------------------- * Funzioni / metodi accessori * --------------------------------*/ /// -/// Gestione evento ricezione messaggio allarmi +/// Recupero da redis le conf (es modi,stati,allarmi) /// -void AlarmValPipe_EA_NewMessage(object? sender, EventArgs e) +void setupConf() +{ + // recupero valori e deserializzo + string rawData = ""; + + // machine conf + rawData = redisDb.StringGet(Constants.STATUS_CONF_KEY); + if (!string.IsNullOrEmpty(rawData)) + { + machineStatusConf = JsonConvert.DeserializeObject>(rawData); + } + + // machine mode + rawData = redisDb.StringGet(Constants.MODE_CONF_KEY); + if (!string.IsNullOrEmpty(rawData)) + { + machineModeConf = JsonConvert.DeserializeObject>(rawData); + } + + // allarmi, versione base... + rawData = redisDb.StringGet(Constants.ALARMS_CONF_KEY); + if (!string.IsNullOrEmpty(rawData)) + { + alarmsConf = JsonConvert.DeserializeObject>(rawData); + } +} +/// +/// Gestione evento ricezione messaggi allarmi +/// +void AlarmsValPipe_EA_NewMessage(object? sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // conversione on-the-fly List --> allarmi @@ -135,7 +169,7 @@ void AlarmValPipe_EA_NewMessage(object? sender, EventArgs e) var bankVal = alarmList.FirstOrDefault(x => x.Key == alarmData.memAddr); uint actVal = !string.IsNullOrEmpty(bankVal.Key) ? bankVal.Value : 0; // valutare se dividere in 2 da 16... FIXME TODO - var bankAlarmList = AlarmManager.processData(alarmData.memAddr, alarmData.messages, alarmData.silenceMask[0], alarmData.disableMask[0], alarmData.alarmsState[0], ref actVal); + var bankAlarmList = AlarmsManager.processData(alarmData.memAddr, alarmData.messages, alarmData.silenceMask[0], alarmData.disableMask[0], alarmData.alarmsState[0], ref actVal); // salvo nuovo valore in oggetto... if (alarmData.alarmsState[0] != actVal) { @@ -164,7 +198,7 @@ void AlarmValPipe_EA_NewMessage(object? sender, EventArgs e) string serAlarms = "[]"; serAlarms = JsonConvert.SerializeObject(activeAlarmList); // invio sulla message pipeline corretta TUTTI gli allarmi serializzati - alarmPipe.saveAndSendMessage(Constants.ALARM_CURR_KEY, serAlarms); + alarmsPipe.saveAndSendMessage(Constants.ALARM_CURR_KEY, serAlarms); if (dbController != null) { // salvo nel DB lo stato dei bank di allarme @@ -180,32 +214,116 @@ void AlarmValPipe_EA_NewMessage(object? sender, EventArgs e) } } /// -/// Recupero da redis le conf (es modi,stati,allarmi) +/// Gestione evento ricezione messaggi parametri /// -void setupConf() +void ParamsValPipe_EA_NewMessage(object? sender, EventArgs e) { - // recupero valori e deserializzo - string rawData = ""; - - // machine conf - rawData = redisDb.StringGet(Constants.STATUS_CONF_KEY); - if (!string.IsNullOrEmpty(rawData)) + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly Dictionary --> parametri valorizzati (tra quelli configurati) + if (!string.IsNullOrEmpty(currArgs.newMessage)) { - machineStatusConf = JsonConvert.DeserializeObject>(rawData); - } + try + { + // esempio conversione dati +#if false + List answ = new List(); - // machine mode - rawData = redisDb.StringGet(Constants.MODE_CONF_KEY); - if (!string.IsNullOrEmpty(rawData)) - { - machineModeConf = JsonConvert.DeserializeObject>(rawData); - } + // genero a partire dall'elenco configurato da simulare... + answ = currSimPar.Select(i => new DisplayDataDTO() + { + IsNumeric = i.IsNumeric, + MaxVal = i.MaxVal, + MinVal = i.MinVal, + Order = i.Order, + Title = i.Title, + Type = i.Type, + ValueNum = simNext(i.ValueNum, i.MinVal, i.MaxVal, i.SimMean, i.SimStd), + DisplFormat = i.DisplFormat, + CssIcon = i.CssIcon, + EnablePlot = i.EnablePlot, + ShowBar = i.ShowBar, + ShowGauge = i.ShowGauge, + }).ToList(); - // allarmi, versione base... - rawData = redisDb.StringGet(Constants.ALARMS_CONF_KEY); - if (!string.IsNullOrEmpty(rawData)) - { - alarmsConf = JsonConvert.DeserializeObject>(rawData); + foreach (var item in answ) + { + item.Value = $"{item.ValueNum.ToString(item.DisplFormat)}"; + } + return answ; +#endif + + // verifico codici ricevuti + var paramsList = JsonConvert.DeserializeObject>(currArgs.newMessage); + if (paramsList != null) + { + // variabili accessorie + List activeAlarmList = new List(); + List alarmLogList = new List(); + + // rileggo da REDIS la conf attuale allarmi da area ALARMS_SETT_KEY, altrimenti uso quella letta inizialmente da conf base + List? currAlarmsConf = new List(); + string rawData = redisDb.StringGet(Constants.ALARMS_SETT_KEY); + // se trovati uso questi... + if (!string.IsNullOrEmpty(rawData)) + { + currAlarmsConf = JsonConvert.DeserializeObject>(rawData); + } + // altrimenti uso quelli di default inizialmente letti + else + { + currAlarmsConf = alarmsConf; + } + if (currAlarmsConf != null) + { + // ciclo x ogni bank di allarmi configurato + foreach (var alarmData in currAlarmsConf) + { + // recupero valore allarme + var bankVal = paramsList.FirstOrDefault(x => x.Key == alarmData.memAddr); + uint actVal = !string.IsNullOrEmpty(bankVal.Key) ? bankVal.Value : 0; + // valutare se dividere in 2 da 16... FIXME TODO + var bankAlarmList = AlarmsManager.processData(alarmData.memAddr, alarmData.messages, alarmData.silenceMask[0], alarmData.disableMask[0], alarmData.alarmsState[0], ref actVal); + // salvo nuovo valore in oggetto... + if (alarmData.alarmsState[0] != actVal) + { + alarmData.alarmsState[0] = actVal; + // aggiungo... + activeAlarmList.AddRange(bankAlarmList); + + AlarmLogModel newAlarm = new AlarmLogModel() + { + MachineId = MachineId, + DtRif = DateTime.Now, + MemAddress = bankVal.Key, + Index = alarmData != null ? alarmData.index : 0, + Status = alarmData != null ? (uint)bankVal.Value & alarmData.silenceMask[0] & alarmData.disableMask[0] : (uint)bankVal.Value, + ValDecoded = bankAlarmList.Count > 0 ? string.Join(", ", bankAlarmList) : "All OK" + }; + alarmLogList.Add(newAlarm); + } + } + } + + // salvo status aggiornato allarme... + redisDb.StringSet(Constants.ALARMS_SETT_KEY, JsonConvert.SerializeObject(currAlarmsConf)); + + // serializzo l'elenco allarmi... + string serAlarms = "[]"; + serAlarms = JsonConvert.SerializeObject(activeAlarmList); + // invio sulla message pipeline corretta TUTTI gli allarmi serializzati + alarmsPipe.saveAndSendMessage(Constants.ALARM_CURR_KEY, serAlarms); + if (dbController != null) + { + // salvo nel DB lo stato dei bank di allarme + foreach (var dbItem in alarmLogList) + { + _ = dbController.AlarmLogInsert(dbItem).Result; + } + } + } + } + catch + { } } }