diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 6521af64..6da39bf9 100644 Binary files a/Libs/CMS_CORE_Library.dll and b/Libs/CMS_CORE_Library.dll differ diff --git a/Step.Model/DTOModels/DTOAlarmsModel.cs b/Step.Model/DTOModels/DTOAlarmsModel.cs index 94916477..0066b590 100644 --- a/Step.Model/DTOModels/DTOAlarmsModel.cs +++ b/Step.Model/DTOModels/DTOAlarmsModel.cs @@ -25,16 +25,127 @@ namespace Step.Model.DTOModels PlcAlarms.Clear(); ProcessAlarms.Clear(); } + + public override bool Equals(object obj) + { + var item = obj as DTOAlarmsModel; + + if(item == null) + return false; + + if (item.NcAlarms.Count != NcAlarms.Count || item.PlcAlarms.Count != this.PlcAlarms.Count || item.ProcessAlarms.Count != this.ProcessAlarms.Count) + return false; + + bool isEqual = item.NcAlarms.All(NcAlarms.Contains); + if (!isEqual) + return false; + + isEqual = item.PlcAlarms.All(PlcAlarms.Contains); + if (!isEqual) + return false; + + isEqual = item.ProcessAlarms.All(ProcessAlarms.Contains); + if (!isEqual) + return false; + + return true; + } + + public DTOAlarmsModel IntersectModels(DTOAlarmsModel newAlarms) + { + DTOAlarmsModel result = new DTOAlarmsModel(); + // Get common data + result.NcAlarms = NcAlarms.Where(x => 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); } }