Genesis heap

This commit is contained in:
Michal Buzik 2026-03-04 08:20:25 +01:00
parent b2276c086c
commit ab0e5ea82a
202 changed files with 255508 additions and 354 deletions

View File

@ -1,5 +1,5 @@
## Version History
| Version | Target Environment | Title | Description |
|------------|--------------------------------------------------------------|-----------------------------------------------------|------------------------------------|
| 3.9.2149.0 | HeatMeters, Heat meter sensors, Procedure Dilog, Tab Process | Excanged columns value 'Sensor' and 'Heat meter sensor' | Fix in code ProcedureDlg, row 1851 |
| Version | Source of change | Target Environment | Title | Description |
|------------|----------------------|--------------------------------------------------------------|-----------------------------------------------------|------------------------------------|
| 3.9.2149.0 | Michal databse error | HeatMeters, Heat meter sensors, Procedure Dilog, Tab Process | Excanged columns value 'Sensor' and 'Heat meter sensor' | Fix in code ProcedureDlg, row 1851 |

View File

@ -6,10 +6,13 @@ using System.Collections.Generic;
using System.Text;
using log4net;
using Common;
using Config.Entities;
using Results.Entities;
using TBF.Rig;
using TBF.Rig.GenericDevices;
using TBF.Boxes;
using TBF.Resources;
using TBF.Rig.TestMethods.GenesisCommunication.GenesisHead;
using TBF.UiBridge;
namespace TBF.Rig.TestMethods.FlyingStart
@ -135,6 +138,8 @@ namespace TBF.Rig.TestMethods.FlyingStart
Bridge.OnTestSelected(this, new TestSelectedEventArgs(test, repetitionNr, inPath, benchPath, outPath, sensPath, heatMetersPath));
string testName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr);
TestStartTime = DateTime.Now;
// Genesis switch
bool atleastOneGenesis = GenesisHeadBatch.Start(sensPath.RegisterReaders, Program.LocalSettings.LastSNTexts);
///
/// Optionally display prompt to emerge temperature meters to appropriate baths for heat meters test
@ -323,6 +328,20 @@ namespace TBF.Rig.TestMethods.FlyingStart
temperature_set:
//TODO genesis - check with genesis switch
if (atleastOneGenesis)
{
if (test.Name.ToLower().Contains("calib"))
{
GenesisHeadBatch.BatchHolder.Value.MetersLogin();
GenesisHeadBatch.BatchHolder.Value.MetersInitCalibration();
} else if (test.Name.ToLower().Contains("Init"))
{
GenesisHeadBatch.BatchHolder.Value.MetersLogin();
GenesisHeadBatch.BatchHolder.Value.MetersInitMeasurement();
}
}
///
/// Prepare cameras, ROI-s and measurementOperations
///
@ -358,7 +377,12 @@ namespace TBF.Rig.TestMethods.FlyingStart
foreach (var rr in sensPath.RegisterReaders)
{
if (rr is IRegReaderDatastream) (rr as IRegReaderDatastream).TestIsGoingToStartSoon(test, repetitionNr);
if (rr is IRegReaderDatastream)
(rr as IRegReaderDatastream).TestIsGoingToStartSoon(test, repetitionNr);
if (rr is GenesisHead) // Genesis - CORDONEL head
(rr as GenesisHead).StartRead(test.Name, BatchRslts.Batch.BatchNr, repetitionNr);
}
@ -426,8 +450,21 @@ namespace TBF.Rig.TestMethods.FlyingStart
/// Measurement loop end
StopRecordingStatistics();
//TODO genesis - check with genesis switch
if (atleastOneGenesis)
{
if (test.Name.ToLower().Contains("calib"))
{
GenesisHeadBatch.BatchHolder.Value.MetersStopCalibration();
}
else if (test.Name.ToLower().Contains("Init"))
{
GenesisHeadBatch.BatchHolder.Value.MetersStopMeasurement();
}
}
//------------------------------------------------
//------------------------------------------------
Bridge.OnActivity(this, Strings.Test_completed);
//------------------------------------------------
@ -589,6 +626,7 @@ namespace TBF.Rig.TestMethods.FlyingStart
GenericDevices.IRegReaderDatastream dstrReader = regReader as GenericDevices.IRegReaderDatastream;
TestMethods.iPerlCommunication.iPerlHead.IperlHead iPerl = regReader as TestMethods.iPerlCommunication.iPerlHead.IperlHead;
GenericDevices.IRegReaderLiveCamera cameraRoi = regReader as GenericDevices.IRegReaderLiveCamera;
GenesisHead Genesis = regReader as GenesisHead;
if (meterRslt != null && regReader != null)
{
@ -596,83 +634,147 @@ namespace TBF.Rig.TestMethods.FlyingStart
meterRslt.PulsesPerLiter = regReader.PulsesPerLtr;
meterRslt.PulsesMeter = Convert.ToDouble(regReader.WMPulses);
if (dstrReader != null)
{
meterRslt.TimestampStart = dstrReader.TimestampSecStart;
meterRslt.TimestampEnd = dstrReader.NoSamples ? (dstrReader.TimestampSecStart + tstRslt.TestTime) : dstrReader.TimestampSecEnd;
meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart;
meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter
meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter
meterRslt.VolumeMeter = Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart);
meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster = tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
if (Genesis != null)
{
Genesis.Stop(tstRslt.TestTime, tstRslt.VolumeCTV);
if (iPerl != null)
meterRslt.TimestampStart = Genesis.TimestampSecStart;
meterRslt.TimestampEnd = Genesis.TimestampSecEnd;
meterRslt.TestTime = Genesis.WMTestTime;
meterRslt.VolumeStart = Genesis.BeginWMState;
meterRslt.VolumeEnd = Genesis.EndWMState; /// liter
meterRslt.VolumeMeter = Math.Abs(Genesis.WMVolume);
meterRslt.VolumeRef = tstRslt.VolumeCTV;
if (GenesisHeadBatch.MeterIdDetailResults == null)
{
if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode & (int)Results.Entities.ResultCode.OptoErrorCodeMask) == 0)
Genesis.Log("MeterIdDetailResults na!");
}
else
{
if (Genesis.DetailedResults != null)
{
meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode;
try
{
GenesisHeadBatch.MeterIdDetailResults.Add(meterRslt.SerialNr(), Genesis.DetailedResults);
}
catch (Exception ex) { Genesis.Log(ex.Message.ToString()); }
}
#if IPERL
meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor;
meterRslt.ExtraDataPath = iPerl.ExtraDataPath;
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1) meterRslt.X1 = iPerl.X[0];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2) meterRslt.X2 = iPerl.X[1];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 3) meterRslt.X3 = iPerl.X[2];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 4) meterRslt.X4 = iPerl.X[3];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 5) meterRslt.X5 = iPerl.X[4];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 6) meterRslt.X6 = iPerl.X[5];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 7) meterRslt.X7 = iPerl.X[6];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 8) meterRslt.X8 = iPerl.X[7];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 9) meterRslt.X9 = iPerl.X[8];
#endif
iPerl.LastTestResult2 = iPerl.LastTestResult; /// Save shift previous test result
iPerl.LastTestResult = meterRslt; /// Save this test result
}
}
else if (cameraRoi != null)
{
meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second
meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second
meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter
meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter
meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter
if (meterRslt.VolumeMeter != 0)
{
/// Normal measurement with camera
meterRslt.TestTime = cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second
meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster = tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
}
else
{
/// None or one pulse from the water meter using camera
meterRslt.TestTime = tstRslt.TestTime;
meterRslt.VolumeRef = tstRslt.VolumeCTV;
meterRslt.PulsesMaster = tstRslt.PulsesMaster;
else
{
Genesis.Log("DetailedResults na!");
}
}
Genesis.Log("VolumeRef=" + meterRslt.VolumeRef);
Genesis.Log("TestTime Meter =" + meterRslt.TestTime + "S, test time ref =" + tstRslt.TestTime + "s");
Genesis.Log(" results for " + test.Name);
Genesis.Log(" Ref Vol = " + meterRslt.VolumeRef + " m³");
Genesis.Log(" Ref Time = " + tstRslt.TestTime + " s");
Genesis.Log(" Meter Time = " + meterRslt.TestTime + " s");
Genesis.Log(" Meter Vol = " + meterRslt.VolumeMeter + " m³");
var calError = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef);
Genesis.Log(" MeterError = " + calError.ToString() + " %");
}
else
{
meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses);
meterRslt.VolumeStart = 0;
meterRslt.VolumeEnd = 0;
meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter
///
if (regReader.WMPulses >= 1)
{
/// Normal measurement
meterRslt.TestTime = cBrd.TestTimeWM(regReader.Position);
meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter
}
else
{
/// None or one pulse from the water meter
meterRslt.TestTime = tstRslt.TestTime;
meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter
}
else
{
if (dstrReader != null)
{
meterRslt.TimestampStart = dstrReader.TimestampSecStart;
meterRslt.TimestampEnd = dstrReader.NoSamples
? (dstrReader.TimestampSecStart + tstRslt.TestTime)
: dstrReader.TimestampSecEnd;
meterRslt.TestTime = meterRslt.TimestampEnd - meterRslt.TimestampStart;
meterRslt.VolumeStart = dstrReader.VolumeLtrStart; /// liter
meterRslt.VolumeEnd = dstrReader.VolumeLtrEnd; /// liter
meterRslt.VolumeMeter =
Math.Abs(dstrReader.VolumeLtrEnd - dstrReader.VolumeLtrStart);
meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster =
tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
if (iPerl != null)
{
if (iPerl.ResultCode != 0 && (meterRslt.WaterMeter.ResultCode &
(int)Results.Entities.ResultCode
.OptoErrorCodeMask) == 0)
{
meterRslt.WaterMeter.ResultCode |= iPerl.ResultCode;
}
#if IPERL
meterRslt.WaterMeter.CalibFactor = iPerl.CalibFactor;
meterRslt.ExtraDataPath = iPerl.ExtraDataPath;
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 1)
meterRslt.X1 = iPerl.X[0];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 2)
meterRslt.X2 = iPerl.X[1];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 3)
meterRslt.X3 = iPerl.X[2];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 4)
meterRslt.X4 = iPerl.X[3];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 5)
meterRslt.X5 = iPerl.X[4];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 6)
meterRslt.X6 = iPerl.X[5];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 7)
meterRslt.X7 = iPerl.X[6];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 8)
meterRslt.X8 = iPerl.X[7];
if (TestMethods.iPerlCommunication.iPerlHead.IperlHead.FeatureVectorSize >= 9)
meterRslt.X9 = iPerl.X[8];
#endif
iPerl.LastTestResult2 =
iPerl.LastTestResult; /// Save shift previous test result
iPerl.LastTestResult = meterRslt; /// Save this test result
}
}
else if (cameraRoi != null)
{
meterRslt.TimestampStart = cameraRoi.TimestampStart; /// second
meterRslt.TimestampEnd = cameraRoi.TimestampEnd; /// second
meterRslt.VolumeStart = cameraRoi.VolumeStart; /// liter
meterRslt.VolumeEnd = cameraRoi.VolumeEnd; /// liter
meterRslt.VolumeMeter = cameraRoi.VolumeEnd - cameraRoi.VolumeStart; /// liter
if (meterRslt.VolumeMeter != 0)
{
/// Normal measurement with camera
meterRslt.TestTime =
cameraRoi.TimestampEnd - cameraRoi.TimestampStart; /// second
meterRslt.VolumeRef = tstRslt.VolumeCTV * meterRslt.TestTime / tstRslt.TestTime;
meterRslt.PulsesMaster =
tstRslt.PulsesMaster * meterRslt.TestTime / tstRslt.TestTime;
}
else
{
/// None or one pulse from the water meter using camera
meterRslt.TestTime = tstRslt.TestTime;
meterRslt.VolumeRef = tstRslt.VolumeCTV;
meterRslt.PulsesMaster = tstRslt.PulsesMaster;
}
}
else
{
meterRslt.PulsesMaster = Convert.ToDouble(regReader.WMRefPulses);
meterRslt.VolumeStart = 0;
meterRslt.VolumeEnd = 0;
meterRslt.VolumeMeter = meterRslt.PulsesMeter * regReader.LtrsPerPulse; /// liter
///
if (regReader.WMPulses >= 1)
{
/// Normal measurement
meterRslt.TestTime = cBrd.TestTimeWM(regReader.Position);
meterRslt.VolumeRef = meterRslt.PulsesMaster * tstRslt.ConstMaster; /// liter
}
else
{
/// None or one pulse from the water meter
meterRslt.TestTime = tstRslt.TestTime;
meterRslt.VolumeRef = tstRslt.VolumeCTV; /// liter
}
}
}
meterRslt.Error = Formulas.ErrorFromVolumes(meterRslt.VolumeMeter, meterRslt.VolumeRef);
@ -724,10 +826,14 @@ namespace TBF.Rig.TestMethods.FlyingStart
/// Append the results to the CSV-file
allResults.Info(TestResult2CsvLine(testName, test.Part));
//TODO genesis - process result writing
//ProcessDatabaseResultsWriting(test, tstRslt);
if (stopCycle) retVal = Event.ErrorFlagsStop;
stopTest:
GenesisHeadBatch.BatchHolder.Value.RemoveAllMeters();
StopRecordingStatistics();
cBrd.StopAll(false);
@ -748,8 +854,36 @@ namespace TBF.Rig.TestMethods.FlyingStart
return new List<Event> { retVal };
}
//backup how work genesis - not a clean code!
// private void ProcessDatabaseResultsWriting(Test test, TestRslt tstRslt)
// {
// IList<Event> e;
// if (!String.IsNullOrEmpty(test.Procedure.ResultsWriter))
// {
// string[] writers = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' });
// foreach (var writerName in writers)
// {
// IResultsWriter writer = TbfComponents.FindComponent(writerName) as IResultsWriter;
// if (writer != null && writer is )
// {
// var SensusLaWriter = ((DB.SensusLa.Database)writer);
//
// State.Create(string.Format("{0}({1}) : Store results into db.", test.Method, test.Name))
// .AddOperation(checkUiOp)
// .AddOperation(SensusLaWriter.WriteResultsOp(tstRslt, BatchRslts, GenesisHeadBatch.MeterIdDetailResults))
// .EnterState();
// do
// {
// e = StateMachine.WaitRunDevsRunOps();
// }
// while (!e.Contains(Event.Error) && !e.Contains(Event.ResultsWritten) && !e.Contains(Event.ResultsNotWritten));
// }
// }
// }
// }
IList<Event> Simulate(Config.Entities.Test test, int repetitionNr, bool isLastRepetition,
IList<Event> Simulate(Config.Entities.Test test, int repetitionNr, bool isLastRepetition,
Compound.TestParams compoundTestParams,
HeatMeters.TestParams heatMetersTestParams,
Common.DebugMode debugLevel)

View File

@ -0,0 +1,197 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class CalibrationStruct
{
public static readonly int Length = 35;
public Byte Version;
public MeterType MeterType;
public UInt16 Calibration;
public VolumeUnits VolumeUnits;
public FlowArrow FlowArrow;
public UInt16 FWVersion;
public UInt16[] TargetField;
public UInt16 RecipMeanCurrent;
public UInt16 ThresholdVolume;
public UInt16 ThresholdTime;
public UInt16 FlowActivationThr;
public UInt16 VolumeArrowThr;
public UInt32 CalibrationTime;
public ulong SerialNumber;
public MeterSealed MeterSealed;
public byte CheckSum;
public CalibrationStruct()
{
TargetField = new UInt16[3];
}
public byte[] ToByteArray()
{
byte[] result = new byte[Length];
result[0] = Version;
result[1] = (byte)MeterType;
result[2] = (byte)(Calibration & 0x00FF);
result[3] = (byte)((Calibration >> 8) & 0x00FF);
result[4] = (byte)VolumeUnits;
result[5] = (byte)FlowArrow;
result[6] = (byte)(FWVersion & 0x00FF);
result[7] = (byte)((FWVersion >> 8) & 0x00FF);
result[8] = (byte)( TargetField[0] & 0x00FF);
result[9] = (byte)((TargetField[0] >> 8) & 0x00FF);
result[10] = (byte)( TargetField[1] & 0x00FF);
result[11] = (byte)((TargetField[1] >> 8) & 0x00FF);
result[12] = (byte)( TargetField[2] & 0x00FF);
result[13] = (byte)((TargetField[2] >> 8) & 0x00FF);
result[14] = (byte)(RecipMeanCurrent & 0x00FF);
result[15] = (byte)((RecipMeanCurrent >> 8) & 0x00FF);
result[16] = (byte)(ThresholdVolume & 0x00FF);
result[17] = (byte)((ThresholdVolume >> 8) & 0x00FF);
result[18] = (byte)(ThresholdTime & 0x00FF);
result[19] = (byte)((ThresholdTime >> 8) & 0x00FF);
result[20] = (byte)(FlowActivationThr & 0x00FF);
result[21] = (byte)((FlowActivationThr >> 8) & 0x00FF);
result[22] = (byte)(VolumeArrowThr & 0x00FF);
result[23] = (byte)((VolumeArrowThr >> 8) & 0x00FF);
result[24] = (byte)(CalibrationTime & 0x000000FF);
result[25] = (byte)((CalibrationTime >> 8) & 0x000000FF);
result[26] = (byte)((CalibrationTime >> 16) & 0x000000FF);
result[27] = (byte)((CalibrationTime >> 24) & 0x000000FF);
result[28] = (byte)(SerialNumber & 0x00000000000000FF);
result[29] = (byte)((SerialNumber >> 8) & 0x00000000000000FF);
result[30] = (byte)((SerialNumber >> 16) & 0x00000000000000FF);
result[31] = (byte)((SerialNumber >> 24) & 0x00000000000000FF);
result[32] = (byte)((SerialNumber >> 32) & 0x00000000000000FF);
result[33] = (byte)MeterSealed;
result[34] = CheckSum;
return result;
}
/// <summary>
/// Create a calibration structure from a complete byte array
/// </summary>
/// <param name="data">A complete byte array data</param>
/// <returns>CalibrationStruct or null when byte array was not complete</returns>
public static CalibrationStruct FromByteArray(byte[] data)
{
if (data.Length != Length) return null;
CalibrationStruct result = new CalibrationStruct();
result.Version = data[0];
result.MeterType = (MeterType)data[1];
result.Calibration = (UInt16)(data[2] + 256 * data[3]);
result.VolumeUnits = (VolumeUnits)data[4];
result.FlowArrow = (FlowArrow)data[5];
result.FWVersion = (UInt16)(data[6] + 256 * data[7]);
result.TargetField[0] = (UInt16)(data[8] + 256 * data[9]);
result.TargetField[1] = (UInt16)(data[10] + 256 * data[11]);
result.TargetField[2] = (UInt16)(data[12] + 256 * data[13]);
result.RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]);
result.ThresholdVolume = (UInt16)(data[16] + 256 * data[17]);
result.ThresholdTime = (UInt16)(data[18] + 256 * data[19]);
result.FlowActivationThr = (UInt16)(data[20] + 256 * data[21]);
result.VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]);
result.CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24];
result.SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28];
result.MeterSealed = (MeterSealed)data[33];
result.CheckSum = data[34];
return result;
}
/// <summary>
/// Update the calibration structure from an incomplete byte array
/// </summary>
/// <param name="data">Byte array data</param>
/// <param name="offset">Offset of byte array data in CalibrationStruct</param>
/// <returns>true when successful, false when data are not appropriate</returns>
public bool Update(byte[] data, int offset)
{
if (offset == 2 && data.Length == 2)
{
/// Data containing iPerl calibration factor
Calibration = (UInt16)(data[2 - offset] + 256 * data[3 - offset]);
return true;
}
else if (offset == 0 && data.Length == Length)
{
/// Data containing a complete CalibrationStruct
Version = data[0];
MeterType = (MeterType)data[1];
Calibration = (UInt16)(data[2] + 256 * data[3]);
VolumeUnits = (VolumeUnits)data[4];
FlowArrow = (FlowArrow)data[5];
FWVersion = (UInt16)(data[6] + 256 * data[7]);
TargetField[0] = (UInt16)(data[8] + 256 * data[9]);
TargetField[1] = (UInt16)(data[10] + 256 * data[11]);
TargetField[2] = (UInt16)(data[12] + 256 * data[13]);
RecipMeanCurrent = (UInt16)(data[14] + 256 * data[15]);
ThresholdVolume = (UInt16)(data[16] + 256 * data[17]);
ThresholdTime = (UInt16)(data[18] + 256 * data[19]);
FlowActivationThr = (UInt16)(data[20] + 256 * data[21]);
VolumeArrowThr = (UInt16)(data[22] + 256 * data[23]);
CalibrationTime = (((UInt32)data[27] * 256 + data[26]) * 256 + data[25]) * 256 + data[24];
SerialNumber = ((((UInt64)data[32] * 256 + data[31]) * 256 + data[30]) * 256 + data[29]) * 256 + data[28];
MeterSealed = (MeterSealed)data[33];
CheckSum = data[34];
return true;
}
else
return false;
}
public string FWVersionStr()
{
int d1 = (FWVersion >> 8) & 0x000F;
int d2 = (FWVersion >> 12) & 0x000F;
int d3 = (FWVersion >> 4) & 0x000F;
int d4 = FWVersion & 0x000F;
return string.Format("{0}.{1}{2}{3}", d1, d2, d3, d4);
}
public override string ToString()
{
return string.Format("Calibration: V{0} Type={1} Cal={2} Units={3} FlowArrow.{4} FW={5} Hi={6} Norm={7} Low={8} RMC={9} ThrVol={10} ThrTime={11} FlActThr={12} VolArrThr={13} CalTm={14} SN={15} MeterSealed={16} Chksum={17}",
Version,
MeterType,
Calibration,
VolumeUnits,
FlowArrow,
FWVersion,
TargetField[0],
TargetField[1],
TargetField[2],
RecipMeanCurrent,
ThresholdVolume,
ThresholdTime,
FlowActivationThr,
VolumeArrowThr,
CalibrationTime,
SerialNumber,
MeterSealed,
CheckSum.ToString("X2"));
}
}
}

