Enhance Genesis configuration and validation mechanisms - Introduce new test methods for testing Genesis properties, boundary validations, runtime behavior, and tooltips with culture-specific fallback. - Expand configuration validation logic with enhanced error messaging and logging. - Simplify Genesis property UI: remove legacy settings and refactor controls for robust behavior. - Add detailed logging for runtime and configuration updates. - Provide tooltips and localized support for Genesis properties in multiple languages (e.g., `de`, `sk`). - Update project file to include new test files.
77 lines
3.1 KiB
C#
77 lines
3.1 KiB
C#
///
|
|
/// Copyright (c) 2015-2019 Sensus Metering Systems
|
|
/// Author: Milan Hanajík
|
|
///
|
|
using System;
|
|
using TBF.Rig.RegisterReaders.GenesisRegReader.implementations;
|
|
|
|
namespace TBF.Rig.TestMethods.GenesisCommunication
|
|
{
|
|
/// <summary>Tracks one completion per worker, activity and group.</summary>
|
|
public sealed class GenesisWorkerGroupCompletion
|
|
{
|
|
private readonly int workerCount;
|
|
private readonly System.Collections.Generic.HashSet<int> completed = new System.Collections.Generic.HashSet<int>();
|
|
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<int> 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);
|
|
}
|
|
}
|
|
}
|