Common\Hardware\WaterMeter\Genesis\GenesisFile\MeterFile.cs
This commit is contained in:
Roland Drabesch
2022-04-06 12:38:28 +02:00
62 changed files with 6496 additions and 977 deletions
+63
View File
@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
+1
View File
@@ -98,6 +98,7 @@ StyleCopReport.xml
*.pidb
*.svclog
*.scc
*.cache
# Chutzpah Test files
_Chutzpah*
+2 -2
View File
@@ -14,5 +14,5 @@ using System.Reflection;
//[assembly: AssemblyVersion("1.2.*.0")]
[assembly: AssemblyVersion("2.1.4.*")]
[assembly: AssemblyFileVersion("2.1.4.04")]
[assembly: AssemblyVersion("2.2.0.*")]
[assembly: AssemblyFileVersion("1.3.0.10")]
+1 -1
View File
@@ -155,7 +155,7 @@
</site>
<site name="MeterProcessState" id="2">
<application path="/" applicationPool="Clr4IntegratedAppPool">
<virtualDirectory path="/" physicalPath="C:\Users\drabesch_ro\Repo\lab\la_operations\laa_production\Common\Service\MeterProcessState" />
<virtualDirectory path="/" physicalPath="D:\Projekte\SENSUS_GitLab\laa_production\Common\Service\MeterProcessState" />
</application>
<bindings>
<binding protocol="http" bindingInformation="*:56011:localhost" />
+2
View File
@@ -4,6 +4,8 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=binfile/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=BUGFIX/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Calib/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=catalogue/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=CCITT/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=CONFIGEXCHANGE/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Consts/@EntryIndexedValue">True</s:Boolean>
+3
View File
@@ -22,6 +22,9 @@
&lt;Assembly Path="D:\Projekte\SENSUS_tfs_workspaces\WorkBenchV2\Main\Common\Ui\IrdaFunctionalTestApp\bin\Debug\Xylem.Common.Hardware.WaterMeter.Genesis.DataPackages.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/Hierarchy/EntityFrameworkOptions/IsAlreadyNotifiedAboutEntityFramework/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=a44a776d_002Dd671_002D4675_002Dac7b_002Db6775ec7f289/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from Solution" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;&#xD;
&lt;Solution /&gt;&#xD;
&lt;/SessionState&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=0/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName&gt;D:\Workspace\WorkBenchV2\Main\ZeroFlowTool\bin\Debug\GenesisDisplayTool.exe&lt;/FileName&gt;&lt;WorkingDirectory&gt;D:\Workspace\WorkBenchV2\Main\ZeroFlowTool\bin\Debug&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="PerformanceInfo"&gt;&lt;MeasureType&gt;Sampling&lt;/MeasureType&gt;&lt;MeterKind&gt;Rdtsc&lt;/MeterKind&gt;&lt;InjectInfo&gt;&lt;SymbolSearch&gt;&lt;SearchPaths /&gt;&lt;/SymbolSearch&gt;&lt;Scope&gt;&lt;PatternFilters /&gt;&lt;DenyAttributeFilters /&gt;&lt;/Scope&gt;&lt;/InjectInfo&gt;&lt;/Info&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=1/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="PerformanceInfo"&gt;&lt;MeasureType&gt;TracingInject&lt;/MeasureType&gt;&lt;MeterKind&gt;Rdtsc&lt;/MeterKind&gt;&lt;InjectInfo&gt;&lt;SymbolSearch&gt;&lt;SearchPaths /&gt;&lt;/SymbolSearch&gt;&lt;Scope&gt;&lt;PatternFilters&gt;&lt;Item /&gt;&lt;/PatternFilters&gt;&lt;DenyAttributeFilters /&gt;&lt;/Scope&gt;&lt;/InjectInfo&gt;&lt;/Info&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String>
<s:String x:Key="/Default/Profiling/Configurations/=2/@EntryIndexedValue">&lt;data&gt;&lt;HostParameters type="LocalHostParameters" /&gt;&lt;Argument type="StandaloneArgument"&gt;&lt;Arguments IsNull="False"&gt;&lt;/Arguments&gt;&lt;FileName IsNull="False"&gt;&lt;/FileName&gt;&lt;WorkingDirectory IsNull="False"&gt;&lt;/WorkingDirectory&gt;&lt;Scope&gt;&lt;ProcessFilters /&gt;&lt;/Scope&gt;&lt;/Argument&gt;&lt;Info type="TimelineInfo" /&gt;&lt;CoreOptions type="CoreOptions"&gt;&lt;CoreTempPath IsNull="False"&gt;&lt;/CoreTempPath&gt;&lt;RemoteEndPoint IsNull="False"&gt;&lt;/RemoteEndPoint&gt;&lt;AdditionalEnvironmentVariables /&gt;&lt;/CoreOptions&gt;&lt;HostOptions type="HostOptions"&gt;&lt;HostTempPath IsNull="False"&gt;&lt;/HostTempPath&gt;&lt;ReprofileDisableReason&gt;LaunchedByReSharperUnitTestRunner&lt;/ReprofileDisableReason&gt;&lt;/HostOptions&gt;&lt;/data&gt;</s:String>
@@ -21,6 +21,12 @@ namespace Xylem.Common.CommonCore.Configuration
private const String DefaultListAllFwPackagesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=1";
private const String DefaultListAllSwPackagesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=5";
private const String DefaultListAllConfigFilePackagesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=6";
private const String DefaultListAllFwUpdateSafesServiceUrl =
"http://10.49.40.25/MeterProcessState/api/FileUpToDate/GetFwFiles?FileIsForDeveloperOnly=false&FileCategoryID=4";
@@ -259,6 +265,26 @@ namespace Xylem.Common.CommonCore.Configuration
DefaultListAllFwPackagesServiceUrl;
}
/// <summary>
/// Get all Cordonel FW update SW package description files.
/// </summary>
/// <returns></returns>
public static String ListAllSwPackages()
{
return ConfigurationManager.AppSettings["ListAllSwPackagesServiceUrl"] ??
DefaultListAllSwPackagesServiceUrl;
}
/// <summary>
/// Get all Cordonel FW update SW package description files.
/// </summary>
/// <returns></returns>
public static String ListAllConfigurationFilePackages()
{
return ConfigurationManager.AppSettings["ListAllConfigFilePackagesServiceUrl"] ??
DefaultListAllConfigFilePackagesServiceUrl;
}
/// <summary>
/// Set all applications versions installed to a specific Cordonel.
/// </summary>
@@ -630,6 +630,11 @@ namespace Xylem.Common.Hardware.Interfaces.Ports.SerialPorts
/// <remarks date="2018-Oct-23" author="T.Wiedebusch">
/// - Doubling of sync byte in protocol behind sync byte itself implemented
/// </remarks>
/// <remarks date="2022-Feb-25" author="T.Wiedebusch, R.Drabesch">
/// - Flush buffer as MOXA sometimes takes two messages and combines these two one!
/// As the Genesis needs a separated wake-up message with a following delay before the
/// real payload message, this causes a lot of trouble.
/// </remarks>
protected void PhysicalWrite(Byte[] txBuffer)
{
try
@@ -649,18 +654,20 @@ namespace Xylem.Common.Hardware.Interfaces.Ports.SerialPorts
}
}
}
_serialPort.Write(txByteList.ToArray(), 0, txByteList.Count);
// flush the buffer for MOXA, to avoid two subsequent communications assembled to one communication!
_serialPort.BaseStream.Flush();
OnRawRecordSendOut?.Invoke(this, new ListBytePortDataEventArgs(txByteList, DateTimeOffset.UtcNow));
}
catch (Exception ex)
{
_byteDataLogger.Error($"{Ident} {ex.Message}");
}
}
#region Prop
#endregion
}
@@ -24,16 +24,16 @@ namespace Xylem.Common.Hardware.Interfaces.Ports.SerialPorts
/// </remarks>
protected override void SpecificPortWrite(Byte[] tx)
{
//send wake up burst with two 0xF0 byte
//var wakeUpBurst = new Byte[] { 0xF0, 0xF0 };
var wakeUpBurst = new Byte[] { 0x01, 0x01, 0x01, 0x01, };
var delayPattern = new Byte[] { 0x0F, 0x0F, 0x0F, 0x0F , 0x0F, 0x0F, 0x0F, 0x0F };
//send wake up burst
var wakeUpBurst = new Byte[] { 0x01, 0x01, 0x01, 0x01 };
PhysicalWrite(wakeUpBurst);
Thread.Sleep(1);
//delay at least 500 µs with 0f *8
//PhysicalWrite(delayPattern);
//Thread.Sleep(1);
//delay at least 500 µs
Thread.Sleep(1);
//send the IrDA record
PhysicalWrite(tx);
@@ -1141,6 +1141,21 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// </summary>
public String CoreRevision;
/// <summary>
/// This is the FLEXNET version which describes the entire packet.
/// </summary>
public String FwVersion;
/// <summary>
/// This is the Metrology Lookup Table CRC.
/// </summary>
public String LutCrc;
/// <summary>
/// This is the meter size.
/// </summary>
public String MeterSize;
/// <summary>
/// Region (EMEA or NA) and Radio frequency (433 or 868 or null).
/// </summary>
@@ -1165,11 +1180,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// </remarks>
private void ReadMeterFirmwareAndAssignRegisters()
{
//if (true)
//{
// return;
//}
//avoid overwriting of list if this already exits
if (MeterAppListVersion.Any())
{
@@ -1206,6 +1216,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
//build the version string, because e.g. FLEXNETVERSION is one application which does not
//follow the same rule. After the upper conversion, the hexadecimal outline will be lost
versionString = BuildFwVersionString(readFwVersionBytes[1], readFwVersionBytes[0]);
if (appVersionToRead.AppName == "FLEXNETVERSION") FwVersion = versionString;
if (readFwVersion != 0)
{
@@ -1220,7 +1231,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
}
}
}
Thread.Sleep(250);
}
//add application always, even if this is not installed. This will be used for FW updates
@@ -1240,6 +1250,15 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
MetrologyUpgradePermission = RegisterConverter.ConvertTo<Byte>(
ReadRegister(Register.System.MetrologyUpgradePermission));
//read metrology lookup table CRC
var lutCrc = RegisterConverter.ConvertTo<UInt32>(ReadRegister(Register.Genesisflow.LookupFileCrc));
LutCrc = $@"0x{lutCrc:X4}";
//read meter size
MeterSize = MeterSizeConverter.ConvertMeterSizeEnumToSizeName((MeterSize)RegisterConverter.ConvertTo<Byte>(
ReadRegister(Register.Genesisflow.MeterSize)));
//read core revision
var coreRegisterRead = RegisterConverter.ConvertTo<String>(ReadRegister(Register.System.CoreRevision, 16));
var coreRevision = coreRegisterRead?.Split('\0');
@@ -1288,10 +1307,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
}
}
//read radio frequency
_logger.Info("Region and radio frequency[Mhz]: " + RegionRadio);
//safe temporary registers from file to compare first and last version with application version read from meter and
_logger.Info($"Meter size: {MeterSize}");
//remove unused registers with invalid version
var tempConfigRegisters = _configRegister.MeterRegisterDic.ToList();
//tempConfigRegisters.ToList()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,53 @@
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts
{
/// <summary>
/// Genesis meter lookup table update states
/// </summary>
public enum LutUpdateState
{
/// <summary>
/// Metrology lookup table update state Idle
/// </summary>
Idle,
/// <summary>
/// Single step failed
/// </summary>
StepFailed,
/// <summary>
/// Entire process failed
/// </summary>
UpdateFailed,
/// <summary>
/// Start initial FW update
/// </summary>
StartInitial,
/// <summary>
/// Repeat update
/// </summary>
RepeatLutUpdate,
/// <summary>
/// Upload lookup table file
/// </summary>
UploadLutFile,
/// <summary>
/// Download lookup table file
/// </summary>
DownloadLutFile,
/// <summary>
/// Compare lookup table file
/// </summary>
CompareLutFile,
/// <summary>
/// Download the CRC, the meter size and store calibration as preparation for the lookup table
/// </summary>
FinalizeLutDownload,
/// <summary>
/// Erase lookup table file
/// </summary>
EraseLutFile,
/// <summary>
/// Delimiter for list
/// </summary>
LutUpdateStateListDelimiter
}
}
@@ -0,0 +1,73 @@
using System;
using System.Linq;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Properties;
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts
{
/// <summary>
/// Concatenation of state and string
/// </summary>
public static class LutUpdateStateInfo
{
/// <summary>
/// Build state information
/// </summary>
private static readonly LutUpdateStateText[] StateInfos;
/// <summary>
/// Ctor
/// </summary>
static LutUpdateStateInfo()
{
StateInfos = new LutUpdateStateText[(Int32)LutUpdateState.LutUpdateStateListDelimiter];
StateInfos[0].State = LutUpdateState.Idle;
StateInfos[0].Message = "";
StateInfos[1].State = LutUpdateState.StepFailed;
StateInfos[1].Message = "Processing Step Failed";
StateInfos[2].State = LutUpdateState.UpdateFailed;
StateInfos[2].Message = "LUT Update Failed";
StateInfos[3].State = LutUpdateState.StartInitial;
StateInfos[3].Message = "Initial start";
StateInfos[4].State = LutUpdateState.RepeatLutUpdate;
StateInfos[4].Message = "Repeat update";
StateInfos[5].State = LutUpdateState.UploadLutFile;
StateInfos[5].Message = "Upload LUT file from meter";
StateInfos[6].State = LutUpdateState.DownloadLutFile;
StateInfos[6].Message = "Download LUT file to meter";
StateInfos[7].State = LutUpdateState.CompareLutFile;
StateInfos[7].Message = "Compare LUT file";
StateInfos[8].State = LutUpdateState.FinalizeLutDownload;
StateInfos[8].Message = "Finalize LUT file installation";
StateInfos[9].State = LutUpdateState.EraseLutFile;
StateInfos[9].Message = "Erase LUT file in meter";
}
/// <summary>
/// Get the current information
/// </summary>
/// <param name="state">state to search for information text</param>
public static String GetTextFromState(LutUpdateState state)
{
return (from stateInfo in StateInfos
where stateInfo.State == state select stateInfo.Message).FirstOrDefault();
}
/// <summary>
/// Get the state of the text
/// </summary>
/// <param name="text">information text to search if state is assigned</param>
public static LutUpdateState GetStateFromText(String text)
{
return (from stateInfo in StateInfos
where stateInfo.Message == text select stateInfo.State).FirstOrDefault();
}
}
}
@@ -0,0 +1,19 @@
using System;
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts
{
/// <summary>
/// Concatenation between lokup table update state and text
/// </summary>
public struct LutUpdateStateText
{
/// <summary>
/// The state of the firmware update
/// </summary>
public LutUpdateState State;
/// <summary>
/// The message text of the lookup table update state
/// </summary>
public String Message;
}
}
@@ -96,11 +96,16 @@
<Compile Include="..\..\..\..\.shared\SharedAssemblyInfo.cs">
<Link>Properties\SharedAssemblyInfo.cs</Link>
</Compile>
<Compile Include="Consts\LutUpdateStateText.cs" />
<Compile Include="Consts\LutUpdateStateInfo.cs" />
<Compile Include="Consts\LutUpdateState.cs" />
<Compile Include="Consts\FwUpdateState.cs" />
<Compile Include="Consts\FwUpdateStateInfo.cs" />
<Compile Include="Consts\FwUpdateStateText.cs" />
<Compile Include="MeterLutFile.cs" />
<Compile Include="MeterFileRestore.cs" />
<Compile Include="MeterFilesEraseRestore.cs" />
<Compile Include="MeterLutUpdate.cs" />
<Compile Include="MeterFwUpdate.cs" />
<Compile Include="MeterFwUpdateCapability.cs" />
<Compile Include="MeterFwUpdateRuler.cs" />
@@ -119,6 +124,14 @@
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\Logic.PrdoctionToProductMapper\Logic.ProductionToProductMapper.csproj">
<Project>{D0C859D9-D55E-4E85-AC50-0FF31B1CE50D}</Project>
<Name>Logic.ProductionToProductMapper</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Utils\Crc16Ccitt\Crc16Ccitt.csproj">
<Project>{91DEF0C0-AA4F-40AE-8F18-CB717FDE7E7F}</Project>
<Name>Crc16Ccitt</Name>
</ProjectReference>
<ProjectReference Include="..\..\..\..\Utils\Logging\Logging.csproj">
<Project>{4B88B0D3-E791-4774-9521-EABEACDC420E}</Project>
<Name>Logging</Name>
@@ -29,9 +29,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
private Int32 _fileWriteTimeOutMs = ExtendedFileIoTimeoutMs;
private readonly GenesisMeter _currentGenesis;
private Int32 _filePointer;
//TODO THW test only private const String StrNewFileReadWriteMode = "wb+";
//wb open file for writing in binary mode, if file exists its contents will be overwritten,
//if file does not exist it will be created
private const String StrNewFileReadWriteMode = "wb";
//Open for reading in binary mode. If the file does not exist, fopen( ) returns NULL
public Int32 _filePointer;
private const String StrNewFileReadWriteMode = "wb+";
private const String StrOpenFileReadOnlyMode = "rb";
//Open for both reading and writing in binary mode. If the file does not exist, fopen( ) returns NULL
private const String StrOpenFileReadWriteMode = "rb+";
private String _fileName;
private Int32 _overallBytesCtr;
@@ -171,6 +178,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2020-Dec-19" author="Thomas Wiedebusch">
/// - Dynamic timeout load from extended to extreme timeout on retries.
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean WriteMeterFile(String fileName, Byte[] dataBytes, Int32 fileOffset = 0)
{
var returnValue = false;
@@ -181,8 +191,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("", 0));
_overallBytesCtr = dataBytes.Length;
//add file name delimiter
fileName += StringDelimiter;
//check if file is unlocked for write
if (_fileName != fileName) return false;
if (_fileName != fileName)
return false;
if (fileOffset == 0 && OpenMeterFile(fileName, StrNewFileReadWriteMode)
|| fileOffset > 0 && OpenMeterFile(fileName, StrOpenFileReadWriteMode))
@@ -319,18 +332,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2020-Dec-10" author="Thomas Wiedebusch">
/// - Event on changed process counter.
/// </remarks>
public Boolean ReadMeterFile(String fileName, out List<Byte> readBackData, Int32? readBackCount = null, string OpenFileReadOnlyModeOver = null)
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean ReadMeterFile(String fileName, out List<Byte> readBackData, Int32 readBackCount)
{
if (String.IsNullOrEmpty(OpenFileReadOnlyModeOver))
{
OpenFileReadOnlyModeOver = StrOpenFileReadOnlyMode;
}
//set processing counter
ProcessedBytesCtr = 0;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("", 0));
//add file name delimiter
fileName += StringDelimiter;
readBackData = new List<Byte>();
var returnValue = OpenMeterFile(fileName, OpenFileReadOnlyModeOver);
var returnValue = OpenMeterFile(fileName, StrOpenFileReadOnlyMode);
if (returnValue)
{
@@ -343,29 +358,29 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
CommunicationConfig.RequestRetries = 0;
_currentGenesis.TransmitProtocol.SetResponseTimeout(ExtendedFileIoTimeoutMs);
int fixedReadBackCount;
//int fixedReadBackCount;
if (readBackCount.HasValue)
{
fixedReadBackCount = readBackCount.Value;
}
else
{
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false);
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 2, false);
//if (readBackCount.HasValue)
//{
// fixedReadBackCount = readBackCount.Value;
//}
//else
//{
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false);
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 2, false);
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FTell", _filePointer, false);
fixedReadBackCount = RegisterConverter.ConvertTo<Int32>(_currentGenesis.ReadRegister("CONFIGEXCHANGE_FTell")) + 1;
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FTell", _filePointer, false);
// fixedReadBackCount = RegisterConverter.ConvertTo<Int32>(_currentGenesis.ReadRegister("CONFIGEXCHANGE_FTell")) + 1;
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false);
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
_currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", _filePointer, false);
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
// _currentGenesis.WriteRegister("CONFIGEXCHANGE_FSeek", 0, false);
}
//}
//write size to 1
_currentGenesis.WriteRegister(Register.Configexchange.FileRead, 1, false);
//write counts to expected length
@@ -374,10 +389,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_currentGenesis.WriteRegister(Register.Configexchange.FileRead, _filePointer);
//the preceding routine needs to wait for response, else this is always true!
while (fixedReadBackCount > 0 && returnValue)
while (readBackCount > 0 && !_stopProcess) // while (fixedReadBackCount > 0 && returnValue)
{
returnValue = _stopProcess;
var remainingData = RegisterConverter.ConvertTo<Int32>(
_currentGenesis.ReadRegister(Register.Configexchange.FileRead));
@@ -465,7 +478,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_currentGenesis.ReadRegister(Register.Configexchange.Catalogue));
}
if (key == lastKey) break;
if (key == lastKey)
break;
// remove the "\0"
var strMeterFile = readData.Split(StringDelimiter);
// avoid identical files repetition
@@ -485,12 +499,19 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2021-Jun-20" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean CreateEmptyMeterFile(String fileName, Int32 fileSize = 0)
{
var returnValue = false;
//add file name delimiter
fileName += StringDelimiter;
//check if file is unlocked for write
if (_fileName != fileName) return false;
if (_fileName != fileName)
return false;
if (OpenMeterFile(fileName, StrNewFileReadWriteMode))
{
@@ -543,7 +564,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_currentGenesis.TransmitProtocol.SetDefaultResponseTimeout();
CommunicationConfig.RequestRetries = CommunicationConfig.DefaultRequestRetries;
if (returnedFileOffset != fileSize) returnValue = false;
if (returnedFileOffset != fileSize)
returnValue = false;
}
}//file open
@@ -560,9 +582,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2019-Jun-20" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean VerifyMeterFile(String fileName, Byte[] dataBytes)
{
if (!OpenMeterFile(fileName, StrOpenFileReadOnlyMode)) return false;
//add file name delimiter
fileName += StringDelimiter;
if (!OpenMeterFile(fileName, StrOpenFileReadOnlyMode))
return false;
//TODO THW implement
//read raw data from meter
return true;
@@ -582,17 +611,25 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2021-May-18" author="Thomas Wiedebusch">
/// - Removed retries to speed up erasure as it returns error code 0x040B.
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean EraseMeterFile(String fileName)
{
//add file name delimiter
fileName += StringDelimiter;
//check if file is unlocked for erase
if (_fileName != fileName) return false;
if (_fileName != fileName)
return false;
//check if logged on to meter and access level is as expected
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn) return false;
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
return false;
//set extended timeout for file operations
_currentGenesis.TransmitProtocol.SetResponseTimeout(ExtendedFileIoTimeoutMs);
CommunicationConfig.RequestRetries = 0;
//write "remove-command" to meter, wait for result and read back (read back returns false because of unreadable content)
//write "remove-command" to meter, wait for result and read back
//ATTENTION: read back returns FALSE because of unreadable content
_currentGenesis.WriteRegister(Register.Configexchange.FileRemove, fileName, true, true);
//set timeout back to default value
_currentGenesis.TransmitProtocol.SetDefaultResponseTimeout();
@@ -609,10 +646,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2019-Jun-20" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Add a NULL at the end of the file name.
/// </remarks>
public Boolean UnlockEraseWriteMeterFile(String fileName)
{
//add file name delimiter
fileName += StringDelimiter;
//check if logged on to meter and access level is as expected
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn) return false;
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
return false;
//remind file name being unlocked
_fileName = fileName;
return true;
@@ -746,7 +789,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
public Boolean OpenMeterFile(String fileName, String accessMode)
{
//check if logged on to meter and access level is as expected
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn) return false;
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
return false;
Boolean returnValue;
var retryCtr = 0;
@@ -806,25 +850,23 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2020-Jan-22" author="Thomas Wiedebusch">
/// - Wait after writing for response before reading!
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Ignore file close write return!
/// </remarks>
private Boolean CloseMeterFile()
{
//avoid file close if file pointer assignment failed
if (_filePointer <= 0) return false;
if (_filePointer <= 0)
return false;
//set extended timeout for file operations
_currentGenesis.TransmitProtocol.SetResponseTimeout(ExtendedFileIoTimeoutMs);
CommunicationConfig.RequestRetries = 0;
_currentGenesis.WriteRegister(Register.Configexchange.FileClose, _filePointer);
var returnValue = _currentGenesis.WriteRegister(Register.Configexchange.FileClose,
_filePointer);
//the preceding routine needs to wait for response, else this is always true!
if (returnValue)
{
//function call returns 0 if FClose successfully executed
returnValue &= 0 == RegisterConverter.ConvertTo<Int32>(
var returnValue = 0 == RegisterConverter.ConvertTo<Int32>(
_currentGenesis.ReadRegister(Register.Configexchange.FileClose));
}
//set timeout back to default value
_currentGenesis.TransmitProtocol.SetDefaultResponseTimeout();
CommunicationConfig.RequestRetries = CommunicationConfig.DefaultRequestRetries;
@@ -4,6 +4,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using Xylem.Common.Hardware.WaterMeter.Genesis.Applications;
using Xylem.Common.Hardware.WaterMeter.Genesis.Applications.Const;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
@@ -139,6 +140,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
// Text for caller to inform about actual process being carried out
private String _actualOperation;
private FwUpdateState _fwUpdateState;
private FwUpdateState _fwBackupUpdateState;
// Process counter for caller to monitor actual progress
private Int32 _processedBytesCtr;
@@ -150,6 +152,10 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
//the package file describes all files needed for a specific release
private String _packageDescriptionFile;
// manual stop of update process
private Boolean _stopUpdateProcess;
private Int32 _actualUpdateFileCtr;
/// <summary>
/// Enable partial file writes of single parts with gaps in between
/// </summary>
@@ -624,7 +630,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
return _actualOperation;
}
private Int32 _actualUpdateFileCtr;
/// <summary>
/// Returns the FW Update state
@@ -677,8 +682,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
_genesisMeter?.ReLogin();
}
private Boolean _stopUpdateProcess;
/// <summary>
/// Stop the update process
/// </summary>
@@ -724,6 +727,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// <remarks date="2019-Jun-29" author="Thomas Wiedebusch">
/// - Exit preparation added
/// </remarks>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Introduced lock for repeated execution of state machine
/// </remarks>
public Boolean UpdateMeterFw()
{
if (!UpdatePreparation())
@@ -732,6 +738,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
}
_fwUpdateState = FwUpdateState.StartInitial;
_fwBackupUpdateState = FwUpdateState.Idle;
while (_fwUpdateState != FwUpdateState.Idle && !StopUpdateProcess)
{
FwUpdateStateMachine();
@@ -897,6 +904,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
//set state machine for automatic FW update
_fwUpdateState = FwUpdateState.Idle;
_fwBackupUpdateState = FwUpdateState.Idle;
_actualOperation = "";
//update file information
@@ -979,7 +987,6 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
var writeBackValue = _genesisMeter.ReadRegister(item.Key);
_registersAfterUpdate.Add(item.Key, writeBackValue);
_genesisMeter.WriteRegister(item.Key, item.Value);
}
//remove the update stop action
@@ -1059,8 +1066,19 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
/// useful as on increased size and number of applications needed to install in one run, the
/// file system is slowing down for write accesses.
/// </remarks>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Introduced lock for repeated execution of state machine
/// </remarks>
private void FwUpdateStateMachine()
{
if (_fwBackupUpdateState == _fwUpdateState)
{
Thread.Sleep(1);
}
else
{
// remind backup state to avoid repeated execution and side effects
_fwBackupUpdateState = _fwUpdateState;
switch (_fwUpdateState)
{
case FwUpdateState.Idle:
@@ -1127,6 +1145,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
{
_meterFile?.SetExtremeFileWriteTimeout();
}
break;
case FwUpdateState.UpdateFailed:
@@ -1150,6 +1169,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
break;
}
}// lock repeated execution of identical state
}
#endregion
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using Logic.ProductionToProductMapper.Cordonel;
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
{
/// <summary>
/// File for metrology look up table
/// </summary>
public class MeterLutFile
{
/// <summary>
/// File name of the file on PC
/// </summary>
public String LutPcFileName;
/// <summary>
/// Ctor file applications
/// </summary>
/// <param name="lutPcFileName"></param>
public MeterLutFile(String lutPcFileName)
{
LutPcFileName = lutPcFileName;
}
/// <summary>
/// File ID for LUT file
/// </summary>
public String StrLutFileId;
/// <summary>
/// Data length
/// </summary>
public UInt32 DataLength;
/// <summary>
/// Version of LUT file
/// </summary>
public UInt16 Version;
/// <summary>
/// Check of LUT file for verification and register write, read from file
/// </summary>
public UInt16 FileCrc;
/// <summary>
/// Calculated during file processing for verification
/// </summary>
public UInt16 CalculatedCrc;
/// <summary>
/// Validation of LUT file
/// </summary>
public Boolean IsValid;
/// <summary>
/// Binary file content
/// </summary>
public List<Byte> BinData = new List<Byte>();
/// <summary>
/// Meter size
/// </summary>
public MeterSize MeterSize;
}
}
@@ -0,0 +1,980 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using Logic.ProductionToProductMapper.Cordonel;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore.Consts;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile.Consts;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
using Xylem.Common.Utils.Crc16Ccitt;
using Xylem.Common.Utils.ProcessExec;
using Xylem.Common.Utils.ProcessExec.EventArguments;
namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile
{
/// <summary>
/// Meter lookup table for metrology update procedure
/// </summary>
public class MeterLutUpdate : IProcessState
{
#region Variables
/// <summary>
/// Port scan result event for message dispatcher to caller
/// </summary>
public event EventHandler<ProcessExecEventArgs> OnProcessUpdate;
//error mask for unsuccessfully written LUT CRC
private const UInt32 LutCrcErrorMask = 0x8000000;
//disk and name of lookup file
private const String StrLutMeterFileName = "1\\mettbl";
//disk and name of lookup file
private const String StrLutBackupMeterFileName = "1\\mettbl_b";
// identifier for Genesis lookup table
private const String StrLutFileId = "GEN_LUT\0";
private const Int32 IndexLutFileId = 0;
private const Int32 LengthLutFileId = 8;
// data length, calculated from version field to the end of the data section
private const Int32 IndexDataLength = 8;
private const Int32 LengthDataLength = 4;
// CCITT-CRC-16 , calculated from version field to the end of the data section
private const Int32 IndexCrc = 12;
private const Int32 LengthCrc = 2;
// version
private const Int32 IndexVersion = 14;
private const Int32 LengthVersion = 2;
// meter size as enumeration
private const Int32 IndexMeterSize = 16;
// header size of file
private const Int32 LutFileHeaderLength = LengthLutFileId + LengthDataLength + LengthCrc + LengthVersion;
// data size of file
private const Int32 LutFileDataLength = 730;
// LUT file entire file size
private const Int32 SizeLutFile = LutFileHeaderLength + LutFileDataLength;
//trigger update retries
private const Int32 RegisterWriteRetries = 0;
//update reties for files
private const Int32 FileWriteRetries = 1;
//retry of entire update procedure
private const Int32 UpdateProcedureRetries = 1;
//threshold to increase the file write timing
private const Int32 IncreaseTimeoutUpdateProcedureRetries = 4;
private Int32 _updateProcedureRetryCtr;
private GenesisMeter _genesisMeter;
private MeterFile _meterFile;
// Text for caller to inform about actual process being carried out
private String _actualOperation;
private LutUpdateState _lutUpdateState;
private LutUpdateState _lutBackupUpdateState;
// Look up table file
public MeterLutFile LutFile;
// list of names of installed meter files on drive 1
private List<String> _meterFilesDrive1;
// number of operations for over all access
private const Int32 NumberOfOperations = 11;
private Int32 _operationCtr;
// error message for display of error reason
public String ErrorMessage;
// manual stop of update process
private Boolean _stopUpdateProcess;
/// <summary>
/// Register subset needed to adjust for update performance content before update
/// </summary>
private readonly Dictionary<String, Byte[]> _registersBeforeUpdate = new Dictionary<String, Byte[]>();
/// <summary>
/// Register to restore after update
/// </summary>
private Dictionary<String, Byte[]> _registersAfterUpdate = new Dictionary<String, Byte[]>();
#endregion
#region Events
/// <summary>
/// Process update event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks date="2020-Dec-10" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public virtual void ProcessUpdate_Event(Object sender, ProcessExecEventArgs e)
{
//// copy text from overall messages to actual, because this is from sub-routine
//OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(_overallOperation,
// OverallProcessCtrPercent, _actualOperation, e.OverallProcessPercent));
}
#endregion
#region Information
/// <summary>
/// Process counter in percent
/// </summary>
/// <remarks date="2022-Mar-03" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Double OverallProcessCtrPercent => 100.0 * _operationCtr / NumberOfOperations;
/// <summary>
/// Single file process counter in percent
/// </summary>
/// <remarks date="2019-Jun-24" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Double SingleFileProcessCtrPercent => _meterFile?.ProcessCtrPercent ?? 0;
#endregion
#region CtorAssignment
/// <summary>
/// Ctor
/// </summary>
/// <param name="genesisMeter"></param>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public MeterLutUpdate(GenesisMeter genesisMeter)
{
if (genesisMeter == null)
return;
AssignGenesis(genesisMeter);
if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "GENESISFLOW" && f.IsInstalled))
{
_registersBeforeUpdate.Add(Register.Genesisflow.LedMode, new[] { (Byte)LedMode.Off });
_registersBeforeUpdate.Add(Register.Genesisflow.SampleRate, new Byte[] { 1 });
}
if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "METROLOGYASST" && f.IsInstalled))
_registersBeforeUpdate.Add(Register.Mertrologyasst.PulseMode, new Byte[] { 0 });
//deny access if NA product, because this does not have the radio app installed
if (genesisMeter.MeterAppListVersion.Any(f => f.AppName == "SENSUSRADIO" && f.IsInstalled))
_registersBeforeUpdate.Add(Register.Sensusradio.WakeupInterval, new Byte[] { 6 });
}
/// <summary>
/// Assign new genesis
/// </summary>
/// <param name="genesisMeter"></param>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public void AssignGenesis(GenesisMeter genesisMeter)
{
_genesisMeter = genesisMeter;
_actualOperation = "";
_lutUpdateState = LutUpdateState.Idle;
}
/// <summary>
/// Dispose
/// </summary>
public void Dispose()
{
if (_meterFile == null)
return;
_meterFile.OnProcessUpdate -= ProcessUpdate_Event;
_meterFile = null;
}
#endregion
#region ProcessInformation
/// <summary>
/// Returns the actual file in process for update
/// </summary>
/// <returns></returns>
/// <remarks date="2019-Jun-20" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public String GetActualOperation()
{
return _actualOperation;
}
/// <summary>
/// Returns the LUT Update state
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Feb-25" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public String GetLutUpdateStateOperation()
{
// search text assigned to current state
var text = LutUpdateStateInfo.GetTextFromState(_lutUpdateState);
if (_lutUpdateState == LutUpdateState.Idle)
{
return text;
}
text += _updateProcedureRetryCtr > 0 ? $"Retry {_updateProcedureRetryCtr}" : "";
return text;
}
#endregion
#region Actions
/// <summary>
/// Try to re-establish the file system, therefor logout to close all open files
/// and login again.
/// </summary>
/// <remarks date="2019-Jun-21" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2019-Jun-28" author="Thomas Wiedebusch">
/// - Enable auto-logon added
/// </remarks>
/// <remarks date="2019-Jul-03" author="Thomas Wiedebusch">
/// - Removed auto-logon
/// </remarks>
public void ReestablishMeterFileSystem()
{
_genesisMeter?.Logout();
_genesisMeter?.ReLogin();
}
/// <summary>
/// Stop the update process
/// </summary>
public Boolean StopUpdateProcess
{
get => _stopUpdateProcess;
set
{
_stopUpdateProcess = value;
if (_meterFile != null)
{
_meterFile.StopProcess = value;
}
_lutUpdateState = LutUpdateState.UpdateFailed;
}
}
/// <summary>
/// Update meter lookup table
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean UpdateMeterLut()
{
if (!UpdatePreparation())
{
return false;
}
_operationCtr = 0;
_actualOperation = "";
ErrorMessage = "";
_lutUpdateState = LutUpdateState.StartInitial;
_lutBackupUpdateState = LutUpdateState.Idle;
while (_lutUpdateState != LutUpdateState.Idle && !StopUpdateProcess)
{
LutUpdateStateMachine();
}
return ExitPreparation(true);
}
/// <summary>
/// Upload lookup table file and compare with the loaded from file system
/// </summary>
/// <remarks date="2019-Jun-29" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean VerifyLutFile()
{
if (!UpdatePreparation())
{
return false;
}
return ExitPreparation(true);
}
/// <summary>
/// Reset lookup table update process and all lists and counters
/// </summary>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public void ResetAll()
{
LutFile = null;
//remove the update stop action
StopUpdateProcess = false;
//reset all counters
_updateProcedureRetryCtr = 0;
//set state machine for automatic FW update
_lutUpdateState = LutUpdateState.Idle;
_lutBackupUpdateState = LutUpdateState.Idle;
_actualOperation = "";
_operationCtr = 0;
//logout/login/auto-login
ReestablishMeterFileSystem();
_genesisMeter?.Logout();
}
/// <summary>
/// Common update preparation and check
/// </summary>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean UpdatePreparation()
{
_actualOperation = "Update preparation";
_lutUpdateState = LutUpdateState.Idle;
_meterFile = new MeterFile(_genesisMeter);
if (_meterFile != null)
_meterFile.OnProcessUpdate += ProcessUpdate_Event;
_genesisMeter?.ReLogin();
_genesisMeter?.SetProcessState(DisplayCodes.FwUpdateActive, false);
if (_genesisMeter == null || !_genesisMeter.IsLoggedOn)
{
return false;
}
//set default timeout for file write operation
_meterFile.SetDefaultFileWriteTimeout();
//switch LED off set sample rate to 1 -> 1Hz to slow down CPU load
_registersAfterUpdate = new Dictionary<String, Byte[]>();
foreach (var item in _registersBeforeUpdate)
{
var writeBackValue = _genesisMeter.ReadRegister(item.Key);
_registersAfterUpdate.Add(item.Key, writeBackValue);
_genesisMeter.WriteRegister(item.Key, item.Value);
}
//remove the update stop action
StopUpdateProcess = false;
return true;
}
/// <summary>
/// Common exit routine
/// </summary>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean ExitPreparation(Boolean returnValue)
{
if (_meterFile != null)
_meterFile.OnProcessUpdate -= ProcessUpdate_Event;
_meterFile = null;
ReestablishMeterFileSystem();
foreach (var item in _registersAfterUpdate)
{
_genesisMeter.WriteRegister(item.Key, item.Value);
}
_genesisMeter?.Logout();
if (!StopUpdateProcess)
{
return returnValue;
}
_actualOperation = "";
return false;
}
#endregion
#region StateMachine
/// <summary>
/// State machine for metrology lookup table update process
/// </summary>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Introduced lock for repeated execution of state machine
/// </remarks>
private void LutUpdateStateMachine()
{
if (_lutBackupUpdateState == _lutUpdateState)
{
Thread.Sleep(1);
}
else
{
// remind backup state to avoid repeated execution and side effects
_lutBackupUpdateState = _lutUpdateState;
switch (_lutUpdateState)
{
case LutUpdateState.Idle:
break;
case LutUpdateState.StartInitial:
_updateProcedureRetryCtr = 0;
_lutUpdateState = LutUpdateState.EraseLutFile;
break;
case LutUpdateState.EraseLutFile:
_lutUpdateState = EraseLutFiles() ? LutUpdateState.DownloadLutFile : LutUpdateState.StepFailed;
break;
case LutUpdateState.DownloadLutFile:
_lutUpdateState = DownloadLutFiles() ? LutUpdateState.UploadLutFile : LutUpdateState.StepFailed;
break;
case LutUpdateState.UploadLutFile:
_lutUpdateState = UploadAndCompareLutFiles() ? LutUpdateState.FinalizeLutDownload : LutUpdateState.StepFailed;
break;
case LutUpdateState.FinalizeLutDownload:
_lutUpdateState =
FinalizeLutDownload() ? LutUpdateState.Idle : LutUpdateState.StepFailed;
break;
case LutUpdateState.CompareLutFile:
break;
case LutUpdateState.StepFailed:
_lutUpdateState = _updateProcedureRetryCtr++ < UpdateProcedureRetries
? LutUpdateState.RepeatLutUpdate
: LutUpdateState.UpdateFailed;
break;
case LutUpdateState.RepeatLutUpdate:
_lutUpdateState = LutUpdateState.DownloadLutFile;
if (_updateProcedureRetryCtr >= IncreaseTimeoutUpdateProcedureRetries)
{
_meterFile?.SetExtremeFileWriteTimeout();
}
break;
case LutUpdateState.UpdateFailed:
StopUpdateProcess = true;
_lutUpdateState = LutUpdateState.Idle;
break;
case LutUpdateState.LutUpdateStateListDelimiter:
_lutUpdateState = LutUpdateState.Idle;
break;
default:
_lutUpdateState = LutUpdateState.Idle;
break;
}
}// lock for identical state
}
#endregion
#region LutFile
/// <summary>
/// Check the content of the metrology lookup table file
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Feb-25" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean ValidateLutFile()
{
// check if LUT file contains data
if (LutFile?.BinData == null || LutFile.BinData.Count < SizeLutFile)
{
ErrorMessage = "File size mismatch!";
return false;
}
LutFile.IsValid = false;
// extract the identifier and check, if this is a LUT file
LutFile.StrLutFileId =
Encoding.UTF8.GetString(LutFile.BinData.ToArray(), IndexLutFileId, IndexDataLength);
if (LutFile.StrLutFileId != StrLutFileId)
return false;
LutFile.MeterSize = (MeterSize)LutFile.BinData[IndexMeterSize];
LutFile.FileCrc = (UInt16)(LutFile.BinData[IndexCrc] + (LutFile.BinData[IndexCrc + 1] << 8));
LutFile.Version = (UInt16)(LutFile.BinData[IndexVersion] + (LutFile.BinData[IndexVersion + 1] << 8));
LutFile.DataLength = (UInt32)(LutFile.BinData[IndexDataLength]
+ (LutFile.BinData[IndexDataLength + 1] << 8)
+ (LutFile.BinData[IndexDataLength + 2] << 16)
+ (LutFile.BinData[IndexDataLength + 3] << 24));
// calculate CRC and compare this with the file CRC
var entireFile = new List<Byte>();
entireFile.AddRange(LutFile.BinData);
var payload = new List<Byte>();
payload.AddRange(entireFile.GetRange(IndexVersion, LutFileDataLength + LengthVersion));
var calculatedCrc = Crc16Ccitt.CalculateMsb1021(payload.ToArray());
if (calculatedCrc != LutFile.FileCrc)
{
ErrorMessage = "CRC mismatch!";
return false;
}
LutFile.CalculatedCrc = calculatedCrc;
LutFile.IsValid = true;
return true;
}
/// <summary>
/// Download the CRC, the meter size and store calibration as preparation for the lookup table
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean FinalizeLutDownload()
{
var returnValue = true;
var retryCtr = 0;
if (LutFile == null || _genesisMeter == null || _meterFile == null)
return false;
// set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(5000);
do
{
// for repeated entry
if (!returnValue)
{
ReestablishMeterFileSystem();
}
_actualOperation = "Write Lut CRC to meter";
_operationCtr++;
returnValue = _genesisMeter.WriteRegister<UInt32>(Register.Genesisflow.LookupFileCrc, LutFile.FileCrc);
if (!returnValue)
{
const String txt = "Meter LUT CRC could not be set!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
_operationCtr--;
continue;
}
_operationCtr++;
_actualOperation = "Write meter size";
returnValue =
_genesisMeter.WriteRegister(Register.Genesisflow.MeterSize, new[] { (Byte)LutFile.MeterSize });
if (!returnValue)
{
const String txt = "Meter size could not be set!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
_operationCtr--;
continue;
}
_operationCtr++;
_actualOperation = "Store calibration to meter";
returnValue = _genesisMeter.WriteRegister(Register.Genesisflow.StoreCalibration, 1);
if (!returnValue)
{
const String txt = "Meter store calibration failed!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
_operationCtr--;
continue;
}
_operationCtr++;
_actualOperation = "Read back LUT CRC from meter";
var lutCrc = RegisterConverter.ConvertTo<UInt32>(
_genesisMeter.ReadRegister(Register.Genesisflow.LookupFileCrc));
if ((lutCrc & LutCrcErrorMask) != 0)
{
const String txt = "Meter LUT CRC could not be set!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
_operationCtr--;
returnValue = false;
continue;
}
OnProcessUpdate?.Invoke(this,
new ProcessExecEventArgs($"Read back and validated LUT CRC 0x{lutCrc:X4}"));
_operationCtr++;
_actualOperation = "Read back meter size from meter";
var meterSize = (MeterSize)RegisterConverter.ConvertTo<Byte>(
_genesisMeter.ReadRegister(Register.Genesisflow.MeterSize));
if (meterSize != LutFile.MeterSize)
{
const String txt = "Meter size could not be set!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
_operationCtr--;
returnValue = false;
continue;
}
ErrorMessage = "";
OnProcessUpdate?.Invoke(this,
new ProcessExecEventArgs("Read back and validated meter size " +
$"{MeterSizeConverter.ConvertMeterSizeEnumToSizeName(meterSize)}"));
} while (!returnValue && retryCtr++ < RegisterWriteRetries && !StopUpdateProcess);
// set timeout back to default value
_genesisMeter.TransmitProtocol.SetDefaultResponseTimeout();
return returnValue && !StopUpdateProcess;
}
/// <summary>
/// Read meter files of drive 1
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean ListMeterFilesDrive1()
{
// logout and re-login to clear all ongoing processes and clear the Genesis buffers
ReestablishMeterFileSystem();
if (_meterFilesDrive1 == null)
{
_meterFilesDrive1 = new List<String>();
}
_meterFilesDrive1.Clear();
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs("List meter files drive 1"));
if (!_meterFile.ReadMeterFileCatalog(out var meterFilesDrive1, MeterFile.StrMeterDrive1,
MeterFile.WildcardAll.ToString()))
return false;
_meterFilesDrive1.AddRange(meterFilesDrive1);
// inform overlay system of found files
foreach (var meterFile in _meterFilesDrive1)
{
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(meterFile));
}
return true;
}
/// <summary>
/// Erase file and check if done!
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean EraseFile(String fileDriveName)
{
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($"Erasing {fileDriveName}"));
var returnValue = _meterFile.UnlockEraseWriteMeterFile(fileDriveName);
// erase returns always TRUE, even if the erasure failed! Check with catalogue
_meterFile.EraseMeterFile(fileDriveName);
//if (ListMeterFilesDrive1())
//{
// if (_meterFilesDrive1.Contains(fileDriveName))
// {
// returnValue = false;
// var txt = $"Failed to erase {fileDriveName}!";
// ErrorMessage = txt;
// OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
// }
// else
// {
// ErrorMessage = "";
// OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs($"Successfully erased {fileDriveName}"));
// }
//}
//else
//{
// returnValue = false;
// const String txt = "Meter files read error!";
// ErrorMessage = txt;
// OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
//}
return returnValue;
}
/// <summary>
/// Erase old LUT files from meter
/// </summary>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean EraseLutFiles()
{
//counters for actual process information
var retryCtr = 0;
if (LutFile == null)
return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(10000);
var returnValue = true;
//erase loop and retry if not successful
do
{
var filesToErase = new[] { StrLutMeterFileName, StrLutBackupMeterFileName };
// read all files which are already installed
_actualOperation = "Catalogue installed meter files drive 1";
_operationCtr++;
// read files on drive 1 to verify the LUT installation
if (ListMeterFilesDrive1())
{
foreach (var fileToErase in filesToErase)
{
if (!_meterFilesDrive1.Contains(fileToErase))
continue;
_operationCtr++;
_actualOperation = $"Erase {fileToErase}";
if (EraseFile(fileToErase))
{
ErrorMessage = "";
continue;
}
ErrorMessage = $"LUT file {fileToErase} not erased!";
returnValue = false;
_operationCtr--;
}
}
if (!returnValue)
{
ReestablishMeterFileSystem();
}
} while (!returnValue && retryCtr++ < FileWriteRetries && !StopUpdateProcess);
//set timeout back to default value
_genesisMeter.TransmitProtocol.SetDefaultResponseTimeout();
return !StopUpdateProcess && returnValue;
}
/// <summary>
/// Download the metrology lookup table files and read the catalog of drive 1
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Feb-16" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean DownloadLutFiles()
{
//counters for actual process information
var retryCtr = 0;
if (LutFile == null)
return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(1000);
var returnValue = true;
//write LUT files and retry if not successful
do
{
var filesToDownload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName };
foreach (var fileToDownload in filesToDownload)
{
_operationCtr++;
_actualOperation = $"Write {fileToDownload}";
// logout and re-login to clear all ongoing processes and clear the Genesis buffers
ReestablishMeterFileSystem();
_meterFile.UnlockEraseWriteMeterFile(fileToDownload);
var txt = $"{fileToDownload} successfully written";
if (_meterFile.WriteMeterFile(fileToDownload, LutFile.BinData.ToArray()))
{
ErrorMessage = "";
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
continue;
}
txt = $"Writing of {fileToDownload} failed!";
ErrorMessage = txt;
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
returnValue = false;
_operationCtr--;
}
// read all files on drive 1
_operationCtr++;
if (ListMeterFilesDrive1())
{
foreach (var checkInstalledFile in filesToDownload)
{
if (_meterFilesDrive1.Contains(checkInstalledFile))
{
ErrorMessage = "";
var txt = $"{checkInstalledFile} found in meter";
OnProcessUpdate?.Invoke(this, new ProcessExecEventArgs(txt));
continue;
}
ErrorMessage = $"LUT file {StrLutMeterFileName} not installed!\n";
returnValue = false;
}
}
else
{
returnValue = false;
}
if (!returnValue)
{
ReestablishMeterFileSystem();
}
} while (!returnValue && retryCtr++ < FileWriteRetries && !StopUpdateProcess);
//set timeout back to default value
_genesisMeter.TransmitProtocol.SetDefaultResponseTimeout();
return !StopUpdateProcess && returnValue;
}
/// <summary>
/// Upload the metrology lookup table files and read the catalog of drive 1
/// </summary>
/// <returns></returns>
/// <remarks date="2022-Mar-04" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
/// <remarks date="2022-Apr-01" author="Thomas Wiedebusch">
/// - Take the different size of original and receive buffer, which is an integer division by 4, into account.
/// </remarks>
private Boolean UploadAndCompareLutFiles()
{
//counters for actual process information
var retryCtr = 0;
if (LutFile == null)
return false;
//set extended timeout for trigger upgrade response delay
_genesisMeter.TransmitProtocol.SetResponseTimeout(1000);
var returnValue = true;
//write LUT files and retry if not successful
do
{
var filesToUpload = new[] { StrLutMeterFileName, StrLutBackupMeterFileName };
foreach (var fileToUpload in filesToUpload)
{
_operationCtr++;
_actualOperation = $"Read {fileToUpload}";
// logout and re-login to clear all ongoing processes and clear the Genesis buffers
ReestablishMeterFileSystem();
if (_meterFile.ReadMeterFile(fileToUpload, out var binData, SizeLutFile))
{
// compare the entire buffer which also includes the header of the file, remind the original
// buffer may be smaller due to the chunk size of the communication (always dividable by 4),
// meaning the receive buffer is always and integer of this chunk size!
if (LutFile.BinData.Where((t, ctr) => t != binData[ctr]).Any())
{
ErrorMessage = $"Meter LUT file is unequal to downloaded {fileToUpload}!";
returnValue = false;
_operationCtr--;
}
if (returnValue)
{
OnProcessUpdate?.Invoke(this,
new ProcessExecEventArgs($"LUT file {fileToUpload} of meter successfully compared!"));
}
}
else
{
ErrorMessage += $"Reading of {fileToUpload} failed!";
returnValue = false;
_operationCtr--;
}
}
if (!returnValue)
{
ReestablishMeterFileSystem();
}
} while (!returnValue && retryCtr++ < FileWriteRetries && !StopUpdateProcess);
//set timeout back to default value
_genesisMeter.TransmitProtocol.SetDefaultResponseTimeout();
return !StopUpdateProcess && returnValue;
}
/// <summary>
/// Load file from memory
/// </summary>
/// <param name="filePathName">to binary files</param>
/// <returns></returns>
/// <remarks date="2022-Feb-15" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public Boolean LoadLutFile(String filePathName)
{
if (!File.Exists(filePathName))
{
return false;
}
LutFile = null;
LutFile = new MeterLutFile(filePathName)
{
BinData = new List<Byte>(File.ReadAllBytes(filePathName))
};
// validate the file
return ValidateLutFile();
}
#endregion
}
}
@@ -81,7 +81,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
public static readonly String StartHit = "GENESISFLOW_StartHit";
public static readonly String NumFirePulses = "GENESISFLOW_NumFirePulses";
public static readonly String LookupFileCrc = "GENESISFLOW_LookupFileCrc";
};
@@ -121,6 +121,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
Configexchange.FileClose,
Configexchange.FileWrite,
Configexchange.FileRead,
Configexchange.Catalogue,
Configexchange.GetFilePointerOffset,
Configexchange.SetFilePointerOffset,
Configexchange.FileRemove,
@@ -135,6 +136,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
Genesisflow.TriggerIdle,
Genesisflow.LedMode,
Genesisflow.SampleRate,
Genesisflow.MeterSize,
Genesisflow.LookupFileCrc,
Genesisflow.StoreCalibration,
Sensusradio.WakeupInterval,
Sensusradio.FrequencyIndicator
@@ -1 +1 @@
46bd00889699f5a20a4981a22f62b66368323855
7ac73abb7afd9e6ddc0520a1568581c7ed0afd36
@@ -7,6 +7,59 @@ namespace Logic.ProductionToProductMapper.Cordonel
/// </summary>
public static class MeterSizeConverter
{
/// <summary>
/// Convert Meter size enumeration to name .
/// </summary>
public static String ConvertMeterSizeEnumToSizeName(MeterSize meterSizeId)
{
switch (meterSizeId)
{
case MeterSize.DN40:
return "DN40";
case MeterSize.DN50 :
return "DN50";
case MeterSize.DN65:
return "DN65";
case MeterSize.DN80:
return "DN80";
case MeterSize.DN100:
return "DN100";
case MeterSize.DN125:
return "DN125";
case MeterSize.DN150:
return "DN150";
case MeterSize.DN200:
return "DN200";
case MeterSize.DN250:
return "DN250";
case MeterSize.DN300:
return "DN300";
case MeterSize.US1_5:
return "US1_5";
case MeterSize.US2:
return "US2";
case MeterSize.US3:
return "US3";
case MeterSize.US4:
return "US4";
case MeterSize.US6:
return "US6";
case MeterSize.US8:
return "US8";
case MeterSize.US10:
return "US10";
case MeterSize.US12:
return "US12";
case MeterSize.DNMAX:
return "*";
default:
return "*";
}
}
/// <summary>
/// Convert from order meter size of production order to name .
/// </summary>
@@ -99,7 +99,7 @@
<HintPath>..\Hardware\WaterMeter\Genesis\GenesisConfig\bin\Debug\NLog.dll</HintPath>
</Reference>
<Reference Include="SIRTCOM">
<HintPath>..\..\packages\Sirt\SIRTCOM.dll</HintPath>
<HintPath>.\SIRTCOM.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
Binary file not shown.
@@ -1 +1 @@
0d85a5b3a7561b41163c20e5dc7713bcd0d65555
f64d563def603c89cafafa61a3219ba97e1e344c
+1 -1
View File
@@ -259,7 +259,7 @@
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(116, 25);
this.button1.TabIndex = 0;
this.button1.Text = "Set Trigger Active";
this.button1.Text = "Clear Display";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
+16 -14
View File
@@ -18,7 +18,6 @@ using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore.Consts;
using Xylem.Common.Logic.ProductionOrderCore.FW;
using Xylem.Common.Logic.SoftwareAccessHelper;
using Xylem.Common.Ui.GenesisToolBox.Properties;
@@ -120,13 +119,12 @@ namespace Xylem.Common.Ui.GenesisToolBox
"This is a stepwise update, proceed until update is completed!\n";
private const String StrUpdateErrorMessage =
"FW UPDATE FAILED!\n\n";
private FwSource fwSource = FwSource.File;
private FwSource _fwSource = FwSource.File;
private enum FwSource
{
File,
Production,
Db,
// Production,
Db
}
#endregion
#region FormControls
@@ -670,6 +668,9 @@ namespace Xylem.Common.Ui.GenesisToolBox
return;
}
lblOverall.Text = @"Establish data base connection..";
lblOverall.Visible = true;
Update();
_currentGenesis?.DisposeMeter();
//dispose old meter
_meterBatch.RemoveAllMeters();
@@ -1030,7 +1031,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
{
_packageFileToFileAppsValidated = _meterFwUpdate.ValidateFileAppsWithPackageFile();
}
catch (Exception e)
catch (Exception)
{
if (_meterFwUpdate.CoreRevisionMaximum == null)
MessageBoxShow(@"Core Revision missing in ADF!", @"FAILED",
@@ -1174,9 +1175,10 @@ namespace Xylem.Common.Ui.GenesisToolBox
private void btnOpenPackageControlFile_Click(Object sender, EventArgs e)
{
////reload last path
//reload last path
dlgOpenPackageFile.InitialDirectory = DefaultPackageFile;
dlgOpenPackageFile.DefaultExt = ".txt";
if (dlgOpenPackageFile.ShowDialog() != DialogResult.OK)
{
return;
@@ -1657,11 +1659,11 @@ namespace Xylem.Common.Ui.GenesisToolBox
private void checkSelectionChanged(FwSource newMode)
{
if (newMode == fwSource)
if (newMode == _fwSource)
{
return;
}
fwSource = newMode;
_fwSource = newMode;
}
private void PushFwFile(MeterFwUpdate meterFwUpdate)
@@ -1778,14 +1780,14 @@ namespace Xylem.Common.Ui.GenesisToolBox
private void button1_Click(Object sender, EventArgs e)
{
if (_currentGenesis == null || !_currentGenesis.IsLoggedOn)
if (_currentGenesis == null ) return;
if (!_currentGenesis.IsLoggedOn)
{
return;
_currentGenesis.Login();
}
else
{
_currentGenesis.SetLcdText(true, new Byte[] { 0x00, 0x00, 0x00, 0x00 });
}
_currentGenesis.Logout();
}
private void btnFixBat_Click(Object sender, EventArgs e)
+105
View File
@@ -0,0 +1,105 @@
namespace Xylem.Common.Ui.GenesisToolBox
{
partial class FrmHistory
{
/// <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 Windows Form 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.rtbHistory = new System.Windows.Forms.RichTextBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// rtbHistory
//
this.rtbHistory.Dock = System.Windows.Forms.DockStyle.Fill;
this.rtbHistory.Location = new System.Drawing.Point(3, 53);
this.rtbHistory.Name = "rtbHistory";
this.rtbHistory.Size = new System.Drawing.Size(378, 673);
this.rtbHistory.TabIndex = 31;
this.rtbHistory.Text = "";
this.rtbHistory.TextChanged += new System.EventHandler(this.rtbHistory_TextChanged);
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel1.Controls.Add(this.rtbHistory, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 111F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(384, 729);
this.tableLayoutPanel1.TabIndex = 38;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 2;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 44F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(378, 44);
this.tableLayoutPanel2.TabIndex = 36;
//
// FrmHistory
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.ClientSize = new System.Drawing.Size(384, 729);
this.ControlBox = false;
this.Controls.Add(this.tableLayoutPanel1);
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(400, 768);
this.MinimizeBox = false;
this.MinimumSize = new System.Drawing.Size(400, 768);
this.Name = "FrmHistory";
this.ShowIcon = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "FW-Update Process History";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmHistory_FormClosing);
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.RichTextBox rtbHistory;
}
}
+37
View File
@@ -0,0 +1,37 @@
using System;
using System.Windows.Forms;
namespace Xylem.Common.Ui.GenesisToolBox
{
/// <summary>
/// History display of update process
/// </summary>
[Serializable]
public partial class FrmHistory : Form
{
/// <summary>
/// Ctor
/// </summary>
public FrmHistory()
{
InitializeComponent();
}
private void FrmHistory_FormClosing(Object sender, FormClosingEventArgs e)
{
//avoid destroying of object
e.Cancel = true;
//instead just hide it
Hide();
}
/// <summary>
/// Select always the last line for the display.
/// </summary>
private void rtbHistory_TextChanged(Object sender, EventArgs e)
{
//rtbHistory.SelectionStart = rtbHistory.Text.Length;
//rtbHistory.ScrollToCaret();
}
}
}
+120
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>
+522
View File
@@ -0,0 +1,522 @@
namespace Xylem.Common.Ui.GenesisToolBox
{
partial class FrmLutUpdate
{
/// <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 Windows Form 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.components = new System.ComponentModel.Container();
this.grpSetup = new System.Windows.Forms.GroupBox();
this.tbxRegionRadio = new System.Windows.Forms.TextBox();
this.label8 = new System.Windows.Forms.Label();
this.tbxPcbId = new System.Windows.Forms.TextBox();
this.tbxMeterFw = new System.Windows.Forms.TextBox();
this.tbxMeterMeterSize = new System.Windows.Forms.TextBox();
this.tbxMeterLutCrc = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label();
this.label6 = new System.Windows.Forms.Label();
this.lblFwVersion = new System.Windows.Forms.Label();
this.btnConnect = new System.Windows.Forms.Button();
this.lblConnectPcb = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.cbComSlot = new System.Windows.Forms.ComboBox();
this.lblWaitingForMeterResponse = new System.Windows.Forms.Label();
this.btnStopFwUpdate = new System.Windows.Forms.Button();
this.btnDownloadLutFile = new System.Windows.Forms.Button();
this.lblOverall = new System.Windows.Forms.Label();
this.barSingleProgressUpdate = new System.Windows.Forms.ProgressBar();
this.lblActualProcess = new System.Windows.Forms.Label();
this.barOverallProgressUpdate = new System.Windows.Forms.ProgressBar();
this.tmrProgressUpdate = new System.Windows.Forms.Timer(this.components);
this.dlgOpenLuFile = new System.Windows.Forms.OpenFileDialog();
this.lblFwUpdateInfo = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.tbxFileMeterSize = new System.Windows.Forms.TextBox();
this.tbxFileCrc = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.lblLutFileLoadedInfo = new System.Windows.Forms.Label();
this.tbxLutFilePathName = new System.Windows.Forms.TextBox();
this.label4 = new System.Windows.Forms.Label();
this.btnOpenLutFile = new System.Windows.Forms.Button();
this.label9 = new System.Windows.Forms.Label();
this.lblUpdateTime = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.grpSetup.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.groupBox1.SuspendLayout();
this.SuspendLayout();
//
// grpSetup
//
this.grpSetup.Controls.Add(this.tbxRegionRadio);
this.grpSetup.Controls.Add(this.label8);
this.grpSetup.Controls.Add(this.tbxPcbId);
this.grpSetup.Controls.Add(this.tbxMeterFw);
this.grpSetup.Controls.Add(this.tbxMeterMeterSize);
this.grpSetup.Controls.Add(this.tbxMeterLutCrc);
this.grpSetup.Controls.Add(this.label5);
this.grpSetup.Controls.Add(this.label6);
this.grpSetup.Controls.Add(this.lblFwVersion);
this.grpSetup.Controls.Add(this.btnConnect);
this.grpSetup.Controls.Add(this.lblConnectPcb);
this.grpSetup.Controls.Add(this.label2);
this.grpSetup.Controls.Add(this.cbComSlot);
this.grpSetup.Location = new System.Drawing.Point(12, 56);
this.grpSetup.Name = "grpSetup";
this.grpSetup.Size = new System.Drawing.Size(248, 212);
this.grpSetup.TabIndex = 24;
this.grpSetup.TabStop = false;
this.grpSetup.Text = "Cordonel";
//
// tbxRegionRadio
//
this.tbxRegionRadio.Location = new System.Drawing.Point(124, 178);
this.tbxRegionRadio.Name = "tbxRegionRadio";
this.tbxRegionRadio.ReadOnly = true;
this.tbxRegionRadio.Size = new System.Drawing.Size(68, 20);
this.tbxRegionRadio.TabIndex = 34;
//
// label8
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(10, 182);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(105, 13);
this.label8.TabIndex = 33;
this.label8.Text = "Region/Radio[MHz]:";
//
// tbxPcbId
//
this.tbxPcbId.Location = new System.Drawing.Point(124, 59);
this.tbxPcbId.Name = "tbxPcbId";
this.tbxPcbId.ReadOnly = true;
this.tbxPcbId.Size = new System.Drawing.Size(68, 20);
this.tbxPcbId.TabIndex = 32;
//
// tbxMeterFw
//
this.tbxMeterFw.Location = new System.Drawing.Point(124, 88);
this.tbxMeterFw.Name = "tbxMeterFw";
this.tbxMeterFw.ReadOnly = true;
this.tbxMeterFw.Size = new System.Drawing.Size(68, 20);
this.tbxMeterFw.TabIndex = 31;
//
// tbxMeterMeterSize
//
this.tbxMeterMeterSize.Location = new System.Drawing.Point(124, 148);
this.tbxMeterMeterSize.Name = "tbxMeterMeterSize";
this.tbxMeterMeterSize.ReadOnly = true;
this.tbxMeterMeterSize.Size = new System.Drawing.Size(68, 20);
this.tbxMeterMeterSize.TabIndex = 30;
//
// tbxMeterLutCrc
//
this.tbxMeterLutCrc.Location = new System.Drawing.Point(124, 118);
this.tbxMeterLutCrc.Name = "tbxMeterLutCrc";
this.tbxMeterLutCrc.ReadOnly = true;
this.tbxMeterLutCrc.Size = new System.Drawing.Size(68, 20);
this.tbxMeterLutCrc.TabIndex = 29;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(10, 152);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(60, 13);
this.label5.TabIndex = 28;
this.label5.Text = "Meter Size:";
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(10, 122);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(86, 13);
this.label6.TabIndex = 27;
this.label6.Text = "Meter LUT CRC:";
//
// lblFwVersion
//
this.lblFwVersion.AutoSize = true;
this.lblFwVersion.Location = new System.Drawing.Point(10, 92);
this.lblFwVersion.Name = "lblFwVersion";
this.lblFwVersion.Size = new System.Drawing.Size(57, 13);
this.lblFwVersion.TabIndex = 25;
this.lblFwVersion.Text = "Meter FW:";
//
// btnConnect
//
this.btnConnect.Location = new System.Drawing.Point(123, 24);
this.btnConnect.Name = "btnConnect";
this.btnConnect.Size = new System.Drawing.Size(116, 25);
this.btnConnect.TabIndex = 24;
this.btnConnect.Text = "Connect";
this.btnConnect.UseVisualStyleBackColor = true;
this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click);
//
// lblConnectPcb
//
this.lblConnectPcb.AutoSize = true;
this.lblConnectPcb.Location = new System.Drawing.Point(10, 62);
this.lblConnectPcb.Name = "lblConnectPcb";
this.lblConnectPcb.Size = new System.Drawing.Size(33, 13);
this.lblConnectPcb.TabIndex = 23;
this.lblConnectPcb.Text = "NOT ";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(10, 30);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(28, 13);
this.label2.TabIndex = 20;
this.label2.Text = "Slot:";
//
// cbComSlot
//
this.cbComSlot.FormattingEnabled = true;
this.cbComSlot.Items.AddRange(new object[] {
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20"});
this.cbComSlot.Location = new System.Drawing.Point(44, 27);
this.cbComSlot.Name = "cbComSlot";
this.cbComSlot.Size = new System.Drawing.Size(37, 21);
this.cbComSlot.TabIndex = 5;
this.cbComSlot.Text = "1";
this.cbComSlot.SelectedIndexChanged += new System.EventHandler(this.cbComSlot_SelectedIndexChanged);
//
// lblWaitingForMeterResponse
//
this.lblWaitingForMeterResponse.AutoSize = true;
this.lblWaitingForMeterResponse.ForeColor = System.Drawing.Color.Red;
this.lblWaitingForMeterResponse.Location = new System.Drawing.Point(532, 280);
this.lblWaitingForMeterResponse.Name = "lblWaitingForMeterResponse";
this.lblWaitingForMeterResponse.Size = new System.Drawing.Size(182, 13);
this.lblWaitingForMeterResponse.TabIndex = 18;
this.lblWaitingForMeterResponse.Text = "WAITING FOR METER RESPONSE";
//
// btnStopFwUpdate
//
this.btnStopFwUpdate.Location = new System.Drawing.Point(310, 181);
this.btnStopFwUpdate.Name = "btnStopFwUpdate";
this.btnStopFwUpdate.Size = new System.Drawing.Size(116, 25);
this.btnStopFwUpdate.TabIndex = 8;
this.btnStopFwUpdate.Text = "STOP";
this.btnStopFwUpdate.UseVisualStyleBackColor = true;
this.btnStopFwUpdate.Click += new System.EventHandler(this.btnStopFwUpdate_Click);
//
// btnDownloadLutFile
//
this.btnDownloadLutFile.Location = new System.Drawing.Point(310, 147);
this.btnDownloadLutFile.Name = "btnDownloadLutFile";
this.btnDownloadLutFile.Size = new System.Drawing.Size(116, 25);
this.btnDownloadLutFile.TabIndex = 0;
this.btnDownloadLutFile.Text = "Download";
this.btnDownloadLutFile.UseVisualStyleBackColor = true;
this.btnDownloadLutFile.Click += new System.EventHandler(this.btnDownloadLutFile_Click);
//
// lblOverall
//
this.lblOverall.AutoSize = true;
this.lblOverall.Location = new System.Drawing.Point(21, 317);
this.lblOverall.Name = "lblOverall";
this.lblOverall.Size = new System.Drawing.Size(80, 13);
this.lblOverall.TabIndex = 7;
this.lblOverall.Text = "Overall process";
//
// barSingleProgressUpdate
//
this.barSingleProgressUpdate.Location = new System.Drawing.Point(12, 296);
this.barSingleProgressUpdate.Name = "barSingleProgressUpdate";
this.barSingleProgressUpdate.Size = new System.Drawing.Size(702, 18);
this.barSingleProgressUpdate.TabIndex = 6;
this.barSingleProgressUpdate.Visible = false;
//
// lblActualProcess
//
this.lblActualProcess.AutoSize = true;
this.lblActualProcess.Location = new System.Drawing.Point(21, 280);
this.lblActualProcess.Name = "lblActualProcess";
this.lblActualProcess.Size = new System.Drawing.Size(76, 13);
this.lblActualProcess.TabIndex = 4;
this.lblActualProcess.Text = "Process status";
//
// barOverallProgressUpdate
//
this.barOverallProgressUpdate.Location = new System.Drawing.Point(12, 333);
this.barOverallProgressUpdate.Name = "barOverallProgressUpdate";
this.barOverallProgressUpdate.Size = new System.Drawing.Size(702, 18);
this.barOverallProgressUpdate.TabIndex = 3;
this.barOverallProgressUpdate.Visible = false;
//
// tmrProgressUpdate
//
this.tmrProgressUpdate.Interval = 200;
this.tmrProgressUpdate.Tick += new System.EventHandler(this.tmrProgressUpdate_Tick);
//
// dlgOpenLuFile
//
this.dlgOpenLuFile.Filter = "metrology lookup tables (*.lut)|*.lut";
//
// lblFwUpdateInfo
//
this.lblFwUpdateInfo.AutoSize = true;
this.lblFwUpdateInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblFwUpdateInfo.Location = new System.Drawing.Point(18, 32);
this.lblFwUpdateInfo.Name = "lblFwUpdateInfo";
this.lblFwUpdateInfo.Size = new System.Drawing.Size(72, 13);
this.lblFwUpdateInfo.TabIndex = 27;
this.lblFwUpdateInfo.Text = "Version: 0.0.0";
//
// pictureBox1
//
this.pictureBox1.Image = global::Xylem.Common.Ui.GenesisToolBox.Properties.Resources.SensusLogoXylem;
this.pictureBox1.Location = new System.Drawing.Point(611, 3);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(102, 54);
this.pictureBox1.TabIndex = 29;
this.pictureBox1.TabStop = false;
//
// openFileDialog1
//
this.openFileDialog1.FileName = "openFileDialog1";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.tbxFileMeterSize);
this.groupBox1.Controls.Add(this.tbxFileCrc);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.lblLutFileLoadedInfo);
this.groupBox1.Controls.Add(this.btnDownloadLutFile);
this.groupBox1.Controls.Add(this.tbxLutFilePathName);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.btnStopFwUpdate);
this.groupBox1.Controls.Add(this.btnOpenLutFile);
this.groupBox1.Location = new System.Drawing.Point(278, 56);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(436, 212);
this.groupBox1.TabIndex = 28;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Lookup Table File";
//
// tbxFileMeterSize
//
this.tbxFileMeterSize.Location = new System.Drawing.Point(104, 148);
this.tbxFileMeterSize.Name = "tbxFileMeterSize";
this.tbxFileMeterSize.ReadOnly = true;
this.tbxFileMeterSize.Size = new System.Drawing.Size(68, 20);
this.tbxFileMeterSize.TabIndex = 13;
//
// tbxFileCrc
//
this.tbxFileCrc.Location = new System.Drawing.Point(104, 118);
this.tbxFileCrc.Name = "tbxFileCrc";
this.tbxFileCrc.ReadOnly = true;
this.tbxFileCrc.Size = new System.Drawing.Size(68, 20);
this.tbxFileCrc.TabIndex = 12;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(10, 152);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(79, 13);
this.label3.TabIndex = 11;
this.label3.Text = "File Meter Size:";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(10, 122);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(75, 13);
this.label1.TabIndex = 10;
this.label1.Text = "File LUT CRC:";
//
// lblLutFileLoadedInfo
//
this.lblLutFileLoadedInfo.AutoSize = true;
this.lblLutFileLoadedInfo.Location = new System.Drawing.Point(10, 60);
this.lblLutFileLoadedInfo.Name = "lblLutFileLoadedInfo";
this.lblLutFileLoadedInfo.Size = new System.Drawing.Size(97, 13);
this.lblLutFileLoadedInfo.TabIndex = 9;
this.lblLutFileLoadedInfo.Text = "LUT file not loaded";
//
// tbxLutFilePathName
//
this.tbxLutFilePathName.Location = new System.Drawing.Point(104, 27);
this.tbxLutFilePathName.Name = "tbxLutFilePathName";
this.tbxLutFilePathName.ReadOnly = true;
this.tbxLutFilePathName.Size = new System.Drawing.Size(322, 20);
this.tbxLutFilePathName.TabIndex = 2;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(10, 30);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(63, 13);
this.label4.TabIndex = 1;
this.label4.Text = "Path Name:";
//
// btnOpenLutFile
//
this.btnOpenLutFile.Location = new System.Drawing.Point(310, 112);
this.btnOpenLutFile.Name = "btnOpenLutFile";
this.btnOpenLutFile.Size = new System.Drawing.Size(116, 26);
this.btnOpenLutFile.TabIndex = 0;
this.btnOpenLutFile.Text = "Open";
this.btnOpenLutFile.UseVisualStyleBackColor = true;
this.btnOpenLutFile.Click += new System.EventHandler(this.btnOpenLutFile_Click);
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(250, 280);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(101, 13);
this.label9.TabIndex = 30;
this.label9.Text = "UpdateTime [min:s]:";
//
// lblUpdateTime
//
this.lblUpdateTime.AutoSize = true;
this.lblUpdateTime.Location = new System.Drawing.Point(357, 280);
this.lblUpdateTime.Name = "lblUpdateTime";
this.lblUpdateTime.Size = new System.Drawing.Size(28, 13);
this.lblUpdateTime.TabIndex = 31;
this.lblUpdateTime.Text = "0:00";
//
// label7
//
this.label7.AutoSize = true;
this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label7.Location = new System.Drawing.Point(16, 9);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(159, 16);
this.label7.TabIndex = 32;
this.label7.Text = "Cordonel LUT Update";
//
// FrmLutUpdate
//
this.AccessibleRole = System.Windows.Forms.AccessibleRole.Sound;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(723, 366);
this.Controls.Add(this.label7);
this.Controls.Add(this.lblUpdateTime);
this.Controls.Add(this.label9);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.lblWaitingForMeterResponse);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.lblOverall);
this.Controls.Add(this.lblFwUpdateInfo);
this.Controls.Add(this.barSingleProgressUpdate);
this.Controls.Add(this.lblActualProcess);
this.Controls.Add(this.grpSetup);
this.Controls.Add(this.barOverallProgressUpdate);
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(739, 405);
this.MinimizeBox = false;
this.MinimumSize = new System.Drawing.Size(739, 405);
this.Name = "FrmLutUpdate";
this.Text = "Metrology Lookup Table Update";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmLutUpdate_FormClosing);
this.Load += new System.EventHandler(this.FrmLutUpdate_Load);
this.grpSetup.ResumeLayout(false);
this.grpSetup.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.GroupBox grpSetup;
private System.Windows.Forms.Button btnConnect;
private System.Windows.Forms.Label lblConnectPcb;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox cbComSlot;
private System.Windows.Forms.Button btnDownloadLutFile;
private System.Windows.Forms.ProgressBar barOverallProgressUpdate;
private System.Windows.Forms.Timer tmrProgressUpdate;
private System.Windows.Forms.Label lblActualProcess;
private System.Windows.Forms.Label lblOverall;
private System.Windows.Forms.ProgressBar barSingleProgressUpdate;
private System.Windows.Forms.OpenFileDialog dlgOpenLuFile;
private System.Windows.Forms.Label lblFwUpdateInfo;
private System.Windows.Forms.Button btnStopFwUpdate;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.Label lblWaitingForMeterResponse;
private System.Windows.Forms.Label lblFwVersion;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox tbxLutFilePathName;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Button btnOpenLutFile;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label lblUpdateTime;
private System.Windows.Forms.Label lblLutFileLoadedInfo;
private System.Windows.Forms.TextBox tbxFileMeterSize;
private System.Windows.Forms.TextBox tbxFileCrc;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox tbxMeterMeterSize;
private System.Windows.Forms.TextBox tbxMeterLutCrc;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.TextBox tbxMeterFw;
private System.Windows.Forms.TextBox tbxPcbId;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox tbxRegionRadio;
private System.Windows.Forms.Label label8;
}
}
+687
View File
@@ -0,0 +1,687 @@
using System;
using System.Drawing;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Logic.ProductionToProductMapper.Cordonel;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisFile;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Utils.ProcessExec.EventArguments;
namespace Xylem.Common.Ui.GenesisToolBox
{
/// <summary>
/// FW update form
/// </summary>
public partial class FrmLutUpdate : Form
{
#region Variables
private readonly MeterBatch _meterBatch = new MeterBatch();
private GenesisMeter _currentGenesis;
private const String StrConnecting = "Connecting to PCB";
private const String StrNotConnected = "NOT CONNECTED";
private const String StrPartPcbConnected = "PCB ID: ";
private const String StrOverallProcess = "Overall Process";
private MeterLutUpdate _meterLutUpdate;
private String _lastFwUpdateState;
private Int32 _lastSingleProgress;
private DateTimeOffset _startTime;
private Boolean _resetTimeMeasurement;
private readonly Boolean _updateGui = true;
private Boolean _lutFileValid;
private Boolean _tryConnectPcb;
private Boolean _lutFileSuccessfulWritten;
private const String StrUpdateErrorMessage = "METROLOGY LOOKUP TABLE UPDATE FAILED!";
private const String StrUpdateSuccessMessage = "Metrology lookup table successfulley written!";
private const String StrLutFileInvalid = "LUT FILE INVALID";
private const String StrLutFileValid = "LUT file loaded";
// external update remarks form
private readonly FrmHistory _frmHistory = new FrmHistory();
private readonly Version _version;
// status information
private static readonly Color ColorDefault = Color.Black;
private static readonly Color ColorSuccess = Color.Green;
private static readonly Color ColorProcessFailed = Color.Red;
//private static readonly Color ColorOngoingProcess = Color.Blue;
//private static readonly Color ColorUnknownStatus = Color.Gray;
//private const String SuccessSign = @"✔";
//private const String FailedSign = @"✘";
private const String StrSeparator = "-----------------------------------------------------" +
"-----------------------------------------------------";
#endregion
#region FormControls
/// <summary>
/// Ctor FW update
/// </summary>
public FrmLutUpdate()
{
InitializeComponent();
var cultureInfo = new CultureInfo("en-GB");
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = cultureInfo;
_version = Assembly.GetExecutingAssembly().GetName().Version;
}
/// <summary>
/// Clear data table and set genesis to not connected
/// </summary>
private void Init()
{
ProcessViewControl(false);
lblConnectPcb.Text = StrNotConnected;
lblConnectPcb.ForeColor = Color.Red;
lblWaitingForMeterResponse.Visible = false;
btnConnect.Enabled = true;
btnDownloadLutFile.ForeColor = Color.DarkGreen;
btnStopFwUpdate.ForeColor = Color.Red;
SetControlDownloadsLocked();
btnStopFwUpdate.Enabled = false;
btnOpenLutFile.Enabled = true;
tbxPcbId.Visible = false;
}
private void FrmLutUpdate_Load(Object sender, EventArgs e)
{
var version = Assembly.GetExecutingAssembly().GetName().Version;
lblFwUpdateInfo.Text = $@"Version: {version.Major}.{version.Minor}.{version.Build}";
_resetTimeMeasurement = true;
Init();
}
private void FrmLutUpdate_FormClosing(Object sender, FormClosingEventArgs e)
{
_frmHistory?.Close();
_currentGenesis?.Logout();
_meterBatch?.RemoveAllMeters();
_meterBatch?.Dispose();
if (_meterLutUpdate != null)
{
_meterLutUpdate.OnProcessUpdate -= ProcessUpdate_Event;
_meterLutUpdate.Dispose();
_meterLutUpdate = null;
}
Dispose();
}
private void cbComSlot_SelectedIndexChanged(Object sender, EventArgs e)
{
_resetTimeMeasurement = true;
Init();
}
#endregion
#region ActivationControls
private void SetControlDownloadsLocked()
{
btnDownloadLutFile.Enabled = false;
btnStopFwUpdate.Enabled = false;
btnConnect.Enabled = true;
}
private void SetControlsDownloadIsOngoing()
{
btnConnect.Enabled = false;
btnOpenLutFile.Enabled = false;
btnDownloadLutFile.Enabled = false;
btnStopFwUpdate.Enabled = true;
}
private void SetControlsDownloadIsFinished()
{
_currentGenesis.RequestProtocol.AdditionalRetryTimeoutMs = 0;
btnConnect.Enabled = true;
btnOpenLutFile.Enabled = true;
btnDownloadLutFile.Enabled = true;
btnStopFwUpdate.Enabled = false;
}
private void SetControlsDownloadEnabled()
{
btnConnect.Enabled = true;
btnOpenLutFile.Enabled = true;
btnDownloadLutFile.Enabled = true;
btnStopFwUpdate.Enabled = false;
}
#endregion
#region BoardControls
private void Connect()
{
try
{
Init();
Int32 slotNr;
if (string.IsNullOrEmpty(cbComSlot.SelectedItem.ToString()) ||
!int.TryParse(cbComSlot.SelectedItem.ToString(), out slotNr))
{
return;
}
lblOverall.Text = @"Establish data base connection..";
lblOverall.Visible = true;
Update();
_currentGenesis?.DisposeMeter();
//dispose old meter
_meterBatch.RemoveAllMeters();
_currentGenesis = null;
Thread.Sleep(200);
//assign new meter and assign meter to FW update file if this exists
_currentGenesis = new GenesisMeter();
_currentGenesis.SetupFromConfigFile(slotNr);
_meterBatch.AddMeter(_currentGenesis);
_currentGenesis._configuration.UseRegisterWatchService = false;
_currentGenesis._configuration.UseMinMaxCheck = false;
var xPosition = Location.X + Size.Width;
var yPosition = Location.Y;
if (_frmHistory != null)
{
_frmHistory.SetDesktopLocation(xPosition, yPosition);
_frmHistory.Show();
}
ClearHistoryWindow();
LogText(StrSeparator);
LogText($"GenesisToolBox: {_version.Major}.{_version.Minor}.{_version.Build}");
LogText($"Date: {DateTime.Now.ToShortDateString()}");
LogText(StrSeparator);
Task.Factory.StartNew(() =>
{
ViewProgressPcb(true);
_meterBatch.MetersLogin();
if (!_currentGenesis.IsLoggedOn)
{
Thread.Sleep(2000);
_meterBatch.MetersLogin();
}
if (!_currentGenesis.IsLoggedOn)
{
return;
}
_meterLutUpdate?.AssignGenesis(_currentGenesis);
Invoke(new Action(() =>
{
lblConnectPcb.Text = StrPartPcbConnected;
tbxPcbId.Text = _currentGenesis.PcbId;
tbxPcbId.Visible = true;
tbxMeterFw.Text = _currentGenesis.FwVersion;
tbxMeterMeterSize.Text = _currentGenesis.MeterSize;
tbxMeterLutCrc.Text = _currentGenesis.LutCrc;
tbxRegionRadio.Text = _currentGenesis.RegionRadio;
LogText("Meter FW Version: " + _currentGenesis.FwVersion);
LogText("Meter LUT CRC: " + _currentGenesis.LutCrc);
LogText("Meter Size: " + _currentGenesis.MeterSize);
LogText("Meter Region/Radio[MHz]: " + _currentGenesis.RegionRadio);
lblConnectPcb.ForeColor = Color.Green;
CheckUpdateEnabled();
_currentGenesis.Logout();
LogInstalledMeterFw();
}));
}).ContinueWith(delegate
{
ViewProgressPcb(false);
});
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
LogErrorText(ex.Message);
}
}
#endregion
#region ProcessControls
private void ViewProgressPcb(Boolean isActive)
{
if (_updateGui)
{
if (isActive)
{
Invoke(new Action(() =>
{
_tryConnectPcb = true;
ProcessViewControl(true);
lblActualProcess.Text = StrConnecting;
lblOverall.Text = StrOverallProcess;
}));
}
else
{
Invoke(new Action(() =>
{
_tryConnectPcb = false;
ProcessViewControl(false);
}));
}
}
}
/// <summary>
/// View all process bars and labels
/// </summary>
private void ProcessViewControl(Boolean view)
{
if (view)
{
lblActualProcess.Visible = true;
lblOverall.Visible = true;
barOverallProgressUpdate.Visible = true;
barSingleProgressUpdate.Visible = true;
_lastFwUpdateState = "";
tmrProgressUpdate.Enabled = true;
}
else
{
lblActualProcess.Visible = false;
lblOverall.Visible = false;
barOverallProgressUpdate.Visible = false;
barSingleProgressUpdate.Visible = false;
tmrProgressUpdate.Enabled = false;
_lastFwUpdateState = "";
lblWaitingForMeterResponse.Visible = false;
lblActualProcess.Text = "";
lblOverall.Text = "";
}
//common actions and settings
lblActualProcess.Update();
lblOverall.Update();
barOverallProgressUpdate.Value = 0;
barOverallProgressUpdate.Update();
barSingleProgressUpdate.Value = 0;
barSingleProgressUpdate.Update();
Update();
}
private void StartStopDownload(Boolean isActive)
{
if (isActive)
{
Invoke(new Action(() =>
{
_lastFwUpdateState = "";
ProcessViewControl(true);
tmrProgressUpdate.Enabled = true;
}));
}
else
{
Invoke(new Action(() =>
{
ProcessViewControl(false);
SetControlsDownloadIsFinished();
if (!_lutFileSuccessfulWritten)
{
lblLutFileLoadedInfo.ForeColor = Color.Red;
lblLutFileLoadedInfo.Text = StrUpdateErrorMessage;
var txt = StrUpdateErrorMessage;
if (!string.IsNullOrEmpty(_meterLutUpdate?.ErrorMessage))
{
txt += "\n";
txt += _meterLutUpdate?.ErrorMessage;
}
LogErrorText(txt);
MessageBoxShow(txt, @"FAILED",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// on successfully execution the meter size and LUT CRC is identical to file content
tbxMeterMeterSize.Text = tbxFileMeterSize.Text;
tbxMeterLutCrc.Text = tbxFileCrc.Text;
LogSuccessText(StrUpdateSuccessMessage);
MessageBoxShow(StrUpdateSuccessMessage, @"SUCCESS",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}));
}
}
/// <summary>
/// Display installed meter FW.
/// </summary>
/// <remarks date="2022-Mar-25" author="Thomas Wiedebusch">
/// - Init.
/// </remarks>
private void LogInstalledMeterFw()
{
if (_currentGenesis == null)
return;
LogText(StrSeparator);
LogText($"PCB ID: {_currentGenesis.PcbId}");
LogText($"Core Version: {_currentGenesis.CoreRevision}");
LogText("");
LogText("Installed Applications:");
foreach (var app in _currentGenesis.MeterAppListVersion)
{
var versionString = app.IsInstalled ? $"V: {app.StrVersion} - CRC: 0x{app.Crc:X4}" :
"App NOT Installed";
LogText($"AppId: 0x{app.AppId:X2} - {versionString} - " + $"AppName: {app.AppName}");
if (app.IsInstalled)
{
var appVersion = new CordonelAppVersion(app.AppId, app.StrVersion);
// Copy metrology update permission
if (app.AppName == MeterFwUpdateCapability.MetrologyName &&
_currentGenesis.MetrologyUpgradePermission != MeterFwUpdateCapability.MetrologyUpgradePermitted)
{
appVersion.IsUpdateable = false;
}
}
}
LogText(StrSeparator);
}
/// <summary>
/// Clear history window.
/// </summary>
/// <remarks date="2021-Jan-05" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private void ClearHistoryWindow()
{
if (_frmHistory != null && _frmHistory.rtbHistory.InvokeRequired)
{
_frmHistory.rtbHistory.Invoke(new Action(() => { _frmHistory.rtbHistory.Clear(); }));
}
else
_frmHistory?.rtbHistory.Clear();
}
/// <summary>
/// Output exclusively to user update remarks text window.
/// </summary>
/// <remarks date="2021-Apr-26" author="Thomas Wiedebusch">
/// - Color added.
/// </remarks>
private void LogText(String txtHistory)
{
InfoWindowColoredText(txtHistory, ColorDefault);
}
/// <summary>
/// Output exclusively to user update remarks text window.
/// </summary>
private void LogErrorText(String txtHistory)
{
InfoWindowColoredText(txtHistory, ColorProcessFailed);
}
/// <summary>
/// Output exclusively to user update remarks text window.
/// </summary>
private void LogSuccessText(String txtHistory)
{
InfoWindowColoredText(txtHistory, ColorSuccess);
}
/// <summary>
/// Output exclusively to user update remarks text window.
/// </summary>
private void InfoWindowColoredText(String txtHistory, Color color)
{
if (_frmHistory?.rtbHistory == null)
return;
Invoke(new Action(() =>
{
_frmHistory.rtbHistory.SuspendLayout();
_frmHistory.rtbHistory.SelectionStart = _frmHistory.rtbHistory.Text.Length;
_frmHistory.rtbHistory.SelectionLength = 0;
_frmHistory.rtbHistory.SelectionColor = color;
_frmHistory.rtbHistory.AppendText($"{txtHistory}{Environment.NewLine}");
_frmHistory.rtbHistory.SelectionColor = _frmHistory.rtbHistory.ForeColor;
_frmHistory.rtbHistory.ScrollToCaret();
_frmHistory.rtbHistory.ResumeLayout();
}));
}
#endregion
#region Checks
private void CheckUpdateEnabled()
{
//this check has been placed here to force display update
if (_meterLutUpdate != null && _currentGenesis != null && _lutFileValid)
{
SetControlsDownloadEnabled();
return;
}
SetControlDownloadsLocked();
}
#endregion
#region Events
/// <summary>
/// Process update event for displaying messages in historxy window
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks date="2020-Dec-10" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
public virtual void ProcessUpdate_Event(Object sender, ProcessExecEventArgs e)
{
LogText(e.OverallProcessMessage);
}
#endregion
#region TimerControls
private void tmrProgressUpdate_Tick(Object sender, EventArgs e)
{
//cbxManualControl.Visible = true;
if (_tryConnectPcb)
{
barOverallProgressUpdate.Value = barOverallProgressUpdate.Value + 1 > 100 ? 0 :
barOverallProgressUpdate.Value + 1;
barSingleProgressUpdate.Value = barSingleProgressUpdate.Value + 4 > 100 ? 0 :
barSingleProgressUpdate.Value + 4;
lblOverall.Text = StrOverallProcess;
}
else
{
lblOverall.Text = _meterLutUpdate?.GetLutUpdateStateOperation();
lblActualProcess.Text = _meterLutUpdate?.GetActualOperation();
var overallProgress = (Int32)(_meterLutUpdate?.OverallProcessCtrPercent ?? 0);
if (overallProgress < 0)
overallProgress = 0;
barOverallProgressUpdate.Value = overallProgress > 100 ? 100 : overallProgress;
barOverallProgressUpdate.Update();
var singleProgress = (Int32)(_meterLutUpdate?.SingleFileProcessCtrPercent ?? 0);
if (_meterLutUpdate?.GetActualOperation() != _lastFwUpdateState)
{
_lastFwUpdateState = _meterLutUpdate?.GetActualOperation();
lblWaitingForMeterResponse.Visible = false;
}
else
{
//if the communication gets frozen
lblWaitingForMeterResponse.Visible = _lastSingleProgress == singleProgress;
}
barSingleProgressUpdate.Value = singleProgress > 100 ? 100 : singleProgress;
_lastSingleProgress = singleProgress;
barSingleProgressUpdate.Update();
}
SetTimeDisplay();
Update();
}
private void SetTimeDisplay()
{
var time = DateTimeOffset.UtcNow;
var timeSpan = time - _startTime;
lblUpdateTime.Text = $@"{(UInt32)timeSpan.TotalMinutes}:{timeSpan.Seconds:00}";
}
#endregion
#region Buttons
private void btnConnect_Click(Object sender, EventArgs e)
{
if (_resetTimeMeasurement)
{
_startTime = DateTimeOffset.UtcNow;
_resetTimeMeasurement = false;
}
Connect();
}
private void btnOpenLutFile_Click(Object sender, EventArgs e)
{
if (dlgOpenLuFile.ShowDialog() != DialogResult.OK)
{
return;
}
var lutFilePathName = dlgOpenLuFile.FileName;
lblLutFileLoadedInfo.Text = "";
tbxLutFilePathName.Text = lutFilePathName;
if (_meterLutUpdate == null)
{
_meterLutUpdate = new MeterLutUpdate(_currentGenesis);
_meterLutUpdate.OnProcessUpdate += ProcessUpdate_Event;
}
if (_meterLutUpdate == null)
{
return;
}
if (_meterLutUpdate.LoadLutFile(lutFilePathName))
{
lblLutFileLoadedInfo.ForeColor = Color.Green;
lblLutFileLoadedInfo.Text = StrLutFileValid;
tbxFileCrc.Text = $@"0x{_meterLutUpdate.LutFile.FileCrc:X4}";
tbxFileMeterSize.Text = MeterSizeConverter.ConvertMeterSizeEnumToSizeName(_meterLutUpdate.LutFile.MeterSize);
_lutFileValid = true;
LogText("File Meter Size: " + tbxFileMeterSize.Text);
LogText("File LUT CRC: " + tbxFileCrc.Text);
LogText(StrSeparator);
}
else
{
var txt = "";
if (!string.IsNullOrEmpty(_meterLutUpdate?.ErrorMessage))
{
txt += _meterLutUpdate?.ErrorMessage;
}
else
{
txt = StrLutFileInvalid;
}
LogErrorText(txt);
lblLutFileLoadedInfo.ForeColor = Color.Red;
lblLutFileLoadedInfo.Text = txt;
tbxFileCrc.Text = @" --- ";
tbxFileMeterSize.Text = @" --- ";
_lutFileValid = false;
}
CheckUpdateEnabled();
_resetTimeMeasurement = true;
}
/// <summary>
/// Download LUT file
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDownloadLutFile_Click(Object sender, EventArgs e)
{
if (_currentGenesis == null || _meterLutUpdate?.LutFile == null)
{
return;
}
lblLutFileLoadedInfo.Text = "";
SetControlsDownloadIsOngoing();
StartStopDownload(true);
_startTime = DateTimeOffset.UtcNow;
_resetTimeMeasurement = false;
Task.Factory.StartNew(() =>
{
_lutFileSuccessfulWritten = _meterLutUpdate.UpdateMeterLut();
Thread.Sleep(1000);
}).ContinueWith(delegate
{
StartStopDownload(false);
});
}
private void btnStopFwUpdate_Click(Object sender, EventArgs e)
{
if (_meterLutUpdate != null)
{
_meterLutUpdate.StopUpdateProcess = true;
}
}
#endregion
#region ExternalCalls
public MsgEventArgs LastMsgEvent;
public class MsgEventArgs : EventArgs
{
public String Text;
public String Caption;
public MessageBoxButtons Buttons;
public MessageBoxIcon Icon;
}
public event EventHandler<MsgEventArgs> OnMsgPopUp;
private void MessageBoxShow(String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon)
{
if (_updateGui)
{
MessageBox.Show(text, caption, buttons, icon);
}
else
{
LastMsgEvent = new MsgEventArgs() { Text = text, Caption = caption, Buttons = buttons, Icon = icon };
OnMsgPopUp?.Invoke(this, LastMsgEvent);
}
}
#endregion
}
}
+129
View File
@@ -0,0 +1,129 @@
<?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>
<metadata name="tmrProgressUpdate.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>274, 17</value>
</metadata>
<metadata name="dlgOpenLuFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>144, 17</value>
</metadata>
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>432, 17</value>
</metadata>
</root>
+24 -1
View File
@@ -238,6 +238,18 @@
<Compile Include="FrmFrozenMeter.Designer.cs">
<DependentUpon>FrmFrozenMeter.cs</DependentUpon>
</Compile>
<Compile Include="FrmHistory.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmHistory.Designer.cs">
<DependentUpon>FrmHistory.cs</DependentUpon>
</Compile>
<Compile Include="FrmLutUpdate.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmLutUpdate.Designer.cs">
<DependentUpon>FrmLutUpdate.cs</DependentUpon>
</Compile>
<Compile Include="FrmFwUpdate.cs">
<SubType>Form</SubType>
</Compile>
@@ -401,6 +413,13 @@
<EmbeddedResource Include="FrmFrozenMeter.resx">
<DependentUpon>FrmFrozenMeter.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmHistory.resx">
<DependentUpon>FrmHistory.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmLutUpdate.resx">
<DependentUpon>FrmLutUpdate.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="FrmFwUpdate.resx">
<DependentUpon>FrmFwUpdate.cs</DependentUpon>
<SubType>Designer</SubType>
@@ -488,7 +507,7 @@
<None Include="FrmRegisterStore.Designer.cs.vsspell" />
<None Include="GenesisToolBox_TemporaryKey.pfx" />
<None Include="meterconfig.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="Properties\app.manifest" />
@@ -616,6 +635,10 @@
<Project>{4b88b0d3-e791-4774-9521-eabeacdc420e}</Project>
<Name>Logging</Name>
</ProjectReference>
<ProjectReference Include="..\..\Utils\ProcessExec\ProcessExec.csproj">
<Project>{2FD60CF1-45CD-4060-B8E5-4F39FBA7F1CB}</Project>
<Name>ProcessExec</Name>
</ProjectReference>
<ProjectReference Include="..\LegacyGenesisControl\LegacyGenCtl.csproj">
<Project>{60765bf4-6165-4f2f-8756-1c699826265d}</Project>
<Name>LegacyGenCtl</Name>
+21 -8
View File
@@ -29,6 +29,7 @@
private void InitializeComponent()
{
this.gpGerneral = new System.Windows.Forms.GroupBox();
this.btnLutUpdate = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.btnPressure = new System.Windows.Forms.Button();
this.btnConfiguration = new System.Windows.Forms.Button();
@@ -58,6 +59,7 @@
//
// gpGerneral
//
this.gpGerneral.Controls.Add(this.btnLutUpdate);
this.gpGerneral.Controls.Add(this.button1);
this.gpGerneral.Controls.Add(this.btnPressure);
this.gpGerneral.Controls.Add(this.btnConfiguration);
@@ -71,14 +73,24 @@
this.gpGerneral.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.gpGerneral.Location = new System.Drawing.Point(13, 12);
this.gpGerneral.Name = "gpGerneral";
this.gpGerneral.Size = new System.Drawing.Size(181, 449);
this.gpGerneral.Size = new System.Drawing.Size(181, 503);
this.gpGerneral.TabIndex = 19;
this.gpGerneral.TabStop = false;
this.gpGerneral.Text = "General";
//
// btnLutUpdate
//
this.btnLutUpdate.Location = new System.Drawing.Point(7, 279);
this.btnLutUpdate.Name = "btnLutUpdate";
this.btnLutUpdate.Size = new System.Drawing.Size(151, 39);
this.btnLutUpdate.TabIndex = 17;
this.btnLutUpdate.Text = "Metrology LUT";
this.btnLutUpdate.UseVisualStyleBackColor = true;
this.btnLutUpdate.Click += new System.EventHandler(this.btnLutUpdate_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(5, 411);
this.button1.Location = new System.Drawing.Point(4, 455);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(152, 40);
this.button1.TabIndex = 16;
@@ -98,7 +110,7 @@
//
// btnConfiguration
//
this.btnConfiguration.Location = new System.Drawing.Point(6, 321);
this.btnConfiguration.Location = new System.Drawing.Point(5, 365);
this.btnConfiguration.Name = "btnConfiguration";
this.btnConfiguration.Size = new System.Drawing.Size(152, 40);
this.btnConfiguration.TabIndex = 14;
@@ -109,7 +121,7 @@
// btnCalender
//
this.btnCalender.Enabled = false;
this.btnCalender.Location = new System.Drawing.Point(6, 278);
this.btnCalender.Location = new System.Drawing.Point(5, 322);
this.btnCalender.Name = "btnCalender";
this.btnCalender.Size = new System.Drawing.Size(151, 39);
this.btnCalender.TabIndex = 13;
@@ -169,7 +181,7 @@
//
// btnSetup
//
this.btnSetup.Location = new System.Drawing.Point(5, 15);
this.btnSetup.Location = new System.Drawing.Point(6, 15);
this.btnSetup.Name = "btnSetup";
this.btnSetup.Size = new System.Drawing.Size(152, 40);
this.btnSetup.TabIndex = 1;
@@ -316,14 +328,14 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(390, 457);
this.ClientSize = new System.Drawing.Size(390, 517);
this.Controls.Add(this.gbDeveloper);
this.Controls.Add(this.gpLAA);
this.Controls.Add(this.gpGerneral);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D;
this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(410, 500);
this.MinimumSize = new System.Drawing.Size(410, 500);
this.MaximumSize = new System.Drawing.Size(410, 560);
this.MinimumSize = new System.Drawing.Size(410, 560);
this.Name = "FrmMainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Genesis ToolBox";
@@ -358,6 +370,7 @@
private System.Windows.Forms.Button btnLegacyTestApp;
private System.Windows.Forms.Button btnPressure;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button btnLutUpdate;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
}
+5 -48
View File
@@ -362,55 +362,12 @@ namespace Xylem.Common.Ui.GenesisToolBox
Hide();
}
private void button3_Click(object sender, EventArgs e)
private void btnLutUpdate_Click(object sender, EventArgs e)
{
var mb = new MeterBatch();
for (int i = 1; i <= 10; i++)
{
try
{
var a = new GenesisMeter();
mb.AddMeter(a);
a.SetupFromConfigFile(i);
a.Login();
}
catch (Exception)
{
}
}
var taskList = new List<Task>();
foreach (var item in mb.ListOfMeters)
{
if (item is GenesisMeter gm)
{
var completTasks = new Task(() =>
{
for (int i = 0; i < 50; i++)
{
gm.WriteRegister(Register.Genesisflow.LedMode, 0, false);
gm.WriteRegister(Register.Genesisflow.LedMode, 6, false);
gm.ReadRegister(Register.Genesisflow.LedMode);
gm.WriteRegister(Register.Genesisflow.LedMode, 0, false);
gm.WriteRegister(Register.Genesisflow.LedMode, 6, true, true);
gm.ReadRegister(Register.Genesisflow.LedMode);
gm.ReadRegister(Register.Genesisflow.CalFactor1);
gm.ReadRegister(Register.Genesisflow.CalFactor2);
gm.ReadRegister(Register.Genesisflow.AmplitudePeakDetectEnd);
}
});
completTasks.Start();
var form = new FrmLutUpdate();
form.Show();
form.Closed += Form_Closed;
Hide();
}
}
}
}
}
@@ -1,6 +1,5 @@
using System;
using System.Globalization;
using System.Threading;
namespace Xylem.Common.Utils.DateTimeServer
{
@@ -14,6 +14,16 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateConfig.Consts
/// </summary>
public const UInt32 ValidDays = 21;
/// <summary>
/// Search strings for "Firmware up to date!" messages in report file, copied from Resources.resx of all
/// language packages from "ServiceFwUpdateSw"
/// </summary>
public static readonly String[] FirmwareUpToDateSearchStrings = new String[]
{
"Firmware is up to date!",
"Firmware ist aktuell!"
};
/// <summary>
/// Name of the file which contains the meter file names that can be erased before the FW-Update
/// to free disk space and have to be restored after the FW-Update
@@ -80,11 +90,27 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateConfig.Consts
/// </summary>
public const String FwUpdateFileExtension = ".safe";
/// <summary>
/// Library-subfolder: For releases the files are sorted to subfolders to avoid confusion of the user.
/// </summary>
public const String LibrarySubFolderName = "Library";
/// <summary>
/// Library-subfolder: For releases the files are sorted to subfolders to avoid confusion of the user.
/// </summary>
public const String ConfigSubFolderName = "Config";
/// <summary>
/// Separator in file name between PcbId CustomerName and OrderNumber for the FW-Update Safe and all report
/// files.
/// </summary>
public const Char FwUpdateFileFieldSeparator = '_';
/// <summary>
/// Separator in file name between OrderNumber and position for the FW-Update Safe and all report
/// files.
/// </summary>
public const Char FwUpdateFileOrderPosSeparator = '-';
}
}
+183 -13
View File
@@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
@@ -37,6 +36,16 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
/// </summary>
public List<UserInformation> DbAllUpdateOperators { get; private set; }
/// <summary>
/// Cordonel SW package.
/// </summary>
public List<FilePart> DbFwUpdateSwPackage { get; private set; }
/// <summary>
/// Cordonel configuration files.
/// </summary>
public List<FilePart> DbFwUpdateConfigFiles { get; private set; }
/// <summary>
/// Cordonel FW packages.
/// </summary>
@@ -323,7 +332,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
try
{
var url = ServiceUrls.ListAllFwUpdateBuilderOperatorsServiceUrl();
var requestResponse = LocalWebRequest.GetRequest(url, 1200);
var requestResponse = LocalWebRequest.GetRequest(url, 5000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -374,6 +383,126 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
}
/// <summary>
/// Load the latest FW update SW package from DB.
/// </summary>
/// <returns>true if successful</returns>
/// <remarks date="2021-Oct-26" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public Boolean DownloadFwUpdateSwContainerFromDb()
{
try
{
var url = ServiceUrls.ListAllSwPackages();
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
return false;
}
DbIsConnected = true;
// get a list of all stored FW update SW packages
var dbCordonelSwPackages = JsonConvert.DeserializeObject<List<ClusteredFile>>(requestResponse);
if (dbCordonelSwPackages == null || dbCordonelSwPackages.Count == 0)
{
return false;
}
// get latest version
var fileId = dbCordonelSwPackages.Select(package => package.FileId).Prepend(0).Max();
if (fileId == 0)
{
return false;
}
if (DbFwUpdateSwPackage == null) DbFwUpdateSwPackage = new List<FilePart>();
DbFwUpdateSwPackage.Clear();
// download content
url = ServiceUrls.DownloadFileParts();
url += $"{fileId}&readContent=true";
requestResponse = LocalWebRequest.GetRequest(url, 15000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
return false;
}
DbIsConnected = true;
DbFwUpdateSwPackage = JsonConvert.DeserializeObject<List<FilePart>>(requestResponse);
return DbFwUpdateSwPackage != null && DbFwUpdateSwPackage.Count > 0;
}
catch (Exception)
{
DbIsConnected = false;
return false;
}
}
/// <summary>
/// Load the latest FW update configuration files from DB.
/// </summary>
/// <returns>true if successful</returns>
/// <remarks date="2021-Oct-26" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
public Boolean DownloadFwUpdateConfigurationFilesFromDb()
{
try
{
var url = ServiceUrls.ListAllConfigurationFilePackages();
var requestResponse = LocalWebRequest.GetRequest(url, 5000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
return false;
}
DbIsConnected = true;
// get a list of all stored FW update config file packages
var dbConfigFilePackages = JsonConvert.DeserializeObject<List<ClusteredFile>>(requestResponse);
if (dbConfigFilePackages == null || dbConfigFilePackages.Count == 0)
{
return false;
}
// get latest version
var fileId = dbConfigFilePackages.Select(package => package.FileId).Prepend(0).Max();
if (fileId == 0)
{
return false;
}
if (DbFwUpdateConfigFiles == null) DbFwUpdateConfigFiles = new List<FilePart>();
DbFwUpdateConfigFiles.Clear();
// download content
url = ServiceUrls.DownloadFileParts();
url += $"{fileId}&readContent=true";
requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
return false;
}
DbIsConnected = true;
DbFwUpdateConfigFiles = JsonConvert.DeserializeObject<List<FilePart>>(requestResponse);
return DbFwUpdateConfigFiles != null && DbFwUpdateConfigFiles.Count > 0;
}
catch (Exception)
{
DbIsConnected = false;
return false;
}
}
/// <summary>
/// Get all Cordonel safe info files from DB.
/// </summary>
@@ -389,7 +518,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
try
{
var url = ServiceUrls.ListAllFwUpdateSafes();
var requestResponse = LocalWebRequest.GetRequest(url, 5000);
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -430,7 +559,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
var url = ServiceUrls.ListAllFwUpdateSafesForUserServiceUrl();
url += $"{userId}";
var requestResponse = LocalWebRequest.GetRequest(url, 3000);
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -468,7 +597,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
var url = ServiceUrls.DownloadFileParts();
url += $"{fileId}&readContent={readContent}";
var requestResponse = LocalWebRequest.GetRequest(url, 5000);
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -506,7 +635,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
var url = ServiceUrls.DownloadFileParts();
url += $"{fileId}&readContent={readContent}";
var requestResponse = LocalWebRequest.GetRequest(url, 5000);
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -546,7 +675,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
var url = ServiceUrls.ListAllCordonelCustomersWithFilterServiceUrl();
url += searchPattern;
var requestResponse = LocalWebRequest.GetRequest(url, 1200);
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -1164,6 +1293,40 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
}
}
/// <summary>
/// Download all pcbIds contained in a special FW update safe for information referenced by container id
/// </summary>
/// <param name="containerId"></param>
/// <returns>true if file content exists</returns>
/// <remarks date="2021-Oct-29" author="Roland Drabesch">
/// - Initial.
/// </remarks>
public List<String> GetFwUpdateSafePcbIdsFromDb(Int32 containerId)
{
var fwUpdateSafesPcbIds = new List<String>();
try
{
var url = ServiceUrls.ListAllPcbIdsFromSafe();
url += $"{containerId}";
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
return fwUpdateSafesPcbIds;
}
DbIsConnected = true;
fwUpdateSafesPcbIds = JsonConvert.DeserializeObject<List<String>>(requestResponse);
return fwUpdateSafesPcbIds;
}
catch (Exception)
{
DbIsConnected = false;
return fwUpdateSafesPcbIds;
}
}
/// <summary>
/// Getting file contents referenced by file part id.
/// -http://localhost:56011/GetFileContent?FileId=3831
@@ -1204,20 +1367,25 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
/// Get reports from DB.
/// It can be searched for:
/// PCB ID,
/// User ID or
/// Order Number.
/// User ID,
/// Order Number,
/// Read content ( if false, a preview is available only).
/// Leaving all empty will search all reports.
/// </summary>
/// <param name="fwUpdRpt">list of reports</param>
/// <param name="pcbId">optional pcbId</param>
/// <param name="userId">optional userId</param>
/// <param name="orderNr">optional order number</param>
/// <returns>true if app list could be loaded</returns>
/// <param name="readContent">if false a preview of the reports will be loaded</param>
/// <returns>true reports could be loaded</returns>
/// <remarks date="2021-Apr-30" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
/// <remarks date="2021-Oct-29" author="Thomas Wiedebusch">
/// - Read content.
/// </remarks>
public Boolean DownloadFwUpdateReportsFromDb(out List<FwUpdateReportDb> fwUpdRpt, Int64 pcbId = 0,
Int32 userId = 0, Int64 orderNr = 0)
Int32 userId = 0, Int64 orderNr = 0, Boolean readContent = false)
{
fwUpdRpt = new List<FwUpdateReportDb>();
try
@@ -1239,7 +1407,9 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
url += $"OrderNr={orderNr}";
}
var requestResponse = LocalWebRequest.GetRequest(url, 10000);
url += $"&readContent={readContent}";
var requestResponse = LocalWebRequest.GetRequest(url, 20000);
if (string.IsNullOrEmpty(requestResponse))
{
DbIsConnected = false;
@@ -1325,7 +1495,7 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
url = ServiceUrls.AddPcbIdsToSafeServiceUrl();
url += containerId;
if (LocalWebRequest.PostRequestAsync(url, 1200, pcbIds))
if (LocalWebRequest.PostRequestAsync(url, 10000, pcbIds))
{
DbIsConnected = true;
return true;
@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
{
@@ -39,6 +40,11 @@ namespace Xylem.ServiceFwUpdate.Common.FwUpdateDb
/// </summary>
public Int32 FilePartId { get; set; }
/// <summary>
/// List of PcbIds
/// </summary>
public List<String> PcbIds { get; set; }
/// <summary>
/// automatic (DB-job) delete all FwUpdateSafeContainer with invalid date
/// </summary>
@@ -58,6 +58,20 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Const
/// </summary>
GetCordonelProductionOrdersFromDb,
/// <summary>
/// Load all Cordonel FW update safes from DB
/// </summary>
GetFwUpdateSafesInfosFromDb,
/// <summary>
/// Load all Cordonel FW update report files from DB
/// </summary>
GetReportsFromDb,
/// <summary>
/// Load selected Cordonel FW update report file from DB and display it
/// </summary>
GetAndDisplaySingleReportFromDb,
/// <summary>
/// Load all Cordonel serial numbers off a specific order from DB
/// </summary>
@@ -91,7 +91,13 @@
this.tabPageSafeBuildReport = new System.Windows.Forms.TabPage();
this.rtbReport = new System.Windows.Forms.RichTextBox();
this.tabPageFwUpdateSafes = new System.Windows.Forms.TabPage();
this.tblFwUpdateSafeSelection = new System.Windows.Forms.TableLayoutPanel();
this.tblPanelFwUpdateSafeSearch = new System.Windows.Forms.TableLayoutPanel();
this.gridViewFwUpdateSafeSelection = new System.Windows.Forms.DataGridView();
this.tabPageReports = new System.Windows.Forms.TabPage();
this.tblPanelFwUpdateReports = new System.Windows.Forms.TableLayoutPanel();
this.tblPanelFwUpdateReportsSearch = new System.Windows.Forms.TableLayoutPanel();
this.gridViewFwUpdateReportSelection = new System.Windows.Forms.DataGridView();
this.tblPanelLayer1Top = new System.Windows.Forms.TableLayoutPanel();
this.tblPanelSafeInfo = new System.Windows.Forms.TableLayoutPanel();
this.lblCustomerNameText = new System.Windows.Forms.Label();
@@ -154,6 +160,12 @@
this.tabPagePreBuildSummary.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.gridViewPreBuildSummary)).BeginInit();
this.tabPageSafeBuildReport.SuspendLayout();
this.tabPageFwUpdateSafes.SuspendLayout();
this.tblFwUpdateSafeSelection.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.gridViewFwUpdateSafeSelection)).BeginInit();
this.tabPageReports.SuspendLayout();
this.tblPanelFwUpdateReports.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.gridViewFwUpdateReportSelection)).BeginInit();
this.tblPanelLayer1Top.SuspendLayout();
this.tblPanelSafeInfo.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
@@ -194,9 +206,7 @@
// radioBtnEnglishLanguage
//
resources.ApplyResources(this.radioBtnEnglishLanguage, "radioBtnEnglishLanguage");
this.radioBtnEnglishLanguage.Checked = true;
this.radioBtnEnglishLanguage.Name = "radioBtnEnglishLanguage";
this.radioBtnEnglishLanguage.TabStop = true;
this.radioBtnEnglishLanguage.UseVisualStyleBackColor = true;
this.radioBtnEnglishLanguage.Click += new System.EventHandler(this.RadioBtnEnglishLanguage_Click);
//
@@ -645,16 +655,71 @@
//
this.tabPageFwUpdateSafes.BackColor = System.Drawing.SystemColors.Control;
this.tabPageFwUpdateSafes.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.tabPageFwUpdateSafes.Controls.Add(this.tblFwUpdateSafeSelection);
resources.ApplyResources(this.tabPageFwUpdateSafes, "tabPageFwUpdateSafes");
this.tabPageFwUpdateSafes.Name = "tabPageFwUpdateSafes";
//
// tblFwUpdateSafeSelection
//
resources.ApplyResources(this.tblFwUpdateSafeSelection, "tblFwUpdateSafeSelection");
this.tblFwUpdateSafeSelection.Controls.Add(this.tblPanelFwUpdateSafeSearch, 0, 0);
this.tblFwUpdateSafeSelection.Controls.Add(this.gridViewFwUpdateSafeSelection, 0, 1);
this.tblFwUpdateSafeSelection.Name = "tblFwUpdateSafeSelection";
//
// tblPanelFwUpdateSafeSearch
//
resources.ApplyResources(this.tblPanelFwUpdateSafeSearch, "tblPanelFwUpdateSafeSearch");
this.tblPanelFwUpdateSafeSearch.Name = "tblPanelFwUpdateSafeSearch";
//
// gridViewFwUpdateSafeSelection
//
this.gridViewFwUpdateSafeSelection.AllowUserToAddRows = false;
this.gridViewFwUpdateSafeSelection.AllowUserToDeleteRows = false;
this.gridViewFwUpdateSafeSelection.AllowUserToResizeColumns = false;
this.gridViewFwUpdateSafeSelection.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.gridViewFwUpdateSafeSelection.BackgroundColor = System.Drawing.SystemColors.Control;
this.gridViewFwUpdateSafeSelection.BorderStyle = System.Windows.Forms.BorderStyle.None;
resources.ApplyResources(this.gridViewFwUpdateSafeSelection, "gridViewFwUpdateSafeSelection");
this.gridViewFwUpdateSafeSelection.EnableHeadersVisualStyles = false;
this.gridViewFwUpdateSafeSelection.GridColor = System.Drawing.SystemColors.ControlLight;
this.gridViewFwUpdateSafeSelection.Name = "gridViewFwUpdateSafeSelection";
this.gridViewFwUpdateSafeSelection.ReadOnly = true;
//
// tabPageReports
//
this.tabPageReports.BackColor = System.Drawing.SystemColors.Control;
this.tabPageReports.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.tabPageReports.Controls.Add(this.tblPanelFwUpdateReports);
resources.ApplyResources(this.tabPageReports, "tabPageReports");
this.tabPageReports.Name = "tabPageReports";
//
// tblPanelFwUpdateReports
//
resources.ApplyResources(this.tblPanelFwUpdateReports, "tblPanelFwUpdateReports");
this.tblPanelFwUpdateReports.Controls.Add(this.tblPanelFwUpdateReportsSearch, 0, 0);
this.tblPanelFwUpdateReports.Controls.Add(this.gridViewFwUpdateReportSelection, 0, 1);
this.tblPanelFwUpdateReports.Name = "tblPanelFwUpdateReports";
//
// tblPanelFwUpdateReportsSearch
//
resources.ApplyResources(this.tblPanelFwUpdateReportsSearch, "tblPanelFwUpdateReportsSearch");
this.tblPanelFwUpdateReportsSearch.Name = "tblPanelFwUpdateReportsSearch";
//
// gridViewFwUpdateReportSelection
//
this.gridViewFwUpdateReportSelection.AllowUserToAddRows = false;
this.gridViewFwUpdateReportSelection.AllowUserToDeleteRows = false;
this.gridViewFwUpdateReportSelection.AllowUserToResizeRows = false;
this.gridViewFwUpdateReportSelection.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.gridViewFwUpdateReportSelection.BackgroundColor = System.Drawing.SystemColors.Control;
this.gridViewFwUpdateReportSelection.BorderStyle = System.Windows.Forms.BorderStyle.None;
resources.ApplyResources(this.gridViewFwUpdateReportSelection, "gridViewFwUpdateReportSelection");
this.gridViewFwUpdateReportSelection.EnableHeadersVisualStyles = false;
this.gridViewFwUpdateReportSelection.GridColor = System.Drawing.SystemColors.ControlLight;
this.gridViewFwUpdateReportSelection.Name = "gridViewFwUpdateReportSelection";
this.gridViewFwUpdateReportSelection.ReadOnly = true;
this.gridViewFwUpdateReportSelection.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.gridViewFwUpdateReportSelection_CellClick);
//
// tblPanelLayer1Top
//
resources.ApplyResources(this.tblPanelLayer1Top, "tblPanelLayer1Top");
@@ -933,6 +998,12 @@
this.tabPagePreBuildSummary.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.gridViewPreBuildSummary)).EndInit();
this.tabPageSafeBuildReport.ResumeLayout(false);
this.tabPageFwUpdateSafes.ResumeLayout(false);
this.tblFwUpdateSafeSelection.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.gridViewFwUpdateSafeSelection)).EndInit();
this.tabPageReports.ResumeLayout(false);
this.tblPanelFwUpdateReports.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.gridViewFwUpdateReportSelection)).EndInit();
this.tblPanelLayer1Top.ResumeLayout(false);
this.tblPanelSafeInfo.ResumeLayout(false);
this.tblPanelSafeInfo.PerformLayout();
@@ -1047,6 +1118,12 @@
private System.Windows.Forms.Label lblCordonelSelectedCountText;
private System.Windows.Forms.Label lblCordonelsSelectedCount;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.TableLayoutPanel tblPanelFwUpdateReports;
private System.Windows.Forms.TableLayoutPanel tblPanelFwUpdateReportsSearch;
private System.Windows.Forms.DataGridView gridViewFwUpdateReportSelection;
private System.Windows.Forms.TableLayoutPanel tblFwUpdateSafeSelection;
private System.Windows.Forms.TableLayoutPanel tblPanelFwUpdateSafeSearch;
private System.Windows.Forms.DataGridView gridViewFwUpdateSafeSelection;
}
}
File diff suppressed because it is too large Load Diff
@@ -1684,6 +1684,105 @@
<data name="&gt;&gt;tabPageSafeBuildReport.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="tblFwUpdateSafeSelection.ColumnCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 31</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateSafeSearch.Name" xml:space="preserve">
<value>tblPanelFwUpdateSafeSearch</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateSafeSearch.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateSafeSearch.Parent" xml:space="preserve">
<value>tblFwUpdateSafeSelection</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateSafeSearch.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tblPanelFwUpdateSafeSearch.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls /&gt;&lt;Columns Styles="Percent,50,Percent,50" /&gt;&lt;Rows Styles="Percent,50" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="gridViewFwUpdateSafeSelection.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="gridViewFwUpdateSafeSelection.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 31</value>
</data>
<data name="gridViewFwUpdateSafeSelection.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="gridViewFwUpdateSafeSelection.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 390</value>
</data>
<data name="gridViewFwUpdateSafeSelection.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateSafeSelection.Name" xml:space="preserve">
<value>gridViewFwUpdateSafeSelection</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateSafeSelection.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateSafeSelection.Parent" xml:space="preserve">
<value>tblFwUpdateSafeSelection</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateSafeSelection.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tblFwUpdateSafeSelection.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tblFwUpdateSafeSelection.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="tblFwUpdateSafeSelection.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="tblFwUpdateSafeSelection.RowCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="tblFwUpdateSafeSelection.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 421</value>
</data>
<data name="tblFwUpdateSafeSelection.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;tblFwUpdateSafeSelection.Name" xml:space="preserve">
<value>tblFwUpdateSafeSelection</value>
</data>
<data name="&gt;&gt;tblFwUpdateSafeSelection.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tblFwUpdateSafeSelection.Parent" xml:space="preserve">
<value>tabPageFwUpdateSafes</value>
</data>
<data name="&gt;&gt;tblFwUpdateSafeSelection.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tblFwUpdateSafeSelection.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tblPanelFwUpdateSafeSearch" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="gridViewFwUpdateSafeSelection" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,31,Percent,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="tabPageFwUpdateSafes.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value>
</data>
@@ -1711,6 +1810,105 @@
<data name="&gt;&gt;tabPageFwUpdateSafes.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="tblPanelFwUpdateReports.ColumnCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 31</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReportsSearch.Name" xml:space="preserve">
<value>tblPanelFwUpdateReportsSearch</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReportsSearch.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReportsSearch.Parent" xml:space="preserve">
<value>tblPanelFwUpdateReports</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReportsSearch.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tblPanelFwUpdateReportsSearch.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls /&gt;&lt;Columns Styles="Percent,50,Percent,50" /&gt;&lt;Rows Styles="Percent,50" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="gridViewFwUpdateReportSelection.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="gridViewFwUpdateReportSelection.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 31</value>
</data>
<data name="gridViewFwUpdateReportSelection.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="gridViewFwUpdateReportSelection.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 390</value>
</data>
<data name="gridViewFwUpdateReportSelection.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateReportSelection.Name" xml:space="preserve">
<value>gridViewFwUpdateReportSelection</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateReportSelection.Type" xml:space="preserve">
<value>System.Windows.Forms.DataGridView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateReportSelection.Parent" xml:space="preserve">
<value>tblPanelFwUpdateReports</value>
</data>
<data name="&gt;&gt;gridViewFwUpdateReportSelection.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tblPanelFwUpdateReports.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tblPanelFwUpdateReports.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="tblPanelFwUpdateReports.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="tblPanelFwUpdateReports.RowCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="tblPanelFwUpdateReports.Size" type="System.Drawing.Size, System.Drawing">
<value>986, 421</value>
</data>
<data name="tblPanelFwUpdateReports.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReports.Name" xml:space="preserve">
<value>tblPanelFwUpdateReports</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReports.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReports.Parent" xml:space="preserve">
<value>tabPageReports</value>
</data>
<data name="&gt;&gt;tblPanelFwUpdateReports.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tblPanelFwUpdateReports.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="tblPanelFwUpdateReportsSearch" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="gridViewFwUpdateReportSelection" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100" /&gt;&lt;Rows Styles="Absolute,31,Percent,100" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="tabPageReports.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value>
</data>
@@ -0,0 +1,179 @@
namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
{
partial class FrmHistory
{
/// <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 Windows Form 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()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmHistory));
this.rtbHistory = new System.Windows.Forms.RichTextBox();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.picBoxLogo = new System.Windows.Forms.PictureBox();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.lblPcbIdLabel = new System.Windows.Forms.Label();
this.lblDateLabel = new System.Windows.Forms.Label();
this.lblOperatorIdLabel = new System.Windows.Forms.Label();
this.lblPcbId = new System.Windows.Forms.Label();
this.lblDate = new System.Windows.Forms.Label();
this.lblOperatorId = new System.Windows.Forms.Label();
this.lblOrder = new System.Windows.Forms.Label();
this.lblCustomerName = new System.Windows.Forms.Label();
this.lblCustomerLabel = new System.Windows.Forms.Label();
this.lblOrderLabel = new System.Windows.Forms.Label();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.picBoxLogo)).BeginInit();
this.tableLayoutPanel3.SuspendLayout();
this.SuspendLayout();
//
// rtbHistory
//
resources.ApplyResources(this.rtbHistory, "rtbHistory");
this.rtbHistory.Name = "rtbHistory";
this.rtbHistory.TextChanged += new System.EventHandler(this.rtbHistory_TextChanged);
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.rtbHistory, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 0);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// tableLayoutPanel2
//
resources.ApplyResources(this.tableLayoutPanel2, "tableLayoutPanel2");
this.tableLayoutPanel2.Controls.Add(this.picBoxLogo, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel3, 0, 0);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
//
// picBoxLogo
//
resources.ApplyResources(this.picBoxLogo, "picBoxLogo");
this.picBoxLogo.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.picBoxLogo.Name = "picBoxLogo";
this.picBoxLogo.TabStop = false;
//
// tableLayoutPanel3
//
resources.ApplyResources(this.tableLayoutPanel3, "tableLayoutPanel3");
this.tableLayoutPanel3.Controls.Add(this.lblPcbIdLabel, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.lblDateLabel, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.lblOperatorIdLabel, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.lblPcbId, 1, 0);
this.tableLayoutPanel3.Controls.Add(this.lblDate, 1, 1);
this.tableLayoutPanel3.Controls.Add(this.lblOperatorId, 1, 2);
this.tableLayoutPanel3.Controls.Add(this.lblOrder, 4, 0);
this.tableLayoutPanel3.Controls.Add(this.lblCustomerName, 4, 2);
this.tableLayoutPanel3.Controls.Add(this.lblCustomerLabel, 3, 2);
this.tableLayoutPanel3.Controls.Add(this.lblOrderLabel, 3, 0);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
//
// lblPcbIdLabel
//
resources.ApplyResources(this.lblPcbIdLabel, "lblPcbIdLabel");
this.lblPcbIdLabel.Name = "lblPcbIdLabel";
//
// lblDateLabel
//
resources.ApplyResources(this.lblDateLabel, "lblDateLabel");
this.lblDateLabel.Name = "lblDateLabel";
//
// lblOperatorIdLabel
//
resources.ApplyResources(this.lblOperatorIdLabel, "lblOperatorIdLabel");
this.lblOperatorIdLabel.Name = "lblOperatorIdLabel";
//
// lblPcbId
//
resources.ApplyResources(this.lblPcbId, "lblPcbId");
this.lblPcbId.Name = "lblPcbId";
//
// lblDate
//
resources.ApplyResources(this.lblDate, "lblDate");
this.lblDate.Name = "lblDate";
//
// lblOperatorId
//
resources.ApplyResources(this.lblOperatorId, "lblOperatorId");
this.lblOperatorId.Name = "lblOperatorId";
//
// lblOrder
//
resources.ApplyResources(this.lblOrder, "lblOrder");
this.lblOrder.Name = "lblOrder";
//
// lblCustomerName
//
resources.ApplyResources(this.lblCustomerName, "lblCustomerName");
this.lblCustomerName.Name = "lblCustomerName";
//
// lblCustomerLabel
//
resources.ApplyResources(this.lblCustomerLabel, "lblCustomerLabel");
this.lblCustomerLabel.Name = "lblCustomerLabel";
//
// lblOrderLabel
//
resources.ApplyResources(this.lblOrderLabel, "lblOrderLabel");
this.lblOrderLabel.Name = "lblOrderLabel";
//
// FrmHistory
//
resources.ApplyResources(this, "$this");
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.tableLayoutPanel1);
this.MaximizeBox = false;
this.Name = "FrmHistory";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmHistory_FormClosing);
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.picBoxLogo)).EndInit();
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.PictureBox picBoxLogo;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
public System.Windows.Forms.RichTextBox rtbHistory;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.Label lblPcbIdLabel;
private System.Windows.Forms.Label lblDateLabel;
private System.Windows.Forms.Label lblOperatorIdLabel;
private System.Windows.Forms.Label lblPcbId;
private System.Windows.Forms.Label lblDate;
private System.Windows.Forms.Label lblOperatorId;
private System.Windows.Forms.Label lblOrderLabel;
private System.Windows.Forms.Label lblCustomerLabel;
private System.Windows.Forms.Label lblOrder;
private System.Windows.Forms.Label lblCustomerName;
}
}
@@ -0,0 +1,58 @@
using System;
using System.Globalization;
using System.Windows.Forms;
using Xylem.Common.Utils.DateTimeServer;
using Xylem.ServiceFwUpdate.Common.FwUpdateConfig.Consts;
using Xylem.ServiceFwUpdate.Common.FwUpdateDb;
namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder
{
/// <summary>
/// History display of update process
/// </summary>
[Serializable]
public partial class FrmHistory : Form
{
/// <summary>
/// Ctor
/// </summary>
public FrmHistory()
{
InitializeComponent();
}
private void FrmHistory_FormClosing(Object sender, FormClosingEventArgs e)
{
//avoid destroying of object
e.Cancel = true;
//instead just hide it
Hide();
}
/// <summary>
/// Apply labels
/// </summary>
public void ApplyLabels(FwUpdateReportDb report, CultureInfo currentCulture)
{
if (report == null) return;
if (report.FileName != null)
{
var splitName = report.FileName.Split(FwUpdateConfig.FwUpdateFileFieldSeparator);
lblCustomerName.Text = splitName[1];
}
lblDate.Text = DateTimeServer.GetDateStringFromDateTimeOffset(report.Date, currentCulture);
lblOperatorId.Text = report.UserId.ToString();
lblOrder.Text = $@"{report.OrderNr}-{report.OrderPos}";
lblPcbId.Text = report.PcbId.ToString();
}
/// <summary>
/// Select always the last line for the display.
/// </summary>
private void rtbHistory_TextChanged(Object sender, EventArgs e)
{
//rtbHistory.SelectionStart = rtbHistory.Text.Length;
//rtbHistory.ScrollToCaret();
}
}
}
@@ -0,0 +1,247 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="rtbHistory.Size" type="System.Drawing.Size, System.Drawing">
<value>528, 626</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>534, 729</value>
</data>
<data name="tableLayoutPanel2.Size" type="System.Drawing.Size, System.Drawing">
<value>528, 91</value>
</data>
<data name="picBoxLogo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/4QC8RXhpZgAATU0AKgAAAAgABAESAAMAAAABAAEAAAE7AAIAAAAH
AAAAPodpAAQAAAABAAAARpydAAEAAAAOAAAApgAAAABUaG9tYXMAAAAEkAMAAgAAABQAAAB8kAQAAgAA
ABQAAACQkpEAAgAAAAM1MwAAkpIAAgAAAAM1MwAAAAAAADIwMjE6MDQ6MDEgMTQ6NTk6MjkAMjAyMTow
NDowMSAxNDo1OToyOQAAAFQAaABvAG0AYQBzAAAA/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQD
BQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAIwBkAwEi
AAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAAB
fQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNE
RUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1
tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEA
AAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz
dHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ
2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fi5vYbML50scW7gb2C5p28Yrzr9qv8AZm0H
9rX4Map4O8QK0cV0vm2d5GP32nXKg+XOnuMkEfxKWXoa/M7wp8XfjF8ZtT0j9j288SafptxpGsz6Xqvi
SC/3TXWm24LfZlOQX2qrYUHewCIwUK+foMpyOOPpSnCqouDvNNbQt8S11ts1o9j4viTi6eT4mFGrQc1V
Vqbi/iqXSVNpr3b3upXatfS61/XDTdYtNYjZ7O6t7pEbazQyCQKfQkGpZ7iO2TdI6xr6scCvzR8e/BeD
/gkF+2N8M/EnhPVNbPwx8cOND1+G+ufOVJMhWkcgKvAdZV4yDHIB8pxXoP8AwWD12++NPxH+EPwF0W4e
O78aaumo6kY/vQ26Exo5/wBkAzuf+uINbx4djUxFKNGrelUTlztWso35rq+6t36o4ZccVKOCxM8Vh+XE
UJRg6alfmc7ez5Zcq0lf+W6s9NDU8P8AjTVpv+C4mtaP/a+pPoi+EFnSx+1ubQN5EB3iPOzPJOcdz619
rX+pW+lW7TXU8NtCvWSVwij8TxXwZ8PPD9p4V/4Ll32lWEIt7HTfAkNpbRDpFEltbKq/gABXzx8Uv2g/
AP7UH7afju5+PHiTxZb+B/B9/Jpnh7w9pEE8kMvlyvGXkMYO0nZuY8MxkADBUxXq18jePqUuRtRhRpt2
jeTvokordv1surPncLxcsnoYj2iUqlXFVoxUp8sFazblNp2iulk220kj9fLS9h1C3Wa3ljmhkGVeNgys
PYjg1FqWs2ejRq15dW9qrnarTSCMMfQZNfll+w9+0B4Z+B/7f+ieEfhL4h8Va18JfH0fkXGm6xbyxnSr
0rIVMe8DOGRPnAGVkKtkoGrpPA37Pen/APBTL/goB8cIviVrGvT6P8PLs6To+n2V15MdsnnSwqRkEDAh
LEAfM8hJz0PFW4WVCrJ4io40owU78vvWb5UuW+jvvrbqevhfESWLoU44Ogp151JUuX2i5LxjzuSqKLvH
l1Xu3vpbQ/Si/wBbs9Kije6u7a2SU4RpZVQOfbJ5q0GzX5I/sI/sD6L+138T/ip4Z8feKPFuraX8Kbk+
HtDRL8r5Cme5XzAG3BQPJyEUBcuc54r6W/4Id/ErXPFPwA8WeG9Z1G51aLwT4gk07T57hy8iQFFYR5JJ
2qwYgZ4DY6AVlmnDlLC0qk6VbnlT5eZctlaesWnd36XVjp4d44xGY4ihTxGF9lCuqnI+dSd6TtNSXKrK
97O7vbbU+2KKKK+VP0QKKKKAPF/23o/jJqHwyt9O+C8eix65qk7Wt9e6hMIm063ZGHnQknHmBsc7Wx1A
zXzH4p/4IxN4U/ZZ0RvCGqhfjj4bvf7dXX0nMX9oXZIZoPMblUXapjZv4lJOPMav0ExmivawOfYrCU40
8PaKTu9NZeUu6s2rbanyubcH5fmdedfHc03KPKk3pDZuUF9mTaT5tXp20PmD45fs1+Mv24f2Dm8J/EDT
NN8N/EiFUuInjuUntBfQZCzK0edscyllK4ynmNwcDPzp/wAEkPD3ij9o39q7xP8AFDx1dW+qXnw70mDw
jYXUDb4ZZlUxGRHyQxESOWYcMbndxnFfY/7Z/wAGPiL8c/h5a6H8PPHUXgKa4mePVLprbznubV4ypjQg
blbJzlSp9xWj+x1+ynof7G3wQsPBmiTS33kyNdX19KgSS/uXxvlKjIUYVVC5OFVRknJPpUc4jSyurSUo
81Rvlik/cTfv6vZSSSSTfc+fxPC88TxDhsQ4S9nQinOcpL97KK/d6LeUHKTcmlrojwP9oj9k74weG/8A
goHpvxo+Fo8N6pb6lYQaVqtnqcvltbRDakpUEqGBjVWUhtwYEEEdcz4i/safGL9mb9p7xN8SPgK/hnXN
L8dyfaNb8M623lIJyxdnRiVBXczspDqy+Yy4YV9C+If2k1+HVz8UtQ16EyaL4EurG3tks4d1zcG4trdw
hy20s00wUH5QARnoTXJ3X7Y3iPxnfX2neG/A2qWdxZ6LNq0s+oqskkZt7wQ3EUdujb7gmMMYmQ7ZHZFy
o3EVh8wzFxguSDioqDutJRspJS11cbppqzRONyfI1UqN1akakqkqi5W+aE7yhJw912U2mmpXi7bKxnfs
peGP2kNa+L114o+LGoeDdB8Mmza2g8K6TbrORJnKzCUMSjDufMfcONq8EZn7DP7K3jP4G/tXfHjxX4is
bS20Xx5q/wBs0eWK7SZ5o/tFw+WVTlDtkQ4PrXceJP2i/EnxE/Z+0vxV4B0me3urrUzaajbyW8OqX+lw
R+YJitrHcIJZ1ZEBh8wSKGY7Cy7Dy3jz9vqDTvgzq2o6LDdajJDpr2tn4pWzSLS59Y/sr+0Ui+yvKbhE
MWGyylVJ2Fsgms+bHVVVpwpwj7S0GkrcvLJPp1uurbaubKGUYaVCtWrVJujepGU3dzc4OL3V7JPooxi2
rtN2Mz/gnZ+yn40/Z4+NHxw1rxRY2lpp/jjXxqGkvDdpO00Xn3T5YLyh2yocHnn2rF/YA/ZM+K/7G/x+
8b6LdR+HNS+FviW8n1WHU45v9OE2QIVKEgrlCQ4KsMrw3PPpOp/8FBfD2kTW+nroPiC+15pzp89jEsKt
bXgluUEEjGTarPHZ3M65ODEin+NQaXxu/a18S+G7fw7J4X0u1874keH1bwnaazayW9wusG4gXyLld2VU
Q3PmlRggWsxyRitKlbMq1SpCrCK9sknfb3Fo1rdWSvfbdmVHC5DhaNCpQqzf1WUpJxd3+8d5RlpZptqN
lqm0tGz6Oor5d8A/8FFLfX9XgurjSZrzRdaurOx04ae0RuLSV0top2nV5A+wX10LbKptVoJMkkYrT+H/
APwUSsfEuieHZNT8G+IrO+1TS7bU9RSz8q8h0pLkzeQWZW3MriB2LBcRggvjnHjzyTGR1cPxX9abPz06
o+npcXZVUaSq73to+jSve1rO913V3snb6PornfhP49k+KPw70nxC+kX+hrrEC3UNpevE06RON0bP5Tuo
LKQ2AxIzg4IIory6kHCThLdH0FGrGpBVIbNXXTR+T1OioooqTQKKKKAON8Rfs8eBfF3iy617VPCeg6hr
F9Aba4u7izSSW4iMZj2OSPmGwlee1OsP2fvA+l2tnDb+E9Bjj0+0ubCBRZp+7t7k5uIunKSHlwchjyc0
UVt9Yq25eZ29Wcv1HDczn7ON3u7K71v27pP1RDcfs3eAbv4fW/hSTwf4fbw5a3BuodPNmnkxzEsTIBjh
zubLdTuOTyaW6/Zv+H97qzX0vgvwy921h/ZZk/s6LP2XyvJ8np93yv3eP7ny/d4oop/Wq387+99d/vJ/
s/CO16UdLfZXTbp06dizr/wJ8F+KbTVINQ8L6Hdx63cRXl+JLNM3c0SLHHK5xkuqKqhuoUY6VqP8PtCk
TRFbR9NK+GnEmkg26401hE0IMPH7vEbsny4+ViKKKj21Rqzk/v8AK35aehosLQTclBXfku9/z19dTDuf
2c/AV3f6bdSeD/DrXGjzSXFlJ9gj3W0kk/2h2U44Jn/eZ/v/ADdeajt/2afh9aX9ndReC/Dcdxp5mNs6
WEamHzWd5Mcd2kkb2LsRjJooq/rVbbnf3sz/ALPwt7+yj/4CulrdPJfcux2Omabb6Np1vZ2kMdva2saw
wxRrtSJFACqo7AAAAUUUVhvqzsSSVkf/2Q==
</value>
</data>
<data name="picBoxLogo.Location" type="System.Drawing.Point, System.Drawing">
<value>422, 3</value>
</data>
<data name="picBoxLogo.Size" type="System.Drawing.Size, System.Drawing">
<value>103, 41</value>
</data>
<data name="tableLayoutPanel3.Size" type="System.Drawing.Size, System.Drawing">
<value>419, 91</value>
</data>
<data name="lblDateLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>41, 31</value>
</data>
<data name="lblDateLabel.Text" xml:space="preserve">
<value>Datum:</value>
</data>
<data name="lblOrder.Location" type="System.Drawing.Point, System.Drawing">
<value>270, 0</value>
</data>
<data name="lblCustomerName.Location" type="System.Drawing.Point, System.Drawing">
<value>270, 62</value>
</data>
<data name="lblCustomerLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>41, 29</value>
</data>
<data name="lblCustomerLabel.Text" xml:space="preserve">
<value>Kunde:</value>
</data>
<data name="lblOrderLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 31</value>
</data>
<data name="lblOrderLabel.Text" xml:space="preserve">
<value>Auftrag-Pos:</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>534, 729</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAA
AAAABwAAAAAAAAAAAAAAAAB3cAcAAAAAAAAAAAAHcHAAd3AHAABwAAAAAAAAdwAHAHhwAAAABwAAAAAA
B3CAAAd4dwAAcABwAAAAAAcIiAd3d3d3B3cABwAAAAAAj4iHf///B3iHcAcAAAAAAAiIiPiIiP8IhwBw
AAAAAAAAiAiIh3d48HAAcAAAAAd3CIiIiAAHd493AHd3cABwAAjwiAB3dwd/BwAAAHAHAACPCIgIAAd3
ePdwAABwBwiIjwiA8I+AcHj3d3cAcAcI+I8HgPBw8HB494h3AHAHCIiPB4Dwd4BwiPd3dwBwBwAAjweI
/wAICIj3cAAAcAAAAAjweA//8AiPdwBwAAAAAAAI8HeIAAiIiHcAcAAAAAAAAI8HeIiIiAhwAHAAAAAA
AAiP8Ad3iAiIhwAHAAAAAACPiI/wAAD4eIdwBwAAAAAHCPgIj///iAeHAHAAAAAAB3CAAAiIiAAAcAcA
AAAAAAB3AHAAiIAHAABwAAAAAAAAB3cAAI+ABwAHAAAAAAAAAAAAAACIgAcAAAAAAAAAAAAAAAAAAAAH
AAAAAAAAAAAAAAAAB3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wP///8D///+A////gP//4Y
Dn/8AAQ/+AAAH/gAAA/4AAAP/AAAH/4AAB/gAAABwAAAAYAAAAGAAAABgAAAAYAAAAGAAAAB/AAAH/wA
AB/+AAAf/AAAD/gAAA/4AAAf+AAAP/wYDH/+OA7///gP///4D///+A///////w==
</value>
</data>
</root>
@@ -0,0 +1,150 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="rtbHistory.Size" type="System.Drawing.Size, System.Drawing">
<value>428, 673</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>434, 729</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>434, 729</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAA
AAAABwAAAAAAAAAAAAAAAAB3cAcAAAAAAAAAAAAHcHAAd3AHAABwAAAAAAAAdwAHAHhwAAAABwAAAAAA
B3CAAAd4dwAAcABwAAAAAAcIiAd3d3d3B3cABwAAAAAAj4iHf///B3iHcAcAAAAAAAiIiPiIiP8IhwBw
AAAAAAAAiAiIh3d48HAAcAAAAAd3CIiIiAAHd493AHd3cABwAAjwiAB3dwd/BwAAAHAHAACPCIgIAAd3
ePdwAABwBwiIjwiA8I+AcHj3d3cAcAcI+I8HgPBw8HB494h3AHAHCIiPB4Dwd4BwiPd3dwBwBwAAjweI
/wAICIj3cAAAcAAAAAjweA//8AiPdwBwAAAAAAAI8HeIAAiIiHcAcAAAAAAAAI8HeIiIiAhwAHAAAAAA
AAiP8Ad3iAiIhwAHAAAAAACPiI/wAAD4eIdwBwAAAAAHCPgIj///iAeHAHAAAAAAB3CAAAiIiAAAcAcA
AAAAAAB3AHAAiIAHAABwAAAAAAAAB3cAAI+ABwAHAAAAAAAAAAAAAACIgAcAAAAAAAAAAAAAAAAAAAAH
AAAAAAAAAAAAAAAAB3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wP///8D///+A////gP//4Y
Dn/8AAQ/+AAAH/gAAA/4AAAP/AAAH/4AAB/gAAABwAAAAYAAAAGAAAABgAAAAYAAAAGAAAAB/AAAH/wA
AB/+AAAf/AAAD/gAAA/4AAAf+AAAP/wYDH/+OA7///gP///4D///+A///////w==
</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>FW-Update Info</value>
</data>
</root>
@@ -0,0 +1,723 @@
<?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>
<data name="rtbHistory.Text" xml:space="preserve">
<value />
</data>
<data name="&gt;&gt;lblOrder.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="lblOperatorIdLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>65, 29</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="$this.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
<data name="&gt;&gt;lblOrderLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="tableLayoutPanel1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="&gt;&gt;lblOrderLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="&gt;&gt;lblDate.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="lblDateLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;picBoxLogo.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblCustomerName.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="lblOrderLabel.Text" xml:space="preserve">
<value>Order-Pos:</value>
</data>
<data name="picBoxLogo.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="lblPcbIdLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;lblPcbId.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblDate.Location" type="System.Drawing.Point, System.Drawing">
<value>74, 31</value>
</data>
<data name="lblOrder.Location" type="System.Drawing.Point, System.Drawing">
<value>255, 0</value>
</data>
<data name="&gt;&gt;lblCustomerName.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="tableLayoutPanel2.TabIndex" type="System.Int32, mscorlib">
<value>36</value>
</data>
<data name="rtbHistory.TabIndex" type="System.Int32, mscorlib">
<value>31</value>
</data>
<data name="lblCustomerLabel.Text" xml:space="preserve">
<value>Customer:</value>
</data>
<data name="&gt;&gt;lblPcbIdLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="tableLayoutPanel3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="lblPcbId.Text" xml:space="preserve">
<value>00000000</value>
</data>
<data name="&gt;&gt;lblCustomerLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblPcbIdLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="picBoxLogo.TabIndex" type="System.Int32, mscorlib">
<value>35</value>
</data>
<data name="tableLayoutPanel2.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="picBoxLogo" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanel3" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,79,54546,Percent,20,45455" /&gt;&lt;Rows Styles="Percent,100,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>FW-Update Report</value>
</data>
<data name="picBoxLogo.Size" type="System.Drawing.Size, System.Drawing">
<value>105, 39</value>
</data>
<data name="tableLayoutPanel3.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="lblPcbIdLabel" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="lblDateLabel" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="lblOperatorIdLabel" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="lblPcbId" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="lblDate" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="lblOperatorId" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="lblOrder" Row="0" RowSpan="1" Column="4" ColumnSpan="1" /&gt;&lt;Control Name="lblCustomerName" Row="2" RowSpan="1" Column="4" ColumnSpan="1" /&gt;&lt;Control Name="lblCustomerLabel" Row="2" RowSpan="1" Column="3" ColumnSpan="1" /&gt;&lt;Control Name="lblOrderLabel" Row="0" RowSpan="1" Column="3" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,71,Absolute,89,Absolute,28,Absolute,79,Absolute,242" /&gt;&lt;Rows Styles="Absolute,31,Absolute,31,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="lblPcbId.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="&gt;&gt;tableLayoutPanel3.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblOrder.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="&gt;&gt;lblPcbIdLabel.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value>
</data>
<data name="&gt;&gt;lblCustomerName.Name" xml:space="preserve">
<value>lblCustomerName</value>
</data>
<data name="lblOperatorIdLabel.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="&gt;&gt;tableLayoutPanel3.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;lblDateLabel.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;lblOperatorIdLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="lblDateLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>33, 31</value>
</data>
<data name="&gt;&gt;lblPcbId.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="&gt;&gt;lblOperatorId.Name" xml:space="preserve">
<value>lblOperatorId</value>
</data>
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;lblOperatorId.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lblDateLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="tableLayoutPanel3.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>0, 0, 0, 0</value>
</data>
<data name="lblPcbIdLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>40, 31</value>
</data>
<data name="&gt;&gt;lblDate.Name" xml:space="preserve">
<value>lblDate</value>
</data>
<data name="lblPcbIdLabel.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="tableLayoutPanel3.ColumnCount" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="lblCustomerName.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="lblPcbIdLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
<data name="lblDateLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblCustomerLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>54, 29</value>
</data>
<data name="lblOperatorId.Size" type="System.Drawing.Size, System.Drawing">
<value>13, 29</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="picBoxLogo.Location" type="System.Drawing.Point, System.Drawing">
<value>430, 3</value>
</data>
<data name="lblOperatorIdLabel.Text" xml:space="preserve">
<value>Operator ID:</value>
</data>
<data name="tableLayoutPanel2.Size" type="System.Drawing.Size, System.Drawing">
<value>538, 91</value>
</data>
<data name="&gt;&gt;rtbHistory.Type" xml:space="preserve">
<value>System.Windows.Forms.RichTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblDateLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="tableLayoutPanel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="rtbHistory.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="picBoxLogo.ErrorImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="&gt;&gt;lblOrder.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>FrmHistory</value>
</data>
<data name="lblDate.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="tableLayoutPanel3.RowCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="&gt;&gt;tableLayoutPanel3.Name" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="&gt;&gt;rtbHistory.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="lblDate.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="lblOrderLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 31</value>
</data>
<data name="lblOrder.Size" type="System.Drawing.Size, System.Drawing">
<value>82, 31</value>
</data>
<data name="&gt;&gt;rtbHistory.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rtbHistory.Name" xml:space="preserve">
<value>rtbHistory</value>
</data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>Manual</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="lblDateLabel.Text" xml:space="preserve">
<value>Date:</value>
</data>
<data name="lblCustomerName.Size" type="System.Drawing.Size, System.Drawing">
<value>82, 29</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="rtbHistory" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="tableLayoutPanel2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Percent,100,Absolute,20" /&gt;&lt;Rows Styles="Absolute,97,Percent,100,Absolute,111" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="lblCustomerLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="lblOperatorIdLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="&gt;&gt;tableLayoutPanel3.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="lblOrderLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>191, 0</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="lblDate.Size" type="System.Drawing.Size, System.Drawing">
<value>54, 31</value>
</data>
<data name="lblPcbId.Size" type="System.Drawing.Size, System.Drawing">
<value>55, 31</value>
</data>
<data name="&gt;&gt;lblPcbId.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="lblOperatorIdLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblOperatorId.Text" xml:space="preserve">
<value>0</value>
</data>
<data name="picBoxLogo.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Top</value>
</data>
<data name="tableLayoutPanel3.Size" type="System.Drawing.Size, System.Drawing">
<value>427, 91</value>
</data>
<data name="&gt;&gt;lblDateLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lblCustomerLabel.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="lblOrder.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;lblOperatorIdLabel.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="picBoxLogo.InitialImage" type="System.Resources.ResXNullRef, System.Windows.Forms">
<value />
</data>
<data name="&gt;&gt;lblOrder.Name" xml:space="preserve">
<value>lblOrder</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Name" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="lblPcbIdLabel.Text" xml:space="preserve">
<value>PcbID:</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="tableLayoutPanel2.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="tableLayoutPanel2.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="lblOperatorId.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;picBoxLogo.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="lblOperatorId.Location" type="System.Drawing.Point, System.Drawing">
<value>74, 62</value>
</data>
<data name="lblCustomerName.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblCustomerName.Location" type="System.Drawing.Point, System.Drawing">
<value>255, 62</value>
</data>
<data name="lblCustomerName.Text" xml:space="preserve">
<value>Customer Name</value>
</data>
<data name="lblOperatorId.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblPcbId.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="lblOperatorId.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="lblOrderLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;lblOrderLabel.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="&gt;&gt;lblOperatorIdLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="lblPcbId.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;lblPcbIdLabel.Name" xml:space="preserve">
<value>lblPcbIdLabel</value>
</data>
<data name="lblOrder.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="lblOperatorIdLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 62</value>
</data>
<data name="&gt;&gt;$this.Type" xml:space="preserve">
<value>System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="lblOrder.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblOrderLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblPcbIdLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="lblOperatorId.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="&gt;&gt;lblOperatorIdLabel.Name" xml:space="preserve">
<value>lblOperatorIdLabel</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>544, 729</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>38</value>
</data>
<data name="lblDateLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 31</value>
</data>
<data name="&gt;&gt;lblCustomerLabel.Name" xml:space="preserve">
<value>lblCustomerLabel</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP//
AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3cAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAA
AAAABwAAAAAAAAAAAAAAAAB3cAcAAAAAAAAAAAAHcHAAd3AHAABwAAAAAAAAdwAHAHhwAAAABwAAAAAA
B3CAAAd4dwAAcABwAAAAAAcIiAd3d3d3B3cABwAAAAAAj4iHf///B3iHcAcAAAAAAAiIiPiIiP8IhwBw
AAAAAAAAiAiIh3d48HAAcAAAAAd3CIiIiAAHd493AHd3cABwAAjwiAB3dwd/BwAAAHAHAACPCIgIAAd3
ePdwAABwBwiIjwiA8I+AcHj3d3cAcAcI+I8HgPBw8HB494h3AHAHCIiPB4Dwd4BwiPd3dwBwBwAAjweI
/wAICIj3cAAAcAAAAAjweA//8AiPdwBwAAAAAAAI8HeIAAiIiHcAcAAAAAAAAI8HeIiIiAhwAHAAAAAA
AAiP8Ad3iAiIhwAHAAAAAACPiI/wAAD4eIdwBwAAAAAHCPgIj///iAeHAHAAAAAAB3CAAAiIiAAAcAcA
AAAAAAB3AHAAiIAHAABwAAAAAAAAB3cAAI+ABwAHAAAAAAAAAAAAAACIgAcAAAAAAAAAAAAAAAAAAAAH
AAAAAAAAAAAAAAAAB3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////wP///8D///+A////gP//4Y
Dn/8AAQ/+AAAH/gAAA/4AAAP/AAAH/4AAB/gAAABwAAAAYAAAAGAAAABgAAAAYAAAAGAAAAB/AAAH/wA
AB/+AAAf/AAAD/gAAA/4AAAf+AAAP/wYDH/+OA7///gP///4D///+A///////w==
</value>
</data>
<data name="&gt;&gt;lblCustomerName.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;picBoxLogo.Name" xml:space="preserve">
<value>picBoxLogo</value>
</data>
<data name="lblDateLabel.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;lblOrderLabel.Name" xml:space="preserve">
<value>lblOrderLabel</value>
</data>
<data name="&gt;&gt;lblDate.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lblCustomerLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="picBoxLogo.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
/9j/4AAQSkZJRgABAQEAYABgAAD/4QC8RXhpZgAATU0AKgAAAAgABAESAAMAAAABAAEAAAE7AAIAAAAH
AAAAPodpAAQAAAABAAAARpydAAEAAAAOAAAApgAAAABUaG9tYXMAAAAEkAMAAgAAABQAAAB8kAQAAgAA
ABQAAACQkpEAAgAAAAM1MwAAkpIAAgAAAAM1MwAAAAAAADIwMjE6MDQ6MDEgMTQ6NTk6MjkAMjAyMTow
NDowMSAxNDo1OToyOQAAAFQAaABvAG0AYQBzAAAA/9sAQwACAQECAQECAgICAgICAgMFAwMDAwMGBAQD
BQcGBwcHBgcHCAkLCQgICggHBwoNCgoLDAwMDAcJDg8NDA4LDAwM/9sAQwECAgIDAwMGAwMGDAgHCAwM
DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAIwBkAwEi
AAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAAB
fQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNE
RUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1
tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEA
AAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz
dHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ
2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/fi5vYbML50scW7gb2C5p28Yrzr9qv8AZm0H
9rX4Map4O8QK0cV0vm2d5GP32nXKg+XOnuMkEfxKWXoa/M7wp8XfjF8ZtT0j9j288SafptxpGsz6Xqvi
SC/3TXWm24LfZlOQX2qrYUHewCIwUK+foMpyOOPpSnCqouDvNNbQt8S11ts1o9j4viTi6eT4mFGrQc1V
Vqbi/iqXSVNpr3b3upXatfS61/XDTdYtNYjZ7O6t7pEbazQyCQKfQkGpZ7iO2TdI6xr6scCvzR8e/BeD
/gkF+2N8M/EnhPVNbPwx8cOND1+G+ufOVJMhWkcgKvAdZV4yDHIB8pxXoP8AwWD12++NPxH+EPwF0W4e
O78aaumo6kY/vQ26Exo5/wBkAzuf+uINbx4djUxFKNGrelUTlztWso35rq+6t36o4ZccVKOCxM8Vh+XE
UJRg6alfmc7ez5Zcq0lf+W6s9NDU8P8AjTVpv+C4mtaP/a+pPoi+EFnSx+1ubQN5EB3iPOzPJOcdz619
rX+pW+lW7TXU8NtCvWSVwij8TxXwZ8PPD9p4V/4Ll32lWEIt7HTfAkNpbRDpFEltbKq/gABXzx8Uv2g/
AP7UH7afju5+PHiTxZb+B/B9/Jpnh7w9pEE8kMvlyvGXkMYO0nZuY8MxkADBUxXq18jePqUuRtRhRpt2
jeTvokordv1surPncLxcsnoYj2iUqlXFVoxUp8sFazblNp2iulk220kj9fLS9h1C3Wa3ljmhkGVeNgys
PYjg1FqWs2ejRq15dW9qrnarTSCMMfQZNfll+w9+0B4Z+B/7f+ieEfhL4h8Va18JfH0fkXGm6xbyxnSr
0rIVMe8DOGRPnAGVkKtkoGrpPA37Pen/APBTL/goB8cIviVrGvT6P8PLs6To+n2V15MdsnnSwqRkEDAh
LEAfM8hJz0PFW4WVCrJ4io40owU78vvWb5UuW+jvvrbqevhfESWLoU44Ogp151JUuX2i5LxjzuSqKLvH
l1Xu3vpbQ/Si/wBbs9Kije6u7a2SU4RpZVQOfbJ5q0GzX5I/sI/sD6L+138T/ip4Z8feKPFuraX8Kbk+
HtDRL8r5Cme5XzAG3BQPJyEUBcuc54r6W/4Id/ErXPFPwA8WeG9Z1G51aLwT4gk07T57hy8iQFFYR5JJ
2qwYgZ4DY6AVlmnDlLC0qk6VbnlT5eZctlaesWnd36XVjp4d44xGY4ihTxGF9lCuqnI+dSd6TtNSXKrK
97O7vbbU+2KKKK+VP0QKKKKAPF/23o/jJqHwyt9O+C8eix65qk7Wt9e6hMIm063ZGHnQknHmBsc7Wx1A
zXzH4p/4IxN4U/ZZ0RvCGqhfjj4bvf7dXX0nMX9oXZIZoPMblUXapjZv4lJOPMav0ExmivawOfYrCU40
8PaKTu9NZeUu6s2rbanyubcH5fmdedfHc03KPKk3pDZuUF9mTaT5tXp20PmD45fs1+Mv24f2Dm8J/EDT
NN8N/EiFUuInjuUntBfQZCzK0edscyllK4ynmNwcDPzp/wAEkPD3ij9o39q7xP8AFDx1dW+qXnw70mDw
jYXUDb4ZZlUxGRHyQxESOWYcMbndxnFfY/7Z/wAGPiL8c/h5a6H8PPHUXgKa4mePVLprbznubV4ypjQg
blbJzlSp9xWj+x1+ynof7G3wQsPBmiTS33kyNdX19KgSS/uXxvlKjIUYVVC5OFVRknJPpUc4jSyurSUo
81Rvlik/cTfv6vZSSSSTfc+fxPC88TxDhsQ4S9nQinOcpL97KK/d6LeUHKTcmlrojwP9oj9k74weG/8A
goHpvxo+Fo8N6pb6lYQaVqtnqcvltbRDakpUEqGBjVWUhtwYEEEdcz4i/safGL9mb9p7xN8SPgK/hnXN
L8dyfaNb8M623lIJyxdnRiVBXczspDqy+Yy4YV9C+If2k1+HVz8UtQ16EyaL4EurG3tks4d1zcG4trdw
hy20s00wUH5QARnoTXJ3X7Y3iPxnfX2neG/A2qWdxZ6LNq0s+oqskkZt7wQ3EUdujb7gmMMYmQ7ZHZFy
o3EVh8wzFxguSDioqDutJRspJS11cbppqzRONyfI1UqN1akakqkqi5W+aE7yhJw912U2mmpXi7bKxnfs
peGP2kNa+L114o+LGoeDdB8Mmza2g8K6TbrORJnKzCUMSjDufMfcONq8EZn7DP7K3jP4G/tXfHjxX4is
bS20Xx5q/wBs0eWK7SZ5o/tFw+WVTlDtkQ4PrXceJP2i/EnxE/Z+0vxV4B0me3urrUzaajbyW8OqX+lw
R+YJitrHcIJZ1ZEBh8wSKGY7Cy7Dy3jz9vqDTvgzq2o6LDdajJDpr2tn4pWzSLS59Y/sr+0Ui+yvKbhE
MWGyylVJ2Fsgms+bHVVVpwpwj7S0GkrcvLJPp1uurbaubKGUYaVCtWrVJujepGU3dzc4OL3V7JPooxi2
rtN2Mz/gnZ+yn40/Z4+NHxw1rxRY2lpp/jjXxqGkvDdpO00Xn3T5YLyh2yocHnn2rF/YA/ZM+K/7G/x+
8b6LdR+HNS+FviW8n1WHU45v9OE2QIVKEgrlCQ4KsMrw3PPpOp/8FBfD2kTW+nroPiC+15pzp89jEsKt
bXgluUEEjGTarPHZ3M65ODEin+NQaXxu/a18S+G7fw7J4X0u1874keH1bwnaazayW9wusG4gXyLld2VU
Q3PmlRggWsxyRitKlbMq1SpCrCK9sknfb3Fo1rdWSvfbdmVHC5DhaNCpQqzf1WUpJxd3+8d5RlpZptqN
lqm0tGz6Oor5d8A/8FFLfX9XgurjSZrzRdaurOx04ae0RuLSV0top2nV5A+wX10LbKptVoJMkkYrT+H/
APwUSsfEuieHZNT8G+IrO+1TS7bU9RSz8q8h0pLkzeQWZW3MriB2LBcRggvjnHjzyTGR1cPxX9abPz06
o+npcXZVUaSq73to+jSve1rO913V3snb6PornfhP49k+KPw70nxC+kX+hrrEC3UNpevE06RON0bP5Tuo
LKQ2AxIzg4IIory6kHCThLdH0FGrGpBVIbNXXTR+T1OioooqTQKKKKAON8Rfs8eBfF3iy617VPCeg6hr
F9Aba4u7izSSW4iMZj2OSPmGwlee1OsP2fvA+l2tnDb+E9Bjj0+0ubCBRZp+7t7k5uIunKSHlwchjyc0
UVt9Yq25eZ29Wcv1HDczn7ON3u7K71v27pP1RDcfs3eAbv4fW/hSTwf4fbw5a3BuodPNmnkxzEsTIBjh
zubLdTuOTyaW6/Zv+H97qzX0vgvwy921h/ZZk/s6LP2XyvJ8np93yv3eP7ny/d4oop/Wq387+99d/vJ/
s/CO16UdLfZXTbp06dizr/wJ8F+KbTVINQ8L6Hdx63cRXl+JLNM3c0SLHHK5xkuqKqhuoUY6VqP8PtCk
TRFbR9NK+GnEmkg26401hE0IMPH7vEbsny4+ViKKKj21Rqzk/v8AK35aehosLQTclBXfku9/z19dTDuf
2c/AV3f6bdSeD/DrXGjzSXFlJ9gj3W0kk/2h2U44Jn/eZ/v/ADdeajt/2afh9aX9ndReC/Dcdxp5mNs6
WEamHzWd5Mcd2kkb2LsRjJooq/rVbbnf3sz/ALPwt7+yj/4CulrdPJfcux2Omabb6Np1vZ2kMdva2saw
wxRrtSJFACqo7AAAAUUUVhvqzsSSVkf/2Q==
</value>
</data>
<data name="lblOrder.Text" xml:space="preserve">
<value>1234567890-10</value>
</data>
<data name="&gt;&gt;lblDateLabel.Name" xml:space="preserve">
<value>lblDateLabel</value>
</data>
<data name="&gt;&gt;lblDate.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="tableLayoutPanel3.TabIndex" type="System.Int32, mscorlib">
<value>36</value>
</data>
<data name="lblDate.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="lblPcbId.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;lblOperatorId.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>544, 729</value>
</data>
<data name="lblPcbId.Location" type="System.Drawing.Point, System.Drawing">
<value>74, 0</value>
</data>
<data name="lblDate.Text" xml:space="preserve">
<value>Date Text</value>
</data>
<data name="&gt;&gt;lblPcbId.Name" xml:space="preserve">
<value>lblPcbId</value>
</data>
<data name="lblOrderLabel.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="tableLayoutPanel1.RowCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="lblCustomerName.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="&gt;&gt;lblCustomerName.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="lblCustomerLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="tableLayoutPanel2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="&gt;&gt;picBoxLogo.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="lblDate.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lblCustomerLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>191, 62</value>
</data>
<data name="lblOrderLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Left</value>
</data>
<data name="rtbHistory.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 100</value>
</data>
<data name="&gt;&gt;lblOrder.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="lblOperatorIdLabel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleCenter</value>
</data>
<data name="lblCustomerLabel.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="rtbHistory.Size" type="System.Drawing.Size, System.Drawing">
<value>538, 626</value>
</data>
<data name="lblCustomerLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="&gt;&gt;lblPcbIdLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="&gt;&gt;lblOperatorId.Parent" xml:space="preserve">
<value>tableLayoutPanel3</value>
</data>
<data name="tableLayoutPanel3.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 0</value>
</data>
<data name="$this.MinimumSize" type="System.Drawing.Size, System.Drawing">
<value>400, 768</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>
@@ -58,10 +58,10 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>D8B4896173CF7130DF43C53CECCE6E4A7595CA5C</ManifestCertificateThumbprint>
<ManifestCertificateThumbprint>3D39BF7375F751B96081DE64F2A442ABD8A73321</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>FwUpdateBuilder_TemporaryKey.pfx</ManifestKeyFile>
<ManifestKeyFile>FwUpdateBuilder_1_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>true</GenerateManifests>
@@ -101,6 +101,12 @@
<Compile Include="FrmFwUpdateBuilder.Designer.cs">
<DependentUpon>FrmFwUpdateBuilder.cs</DependentUpon>
</Compile>
<Compile Include="FrmHistory.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmHistory.Designer.cs">
<DependentUpon>FrmHistory.cs</DependentUpon>
</Compile>
<Compile Include="FrmRegister.cs">
<SubType>Form</SubType>
</Compile>
@@ -118,6 +124,16 @@
<DependentUpon>FrmFwUpdateBuilder.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="FrmHistory.de-DE.resx">
<DependentUpon>FrmHistory.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmHistory.de.resx">
<DependentUpon>FrmHistory.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmHistory.resx">
<DependentUpon>FrmHistory.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="FrmRegister.de.resx">
<DependentUpon>FrmRegister.cs</DependentUpon>
</EmbeddedResource>
@@ -145,6 +161,7 @@
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="FwUpdateBuilder_1_TemporaryKey.pfx" />
<None Include="FwUpdateBuilder_TemporaryKey.pfx" />
<None Include="MeterFwUpdateRuler.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
@@ -341,6 +341,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Acquiring FW Update Safes.....
/// </summary>
internal static string StrReadingFwUpdateSafes {
get {
return ResourceManager.GetString("StrReadingFwUpdateSafes", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Acquiring Production Orders.....
/// </summary>
@@ -350,6 +359,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Acquiring Report Files.....
/// </summary>
internal static string StrReadingReports {
get {
return ResourceManager.GetString("StrReadingReports", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Acquiring update operators.....
/// </summary>
@@ -611,6 +629,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to FW-Update Order Number.
/// </summary>
internal static string StrTableCordonelUpdateOrder {
get {
return ResourceManager.GetString("StrTableCordonelUpdateOrder", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Customer Location.
/// </summary>
@@ -638,6 +665,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Date.
/// </summary>
internal static string StrTableDate {
get {
return ResourceManager.GetString("StrTableDate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Core Max.
/// </summary>
@@ -710,6 +746,15 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Update Operator ID.
/// </summary>
internal static string StrTableUpdateOperatorId {
get {
return ResourceManager.GetString("StrTableUpdateOperatorId", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Active.
/// </summary>
@@ -729,7 +774,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateBuilder.Properties {
}
/// <summary>
/// Looks up a localized string similar to Full Name.
/// Looks up a localized string similar to Update Operator.
/// </summary>
internal static string StrTableUserFullName {
get {
@@ -153,6 +153,12 @@
<data name="StrReadingFwPackages" xml:space="preserve">
<value>Ermittelle FW-Pakete....</value>
</data>
<data name="StrReadingFwUpdateSafes" xml:space="preserve">
<value>Ermittelle FW Update Safes....</value>
</data>
<data name="StrReadingReports" xml:space="preserve">
<value>Ermittelle Berichte....</value>
</data>
<data name="StrReadingCustomers" xml:space="preserve">
<value>Ermittelle Kunden....</value>
</data>
@@ -240,6 +246,9 @@
<data name="StrTableSelect" xml:space="preserve">
<value>Auswahl</value>
</data>
<data name="StrTableUpdateOperatorId" xml:space="preserve">
<value>Update Operator ID</value>
</data>
<data name="StrTableApprove" xml:space="preserve">
<value>Genehmigt</value>
</data>
@@ -273,6 +282,9 @@
<data name="StrTableCordonelProductionOrder" xml:space="preserve">
<value>Produktionsnummer</value>
</data>
<data name="StrTableCordonelUpdateOrder" xml:space="preserve">
<value>FW-Update Auftragsnummer</value>
</data>
<data name="StrTableCordonelProductionPos" xml:space="preserve">
<value>Position</value>
</data>
@@ -315,6 +327,9 @@
<data name="StrTableReleaseDate" xml:space="preserve">
<value>Releasedatum</value>
</data>
<data name="StrTableDate" xml:space="preserve">
<value>Datum</value>
</data>
<data name="StrTableRegion" xml:space="preserve">
<value>Region</value>
</data>
@@ -322,7 +337,7 @@
<value>Funkfrequenz [MHz]</value>
</data>
<data name="StrTableUserFullName" xml:space="preserve">
<value>Benutzername</value>
<value>Update Operator</value>
</data>
<data name="StrTableUserDomain" xml:space="preserve">
<value>Domain</value>
@@ -159,6 +159,12 @@
<data name="StrReadingFwPackages" xml:space="preserve">
<value>Acquiring FW packages....</value>
</data>
<data name="StrReadingFwUpdateSafes" xml:space="preserve">
<value>Acquiring FW Update Safes....</value>
</data>
<data name="StrReadingReports" xml:space="preserve">
<value>Acquiring Report Files....</value>
</data>
<data name="StrReadingCordonels" xml:space="preserve">
<value>Acquiring Cordonels....</value>
</data>
@@ -243,6 +249,9 @@
<data name="StrTableSelect" xml:space="preserve">
<value>Select</value>
</data>
<data name="StrTableUpdateOperatorId" xml:space="preserve">
<value>Update Operator ID</value>
</data>
<data name="StrTableApprove" xml:space="preserve">
<value>Approved</value>
</data>
@@ -276,6 +285,9 @@
<data name="StrTableCordonelProductionOrder" xml:space="preserve">
<value>Order Number</value>
</data>
<data name="StrTableCordonelUpdateOrder" xml:space="preserve">
<value>FW-Update Order Number</value>
</data>
<data name="StrTableCordonelProductionPos" xml:space="preserve">
<value>Position</value>
</data>
@@ -318,6 +330,9 @@
<data name="StrTableReleaseDate" xml:space="preserve">
<value>Release Date</value>
</data>
<data name="StrTableDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="StrTableRegion" xml:space="preserve">
<value>Region</value>
</data>
@@ -325,7 +340,7 @@
<value>Radio Frequency [MHz]</value>
</data>
<data name="StrTableUserFullName" xml:space="preserve">
<value>Full Name</value>
<value>Update Operator</value>
</data>
<data name="StrTableUserDomain" xml:space="preserve">
<value>Domain</value>
@@ -104,6 +104,16 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
/// </summary>
private const String FwUpdateProjectName = "ServiceFwUpdateSw";
///// <summary>
///// Search strings for "Firmware up to date!" messages in report file, copied from Resources.resx of all
///// language packages from "ServiceFwUpdateSw"
///// </summary>
//private readonly String[] _firmwareUpToDateSearchStrings =
//{
// "Firmware is up to date!",
// "Firmware ist aktuell!"
//};
/// <summary>
/// Name of the file which contains the meter file names that can be erased before the FW-Update
/// to free disk space and have to be restored after the FW-Update
@@ -499,7 +509,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
public FrmFwUpdateLoader()
{
var fwUpdateLoaderExePath = AppDomain.CurrentDomain.BaseDirectory;
var fwUpdateLoaderConfigPath = Path.Combine(fwUpdateLoaderExePath, "Config");
var fwUpdateLoaderConfigPath = Path.Combine(fwUpdateLoaderExePath, FwUpdateConfig.ConfigSubFolderName);
// Set the FW-Update SW destination folder to the FW-Update Loader exe path
_fwUpdateSwDestinationPath = Path.Combine(fwUpdateLoaderExePath, FwUpdateProjectName);
@@ -691,13 +701,44 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
#region ------------------------------------------ Checks -----------------------------------------------------
/// <summary>
/// Search "Firmware is up to date!" string in file to guarantee the successfully execution of the update
/// process. Get success string for all language settings!
/// </summary>
/// <remarks date="2021-Oct-15" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean IsSuccessStringInFile(String fileNamePath)
{
try
{
// Get search strings from resources StrFwUpToDateMessage from ServiceFwUpdateSw
var fileLines = File.ReadAllLines(fileNamePath);
var fwIsUpToDate = false;
foreach (var searchString in FwUpdateConfig.FirmwareUpToDateSearchStrings)
{
if (fileLines.Any(line => line.Contains(searchString))) fwIsUpToDate = true;
}
return fwIsUpToDate;
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// Search for report files
/// </summary>
/// <remarks date="2021-Apr-28" author="Thomas Wiedebusch">
/// - Initial
/// </remarks>
private Boolean IsPcbIdProcessed(String pcbId)
/// <remarks date="2021-Oct-15" author="Thomas Wiedebusch">
/// - Check file content for "success" string to mark exclusively the validated updates.
/// - Check order number to enable more than one update for a specific pcbId.
/// </remarks>
private Boolean IsPcbIdProcessed(String pcbId, String orderNo)
{
try
{
@@ -707,7 +748,8 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
var fileList = new List<String>();
SystemControl.GetFilesOfDirectoryAndSubDirectory(FwUpdateConfig.UnreportedPath, fileList,
$"*{FwUpdateConfig.ReportFileExtension}");
if (fileList.Any(file => file.Contains(pcbId))) return true;
if (fileList.Any(file => file.Contains(pcbId) && file.Contains(orderNo)
&& IsSuccessStringInFile(file))) return true;
}
// If this directory is existent and contains files, these files have to be checked
if (SystemControl.FilesExistingInPath(FwUpdateConfig.ReportedPath))
@@ -715,7 +757,8 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
var fileList = new List<String>();
SystemControl.GetFilesOfDirectoryAndSubDirectory(FwUpdateConfig.ReportedPath, fileList,
$"*{FwUpdateConfig.ReportFileExtension}");
if (fileList.Any(file => file.Contains(pcbId))) return true;
if (fileList.Any(file => file.Contains(pcbId) && file.Contains(orderNo)
&& IsSuccessStringInFile(file))) return true;
}
}
catch (Exception)
@@ -1721,9 +1764,13 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
/// <remarks date="2021-Apr-28" author="Thomas Wiedebusch">
/// - Initial.
/// </remarks>
/// <remarks date="2021-Oct-15" author="Thomas Wiedebusch">
/// - Added order number to search for successfully updated device in linked to this safe.
/// </remarks>
private void FillDataGridWithPcbIdInfos()
{
if (_fwUpdateSafe?.Updates?.CordonelDeviceInfos == null) return;
grpLanguageSelection.Enabled = false;
_dataTablePcbIds?.Dispose();
@@ -1739,7 +1786,7 @@ namespace Xylem.ServiceFwUpdate.Ui.FwUpdateLoader
foreach (var cordSearch in _fwUpdateSafe.Updates.CordonelDeviceInfos)
{
var row = _dataTablePcbIds.NewRow();
row[Resources.StrTableUpdated] = IsPcbIdProcessed(cordSearch.PcbId);
row[Resources.StrTableUpdated] = IsPcbIdProcessed(cordSearch.PcbId, _customerAndOrderInfo);
row[Resources.StrTableCordonelPcbId] = cordSearch.PcbId ?? "?";
_dataTablePcbIds.Rows.Add(row);
@@ -58,10 +58,10 @@
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ManifestCertificateThumbprint>550FE4A801FCFB0A36EB3B198C4A6E6A92020511</ManifestCertificateThumbprint>
<ManifestCertificateThumbprint>5ED6B0B9BFFE7DD309362274CB9BF34BAE31CEEE</ManifestCertificateThumbprint>
</PropertyGroup>
<PropertyGroup>
<ManifestKeyFile>FwUpdateLoader_TemporaryKey.pfx</ManifestKeyFile>
<ManifestKeyFile>FwUpdateLoader_1_TemporaryKey.pfx</ManifestKeyFile>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>true</GenerateManifests>
@@ -146,6 +146,7 @@
<DependentUpon>Resources.de.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<None Include="FwUpdateLoader_1_TemporaryKey.pfx" />
<None Include="FwUpdateLoader_TemporaryKey.pfx" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">