View File

@ -0,0 +1,225 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class ConfigStruct
{
public const int Length = 32;
public Byte Version; /// 0: 1 byte
public MeterState MeterState; /// 1: 1 byte
public UInt32 TargetTimeVeryLowBatt; /// 2: 4 bytes in seconds
public UInt32 TargetTimeLowBatt; /// 6: 4 bytes, in seconds
public UInt32 TestModeTime; /// 10: 4 bytes, Max. test mode time in seconds
public UInt16 EmptyPipeThreshold; /// 14: 2 bytes
public byte[] PCBNumber; /// 16: 5 bytes
public byte TestModeConfig; /// 21: 1 byte
public UInt32 RadioAddress; /// 22: 4 bytes
public UInt16 TempCalibration; /// 26: 2 bytes
public UInt16 AlarmMask; /// 28: 2 bytes, Default 0xA3F7
public UInt16 ConfigCheckSum; /// 30: 2 bytes
public ConfigStruct()
{
PCBNumber = new byte[5];
}
public byte[] ToByteArray()
{
byte[] result = new byte[Length];
result[0] = Version;
result[1] = (byte)MeterState;
result[2] = (byte)(TargetTimeVeryLowBatt & 0x000000FF);
result[3] = (byte)((TargetTimeVeryLowBatt >> 8) & 0x000000FF);
result[4] = (byte)((TargetTimeVeryLowBatt >> 16) & 0x000000FF);
result[5] = (byte)((TargetTimeVeryLowBatt >> 24) & 0x000000FF);
result[6] = (byte)(TargetTimeLowBatt & 0x000000FF);
result[7] = (byte)((TargetTimeLowBatt >> 8) & 0x000000FF);
result[8] = (byte)((TargetTimeLowBatt >> 16) & 0x000000FF);
result[9] = (byte)((TargetTimeLowBatt >> 24) & 0x000000FF);
result[10] = (byte)(TestModeTime & 0x000000FF);
result[11] = (byte)((TestModeTime >> 8) & 0x000000FF);
result[12] = (byte)((TestModeTime >> 16) & 0x000000FF);
result[13] = (byte)((TestModeTime >> 24) & 0x000000FF);
result[14] = (byte)(EmptyPipeThreshold & 0x00FF);
result[15] = (byte)((EmptyPipeThreshold >> 8) & 0x00FF);
result[16] = PCBNumber[0];
result[17] = PCBNumber[1];
result[18] = PCBNumber[2];
result[19] = PCBNumber[3];
result[20] = PCBNumber[4];
result[21] = TestModeConfig;
result[22] = (byte)(RadioAddress & 0x000000FF);
result[23] = (byte)((RadioAddress >> 8) & 0x000000FF);
result[24] = (byte)((RadioAddress >> 16) & 0x000000FF);
result[25] = (byte)((RadioAddress >> 24) & 0x000000FF);
result[26] = (byte)(TempCalibration & 0x00FF);
result[27] = (byte)((TempCalibration >> 8) & 0x00FF);
result[28] = (byte)(AlarmMask & 0x00FF);
result[29] = (byte)((AlarmMask >> 8) & 0x00FF);
result[30] = (byte)(ConfigCheckSum & 0x00FF);
result[31] = (byte)((ConfigCheckSum >> 8) & 0x00FF);
return result;
}
/// <summary>
/// Create a configuration structure from a complete byte array
/// </summary>
/// <param name="data">A complete byte array data</param>
/// <returns>ConfigStruct or null when byte array was not complete</returns>
public static ConfigStruct FromByteArray(byte[] data)
{
if (data.Length != Length) return null;
ConfigStruct result = new ConfigStruct();
result.Version = data[0];
result.MeterState = (MeterState)data[1];
result.TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2];
result.TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6];
result.TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10];
result.EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]);
result.PCBNumber[0] = data[16];
result.PCBNumber[1] = data[17];
result.PCBNumber[2] = data[18];
result.PCBNumber[3] = data[19];
result.PCBNumber[4] = data[20];
result.TestModeConfig = data[21];
result.RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22];
result.TempCalibration = (UInt16)(data[27] * 256 + data[26]);
result.AlarmMask = (UInt16)(data[29] * 256 + data[28]);
result.ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]);
return result;
}
/// <summary>
/// Update the configuration structure from an incomplete byte array
/// </summary>
/// <param name="offset">Offset of byte array data in ConfigStruct</param>
/// <param name="data">Byte array data</param>
/// <returns>true when successful, false when data are not appropriate</returns>
public bool Update(int offset, byte[] data)
{
if (offset == 0 && data.Length == 2)
{
/// iPerl mode of function
Version = data[0];
MeterState = (MeterState)data[1];
return true;
}
else if (offset == 0 && data.Length == 4)
{
/// iPerl mode of function and extra 2 bytes
Version = data[0];
MeterState = (MeterState)data[1];
return true;
}
else if (offset == 21 && data.Length == 1)
{
/// TestModeConfig value
TestModeConfig = data[21 - offset];
return true;
}
else if (offset == 0 && data.Length == Length)
{
/// Complete ConfigStruct
Version = data[0];
MeterState = (MeterState)data[1];
TargetTimeVeryLowBatt = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2];
TargetTimeLowBatt = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6];
TestModeTime = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10];
EmptyPipeThreshold = (UInt16)(data[15] * 256 + data[14]);
PCBNumber[0] = data[16];
PCBNumber[1] = data[17];
PCBNumber[2] = data[18];
PCBNumber[3] = data[19];
PCBNumber[4] = data[20];
TestModeConfig = data[21];
RadioAddress = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22];
TempCalibration = (UInt16)(data[27] * 256 + data[26]);
AlarmMask = (UInt16)(data[29] * 256 + data[28]);
ConfigCheckSum = (UInt16)(data[31] * 256 + data[30]);
return true;
}
else
return false;
}
/// <summary>
/// Returns PCB number string (12 characters, 12 decimal digits)
/// </summary>
/// <returns>PCB number STRING</returns>
public string GetPcbNrString()
{
return PCBNumber2String(this.PCBNumber);
}
/// <summary>
/// Converts PCBNumber to string (12 characters, 12 decimal digits)
/// </summary>
/// <param name="pcbNumber"></param>
/// <returns>PCB number string</returns>
public static string PCBNumber2String(byte[] pcbNumber)
{
if (pcbNumber.Length != 5) return string.Empty;
Int64 number = 0;
for (int i = 4; i >= 0; i--)
{
number = 256 * number + (Int64)pcbNumber[i];
}
return number.ToString();
}
public override string ToString()
{
return string.Format("Config: V{0} State={1} VLoBattT={2}s LoBattT={3}s TestModeT={4}s EPThld={5} PCB#={6} TMCfg={7} RadioAddr={8} TempCalib={9} AlarmMask={10} CfgCheckSum={11}",
Version,
MeterState,
TargetTimeVeryLowBatt,
TargetTimeLowBatt,
TestModeTime,
EmptyPipeThreshold,
GetPcbNrString(),
TestModeConfig.ToString("X2"),
RadioAddress,
TempCalibration,
AlarmMask.ToString("X4"),
ConfigCheckSum.ToString("X4"));
}
public string ToString(int sel)
{
return string.Format("{1} PCB#={6} TMCfg={7}",
Version,
MeterState,
TargetTimeVeryLowBatt,
TargetTimeLowBatt,
TestModeTime,
EmptyPipeThreshold,
GetPcbNrString(),
TestModeConfig.ToString("X2"),
RadioAddress,
TempCalibration,
AlarmMask.ToString("X4"),
ConfigCheckSum.ToString("X4"));
}
}
}

View File

@ -0,0 +1,110 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public enum MessageID
{
Calibration = 0x00, /// Access to stCalibration
Configuration = 0x01, /// Access to stConfig
Status = 0x02, /// Access to stStaus, read only
Power = 0x03, /// Access to stPower, containing power info from both processors
LCD = 0x04, /// Access to stLCD
EventData = 0x05, /// NOT USED
IntervalData = 0x06, /// NOT USED
Diagnostics = 0x07, /// Access tostMetroDiagArray, read onl
MetrologyMemory = 0x08, /// Memory block access, read only
Error_LongAck = 0x09, /// Error message
Command = 0x0A, /// Command to execute, with no arguments
Parameterizing = 0x0B, /// Parameterizing message is used in MCI-SPI interface only
Error_ShortAck = 0x0C, /// Short acknowledge message is used in MCI-SPI interface only
ChanelAlive = 0x0D, /// Channel alive message is used in MCI-SPI interface only
RadioPassthrough = 0x0E, /// RFID <-> Metrology <-> Radio passthrough message
ASICRegisterReadTest = 0x0F, /// ASIC Register read test
IMIDebugMessagesAccess = 0x10, /// IMI debug messages read test
ProductionChecksumsRead = 0x11, /// Production checksum read: Calibration (1 byte), Configuration (2 bytes), spare (4 bytes)
HardwareParametersTest = 0x12, /// Hardware Parameters Testing: User configurable fixed field drive time (1 byte)
/// <summary>
/// Notes:
/// 1. Short Ack message contains 1-byte error code and all the fields (Offset, Payload length, payload and password) will not be present.
/// 2. Channel Alive message does not contain the fields (Offset, Payload length, payload and password).
/// 3. Except the above two special messages, rest all the messages in the above table will follow the message format mentioned in sections 3.1 and 3.2.
/// </summary>
Count /// Number of MessageID-s
}
public enum MeterType : byte
{
DN15 = 0,
CoaxManifold = 1,
DN20 = 2,
DN25 = 3,
DN26 = 4, /// DN25*
DN32 = 5,
DN40 = 6,
AutoDetect,
Count /// Number of meter types
}
public enum VolumeUnits : byte
{
m3 = 0,
UK_gallon = 1,
US_gallon = 2,
Count /// Number of volume units
}
public enum FlowArrow : byte
{
No = 0,
Right = 1,
Left = 2,
Count /// Number of flow arrows
}
public enum MeterSealed : byte
{
InProduction = 0x00,
OutOfProduction = 0xA5,
Sealed = 0x5A,
}
public enum MeterState : byte
{
None = 0,
Idle = 1,
Active = 2,
Test = 3,
EndOfLife = 4,
Count /// Number of meter states
}
public enum FlowState : byte
{
No = 0,
Reverse = 1,
Forward = 2,
EmptyPipe = 3,
Count /// Number of flow states
}
public enum OptoTelegramFlags : byte
{
OK = 0,
OK_TestStart,
OK_TestEnd,
InvalidTelegram, /// Wrong telegram format of checksum error
SyncError,
}
public enum OptoState
{
Read,
Flush,
}
}

View File

@ -0,0 +1,26 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System.Collections.Generic;
using TBF.Rig.Generic;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class Factory : IComponentFactory
{
public string ClassName { get { return "RegisterReader for Genesis"; } }
public void ResetStaticProperties() { GenesisHead.ResetStaticProperties(); }
public IComponent DummyComponent() { return new GenesisHead(); }
public IComponent GetComponent(IComponentCfg cfg, IList<IComponent> components) { return new GenesisHead(cfg); }
public IComponentCfg DefaultConfig() { return new GenesisHeadCfg(this); }
public IComponentCfg CmpntCfgFromCmpntEntity(Config.Entities.Component component)
{
return ComponentCfgBase.CreateFromDbEntity(GenesisHeadCfg.Serializer, component, this);
}
}
}

View File

