From d44da33b2414cb54496f7444f44d97d5899bfdf1 Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Thu, 18 Jan 2018 18:19:10 +0100 Subject: [PATCH] * Fix signalR hub + Added alarms dateTime + Addded alarms equals and intersect function --- Libs/CMS_CORE_Library.dll | Bin 633344 -> 632832 bytes Step.Model/DTOModels/DTOAlarmsModel.cs | 115 +++++++++++++++++++++- Step.Model/DTOModels/DTOAxesModel.cs | 11 ++- Step.NC/NcHandler.cs | 5 +- Step.Tasks/ThreadsFunctions.cs | 2 + Step/Controllers/SignalR/NcHub.cs | 18 ++++ Step/Listeners/SignalR/SignalRListener.cs | 28 ++++-- 7 files changed, 167 insertions(+), 12 deletions(-) diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 6521af640b192d9afde067afa362159fc199685f..6da39bf9b4bfe19b1738fc81b3b3ca1b41c4ec68 100644 GIT binary patch delta 56239 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 tYuQ;dvLdiSHA newAlarms.NcAlarms.Contains(x as GenericAlarmModel)).ToList(); + // Concat common data + new data + result.NcAlarms = result.NcAlarms.Concat( + newAlarms.NcAlarms.Where(x => !NcAlarms.Contains(x as GenericAlarmModel)).ToList() // Find not contained data in the old list + ).ToList(); + + // Get common data + result.PlcAlarms = PlcAlarms.Where(x => newAlarms.PlcAlarms.Contains(x as GenericAlarmModel)).ToList(); + // Concat common data + new data + result.PlcAlarms = result.PlcAlarms.Concat( + newAlarms.PlcAlarms.Where(x => !PlcAlarms.Contains(x as GenericAlarmModel)).ToList() // Find not contained data in the old list + ).ToList(); + + // Get common data + result.ProcessAlarms = ProcessAlarms.Where(x => newAlarms.ProcessAlarms.Contains(x as ProcessAlarmModel)).ToList(); + + // Concat common data + new data in the list + result.ProcessAlarms = result.ProcessAlarms.Concat( + newAlarms.ProcessAlarms.Where(x => !ProcessAlarms.Contains(x as ProcessAlarmModel)).ToList() // Find not contained data in the old list + ).ToList(); + + return result; + } } - public struct GenericAlarmModel + public class GenericAlarmModel { public string alarmMessage; + public DateTime dateTime; + + public override bool Equals(object obj) + { + var item = obj as GenericAlarmModel; + + if (item == null) + return false; + + if (item.alarmMessage == alarmMessage) + return true; + else + return false; + } } - public struct ProcessAlarmModel + public class ProcessAlarmModel { public string alarmMessage; public ushort process; + public DateTime dateTime; + + public override bool Equals(object obj) + { + var item = obj as ProcessAlarmModel; + + if (item == null) + return false; + + if (item.process == process && item.alarmMessage == alarmMessage ) + return true; + else + return false; + } + } + class DTOAlarmsModelComparer : IEqualityComparer + { + public bool Equals(DTOAlarmsModel x, DTOAlarmsModel y) + { + if (x == null) + return false; + + if (x.NcAlarms.Count != y.NcAlarms.Count || x.PlcAlarms.Count != y.PlcAlarms.Count || x.ProcessAlarms.Count != y.ProcessAlarms.Count) + return false; + + bool isEqual = x.NcAlarms.All(y.NcAlarms.Contains); + if (!isEqual) + return false; + + isEqual = x.PlcAlarms.All(y.PlcAlarms.Contains); + if (!isEqual) + return false; + + isEqual = x.ProcessAlarms.All(y.ProcessAlarms.Contains); + if (!isEqual) + return false; + + return true; + } + + public int GetHashCode(DTOAlarmsModel obj) + { + throw new NotImplementedException(); + } } } diff --git a/Step.Model/DTOModels/DTOAxesModel.cs b/Step.Model/DTOModels/DTOAxesModel.cs index 82d89a98..910915c6 100644 --- a/Step.Model/DTOModels/DTOAxesModel.cs +++ b/Step.Model/DTOModels/DTOAxesModel.cs @@ -23,11 +23,20 @@ namespace Step.Model.DTOModels followingErr = new Dictionary(); } - public struct AxisModel { public string name; public double value; } + + public override bool Equals(object obj) + { + var item = obj as DTOAxesModel; + if (item == null) + return false; + + + return base.Equals(obj); + } } } diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index b4b3ec71..20e53f1f 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -127,6 +127,7 @@ namespace Step.NC alarms.NcAlarms.Add(new GenericAlarmModel() { alarmMessage = alarmMessage, + dateTime = DateTime.Now }); } @@ -147,7 +148,8 @@ namespace Step.NC alarms.ProcessAlarms.Add(new ProcessAlarmModel() { alarmMessage = alarmMessage, - process = i + process = i, + dateTime = DateTime.Now }); } } @@ -163,6 +165,7 @@ namespace Step.NC alarms.PlcAlarms.Add(new GenericAlarmModel() { alarmMessage = alarmMessage, + dateTime = DateTime.Now }); } diff --git a/Step.Tasks/ThreadsFunctions.cs b/Step.Tasks/ThreadsFunctions.cs index 69774080..e562fa8f 100644 --- a/Step.Tasks/ThreadsFunctions.cs +++ b/Step.Tasks/ThreadsFunctions.cs @@ -30,6 +30,7 @@ public static class ThreadsFunctions while (true) { sw.Restart(); + // Check if client is connected if (ncHandler.numericalControl.NC_IsConnected()) { // Get Alarms from NC @@ -45,6 +46,7 @@ public static class ThreadsFunctions ReadAlarmsTimer += sw.ElapsedMilliseconds; ReadAlarmsTimes++; + // Wait Thread.Sleep(200); } } diff --git a/Step/Controllers/SignalR/NcHub.cs b/Step/Controllers/SignalR/NcHub.cs index 93d56d4c..202b301e 100644 --- a/Step/Controllers/SignalR/NcHub.cs +++ b/Step/Controllers/SignalR/NcHub.cs @@ -9,6 +9,24 @@ namespace Step.Controllers.SignalR { public class NcHub : Hub { + public static List ConnectedClients = new List(); + public static bool NewConnectedClients = false; + public override Task OnConnected() + { + Groups.Add(Context.ConnectionId, "ncData"); + NewConnectedClients = true; + ConnectedClients.Add(Context.ConnectionId); + + return base.OnConnected(); + } + + public override Task OnDisconnected(bool stopCalled) + { + Groups.Remove(Context.ConnectionId, "ncData"); + ConnectedClients.Remove(Context.ConnectionId); + + return base.OnDisconnected(stopCalled); + } } } diff --git a/Step/Listeners/SignalR/SignalRListener.cs b/Step/Listeners/SignalR/SignalRListener.cs index afac65c8..f611b1aa 100644 --- a/Step/Listeners/SignalR/SignalRListener.cs +++ b/Step/Listeners/SignalR/SignalRListener.cs @@ -3,26 +3,38 @@ using System.Diagnostics; using System.Threading; using Microsoft.AspNet.SignalR; using Step.Controllers.SignalR; +using Step.Model.DTOModels; using TeamDev.SDK.MVVM; namespace Step.Listeners.SignalR { public static class SignalRListener { + private static DTOAlarmsModel alarms = new DTOAlarmsModel(); + private static DTOAxesModel axes = new DTOAxesModel(); + public static void SendNcInfoToClient(object taskName) { - var context = GlobalHost.ConnectionManager.GetHubContext(); - context.Clients.All.machineInfo(taskName); + var context = GlobalHost.ConnectionManager.GetHubContext(); + context.Clients.Group("ncData").machineInfo(taskName); } - public static void SendAlarmsToClient(object taskName) + + public static void SendAlarmsToClient(object newAlarmsData) { - var context = GlobalHost.ConnectionManager.GetHubContext(); - context.Clients.All.alarms(taskName); + var context = GlobalHost.ConnectionManager.GetHubContext(); + + //if (!alarms.Equals(newAlarmsData)) + //{ + // Intersect old alarms data with new data + alarms = alarms.IntersectModels(newAlarmsData as DTOAlarmsModel); + context.Clients.Group("ncData").alarms(alarms); + //} } - public static void SendAxesToClient(object taskName) + + public static void SendAxesToClient(object newAxesData) { - var context = GlobalHost.ConnectionManager.GetHubContext(); - context.Clients.All.axes(taskName); + var context = GlobalHost.ConnectionManager.GetHubContext(); + context.Clients.Group("ncData").axes(newAxesData); } }