/// /// Copyright (c) 2015-2019 Sensus Metering Systems /// Author: Milan Hanajík /// using System; using TBF.Rig.RegisterReaders.GenesisRegReader.implementations; namespace TBF.Rig.TestMethods.GenesisCommunication { /// Tracks one completion per worker, activity and group. public sealed class GenesisWorkerGroupCompletion { private readonly int workerCount; private readonly System.Collections.Generic.HashSet completed = new System.Collections.Generic.HashSet(); private int activity, group; private bool released; public GenesisWorkerGroupCompletion(int workerCount) { if (workerCount < 1 || workerCount > 10) throw new ArgumentOutOfRangeException(nameof(workerCount)); this.workerCount = workerCount; } public void Begin(int activityStep, int groupNumber) { lock (completed) { activity = activityStep; group = groupNumber; released = false; completed.Clear(); } } public bool Complete(int activityStep, int groupNumber, int worker) { lock (completed) { if (released || activityStep != activity || groupNumber != group || worker < 0 || worker >= workerCount) return false; if (!completed.Add(worker) || completed.Count != workerCount) return false; released = true; return true; } } public static System.Collections.Generic.IEnumerable BoardIndexes(int worker, int workers, int boards) { if (workers < 1 || workers > 10 || worker < 0 || worker >= workers || boards < 0) throw new ArgumentOutOfRangeException(); for (int index = worker; index < boards; index += workers) yield return index; } } public class CommCompletedEventArgs : EventArgs { public bool WorkerGroupCompleted; public int ActivityStep; public int Group; public int ThreadId; public int WMNr0; /// 0-based water meter position public GenesisSmartReader Ihead; public Results.Entities.WaterMeter Wm; public string CommMessage; public CommErr CommErr; public CommCompletedEventArgs(int threadId, int wmNr0, GenesisSmartReader ihead, Results.Entities.WaterMeter wm, string commMessage, CommErr commErr) { this.ThreadId = threadId; this.WMNr0 = wmNr0; this.Ihead = ihead; this.Wm = wm; this.CommMessage = commMessage; this.CommErr = commErr; } public override string ToString() { return string.Format("Thread={0} WMNr0={1} IHead={2} WM={3} CommMsg={4} CommErr={5}", ThreadId, WMNr0, (Ihead != null) ? Ihead.Name : "null", (Wm != null) ? Wm.WMPosition : -1, (CommMessage != null) ? CommMessage : "null", CommErr); } } }