Inizio classe x gestione parametri come allarmi

This commit is contained in:
Samuele Locatelli
2022-03-21 19:24:30 +01:00
parent 6a8ad2604f
commit e7c73cbce1
3 changed files with 234 additions and 34 deletions
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace MP.MONO.DECODER
{
public class AlarmManager
public class AlarmsManager
{
protected List<string> AlarmList = new List<string>();
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");
}
/// <summary>
+82
View File
@@ -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<string> AlarmList = new List<string>();
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");
}
/// <summary>
/// Funzione chiamata LUA x calcolo status allarmi
/// </summary>
/// <param name="prefix"></param>
/// <param name="alarmList"></param>
/// <param name="muteMask"></param>
/// <param name="disableMask"></param>
/// <param name="lastVal"></param>
/// <param name="currVal"></param>
/// <returns></returns>
public static List<string> processData(string prefix, List<string> 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<string> answ = new List<string>();
// 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<string> activeList = new List<string>();
foreach (var allarme in tabActive.Values)
{
answ.Add($"{allarme}");
}
}
return answ;
}
}
}
+148 -30
View File
@@ -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
* --------------------------------*/
/// <summary>
/// Gestione evento ricezione messaggio allarmi
/// Recupero da redis le conf (es modi,stati,allarmi)
/// </summary>
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<List<MachineStatus>>(rawData);
}
// machine mode
rawData = redisDb.StringGet(Constants.MODE_CONF_KEY);
if (!string.IsNullOrEmpty(rawData))
{
machineModeConf = JsonConvert.DeserializeObject<List<MachineMode>>(rawData);
}
// allarmi, versione base...
rawData = redisDb.StringGet(Constants.ALARMS_CONF_KEY);
if (!string.IsNullOrEmpty(rawData))
{
alarmsConf = JsonConvert.DeserializeObject<List<BaseAlarmConf>>(rawData);
}
}
/// <summary>
/// Gestione evento ricezione messaggi allarmi
/// </summary>
void AlarmsValPipe_EA_NewMessage(object? sender, EventArgs e)
{
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly List<string> --> 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)
}
}
/// <summary>
/// Recupero da redis le conf (es modi,stati,allarmi)
/// Gestione evento ricezione messaggi parametri
/// </summary>
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<string,int> --> parametri valorizzati (tra quelli configurati)
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
machineStatusConf = JsonConvert.DeserializeObject<List<MachineStatus>>(rawData);
}
try
{
// esempio conversione dati
#if false
List<DisplayDataDTO> answ = new List<DisplayDataDTO>();
// machine mode
rawData = redisDb.StringGet(Constants.MODE_CONF_KEY);
if (!string.IsNullOrEmpty(rawData))
{
machineModeConf = JsonConvert.DeserializeObject<List<MachineMode>>(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<List<BaseAlarmConf>>(rawData);
foreach (var item in answ)
{
item.Value = $"{item.ValueNum.ToString(item.DisplFormat)}";
}
return answ;
#endif
// verifico codici ricevuti
var paramsList = JsonConvert.DeserializeObject<Dictionary<string, uint>>(currArgs.newMessage);
if (paramsList != null)
{
// variabili accessorie
List<string> activeAlarmList = new List<string>();
List<AlarmLogModel> alarmLogList = new List<AlarmLogModel>();
// rileggo da REDIS la conf attuale allarmi da area ALARMS_SETT_KEY, altrimenti uso quella letta inizialmente da conf base
List<BaseAlarmConf>? currAlarmsConf = new List<BaseAlarmConf>();
string rawData = redisDb.StringGet(Constants.ALARMS_SETT_KEY);
// se trovati uso questi...
if (!string.IsNullOrEmpty(rawData))
{
currAlarmsConf = JsonConvert.DeserializeObject<List<BaseAlarmConf>>(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
{ }
}
}