@ -0,0 +1,638 @@
using Config.Entities;
using log4net;
///
/// Copyright (c) 2015-2018 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using TBF.Rig.Generic;
using TBF.Rig.GenericDevices;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Metrology.Measurements;
using Xylem.Common.Metrology.Measurements.Consts;
using Common;
using System.IO.Ports;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public static class GenesisHeadBatch
{
public static Dictionary<string, List<MeasurementResults>> MeterIdDetailResults = new Dictionary<string, List<MeasurementResults>>();
private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadBatch));
public static readonly Lazy<MeterBatch> BatchHolder = new Lazy<MeterBatch>(() =>
{
return new MeterBatch();
});
internal static bool Start(IRegReader[] registerReaders, string[] lastSNTexts)
{
try
{
MeterIdDetailResults = new Dictionary<string, List<MeasurementResults>>();
int index = 0;
var ret = false;
foreach (var rr in registerReaders)
{
if (rr is TestMethods.GenesisCommunication.GenesisHead.GenesisHead)
{
if (!string.IsNullOrEmpty(lastSNTexts[index]))
{
var myGenesis = ((TestMethods.GenesisCommunication.GenesisHead.GenesisHead)rr).SetUp();
myGenesis.SerialNumber = lastSNTexts[index];
ret = true;
}
}
index = index + 1;
}
return ret;
}
catch (Exception ex)
{
log.Fatal(ex.Message, ex);
return false;
}
}
}
/// <summary>
/// This component = instance of this class is a placeholder for a combined main watermeter
/// </summary>
public class GenesisHead : ComponentBase, IDevice, GenericDevices./*IRegisterReader*/IRegReader, IOperation
{
public List<MeasurementResults> DetailedResults { get; set; }
private static readonly ILog log = LogManager.GetLogger(typeof(GenesisHead));
public override string ToString() { return string.Format("Genesis({0})", Cfg.ToString(1)); }
public RegisterReaderType RegisterReaderType { get { return RegisterReaderType.DataStream; } }
private readonly GenesisHeadCfg genesisHeadCfg;
public int SlotNr { get { return genesisHeadCfg.SlotNr; } }
public double PulsesPerLtr { get { return 1000.0; } }
public double LtrsPerPulse { get { return 1 / PulsesPerLtr; } }
public string QuantityUnits { get; set; }
public int Position { get; }//...MF
double IRegReader.PulsesPerLtr { get; set; }
// Adding the missing static method to resolve the error. ...MF
public static void ResetStaticProperties()
{
// Add logic to reset static properties here, if applicable.
// If no static properties exist, this method can remain empty.
}
#if ORACLE_DB
public int WMType_ID { get { return iperlHeadCfg.ProcParams.WMType_ID; } } /// Required by Oracle DB
public int WMType_Rev { get { return iperlHeadCfg.ProcParams.WMType_Rev; } } /// Required by Oracle DB
#endif
public float CalibTarget { get { return (ushort)genesisHeadCfg.ProcParams.CalibTarget; } }
public ushort FactorLimitLo { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitLo; } }
public ushort FactorLimitHi { get { return (ushort)genesisHeadCfg.ProcParams.FactorLimitHi; } }
/// Properties set by the Begin and the End form
//todo rd implement
public string SerialNr;
public string EndState
{
get { return endState; }
set { endState = value; }
}
private string endState;
public string BeginState
{
get { return beginState; }
set { beginState = value; }
}
private string beginState;
public bool Disabled
{
get { return disabled; }
set { disabled = value; }
}
private bool disabled;
public bool CommFailed
{
get { return commFailed; }
set { commFailed = value; }
}
private bool commFailed;
public int ResultCode
{
get { return resultCode; }
}
private int resultCode;
/// <summary> ConfigStruct of the water meter obtained or updated by iPerlCommunication </summary>
public ConfigStruct ConfigStruct
{
get { return configStruct; }
set { configStruct = value; }
}
private ConfigStruct configStruct;
/// <summary> CalibrationStruct of the water meter obtained or updated by iPerlCommunication </summary>
public CalibrationStruct CalibrationStruct
{
get { return calibrationStruct; }
set { calibrationStruct = value; }
}
private CalibrationStruct calibrationStruct;
public ushort OrigCalibFactor;
public ushort CalibFactor { get { return (CalibrationStruct != null) ? CalibrationStruct.Calibration : (ushort)0; } }
public double Q2ErrWOCorrection;
public bool Q2CorrectionDone;
public double Q2Correction;
public int Q2CorrRFlow;
public int Q2CorrLFlow;
public double Diff2Hz8Hz;
public bool Hz2CorrectionDone;
public int Hz2Correction;
public string FWVersion { get { return (CalibrationStruct != null) ? CalibrationStruct.FWVersionStr() : string.Empty; } }
/// <summary> Result of the last test used to calculate Q2 correction factors, etc </summary>
public Results.Entities.MeterTestRslt LastTestResult2;
public Results.Entities.MeterTestRslt LastTestResult;
public double NominalTestFlowLph; /// in liter per hour
///
/// Required for IRegisterReader interface
///
public int WMPulses { get { return wmPulses; } }
public int WMRefPulses { get { return wmRefPulses; } }
public double WMVolume { get { return wmVolume; } }
public double BeginWMState { get { return beginWMState; } }
public double EndWMState { get { return endWMState; } }
public double WMTestTime { get { return wmTestTime; } }
private double beginWMState;
private double endWMState;
private double wmVolume;
private int wmPulses;
private int wmRefPulses;
private double wmTestTime;
/// <summary> Name set by the test, to be used as a part of the opto-data log file name </summary>
public string TestName;
/// <summary> Name set by the test, to be used as a part of the opto-data log file name </summary>
public string BenchName;
///
/// Volume of water from the opto telegram
///
private Int64 lastVolumeRaw; /// Last read raw volume
private double volumeLtr; ///
private double volumeLtr0;
///
/// Timestamp from the opto telegram
///
private double timestampSec;
private double timestampSec0;
public bool NoSamples { get { return (timestampSecEnd - timestampSecStart) < float.Epsilon; } }
public double TimestampSecStart { get { return timestampSecStart; } }
public double TimestampSecEnd { get { return timestampSecEnd; } }
private double timestampSecStart;
private double timestampSecEnd;
public GenesisHead()
{
}
public GenesisHead(Generic.IComponentCfg cfg)
: base(cfg)
{
ClearData();
genesisHeadCfg = cfg as GenesisHeadCfg;
log.Debug(this.ToString());
}
private GenesisMeter myGenesis = null;
public GenesisMeter SetUp()
{
try
{
Log("Call SetUp()");
if (myGenesis != null)
{
myGenesis.DisposeMeter();
}
//add for gen
myGenesis = new GenesisMeter();
myGenesis.SetupFromConfigFile(SlotNr);
Log("Add Meter to batch");
GenesisHeadBatch.BatchHolder.Value.AddMeter(myGenesis);
Log("Log Raw Data");
myGenesis.LogRawData(true);
return myGenesis;
}
catch (Exception e)
{
if (myGenesis != null)
{
Log(e.Message);
}
throw e;
}
}
/// <summary>
/// Clear data related to a specific water meter
/// </summary>
public void ClearData()
{
DetailedResults = new List<MeasurementResults>();
resultCode = 0;
disabled = false;
commFailed = false;
endState = string.Empty;
beginState = string.Empty;
configStruct = null;
calibrationStruct = null;
LastTestResult = null;
NominalTestFlowLph = 0;
OrigCalibFactor = 0;
Q2ErrWOCorrection = 0;
Q2CorrectionDone = false;
Q2CorrRFlow = 0;
}
public override void Initialize()
{
ClearData();
if (DebugLevel == DebugMode.Normal)
{
}
}
public void RunDeviceBefore()
{
////todo: RD- Login??
//if (DebugLevel == DebugMode.Normal)
//{
// if (myGenesis != null)
// {
// Log("TBF RunDeviceBefore");
// }
// else
// {
// //throw new Exception("No meter was bound!");
// }
//}
//else if (DebugLevel == DebugMode.FailureDuringOperation)
//{
//}
}
public void RunDeviceAfter() { }
public void StopDevice()
{
try
{
if (DebugLevel == DebugMode.Normal && myGenesis != null)
{
myGenesis.DisposeMeter();
GenesisHeadBatch.BatchHolder.Value.RemoveMeter(myGenesis);
}
}
catch
{
}
}
public void StopDevice2() { }
/// <summary>
/// Events: Event.ReadRegisterDone, Event.Error
/// </summary>
/// <returns>ReadWaterMeter instance reference casted to IOperaton</returns>
public IOperation ReadRegisterOp()
{
return this;
}
/// <summary>
/// Clear data/counters related to a specific tests
/// </summary>
public void Clear()
{
resultCode = 0;
sampleNr = 0;
volumeLtr = 0;
volumeLtr0 = 0;
timestampSec = 0;
timestampSec0 = 0;
ReadPulses();
}
public void TestCompleted()
{
/// TODO: Implement
}
private int sampleNr; /// This is to determine when the test start sample should be taken
private bool StoreStartPackage = false;
private bool StoreEndPackage = false;
private bool Enable = false;
public bool IsCalibration = false;
/// <summary>Start this operation</summary>
public void Start()
{
}
public void StartRead(string TestName, int batchNr, int repetitionNr)
{
StoreStartPackage = false;
StoreEndPackage = false;
//Start mesurement
if (DebugLevel == DebugMode.Normal)
{
if (myGenesis != null)
{
IsCalibration = false;
Log($"TBF Start Measurement {TestName}");
myGenesis.CurrentActionText = $"Batch{batchNr}_Rep{repetitionNr}";
if (TestName.ToLower().Contains("calib"))
{
IsCalibration = true;
//myGenesis.Login();
myGenesis.StartCalibration();
}
else if (TestName.ToLower().Contains("login"))
{
//myGenesis.Login();
myGenesis.InitMeasurement();
}
else
{
DetailedResults = new List<MeasurementResults>();
myGenesis.StartMeasurement();
}
StoreStartPackage = true;
}
}
}
public void Log(string text)
{
if (DebugLevel == DebugMode.Normal)
{
if (myGenesis != null)
{
myGenesis.WriteLog(text);
}
}
}
/// <summary>Run this operation</summary>
/// <returns>eventDone</returns>
public Event Run()
{
if (DebugLevel == DebugMode.Normal)
{
if (myGenesis != null)
{
try
{
//var results = myGenesis.GetIntermediateMeasurementResult();
//readOutResults(results);
}
catch (Exception)
{
}
}
}
return Event.ReadRegisterDone;
}
public double RefVolume = 0.0;
public void Stop()
{
//Stop(null);
if (DebugLevel == DebugMode.Normal && myGenesis != null)
{
if (IsCalibration)
{
myGenesis.StopCalibration();
}
else
{
myGenesis.StopMeasurement();
}
}
}
/// <summary>Stop this operation</summary>
public void Stop(Double? testTimeS = null, double? refVol = null)
{
if (DebugLevel == DebugMode.Normal && myGenesis != null)
{
Log($"TBF Stop Measurement {IsCalibration} {testTimeS} {refVol }");
if (IsCalibration)
{
//myGenesis.StopCalibration();
int retryCounter = 400;
while (myGenesis.GetCalibrationState() != MeasurementStates.IsCompleted)
{
if (retryCounter < 0)
{
break;
}
Thread.Sleep(10);
retryCounter = retryCounter - 1;
}
try
{
var results = myGenesis.GetMainMeasurementResult(refVol, testTimeS, false);
readOutResults(results, testTimeS);
if (refVol.HasValue && refVol.Value != 0.0)
{
myGenesis.BuildAndCheckCalibFactorsAllChannels(refVol.Value / 1000, testTimeS, Q2ErrWOCorrection);
myGenesis.SetCalibFactorsAllChannels(false);
}
}
catch (Exception ex)
{
MarkAsError();
Log("Error while Stop Calib " + ex.Message);
if (ex.InnerException != null)
{
Log("Inner Error:" + ex.InnerException.Message);
}
}
}
else
{
int retryCounter = 4000;
//myGenesis.StopMeasurement();
try
{
while (myGenesis.GetMeasurementState() != MeasurementStates.IsCompleted)
{
if (retryCounter < 0)
{
break;
}
Thread.Sleep(10);
retryCounter = retryCounter - 1;
}
try
{
if (refVol.HasValue && testTimeS.HasValue)
{
Log("GetMainMeasurementResult V" + refVol.ToString() + " and S" + testTimeS.Value);
}
else
{
Log("GetMainMeasurementResult empty");
}
DetailedResults = myGenesis.GetAllMeasurementResults(refVol, testTimeS);
foreach (var item in DetailedResults)
{
Log("Detail Measurement Channel =" + item.Channel + "; CorrectedDutVolumeCm= " + item.CorrectedDutVolumeCm + "; DeviationDutToRefPer= " + item.DeviationDutToRefPer);
}
readOutResults(DetailedResults.First(), testTimeS);
}
catch (Exception ex)
{
MarkAsError();
Log("Error while Stop Measurement " + ex.Message);
}
}
catch (Exception ex)
{
MarkAsError();
Log("Error while GetMeasurementState " + ex.Message);
}
}
StoreEndPackage = true;
}
}
private void readOutResults(MeasurementResults results, double? testTimeS)
{
volumeLtr = results.CorrectedDutVolumeCm * 1000;
timestampSec = results.DutStopRecord.GetTimeS();
if (testTimeS.HasValue)
{
wmTestTime = testTimeS.Value;
}
else
{
wmTestTime = results.DutTimeS;
}
wmVolume = results.CorrectedDutVolumeCm * 1000;
Log("DutFlowRateCmPh" + results.DutFlowRateCmPh.ToString());
Log("CorrectedDutVolumeCm=" + results.CorrectedDutVolumeCm.ToString());
Log("DutVolumeCm=" + results.DutVolumeCm.ToString());
ReadPulses();
}
private void MarkAsError()
{
volumeLtr = 0;
timestampSec = 0;
wmTestTime = 0;
wmVolume = 0;
ReadPulses();
}
private void ReadPulses()
{
beginWMState = volumeLtr0;
endWMState = volumeLtr;
wmPulses = (int)(wmVolume * (double)PulsesPerLtr + 0.5);
wmRefPulses = StateMachine.ControlBoardMain.RefPulses;//EtPulses(0);//...MF
}
private bool optoSerialPortParsingEnabled;
}
}

View File

@ -0,0 +1,63 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Xml.Serialization;
using Config.Entities;
using TBF.Rig.Generic;
using TBF.Resources;
using Common;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class GenesisHeadCfg : ComponentCfgBase, Generic.IComponentCfg
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(GenesisHeadCfg) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
public IComponentCfgCtrl GetControl(IList<Config.Entities.Component> cmpntEntities) { return new GenesisHeadCfgCtrl(); }//...MF
///
/// Serialized parameters
///
public int SlotNr; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10
/// <summary> Procedure parameters </summary>
[XmlIgnore]
public ProcParams ProcParams;
public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; }
public override IParamsProvider CreateProcParamsProvider() { return new ProcParams(true); }
[XmlIgnore]
public MeterType MeterType { get { return (ProcParams != null) ? ProcParams.MeterType : MeterType.AutoDetect; } }
/// Private parameterless constructor invoked by all other (public) constructors
GenesisHeadCfg()
{
Name = "Genesis";
ParentName = string.Empty;
SlotNr = 0;
ProcParams = new ProcParams(true);
}
public GenesisHeadCfg(IComponentFactory factory)
: this()
{
this.Factory = factory;
}
public string ToString(int i)
{
return string.Format("{0} SlotNr={1}",
Name,
SlotNr
);
}
}
}

View File

@ -0,0 +1,92 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
using log4net;
using TBF.Rig.Generic;
using TBF.Resources;
using Config.Entities;
using Common;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public partial class GenesisHeadCfgCtrl : UserControl, IComponentCfgCtrl
{
static readonly ILog log = LogManager.GetLogger(typeof(GenesisHeadCfgCtrl));
public bool ShowMore { get { return false; } }
GenesisHeadCfg config;
public IComponentCfg Config
{
get { return config as IComponentCfg; }
set
{
config = value as GenesisHeadCfg;
Redraw();
}
}
public GenesisHeadCfgCtrl()
{
InitializeComponent();
}
private void WaterMeterCfgCtrl_Load(object sender, EventArgs e)
{
nameLabel.Text = Strings.Name;
classNameLabel.Text = config.Factory.ClassName;
slotNrTextBox.Text = config.SlotNr.ToString();
Redraw();
}
public void Closing()
{
}
void Redraw()
{
if (config == null) return; /// Control was not loaded, settings were not changed
nameTextBox.Text = config.Name;
}
public void Unlock()
{
nameTextBox.Enabled = true;
slotNrTextBox.Enabled = true;
}
public CfgUpdateFlags VerifyCfg(ref string message)
{
CfgUpdateFlags flags = CfgUpdateFlags.None;
int dummy;
if (!int.TryParse(slotNrTextBox.Text, out dummy) || dummy < 1 || dummy > 7)
{
flags |= CfgUpdateFlags.Error;
message += Environment.NewLine + string.Format(Strings.Invalid_0, muxBoardNrLabel.Text);
}
return flags;
}
public CfgUpdateFlags UpdateCfg()
{
CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd;
if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed
config.Name = nameTextBox.Text;
config.SlotNr = int.Parse(slotNrTextBox.Text);
return flags;
}
}
}

View File

