Files
mapo-mono/MP.MONO.DECODER/ParamsManager.cs
2022-03-23 20:07:29 +01:00

159 lines
5.3 KiB
C#

using MP.MONO.Core;
using MP.MONO.Core.DTO;
using MP.MONO.Data.DbModels;
using NLog;
using NLua;
namespace MP.MONO.DECODER
{
public class ParamsManager
{
#region Private Fields
/// <summary>
/// Dizionario dei valori accumulati sulle variabili
/// </summary>
private Dictionary<string, VCData> ParamsAccumulator = new Dictionary<string, VCData>();
#endregion Private Fields
#region Protected Fields
protected static Logger Log = LogManager.GetCurrentClassLogger();
protected static string luaPath = "";
protected static Lua state = new Lua();
protected List<string> AlarmList = new List<string>();
#endregion Protected Fields
#region Public Fields
public static string alarmStatus = "";
public static bool valueChanged = false;
#endregion Public Fields
#region Public Constructors
public ParamsManager()
{
// preparo variabile x avvisare script che il modo è da NLua
luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "ParamsDecoder.lua");
state["callMode"] = "NLua";
state["lastVal"] = 0;
state["currVal"] = 0;
Log.Info("ParamsManager OK");
Console.WriteLine("ParamsManager OK");
}
#endregion Public Constructors
#region Public Methods
/// <summary>
/// Funzione chiamata LUA x calcolo degli eventuali parametri con periodi "scaduti"
/// </summary>
/// <param name="paramsList"></param>
/// <param name="redisParamConf"></param>
/// <returns></returns>
public List<DataLogModel> processData(Dictionary<string, double> paramsList, List<DisplayDataDTO> redisParamConf)
{
List<DataLogModel> answ = new List<DataLogModel>();
DateTime adesso = DateTime.Now;
// vado ad "accumulare i dati" a quelli presenti...
foreach (var item in paramsList)
{
var currParam = redisParamConf.FirstOrDefault(x => x.Title == item.Key);
// cerco nelle variabili accomulatori...
if (!ParamsAccumulator.ContainsKey(item.Key))
{
if (currParam != null)
{
var dataList = new List<double>();
dataList.Add(item.Value);
VCData newSet = new VCData()
{
dataArray = dataList,
DTStart = adesso,
Funzione = currParam.VcFunc,
Period = currParam.SamplePeriod
};
// se non ci fosse creo
ParamsAccumulator.Add(item.Key, newSet);
}
}
else
{
// altrimenti aggiungo
ParamsAccumulator[item.Key].dataArray.Add(item.Value);
}
// effettuo verifiche scadenza
if (ParamsAccumulator.ContainsKey(item.Key))
{
if (ParamsAccumulator[item.Key].isElapsed)
{
// se scaduto --> mando a LUA x calcolo
// FIXME TODO
var calcVal = ParamsAccumulator[item.Key].dataArray.FirstOrDefault();
#if false
// processing LUA del calcolo dei dati "scaduti"
//state["prefix"] = prefix;
//state["alarmList"] = alarmList;
//state["numAlarm"] = alarmList.Count;
//state["muteMask"] = muteMask;
//state["disableMask"] = disableMask;
// 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}");
}
}
#endif
// aggiungo alla lista finale...
var dbRecord = new DataLogModel()
{
DtRif = adesso,
FluxType = item.Key,
MachineId = 1,
ValNum = calcVal,
ValStr = $"{calcVal:N3}"
};
answ.Add(dbRecord);
// elimino dai valori accumulati...
ParamsAccumulator.Remove(item.Key);
}
}
}
return answ;
}
#endregion Public Methods
}
}