This commit is contained in:
Roland Drabesch
2023-08-31 09:45:14 +02:00
822 changed files with 47455 additions and 46536 deletions
@@ -102,9 +102,14 @@
<PropertyGroup />
<PropertyGroup />
<PropertyGroup />
<PropertyGroup />
<PropertyGroup />
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net40\Newtonsoft.Json.dll</HintPath>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net40\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=5.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.5.2.2\lib\net35\NLog.dll</HintPath>
</Reference>
<Reference Include="PdfSharp, Version=1.50.5147.0, Culture=neutral, PublicKeyToken=f94615aa0424f9eb, processorArchitecture=MSIL">
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.dll</HintPath>
@@ -113,9 +118,14 @@
<HintPath>..\packages\PDFsharp.1.50.5147\lib\net20\PdfSharp.Charting.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http">
<HintPath>..\..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Net.Http.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="GenerateReport.cs" />
@@ -152,6 +162,8 @@
<DependentUpon>PreAdjustmentControl.cs</DependentUpon>
</Compile>
<Compile Include="PreAdjustmentSettingsContainer.cs" />
<Compile Include="Processes\Actions\MagFluxZeroFlow.cs" />
<Compile Include="Processes\Actions\PressureTestProcess.cs" />
<Compile Include="Processes\Actions\FlushProcess.cs" />
<Compile Include="Processes\Actions\PrepareTestProcess.cs" />
<Compile Include="Processes\Actions\AmplitudeTestProcess.cs" />
@@ -225,6 +237,10 @@
<Project>{2E139F63-B6FE-4EA9-A098-85364FE9B26C}</Project>
<Name>PortCore</Name>
</ProjectReference>
<ProjectReference Include="..\Hardware\Interfaces\Protocols\ProtocolCore\ProtocolCore.csproj">
<Project>{8BDD2789-96D4-43EA-AAD7-0F49D0347998}</Project>
<Name>ProtocolCore</Name>
</ProjectReference>
<ProjectReference Include="..\Hardware\WaterMeter\Genesis\DataPackages\DataPackages.csproj">
<Project>{0E524D43-7B66-45CD-AA74-41D51AFC3D99}</Project>
<Name>DataPackages</Name>
@@ -6,6 +6,7 @@ using System.IO;
using System.Text;
using System.Windows.Forms;
using Xylem.Common.CommonCore.Consts;
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
@@ -28,6 +28,18 @@ namespace Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters
FlowrateQmH = 100;
DurationS = 120;
break;
case MeterSize.DN100:
FlowrateQmH = 140;
DurationS = 120;
break;
case MeterSize.DN125:
FlowrateQmH = 140;
DurationS = 120;
break;
case MeterSize.DN150:
FlowrateQmH = 200;
DurationS = 120;
break;
default:
Message = $"Warning no parameter for meter size {meterSize.GetHashCode()} use default!{Environment.NewLine}";
FlowrateQmH = 40;
@@ -11,7 +11,9 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
using Xylem.Common.Ui.CordonelPreadjustmentUi.Parameters;
@@ -393,6 +395,7 @@ namespace CordonelPreadjustmentUi
{
this.l_ZeroFlowCal_TempCal.ForeColor = color;
}
public enum StatusPanelItems
{
None = 0,
@@ -1675,15 +1678,21 @@ namespace CordonelPreadjustmentUi
List<IProcess> listOfProgrammParts = new List<IProcess>();
listOfProgrammParts.Add(new PrepareTestProcess("PrepareTest", StatusPanelItems.Detect, string.Empty, string.Empty, 1 * 60));
listOfProgrammParts.Add(new LoginProcess("Login", StatusPanelItems.Detect, PredefinedMessages.WaitUntilLoginFinished(pp.Setting.Culture), PredefinedMessages.LoginFailed(pp.Setting.Culture), 1 * 60));
listOfProgrammParts.Add(new FlushProcess("First Flush", StatusPanelItems.Detect, PredefinedMessages.WaitUntilFlushFinished(pp.Setting.Culture), string.Empty, 2 * 60));
listOfProgrammParts.Add(new PressureTestProcess("PreussureTest", StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60));
listOfProgrammParts.Add(new PreparationProcess("Preparation", StatusPanelItems.Prepare, PredefinedMessages.WaitUntilPreparationFinished(pp.Setting.Culture), PredefinedMessages.PreparationFailed(pp.Setting.Culture), 1 * 60));
if (!pp.Setting.TempOnly)
{
listOfProgrammParts.Add(new AmplitudeTestProcess("Amplitude Test", StatusPanelItems.Amplitude, PredefinedMessages.WaitUntilAmplitudeTestFinished(pp.Setting.Culture), PredefinedMessages.AmplitudeFailed(pp.Setting.Culture), 4 * 60));
@@ -1857,7 +1866,7 @@ namespace CordonelPreadjustmentUi
{
if (!pp.IsAutomaticMode)
{
checkMeterForFailed.Meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.ZeroFlowFailed);
checkMeterForFailed.Meter.SetProcessState(DisplayCodes.ZeroFlowFailed);
}
}
@@ -1930,7 +1939,7 @@ namespace CordonelPreadjustmentUi
}
}
private void PushProgressBars(int totalSecondsEstm, DateTimeOffset totalStart, int currentProccessEstm, DateTimeOffset currentProccessStartTime)
public void PushProgressBars(int totalSecondsEstm, DateTimeOffset totalStart, int currentProccessEstm, DateTimeOffset currentProccessStartTime)
{
if (this.InvokeRequired)
{
@@ -63,6 +63,7 @@ namespace CordonelPreadjustmentUi
public Int32 OffsetTestBadDataLimit { get; internal set; } = 3;
#endregion
public bool Production = true;
private string CultureStr;
public List<Int32> TempMeters = new List<Int32>() { 1, 10 };
@@ -122,7 +123,7 @@ namespace CordonelPreadjustmentUi
Double upperTempLimit = 35,
Double lowerTempLimit = 15,
Double tempDeviationLimit = 1,
Int32 ampTestTofRecordingTime = 2,
Int32 ampTestTofRecordingTime = 6,
Double ampTestTriggerValue = 0.5,
bool ampTestGenerateLogfiles = true,
bool ampTestGenerateMeanValuesFile = true,
@@ -6,7 +6,9 @@ using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Xylem.Common.CommonCore.Configuration;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
using Xylem.Common.Logic.SoftwareAccessHelper;
using static CordonelPreadjustmentUi.PreAdjustmentControl;
@@ -151,7 +153,7 @@ namespace CordonelPreadjustmentUi.Processes.Actions
{
if (pp.IsAutomaticMode)
{
meterctl.Meter.SetProcessState(Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts.DisplayCodes.ZeroFlowFailed);
meterctl.Meter.SetProcessState(DisplayCodes.ZeroFlowFailed);
}
pp.DebugMessage($"{ProcessName} procedure failed", meterctl.Slot, "APP", meterctl.Meter.PcbId);
pp.GenerateReturnNote(PredefinedMessages.CompletionFailed(pp.Setting.Culture), meterctl);
@@ -0,0 +1,62 @@
//using CordonelPreadjustmentUi.Processes;
//using CordonelPreadjustmentUi.Processes.Itinerary;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Threading.Tasks;
//using static CordonelPreadjustmentUi.PreAdjustmentControl;
//namespace Xylem.Common.Ui.CordonelPreadjustmentUi.Processes.Actions
//{
// public class MagFluxZeroFlowProcess : BaseProcess
// {
// public MagFluxZeroFlowProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS) : base(processName, panelState, performMessage, failedMessage, expectedTimeS)
// {
// }
// public override List<Task> StartWork()
// {
// return doWorkProcess(base.CurrentProcessProgress);
// }
// private List<Task> doWorkProcess(ProcessProgress currentProcessProgress)
// {
// private List<Task> doWorkProcess(ProcessProgress pp)
// {
// var MetersToProcess = MeterStateCtls.Where(e => e.IsEnabled).ToList();
// var listOfProcessTask = new List<Task>();
// listOfProcessTask.Add(new Task<bool>(() =>
// {
// pp.DebugMessage($"Performing {ProcessName} procedure", null, "APP");
// var ZeroOffsetTime = DateTimeOffset.UtcNow.AddMinutes(2);
// var MetersToProcess = MeterStateCtls.Where(e => e.IsEnabled).ToList();
// while (ZeroOffsetTime > DateTimeOffset.UtcNow)
// {
// Thread.Sleep(1000);
// }
// return true;
// }));
// return listOfProcessTask;
// }
// }
// }
//}
@@ -16,8 +16,6 @@ namespace CordonelPreadjustmentUi.Processes.Actions
{
public class PreparationProcess : BaseProcess
{
public PreparationProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS) : base(processName, panelState, performMessage, failedMessage, expectedTimeS)
{
}
@@ -99,9 +97,17 @@ namespace CordonelPreadjustmentUi.Processes.Actions
Ok = WriteRegisterSafe(meterctl.Meter, "Samplerate", Register.Genesisflow.SampleRate, pp.Setting.Samplerate);
if (CheckAbort(Ok, meterctl)) { return Ok; }
Ok = WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
if (CheckAbort(Ok, meterctl)) { return Ok; }
if (pp.Setting.Production)
{
Ok = WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
if (CheckAbort(Ok, meterctl)) { return Ok; }
}
else
{
WriteRegisterSafe(meterctl.Meter, "Metersize", Register.Genesisflow.MeterSize, pp.Setting.MeterSize.GetHashCode(), false);
if (CheckAbort(Ok, meterctl)) { return Ok; }
}
Ok = WriteRegisterSafe(meterctl.Meter, "LED mode", Register.Genesisflow.LedMode, pp.Setting.LedMode.GetHashCode());
if (CheckAbort(Ok, meterctl)) { return Ok; }
@@ -0,0 +1,256 @@
namespace CordonelPreadjustmentUi.Processes.Actions
{
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Xylem.Common.CommonCore.Configuration;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Logic.SoftwareAccessHelper;
using static CordonelPreadjustmentUi.PreAdjustmentControl;
/// <summary>
/// Process for cordonel water meters with pressure sensor.
/// </summary>
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
/// Just started implementing pressure test for water meters with pressure sensor.
/// </remarks>
public class PressureTestProcess : BaseProcess
{
/// <summary>
/// Read / Write is pressure present for the water meter.
/// </summary>
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
/// Just started implementing pressure test for water meters with pressure sensor.
/// </remarks>
private const string PRESSURE_PRESENT = "METROLOGYASST_PressurePresent";
/// <summary>
/// Read / Write pressure measurements for the water meter.
/// </summary>
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
/// Just started implementing pressure test for water meters with pressure sensor.
/// </remarks>
private const string PRESSURE_MEASURE = "METROLOGYASST_PressureMeasure";
/// <summary>
/// Constructor for passing parameters to the base constructor of the derived class.
/// </summary>
/// <param name="processName">The name used to show into the GUI.</param>
/// <param name="panelState">TODO: Get the right description. Probably the state for the box into the GUI. ???</param>
/// <param name="performMessage">TODO: Get the right description. Probably the success message to show into the GUI. ???</param>
/// <param name="failedMessage">TODO: Get the right description. Probably the error message to show into the GUI. ???</param>
/// <param name="expectedTimeS">TODO: Get the right description. Probably the expected time for process the pressure tests. ???</param>
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
/// Just started implementing pressure test for water meters with pressure sensor.
/// </remarks>
public PressureTestProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS)
: base(processName, panelState, performMessage, failedMessage, expectedTimeS)
{
}
/// <summary>
/// Determinates and initializes a list of pressure measure tests processes on the logedin cordonels with pressure sensor.
/// Programm workflow for Cordonels with pressure sensor.
/// When any of the water meters has presure sensor - load the test specification.
/// Acording to the test specification process all meters, also the referenz on workplaces 11 and 12.
/// <list type="number">
/// <listheader>Measurement as follow.</listheader>
/// <item>Measure starts with <see cref="PRESSURE_MEASURE"/> = 1</item>
/// <item>Then registry is readeded and comaired to the referenz meters acording to the specification.</item>
/// </list>
/// </summary>
/// <returns>Returns a <see cref="List{Task}"/> for processing the pressure tests on the goggedin cordonels.</returns>
/// <remarks date="2023-05-23" author="Stoyan Zlatev">
/// Just started implementing pressure test for water meters with pressure sensor.
/// </remarks>
public override List<Task> StartWork()
{
/// List of the processes to start.
var listOfPresureTestTasks = new List<Task>();
var pressureTestSpecification = default(PressureTestSpecification);
var pressureTestSpecificationLoaded = false;
/// Just to not lose from focus the process progrss object.
var processProgress = base.CurrentProcessProgress;
var minPressureReferenzValue = default(int?);
var maxPressureReferenzValue = default(int?);
/// Looping trough all <see cref="MeterStateControl"/>s to determinate whitch are with pressure sensor.
foreach (var meterStateControl in base.MeterStateCtls)
{
/// If the meter is enabled and pressure sensor is present a new pressure mesure task should be initialized and added to the processes list.
if (meterStateControl.IsEnabled)
{
/// Getting the meter object from the state control.
var meter = meterStateControl.Meter;
/// Reads the buffer for determinating if the pressure sensor is present.
var isPressurePresentBuffer = meter.ReadRegister(PRESSURE_PRESENT);
/// Converted value for determinating if the pressure sensor is present.
var isPressurePresent = RegisterConverter.ConvertTo<bool>(isPressurePresentBuffer);
if (!isPressurePresent)
{
processProgress.DebugMessage($"Watermeter has no pressure sensor!", meterStateControl.Slot, "DC", meter.PcbId);
continue;
}
/// Loads the pressure test specification from the defined web service if not yet loaded.
if (pressureTestSpecification is null && !pressureTestSpecificationLoaded)
{
pressureTestSpecificationLoaded = true;
pressureTestSpecification = this.LoadPressureTestSpecification();
/// if loading fails
if (pressureTestSpecification is null)
{
processProgress.DebugMessage($"Test specification could not be loaded properly!", meterStateControl.Slot, "DC", meter.PcbId);
// TODO: Handle possible exceptions by making http request.
continue;
}
}
/// Initialize min and max referenz values ones for all meters
if (minPressureReferenzValue is null)
{
/// setting the min and max values on their oposit values.
/// checking the equality later will set up a value by 1 or more referenz meters.
minPressureReferenzValue = int.MaxValue;
maxPressureReferenzValue = int.MinValue;
if (processProgress.Setting.GetTempUseTempFlansh() || TempMeterStateCtls.Any(a => a.IsEnabled))
{
/// Determinates the min and max values aus temperatur meters list.
foreach (var referenzMeterState in base.TempMeterStateCtls)
{
if (referenzMeterState.IsEnabled)
{
var referenzMeter = referenzMeterState.Meter;
/// Reset meter pressure
referenzMeter.WriteRegister(PRESSURE_MEASURE, 1);
if (!referenzMeter.IsLoggedOn)
{
referenzMeter.Login();
}
var referenzPressureBuffer = referenzMeter.ReadRegister(PRESSURE_MEASURE);
var referenzPressure = RegisterConverter.ConvertTo<int>(referenzPressureBuffer);
if (referenzPressure < minPressureReferenzValue)
{
minPressureReferenzValue = referenzPressure;
}
if (referenzPressure > maxPressureReferenzValue)
{
maxPressureReferenzValue = referenzPressure;
}
}
}
}
/// Continue if min pressure value is still its oposit for the type. There was no referenz zehler found.
if (minPressureReferenzValue == int.MaxValue)
{
processProgress.DebugMessage($"No referenz watermeter found!", meterStateControl.Slot, "DC", meter.PcbId);
continue;
}
listOfPresureTestTasks.Add(new Task<bool>(() =>
{
var measuredTestValues = new int[pressureTestSpecification.NumberOfMeasurements];
var measurementDelyInS = pressureTestSpecification.TimeMeasurementsInS * 1000;
var numberOfMeasurements = pressureTestSpecification.NumberOfMeasurements;
var testDate = DateTime.Now;
for (int measurement = 0; measurement < numberOfMeasurements; measurement++)
{
/// Reset meter pressure
meter.WriteRegister(PRESSURE_MEASURE, 1);
/// Read the new meter pressure
var pressureMeasureBuffer = meter.ReadRegister(PRESSURE_MEASURE);
var pressureInPascals = RegisterConverter.ConvertTo<int>(pressureMeasureBuffer);
measuredTestValues[measurement] = pressureInPascals;
processProgress.DebugMessage($"Measure {measurement + 1}: {pressureInPascals}Pa", meterStateControl.Slot, "DC", meter.PcbId);
/// Dely only for first n - 1 measurements
if (measurement < numberOfMeasurements - 1)
{
Thread.Sleep(measurementDelyInS);
}
}
var avgPressure = (int)measuredTestValues.Average();
var testPassed = minPressureReferenzValue <= avgPressure && avgPressure <= maxPressureReferenzValue;
var avgPressureInBars = avgPressure / 100_000F;
processProgress.DebugMessage($"Average pressure: {avgPressure}Pa", meterStateControl.Slot, "DC", meter.PcbId);
processProgress.DebugMessage($"Average pressure: {avgPressureInBars}Bar", meterStateControl.Slot, "DC", meter.PcbId);
if (!this.PostPressureTestResult(meter.PcbId, avgPressureInBars, testPassed, testDate))
{
processProgress.DebugMessage($"Test result was not posted!", meterStateControl.Slot, "DC", meter.PcbId);
return false;
}
return testPassed;
}));
}
}
}
return listOfPresureTestTasks;
}
private PressureTestSpecification LoadPressureTestSpecification()
{
try
{
var responseContent = LocalWebRequest.GetRequest(ServiceUrls.GetPressureSensorSpecificationURL);
return JsonConvert.DeserializeObject<PressureTestSpecification>(responseContent);
}
catch (Exception e)
{
return null;
}
}
private bool PostPressureTestResult(string pcbIdText, float avgPressure, bool passed, DateTime testDate)
{
try
{
return LocalWebRequest.PostRequestAsync(ServiceUrls.PostPressureSensorResultURL, json: new
{
PcbId = int.TryParse(pcbIdText, out int pcbId) ? pcbId : default(int?),
AvgPressureInBar = avgPressure,
TestPassed = passed,
TestDate = testDate,
});
}
catch (Exception e)
{
return false;
}
}
}
internal class PressureTestSpecification
{
public int NumberOfMeasurements { get; set; }
public int TimeMeasurementsInS { get; set; }
public float MaxDeviationInBar { get; set; }
}
}
@@ -20,6 +20,7 @@ namespace CordonelPreadjustmentUi.Processes
public readonly string PerformMessage;
public readonly int ExpectedTimeS;
public DateTimeOffset StartTime;
public BaseProcess(string processName, StatusPanelItems panelState, string performMessage, string failedMessage, int? expectedTimeS = null)
{
ProcessName = processName;
@@ -30,6 +31,7 @@ namespace CordonelPreadjustmentUi.Processes
ExpectedTimeS = expectedTimeS.HasValue ? expectedTimeS.Value : 0;
}
internal List<MeterStateControl> AllMeterStateCtrls()
{
var r = new List<MeterStateControl>();
@@ -75,29 +77,29 @@ namespace CordonelPreadjustmentUi.Processes
var completTasks = new Task(() =>
{
try
{
while (!listOfProcessTasks.All(t => t.IsCompleted))
{
try
if (pp.CancellationSource != null && pp.CancellationSource.IsCancellationRequested)
{
while (!listOfProcessTasks.All(t => t.IsCompleted))
{
if (pp.CancellationSource != null && pp.CancellationSource.IsCancellationRequested)
{
return;
}
Thread.Sleep(5);
}
GetSequenceResult($"{ProcessName} sequence");
pp.IsBusy = false;
return;
}
catch (Exception ex)
{
Thread.Sleep(5);
}
throw new ApplicationException("Error on waiting for completition", ex);
}
GetSequenceResult($"{ProcessName} sequence");
pp.IsBusy = false;
}
catch (Exception ex)
{
throw new ApplicationException("Error on waiting for completition", ex);
}
});
});
completTasks.Start();
@@ -4,7 +4,6 @@ using System.Globalization;
using System.Threading;
using Logic.ProductionToProductMapper.Cordonel;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
using Xylem.Common.Ui.CordonelPreadjustmentUi;
using System.Collections.Generic;
using Xylem.Common.Logic.ProductionOrderCore.OrderData;
@@ -9,6 +9,8 @@ using System.Linq;
using System.Threading;
using Logic.ProductionToProductMapper.Cordonel;
using Xylem.Common.CommonCore.Consts;
using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
using Xylem.Common.Hardware.Interfaces.Protocols.ProtocolCore.EventArguments;
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.EventArguments;
using Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.MeasurementRecords;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisConfig;
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="GetPressureSensorSpecificationURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/GetTestSpec"/>
<add key="PostPressureSensorResultURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/PostTestResults"/>
<add key="PressureSensorResultsURL" value="http://sla12iis01.emea.sensus.net/MeterProcessState/api/CordonelPressureSensorTest/GetTestResults/{0}"/>
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net40" />
<package id="Newtonsoft.Json" version="13.0.3" targetFramework="net40" />
<package id="NLog" version="5.2.2" targetFramework="net40" />
<package id="PDFsharp" version="1.50.5147" targetFramework="net40" />
</packages>