@ -0,0 +1,121 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
partial class GenesisHeadCfgCtrl : System.Windows.Forms.UserControl
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.nameTextBox = new System.Windows.Forms.TextBox();
this.nameLabel = new System.Windows.Forms.Label();
this.classNameLabel = new System.Windows.Forms.Label();
this.slotNrTextBox = new System.Windows.Forms.TextBox();
this.muxBoardNrLabel = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// nameTextBox
//
this.nameTextBox.Enabled = false;
this.nameTextBox.Location = new System.Drawing.Point(135, 40);
this.nameTextBox.Name = "nameTextBox";
this.nameTextBox.Size = new System.Drawing.Size(121, 20);
this.nameTextBox.TabIndex = 2;
//
// nameLabel
//
this.nameLabel.AutoSize = true;
this.nameLabel.Location = new System.Drawing.Point(25, 43);
this.nameLabel.Name = "nameLabel";
this.nameLabel.Size = new System.Drawing.Size(35, 13);
this.nameLabel.TabIndex = 1;
this.nameLabel.Text = "Name";
//
// classNameLabel
//
this.classNameLabel.AutoSize = true;
this.classNameLabel.Location = new System.Drawing.Point(132, 16);
this.classNameLabel.Name = "classNameLabel";
this.classNameLabel.Size = new System.Drawing.Size(60, 13);
this.classNameLabel.TabIndex = 0;
this.classNameLabel.Text = "ClassName";
//
// slotNrTextBox
//
this.slotNrTextBox.Enabled = false;
this.slotNrTextBox.Location = new System.Drawing.Point(135, 63);
this.slotNrTextBox.Name = "slotNrTextBox";
this.slotNrTextBox.Size = new System.Drawing.Size(34, 20);
this.slotNrTextBox.TabIndex = 9;
//
// muxBoardNrLabel
//
this.muxBoardNrLabel.AutoSize = true;
this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66);
this.muxBoardNrLabel.Name = "muxBoardNrLabel";
this.muxBoardNrLabel.Size = new System.Drawing.Size(37, 13);
this.muxBoardNrLabel.TabIndex = 8;
this.muxBoardNrLabel.Text = "Slot nr";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(176, 66);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(31, 13);
this.label3.TabIndex = 13;
this.label3.Text = "1 .. 6";
//
// GenesisHeadCfgCtrl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.label3);
this.Controls.Add(this.slotNrTextBox);
this.Controls.Add(this.muxBoardNrLabel);
this.Controls.Add(this.nameTextBox);
this.Controls.Add(this.nameLabel);
this.Controls.Add(this.classNameLabel);
this.Name = "GenesisHeadCfgCtrl";
this.Size = new System.Drawing.Size(396, 123);
this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox nameTextBox;
private System.Windows.Forms.Label nameLabel;
private System.Windows.Forms.Label classNameLabel;
private System.Windows.Forms.TextBox slotNrTextBox;
private System.Windows.Forms.Label muxBoardNrLabel;
private System.Windows.Forms.Label label3;
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,20 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class OptoReceivedEventArgs : EventArgs
{
public string Data;
public OptoReceivedEventArgs(string data)
{
this.Data = data;
}
}
}

View File

@ -0,0 +1,295 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.Globalization;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class OptoTelegramRaw
{
public static readonly int Length = 42;
private static CultureInfo culture;
///
/// Strobed value
///
public static decimal TestStartTimestampDec;
///
/// Stored values
///
public OptoTelegramFlags Flags;
public DateTime DateTime; /// From PC
public float RefFlow; /// [m3/h]
public int Counter;
public UInt32 EmfRaw; /// From iPerl opto data
public Int16 MagneticFieldRaw;
public Int16 FlowRaw;
public UInt32 VolumeRaw;
public Int64 VolumeRawExt;
public Int16 Impedance;
public UInt32 Timestamp;
public Int64 TimestampExt;
public byte CheckSum;
///
/// Calculated values
///
public double EMF()
{
Int32 signedEmf = (EmfRaw > 0x7FFFFF) ? ((int)EmfRaw - 0x1000000) : (int)EmfRaw;
return 0.000000333 * (double)signedEmf;
}
public double MagneticField() { return (double)MagneticFieldRaw; }
public double Flow(double scalingFactor) { return 0.225 * scalingFactor * (double)FlowRaw; }
public double Volume(double scalingFactor) { return 0.0000625 * scalingFactor * (double)VolumeRawExt; }
public Int32 FlipTime() { return Impedance; }
public decimal TimestampDec() { return (decimal)TimestampExt / (decimal)8192; }
public double VolumeDelta(double scalingFactor, OptoTelegramRaw previous) { return (previous == null) ? 0 : Volume(scalingFactor) - previous.Volume(scalingFactor); }
public decimal TimeDelta() { return TimestampDec() - TestStartTimestampDec; }
public string Label()
{
if (Flags == OptoTelegramFlags.OK_TestStart) return "#### start test ####";
else if (Flags == OptoTelegramFlags.OK_TestEnd) return "#### end of test ####";
else return string.Empty;
}
static OptoTelegramRaw()
{
culture = CultureInfo.CreateSpecificCulture("DE"); /// This is to use comma as decimal number separator
}
public OptoTelegramRaw()
{
}
/// <summary>
/// Parses optical telegram and returns OptoTelegramRaw object
/// </summary>
/// <description>
/// Create a configuration structure from a complete byte array
///
/// Telegram description:
///
/// AAAAAA[tab]BBBB[tab]CCCC[tab]DDDDDD[tab]EEEE[tab]FFFFFFFF[tab]GG[cr][lf] (42 bytes)
///
/// Data Comment Type Calculate to decimal
/// ----------------------------------------------------------------
/// AAAAAA EMF Int24 Value * 0.000000333
/// BBBB Magnetic field Int16 Value
/// CCCC Flow Int16 Value * 0.225 * Scalig factor
/// DDDDDD Volume Int24 Value / 16000 * Scaling factor
/// EEEE Impedance Int16 Value
/// FFFFFFFF Timestamp Uint32 Value / 8192
/// GG Checksum Byte
/// ----------------------------------------------------------------
///
/// Example:
/// FFFFFE 51EA 0000 65324E 0087 F6319DFF 86
/// FFDD3A 51F9 0000 65324E 0088 F631A60B 45
/// ...
/// </description>
/// <param name="data">A complete byte array data</param>
/// <returns>true = telegram OK, false = telegram NOK</returns>
public bool UpdateFromString(string telegram, int counter, ref Int64 volumeRawExtLast, ref Int64 timestampExtLast)
{
DateTime = DateTime.Now;
Counter = counter;
RefFlow = (float)Sequences.ProcessData.RefFlow.Val;
if ((telegram == null) || (telegram.Length < Length) ||
(telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') ||
(telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') ||
(telegram[40] != '\r') || (telegram[41] != '\n'))
{
Flags = OptoTelegramFlags.InvalidTelegram;
return false;
}
bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw);
bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw);
bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw);
bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw);
bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance);
bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp);
bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum);
bool allOk = f1 && f2 && f3 && f4 && f5 && f6 && f7;
Flags = allOk ? OptoTelegramFlags.OK : OptoTelegramFlags.InvalidTelegram;
///
/// Cope with 'VolumeRaw' overflow
///
Int64 uncorrected = (Int64)(((UInt64)volumeRawExtLast & 0xFFFFFFFFFF000000UL) | VolumeRaw);
if (Math.Abs(uncorrected - volumeRawExtLast) <= 0x800000L)
{
VolumeRawExt = volumeRawExtLast = uncorrected;
}
else if (Math.Abs(uncorrected + 0x1000000L - volumeRawExtLast) <= 0x800000L)
{
VolumeRawExt = volumeRawExtLast = uncorrected + 0x1000000L;
}
else if (Math.Abs(uncorrected - 0x1000000L - volumeRawExtLast) <= 0x800000L)
{
VolumeRawExt = volumeRawExtLast = uncorrected - 0x1000000L;
}
else
{
VolumeRawExt = volumeRawExtLast = uncorrected;
}
///
/// Cope with 'Timestamp' overflow
///
uncorrected = (Int64)(((UInt64)timestampExtLast & 0xFFFFFFFF00000000UL) | Timestamp);
if (Math.Abs(uncorrected - timestampExtLast) <= 0x80000000L)
{
TimestampExt = timestampExtLast = uncorrected;
}
else if (Math.Abs(uncorrected + 0x100000000L - timestampExtLast) <= 0x80000000L)
{
TimestampExt = timestampExtLast = uncorrected + 0x100000000L;
}
else if (Math.Abs(uncorrected - 0x100000000L - timestampExtLast) <= 0x80000000L)
{
TimestampExt = timestampExtLast = uncorrected - 0x100000000L;
}
else
{
TimestampExt = timestampExtLast = uncorrected;
}
return allOk;
}
/// <summary>
/// Alternative to UpdateFromString(...) when data are flushed
/// </summary>
public bool UpdateFromStringDummy(string telegram)
{
DateTime = DateTime.Now;
RefFlow = (float)Sequences.ProcessData.RefFlow.Val;
if ((telegram == null) || (telegram.Length < Length) ||
(telegram[6] != '\t') || (telegram[11] != '\t') || (telegram[16] != '\t') ||
(telegram[23] != '\t') || (telegram[28] != '\t') || (telegram[37] != '\t') ||
(telegram[40] != '\r') || (telegram[41] != '\n'))
{
Flags = OptoTelegramFlags.InvalidTelegram;
return false;
}
//bool f1 = UInt32.TryParse(telegram.Substring(0, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out EmfRaw);
//bool f2 = Int16.TryParse(telegram.Substring(7, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out MagneticFieldRaw);
//bool f3 = Int16.TryParse(telegram.Substring(12, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out FlowRaw);
//bool f4 = UInt32.TryParse(telegram.Substring(17, 6), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out VolumeRaw);
//bool f5 = Int16.TryParse(telegram.Substring(24, 4), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Impedance);
//bool f6 = UInt32.TryParse(telegram.Substring(29, 8), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out Timestamp);
//bool f7 = byte.TryParse(telegram.Substring(38, 2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out CheckSum);
//return f1 && f2 && f3 && f4 && f5 && f6 && f7;
return true;
}
public void SetFlags(OptoTelegramFlags flags)
{
this.Flags = flags;
}
public string ToString(double scalingFactor, OptoTelegramRaw previous)
{
if (Flags == OptoTelegramFlags.SyncError)
{
return "Sychronization error";
}
else if (Flags == OptoTelegramFlags.InvalidTelegram)
{
return "Invalid telegram";
}
else /// if (flags == OptoTelegramFlags.OK / OptoTelegramFlags.OK_TestStart / OptoTelegramFlags.OK_TestEnd)
{
return string.Format("{0}:{1}:{2}.{3}\t{4} :\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\t{12}\t{13}\t{14}\t{15}\t{16}\t{17}\t{18}\t{19}\t{20}\t{21}\t{22}",
DateTime.Hour.ToString("D2"),
DateTime.Minute.ToString("D2"),
DateTime.Second.ToString("D2"),
DateTime.Millisecond.ToString("D4"),
Counter,
EmfRaw.ToString("X6"),
MagneticFieldRaw.ToString("X4"),
FlowRaw.ToString("X4"),
VolumeRaw.ToString("X6"),
Impedance.ToString("X4"),
Timestamp.ToString("X8"),
CheckSum.ToString("X2"),
EMF().ToString("F4", culture),
MagneticField().ToString("F0", culture),
Flow(scalingFactor).ToString("F2", culture),
Volume(scalingFactor).ToString("F4", culture),
FlipTime().ToString("F0", culture),
TimestampDec().ToString("F4", culture),
(RefFlow * 1000).ToString("F2", culture),
VolumeDelta(scalingFactor, previous).ToString("F4", culture),
TimeDelta().ToString("F3", culture),
scalingFactor.ToString("F1", culture),
Label());
}
}
/// <summary>
/// Filter RefFlow data in an array of OptoTelegramRaw objects by a FIR filter:
///
/// kSize = 5, kSize2 = 2
///
/// i k
/// ---------------------------------------------------------------------------
/// 0 -5 filtered[0] = data[0]
/// 1 -4 filtered[1] = data[1]
/// 2 -3 filtered[2] = data[0]*k[0] + ... + data[4]*k[4]
/// 3 -2 filtered[3] = data[1]*k[0] + ... + data[5]*k[4]
/// 4 -1 filtered[4] = data[2]*k[0] + ... + data[6]*k[4]
/// 5 0 data[0] = filtered[0], filtered[0] = data[3]*k[0] + ... + data[7]*k[4]
/// 6 1 data[1] = filtered[1], filtered[1] = data[4]*k[0] + ... + data[8]*k[4]
/// 7 ...
/// </summary>
/// <param name="optoData">array of OptoTelegramRaw objects</param>
/// <param name="optoDataCount">number of objects to process</param>
public static void FIRFilterFlow(OptoTelegramRaw[] optoData, int optoDataCount)
{
float[] kernel = new float[] { 0.1f, 0.2f, 0.4f, 0.2f, 0.1f };
int kSize = kernel.Length;
int kSize2 = kernel.Length / 2;
float[] filtered = new float[kSize];
for (int i = 0; i < optoDataCount; i++)
{
int k = i - kSize;
if (k >= 0) optoData[k].RefFlow = filtered[i % kSize];
if (i < kSize2 || i >= optoDataCount - kSize2)
{
filtered[i % kSize] = optoData[i].RefFlow;
}
else
{
float weoightedSum = 0;
for (int j = -kSize2; j <= kSize2; j++)
weoightedSum += optoData[i + j].RefFlow * kernel[j + kSize2];
filtered[i % kSize] = weoightedSum;
}
}
for (int k = optoDataCount - kSize; k < optoDataCount; k++)
{
if (k >= 0) optoData[k].RefFlow = filtered[k % kSize];
}
}
}
}

View File

@ -0,0 +1,186 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using Config.Entities;
using TBF.Rig.Generic;
using TBF.Resources;
using Common;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public partial class ProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams
{
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ProcParams) })[0];
public override XmlSerializer GetSerializer() { return Serializer; }
public MeterType MeterType;
public float CalibTarget; /// Target error after calibration in [%]
public int FactorLimitLo; /// Lower limit for the calibration factor
public int FactorLimitHi; /// Upper limit for the calibration factor
#if ORACLE_DB
public int WMType_ID; /// Required for Oracle DB: ID_WZTyp in table VT_PRUEFPUNKT_SOLL_SD
public int WMType_Rev; /// Required for Oracle DB: Rev_WZTyp in table VT_PRUEFPUNKT_SOLL_SD
#endif
public override void InitializeAll()
{
MeterType = MeterType.AutoDetect;
CalibTarget = 0;
FactorLimitLo = 1000;
FactorLimitHi = 8000;
#if ORACLE_DB
WMType_ID = 2; /// Value for iPerl DN15
WMType_Rev = 1; /// Value for iPerl DN15
#endif
}
string[] paramNames = new string[]
{
"iPerl type",
"Calib. target [%]",
"Calib. factor Lo",
"Calib. factor Hi",
#if ORACLE_DB
"WMType ID",
"WMType Rev.",
#endif
};
public override string ParamName(int i) { return paramNames[i]; }
public override int ParamsCount() { return paramNames.Length; }
public override string ToString(int i)
{
switch (i)
{
case 0: return MeterType.ToString();
case 1: return CalibTarget.ToString();
case 2: return FactorLimitLo.ToString();
case 3: return FactorLimitHi.ToString();
#if ORACLE_DB
case 4: return WMType_ID.ToString();
case 5: return WMType_Rev.ToString();
#endif
default: return string.Empty;
}
}
public CfgUpdateFlags UpdateParam(int i, string strValue)
{
switch (i)
{
case 0:
for (MeterType mt = 0; mt < MeterType.Count; mt++)
{
if (mt.ToString().Equals(strValue)) { MeterType = mt; return CfgUpdateFlags.None; }
}
break;
case 1: CalibTarget = Utils.ParseSFloat(strValue); return CfgUpdateFlags.None;
case 2: FactorLimitLo = int.Parse(strValue); return CfgUpdateFlags.None;
case 3: FactorLimitHi = int.Parse(strValue); return CfgUpdateFlags.None;
#if ORACLE_DB
case 4: WMType_ID = int.Parse(strValue); return CfgUpdateFlags.None;
case 5: WMType_Rev = int.Parse(strValue); return CfgUpdateFlags.None;
#endif
default: return CfgUpdateFlags.None;
}
return CfgUpdateFlags.None;
}
public bool ValidateParam(int i, string strValue, out string message)
{
message = string.Empty;
int iDummy;
float fDummy;
switch (i)
{
case 0:
for (MeterType mt = 0; mt < MeterType.Count; mt++) if (mt.ToString().Equals(strValue)) return true;
break;
case 1:
if (Utils.TryParseSFloat(strValue, out fDummy) && fDummy >= -10.0f && fDummy <= 10.0f) return true;
break;
case 2:
case 3:
if (int.TryParse(strValue, out iDummy) && iDummy >= 1000 && iDummy <= 8000) return true;
break;
#if ORACLE_DB
case 4: /// WMType_ID
case 5: /// WMType_Rev
if (int.TryParse(strValue, out iDummy)) return true;
break;
#endif
default:
message = "Invalid index";
return false;
}
message = ParamName(i) + " is invalid";
return false;
}
void CopyContentTo(ProcParams prms)
{
prms.MeterType = this.MeterType;
prms.CalibTarget = this.CalibTarget;
prms.FactorLimitLo = this.FactorLimitLo;
prms.FactorLimitHi = this.FactorLimitHi;
#if ORACLE_DB
prms.WMType_ID = this.WMType_ID;
prms.WMType_Rev = this.WMType_Rev;
#endif
}
public IParamsProvider Clone()
{
ProcParams pars = new ProcParams();
CopyContentTo(pars);
return pars;
}
public virtual bool UpdateFromDbEntity(ComponentProcedure dbEntity)
{
if (dbEntity == null) return false;
try
{
ProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as ProcParams;
procedureParamsEntity = dbEntity;
componentName = dbEntity.CmpntName;
procedure = dbEntity.Procedure;
if (tmp != null) tmp.CopyContentTo(this);
return true;
}
catch
{
}
return false;
}
public ProcParams()
{
}
public ProcParams(bool initialize)
{
if (initialize) InitializeAll();
}
public ProcParams(ComponentProcedure procParamsEntity, string componentName, Procedure procedure)
{
this.procedureParamsEntity = procParamsEntity;
this.componentName = componentName;
this.procedure = procedure;
}
}
}

View File

