Inizio classe x gestione parametri come allarmi
This commit is contained in:
@@ -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>
|
||||
@@ -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
@@ -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
|
||||
{ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user