@ -0,0 +1,160 @@
///
/// Copyright (c) 2015-2017 Sensus Metering Systems
///
using System;
namespace TBF.Rig.TestMethods.GenesisCommunication.GenesisHead
{
public class StatusStruct
{
public static readonly int Length = 48;
public Byte Version;
public FlowState FlowState;
public UInt32 BillingVolume;
public UInt32 ForwardVolume;
public UInt32 ReverseVolume;
public UInt32 SecondsActive;
public UInt32 SecondsIdle;
public UInt32 SecondsUsed;
public UInt32 UTC;
public Int32 ScaledAvgFlowRate;
public UInt16 PeakFlowRate;
public UInt16 AlarmState;
public byte RebootCount;
public byte[] AlarmCount;
public UInt16 FlipTime;
public StatusStruct()
{
AlarmCount = new byte[7];
}
public byte[] ToByteArray()
{
byte[] result = new byte[Length];
result[0] = Version;
result[1] = (byte)FlowState;
result[2] = (byte)(BillingVolume & 0x000000FF);
result[3] = (byte)((BillingVolume >> 8) & 0x000000FF);
result[4] = (byte)((BillingVolume >> 16) & 0x000000FF);
result[5] = (byte)((BillingVolume >> 24) & 0x000000FF);
result[6] = (byte)(ForwardVolume & 0x000000FF);
result[7] = (byte)((ForwardVolume >> 8) & 0x000000FF);
result[8] = (byte)((ForwardVolume >> 16) & 0x000000FF);
result[9] = (byte)((ForwardVolume >> 24) & 0x000000FF);
result[10] = (byte)(ReverseVolume & 0x000000FF);
result[11] = (byte)((ReverseVolume >> 8) & 0x000000FF);
result[12] = (byte)((ReverseVolume >> 16) & 0x000000FF);
result[13] = (byte)((ReverseVolume >> 24) & 0x000000FF);
result[14] = (byte)(SecondsActive & 0x000000FF);
result[15] = (byte)((SecondsActive >> 8) & 0x000000FF);
result[16] = (byte)((SecondsActive >> 16) & 0x000000FF);
result[17] = (byte)((SecondsActive >> 24) & 0x000000FF);
result[18] = (byte)(SecondsIdle & 0x000000FF);
result[19] = (byte)((SecondsIdle >> 8) & 0x000000FF);
result[20] = (byte)((SecondsIdle >> 16) & 0x000000FF);
result[21] = (byte)((SecondsIdle >> 24) & 0x000000FF);
result[22] = (byte)(SecondsUsed & 0x000000FF);
result[23] = (byte)((SecondsUsed >> 8) & 0x000000FF);
result[24] = (byte)((SecondsUsed >> 16) & 0x000000FF);
result[25] = (byte)((SecondsUsed >> 24) & 0x000000FF);
result[26] = (byte)(UTC & 0x000000FF);
result[27] = (byte)((UTC >> 8) & 0x000000FF);
result[28] = (byte)((UTC >> 16) & 0x000000FF);
result[29] = (byte)((UTC >> 24) & 0x000000FF);
result[30] = (byte)(ScaledAvgFlowRate & 0x000000FF);
result[31] = (byte)((ScaledAvgFlowRate >> 8) & 0x000000FF);
result[32] = (byte)((ScaledAvgFlowRate >> 16) & 0x000000FF);
result[33] = (byte)((ScaledAvgFlowRate >> 24) & 0x000000FF); /// TODO: test with negative value
result[34] = (byte)(PeakFlowRate & 0x00FF);
result[35] = (byte)((PeakFlowRate >> 8) & 0x00FF);
result[36] = (byte)(AlarmState & 0x00FF);
result[37] = (byte)((AlarmState >> 8) & 0x00FF);
result[38] = RebootCount;
result[39] = AlarmCount[0];
result[40] = AlarmCount[1];
result[41] = AlarmCount[2];
result[42] = AlarmCount[3];
result[43] = AlarmCount[4];
result[44] = AlarmCount[5];
result[45] = AlarmCount[6];
result[46] = (byte)(FlipTime & 0x00FF);
result[47] = (byte)((FlipTime >> 8) & 0x00FF);
return result;
}
public static StatusStruct FromByteArray(byte[] data)
{
if (data.Length != Length) return null;
StatusStruct result = new StatusStruct();
result.Version = data[0];
result.FlowState = (FlowState)data[1];
result.BillingVolume = (((UInt32)data[5] * 256 + data[4]) * 256 + data[3]) * 256 + data[2];
result.ForwardVolume = (((UInt32)data[9] * 256 + data[8]) * 256 + data[7]) * 256 + data[6];
result.ReverseVolume = (((UInt32)data[13] * 256 + data[12]) * 256 + data[11]) * 256 + data[10];
result.SecondsActive = (((UInt32)data[17] * 256 + data[16]) * 256 + data[15]) * 256 + data[14];
result.SecondsIdle = (((UInt32)data[21] * 256 + data[20]) * 256 + data[19]) * 256 + data[18];
result.SecondsUsed = (((UInt32)data[25] * 256 + data[24]) * 256 + data[23]) * 256 + data[22];
result.UTC = (((UInt32)data[29] * 256 + data[28]) * 256 + data[27]) * 256 + data[26];
result.ScaledAvgFlowRate = (((Int32)data[33] * 256 + data[32]) * 256 + data[31]) * 256 + data[30]; /// TODO: test with negative value
result.PeakFlowRate = (UInt16)(data[34] + 256 * data[35]);
result.AlarmState = (UInt16)(data[36] + 256 * data[37]);
result.RebootCount = data[38];
result.AlarmCount[0] = data[39];
result.AlarmCount[1] = data[40];
result.AlarmCount[2] = data[41];
result.AlarmCount[3] = data[42];
result.AlarmCount[4] = data[43];
result.AlarmCount[5] = data[44];
result.AlarmCount[6] = data[45];
result.FlipTime = (UInt16)(data[46] * 256 + data[47]);
return result;
}
public override string ToString()
{
return string.Format("Status: V{0} Flow={1} BillVol={2} ForwVol={3} RevVol={4} SecActive={5}s SecIdle={6}s SecUsed={7}s UTC={8} AvgFlowRate={9} PeekFlowRate={10} AlarmState={11} RebootCount={12} A0={13} A1={14} A2={15} A3={16} A4={17} A5={18} A6={19} FlipTime={20}",
Version,
FlowState,
BillingVolume,
ForwardVolume,
ReverseVolume,
SecondsActive,
SecondsIdle,
SecondsUsed,
UTC,
ScaledAvgFlowRate,
PeakFlowRate,
AlarmState,
RebootCount,
AlarmCount[0],
AlarmCount[1],
AlarmCount[2],
AlarmCount[3],
AlarmCount[4],
AlarmCount[5],
AlarmCount[6],
FlipTime);
}
}
}

View File

@ -117,6 +117,9 @@
<Reference Include="log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<HintPath>..\packages\log4net.2.0.15\lib\net45\log4net.dll</HintPath>
</Reference>
<Reference Include="Logic.ProductionToProductMapper">
<HintPath>..\packages\Common\Logic.ProductionToProductMapper.dll</HintPath>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="MySql.Data">
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
@ -167,6 +170,21 @@
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="Xylem.Common.CommonCore">
<HintPath>..\packages\Common\Xylem.Common.CommonCore.dll</HintPath>
</Reference>
<Reference Include="Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore">
<HintPath>..\packages\Common\Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.dll</HintPath>
</Reference>
<Reference Include="Xylem.Common.Hardware.WaterMeter.WaterMeterCore">
<HintPath>..\packages\Common\Xylem.Common.Hardware.WaterMeter.WaterMeterCore.dll</HintPath>
</Reference>
<Reference Include="Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters">
<HintPath>..\packages\Common\Xylem.Common.Hardware.WaterMeter.WaterMeterRegisters.dll</HintPath>
</Reference>
<Reference Include="Xylem.Common.Metrology.Measurements">
<HintPath>..\packages\Common\Xylem.Common.Metrology.Measurements.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Boxes\CheckBoxImage.cs">
@ -1571,6 +1589,18 @@
<DependentUpon>TestMethodCfgCtrl.cs</DependentUpon>
</Compile>
<Compile Include="Rig\TestMethods\FlyingStartMassCollection\Single\TestParams.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\CalibrationStruct.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\ConfigStruct.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\Enums.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\Factory.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\GenesisHead.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\GenesisHeadCfg.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\GenesisHeadCfgCtrl.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\GenesisHeadCfgCtrl.designer.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\OptoReceivedEventArgs.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\OptoTelegramRaw.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\ProcParams.cs" />
<Compile Include="Rig\TestMethods\GenesisCommunication\GenesisHead\StatusStruct.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\AllCompletedEventArgs.cs" />
<Compile Include="Rig\TestMethods\iPerlCommunication\CheckBoxImage.cs">
<SubType>Component</SubType>
@ -3488,6 +3518,7 @@
<EmbeddedResource Include="Rig\TestMethods\FlyingStartTankCollection\Single\TestMethodCfgCtrl.resx">
<DependentUpon>TestMethodCfgCtrl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Rig\TestMethods\GenesisCommunication\GenesisHead\GenesisHeadCfgCtrl.resx" />
<EmbeddedResource Include="Rig\TestMethods\GrabImage\GrabImageCfgCtrl.resx">
<DependentUpon>GrabImageCfgCtrl.cs</DependentUpon>
</EmbeddedResource>

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
"Erase": [
"1\\tstfile",
"1\\fdrdata",
"1\\logdata",
"1\\blklist",
"1\\mettable",
"1\\pulsedbg",
"1\\upg*",
"1\\img*"
],
"Restore": [
{
"Name": "1\\tstfile",
"ByteSize": 262144,
"Pattern": null
}
]
}

BIN
packages/Common/NLog.dll Normal file

Binary file not shown.

28548
packages/Common/NLog.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="BasePath" value="" />
<targets>
<!--CalibrationHelper-->
<target name="CalibrationHelper" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\CalibrationHelper.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_CalibrationHelper.log" />
<!--LedRawData-->
<target xsi:type="BufferingWrapper" name="TargetLedRawDataBase" bufferSize="10000" flushTimeout="-1" slidingTimeout="true">
<target name="LedRawDataBase" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\LedRawData_BASE.log" CreateDirs="True" layout="${longdate} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_LedRawData_BASE.log" />
</target>
<!--C:\GenesisLog\${shortdate}
C:\GenesisLog\${shortdate}-->
<!--MeterBatch-->
<target name="MeterBatch" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\Meter_BASE.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_Meter_BASE.log" />
<!--Meter-->
<target name="MeterBase" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\Meter_BASE.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_Meter_BASE.log" />
<target name="Slot:0" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\Meter_SlotSlot:0.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_Meter_SlotSlot:0.log" />
<!--COM-->
<target name="COMBase" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\COM_BASE.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_COM_BASE.log" />
<!--ServiceFwUpdateBuilder-->
<target name="ServiceFwUpdateBuilder" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\ServiceFwUpdateBuilder.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_ServiceFwUpdateBuilder.log" />
<!--ServiceFwUpdateLoader-->
<target name="ServiceFwUpdateLoader" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\ServiceFwUpdateLoader.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_ServiceFwUpdateLoader.log" />
<!--ServiceFwUpdateSw-->
<target name="ServiceFwUpdateSw" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\ServiceFwUpdateSw.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_ServiceFwUpdateSw.log" />
<!--default-->
<target name="default" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\default.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_default.log" />
<target name="PreAdjWr" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\PreAdjWr.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" />
<target name="ctlBatch" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\ctlBatch.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" archiveAboveSize="50000000" archiveFileName="C:\GenesisLog\${shortdate}\${processname}\{##}_ctlBatch.log" />
<target name="StreamingQualityFile" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\StreamingQuality.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" />
<target name="ProductionUIFile" xsi:type="File" fileName="${BasePath}\${shortdate}\${processname}\ProductionUIFile.log" CreateDirs="True" layout="${longdate} | ${level} | ${message} ${exception:format=toString}" />
</targets>
<rules>
<!--ServiceFwUpdateBuilder-->
<logger name="ServiceFwUpdateBuilder" minLevel="Trace" appendTo="ServiceFwUpdateSw" />
<!--ServiceFwUpdateLoader-->
<logger name="ServiceFwUpdateLoader" minLevel="Trace" appendTo="ServiceFwUpdateLoader" />
<!--ServiceFwUpdateSw-->
<logger name="ServiceFwUpdateSw" minLevel="Trace" appendTo="ServiceFwUpdateSw" />
<!--CalibrationHelper-->
<logger name="CalibrationHelper" minLevel="Trace" appendTo="CalibrationHelper" />
<!--LedRawData-->
<logger name="LedRawDataBase" minLevel="Trace" appendTo="TargetLedRawDataBase" />
<!--MeterBatch-->
<logger name="MeterBatch" minLevel="Trace" appendTo="MeterBatch" />
<!--Meter-->
<logger name="MeterBase" minLevel="Trace" appendTo="MeterBase" />
<logger name="Slot:0" minLevel="Trace" appendTo="Slot:0" />
<logger name="GenesisRequestProtocolBase" minLevel="Trace" appendTo="MeterBase" />
<logger name="MeasurementBase" minLevel="Trace" appendTo="MeterBase" />
<!--COM-->
<logger name="SerialComPortBase" minLevel="Trace" appendTo="COMBase" />
<logger name="IrdaBase" minLevel="Trace" appendTo="COMBase" />
<logger name="RfidBase" minLevel="Trace" appendTo="COMBase" />
<logger name="TransmitProtocolBase" minLevel="Trace" appendTo="COMBase" />
<!--default-->
<logger name="*" minLevel="Debug" appendTo="default" />
<!--Ui logger-->
<logger name="ctlBatch" minLevel="Trace" appendTo="ctlBatch" />
<logger name="StreamingQuality" minLevel="Trace" appendTo="StreamingQualityFile" />
<logger name="PreAdjWr" minLevel="Trace" appendTo="PreAdjWr" />
<logger name="ProductionUI" minLevel="Trace" appendTo="ProductionUIFile" />
</rules>
</nlog>

Binary file not shown.

23546
packages/Common/PdfSharp.xml Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,223 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Hardware.Interfaces.Ports.PortCore</name>
</assembly>
<members>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs">
<inheritdoc cref="T:System.EventArgs" />
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs._receivedTime">
<summary>
Marker for incoming record at time of the PC
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.GetData">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.SetData(System.Object)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.SetReceivedTime(System.DateTimeOffset)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.GetReceivedTime">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.SetSyncMarkRecord(Xylem.Common.CommonCore.Consts.SyncMarkRecord)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.BasePortDataEventArgs.GetSyncMarkRecord">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs">
<summary>
Interface for port data event arguments
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.GetData">
<summary>
Read data
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.SetData(System.Object)">
<summary>
Write data
</summary>
<param name="data"></param>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.GetReceivedTime">
<summary>
Reading received time
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.SetReceivedTime(System.DateTimeOffset)">
<summary>
Writing received time
</summary>
<param name="receivedTime"></param>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.SetSyncMarkRecord(Xylem.Common.CommonCore.Consts.SyncMarkRecord)">
<summary>
Setting the data marker
</summary>
<param name="syncMarkRecord"></param>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs.GetSyncMarkRecord">
<summary>
Getting the data marker
</summary>
<returns></returns>
</member>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.ListBytePortDataEventArgs">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.ListBytePortDataEventArgs.#ctor(System.Collections.Generic.List{System.Byte},System.DateTimeOffset,Xylem.Common.CommonCore.Consts.SyncMarkRecord)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.ListBytePortDataEventArgs.GetData">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.ListBytePortDataEventArgs.SetData(System.Object)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.StringPortDataEventArgs">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.StringPortDataEventArgs.#ctor(System.String,System.DateTimeOffset,Xylem.Common.CommonCore.Consts.SyncMarkRecord)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.StringPortDataEventArgs.GetData">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.StringPortDataEventArgs.SetData(System.Object)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort">
<summary>
Interface for Ports
</summary>
</member>
<member name="E:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.OnRawRecordReceived">
<summary>
event for record received, either bytes or string
</summary>
</member>
<member name="E:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.OnRawRecordSendOut">
<summary>
event for record received, either bytes or string
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.SynchronizeReceiveBuffer(Xylem.Common.CommonCore.Consts.SyncMarkRecord)">
<summary>
set specific mark
and flush or delete all incoming byte from buffer when SyncMarkRecord is <see cref="F:Xylem.Common.CommonCore.Consts.SyncMarkRecord.SyncStart"/> or
<see cref="F:Xylem.Common.CommonCore.Consts.SyncMarkRecord.SyncEnd"/>
</summary>
<param name="syncMarkRecord"></param>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.Open">
<summary>
if the port needs stuff to open, always open for better logical handling
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.Dispose">
<summary>
close and dispose all connections
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.IsOpen">
<summary>
indicates if the Port is open (also on Ports that did not have an open state)
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.PortWrite(System.Byte[])">
<summary>
Write byte[] to the Stream/Port on Child Class
wrapped with base class error handling
</summary>
<param name="data">Array of bytes to write</param>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.Clear">
<summary>
discard all buffers
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.IPort.GetPortName">
<summary>
Return the port name
</summary>
<returns>name of the port as string</returns>
</member>
<member name="T:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings">
<summary>
Store Port settings set most likely from transmit protocol
</summary>
</member>
<member name="M:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.#ctor(System.Nullable{System.Byte},System.Nullable{System.UInt16},System.UInt16,System.Int32,System.UInt32,System.Nullable{System.UInt32},System.Boolean)">
<summary>
The transmission protocol needs to inform the communication port how to setup,
this is the data container.
</summary>
<param name="protSyncByte"></param>
<param name="protLengthIndex"></param>
<param name="protAddLength"></param>
<param name="responseTimeoutMs"></param>
<param name="baudRate"></param>
<param name="receiveBufferFlushThreshold"></param>
<param name="doubleSyncByte"></param>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.ProtSyncByte">
<summary>
start of receiving synchronization byte at byte receive routine
syncByte == null: use the readLine routine (ASCII) and NOT the BYTE routine,
lengthPosition and additionalLength are not used
</summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.ProtLengthIndex">
<summary>
position of length information field in received BYTE record
lengthIndex == null: take the constant receive length of additionalLength
because the record doesn't contain length information
</summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.ProtAddLength">
<summary>
additional record length NOT covert by the record length information field
lengthIndex == null: constant length for received record
Being used for the BYTE records indicated by a valid syncByte,
not being used for ASCII records.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.ResponseTimeoutMs">
<summary>
Response time out in milliseconds
</summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.BaudRate">
<summary>
BaudRate for Port
</summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.ReceiveBufferFlushThreshold">
<summary>
lower threshold for buffer flushing if dataMarker != SkipDecoding
receiveBufferFlushThreshold == null: never flush the communication buffer
receiveBufferFlushThreshold == 0: flush always the communication buffer
receiveBufferFlushThreshold == x: flush communication buffer if it exceeds x Byte
waste old records if an up-to-date record is being needed for start/stop synchronization
of a measurement. This is the level at which the old data have to be flushed because the
data have been dammed up in the communication port input buffer which means they are to
old for synchronization purposes.
/// </summary>
</member>
<member name="F:Xylem.Common.Hardware.Interfaces.Ports.PortCore.TransmitPortSettings.DoubleSyncByte">
<summary>
a special implementation may require the doubling of the sync byte to re-synchronize
</summary>
</member>
</members>
</doc>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,205 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages</name>
</assembly>
<members>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.BaseDataEventArgs">
<inheritdoc />
<summary>
abstract for set structure for BaseDataEventArgs
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.BaseDataEventArgs.GetData">
<summary>
'Base' get event record form real child.
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.BaseDataEventArgs.GetEventData">
<summary>
get real Event record
</summary>
<returns></returns>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.BaseDataEventArgs.RawData">
<summary>
Holds the record before decoding, for logging
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.CalibDataEventArgs">
<inheritdoc />
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.CalibDataEventArgs.CalibChl">
<summary>
Stream record for calibration on channel
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.CalibDataEventArgs.GetEventData">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.FlowDataEventArgs">
<inheritdoc />
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.FlowDataEventArgs.NewData">
<summary>
new record from Stream
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.FlowDataEventArgs.GetEventData">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs.#ctor(Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Byte[])">
<inheritdoc />
<summary>
Ctor with base record
</summary>
<param name="register">base record <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs.Register" /></param>
<param name="value">base record <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs.Value" /></param>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs.Register">
<summary>
Register witch has updated
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RegisterUpdatedEventArgs.Value">
<summary>
New Value in Register
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RequestResponseDataEventArgs">
<inheritdoc />
<summary>
EventArgs for Request Responses
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RequestResponseDataEventArgs.RequestResponseData">
<summary>
Request response from meter
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments.RequestResponseDataEventArgs.GetEventData">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord">
<inheritdoc />
<summary>
hold streaming record for protocol H (contains calibration record)
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.Validation">
<summary>
record validation
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.TotalTimeOfFlightS">
<summary>
total time of flight in seconds
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.DeltaTimeOfFlightS">
<summary>
delta time of flight in seconds
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.RAWTotalTimeOfFlight">
<summary>
total time of flight in cordonel units
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.RAWDeltaTimeOfFlight">
<summary>
delta time of flight in cordonel units
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.VolumeScaleRawPerMl">
<summary>
volume scale (default: 1024) means
1024digits = 1ml
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.VolumeFactorRawToQm">
<summary>
volume factor to convert raw to m³
uses 1E-6 (ml to m³) / VolumeScaleRawPerMl
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.DeltaVolumeRaw">
<summary>
raw volume between two samples
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.DeltaVolumeQm">
<summary>
calculated out of dRawVolume * VolumeFactorRawToQm .
in cubic meters
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.AccuVolumeRaw">
<summary>
accumulated raw volume
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.SampleIntervalS">
<summary>
sample interval between two samples in seconds
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.AmplitudeUpV">
<summary>
high threshold amplitude in V
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.AmplitudeDownV">
<summary>
low threshold amplitude in V
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.PulseWidthRatioUp">
<summary>
high ratio for pulse width
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.PulseWidthRatioDown">
<summary>
low ratio for pulse width
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.TemperatureRaw">
<summary>
raw temperature
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.TemperaturePowFactor">
<summary>
temperature scale
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.TemperatureDegC">
<summary>
calculated temperature in degree C
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord.ToString">
<summary>
Get result as string
</summary>
<returns></returns>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.FlowTestRecord">
<inheritdoc />
<summary>
struct to hold Led record for protocol F (contains measurement record)
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.FlowTestRecord.ToString">
<summary>
Get result as string
</summary>
<returns></returns>
</member>
</members>
</doc>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,618 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol</name>
</assembly>
<members>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands">
<summary>
Commands that the genesis meter support over the request protocol.
Functional Specification Breeze Core and Applications Revision:3.03(12748DOC11 - functional spec ICOE472.pdf)
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.Nop">
<summary>
9.2.5
Command 0x00 (NOP)
This command will do nothing, and will have no response.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCaps">
<summary>
9.2.6
Command 0x01 (Query capabilities)
This command will be used by the external computer to discover the protocol parameters that may be varied.
These can then be compared with the external computers capabilities and the best match selected.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCapsReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCaps"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetCaps">
<summary>
9.2.7
Command 0x03 (Set capabilities)
Used to finalize the baud rate and packet settings after negotiation.
The reply will be sent at the currently selected baud rate and packet length,
after which the settings will take effect
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetCapsReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetCaps"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.Train">
<summary>
9.2.8
Command 0x05 (Train)
This command will perform target driven data training, that is, where the target is in control of the data flow.
See also command 0x11.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.TrainReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.Train"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.RepeatLast">
<summary>
9.2.9
Command 0x07 (Repeat last)
Used by the external computer to request the last response to be resent, for example if it was found to be corrupted.
Note that the response 0x08 will never be sent, the reply to command 0x07 will be a verbatim resend of the last response.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.RepeatLastReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.RepeatLast"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadData">
<summary>
9.2.10
Command 0x09 (Read data)
This command makes reads of any random selection of configuration registers, up to the maximum packet size negotiated.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadDataReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadData"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteData">
<summary>
9.2.11
Command 0x0B (Write data)
This command makes writes to any random selection of configuration registers, up to the maximum packet size negotiated.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteDataReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteData"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadData">
<summary>
9.2.12
Command 0x0D (Multiple read data)
This command makes reads of one register multiple times, which will be more efficient than performing successive reads using command 0x09.
This command will be available from protocol version 0.40, for earlier protocol versions command 0x09 should be used.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadDataReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadData"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteData">
<summary>
9.2.13
Command 0x0F (Multiple write data)
This command makes writes to one register multiple times, which will be more efficient than performing successive reads using command 0x0B.
This command will be available from protocol version 0.40, for earlier protocol versions command 0x0B should be used.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteDataReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteData"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetLevel">
<summary>
9.2.14
Command 0x11 (Set level)
This command will perform external driven data training, that is, where the external computer is in control of the data flow.
This command will be available from protocol version 0.42, for earlier protocol versions command 0x05 should be used.
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetLevelReply">
<summary>
response on <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.SetLevel"/>
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.ConfigExErrors">
<summary>
Config Exchange error codes.
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.HighLevelErrors">
<summary>
Transport errors for request protocol
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors">
<summary>
List of constance for error codes from genesis meter
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.NoError">
<summary>
everything is fine
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.SerialPortClosed">
<summary>
Port is not open
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.SerialPortWriteFailure">
<summary>
fails to write to serial port
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.SerialPortReadFailure">
<summary>
fails to read from serial port
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.MaxDataLength">
<summary>
Command is to long
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.Exception">
<summary>
deeper exception, check out log if this happen
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.CrcCalcError">
<summary>
wrong CRC
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.Unknown">
<summary>
something strange
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.LowLevelErrors.Timeout">
<summary>
Timeout occur
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState">
<summary>
Acknowledge feedback from meter after communication
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.NoResponse">
<summary>
Response missing
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.CommandError">
<summary>
Response command not match the required command
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.AuthorizationRequired">
<summary>
Lost connection (logged out from meter), a re-authorization is required
to access this command and/or register
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.MeterError">
<summary>
Meter error received, a retry may be useful
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.DecodingError">
<summary>
The response record couldn't be decoded
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.RequestAcknowledgeState.Ok">
<summary>
Valid meter response record
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException">
<summary>
Holds all errors can occur on the request protocol
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.Command">
<summary>
Exception occurred on this command
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.ReceivedData">
<summary>
Exception occurred while receiving this data
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.ConfigExErrorCode">
<summary>
Error is interpreted and has a define error code
if its not null is Genesis.Protocols.Request.Const.ConfigExErrors
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.HighLevelErrorCode">
<summary>
Error is interpreted and has a define error code
if its not null is Genesis.Protocols.Request.Const.HighLevelError
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.#ctor(System.String)">
<summary>
Ctor with only message
</summary>
<param name="message">error message</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.#ctor(System.String,System.Object)">
<summary>
Ctor with message and <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.Command"/>
</summary>
<param name="message">error message</param>
<param name="command"><see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.Command"/></param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.#ctor(System.String,System.Object,System.Object)">
<summary>
Ctor with message, <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.Command"/> and <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.ReceivedData"/>
</summary>
<param name="message">error message</param>
<param name="command"><see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.Command"/></param>
<param name="receivedData"><see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Exceptions.RequestProtocolException.ReceivedData"/> </param>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord">
<summary>
Holds request commands with detail parameters to see processing state
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.Command">
<summary>
Indicates the base command <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands" />
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseCommand">
<summary>
Indicates the base command <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands" />
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.Register">
<summary>
the register the command refers to.
needed to set Register dictionary to link response with dictionary key
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.Acknowledge">
<summary>
Command acknowledged
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.RetryCtr">
<summary>
Retry counter
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.WakeupMessageRetryCtr">
<summary>
Wakeup-message retry counter
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorBase">
<summary>
indicates error base on <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorReason">
<summary>
indicates error reason on <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord"/>
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode">
<summary>
Combined error code of base and reason
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorPosition">
<summary>
Chunk position of error on multiple read/write access
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.RequestProtocolData">
<summary>
Data containing the request protocol
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.EncodedRequestData">
<summary>
Encoded with transmit protocol, ready to stream to port as is
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponsePayload">
<summary>
Extracted payload of response
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseTimeoutMs">
<summary>
Extracted payload of response
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.HideDataInLog">
<summary>
avoid logging for e.g. password
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.SkipRetryErrorCode">
<summary>
error mask to skip retries for functional errors <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode"/>
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.#ctor(System.Byte,System.Collections.Generic.List{System.Byte},System.Collections.Generic.List{System.Byte},System.Int32,Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Boolean,System.UInt16)">
<summary>
Ctor for an base command <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands" />
</summary>
<param name="command"><see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands" /> as an byte</param>
<param name="requestProtocolData">Request protocol data for logging</param>
<param name="encodedRequestData"> Ready to send data encoded with transmit protocol retries</param>
<param name="responseTimeoutMs">Timeout for response</param>
<param name="register"><see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition"/> to do command with</param>
<param name="hideDataInLog">hiding data in log file to avoid spying of passwords</param>
<param name="skipRetryErrorCode">error mask to skip retries <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode"/></param>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.EventArguments.AuthorizationRequiredEventArgs">
<inheritdoc />
<summary>
if session is gone and a re authorization is necessary
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.EventArguments.AuthorizationRequiredEventArgs.#ctor(Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord)">
<inheritdoc />
<summary>
Ctor
</summary>
<param name="command">this command will be resend after authorization</param>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.EventArguments.AuthorizationRequiredEventArgs.Command">
<summary>
Command to resend
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol">
<summary>
a bidirectional protocol support read and write genesis meter registers
needed for
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol._recordsSendFifo">
<summary>
FIFO of records to be send next
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol._recordInProcess">
<summary>
This is the actual record in the send loop
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.LastCommTime">
<summary>
Last communication time for session refresh
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.OnRecordReadyToSend">
<inheritdoc />
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.OnRecordIsDecoded">
<inheritdoc />
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.OnAuthorizationGrant">
<summary>
Occurs when a meter Response for write password is good
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.OnMeterRegisterUpdated">
<summary>
Event after a register entries changed
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.AdditionalRetryTimeoutMs">
<summary>
User adjustable additional retry timeout. This is 0 ms for standard operation.
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.#ctor(System.String)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.ProcessRecordList">
<summary>
Process all records needed to be sent, this routine has to be called
to kick-off the communication of all RequestRecords saved to the send
FIFO <see cref="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.AddRecordToSendFifo(System.Byte,System.Byte[],Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Boolean,System.UInt16)"/>
</summary>
<remarks date="2018-Dec-07" author="T.Wiedebusch">
- Initial
</remarks>
<remarks date="2018-Dec-09" author="T.Wiedebusch">
- Logging of raw RequestProtocol at time of sending,
- Logging of retries.
</remarks>
<remarks date="2018-Dec-12" author="T.Wiedebusch">
- Added timeout from transmit protocol.
</remarks>
<remarks date="2019-Jan-02" author="Drabesch">
- Added reorder FIFO to bring login at first position
</remarks>
<remarks date="2019-Apr-11" author="T.Wiedebusch">
- Hide data in logging for e.g. passwords
</remarks>
<remarks date="2019-Jun-06" author="T.Wiedebusch">
- Retry counter reset if authorization required and this record will be put back into FIFO,
- Retry delay corrected for all errors.
</remarks>
<remarks date="2019-Jun-12" author="T.Wiedebusch">
- Dynamic retry delay: ResponseTimeoutMs * Retry counter.
</remarks>
<remarks date="2019-Jun-28" author="T.Wiedebusch">
- Skip retries on specific error mask to speed up communication on functional errors
or informational feed backs (e.g FW not installed 0x0004)
<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode"/>
</remarks>
<remarks date="2019-Aug-29" author="T.Wiedebusch">
- User adjustable additional retry timeout.
</remarks>
<remarks date="2020-Jan-17/18" author="T.Wiedebusch">
- Response timeout message output,
- Initialize acknowledge code before communication to NoResponse.
</remarks>
<remarks date="2020-Jan-22" author="T.Wiedebusch">
- Response timeout deviated from system time.
</remarks>
<remarks date="2021-Feb-02" author="T.Wiedebusch">
- Avoid enqueue of _recordInProcess if retry counter is 0.
</remarks>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.AddRecordToSendFifo(System.Byte,System.Byte[],Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Boolean,System.UInt16)">
<summary>
Assemble record with transmit protocol and put it to record-send-FIFO,
backup the ready-to-send, which is the dataEncodedWithTransmitProtocol,
to the RequestRecord object for sending including the retry capability.
</summary>
<param name="payload">Data package with all details like CRC, etc</param>
<param name="cmd">Command identifier <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands" /></param>
<param name="register"><see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition" /> which is intend</param>
<param name="hideDataInLog">hiding data in log file to avoid spying of passwords</param>
<param name="skipRetryErrorCode">error mask to skip retries</param>
<returns>the assembled record for the send FIFO</returns>
<remarks date="2018-Dec-08" author="T.Wiedebusch">
- Initial
</remarks>
<remarks date="2018-Dec-09" author="T.Wiedebusch">
- Logging of raw data (RequestProtocol) moved to ProcessRecordList.
</remarks>
<remarks date="2018-Dec-12" author="T.Wiedebusch">
- Added timeout from transmit protocol.
</remarks>
<remarks date="2019-Apr-11" author="T.Wiedebusch">
- Hide data in logging for e.g. passwords
</remarks>
<remarks date="2019-Jun-28" author="T.Wiedebusch">
- Skip retries on specific error mask to speed up communication on functional errors
or informational feed backs (e.g FW not installed 0x0004)
<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode"/>
</remarks>
<remarks date="2020-Jan-18" author="T.Wiedebusch">
- Initial skip retry error code set to 0x0004 (e.g FW not installed 0x0004).
</remarks>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.DecodeRecord(Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs)">
<summary>
Called after successful response.
Decode and check record, handle Errors and dispatch result.
Invokes <see cref="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.OnRecordIsDecoded" />if somebody is listening
</summary>
<remarks date="2018-Mar-15" author="R.Drahbesch">
- Initial
</remarks>
<remarks date="2018-Dec-08" author="T.Wiedebusch">
- First part reworked to extract the response protocol information
</remarks>
<remarks date="2019-Apr-11" author="T.Wiedebusch">
- Hide data in logging for e.g. passwords
</remarks>
<remarks date="2019-Jun-28" author="T.Wiedebusch">
- Error code extraction changed for <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.SkipRetryErrorCode"/>
</remarks>
<remarks date="2019-Dec-12/16" author="T.Wiedebusch">
- Wakeup-message will avoid further timeout (during FW update this is in the range
of 15000ms).
- Allow one additional retry on decoding error, which is often the wakeup-message.
</remarks>
<remarks date="2019-Jan-17" author="T.Wiedebusch">
- Send time reminder for timeout time calculation as output in log-file,
- OnRecordIsDecoded?.Invoke moved before return to assure that the Acknowledge status is set.
</remarks>
<remarks date="2019-Jan-22" author="T.Wiedebusch">
- Avoid activation of wakeup retry if record is meanwhile acknowledged.
</remarks>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.CommandToMeter(System.Byte,Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Byte[],System.Nullable{System.Int32},System.Boolean,System.UInt16)">
<summary>
Method to send basic Commands to Meter. Creates an integer of 4 bytes for the payload.
Supported Commands are: <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadData" />,<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadData" />,
<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteData" />, <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteData" /> and <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCaps" />.
Calculate CRCs and Command length and check if command is valid.
Use <see cref="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.AddRecordToSendFifo(System.Byte,System.Byte[],Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition,System.Boolean,System.UInt16)" /> to push data to Port/Meter.
</summary>
<param name="command">
Supported <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadData" />,<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadData" />,
<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteData" />, <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteData" /> and <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCaps" />.
</param>
<param name="meterRegister">Register to Read or Write, null for <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.QueryCaps" /></param>
<param name="payload">
Data to push into the <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Registers.RegisterDefinition" />.
must be null on Read Commands ( <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.ReadData" />,<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleReadData" />)
and not null on WriteData (<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.WriteData" /> and <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.Consts.Commands.MultipleWriteData" />)
</param>
<param name="expectedLength"></param>
<param name="hideDataInLog">hiding data in log file to avoid spying of passwords</param>
<param name="skipRetryErrorCode">mask to skip reties on error</param>
<returns>an new command just send to port/meter </returns>
<remarks date="2018-Mar-15" author="R.Drahbesch">
- Initial
</remarks>
<remarks date="2018-Dec-08" author="T.Wiedebusch">
- Reworked to zero pad payload with chunks of 4 bytes, the caller needn't take care of the size
</remarks>
<remarks date="2018-Dec-09" author="T.Wiedebusch">
- Corrected payload content in request protocol
</remarks>
<remarks date="2019-Apr-11" author="T.Wiedebusch">
- Hide data in logging for e.g. passwords
</remarks>
<remarks date="2019-Jun-28" author="T.Wiedebusch">
- Skip retries on specific error mask to speed up communication on functional errors
or informational feed backs (e.g FW not installed 0x0004)
<see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestRecord.ResponseErrorCode"/>
</remarks>
<remarks date="2019-Aug-28" author="R.Drabesch">
- Multiple read for string split to simple reads.
</remarks>
<remarks date="2019-Jan-18" author="T.Wiedebusch">
- Default <see cref="F:Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig.CommunicationConfig.SkipRetryErrorCode"/> set.
</remarks>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.CheckErrorCode">
<summary>
Analyzes the error code
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.ReorderRecordList(System.String)">
<summary>
Reorders the record list so that first entry is the defined topRegister
</summary>
<param name="topRegister"></param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol.RequestProtocol.ContainsRegisterIdent(System.String)">
<summary>
Checks the active register to access
</summary>
<param name="registerName"></param>
<returns></returns>
</member>
</members>
</doc>

View File

@ -0,0 +1,99 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol</name>
</assembly>
<members>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingProtocol">
<inheritdoc />
<summary>
Layer between <see cref="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder" /> CRC16CCITT handler and Events
block trashy telegrams
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingProtocol._streamingDecode">
<summary>
Decode data and hold results
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingProtocol.OnRecordIsDecoded">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingProtocol.DecodeRecord(Xylem.Common.Hardware.Interfaces.Ports.PortCore.EventArguments.IPortDataEventArgs)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingProtocol.#ctor(System.String,System.Boolean)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder">
<summary>
Data fields and definitions for GENESIS streaming protocol
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder._dataDefault">
<summary>
Default data for
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DataCalib">
<summary>
Calibration data
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.#ctor(System.Boolean)">
<summary>
Constructor initializes all decoded members with default values
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DataFlowTest">
<summary>
Flow test data
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DecodeMsg(System.String)">
<summary>
Decoding the raw message
</summary>
<param name="rawMsg">message received as one line delimited with LF</param>
<returns>true if decoding was successful and data has been validated</returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DecodeProtocolF(System.Collections.Generic.IList{System.String})">
<summary>
Extracting message from string fields for protocol 'f'
</summary>
<param name="field">Separated fields containing the measurement as string</param>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DecodeProtocolG(Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord@,System.Collections.Generic.IList{System.String})">
<summary>
Extracting message from string fields to individual raw channel for protocol 'g'
</summary>
<param name="dataProtGRec">Reference to result structure for raw data for one channel</param>
<param name="field">Separated fields containing the measurement as string</param>
<returns>true if protocol is valid</returns>
<remarks date="2018-Mar-22" author="T.Wiedebusch">
- Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm
</remarks>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.DecodeProtocolH(Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords.CalibrationRecord@,System.Collections.Generic.IList{System.String})">
<summary>
Extracting message from string fields to individual raw channel for protocol 'g'
</summary>
<param name="dataProtHRec">Reference to result structure for raw data for one channel</param>
<param name="field">Separated fields containing the measurement as string</param>
<returns>true if protocol is valid</returns>
<remarks date="2018-Mar-22" author="T.Wiedebusch">
- Usage of VolumeFactorRawToQm and calculation of AccuDutOverflowVolumeCm
</remarks>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.ProtFsubString">
field position in protocol 'f'
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.ProtGsubString">
field position in protocol 'g'
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.StreamingProtocol.StreamingDecoder.ProtHsubString">
field position in protocol 'h'
</member>
</members>
</doc>

View File

@ -0,0 +1,563 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Hardware.WaterMeter.WaterMeterCore</name>
</assembly>
<members>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCall">
<summary>
Applies an action to a list of meters in a separate thread
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCall.RunAction(System.Collections.Generic.List{Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter})">
<summary>
Starts a new task for a list of meters
</summary>
<param name="forMeters"></param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCall.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<summary>
Apply a single action to a specific meter
</summary>
<param name="meter"></param>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallConnectMeter">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallConnectMeter.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallInitCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallInitCalibration.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallInitMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallInitMeasurement.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallLogin">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallLogin.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallSetCalibrationFactor">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallSetCalibrationFactor.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStartCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStartCalibration.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStartMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStartMeasurement.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStopCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStopCalibration.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStopMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.BatchActions.BatchCallStopMeasurement.DoSingleAction(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState">
<summary>
Common definition for Meter handling in production and on test benches
</summary>
<summary>
represents any error state a meter can have
if hash code is 0 everything is running
is Flags, so watch out to check with hasFlag!
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.None">
<summary>
everything is good
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.InitFailed">
<summary>
problems on initialization
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.MeasurementFailed">
<summary>
problems on Measurement
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.ComErrorRequestPort">
<summary>
Problem on communication with meter
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.ComErrorLed">
<summary>
Problem on optical output on meter
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.ComErrorPulse">
<summary>
if pulse can not readout
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.ErrorQRef">
<summary>
no (or no good) reference flow available
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.CalibrationFailed">
<summary>
Calibration went wrong
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.CalibrationOutOfRange">
<summary>
calibration is out of range. Check documentation from meter to find limitation
</summary>
</member>
<member name="F:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState.FatalError">
<summary>
blue screen like error
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch">
<summary>
Can hold various <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter"/>s and hold connection record to relieve the meter.
Every contact with meter has to go over <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch"/> even if you have just only one.
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.AddMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<summary>
holds all <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter"/>
Add <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.AddMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)"/> and delete with <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.RemoveMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)"/>
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.RemoveMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<summary>
Remove Meter from batch and clear communication
</summary>
<param name="meterToRemove"> meter to be removed</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.GetMeter(System.Int32)">
<summary>
Get meter from slot number.
</summary>
<param name="slot"></param>
<returns>null if slot has no genesis</returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.RemoveAllMeters">
<summary>
Remove all Meters and comports
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.GetCurrentMeter">
<summary>
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.GetCurrentMeterSlots">
<summary>
Detect all meters
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersLogin">
<summary>
login to all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersInit">
<summary>
Initialize all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersInitCalibration">
<summary>
Initialize calibration for all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersInitMeasurement">
<summary>
Initialize measurement for all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersSaveCalculatedCalibration">
<summary>
Store new calculated calibration to all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersStartCalibration">
<summary>
Start calibration for all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersStartMeasurement">
<summary>
Start measurement for all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersStopCalibration">
<summary>
Stop calibration of all meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterBatch.MetersStopMeasurement">
<summary>
Stop measurements of all meters
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch">
<summary>
Can hold various <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter"/>s and hold connection record to relieve the meter.
Every contact with meter has to go over <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch"/> even if you have only one.
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.#ctor(System.String)">
<summary>
ctor
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.ListOfMeters">
<summary>
Registered list of meters
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.AddMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.GetCurrentMeter">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.GetCurrentMeterSlots">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.RemoveMeter(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersLogin">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersInit">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersInitCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersInitMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersSaveCalculatedCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersStartCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersStartMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersStopCalibration">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.MetersStopMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.GetMeter(System.Int32)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.RemoveAllMeters">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.MeterBatch.Dispose">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter">
<inheritdoc />
<summary>
IMeter is the highest level interface between a meter with direct communication to a test bench.
has general things like calibration, measurement and set up routines.
no specific meter stuff in here!
it is always disposable
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnProcessStatusChanged">
<summary>
occurs when ProcessState has changed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnErrorStatusChanged">
<summary>
occurs when ErrorState has changed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnInitCompleted">
<summary>
occurs when Init is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnMeasurementInitCompleted">
<summary>
occurs when the initialization for Measurement is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnMeasurementCompleted">
<summary>
occurs when the Measurement is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnCalibInitCompleted">
<summary>
occurs when the initialization for calibration is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnCalibCompleted">
<summary>
occurs when the calibration is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.OnDisposeCompleted">
<summary>
occurs when meter gets disposed
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SerialNumber">
<summary>
unique meter identification
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.ProcessStatus">
<summary>
read-only to see current Process state <see cref="T:Xylem.Common.Metrology.Measurements.Consts.ProcessState" />
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.ErrorStatus">
<summary>
read-only to see current Error state <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.ErrorState" />
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.Slot">
<summary>
the current slot in test-bench
</summary>
</member>
<member name="P:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.IntermediateUpdateTimeS">
<summary>
Setup of intermediate update time for measurement updates and overflow detections,
has to be calculated depending on flow-rate and nominal diameter (DN)
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.ConnectMeter">
<summary>
Open Com ports, try some communication, login
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SetupFromConfigFile(System.Int32,System.Boolean)">
<summary>
Setup up meter from config file. just a workaround for vb6 calls. please do not use if your working with .net
</summary>
<param name="slot">Slot Number for Test bench</param>
<param name="ignoreCorruptedData">don´t send CRC error or telegrams with error flag to caller</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.Logout">
<summary>
Logout from device
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.Login">
<summary>
Start Login with password service
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.Login(System.String)">
<summary>
Start Login with out password service and a fixed password
</summary>
<param name="password">password for login</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.InitMeasurement">
<summary>
set up measurement parameter and set meter into test-mode
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StartMeasurement">
<summary>
Starting a Measurement
Meter must be initialized <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.InitMeasurement" />
Start to receive record from meter and decode this record into <code>MeasurementRecord</code>
<see cref="T:Xylem.Common.Metrology.Measurements.IMeasurementRecord" />
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StopMeasurement">
<summary>
Meter must have a active measurement <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StartMeasurement" />
Stop receive record from meter and decode record
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.GetMainMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double},System.Boolean)">
<remarks date="2018JAN09" author="drabesch">
- simplify the measurement results handling
- getting the main measurement of the entire device (combination of all paths)
- add MeasurementResult
- remove all other methods
</remarks>
<summary>
After a completed measurement , you can grab <see cref="T:Xylem.Common.Metrology.Measurements.MeasurementResults"/>
</summary>
<returns>Calculated results</returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.GetAllMeasurementResults(System.Nullable{System.Double},System.Nullable{System.Double},System.Boolean,System.Nullable{System.Int32})">
<summary>
The first measurement is ALWAYS a FlowTestRecord.
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.GetMeasurementState(System.Nullable{System.Int32})">
<summary>
get current state of the running measurement
</summary>
<param name="onlyChannelNr">leave empty for an aggregate state for all measurements or pass the channel number to check</param>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.InitCalibration">
<summary>
set up calibration parameter (calibration factor to default) and set meter into calibration mode
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StartCalibration">
<summary>
Starting a Calibration
Meter must be initialized <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.InitCalibration" />
Start to receive record from meter, decode and store this record
no <see cref="T:Xylem.Common.Metrology.Measurements.IMeasurementRecord" /> available
To finish calibration process run <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StopCalibration" />
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.StopCalibration">
<summary>
Meter must have a active for calibration <see />
Stop receive record from meter, decode and store record
record will not calculate or store
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.GetCalibrationState">
<summary>
Get current state of the running calibration
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.BuildAndCheckCalibFactorsAllChannels(System.Double,System.Nullable{System.Double},System.Double,System.Double)">
<summary>
Calculate calibration factor for static and flying start / stop
Results kept internal and not being saved to meter.
if you want to store them on meter use <see cref="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SetCalibFactorsAllChannels(System.Boolean)" />
</summary>
<param name="refVolumeCm">the reference volume is essential for calculation of calibration factor</param>
<param name="refTimeS">the reference time is needed for flying start/stop</param>
<param name="reqDeviationPercent">the required deviation to set the scale apart from 0</param>
<param name="maxCalibFactorTolerancePercent"> override the default max calibration factor tolerance</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SetCalibFactorsAllChannels(System.Boolean)">
<summary>
Save calculated calibration on meter if no calibration results available an exception occurred
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SetLcdText(System.Boolean,System.Byte[])">
<summary>
To control the LCD from meter for status information etc.
</summary>
<param name="release">if set to true the meter will show his normal screen, if set to false the next parameter will shown in display</param>
<param name="textInHex">test shown in LCD in byte array as hex value (0x33,0xFF shows 33FF on screen)</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes,System.Boolean)">
<summary>
Sets Display text and update production database
</summary>
<param name="newState">New ProductionState</param>
<param name="webRequest">web logging required per default true, for offline usage set to false</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.GetLastProcessState">
<summary>
Get last Process State
</summary>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.WriteLog(System.String)">
<summary>
Add external text to internal log file handling
</summary>
<param name="text">text to log</param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.LogRawData(System.Boolean)">
<summary>
Enable/Disable Raw record Logging
</summary>
<param name="on">True = Write Raw record into log/ false = Stop write raw record into log </param>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.CheckStateAfterMeasurement">
<summary>
Check if the meter has any errors that can occur on a measurement
the error reason has find out in the log files
</summary>
<returns>false = everything is good, detect at least one error</returns>
</member>
<member name="M:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter.DisposeMeter">
<summary>
Clear all object set up on runtime
</summary>
</member>
<member name="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents">
<summary>
Interface for <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter"/> Events
you can use <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents"/> without events (so with out <see cref="T:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeter"/>)
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnProcessStatusChanged">
<summary>
occurs when ProcessState has changed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnErrorStatusChanged">
<summary>
occurs when ErrorState has changed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnInitCompleted">
<summary>
occurs when Init is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnMeasurementInitCompleted">
<summary>
occurs when the initializations for Measurement is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnMeasurementCompleted">
<summary>
occurs when the Measurement is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnCalibInitCompleted">
<summary>
occurs when the initializations for calibration is completed
</summary>
</member>
<member name="E:Xylem.Common.Hardware.WaterMeter.WaterMeterCore.IMeterEvents.OnCalibCompleted">
<summary>
occurs when the calibration is completed
</summary>
</member>
</members>
</doc>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,680 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Xylem.Common.Metrology.Measurements</name>
</assembly>
<members>
<member name="T:Xylem.Common.Metrology.Measurements.BaseMeasurement">
<inheritdoc />
<summary>
Holds all stuff for calibration of a Genesis Meter
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement.DutStartRecord">
<summary>
Record at the start of the measurement
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement.DutStopRecord">
<summary>
Record at the end of the measurement
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement._lastIntermediateRecord">
<summary>
Backup of intermediate record
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement._last2IntermediateRecord">
<summary>
Backup of intermediate record for short term result
This can be used to observe a result (e.g. flow rate)
between two intermediate records. The update time is
set in the ctor by intermediateUpdateTimeS.
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement.IntermediateRecord">
<summary>
Intermediate record for ongoing measurement
</summary>
</member>
<member name="E:Xylem.Common.Metrology.Measurements.BaseMeasurement.OnActionStateHasChanged">
<inheritdoc />
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement._accuDutOverflowVolumeCm">
<summary>
Holds the accumulated overflow volume, will work only if
<see cref="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.CheckForOverFlowVolumeAndTime" /> is being called cyclically.
The overflow will take place due to the fixed point number format or the
display resolution setting.
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement._accuDutOverflowTimeS">
<summary>
Holds the accumulated overflow time, will work only if
<see cref="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.CheckForOverFlowVolumeAndTime" /> is being called cyclically.
The overflow takes place due to the fixed point number format.
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement.LoggerMeasurement">
<summary>
Logger for debug output of measurement
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement.Slot">
<summary>
Physical slot of the device
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.BaseMeasurement._channel">
<summary>
Identification of the channel
</summary>
</member>
<member name="P:Xylem.Common.Metrology.Measurements.BaseMeasurement.MeasurementState">
<inheritdoc />
<summary>
State machine for one measurement (on one meter and one channel)
</summary>
<history date="2018Jan24" author="drabesch">
- add State-machine for better handling
</history>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.#ctor(System.Int32,System.Type,System.Int32,System.Int32)">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetType">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetChannel">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.Clear">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.Dispose">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetShortTermMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetIntermediateMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetFinalMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.GetMeasurementState">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.StopMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.StartMeasurement">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.StartIntermediateMeasurement">
<summary>
Set flag for starting Calibration.
The next record is going to set the start values.
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.BaseMeasurement.AddData(Xylem.Common.Metrology.Measurements.IMeasurementRecord)">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Metrology.Measurements.CalibrationMeasurement">
<inheritdoc />
<summary>
Holds all stuff for calibration of a Genesis Meter
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.CalibrationMeasurement.CalibFactorRelativeDefault">
<summary>
Calibration default value used to reset meter calibration
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.CalibrationMeasurement._calibFactorToleranceRelative">
<summary>
relative value (e.g. 0.05)
</summary>
</member>
<member name="P:Xylem.Common.Metrology.Measurements.CalibrationMeasurement.CalibFactorTolerancePercent">
<summary>
Setup the required tolerance in percent for check (e.g. 5 = +/-5%)
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.CalibrationMeasurement.IsCalibFactorInTolerance(System.Double)">
<summary>
Check the tolerance of the calibration factor (e.g. 0.95 to 1.05 at 0.05 tolerance)
</summary>
<param name="calibFactorToCheck"></param>
<returns>true if the calibration factor is inside the tolerance </returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.CalibrationMeasurement.#ctor(System.Int32,System.Type,System.Int32,System.Int32)">
<inheritdoc />
<summary>
Remind the calibration factor for the register write access
</summary>
<param name="slot"></param>
<param name="measurementRecordType">FlowTestRecord or CalibrationRecord</param>
<param name="intermediateUpdateTimeS">Update time needed for overflow detection in seconds</param>
<param name="channel"></param>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.CalibrationMeasurement.CalculateCalibFactorRel(System.Double,System.Nullable{System.Double},System.Double)">
<summary>
Calculate calibration factor from reference volume and reference time if set.
The deviation can adjust the factor to a required offset, it may be useful not to calibrate to 0.0).
The Result is NOT being stored to the meter.
CAN BE USED FOR STATIC START/STOP AND FLYING START/STOP PROCEDURE
</summary>
<param name="RefVolumeCm">reference volume in m³</param>
<param name="refTimeS">reference time in seconds</param>
<param name="reqDeviationPercent">the deviation to set the calibration in %</param>
<returns> calibration factor as relative value or null if calibration factor cannot be calculated</returns>
<history date="06-Dec-2018" author="Thomas Wiedebusch">
- The scale factor for calibration is going to adjusted here to keep the measurement result accurate.
</history>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates">
<summary>
information about measurement results to identify on input depending results
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.Okay">
<summary>
everything is good
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.WrongChannel">
<summary>
inconsistent channel assignment
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.ZeroDutTime">
<summary>
DUT time zero
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.InvalidDutTime">
<summary>
DUT time is invalid
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.InvalidOverFlowTime">
<summary>
over flow time is invalid
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.ZeroRefTime">
<summary>
REF time zero
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.InvalidRefTime">
<summary>
REF time is invalid
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.ZeroDutVolume">
<summary>
DUT volume zero
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates.ZeroRefVolume">
<summary>
REF volume is unknown
</summary>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates">
<summary>
holds the current state for genesis actions (e.g. calibration,measurement)
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.NotStarted">
<summary>
If Measurement/Calibration/Action is not started
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsWaitingForStartData">
<summary>
Measurement/Calibration/Action waits for next record package and sore this as start record,
After this Measurement/Calibration/Action IsRunning
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsRunning">
<summary>
Measurement/Calibration/Action collecting record and wait for end call
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsWaitingForIntermediateData">
<summary>
Measurement/Calibration/Action collecting next record record
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsWaitingForEndData">
<summary>
Measurement/Calibration/Action waits for next record package and sore this as end record,
After this Measurement/Calibration/Action IsCompleted
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.MeasurementStates.IsCompleted">
<summary>
Measurement/Calibration/Action has start and end record and can calculate a result
</summary>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.Consts.ProcessState">
<summary>
ProcessState nearly linear
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.IsNotInit">
<summary>
meter not initialized
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.InitIsActive">
<summary>
meter currently in initialization
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.WaitForMeasurement">
<summary>
initialization done
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.MeasurementIsActive">
<summary>
meter is on measurement
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.MeasurementIsDone">
<summary>
Measurement is done (not equal to succeed)
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.WaitForCalibration">
<summary>
Meter is prepared for calibration
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.CalibrationIsActive">
<summary>
meter is on calibration
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.WaitForQRef">
<summary>
need Q from reference meter for calculation
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.QRefDone">
<summary>
Calibration is calculated
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.Consts.ProcessState.CalibrationIsDone">
<summary>
Calibration is stored on meter
</summary>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.IMeasurement">
<inheritdoc />
<summary>
Collection of measurement interfaces
</summary>
</member>
<member name="E:Xylem.Common.Metrology.Measurements.IMeasurement.OnActionStateHasChanged">
<summary>
Event for new action of measurement state
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetType">
<summary>
Get the Type of the measurement record
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetChannel">
<summary>
Get the channel no. the measurement collecting record for
</summary>
<returns> returns 0 when all channels should be collected</returns>
</member>
<member name="P:Xylem.Common.Metrology.Measurements.IMeasurement.MeasurementState">
<summary>
Actual state of the measurement
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.Clear">
<summary>
Clear start, intermediate and end record and set action state to idle
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.AddData(Xylem.Common.Metrology.Measurements.IMeasurementRecord)">
<summary>
Adding measurement record to processing FIFO
</summary>
<param name="record"></param>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetMeasurementState">
<summary>
Returns the actual state of the ongoing measurement
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.StartMeasurement">
<summary>
Fist clear all record from earlier calibrations.
Set flag for starting measurement.
The next record is going to set the start values.
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.StopMeasurement">
<summary>
Stop grabbing record from streaming.
Last Data package is count as end volume (and time)
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetShortTermMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<summary>
Returning the results of the ongoing measurement between two updates.
This can be used to update the screen during measurements like actual flow rate.
The timing will be set by the IntermediateUpdateTimeS.
</summary>
<param name="refTimeS"></param>
<param name="RefVolumeCm"></param>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetIntermediateMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<summary>
Returning the intermediate results of the ongoing measurement from the start of measurement until now!
</summary>
<param name="refTimeS"></param>
<param name="RefVolumeCm"></param>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.GetFinalMeasurementResult(System.Nullable{System.Double},System.Nullable{System.Double})">
<summary>
Returning the results of the measurements from start until stop.
</summary>
<param name="refTimeS">Measurement duration is needed explicit for flying start/stop procedure</param>
<param name="RefVolumeCm">reference volume is ALWAYS needed for scale and deviation</param>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurement.RequestIntermediateRecord">
<summary>
Sets a marker that a mesaurment start looking for an intermediate record
</summary>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.IMeasurementRecord">
<inheritdoc />
<summary>
interface for all incoming streaming protocol
to simplify measurements
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetVolumeCm">
<summary>
Get volume of the record
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetTimeS">
<summary>
Get time stamp of the record from meter
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetDataSyncMark">
<summary>
Get Data
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetChannel">
<summary>
Get the channel the record comes from
</summary>
<returns>returns 0 if the channel is unavailable for this type of record (e.g. protocol f) </returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetOverflowVolumeCm">
<summary>
Get overflow volume
</summary>
<returns></returns>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.IMeasurementRecord.GetOverflowTimeS">
<summary>
get overflow time
</summary>
<returns></returns>
</member>
<member name="T:Xylem.Common.Metrology.Measurements.MeasurementRecord">
<inheritdoc />
<summary>
struct to hold a measurement record
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.Channel">
<summary>
physical channel 1, 2 and 3
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.VolumeCm">
<summary>
actual volume in cubic meters
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.OverflowVolumeCm">
<summary>
Overflow volume
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.TimeS">
<summary>
time converted to seconds
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.OverflowTimeS">
<summary>
Overflow time
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.Crc">
<summary>
CRC16 CCITT
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.IsValid">
<summary>
record is valid
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.SyncMarkRecord">
<summary>
Mark package as start, end, intermediate or not sync
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.DecodedTime">
<summary>
time when package was decoded
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementRecord.ReceivedTime">
<summary>
time when package was received
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetVolumeCm">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetTimeS">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetDataSyncMark">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetChannel">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetOverflowVolumeCm">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.GetOverflowTimeS">
<inheritdoc />
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementRecord.Clone">
<inheritdoc />
</member>
<member name="T:Xylem.Common.Metrology.Measurements.MeasurementResults">
<inheritdoc />
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.State">
<inheritdoc cref="T:Xylem.Common.Metrology.Measurements.Consts.MeasurementResultsStates"/>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.Channel">
<summary>
Channel being needed for later analysis of channel number
as feedback to the caller
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.AccuDutOverflowVolumeCm">
<summary>
Accumulated overflow volume in cubic-meters,
the DUT internal range can overflow due to
the limitation of the number or the display resolution.
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.AccuDutOverflowTimeS">
<summary>
Accumulated overflow time in seconds,
the number-range can cause an timer overflow.
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DutStartRecord">
<summary>
DUT start record
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DutStopRecord">
<summary>
DUT end record
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DutVolumeCm">
<summary>
Volume = (End Volume + overflow) - Start Volume in cubic meters,
real DUT measurement uncorrected
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.CorrectedDutVolumeCm">
<summary>
DUT measurement corrected if REF time is given
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.RefVolumeCm">
<summary>
REF volume in cubic meters
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DutTimeS">
<summary>
Time = (End time + overflow) - Start time in seconds,
real DUT measurement uncorrected
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.RefTimeS">
<summary>
REF time in seconds
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DutFlowRateCmPh">
<summary>
Flow rate in cubic meters per hour based on DUT
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.RefFlowRateCmPh">
<summary>
Flow rate in cubic meters per hour based on REF
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.ScaleFactorRefToDut">
<summary>
Scale factor between REF volume and DUT volume
this will use the <see cref="F:Xylem.Common.Metrology.Measurements.MeasurementResults.CorrectedDutVolumeCm"/>
/// </summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DeviationDutToRefRel">
<summary>
Deviation between DUT volume and REF volume relative,
this will use the <see cref="F:Xylem.Common.Metrology.Measurements.MeasurementResults.CorrectedDutVolumeCm"/>
</summary>
</member>
<member name="F:Xylem.Common.Metrology.Measurements.MeasurementResults.DeviationDutToRefPer">
<summary>
Deviation between DUT volume and REF volume in percent,
this will use the <see cref="F:Xylem.Common.Metrology.Measurements.MeasurementResults.CorrectedDutVolumeCm"/>
</summary>
</member>
<member name="M:Xylem.Common.Metrology.Measurements.MeasurementResults.#ctor(Xylem.Common.Metrology.Measurements.IMeasurementRecord,Xylem.Common.Metrology.Measurements.IMeasurementRecord,System.Double,System.Double,System.Nullable{System.Double},System.Nullable{System.Double},System.Int32)">
<summary>
Calculation of measurement results, overflow will be taken into account:
- DutVolumeCm in cubic meters:
DUT volume measurement uncorrected, direct measurement from the DUT,
- CorrectedDutVolumeCm in cubic meters:
equals the uncorrected DutVolumeCm if REF time is unknown,
else it is the volume calculated from the DUT flow-rate with the REF time,
- DutTimeS in seconds:
DUT time measurement,
- DutFlowRateCmPh in cubic meters per hour:
based on DUT volume and DUT time uncorrected,
- RefFlowRateCmPh in cubic meters per hour:
REF volume and REF time being used,
- ScaleFactorRefToDut unit less:
calculated with absolute and corrected DUT volume and REF volume
needed for calibration, is higher than one if DUT volume is less than the REF volume,
can be directly used to calculate the new scale by multiplication with the current scale,
- DeviationDutToRefRel unit less:
calculated with absolute and corrected DUT volume and REF volume
deviation needed for verification relative of DUT to REF,
- DeviationDutToRefPer in percent:
calculated with absolute and corrected DUT volume and REF volume
deviation needed for verification of DUT to REF in percent.
</summary>
<history date="07-Nov-2018" author="Thomas Wiedebusch">
- Scale factor calculation added,
- Deviation calculation added.
</history>
<history date="03-Nov-2018" author="Thomas Wiedebusch">
- Flow rate calculation added,
- Slot added.
</history>
<history date="19-Dec-2018" author="Thomas Wiedebusch">
- RefVolumeCm, RefTimeSS and absVolumeQm added,
- Slot removed.
</history>
<history date="22-Jan-2019" author="Thomas Wiedebusch">
- FlowRateQmPh split to DutFlowRateCmPh and RefFlowRateCmPh,
- CorrectedDutVolumeCm added,
- input channel compared with start and end record channels.
</history>
<history date="27-Feb-2019" author="Thomas Wiedebusch">
- State implemented.
</history>
<history date="01-Mar-2019" author="Thomas Wiedebusch">
- Check and states for DUT time zero, DUT volume zero, over flow volume below zero,
start and end record time below zero.
</history>
<history date="04-Mar-2019" author="Thomas Wiedebusch">
- Supported static start/stop with DUT- and REF-volume, this is time independent but the
DUT- and over-flow-times shouldn't be negative or zero.
- Meter renamed to DUT (Device under Test).
</history>
<param name="dutStartRecord">Start of measurement record set </param>
<param name="dutStopRecord">End of measurement record set </param>
<param name="accuDutOverflowVolumeCm">accumulated overflow volume, will add to result volume</param>
<param name="accuDutOverflowTimeS">accumulated overflow time, will add to result time</param>
<param name="refTimeS">measured REF time</param>
<param name="refVolumeCm">REF volume</param>
<param name="requiredChannel">physical channel of measurement path (0 for main measurement)</param>
</member>
</members>
</doc>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Binary file not shown.

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="Xylem.Common.Ui.GenesisToolBox.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
</startup>
<userSettings>
<Xylem.Common.Ui.GenesisToolBox.Properties.Settings>
<setting name="InitialBinaryPath" serializeAs="String">
<value />
</setting>
<setting name="InitialPackageFile" serializeAs="String">
<value />
</setting>
</Xylem.Common.Ui.GenesisToolBox.Properties.Settings>
</userSettings>
<appSettings>
<add key="AdminName" value="My Name" />
<add key="AdminEMail" value="MyEMailAddress" />
<add key="GenesisGetOrderNumberServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/ordernumber?PcbId=" />
<add key="GenesisGetRadioAdressServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/radioadress?PcbId=" />
<add key="GenesisGetKeySetIdServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/getkeysetid?PcbId=" />
<add key="GenesisGetPasswordServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/GetPassword?PcbId=" />
<add key="GenesisSetPasswordServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/setpassword?PcbId=" />
<add key="GenesisPasswordContainerServiceUrl" value="http://sla12iis01/MeterProcessState/api/Password/GetPasswordHashFileContent?PcbId=" />
<add key="MarriageServiceUrl" value="http://sla12iis01/MeterProcessState/api/Marriage/" />
<add key="MeterProcessStateUrl" value="http://sla12iis01/MeterProcessState/api/ProccesState/" />
<add key="GenesisFinalCheckServiceUrl" value="http://sla12iis01/MeterProcessState/api/FinalCheck/" />
<add key="GenesisRadioCheckServiceUrl" value="http://sla12iis01/MeterProcessState/api/RadioCheck/" />
<add key="GetSoftwareStartUpAccessUrl" value="http://sla12iis01/MeterProcessState/api/SoftwareAccess/GetVersionIsValid" />
<!--<add key="GenesisGetOrderNumberServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/ordernumber?PcbId=" />
<add key="GenesisGetRadioAdressServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/radioadress?PcbId=" />
<add key="GenesisGetKeySetIdServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/getkeysetid?PcbId=" />
<add key="GenesisGetPasswordServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/GetPassword?PcbId=" />
<add key="GenesisSetPasswordServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/setpassword?PcbId=" />
<add key="GenesisPasswordContainerServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Password/GetPasswordHashFileContent?PcbId=" />
<add key="MarriageServiceUrl" value="http://10.49.40.25/MeterProcessState/api/Marriage/" />
<add key="MeterProcessStateUrl" value="http://10.49.40.25/MeterProcessState/api/ProccesState/" />
<add key="GenesisFinalCheckServiceUrl" value="http://10.49.40.25/MeterProcessState/api/FinalCheck/" />
<add key="GenesisRadioCheckServiceUrl" value="http://10.49.40.25/MeterProcessState/api/RadioCheck/" />
<add key="GetSoftwareStartUpAccessUrl" value="http://10.49.40.25/MeterProcessState/api/SoftwareAccess/GetVersionIsValid" />-->
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>

Some files were not shown because too many files have changed in this diff Show More