Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
334d43fbda | ||
|
|
2405a49dcc |
+7
-21
@@ -1,21 +1,7 @@
|
||||
Config/bin/
|
||||
Config/obj/
|
||||
DeviceTest/bin/
|
||||
DeviceTest/obj/
|
||||
Dirichlet.Numerics/bin
|
||||
Dirichlet.Numerics/obj
|
||||
Results/bin/
|
||||
Results/obj/
|
||||
ResultsBrowser/bin/
|
||||
ResultsBrowser/obj/
|
||||
TestBenchFramework/bin/
|
||||
TestBenchFramework/obj/
|
||||
TBFSetup/Debug/
|
||||
TBFSetup/Release/
|
||||
Users/bin/
|
||||
Users/obj/
|
||||
UserManagement/bin/
|
||||
UserManagement/obj/
|
||||
Doc/
|
||||
*.suo
|
||||
*.bak
|
||||
bin/
|
||||
obj/
|
||||
.vs/
|
||||
*.suo
|
||||
*.bak
|
||||
*.pdb
|
||||
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Config</RootNamespace>
|
||||
<AssemblyName>Config</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;MUNICH</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;MUNICH</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="FluentNHibernate">
|
||||
<HintPath>..\packages\FluentNHibernate.2.0.3.0\lib\net40\FluentNHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections">
|
||||
<HintPath>..\packages\Iesi.Collections.4.0.0.4000\lib\net40\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net">
|
||||
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="MySql.Data">
|
||||
<HintPath>..\packages\MySql.Data.6.6.5\lib\net40\MySql.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate">
|
||||
<HintPath>..\packages\NHibernate.4.0.4.4000\lib\net40\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Data.SQLite">
|
||||
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SQLite.Linq">
|
||||
<HintPath>..\packages\System.Data.SQLite.1.0.90.0\lib\net40\System.Data.SQLite.Linq.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Data.cs" />
|
||||
<Compile Include="DatabaseSettings.cs" />
|
||||
<Compile Include="Entities\BenchPath.cs" />
|
||||
<Compile Include="Entities\Component.cs" />
|
||||
<Compile Include="Entities\ComponentProcedure.cs" />
|
||||
<Compile Include="Entities\ComponentTest.cs" />
|
||||
<Compile Include="Entities\Enums.cs" />
|
||||
<Compile Include="Entities\FeedingPath.cs" />
|
||||
<Compile Include="Entities\Group.cs" />
|
||||
<Compile Include="Entities\HeatMetersPath.cs" />
|
||||
<Compile Include="Entities\IHasItemNr.cs" />
|
||||
<Compile Include="Entities\IHasValves.cs" />
|
||||
<Compile Include="Entities\MeasurementCorrection.cs" />
|
||||
<Compile Include="Entities\MetersPath.cs" />
|
||||
<Compile Include="Entities\MeterTestResult.cs" />
|
||||
<Compile Include="Entities\OutputPath.cs" />
|
||||
<Compile Include="Entities\Procedure.cs" />
|
||||
<Compile Include="Entities\ProcedureHistory.cs" />
|
||||
<Compile Include="Entities\Test.cs" />
|
||||
<Compile Include="Entities\TestResult.cs" />
|
||||
<Compile Include="Entities\TransitionSequence.cs" />
|
||||
<Compile Include="Entities\TransitionStep.cs" />
|
||||
<Compile Include="Entities\User.cs" />
|
||||
<Compile Include="Entities\VirtualBenchSequence.cs" />
|
||||
<Compile Include="Entities\VirtualBenchStep.cs" />
|
||||
<Compile Include="Entities\Watermeter.cs" />
|
||||
<Compile Include="Entities\WMType.cs" />
|
||||
<Compile Include="FluentCommon.cs" />
|
||||
<Compile Include="Mappings\BenchPathMap.cs" />
|
||||
<Compile Include="Mappings\ComponentMap.cs" />
|
||||
<Compile Include="Mappings\ComponentProcedureMap.cs" />
|
||||
<Compile Include="Mappings\ComponentTestMap.cs" />
|
||||
<Compile Include="Mappings\FeedingPathMap.cs" />
|
||||
<Compile Include="Mappings\GroupMap.cs" />
|
||||
<Compile Include="Mappings\HeatMetersPathMap.cs" />
|
||||
<Compile Include="Mappings\MeasurementCorrectionMap.cs" />
|
||||
<Compile Include="Mappings\MetersPathMap.cs" />
|
||||
<Compile Include="Mappings\MeterTestResultMap.cs" />
|
||||
<Compile Include="Mappings\OutputPathMap.cs" />
|
||||
<Compile Include="Mappings\ProcedureMap.cs" />
|
||||
<Compile Include="Mappings\TestMap.cs" />
|
||||
<Compile Include="Mappings\TestResultMap.cs" />
|
||||
<Compile Include="Mappings\TransitionSequenceMap.cs" />
|
||||
<Compile Include="Mappings\TransitionStepMap.cs" />
|
||||
<Compile Include="Mappings\UserMap.cs" />
|
||||
<Compile Include="Mappings\VirtualBenchSequenceMap.cs" />
|
||||
<Compile Include="Mappings\VirtualBenchStepMap.cs" />
|
||||
<Compile Include="Mappings\WatermeterMap.cs" />
|
||||
<Compile Include="Mappings\WMTypeMap.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Resources\Strings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Strings.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Units.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources\Strings.cs.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.de.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.pl.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.resx">
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Resources\Strings.ru.resx" />
|
||||
<EmbeddedResource Include="Resources\Strings.zh-CN.resx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Users\Users.csproj">
|
||||
<Project>{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}</Project>
|
||||
<Name>Users</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -1,78 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public class Data : Users.GlobalData
|
||||
{
|
||||
public const string AdminUsername = "admin";
|
||||
public const string AdminPassword = "staratura";
|
||||
public const string SQLiteDbFName = "SQLite.db";
|
||||
|
||||
#if MUNICH
|
||||
public const int WMsCount = 3;
|
||||
public const int LineSize = 1;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 3;
|
||||
#elif DN100 || BADGER_VELKA_TRAT
|
||||
public const int WMsCount = 3;
|
||||
public const int LineSize = 3;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif FUZHOU300 || FUZHOU150 || PT200IL || PUCHONG_PT200 || GENESIS || BERLIN
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 3;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 3;
|
||||
#elif TORINO50 || BADGER_MALA_TRAT
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 1;
|
||||
#elif TORUN_PT50_2015 || CEVAK_PT40_272 || MURES_PT40 || FUZHOU_40
|
||||
public const int WMsCount = 20;
|
||||
public const int LineSize = 10;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif TURA_IPERL
|
||||
public const int WMsCount = 40;
|
||||
public const int LineSize = 20;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif TURA_SPECIAL
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif SLM_50
|
||||
public const int WMsCount = 12;
|
||||
public const int LineSize = 12;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 6;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#elif SLM_END || WARSAW_END
|
||||
public const int WMsCount = 10;
|
||||
public const int LineSize = 5;
|
||||
public const int CompoundWMsCount = 1;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = 4;
|
||||
#elif MALTA_WSD25
|
||||
public const int WMsCount = 6;
|
||||
public const int LineSize = 6;
|
||||
public const int CompoundWMsCount = 0;
|
||||
public const int HeatMetersCount = 0;
|
||||
public const int MaxPartNr = WMsCount / LineSize;
|
||||
#endif
|
||||
|
||||
///
|
||||
/// Database related: This object reference is set after a successful user login
|
||||
///
|
||||
public static DatabaseSettings CurrentBench;
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
/// <summary>
|
||||
/// Test bench database settings, contains bench name and settings od several databases
|
||||
/// </summary>
|
||||
public class DatabaseSettings : ICloneable
|
||||
{
|
||||
// Public fields
|
||||
public string BenchName;
|
||||
public bool IsRealBench;
|
||||
public Users.DBSettings ProceduresDBSettings; /// Config database settings
|
||||
public Users.DBSettings WaterMetersDBSettings; /// Results database settings
|
||||
public Users.DBSettings UsersDBSettings; /// Users database settings
|
||||
|
||||
// Constructor
|
||||
public DatabaseSettings()
|
||||
{
|
||||
BenchName = String.Empty; /// Empty string (avoid null)
|
||||
IsRealBench = false;
|
||||
ProceduresDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
WaterMetersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
UsersDBSettings = new Users.DBSettings(Users.Entities.DBType.MySql, string.Empty);
|
||||
}
|
||||
|
||||
public object Clone()
|
||||
{
|
||||
DatabaseSettings result = new DatabaseSettings();
|
||||
|
||||
result.BenchName = BenchName;
|
||||
result.IsRealBench = IsRealBench;
|
||||
result.ProceduresDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
|
||||
result.WaterMetersDBSettings = (Users.DBSettings)WaterMetersDBSettings.Clone();
|
||||
result.UsersDBSettings = (Users.DBSettings)ProceduresDBSettings.Clone();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("{0} config={1} results={2} users={3}",
|
||||
BenchName,
|
||||
ProceduresDBSettings.ConnectionString,
|
||||
WaterMetersDBSettings.ConnectionString,
|
||||
UsersDBSettings.ConnectionString);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2016 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class BenchPath : IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string TempMtrUp { get; set; }
|
||||
public virtual string TempMtrDown { get; set; }
|
||||
public virtual string PressMtrUp { get; set; }
|
||||
public virtual string PressMtrDown { get; set; }
|
||||
public virtual string PressMtrDelta { get; set; }
|
||||
public virtual string StopBFValve { get; set; }
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public BenchPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public BenchPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual BenchPath Clone(string name, int itemNr)
|
||||
{
|
||||
BenchPath result = new BenchPath(name, itemNr);
|
||||
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.TempMtrUp = TempMtrUp;
|
||||
result.TempMtrDown = TempMtrDown;
|
||||
result.PressMtrUp = PressMtrUp;
|
||||
result.PressMtrDown = PressMtrDown;
|
||||
result.PressMtrDelta = PressMtrDelta;
|
||||
result.StopBFValve = StopBFValve;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Component : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string ClassName { get; set; }
|
||||
public virtual string ParentName { get; set; }
|
||||
public virtual DebugMode Mode { get; set; }
|
||||
public virtual LogLevel Logging { get; set; }
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual IList<MeasurementCorrection> Corrections { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Component()
|
||||
{
|
||||
Corrections = new List<MeasurementCorrection>();
|
||||
}
|
||||
|
||||
public static Component CreateFromCfg(string name, string className, string parentName, int itemNr,
|
||||
DebugMode debugLevel, LogLevel logLevel, string parameters)
|
||||
{
|
||||
Component result = new Component();
|
||||
result.ItemNr = itemNr;
|
||||
result.Name = name;
|
||||
result.ClassName = className;
|
||||
result.ParentName = parentName;
|
||||
result.Mode = debugLevel;
|
||||
result.Logging = logLevel;
|
||||
result.Parameters = parameters;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Makes a new copy of this object (not just a reference)
|
||||
public virtual Component Clone()
|
||||
{
|
||||
Component result = new Component();
|
||||
result.ItemNr = ItemNr;
|
||||
result.Name = Name;
|
||||
result.ClassName = ClassName;
|
||||
result.ParentName = ParentName;
|
||||
result.Mode = Mode;
|
||||
result.Logging = Logging;
|
||||
result.Parameters = Parameters;
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual string ToString(string indent)
|
||||
{
|
||||
string result = string.Empty;
|
||||
|
||||
result += indent + "ItemNr = " + (ItemNr + 1).ToString() + Environment.NewLine;
|
||||
result += indent + "Name = " + Name + Environment.NewLine;
|
||||
result += indent + "ClassName = " + ClassName + Environment.NewLine;
|
||||
if (ParentName != null)
|
||||
{
|
||||
result += indent + "ParentName = " + ParentName + Environment.NewLine;
|
||||
}
|
||||
result += indent + "DebugLevel = " + Mode.ToString() + Environment.NewLine;
|
||||
result += indent + "LogLevel = " + Logging.ToString() + Environment.NewLine;
|
||||
result += indent + "Parameters = " + Parameters + Environment.NewLine;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ComponentProcedure
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string CmpntName { get; set; } /// Component name
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual Procedure Procedure { get; set; }
|
||||
|
||||
public virtual ComponentProcedure Clone()
|
||||
{
|
||||
ComponentProcedure result = new ComponentProcedure();
|
||||
result.CmpntName = CmpntName;
|
||||
result.Parameters = Parameters;
|
||||
result.Procedure = Procedure;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ComponentTest
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string CmpntName { get; set; } /// Component name
|
||||
public virtual string Parameters { get; set; }
|
||||
public virtual Test Test { get; set; }
|
||||
|
||||
public virtual ComponentTest Clone()
|
||||
{
|
||||
ComponentTest result = new ComponentTest();
|
||||
result.CmpntName = CmpntName;
|
||||
result.Parameters = Parameters;
|
||||
result.Test = Test;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,357 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class to assign descriptions to enum values
|
||||
/// </summary>
|
||||
public class Description : Attribute
|
||||
{
|
||||
public string Text;
|
||||
public Description(string t)
|
||||
{
|
||||
Text = t;
|
||||
}
|
||||
}
|
||||
|
||||
public static class GetDescription
|
||||
{
|
||||
/// Extension method for enum-s
|
||||
public static string ToDescription(this Enum en)
|
||||
{
|
||||
Type type = en.GetType();
|
||||
MemberInfo[] memInfo = type.GetMember(en.ToString());
|
||||
|
||||
if (memInfo != null && memInfo.Length > 0)
|
||||
{
|
||||
object[] attrs = memInfo[0].GetCustomAttributes(typeof(Description), false);
|
||||
if (attrs != null && attrs.Length > 0)
|
||||
return ((Description)attrs[0]).Text;
|
||||
}
|
||||
|
||||
return en.ToString(); /// Return ToString() value in case there is no description
|
||||
}
|
||||
}
|
||||
|
||||
public enum ProcedureState
|
||||
{
|
||||
Active,
|
||||
History,
|
||||
Template,
|
||||
Count,
|
||||
}
|
||||
|
||||
/// <summary> Kind of meters for the procedure / test </summary>
|
||||
public enum MetersKind
|
||||
{
|
||||
Single,
|
||||
Combined,
|
||||
HeatMeter,
|
||||
}
|
||||
|
||||
public enum CompoundMeterId : byte
|
||||
{
|
||||
Single,
|
||||
CompoundMain,
|
||||
CompoundAux,
|
||||
Compound,
|
||||
HeatMeterVolume,
|
||||
HeatMeterEnergy,
|
||||
SingleOrCompound, /// Only used when querying results
|
||||
}
|
||||
|
||||
public enum Medium
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
ColdWater,
|
||||
HotWater,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Mounting
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("")] NotSpecified,
|
||||
[Description("H")] H, /// horizontal
|
||||
[Description("V")] V, /// vertical
|
||||
[Description("STR")] S, /// standrohre
|
||||
[Description("F")] F, /// fall
|
||||
#else
|
||||
[Description("")] NotSpecified,
|
||||
[Description("H")] H, /// horizontal
|
||||
[Description("V")] V, /// vertical
|
||||
[Description("S")] S, /// steig
|
||||
[Description("F")] F, /// fall
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum TemperatureClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("T30")] T30,
|
||||
[Description("T50")] T50,
|
||||
[Description("T70")] T70,
|
||||
[Description("T90")] T90,
|
||||
[Description("T130")] T130,
|
||||
[Description("T180")] T180,
|
||||
[Description("T30/70")] T30_70,
|
||||
[Description("T30/90")] T30_90,
|
||||
[Description("T30/130")] T30_130,
|
||||
[Description("T30/180")] T30_180,
|
||||
[Description("30")] t30,
|
||||
[Description("50")] t50,
|
||||
[Description("70")] t70,
|
||||
[Description("90")] t90,
|
||||
[Description("130")] t130,
|
||||
[Description("180")] t180,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum FlowProfileSensitivityClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("U0")] U0, /// ?
|
||||
[Description("D0")] D0, /// ?
|
||||
Count
|
||||
}
|
||||
|
||||
public enum PressureLossClass
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("dp63")] dp63, /// 0.063 MPa = 0.63 bar, TODO: Change to "Δp63"
|
||||
[Description("dp40")] dp40, /// 0.040 MPa = 0.40 bar
|
||||
[Description("dp25")] dp25, /// 0.025 MPa = 0.25 bar
|
||||
[Description("dp16")] dp16, /// 0.016 MPa = 0.16 bar
|
||||
[Description("dp10")] dp10, /// 0.010 MPa = 0.10 bar
|
||||
Count
|
||||
}
|
||||
|
||||
/// <summary> Maximum Admissible Pressure </summary>
|
||||
public enum MaxAdmissiblePressure
|
||||
{
|
||||
[Description("")] NotSpecified,
|
||||
[Description("MAP6")] MAP6,
|
||||
[Description("MAP10")] MAP10,
|
||||
[Description("MAP16")] MAP16,
|
||||
[Description("MAP25")] MAP25,
|
||||
[Description("MAP40")] MAP40,
|
||||
Count
|
||||
}
|
||||
|
||||
/// <summary> Transition step is finished when this condition is fulfilled </summary>
|
||||
public enum StepCondition
|
||||
{
|
||||
None,
|
||||
Scale1Empty,
|
||||
Scale2Empty,
|
||||
Scale3Empty,
|
||||
AllScalesEmpty,
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Publish : sbyte
|
||||
{
|
||||
#if LANG_DE
|
||||
/// nemecky
|
||||
[Description("nie")] Never = 0,
|
||||
[Description("immer")] Always = 1,
|
||||
[Description("Bildschirm")] OnScreen = 2,
|
||||
[Description("intern")] Internal = 3,
|
||||
#elif LANG_CS
|
||||
/// cesky
|
||||
[Description("nikdy")] Never = 0,
|
||||
[Description("vždy")] Always = 1,
|
||||
[Description("na obrazovku")] OnScreen = 2,
|
||||
[Description("interně")] Internal = 3,
|
||||
#elif LANG_SK
|
||||
/// slovensky
|
||||
[Description("nikdy")] Never = 0,
|
||||
[Description("vždy")] Always = 1,
|
||||
[Description("na obrazovku")] OnScreen = 2,
|
||||
[Description("interne")] Internal = 3,
|
||||
#elif LANG_PL
|
||||
/// polsky
|
||||
[Description("nigdy")] Never = 0,
|
||||
[Description("zawsze")] Always = 1,
|
||||
[Description("na ekranie")] OnScreen = 2,
|
||||
[Description("wewnętrznie")] Internal = 3,
|
||||
#else
|
||||
[Description("Never")] Never = 0,
|
||||
[Description("Always")] Always = 1,
|
||||
[Description("On screen")] OnScreen = 2,
|
||||
[Description("Internal")] Internal = 3,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum MassMethod : byte
|
||||
{
|
||||
#if LANG_DE
|
||||
/// nemecky
|
||||
[Description("Waage")] Scale,
|
||||
[Description("Spanne")] Spread,
|
||||
[Description("Standardabw.")] StdDev,
|
||||
#elif LANG_CS
|
||||
/// cesky
|
||||
[Description("váhou")] Scale,
|
||||
[Description("max.rozdíl")] Spread,
|
||||
[Description("std.dev.")] StdDev,
|
||||
#else
|
||||
[Description("Scale")] Scale,
|
||||
[Description("Spread")] Spread,
|
||||
[Description("Std.dev.")] StdDev,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
|
||||
public enum TestRedType
|
||||
{
|
||||
Fix,
|
||||
/// etc.
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum FQC1
|
||||
{
|
||||
FQC1,
|
||||
FQP1,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum Progress
|
||||
{
|
||||
JustStarted,
|
||||
TransitionBefore,
|
||||
SwitchingFlowDetection,
|
||||
FlowSetting,
|
||||
Test,
|
||||
TransitionAfter,
|
||||
Completed,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum Device
|
||||
{
|
||||
Screen,
|
||||
Printer,
|
||||
Disk,
|
||||
}
|
||||
|
||||
public enum PageOrientation
|
||||
{
|
||||
Portrait,
|
||||
Landscape,
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum ItemCategory
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Allgemein")] Other,
|
||||
[Description("Prüfstanddaten")] BenchData,
|
||||
[Description("Prüfstandergebnisse")] BenchResult,
|
||||
[Description("Prüfpunktdaten")] TestData,
|
||||
[Description("Prüfpunktergebnisse")] TestResult,
|
||||
[Description("Wasserzelledaten")] MeterData,
|
||||
[Description("Wasserzelleergebnisse")] MeterResult,
|
||||
#else
|
||||
[Description("Other")] Other,
|
||||
[Description("Bench data")] BenchData,
|
||||
[Description("Bench result")] BenchResult,
|
||||
[Description("Test data")] TestData,
|
||||
[Description("Test result")] TestResult,
|
||||
[Description("Meter data")] MeterData,
|
||||
[Description("Meter result")] MeterResult,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
/// <summary> Possible modes of operation of components and devices. </summary>
|
||||
public enum DebugMode
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Erkennen-aus")] DetectedOff = -2,
|
||||
[Description("Erkennen-ein")] DetectedOn = -1,
|
||||
[Description("Normal")] Normal = 0, /// Normal operation
|
||||
[Description("Auto-erkennen")] AutoDetect, /// The component (device) will be auto-detected
|
||||
[Description("Fehler")] FailureDuringOperation, /// Failure during operation -> disabled
|
||||
[Description("Aus")] Off, /// The component is off
|
||||
[Description("Aufzeichnen")] Record,
|
||||
[Description("Reply")] Reply,
|
||||
[Description("Simuliert")] Simulate, /// Test bench simulation, this mode does not require any hardware
|
||||
[Description("Geerbt")] Inherit,
|
||||
#else
|
||||
[Description("Detected off")] DetectedOff = -2,
|
||||
[Description("Detected on")] DetectedOn = -1,
|
||||
[Description("Normal")] Normal = 0, /// Normal operation
|
||||
[Description("Auto detect")] AutoDetect, /// The component (device) will be auto-detected
|
||||
[Description("Run-time error")] FailureDuringOperation, /// Failure during operation -> disabled
|
||||
[Description("Off")] Off, /// The component is off
|
||||
[Description("Record")] Record,
|
||||
[Description("Reply")] Reply,
|
||||
[Description("Simulate")] Simulate, /// Test bench simulation, this mode does not require any hardware
|
||||
[Description("Inherit")] Inherit,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
public enum LogLevel
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("Aus")] Off,
|
||||
[Description("Schwerwiegend")] Fatal,
|
||||
[Description("Fehler")] Error,
|
||||
[Description("Warnung")] Warn,
|
||||
[Description("Info")] Info,
|
||||
[Description("Debug")] Debug,
|
||||
[Description("Alles")] All,
|
||||
#else
|
||||
[Description("Off")] Off,
|
||||
[Description("Fatal")] Fatal,
|
||||
[Description("Error")] Error,
|
||||
[Description("Warn")] Warn,
|
||||
[Description("Info")] Info,
|
||||
[Description("Debug")] Debug,
|
||||
[Description("All")] All,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
|
||||
/// <summary> Arrangement of tests </summary>
|
||||
public enum TestsArrangement
|
||||
{
|
||||
Rows,
|
||||
Columns,
|
||||
}
|
||||
|
||||
/// <summary> Arrangement of meters </summary>
|
||||
public enum MetersArrangement
|
||||
{
|
||||
Vertically,
|
||||
Horizontally,
|
||||
}
|
||||
|
||||
public enum Alignment
|
||||
{
|
||||
#if LANG_DE
|
||||
[Description("links")] Left,
|
||||
[Description("zentriert")] Center,
|
||||
[Description("rechts")] Right,
|
||||
[Description("angepasst")] Justified,
|
||||
#else
|
||||
[Description("Left")] Left,
|
||||
[Description("Center")] Center,
|
||||
[Description("Right")] Right,
|
||||
[Description("Justified")] Justified,
|
||||
#endif
|
||||
Count
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class FeedingPath : IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string Pump { get; set; }
|
||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public FeedingPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public FeedingPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual FeedingPath Clone(string name, int itemNr)
|
||||
{
|
||||
FeedingPath result = new FeedingPath(name, itemNr);
|
||||
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.Pump = Pump;
|
||||
result.RegulValvesPct = RegulValvesPct;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Group
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int Gid { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2016 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class HeatMetersPath : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
|
||||
public virtual float TempWarmFrom { get; set; } /// Warm temperature range from [°C]
|
||||
public virtual float TempWarmTo { get; set; } /// Warm temperature range to [°C]
|
||||
public virtual float TempColdFrom { get; set; } /// Cold temperature range from [°C]
|
||||
public virtual float TempColdTo { get; set; } /// Cold temperature renge to [°C]
|
||||
|
||||
public virtual string TMeterRefWarm1 { get; set; }
|
||||
public virtual string TMeterRefWarm2 { get; set; }
|
||||
public virtual string TMeterRefCold1 { get; set; }
|
||||
public virtual string TMeterRefCold2 { get; set; }
|
||||
|
||||
public virtual string TMeterWorkWarm1 { get; set; }
|
||||
public virtual string TMeterWorkWarm2 { get; set; }
|
||||
public virtual string TMeterWorkCold1 { get; set; }
|
||||
public virtual string TMeterWorkCold2 { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public HeatMetersPath()
|
||||
{
|
||||
}
|
||||
|
||||
public HeatMetersPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual HeatMetersPath Clone(string name, int itemNr)
|
||||
{
|
||||
HeatMetersPath result = new HeatMetersPath(name, itemNr);
|
||||
|
||||
result.TempWarmFrom = TempWarmFrom;
|
||||
result.TempWarmTo = TempWarmTo;
|
||||
result.TempColdFrom = TempColdFrom;
|
||||
result.TempColdTo = TempColdTo;
|
||||
|
||||
result.TMeterRefWarm1 = TMeterRefWarm1;
|
||||
result.TMeterRefWarm2 = TMeterRefWarm2;
|
||||
result.TMeterRefCold1 = TMeterRefCold1;
|
||||
result.TMeterRefCold2 = TMeterRefCold2;
|
||||
|
||||
result.TMeterWorkWarm1 = TMeterWorkWarm1;
|
||||
result.TMeterWorkWarm2 = TMeterWorkWarm2;
|
||||
result.TMeterWorkCold1 = TMeterWorkCold1;
|
||||
result.TMeterWorkCold2 = TMeterWorkCold2;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace Config.Entities
|
||||
{
|
||||
public interface IHasItemNr
|
||||
{
|
||||
int Id { get; }
|
||||
int ItemNr { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
namespace Config.Entities
|
||||
{
|
||||
public interface IHasValves
|
||||
{
|
||||
string ValvesOpen { get; set; } /// List of valves to be opened
|
||||
string ValvesClose { get; set; } /// List of valves to be closed
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class MeasurementCorrection
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual float Measurement { get; set; }
|
||||
public virtual float Correction { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class MeterTestResult
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual TestResult TestResult { get; set; } /// reference to the TestResult entity
|
||||
|
||||
public virtual bool Disabled { get; set; } /// true = this meter was disabled and the results should be disregarded
|
||||
public virtual string SerialNr { get; set; }
|
||||
public virtual string EndState { get; set; }
|
||||
public virtual float VolumeStart { get; set; } /// liter
|
||||
public virtual float VolumeEnd { get; set; } /// liter
|
||||
public virtual float VolumeMeter { get; set; } /// liter
|
||||
public virtual float VolumeRef { get; set; } /// liter
|
||||
public virtual float VolumeErrorPct { get; set; } /// %
|
||||
public virtual float PulsesMeter { get; set; } /// # of pulses
|
||||
public virtual float PulsesPerLiter { get; set; } /// Pulses per liter
|
||||
public virtual float PulsesMaster { get; set; }
|
||||
public virtual float Time { get; set; } /// sec.
|
||||
public virtual float TimeStart { get; set; } /// sec. - Not mapped to DB !!!
|
||||
public virtual float TimeEnd { get; set; } /// sec. - Not mapped to DB !!!
|
||||
public virtual int CalibFactor { get; set; } /// iPerl calibration factor used during the test - Not mapped to DB !!!
|
||||
public virtual double Q2Correction { get; set; } /// iPerl Q2 correction used during the test - Not mapped to DB !!!
|
||||
public virtual bool Passed { get; set; } /// true=test passed - Not mapped to DB !!!
|
||||
|
||||
public MeterTestResult()
|
||||
{
|
||||
PulsesPerLiter = 1.0f;
|
||||
}
|
||||
|
||||
public MeterTestResult(TestResult testResult)
|
||||
: this()
|
||||
{
|
||||
TestResult = testResult;
|
||||
}
|
||||
|
||||
public virtual MeterTestResult Clone(TestResult testResult)
|
||||
{
|
||||
MeterTestResult result = new MeterTestResult(testResult);
|
||||
|
||||
result.Disabled = Disabled;
|
||||
result.SerialNr = SerialNr;
|
||||
result.EndState = EndState;
|
||||
result.VolumeStart = VolumeStart;
|
||||
result.VolumeEnd = VolumeEnd;
|
||||
result.VolumeMeter = VolumeMeter;
|
||||
result.VolumeRef = VolumeRef;
|
||||
result.VolumeErrorPct = VolumeErrorPct;
|
||||
result.PulsesMeter = PulsesMeter;
|
||||
result.PulsesPerLiter = PulsesPerLiter;
|
||||
result.PulsesMaster = PulsesMaster;
|
||||
result.Time = Time;
|
||||
result.TimeStart = TimeStart;
|
||||
result.TimeEnd = TimeEnd;
|
||||
result.CalibFactor = CalibFactor;
|
||||
result.Q2Correction = Q2Correction;
|
||||
result.Passed = Passed;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class MetersPath : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
|
||||
/// Sensors
|
||||
public virtual string Sensor1 { get; set; }
|
||||
public virtual string Sensor2 { get; set; }
|
||||
public virtual string Sensor3 { get; set; }
|
||||
public virtual string Sensor4 { get; set; }
|
||||
public virtual string Sensor5 { get; set; }
|
||||
public virtual string Sensor6 { get; set; }
|
||||
public virtual string Sensor7 { get; set; }
|
||||
public virtual string Sensor8 { get; set; }
|
||||
public virtual string Sensor9 { get; set; }
|
||||
public virtual string Sensor10 { get; set; }
|
||||
public virtual string Sensor11 { get; set; }
|
||||
public virtual string Sensor12 { get; set; }
|
||||
public virtual string Sensor13 { get; set; }
|
||||
public virtual string Sensor14 { get; set; }
|
||||
public virtual string Sensor15 { get; set; }
|
||||
public virtual string Sensor16 { get; set; }
|
||||
public virtual string Sensor17 { get; set; }
|
||||
public virtual string Sensor18 { get; set; }
|
||||
public virtual string Sensor19 { get; set; }
|
||||
public virtual string Sensor20 { get; set; }
|
||||
public virtual string Sensor21 { get; set; }
|
||||
public virtual string Sensor22 { get; set; }
|
||||
public virtual string Sensor23 { get; set; }
|
||||
public virtual string Sensor24 { get; set; }
|
||||
public virtual string Sensor25 { get; set; }
|
||||
public virtual string Sensor26 { get; set; }
|
||||
public virtual string Sensor27 { get; set; }
|
||||
public virtual string Sensor28 { get; set; }
|
||||
public virtual string Sensor29 { get; set; }
|
||||
public virtual string Sensor30 { get; set; }
|
||||
public virtual string Sensor31 { get; set; }
|
||||
public virtual string Sensor32 { get; set; }
|
||||
public virtual string Sensor33 { get; set; }
|
||||
public virtual string Sensor34 { get; set; }
|
||||
public virtual string Sensor35 { get; set; }
|
||||
public virtual string Sensor36 { get; set; }
|
||||
public virtual string Sensor37 { get; set; }
|
||||
public virtual string Sensor38 { get; set; }
|
||||
public virtual string Sensor39 { get; set; }
|
||||
public virtual string Sensor40 { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public MetersPath()
|
||||
{
|
||||
}
|
||||
|
||||
public MetersPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual MetersPath Clone(string name, int itemNr)
|
||||
{
|
||||
MetersPath result = new MetersPath(name, itemNr);
|
||||
result.Sensor1 = Sensor1;
|
||||
result.Sensor2 = Sensor2;
|
||||
result.Sensor3 = Sensor3;
|
||||
result.Sensor4 = Sensor4;
|
||||
result.Sensor5 = Sensor5;
|
||||
result.Sensor6 = Sensor6;
|
||||
result.Sensor7 = Sensor7;
|
||||
result.Sensor8 = Sensor8;
|
||||
result.Sensor9 = Sensor9;
|
||||
result.Sensor10 = Sensor10;
|
||||
result.Sensor11 = Sensor11;
|
||||
result.Sensor12 = Sensor12;
|
||||
result.Sensor13 = Sensor13;
|
||||
result.Sensor14 = Sensor14;
|
||||
result.Sensor15 = Sensor15;
|
||||
result.Sensor16 = Sensor16;
|
||||
result.Sensor17 = Sensor17;
|
||||
result.Sensor18 = Sensor18;
|
||||
result.Sensor19 = Sensor19;
|
||||
result.Sensor20 = Sensor20;
|
||||
result.Sensor21 = Sensor21;
|
||||
result.Sensor22 = Sensor22;
|
||||
result.Sensor23 = Sensor23;
|
||||
result.Sensor24 = Sensor24;
|
||||
result.Sensor25 = Sensor25;
|
||||
result.Sensor26 = Sensor26;
|
||||
result.Sensor27 = Sensor27;
|
||||
result.Sensor28 = Sensor28;
|
||||
result.Sensor29 = Sensor29;
|
||||
result.Sensor30 = Sensor30;
|
||||
result.Sensor31 = Sensor31;
|
||||
result.Sensor32 = Sensor32;
|
||||
result.Sensor33 = Sensor33;
|
||||
result.Sensor34 = Sensor34;
|
||||
result.Sensor35 = Sensor35;
|
||||
result.Sensor36 = Sensor36;
|
||||
result.Sensor37 = Sensor37;
|
||||
result.Sensor38 = Sensor38;
|
||||
result.Sensor39 = Sensor39;
|
||||
result.Sensor40 = Sensor40;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Returns the component name
|
||||
public virtual string GetSensor(int i)
|
||||
{
|
||||
if (i == 0) return Sensor1;
|
||||
else if (i == 1) return Sensor2;
|
||||
else if (i == 2) return Sensor3;
|
||||
else if (i == 3) return Sensor4;
|
||||
else if (i == 4) return Sensor5;
|
||||
else if (i == 5) return Sensor6;
|
||||
else if (i == 6) return Sensor7;
|
||||
else if (i == 7) return Sensor8;
|
||||
else if (i == 8) return Sensor9;
|
||||
else if (i == 9) return Sensor10;
|
||||
else if (i == 10) return Sensor11;
|
||||
else if (i == 11) return Sensor12;
|
||||
else if (i == 12) return Sensor13;
|
||||
else if (i == 13) return Sensor14;
|
||||
else if (i == 14) return Sensor15;
|
||||
else if (i == 15) return Sensor16;
|
||||
else if (i == 16) return Sensor17;
|
||||
else if (i == 17) return Sensor18;
|
||||
else if (i == 18) return Sensor19;
|
||||
else if (i == 19) return Sensor20;
|
||||
else if (i == 20) return Sensor21;
|
||||
else if (i == 21) return Sensor22;
|
||||
else if (i == 22) return Sensor23;
|
||||
else if (i == 23) return Sensor24;
|
||||
else if (i == 24) return Sensor25;
|
||||
else if (i == 25) return Sensor26;
|
||||
else if (i == 26) return Sensor27;
|
||||
else if (i == 27) return Sensor28;
|
||||
else if (i == 28) return Sensor29;
|
||||
else if (i == 29) return Sensor30;
|
||||
else if (i == 30) return Sensor31;
|
||||
else if (i == 31) return Sensor32;
|
||||
else if (i == 32) return Sensor33;
|
||||
else if (i == 33) return Sensor34;
|
||||
else if (i == 34) return Sensor35;
|
||||
else if (i == 35) return Sensor36;
|
||||
else if (i == 36) return Sensor37;
|
||||
else if (i == 37) return Sensor38;
|
||||
else if (i == 38) return Sensor39;
|
||||
else if (i == 39) return Sensor40;
|
||||
else return null;
|
||||
}
|
||||
|
||||
/// Sets the component name
|
||||
public virtual void SetSensor(int i, string cmpntName)
|
||||
{
|
||||
if (i == 0) Sensor1 = cmpntName;
|
||||
else if (i == 1) Sensor2 = cmpntName;
|
||||
else if (i == 2) Sensor3 = cmpntName;
|
||||
else if (i == 3) Sensor4 = cmpntName;
|
||||
else if (i == 4) Sensor5 = cmpntName;
|
||||
else if (i == 5) Sensor6 = cmpntName;
|
||||
else if (i == 6) Sensor7 = cmpntName;
|
||||
else if (i == 7) Sensor8 = cmpntName;
|
||||
else if (i == 8) Sensor9 = cmpntName;
|
||||
else if (i == 9) Sensor10 = cmpntName;
|
||||
else if (i == 10) Sensor11 = cmpntName;
|
||||
else if (i == 11) Sensor12 = cmpntName;
|
||||
else if (i == 12) Sensor13 = cmpntName;
|
||||
else if (i == 13) Sensor14 = cmpntName;
|
||||
else if (i == 14) Sensor15 = cmpntName;
|
||||
else if (i == 15) Sensor16 = cmpntName;
|
||||
else if (i == 16) Sensor17 = cmpntName;
|
||||
else if (i == 17) Sensor18 = cmpntName;
|
||||
else if (i == 18) Sensor19 = cmpntName;
|
||||
else if (i == 19) Sensor20 = cmpntName;
|
||||
else if (i == 20) Sensor21 = cmpntName;
|
||||
else if (i == 21) Sensor22 = cmpntName;
|
||||
else if (i == 22) Sensor23 = cmpntName;
|
||||
else if (i == 23) Sensor24 = cmpntName;
|
||||
else if (i == 24) Sensor25 = cmpntName;
|
||||
else if (i == 25) Sensor26 = cmpntName;
|
||||
else if (i == 26) Sensor27 = cmpntName;
|
||||
else if (i == 27) Sensor28 = cmpntName;
|
||||
else if (i == 28) Sensor29 = cmpntName;
|
||||
else if (i == 29) Sensor30 = cmpntName;
|
||||
else if (i == 30) Sensor31 = cmpntName;
|
||||
else if (i == 31) Sensor32 = cmpntName;
|
||||
else if (i == 32) Sensor33 = cmpntName;
|
||||
else if (i == 33) Sensor34 = cmpntName;
|
||||
else if (i == 34) Sensor35 = cmpntName;
|
||||
else if (i == 35) Sensor36 = cmpntName;
|
||||
else if (i == 36) Sensor37 = cmpntName;
|
||||
else if (i == 37) Sensor38 = cmpntName;
|
||||
else if (i == 38) Sensor39 = cmpntName;
|
||||
else if (i == 39) Sensor40 = cmpntName;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class OutputPath : IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow in [m3/h]
|
||||
public virtual string RegulValve { get; set; }
|
||||
public virtual string FlowMeter { get; set; }
|
||||
public virtual float PidCoef { get; set; } /// PID coefficient for the regulation path
|
||||
public virtual string StartValve { get; set; }
|
||||
public virtual string Diverter { get; set; }
|
||||
public virtual string TempDiv { get; set; }
|
||||
public virtual string Balance { get; set; }
|
||||
public virtual string EmptyTankValve { get; set; }
|
||||
|
||||
/// Valves
|
||||
public virtual string ValvesOpen { get; set; }
|
||||
public virtual string ValvesClose { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public OutputPath()
|
||||
{
|
||||
ValvesOpen = string.Empty;
|
||||
ValvesClose = string.Empty;
|
||||
}
|
||||
|
||||
public OutputPath(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual OutputPath Clone(string name, int itemNr)
|
||||
{
|
||||
OutputPath result = new OutputPath(name, itemNr);
|
||||
|
||||
result.Name = Name;
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.RegulValve = RegulValve;
|
||||
result.FlowMeter = FlowMeter;
|
||||
result.PidCoef = PidCoef;
|
||||
result.StartValve = StartValve;
|
||||
result.Diverter = Diverter;
|
||||
result.TempDiv = TempDiv;
|
||||
result.Balance = Balance;
|
||||
result.EmptyTankValve = EmptyTankValve;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Stores one test procedure, supports revisions and history log
|
||||
/// </summary>
|
||||
public class Procedure : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual string CreationUser { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual DateTime CreationTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string LastChgUser { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual DateTime LastChgTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string LongDescription { get; set; } /// Long description (notes)
|
||||
|
||||
public virtual ProcedureState ProcedureState { get; set; }
|
||||
public virtual int Revision { get; set; }
|
||||
public virtual int PredecessorId { get; set; }
|
||||
public virtual bool ObtainedByCopy { get; set; }
|
||||
///
|
||||
public virtual MetersKind MetersKind { get; set; }
|
||||
public virtual string Watermeters { get; set; } /// Water meter name or Id
|
||||
public virtual string ProtocolTitle { get; set; } /// Title of the printed and saved protocol
|
||||
|
||||
public virtual string DataEntry { get; set; } /// Component to use for data entry
|
||||
public virtual string ResultsPrinter { get; set; } /// Component to use for printing the results
|
||||
public virtual string ResultsWriter { get; set; } /// Component to use for saving the results into the file
|
||||
public virtual string TransitionStart { get; set; }
|
||||
public virtual string TransitionEnd { get; set; }
|
||||
|
||||
public virtual IList<ComponentProcedure> MoreParams { get; set; }
|
||||
public virtual IList<Test> Tests { get; set; }
|
||||
|
||||
////public virtual string MetrologicalClass { get; set; }
|
||||
////public virtual IList<WMType> WMTypes { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Procedure()
|
||||
{
|
||||
MoreParams = new List<ComponentProcedure>();
|
||||
Tests = new List<Test>();
|
||||
|
||||
///
|
||||
/// Default values
|
||||
///
|
||||
CreationUser = (Users.GlobalData.CurrentUser != null) ? Users.GlobalData.CurrentUser.UserName : null;
|
||||
CreationTime = DateTime.Now;
|
||||
LastChgUser = CreationUser;
|
||||
LastChgTime = CreationTime;
|
||||
MetersKind = Entities.MetersKind.Single;
|
||||
ProtocolTitle = "Watermeter test protocol";
|
||||
}
|
||||
|
||||
public Procedure(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual Procedure Clone()
|
||||
{
|
||||
Procedure result = new Procedure();
|
||||
|
||||
result.ItemNr = ItemNr;
|
||||
result.Name = Name;
|
||||
result.Description = Description;
|
||||
result.CreationUser = CreationUser;
|
||||
result.CreationTime = CreationTime;
|
||||
result.LastChgUser = LastChgUser;
|
||||
result.LastChgTime = LastChgTime;
|
||||
result.LongDescription = LongDescription;
|
||||
|
||||
result.ProcedureState = ProcedureState;
|
||||
result.Revision = Revision;
|
||||
result.PredecessorId = Id;
|
||||
result.ObtainedByCopy = ObtainedByCopy;
|
||||
|
||||
result.MetersKind = MetersKind;
|
||||
result.Watermeters = Watermeters;
|
||||
result.ProtocolTitle = ProtocolTitle;
|
||||
|
||||
result.DataEntry = DataEntry;
|
||||
result.ResultsPrinter = ResultsPrinter;
|
||||
result.ResultsWriter = ResultsWriter;
|
||||
result.TransitionStart = TransitionStart;
|
||||
result.TransitionEnd = TransitionEnd;
|
||||
|
||||
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
|
||||
foreach (var test in Tests) { result.Tests.Add(test.Clone()); }
|
||||
|
||||
//result.MetrologicalClass = MetrologicalClass;
|
||||
//result.WMType = WMType.Clone();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("{0}, rev.{1}", Name, Revision);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class ProcedureHistory
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual Procedure Current { get; set; }
|
||||
public virtual IList<Procedure> OldProcedures { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public ProcedureHistory()
|
||||
{
|
||||
Current = new Procedure();
|
||||
OldProcedures = new List<Procedure>();
|
||||
}
|
||||
|
||||
public virtual ProcedureHistory Clone()
|
||||
{
|
||||
ProcedureHistory result = new ProcedureHistory();
|
||||
result.Current = Current.Clone();
|
||||
foreach (Procedure p in OldProcedures) result.OldProcedures.Add(p.Clone());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,151 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Author: Milan Hanajik
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Test, consisting of one or more repetitions of the test 'SingleTest'.
|
||||
/// </summary>
|
||||
public class Test : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual int Part { get; set; } /// Part=0 ... test of all WM-s
|
||||
/// Part>0 ... part of a set of tests with the same Name: subset of WM-s is given by MetersPath
|
||||
public virtual sbyte Publish { get; set; } /// 0=no, 1=in all protocols, 2=on screen, 3=internal
|
||||
public virtual bool Evaluate { get; set; }
|
||||
public virtual float Qfrom { get; set; } /// Water flow low limit in [m3/h]
|
||||
public virtual float Qto { get; set; } /// Water flow high limit in [m3/h]
|
||||
public virtual float Volume { get; set; } /// Test volume (target) in [l]
|
||||
public virtual float TstTime { get; set; } /// Test time (estimate) in [s]
|
||||
public virtual string Method { get; set; }
|
||||
public virtual float ErrLimLo { get; set; } /// in [%] (usually < 0)
|
||||
public virtual float ErrLimHi { get; set; } /// in [%] (usually > 0)
|
||||
public virtual float Uncertainty { get; set; } /// int [%] makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx)
|
||||
public virtual int Repeats { get; set; }
|
||||
public virtual bool Emptying { get; set; }
|
||||
public virtual bool Zeroing { get; set; }
|
||||
public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps
|
||||
public virtual int MassRepeats { get; set; } /// Number of mass. measurements at the beginning/end of test, 0 = default (=5)
|
||||
public virtual float MassSpread { get; set; } /// Max spread of mass. measurements at the beginning/end of test, 0 = default
|
||||
public virtual MassMethod MassMethod { get; set; } /// method of mass. measurement at the beginning/end of test: false=slow (precise), true=using immediate mass measurement and evaluation
|
||||
public virtual int TimeBeforeFlow { get; set; } /// Delay time before the start of flow control in [s]
|
||||
public virtual int TimeFlow2Mass { get; set; } /// Delay time from the flow stable to the 1st mass measurement in [s]
|
||||
public virtual int TimePump2StartV { get; set; } /// Delay time from the start of the pump to opening the start valve in [s]
|
||||
public virtual int TimeStop2Mass { get; set; } /// Delay time from the test end (diverted) to the 2nd mass measuremen in [s]
|
||||
public virtual double TolerRed { get; set; } /// = Filter
|
||||
public virtual TestRedType RedType { get; set; }
|
||||
public virtual string FeedingPath { get; set; }
|
||||
public virtual string BenchPath { get; set; }
|
||||
public virtual string OutputPath { get; set; }
|
||||
public virtual string MetersPath { get; set; }
|
||||
#if HEAT_METERS
|
||||
public virtual string HeatMetersPath { get; set; }
|
||||
#endif
|
||||
public virtual string RelTransBefore { get; set; }
|
||||
public virtual string RelTransBetween { get; set; }
|
||||
public virtual string RelTransAfter { get; set; }
|
||||
public virtual string TransitionAfter { get; set; }
|
||||
|
||||
public virtual IList<ComponentTest> MoreParams { get; set; }
|
||||
|
||||
public virtual Procedure Procedure { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public Test()
|
||||
{
|
||||
MoreParams = new List<ComponentTest>();
|
||||
|
||||
///
|
||||
/// Default values
|
||||
///
|
||||
Publish = (sbyte)Config.Entities.Publish.Always;
|
||||
Evaluate = true;
|
||||
Repeats = 1;
|
||||
Emptying = false;
|
||||
Zeroing = false;
|
||||
ErrLimLo = -2.0f; /// [%] lower error limit
|
||||
ErrLimHi = 2.0f; /// [%] upper error limit
|
||||
Uncertainty = 0;
|
||||
PumpPower = 60.0f; /// [%]
|
||||
MassRepeats = 0; /// default
|
||||
MassSpread = 0; /// default
|
||||
MassMethod = MassMethod.Scale; /// default
|
||||
TimeBeforeFlow = 10; /// [s] time before the start of flow control in [s]
|
||||
TimeFlow2Mass = 5; /// [s] time from the flow stable to the 1st mass measurement in [s]
|
||||
TimePump2StartV = 1; /// [s] time from the 1st mass measurement to the test start in [s]
|
||||
TimeStop2Mass = 5; /// [s] between the test end and the final mass measurement
|
||||
TolerRed = 0; /// = Filter parameter
|
||||
RelTransBefore = string.Empty;
|
||||
RelTransBetween = string.Empty;
|
||||
RelTransAfter = string.Empty;
|
||||
TransitionAfter = string.Empty;
|
||||
}
|
||||
|
||||
public Test(string name, int itemNr, Procedure procedure)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
Procedure = procedure;
|
||||
}
|
||||
|
||||
// Makes a new copy of this object (not just a reference)
|
||||
public virtual Test Clone()
|
||||
{
|
||||
Test result = new Test(Name, ItemNr, Procedure);
|
||||
|
||||
result.Part = Part;
|
||||
result.Publish = Publish;
|
||||
result.Evaluate = Evaluate;
|
||||
result.Qfrom = Qfrom;
|
||||
result.Qto = Qto;
|
||||
result.Volume = Volume;
|
||||
result.TstTime = TstTime;
|
||||
result.Repeats = Repeats;
|
||||
result.Emptying = Emptying;
|
||||
result.Zeroing = Zeroing;
|
||||
result.PumpPower = PumpPower;
|
||||
result.MassRepeats = MassRepeats;
|
||||
result.MassSpread = MassSpread;
|
||||
result.MassMethod = MassMethod;
|
||||
result.TimeBeforeFlow = TimeBeforeFlow;
|
||||
result.TimeFlow2Mass = TimeFlow2Mass;
|
||||
result.TimePump2StartV = TimePump2StartV;
|
||||
result.TimeStop2Mass = TimeStop2Mass;
|
||||
result.Method = Method;
|
||||
result.ErrLimLo = ErrLimLo;
|
||||
result.ErrLimHi = ErrLimHi;
|
||||
result.Uncertainty = Uncertainty;
|
||||
result.TolerRed = TolerRed;
|
||||
result.RedType = RedType;
|
||||
result.FeedingPath = FeedingPath;
|
||||
result.BenchPath = BenchPath;
|
||||
result.OutputPath = OutputPath;
|
||||
result.MetersPath = MetersPath;
|
||||
#if HEAT_METERS
|
||||
result.HeatMetersPath = HeatMetersPath;
|
||||
#endif
|
||||
result.RelTransBefore = RelTransBefore;
|
||||
result.RelTransBetween = RelTransBetween;
|
||||
result.RelTransAfter = RelTransAfter;
|
||||
result.TransitionAfter = TransitionAfter;
|
||||
foreach (var prms in MoreParams) { result.MoreParams.Add(prms.Clone()); }
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string partStr = (Part > 0) ? string.Format(", part {0}", Part) : string.Empty;
|
||||
|
||||
return string.Format("{0}(P.{1},{2}){3}", Name, ((Publish)Publish).ToString(), Evaluate ? "E" : "-", partStr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class TestResult
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual int BatchNr { get; set; }
|
||||
public virtual string PurchaseOrder { get; set; }
|
||||
public virtual MetersKind MetersKind { get; set; }
|
||||
public virtual IList<MeterTestResult> Meters { get; set; }
|
||||
public virtual IList<MeterTestResult> CombinedMeters { get; set; }
|
||||
|
||||
/// Value copied from the procedure (Entities.Procedure)
|
||||
public virtual string ProcedureName { get; set; }
|
||||
public virtual string ProtocolTitle { get; set; }
|
||||
|
||||
/// Values copied from the test (Entities.Test)
|
||||
public virtual int TestId { get; set; } /// Test entity ID to distinguish between tests with the same name
|
||||
public virtual string TestName { get; set; }
|
||||
public virtual int Part { get; set; }
|
||||
public virtual bool DoNotEvaluate { get; set; } /// Not mapped to the database
|
||||
public virtual bool DoNotPublish { get; set; } /// Not mapped to the database
|
||||
public virtual float Qfrom { get; set; } /// [m3/h] Water flow low limit
|
||||
public virtual float Qto { get; set; } /// [m3/h] Water flow high limit
|
||||
public virtual float Volume { get; set; } /// [l] Target test volume
|
||||
public virtual float TstTime { get; set; } /// [s] Test time estimate
|
||||
public virtual int Repeats { get; set; }
|
||||
public virtual bool Emptying { get; set; }
|
||||
public virtual bool Zeroing { get; set; }
|
||||
public virtual float PumpPower { get; set; } /// Power of the pump in [%] in the range 0 .. 100.0f, use values 0% and 100% for non-FM pumps
|
||||
public virtual int Time2MassMsrmt { get; set; }
|
||||
public virtual string Method { get; set; }
|
||||
public virtual float ErrLimLo { get; set; } /// [%] Lower error limit (usually < 0)
|
||||
public virtual float ErrLimHi { get; set; } /// [%] Upper error limit (usually > 0)
|
||||
public virtual float Uncertainty { get; set; } /// [%] Makes error limits tighter: 0 <= Uncertainty <= abs(ErrLimXx)
|
||||
|
||||
/// To be replaced by the virtual bench component parameters
|
||||
public virtual string FeedingPath { get; set; }
|
||||
public virtual string BenchPath { get; set; }
|
||||
public virtual string OutputPath { get; set; }
|
||||
public virtual string MetersPath { get; set; }
|
||||
|
||||
/// Results
|
||||
public virtual DateTime TimeStart { get; set; } /// Date and time of the test start
|
||||
public virtual DateTime TimeEnd { get; set; } /// Date and time of the test end
|
||||
public virtual int RepetitionNr { get; set; } /// Repetition number from the set of repeated tests (1...)
|
||||
public virtual float AmbientTempAve { get; set; } /// [deg.C] Average ambient air temperature
|
||||
public virtual float AmbientPressAve { get; set; } /// Average ambient air pressure
|
||||
public virtual float AmbientHumiAve { get; set; } /// [%] Average ambient air relative humidity
|
||||
public virtual float PressInAvrg { get; set; } /// [Bar] Input water pressure (average)
|
||||
public virtual float PressInStart { get; set; } /// [Bar]
|
||||
public virtual float PressInEnd { get; set; } /// [Bar]
|
||||
public virtual float PressOutAvrg { get; set; } /// [Bar]
|
||||
public virtual float PressOutStart { get; set; } /// [Bar]
|
||||
public virtual float PressOutEnd { get; set; } /// [Bar]
|
||||
public virtual float TempInAvrg { get; set; } /// [deg.C]
|
||||
public virtual float TempInStart { get; set; } /// [deg.C]
|
||||
public virtual float TempInEnd { get; set; } /// [deg.C]
|
||||
public virtual float TempOutAvrg { get; set; } /// [deg.C]
|
||||
public virtual float TempOutStart { get; set; } /// [deg.C]
|
||||
public virtual float TempOutEnd { get; set; } /// [deg.C]
|
||||
public virtual float TempDivAvrg { get; set; } /// [deg.C]
|
||||
public virtual float TempDivStart { get; set; } /// [deg.C]
|
||||
public virtual float TempDivEnd { get; set; } /// [deg.C]
|
||||
public virtual float MassStartRaw { get; set; } /// [kg]
|
||||
public virtual float MassStart { get; set; } /// [kg]
|
||||
public virtual float MassEndRaw { get; set; } /// [kg]
|
||||
public virtual float MassEnd { get; set; } /// [kg]
|
||||
public virtual float MassDiff { get; set; } /// [kg]
|
||||
public virtual float DensityIn { get; set; } /// [kg/m3]
|
||||
public virtual float DensityOut { get; set; } /// [kg/m3]
|
||||
public virtual float DensityDiv { get; set; } /// [kg/m3]
|
||||
public virtual float Buoyancy { get; set; } ///TODO -> map
|
||||
public virtual float FlowMass { get; set; } /// [kg/h] calculated from conventional true value
|
||||
public virtual float FlowVolume { get; set; } /// [l/h] calculated from conventional true value
|
||||
public virtual float VolumeCTV { get; set; } /// [l] Volume conventional true value
|
||||
public virtual float VolumeMaster { get; set; } /// [l] Volume from the master flow meter
|
||||
public virtual float Time { get; set; } /// [s] Measurement time in seconds
|
||||
public virtual float ErrorMaster { get; set; } /// [%]
|
||||
public virtual float PulsesMaster { get; set; }
|
||||
public virtual float ConstMaster { get; set; } /// [pls/l] Pulses per liter master flow meter
|
||||
public virtual float QRise { get; set; } /// Detected Q_rise of a composed meter
|
||||
public virtual float QFall { get; set; } /// Detected Q_fall of a composed meter
|
||||
public virtual float TimeDivStart0 { get; set; }
|
||||
public virtual float TimeDivStart1 { get; set; }
|
||||
public virtual float TimeDivStart2 { get; set; }
|
||||
public virtual float TimeDivStart3 { get; set; }
|
||||
public virtual float TimeDivStart4 { get; set; }
|
||||
public virtual float TimeDivStart5 { get; set; }
|
||||
public virtual float TimeDivEnd0 { get; set; }
|
||||
public virtual float TimeDivEnd1 { get; set; }
|
||||
public virtual float TimeDivEnd2 { get; set; }
|
||||
public virtual float TimeDivEnd3 { get; set; }
|
||||
public virtual float TimeDivEnd4 { get; set; }
|
||||
public virtual float TimeDivEnd5 { get; set; }
|
||||
|
||||
public TestResult()
|
||||
{
|
||||
Meters = new List<MeterTestResult>();
|
||||
CombinedMeters = new List<MeterTestResult>();
|
||||
}
|
||||
|
||||
public TestResult(MetersKind kind)
|
||||
: this()
|
||||
{
|
||||
MetersKind = kind;
|
||||
|
||||
if (kind == MetersKind.Single)
|
||||
{
|
||||
for (int i = 0; i < Config.Data.WMsCount; i++) Meters.Add(new MeterTestResult(this));
|
||||
}
|
||||
else if (kind == MetersKind.Combined)
|
||||
{
|
||||
for (int i = 0; i < 2 * Config.Data.CompoundWMsCount; i++) Meters.Add(new MeterTestResult(this));
|
||||
for (int i = 0; i < Config.Data.CompoundWMsCount; i++) CombinedMeters.Add(new MeterTestResult(this));
|
||||
}
|
||||
else if (kind == MetersKind.HeatMeter)
|
||||
{
|
||||
/// TODO: Verify if this is OK
|
||||
for (int i = 0; i < Config.Data.WMsCount; i++) Meters.Add(new MeterTestResult(this));
|
||||
}
|
||||
}
|
||||
|
||||
public TestResult(Test test, int repetitionNr, MetersKind kind)
|
||||
: this(kind)
|
||||
{
|
||||
if (test.Repeats == 1)
|
||||
{
|
||||
Name = test.Name;
|
||||
}
|
||||
else
|
||||
{
|
||||
Name = string.Format("{0} ({1}/{2})", test.Name, repetitionNr, test.Repeats);
|
||||
}
|
||||
RepetitionNr = repetitionNr;
|
||||
|
||||
/// Copy test parameters from Entities.Procedure object
|
||||
ProcedureName = test.Procedure.Name;
|
||||
ProtocolTitle = test.Procedure.ProtocolTitle;
|
||||
|
||||
/// Copy test parameters from Entities.Test object
|
||||
TestId = test.Id;
|
||||
TestName = test.Name;
|
||||
Part = test.Part;
|
||||
Qfrom = test.Qfrom;
|
||||
Qto = test.Qto;
|
||||
Volume = test.Volume;
|
||||
TstTime = test.TstTime;
|
||||
Repeats = test.Repeats;
|
||||
Emptying = test.Emptying;
|
||||
Zeroing = test.Zeroing;
|
||||
PumpPower = PumpPower;
|
||||
Time2MassMsrmt = test.TimeStop2Mass;
|
||||
Method = test.Method;
|
||||
ErrLimLo = test.ErrLimLo;
|
||||
ErrLimHi = test.ErrLimHi;
|
||||
Uncertainty = test.Uncertainty;
|
||||
|
||||
FeedingPath = test.FeedingPath;
|
||||
BenchPath = test.BenchPath;
|
||||
OutputPath = test.OutputPath;
|
||||
MetersPath = test.MetersPath;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("batch={0}, procedure={1}, test={2}, {3} {4}", BatchNr, ProcedureName, TestName, TimeStart.ToShortDateString(), TimeStart.ToShortTimeString());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
/// <summary>
|
||||
/// Stores one transition sequence containing a list of transition steps
|
||||
/// </summary>
|
||||
public class TransitionSequence : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual IList<TransitionStep> TransitionSteps { get; set; }
|
||||
|
||||
public TransitionSequence()
|
||||
{
|
||||
TransitionSteps = new List<TransitionStep>();
|
||||
}
|
||||
|
||||
public TransitionSequence(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual TransitionSequence Clone()
|
||||
{
|
||||
TransitionSequence result = new TransitionSequence();
|
||||
result.Name = Name;
|
||||
result.Description = Description;
|
||||
foreach (var step in TransitionSteps) { result.TransitionSteps.Add(step.Clone()); }
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015, 2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class TransitionStep : IHasItemNr, IHasValves
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; } /// Order of the preparation step
|
||||
public virtual int Duration { get; set; } /// Duration in seconds
|
||||
public virtual string Message { get; set; } /// Message
|
||||
public virtual string EndCondition { get; set; } /// Condition when transition step is finished (next to the duration)
|
||||
public virtual string ValvesOpen { get; set; } /// List of valves to be opened
|
||||
public virtual string ValvesClose { get; set; } /// List of valves to be closed
|
||||
public virtual string RegulValvesPct { get; set; } /// Positions of regulation valves in % separated by ';'
|
||||
public virtual string PumpWithFMPcts { get; set; } /// Power of FM controlled pumps in % separated by ';'
|
||||
|
||||
public virtual TransitionSequence TransitionSequence { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public TransitionStep()
|
||||
{
|
||||
Duration = 5; /// sec.
|
||||
EndCondition = "None";
|
||||
}
|
||||
|
||||
public TransitionStep(int itemNr, TransitionSequence sequence)
|
||||
: this()
|
||||
{
|
||||
ItemNr = itemNr;
|
||||
TransitionSequence = sequence;
|
||||
}
|
||||
|
||||
public virtual TransitionStep Clone()
|
||||
{
|
||||
TransitionStep result = new TransitionStep(ItemNr, TransitionSequence);
|
||||
result.Duration = Duration;
|
||||
result.Message = Message;
|
||||
result.EndCondition = EndCondition;
|
||||
result.ValvesOpen = ValvesOpen;
|
||||
result.ValvesClose = ValvesClose;
|
||||
result.RegulValvesPct = RegulValvesPct;
|
||||
result.PumpWithFMPcts = PumpWithFMPcts;
|
||||
return result;
|
||||
}
|
||||
|
||||
public virtual string ToString(string indent)
|
||||
{
|
||||
string result = "";
|
||||
result += indent + "ItemNr = " + ItemNr.ToString() + ", ";
|
||||
result += indent + "Duration = " + Duration.ToString() + ", ";
|
||||
result += indent + "Message = " + Message + ", ";
|
||||
result += indent + "EndCondition = " + EndCondition + ", ";
|
||||
result += indent + "ValvesOpen = " + ValvesOpen + ", ";
|
||||
result += indent + "ValvesClose = " + ValvesClose + ", ";
|
||||
result += indent + "RegulValvesPct = " + RegulValvesPct + ", ";
|
||||
result += indent + "PumpsWithFMPct = " + PumpWithFMPcts + Environment.NewLine;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class User //: Users.IUser
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual string UserName { get; set; } /// = name, alias, abbreviation
|
||||
public virtual string FullName { get; set; } /// = description
|
||||
public virtual int Number { get; set; }
|
||||
public virtual string Password { get; set; }
|
||||
public virtual DateTime LastPwChange { get; set; }
|
||||
public virtual IList<Group> Groups { get; set; } //User can be a member of a list of groups
|
||||
|
||||
public User()
|
||||
{
|
||||
Groups = new List<Group>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class VirtualBenchSequence : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; }
|
||||
public virtual string Name { get; set; }
|
||||
public virtual string Description { get; set; } /// Short description
|
||||
public virtual IList<VirtualBenchStep> VirtualBenchSteps { get; set; }
|
||||
|
||||
public VirtualBenchSequence()
|
||||
{
|
||||
VirtualBenchSteps = new List<VirtualBenchStep>();
|
||||
}
|
||||
|
||||
public VirtualBenchSequence(string name, int itemNr)
|
||||
: this()
|
||||
{
|
||||
Name = name;
|
||||
ItemNr = itemNr;
|
||||
}
|
||||
|
||||
public virtual VirtualBenchSequence Clone()
|
||||
{
|
||||
VirtualBenchSequence result = new VirtualBenchSequence();
|
||||
result.Name = Name;
|
||||
result.Description = Description;
|
||||
foreach (var step in VirtualBenchSteps) { result.VirtualBenchSteps.Add(step.Clone()); }
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class VirtualBenchStep : IHasItemNr
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int ItemNr { get; set; } /// Order of the preparation step
|
||||
public virtual int Duration { get; set; } /// Duration in seconds
|
||||
///
|
||||
|
||||
public virtual VirtualBenchSequence VirtualBenchSequence { get; set; }
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public VirtualBenchStep()
|
||||
{
|
||||
Duration = 5; /// sec.
|
||||
}
|
||||
|
||||
public VirtualBenchStep(int itemNr, VirtualBenchSequence sequence)
|
||||
: this()
|
||||
{
|
||||
ItemNr = itemNr;
|
||||
VirtualBenchSequence = sequence;
|
||||
}
|
||||
|
||||
public virtual VirtualBenchStep Clone()
|
||||
{
|
||||
VirtualBenchStep result = new VirtualBenchStep(ItemNr, VirtualBenchSequence);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
/// This class holds the watermeter type specific data
|
||||
/// that have all watermaters of the same type in common
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class WMType
|
||||
{
|
||||
// mapped
|
||||
public virtual int Id { get; protected set; } /// primary key
|
||||
public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual string CreateDescription { get; set; } /// Description\
|
||||
|
||||
public virtual string Name { get; set; } /// type name
|
||||
public virtual float PulseRate { get; set; } /// Pulses per Liter
|
||||
|
||||
// not yet mapped
|
||||
public virtual int IdentNr { get; protected set; } /// identification number of watermeter tzpe
|
||||
public virtual int Diameter { get; set; } /// nominal diameter
|
||||
public virtual int Pressure { get; set; } /// nominal pressure
|
||||
public virtual int Length { get; set; } /// construction length
|
||||
public virtual int Temperatur { get; set; } /// nominal temperature in C
|
||||
public virtual float NominalFlow { get; set; } /// nominal flow Qn
|
||||
|
||||
/// ------------- Additional stuff not mapped into the database -------------
|
||||
|
||||
public WMType()
|
||||
{
|
||||
}
|
||||
|
||||
public static WMType DefaultWMType()
|
||||
{
|
||||
WMType procedure = new WMType()
|
||||
{
|
||||
CreateTime = DateTime.Now,
|
||||
CreateUserName = Users.GlobalData.CurrentUser.UserName,
|
||||
CreateDescription = "A default water meter created.",
|
||||
Name = "Watermeter",
|
||||
PulseRate = 1000,
|
||||
};
|
||||
return procedure;
|
||||
}
|
||||
|
||||
public virtual WMType Clone()
|
||||
{
|
||||
WMType result = new WMType();
|
||||
|
||||
result.CreateTime = CreateTime;
|
||||
result.CreateUserName = CreateUserName;
|
||||
result.CreateDescription = CreateDescription;
|
||||
result.Name = Name;
|
||||
result.PulseRate = PulseRate;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = "";
|
||||
result += "WMTpe: " + Environment.NewLine;
|
||||
result += " Name = " + Name + Environment.NewLine;
|
||||
result += " Created by = " + CreateUserName + Environment.NewLine;
|
||||
result += " Created on = " + CreateTime.ToString() + Environment.NewLine;
|
||||
result += " Description = " + CreateDescription + Environment.NewLine;
|
||||
result += " Pulse rate = " + PulseRate.ToString() + Environment.NewLine;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using NHibernate;
|
||||
using FluentNHibernate;
|
||||
|
||||
namespace Config.Entities
|
||||
{
|
||||
public class Watermeter
|
||||
{
|
||||
public virtual int Id { get; protected set; } /// primary key
|
||||
|
||||
public virtual DateTime CreateTime { get; set; } /// Date and time of the creation or change
|
||||
public virtual string CreateUserName { get; set; } /// Name of the user who has created or changed this procedure
|
||||
public virtual string CreateDescription { get; set; } /// Description
|
||||
|
||||
/// mapped
|
||||
public virtual string Serial { get; set; } /// serial number
|
||||
public virtual WMType WMType { get; set; } /// type of watermeter
|
||||
///
|
||||
|
||||
/// <summary>
|
||||
/// Load a watermeter from the database
|
||||
/// </summary>
|
||||
public static Watermeter LoadBySerialnr(string SerialNr)
|
||||
{
|
||||
IList<Watermeter> ListOfWatermeters = FluentCommon.CreateSession(Users.Entities.DBKind.Results)
|
||||
.CreateQuery("FROM Watermeter WHERE Serial = :SerialNrParameter")
|
||||
.SetParameter("SerialNrParameter", SerialNr)
|
||||
.List<Watermeter>();
|
||||
if (ListOfWatermeters.Count > 0) return ListOfWatermeters.ElementAt(0);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,236 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using FluentNHibernate.Cfg;
|
||||
using FluentNHibernate.Cfg.Db;
|
||||
using NHibernate;
|
||||
using NHibernate.Cfg;
|
||||
using NHibernate.Tool.hbm2ddl;
|
||||
using Config.Resources;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public static class FluentCommon
|
||||
{
|
||||
/// <summary>
|
||||
/// Session factories for regular sessions.
|
||||
/// </summary>
|
||||
public static ISessionFactory[] SessionFactories = new ISessionFactory[(int)Users.Entities.DBKind.Count];
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <returns>A database session</returns>
|
||||
static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database)
|
||||
{
|
||||
Users.Entities.DBType dbType;
|
||||
string connectionString;
|
||||
|
||||
switch (database)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBKind.Config:
|
||||
dbType = Data.CurrentBench.ProceduresDBSettings.DbType;
|
||||
connectionString = Data.CurrentBench.ProceduresDBSettings.ConnectionString;
|
||||
break;
|
||||
case Users.Entities.DBKind.Results:
|
||||
dbType = Data.CurrentBench.WaterMetersDBSettings.DbType;
|
||||
connectionString = Data.CurrentBench.WaterMetersDBSettings.ConnectionString;
|
||||
break;
|
||||
}
|
||||
|
||||
return CreateSessionFactory(database, dbType, connectionString, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <returns>A database session</returns>
|
||||
public static ISessionFactory CreateSessionFactory(Users.Entities.DBKind database, Users.Entities.DBType dbType, string connectionString, bool createDB)
|
||||
{
|
||||
try
|
||||
{
|
||||
FluentConfiguration cfg = Fluently.Configure();
|
||||
|
||||
switch (dbType)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBType.SQLite:
|
||||
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
|
||||
break;
|
||||
case Users.Entities.DBType.MySql:
|
||||
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
|
||||
break;
|
||||
}
|
||||
|
||||
switch (database)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBKind.Config:
|
||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
||||
break;
|
||||
case Users.Entities.DBKind.Results:
|
||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Data>());
|
||||
break;
|
||||
}
|
||||
|
||||
if (createDB)
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory();
|
||||
}
|
||||
else
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory();
|
||||
}
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
MessageBox.Show(string.Format(Strings.Cannot_open_DB_Cause_0, exc.Message),
|
||||
Strings.Error,
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public delegate void BuildSchemaDlgt(Configuration config);
|
||||
|
||||
static void BuildSchema(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration (with mapping info in)
|
||||
/// and exports a database schema from it
|
||||
new SchemaExport(config).SetOutputFile("db_schema");
|
||||
}
|
||||
|
||||
static void BuildSchemaCreate(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration (with mapping info in)
|
||||
/// and exports a database schema from it
|
||||
new SchemaExport(config).Create(true, true);
|
||||
}
|
||||
|
||||
/// Create a NHibernate session for the given database
|
||||
public static ISession CreateSession(Users.Entities.DBKind database)
|
||||
{
|
||||
int ix = (int)database;
|
||||
if (ix < 0 || ix >= (int)Users.Entities.DBKind.Count) return null;
|
||||
|
||||
if (SessionFactories[ix] == null) SessionFactories[ix] = CreateSessionFactory(database);
|
||||
|
||||
return SessionFactories[ix].OpenSession();
|
||||
}
|
||||
|
||||
public static void SaveToDb(Users.Entities.DBKind database, object obj)
|
||||
{
|
||||
SaveToDb(CreateSession(database), obj);
|
||||
}
|
||||
|
||||
public static void SaveToDb(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
session.SaveOrUpdate(obj);
|
||||
try { transaction.Commit(); }
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteFromDb(Users.Entities.DBKind database, object obj)
|
||||
{
|
||||
DeleteFromDb(CreateSession(database), obj);
|
||||
}
|
||||
|
||||
public static void DeleteFromDb(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
session.Delete(obj);
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an empty users database.
|
||||
/// Database contains only the user 'admin' and the control board component 'CB'.
|
||||
/// </summary>
|
||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||
/// <param name="connectionString">Connection string</param>
|
||||
/// <returns>true=success, false=error</returns>
|
||||
public static bool CreateEmptyConfigDB(Users.Entities.DBType dbType, string connectionString)
|
||||
{
|
||||
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Config, dbType, connectionString, true);
|
||||
if (sessionFactory == null) return false;
|
||||
|
||||
/// Populate the database
|
||||
using (var session = sessionFactory.OpenSession())
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
///
|
||||
/// Prepare all groups
|
||||
///
|
||||
var testers = new Users.Entities.Group((int)Users.Grp.GID.Testers, Strings.Tester);
|
||||
var testingSpecialists = new Users.Entities.Group((int)Users.Grp.GID.TestingSpecialists, Strings.Testing_Specialist);
|
||||
var headOfLab = new Users.Entities.Group((int)Users.Grp.GID.HeadOfLab, Strings.Head_of_Lab);
|
||||
var maintenanceSpecialists = new Users.Entities.Group((int)Users.Grp.GID.MaintenanceSpecialists, Strings.Maintenance_Specialist);
|
||||
var metrologists = new Users.Entities.Group((int)Users.Grp.GID.Metrologists, Strings.Metrologist);
|
||||
var calibrationSpecialists = new Users.Entities.Group((int)Users.Grp.GID.CalibrationSpecialists, Strings.Calibration_Specialist);
|
||||
var administrators = new Users.Entities.Group((int)Users.Grp.GID.Administrators, Strings.Administrator);
|
||||
|
||||
/// Create the user 'admin' add his groups
|
||||
var admin = new Users.Entities.User
|
||||
{
|
||||
UserName = Data.AdminUsername,
|
||||
FullName = Strings.Administrator,
|
||||
LastPwChange = DateTime.Now
|
||||
};
|
||||
admin.SetPassword(Data.AdminPassword);
|
||||
admin.AddGroup(testers);
|
||||
admin.AddGroup(testingSpecialists);
|
||||
admin.AddGroup(headOfLab);
|
||||
admin.AddGroup(maintenanceSpecialists);
|
||||
admin.AddGroup(metrologists);
|
||||
admin.AddGroup(calibrationSpecialists);
|
||||
admin.AddGroup(administrators);
|
||||
|
||||
session.SaveOrUpdate(admin);
|
||||
|
||||
///// Create the control board component
|
||||
//var cmpnt = (new BenchControl.Elde.ControlBoardCfg(new BenchControl.Elde.ControlBoardFactory())).CreateDbEntity();
|
||||
//session.SaveOrUpdate(cmpnt);
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create an empty water meters database
|
||||
/// </summary>
|
||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||
/// <param name="connectionString">Connection string</param>
|
||||
/// <returns>true=success, false=error</returns>
|
||||
public static bool CreateEmptyResultsDB(Users.Entities.DBType dbType, string connectionString)
|
||||
{
|
||||
ISessionFactory sessionFactory = CreateSessionFactory(Users.Entities.DBKind.Results, dbType, connectionString, true);
|
||||
if (sessionFactory == null) return false;
|
||||
|
||||
/// Populate the database
|
||||
//using (var session = sessionFactory.OpenSession())
|
||||
//{
|
||||
// using (var transaction = session.BeginTransaction())
|
||||
// {
|
||||
// /// Create one component
|
||||
// var cmpnt = (new BenchControl.Elde.ControlBoardCfg("CB", 1)).CreateDbEntity();
|
||||
// session.SaveOrUpdate(cmpnt);
|
||||
// transaction.Commit();
|
||||
// }
|
||||
//}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class BenchPathMap : ClassMap<BenchPath>
|
||||
{
|
||||
public BenchPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.TempMtrUp).Column("TempIn");
|
||||
Map(x => x.TempMtrDown).Column("TempOut");
|
||||
Map(x => x.PressMtrUp).Column("PressIn");
|
||||
Map(x => x.PressMtrDown).Column("PressOut");
|
||||
Map(x => x.PressMtrDelta);
|
||||
Map(x => x.StopBFValve);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
Map(x => x.ValvesClose)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentMap : ClassMap<Component>
|
||||
{
|
||||
public ComponentMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.ClassName);
|
||||
Map(x => x.ParentName);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Mode);
|
||||
Map(x => x.Logging);
|
||||
Map(x => x.Parameters)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
HasMany(x => x.Corrections)
|
||||
.OrderBy("Measurement")
|
||||
.Cascade.All();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentProcedureMap : ClassMap<ComponentProcedure>
|
||||
{
|
||||
public ComponentProcedureMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.CmpntName);
|
||||
Map(x => x.Parameters)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
|
||||
References(x => x.Procedure);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ComponentTestMap : ClassMap<ComponentTest>
|
||||
{
|
||||
public ComponentTestMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.CmpntName);
|
||||
Map(x => x.Parameters)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
|
||||
References(x => x.Test);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class FeedingPathMap : ClassMap<FeedingPath>
|
||||
{
|
||||
public FeedingPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.Pump);
|
||||
Map(x => x.RegulValvesPct);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
Map(x => x.ValvesClose)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class GroupMap : ClassMap<Entities.Group>
|
||||
{
|
||||
public GroupMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Gid);
|
||||
Map(x => x.Name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2016 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
#if HEAT_METERS
|
||||
class HeatMetersPathMap : ClassMap<HeatMetersPath>
|
||||
{
|
||||
public HeatMetersPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
|
||||
Map(x => x.TempWarmFrom);
|
||||
Map(x => x.TempWarmTo);
|
||||
Map(x => x.TempColdFrom);
|
||||
Map(x => x.TempColdTo);
|
||||
|
||||
Map(x => x.TMeterRefWarm1);
|
||||
Map(x => x.TMeterRefWarm2);
|
||||
Map(x => x.TMeterRefCold1);
|
||||
Map(x => x.TMeterRefCold2);
|
||||
|
||||
Map(x => x.TMeterWorkWarm1);
|
||||
Map(x => x.TMeterWorkWarm2);
|
||||
Map(x => x.TMeterWorkCold1);
|
||||
Map(x => x.TMeterWorkCold2);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class MeasurementCorrectionMap : ClassMap<MeasurementCorrection>
|
||||
{
|
||||
public MeasurementCorrectionMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Measurement);
|
||||
Map(x => x.Correction);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class MeterTestResultMap : ClassMap<MeterTestResult>
|
||||
{
|
||||
public MeterTestResultMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
References(x => x.TestResult);
|
||||
Map(x => x.Disabled);
|
||||
Map(x => x.SerialNr);
|
||||
Map(x => x.EndState);
|
||||
Map(x => x.VolumeStart);
|
||||
Map(x => x.VolumeEnd);
|
||||
Map(x => x.VolumeMeter);
|
||||
Map(x => x.VolumeRef);
|
||||
Map(x => x.VolumeErrorPct);
|
||||
Map(x => x.PulsesMeter);
|
||||
Map(x => x.PulsesPerLiter);
|
||||
Map(x => x.PulsesMaster);
|
||||
Map(x => x.Time);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class MetersPathMap : ClassMap<MetersPath>
|
||||
{
|
||||
public MetersPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
|
||||
#pragma warning disable
|
||||
if (Config.Data.WMsCount >= 1) Map(x => x.Sensor1);
|
||||
if (Config.Data.WMsCount >= 2) Map(x => x.Sensor2);
|
||||
if (Config.Data.WMsCount >= 3) Map(x => x.Sensor3);
|
||||
if (Config.Data.WMsCount >= 4) Map(x => x.Sensor4);
|
||||
if (Config.Data.WMsCount >= 5) Map(x => x.Sensor5);
|
||||
if (Config.Data.WMsCount >= 6) Map(x => x.Sensor6);
|
||||
if (Config.Data.WMsCount >= 7) Map(x => x.Sensor7);
|
||||
if (Config.Data.WMsCount >= 8) Map(x => x.Sensor8);
|
||||
if (Config.Data.WMsCount >= 9) Map(x => x.Sensor9);
|
||||
if (Config.Data.WMsCount >= 10) Map(x => x.Sensor10);
|
||||
if (Config.Data.WMsCount >= 11) Map(x => x.Sensor11);
|
||||
if (Config.Data.WMsCount >= 12) Map(x => x.Sensor12);
|
||||
if (Config.Data.WMsCount >= 13) Map(x => x.Sensor13);
|
||||
if (Config.Data.WMsCount >= 14) Map(x => x.Sensor14);
|
||||
if (Config.Data.WMsCount >= 15) Map(x => x.Sensor15);
|
||||
if (Config.Data.WMsCount >= 16) Map(x => x.Sensor16);
|
||||
if (Config.Data.WMsCount >= 17) Map(x => x.Sensor17);
|
||||
if (Config.Data.WMsCount >= 18) Map(x => x.Sensor18);
|
||||
if (Config.Data.WMsCount >= 19) Map(x => x.Sensor19);
|
||||
if (Config.Data.WMsCount >= 20) Map(x => x.Sensor20);
|
||||
if (Config.Data.WMsCount >= 21) Map(x => x.Sensor21);
|
||||
if (Config.Data.WMsCount >= 22) Map(x => x.Sensor22);
|
||||
if (Config.Data.WMsCount >= 23) Map(x => x.Sensor23);
|
||||
if (Config.Data.WMsCount >= 24) Map(x => x.Sensor24);
|
||||
if (Config.Data.WMsCount >= 25) Map(x => x.Sensor25);
|
||||
if (Config.Data.WMsCount >= 26) Map(x => x.Sensor26);
|
||||
if (Config.Data.WMsCount >= 27) Map(x => x.Sensor27);
|
||||
if (Config.Data.WMsCount >= 28) Map(x => x.Sensor28);
|
||||
if (Config.Data.WMsCount >= 29) Map(x => x.Sensor29);
|
||||
if (Config.Data.WMsCount >= 30) Map(x => x.Sensor30);
|
||||
if (Config.Data.WMsCount >= 31) Map(x => x.Sensor31);
|
||||
if (Config.Data.WMsCount >= 32) Map(x => x.Sensor32);
|
||||
if (Config.Data.WMsCount >= 33) Map(x => x.Sensor33);
|
||||
if (Config.Data.WMsCount >= 34) Map(x => x.Sensor34);
|
||||
if (Config.Data.WMsCount >= 35) Map(x => x.Sensor35);
|
||||
if (Config.Data.WMsCount >= 36) Map(x => x.Sensor36);
|
||||
if (Config.Data.WMsCount >= 37) Map(x => x.Sensor37);
|
||||
if (Config.Data.WMsCount >= 38) Map(x => x.Sensor38);
|
||||
if (Config.Data.WMsCount >= 39) Map(x => x.Sensor39);
|
||||
if (Config.Data.WMsCount >= 40) Map(x => x.Sensor40);
|
||||
#pragma warning restore
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class OutputPathMap : ClassMap<OutputPath>
|
||||
{
|
||||
public OutputPathMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.RegulValve);
|
||||
Map(x => x.FlowMeter);
|
||||
Map(x => x.PidCoef);
|
||||
Map(x => x.StartValve);
|
||||
Map(x => x.Diverter);
|
||||
Map(x => x.TempDiv);
|
||||
Map(x => x.Balance);
|
||||
Map(x => x.EmptyTankValve);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
Map(x => x.ValvesClose)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class ProcedureMap : ClassMap<Procedure>
|
||||
{
|
||||
public ProcedureMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
|
||||
Map(x => x.Description);
|
||||
Map(x => x.CreationUser);
|
||||
Map(x => x.CreationTime);
|
||||
Map(x => x.LastChgUser);
|
||||
Map(x => x.LastChgTime);
|
||||
Map(x => x.LongDescription);
|
||||
|
||||
Map(x => x.ProcedureState);
|
||||
Map(x => x.Revision);
|
||||
Map(x => x.PredecessorId);
|
||||
Map(x => x.ObtainedByCopy);
|
||||
|
||||
Map(x => x.MetersKind);
|
||||
Map(x => x.Watermeters);
|
||||
Map(x => x.ProtocolTitle);
|
||||
Map(x => x.DataEntry);
|
||||
Map(x => x.ResultsPrinter);
|
||||
Map(x => x.ResultsWriter);
|
||||
Map(x => x.TransitionStart);
|
||||
Map(x => x.TransitionEnd);
|
||||
////Map(x => x.MetrologicalClass);
|
||||
////HasOne(x => x.WMType);
|
||||
HasMany(x => x.MoreParams)
|
||||
.Cascade.All();
|
||||
HasMany(x => x.Tests)
|
||||
.OrderBy("ItemNr")
|
||||
.Cascade.All();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
/// Author: Milan Hanajik
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TestMap : ClassMap<Test>
|
||||
{
|
||||
public TestMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Part);
|
||||
Map(x => x.Publish);
|
||||
Map(x => x.Evaluate);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.Volume);
|
||||
Map(x => x.TstTime);
|
||||
Map(x => x.Repeats);
|
||||
Map(x => x.Emptying);
|
||||
Map(x => x.Zeroing);
|
||||
Map(x => x.PumpPower);
|
||||
Map(x => x.MassRepeats);
|
||||
Map(x => x.MassSpread);
|
||||
Map(x => x.MassMethod)
|
||||
.CustomType<byte>();
|
||||
Map(x => x.TimeBeforeFlow);
|
||||
Map(x => x.TimeFlow2Mass);
|
||||
Map(x => x.TimePump2StartV)
|
||||
.Column("TimeMass2Start");
|
||||
Map(x => x.TimeStop2Mass);
|
||||
Map(x => x.Method);
|
||||
Map(x => x.ErrLimLo);
|
||||
Map(x => x.ErrLimHi);
|
||||
Map(x => x.Uncertainty);
|
||||
Map(x => x.TolerRed)
|
||||
.Column("TolerRed"); /// ???
|
||||
Map(x => x.RedType); /// ???
|
||||
Map(x => x.FeedingPath);
|
||||
Map(x => x.BenchPath);
|
||||
Map(x => x.OutputPath);
|
||||
Map(x => x.MetersPath);
|
||||
#if HEAT_METERS
|
||||
Map(x => x.HeatMetersPath);
|
||||
#endif
|
||||
Map(x => x.RelTransBefore);
|
||||
Map(x => x.RelTransBetween);
|
||||
Map(x => x.RelTransAfter);
|
||||
Map(x => x.TransitionAfter);
|
||||
HasMany(x => x.MoreParams)
|
||||
.Cascade.All();
|
||||
References(x => x.Procedure);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TestResultMap : ClassMap<TestResult>
|
||||
{
|
||||
public TestResultMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.BatchNr);
|
||||
Map(x => x.PurchaseOrder);
|
||||
Map(x => x.MetersKind);
|
||||
HasMany(x => x.Meters)
|
||||
.Cascade.All();
|
||||
HasMany(x => x.CombinedMeters)
|
||||
.Cascade.All();
|
||||
|
||||
Map(x => x.ProcedureName);
|
||||
Map(x => x.ProtocolTitle);
|
||||
|
||||
Map(x => x.TestId);
|
||||
Map(x => x.TestName);
|
||||
Map(x => x.Part);
|
||||
Map(x => x.Qfrom);
|
||||
Map(x => x.Qto);
|
||||
Map(x => x.Volume);
|
||||
Map(x => x.TstTime);
|
||||
Map(x => x.Repeats);
|
||||
Map(x => x.Emptying);
|
||||
Map(x => x.Zeroing);
|
||||
Map(x => x.PumpPower);
|
||||
Map(x => x.Time2MassMsrmt);
|
||||
Map(x => x.Method);
|
||||
Map(x => x.ErrLimLo);
|
||||
Map(x => x.ErrLimHi);
|
||||
Map(x => x.Uncertainty);
|
||||
|
||||
Map(x => x.FeedingPath)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(4000)");
|
||||
Map(x => x.BenchPath)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(4000)");
|
||||
Map(x => x.OutputPath)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(4000)");
|
||||
Map(x => x.MetersPath)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(4000)");
|
||||
|
||||
Map(x => x.TimeStart);
|
||||
Map(x => x.TimeEnd);
|
||||
Map(x => x.RepetitionNr);
|
||||
Map(x => x.AmbientTempAve);
|
||||
Map(x => x.AmbientPressAve);
|
||||
Map(x => x.AmbientHumiAve);
|
||||
Map(x => x.PressInAvrg);
|
||||
Map(x => x.PressInStart);
|
||||
Map(x => x.PressInEnd);
|
||||
Map(x => x.PressOutAvrg);
|
||||
Map(x => x.PressOutStart);
|
||||
Map(x => x.PressOutEnd);
|
||||
Map(x => x.TempInAvrg);
|
||||
Map(x => x.TempInStart);
|
||||
Map(x => x.TempInEnd);
|
||||
Map(x => x.TempOutAvrg);
|
||||
Map(x => x.TempOutStart);
|
||||
Map(x => x.TempOutEnd);
|
||||
Map(x => x.TempDivAvrg);
|
||||
Map(x => x.TempDivStart);
|
||||
Map(x => x.TempDivEnd);
|
||||
Map(x => x.MassStartRaw);
|
||||
Map(x => x.MassStart);
|
||||
Map(x => x.MassEndRaw);
|
||||
Map(x => x.MassEnd);
|
||||
Map(x => x.MassDiff);
|
||||
Map(x => x.DensityIn);
|
||||
Map(x => x.DensityOut);
|
||||
Map(x => x.DensityDiv);
|
||||
Map(x => x.FlowMass); /// from conventional true value
|
||||
Map(x => x.FlowVolume); /// from conventional true value
|
||||
Map(x => x.VolumeCTV); /// volume conventional true value
|
||||
Map(x => x.VolumeMaster); /// volume from the master flow meter
|
||||
Map(x => x.Time); /// measurement time in seconds
|
||||
Map(x => x.ErrorMaster);
|
||||
Map(x => x.PulsesMaster);
|
||||
Map(x => x.ConstMaster); /// Pulses per liter master flow meter
|
||||
Map(x => x.QRise);
|
||||
Map(x => x.QFall);
|
||||
Map(x => x.TimeDivStart0);
|
||||
Map(x => x.TimeDivStart1);
|
||||
Map(x => x.TimeDivStart2);
|
||||
Map(x => x.TimeDivStart3);
|
||||
Map(x => x.TimeDivStart4);
|
||||
Map(x => x.TimeDivStart5);
|
||||
Map(x => x.TimeDivEnd0);
|
||||
Map(x => x.TimeDivEnd1);
|
||||
Map(x => x.TimeDivEnd2);
|
||||
Map(x => x.TimeDivEnd3);
|
||||
Map(x => x.TimeDivEnd4);
|
||||
Map(x => x.TimeDivEnd5);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TransitionSequenceMap : ClassMap<TransitionSequence>
|
||||
{
|
||||
public TransitionSequenceMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Description);
|
||||
HasMany(x => x.TransitionSteps)
|
||||
.OrderBy("ItemNr")
|
||||
.Cascade.All();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class TransitionStepMap : ClassMap<TransitionStep>
|
||||
{
|
||||
public TransitionStepMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Duration);
|
||||
Map(x => x.Message);
|
||||
Map(x => x.EndCondition);
|
||||
Map(x => x.ValvesOpen)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
Map(x => x.ValvesClose)
|
||||
.CustomType("StringClob")
|
||||
.CustomSqlType("varchar(8000)");
|
||||
Map(x => x.RegulValvesPct);
|
||||
Map(x => x.PumpWithFMPcts);
|
||||
|
||||
References(x => x.TransitionSequence);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class UserMap : ClassMap<Entities.User>
|
||||
{
|
||||
public UserMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.UserName).Column("Name");
|
||||
Map(x => x.Number);
|
||||
Map(x => x.Password);
|
||||
Map(x => x.FullName).Column("Description");
|
||||
Map(x => x.LastPwChange);
|
||||
HasMany(x => x.Groups)
|
||||
.Cascade.All();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class VirtualBenchSequenceMap : ClassMap<VirtualBenchSequence>
|
||||
{
|
||||
public VirtualBenchSequenceMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.Description);
|
||||
HasMany(x => x.VirtualBenchSteps)
|
||||
.OrderBy("ItemNr")
|
||||
.Cascade.All();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class VirtualBenchStepMap : ClassMap<VirtualBenchStep>
|
||||
{
|
||||
public VirtualBenchStepMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.ItemNr);
|
||||
Map(x => x.Duration);
|
||||
|
||||
References(x => x.VirtualBenchSequence);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class WMTypeMap : ClassMap<Entities.WMType>
|
||||
{
|
||||
public WMTypeMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.CreateTime);
|
||||
Map(x => x.CreateUserName);
|
||||
Map(x => x.CreateDescription);
|
||||
Map(x => x.Name);
|
||||
Map(x => x.PulseRate);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2015 Sensus Metering Systems
|
||||
///
|
||||
using FluentNHibernate.Mapping;
|
||||
|
||||
namespace Config.Mappings
|
||||
{
|
||||
class WatermeterMap : ClassMap<Entities.Watermeter>
|
||||
{
|
||||
public WatermeterMap()
|
||||
{
|
||||
Id(x => x.Id);
|
||||
Map(x => x.Serial);
|
||||
// HasOne(x => x.WMType)
|
||||
// .Cascade.All();
|
||||
References(x => x.WMType);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Config")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Sensus")]
|
||||
[assembly: AssemblyProduct("Config")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2013 - 2016 Sensus Slovensko a.s.")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("3fc3ff67-7386-4aff-9855-bef33d5fa0d3")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("2.12.499.0")]
|
||||
[assembly: AssemblyFileVersion("2.12.499.0")]
|
||||
Generated
-164
@@ -1,164 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace Config.Resources {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Strings {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Strings() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Config.Resources.Strings", typeof(Strings).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Administrator.
|
||||
/// </summary>
|
||||
internal static string Administrator {
|
||||
get {
|
||||
return ResourceManager.GetString("Administrator", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Calibration Specialist.
|
||||
/// </summary>
|
||||
internal static string Calibration_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Calibration_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Cannot open DB Cause 0.
|
||||
/// </summary>
|
||||
internal static string Cannot_open_DB_Cause_0 {
|
||||
get {
|
||||
return ResourceManager.GetString("Cannot_open_DB_Cause_0", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Error.
|
||||
/// </summary>
|
||||
internal static string Error
|
||||
{
|
||||
get
|
||||
{
|
||||
return ResourceManager.GetString("Error", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Failed.
|
||||
/// </summary>
|
||||
internal static string Failed {
|
||||
get {
|
||||
return ResourceManager.GetString("Failed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Head of Lab.
|
||||
/// </summary>
|
||||
internal static string Head_of_Lab {
|
||||
get {
|
||||
return ResourceManager.GetString("Head_of_Lab", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Maintenance Specialist.
|
||||
/// </summary>
|
||||
internal static string Maintenance_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Maintenance_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Metrologist.
|
||||
/// </summary>
|
||||
internal static string Metrologist {
|
||||
get {
|
||||
return ResourceManager.GetString("Metrologist", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Passed.
|
||||
/// </summary>
|
||||
internal static string Passed {
|
||||
get {
|
||||
return ResourceManager.GetString("Passed", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Tester.
|
||||
/// </summary>
|
||||
internal static string Tester {
|
||||
get {
|
||||
return ResourceManager.GetString("Tester", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Testing Specialist.
|
||||
/// </summary>
|
||||
internal static string Testing_Specialist {
|
||||
get {
|
||||
return ResourceManager.GetString("Testing_Specialist", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
<?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="Error" xml:space="preserve">
|
||||
<value>Chyba</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,153 +0,0 @@
|
||||
<?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="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Kalibriertechniker</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Laborleiter</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Wartungstechniker</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Messtechniker</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Prüfer</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Prüftechniker</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NiO</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>iO</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Fehler</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Datenbank kann nicht geöffnet.\\r\\nUrsache:\\r\\n{0}</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,153 +0,0 @@
|
||||
<?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="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Specjalista ds. kalibracji</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Kierownik Laboratorium</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Konserwator</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Metrolog</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Pracownik przeprowadzający testy</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Specjalista ds. testów</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>Niepowodzenie</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Nie można otworzyć \\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Błąd</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,153 +0,0 @@
|
||||
<?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="Administrator" xml:space="preserve">
|
||||
<value>Administrator</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Calibration Specialist</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Head of Lab</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Maintenance Specialist</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Metrologist</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Tester</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Testing Specialist</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Cannot open database.\\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Error</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,153 +0,0 @@
|
||||
<?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="Administrator" xml:space="preserve">
|
||||
<value>Администратор</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>Специалист по калибровке</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>Руководитель лаборатории</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>Специалист по техобслуживанию</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>Метролог</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>Контролер</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>Специалист по тестированию</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>OK</value>
|
||||
</data>
|
||||
<data name="Cannot_open_DB_Cause_0" xml:space="preserve">
|
||||
<value>Не удается открыть БД.\\r\\nCause:\\r\\n{0}</value>
|
||||
</data>
|
||||
<data name="Error" xml:space="preserve">
|
||||
<value>Ошибка</value>
|
||||
</data>
|
||||
</root>
|
||||
@@ -1,128 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 1.3
|
||||
|
||||
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">1.3</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1">this is my long string</data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
[base64 mime encoded serialized .NET Framework object]
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
[base64 mime encoded string representing a byte array form of the .NET Framework object]
|
||||
</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.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:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<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" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</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>1.3</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Administrator" xml:space="preserve">
|
||||
<value>管理员</value>
|
||||
</data>
|
||||
<data name="Calibration_Specialist" xml:space="preserve">
|
||||
<value>校准专员</value>
|
||||
</data>
|
||||
<data name="Failed" xml:space="preserve">
|
||||
<value>NOK</value>
|
||||
</data>
|
||||
<data name="Head_of_Lab" xml:space="preserve">
|
||||
<value>实验室负责人</value>
|
||||
</data>
|
||||
<data name="Maintenance_Specialist" xml:space="preserve">
|
||||
<value>维护专员</value>
|
||||
</data>
|
||||
<data name="Metrologist" xml:space="preserve">
|
||||
<value>计量者</value>
|
||||
</data>
|
||||
<data name="Passed" xml:space="preserve">
|
||||
<value>好</value>
|
||||
</data>
|
||||
<data name="Tester" xml:space="preserve">
|
||||
<value>测试仪</value>
|
||||
</data>
|
||||
<data name="Testing_Specialist" xml:space="preserve">
|
||||
<value>测试专员</value>
|
||||
</data>
|
||||
</root>
|
||||
-399
@@ -1,399 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2016 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using Config.Entities;
|
||||
|
||||
namespace Config
|
||||
{
|
||||
public enum Unit
|
||||
{
|
||||
[Description("---")] None,
|
||||
|
||||
[Description("l")] l, /// * 1 liter
|
||||
[Description("m3")] m3, /// 1000 l
|
||||
[Description("gal(UK)")] gal_UK, /// 1 gal(UK) = 4.54609 l
|
||||
[Description("gal(US)")] gal_US, /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
[Description("l/h")] lph, /// 1 liter/h
|
||||
[Description("m3/h")] m3ph, /// * 1 m3/h = 1000 l/h
|
||||
|
||||
[Description("g")] g, /// 0.001 kg
|
||||
[Description("kg")] kg, /// * 1 kilogram
|
||||
[Description("t")] t, /// 1000 kg
|
||||
[Description("lb")] lb, /// 0.45359237 kg
|
||||
|
||||
[Description("s")] s, /// * 1 second
|
||||
[Description("min")] min, /// 1 min = 60 s
|
||||
[Description("hr")] hour, /// 1 hour = 60 min = 3600 s
|
||||
[Description("ms")] ms, /// 1 ms = 0.001 s
|
||||
|
||||
[Description("°C")] C, /// * degree Celsius
|
||||
[Description("°F")] F, /// degree Fahrenheit
|
||||
[Description("K")] K, /// degree Kelvin
|
||||
|
||||
[Description("Pa")] Pa, /// 1 Pa = 0.01 hPa
|
||||
[Description("hPa")] hPa, /// 1 hPa = 100 Pa
|
||||
[Description("kPa")] kPa, /// 1 kPa = 10 HPa
|
||||
[Description("MPa")] MPa, /// 1 MPa = 10000 hPa
|
||||
[Description("mbar")] mbar, /// 1 mbar = 1 hPa = 100 Pa
|
||||
[Description("bar")] bar, /// * 1 Bar = 1000 mbar = 0.1 MPa = 100000 Pa
|
||||
[Description("inHg")] inHg, /// 1 inHg = 33.864 hPa
|
||||
|
||||
[Description("R%")] RPct, /// * 1 R%
|
||||
|
||||
[Description("%")] Pct, /// * 1 %
|
||||
[Description("promile")] Promile, /// 1 promile = 0.1 %
|
||||
|
||||
[Description("mm")] mm, /// * 1 millimeter
|
||||
[Description("cm")] cm, /// 1 cm = 10 mm
|
||||
[Description("m")] m, /// 1 m = 1000 mm
|
||||
[Description("in")] inch, /// 1 inch = 25.4 mm
|
||||
|
||||
[Description("kg/m3")] kgpm3, /// * 1 kg/m3 = 0.001 kg/l
|
||||
[Description("kg/l")] kgpl, /// 1 kg/l = 1000 kg/m3
|
||||
|
||||
[Description("J")] J, /// * 1 Joul
|
||||
[Description("kJ")] kJ, /// 1 kJ = 1000 J
|
||||
[Description("MJ")] MJ, /// 1 MJ = 1000000 J
|
||||
[Description("Wh")] Wh, /// 1 Wh = 3600 J
|
||||
[Description("kWh")] kWh, /// 1 kWh = 3600000 J
|
||||
[Description("MWh")] MWh, /// 1 MWh = 3600000000 J
|
||||
|
||||
[Description("pulse/l")] ppl, /// * 1 pulse/l
|
||||
///
|
||||
[Description("pulse/kWh")] ppkWh, /// * 1 pulse/kWh
|
||||
|
||||
Count
|
||||
}
|
||||
|
||||
public enum Quantity
|
||||
{
|
||||
/// Quantities with units and conversions (double -> double)
|
||||
#if LANG_DE
|
||||
[Description("Volumen")] Volume,
|
||||
[Description("Durchfluss")] Flow,
|
||||
[Description("Masse")] Mass,
|
||||
[Description("Zeit")] Time,
|
||||
[Description("Temperatur")] Temperature,
|
||||
[Description("Druck")] Pressure,
|
||||
[Description("Feuchtigkeit")] Humidity,
|
||||
[Description("Fehler")] Error,
|
||||
[Description("Länge")] Length,
|
||||
[Description("Dichte")] Density,
|
||||
[Description("Energie")] Energy,
|
||||
[Description("Impulse/l")] PulsePerLtr,
|
||||
[Description("Impulse/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Nummer")] Number,
|
||||
[Description("Text")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Datum und Uhrzeit")] DateTime,
|
||||
#elif LANG_PL
|
||||
[Description("Objętość")] Volume,
|
||||
[Description("Przepływ")] Flow,
|
||||
[Description("Masa")] Mass,
|
||||
[Description("Czas")] Time,
|
||||
[Description("Temperatura")] Temperature,
|
||||
[Description("Ciśnienie")] Pressure,
|
||||
[Description("Wilgotność")] Humidity,
|
||||
[Description("Błąd")] Error,
|
||||
[Description("Długość")] Length,
|
||||
[Description("Gęstość")] Density,
|
||||
[Description("Energia")] Energy,
|
||||
[Description("Impulsy/litr")] PulsePerLtr,
|
||||
[Description("Impulsy/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Numer")] Number,
|
||||
[Description("Tekst")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Data i czas")] DateTime,
|
||||
#elif LANG_CS
|
||||
[Description("Objem")] Volume,
|
||||
[Description("Průtok")] Flow,
|
||||
[Description("Hmotnost")] Mass,
|
||||
[Description("Čas")] Time,
|
||||
[Description("Teplota")] Temperature,
|
||||
[Description("Tlak")] Pressure,
|
||||
[Description("Vlhkost")] Humidity,
|
||||
[Description("Chyba")] Error,
|
||||
[Description("Délka")] Length,
|
||||
[Description("Hustota")] Density,
|
||||
[Description("Energie")] Energy,
|
||||
[Description("Pulzy/litr")] PulsePerLtr,
|
||||
[Description("Pulzy/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Počet")] Number,
|
||||
[Description("Text")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Datum a čas")] DateTime,
|
||||
#else
|
||||
[Description("Volume")] Volume,
|
||||
[Description("Flow")] Flow,
|
||||
[Description("Mass")] Mass,
|
||||
[Description("Time")] Time,
|
||||
[Description("Temperature")] Temperature,
|
||||
[Description("Pressure")] Pressure,
|
||||
[Description("Humidity")] Humidity,
|
||||
[Description("Error")] Error,
|
||||
[Description("Length")] Length,
|
||||
[Description("Density")] Density,
|
||||
[Description("Energy")] Energy,
|
||||
[Description("Pulses/liter")] PulsePerLtr,
|
||||
[Description("Pulses/kWh")] PulsePerKWh,
|
||||
|
||||
/// Quantities without units and conversions
|
||||
[Description("Number")] Number,
|
||||
[Description("String")] String,
|
||||
[Description("Boolean")] Boolean,
|
||||
[Description("Date and time")] DateTime,
|
||||
#endif
|
||||
Count,
|
||||
}
|
||||
|
||||
public static class Units
|
||||
{
|
||||
public static bool IsUnitless(Quantity quantity)
|
||||
{
|
||||
return quantity >= Quantity.Number;
|
||||
}
|
||||
|
||||
public static bool IsDefaultUnit(Unit unit)
|
||||
{
|
||||
return unit == Unit.l || unit == Unit.m3ph || unit == Unit.kg || unit == Unit.s || unit == Unit.C || unit == Unit.bar || unit == Unit.RPct ||
|
||||
unit == Unit.Pct || unit == Unit.mm || unit == Unit.kgpm3 || unit == Unit.J || unit == Unit.ppl || unit == Unit.ppkWh;
|
||||
}
|
||||
|
||||
public static bool IsQuantity(Unit units, Quantity quantity)
|
||||
{
|
||||
return (quantity == GetQuantity(units));
|
||||
}
|
||||
|
||||
public static Quantity GetQuantity(Unit units)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
case Unit.l:
|
||||
case Unit.m3:
|
||||
case Unit.gal_UK:
|
||||
case Unit.gal_US:
|
||||
return Config.Quantity.Volume;
|
||||
|
||||
case Unit.lph:
|
||||
case Unit.m3ph:
|
||||
return Config.Quantity.Flow;
|
||||
|
||||
case Unit.g:
|
||||
case Unit.kg:
|
||||
case Unit.t:
|
||||
case Unit.lb:
|
||||
return Config.Quantity.Mass;
|
||||
|
||||
case Unit.s:
|
||||
case Unit.min:
|
||||
case Unit.hour:
|
||||
case Unit.ms:
|
||||
return Config.Quantity.Time;
|
||||
|
||||
case Unit.C:
|
||||
case Unit.F:
|
||||
case Unit.K:
|
||||
return Config.Quantity.Temperature;
|
||||
|
||||
case Unit.Pa:
|
||||
case Unit.hPa:
|
||||
case Unit.mbar:
|
||||
case Unit.kPa:
|
||||
case Unit.bar:
|
||||
case Unit.MPa:
|
||||
case Unit.inHg:
|
||||
return Config.Quantity.Pressure;
|
||||
|
||||
case Unit.RPct:
|
||||
return Config.Quantity.Humidity;
|
||||
|
||||
case Unit.Pct:
|
||||
case Unit.Promile:
|
||||
return Config.Quantity.Error;
|
||||
|
||||
case Unit.mm:
|
||||
case Unit.cm:
|
||||
case Unit.m:
|
||||
case Unit.inch:
|
||||
return Config.Quantity.Length;
|
||||
|
||||
case Unit.kgpm3:
|
||||
case Unit.kgpl:
|
||||
return Config.Quantity.Density;
|
||||
|
||||
case Unit.J:
|
||||
case Unit.kJ:
|
||||
case Unit.MJ:
|
||||
case Unit.Wh:
|
||||
case Unit.kWh:
|
||||
case Unit.MWh:
|
||||
return Config.Quantity.Energy;
|
||||
|
||||
case Unit.ppl:
|
||||
return Config.Quantity.PulsePerLtr;
|
||||
|
||||
case Unit.ppkWh:
|
||||
return Config.Quantity.PulsePerKWh;
|
||||
|
||||
default:
|
||||
return Config.Quantity.Number;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsVolume(Unit units) { return IsQuantity(units, Config.Quantity.Volume); }
|
||||
public static bool IsFlow(Unit units) { return IsQuantity(units, Config.Quantity.Flow); }
|
||||
public static bool IsMass(Unit units) { return IsQuantity(units, Config.Quantity.Mass); }
|
||||
public static bool IsTime(Unit units) { return IsQuantity(units, Config.Quantity.Time); }
|
||||
public static bool IsTemperature(Unit units) { return IsQuantity(units, Config.Quantity.Temperature); }
|
||||
public static bool IsPressure(Unit units) { return IsQuantity(units, Config.Quantity.Pressure); }
|
||||
public static bool IsHumidity(Unit units) { return IsQuantity(units, Config.Quantity.Humidity); }
|
||||
public static bool IsError(Unit units) { return IsQuantity(units, Config.Quantity.Error); }
|
||||
public static bool IsLength(Unit units) { return IsQuantity(units, Config.Quantity.Length); }
|
||||
public static bool IsDensity(Unit units) { return IsQuantity(units, Config.Quantity.Density); }
|
||||
public static bool IsEnergy(Unit units) { return IsQuantity(units, Config.Quantity.Energy); }
|
||||
public static bool IsPulsePerLtr(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerLtr); }
|
||||
public static bool IsPulsePerKWh(Unit units) { return IsQuantity(units, Config.Quantity.PulsePerKWh); }
|
||||
|
||||
|
||||
public static double ConvertTo(Unit units, double v)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
/// Volume: internal representation in l
|
||||
case Unit.l: return v; /// 1 liter
|
||||
case Unit.m3: return 0.001 * v; /// 1 m3 = 1000 l
|
||||
case Unit.gal_UK: return 0.21996925 * v; /// 1 gal(UK) = 4.54609 l
|
||||
case Unit.gal_US: return 0.26417205 * v; /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
/// Flow: internal representation in m3/h
|
||||
case Unit.lph: return 1000 * v; /// 1 liter/h
|
||||
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
|
||||
|
||||
/// Mass: internal representation in kg
|
||||
case Unit.g: return 1000 * v; /// 1 g = 0.001 kg
|
||||
case Unit.kg: return v; /// 1 kilogram
|
||||
case Unit.t: return 0.001 * v; /// 1 t = 1000 kg
|
||||
case Unit.lb: return 2.2046226 * v; /// 1 lb = 0.45359237 kg
|
||||
|
||||
/// Time or duration: internal representation in seconds [s]
|
||||
case Unit.s: return v;
|
||||
case Unit.min: return v / 60;
|
||||
case Unit.hour: return v / 3600;
|
||||
case Unit.ms: return 1000 * v;
|
||||
|
||||
/// Temperature: internal representation in degree C
|
||||
case Unit.C: return v; /// degree Celsius
|
||||
case Unit.F: return 1.8 * v + 32; /// degree Fahrenheit
|
||||
case Unit.K: return v + 273.15; /// degree Kelvin
|
||||
|
||||
/// Pressure: internal representation in bar = 0.1 MPa
|
||||
case Unit.Pa: return 100000 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.hPa: return 1000 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.mbar: return 1000 * v; /// 1 mbar = 1 hPa = 100 Pa
|
||||
case Unit.kPa: return 100 * v; /// 1 kPa = 10 HPa
|
||||
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
|
||||
case Unit.MPa: return 0.1 * v; /// 1 MPa = 10000 hPa
|
||||
case Unit.inHg: return 29.53 * v; /// 1 inHg = 33.864 hPa
|
||||
|
||||
/// Error: internal representation in %
|
||||
case Unit.Pct: return v; /// 1 %
|
||||
case Unit.Promile: return 10 * v; /// 1 promile = 0.1 %
|
||||
|
||||
/// Diameter, length: internal representation in mm
|
||||
case Unit.mm: return v; /// 1 mm
|
||||
case Unit.cm: return 0.1 * v; /// 1 cm = 10 mm
|
||||
case Unit.m: return 0.001 * v; /// 1 m = 1000 mm
|
||||
case Unit.inch: return v / 25.4; /// 1 inch = 25.4 mm
|
||||
|
||||
/// Density: internal representation in kg/m3
|
||||
case Unit.kgpm3: return v;
|
||||
case Unit.kgpl: return 0.001 * v;
|
||||
|
||||
/// Energy, internal representation in Joul
|
||||
case Unit.J: return v; /// 1 Joul
|
||||
case Unit.kJ: return 0.001 * v; /// 1 kJ = 1000 J
|
||||
case Unit.MJ: return 0.000001 * v; /// 1 kJ = 1000000 J
|
||||
case Unit.Wh: return v / 3600.0; /// 1 Wh = 3600 J
|
||||
case Unit.kWh: return v / 3600000.0; /// 1 kWh = 3600000 J
|
||||
case Unit.MWh: return v / 3600000000.0;/// 1 MWh = 3600000000 J
|
||||
|
||||
default: return v;
|
||||
}
|
||||
}
|
||||
|
||||
public static double ConvertFrom(Unit units, double v)
|
||||
{
|
||||
switch (units)
|
||||
{
|
||||
/// Volume: internal representation in l
|
||||
case Unit.l: return v; /// 1 liter
|
||||
case Unit.m3: return 1000 * v; /// 1000 l
|
||||
case Unit.gal_UK: return 4.54609 * v; /// 1 gal(UK) = 4.54609 l
|
||||
case Unit.gal_US: return 3.78541178 * v; /// 1 gal(US) = 3.78541178 l
|
||||
|
||||
/// Flow: internal representation in m3/h
|
||||
case Unit.lph: return 0.001 * v; /// 1 liter/h
|
||||
case Unit.m3ph: return v; /// 1 m3/h = 1000 l/h
|
||||
|
||||
/// Mass: internal representation in kg
|
||||
case Unit.g: return 0.001 * v; /// 1 g = 0.001 kg
|
||||
case Unit.kg: return v; /// 1 kilogram
|
||||
case Unit.t: return 1000 * v; /// 1 t = 1000 kg
|
||||
case Unit.lb: return 0.45359237 * v; /// 1 lb = 0.45359237 kg
|
||||
|
||||
/// Time or duration: internal representation in seconds [s]
|
||||
case Unit.s: return v;
|
||||
case Unit.min: return 60 * v;
|
||||
case Unit.hour: return 3600 * v;
|
||||
case Unit.ms: return v / 1000;
|
||||
|
||||
/// Temperature: internal representation in degree C
|
||||
case Unit.C: return v; /// degree Celsius
|
||||
case Unit.F: return 5 * (v-32) / 9; /// degree Fahrenheit
|
||||
case Unit.K: return v - 273.15; /// degree Kelvin
|
||||
|
||||
/// Pressure: internal representation in bar = 0.1 MPa
|
||||
case Unit.Pa: return 0.00001 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.hPa: return 0.001 * v; /// 1 hPa = 100 Pa
|
||||
case Unit.mbar: return 0.001 * v; /// 1 mbar = 1 hPa = 100 Pa
|
||||
case Unit.kPa: return 0.01 * v; /// 1 kPa = 10 HPa
|
||||
case Unit.bar: return v; /// 1 bar = 1000 mbar = 100000 Pa
|
||||
case Unit.MPa: return 10 * v; /// 1 MPa = 10000 hPa
|
||||
case Unit.inHg: return 0.033864 * v; /// 1 inHg = 33.864 hPa
|
||||
|
||||
/// Error: internal representation in %
|
||||
case Unit.Pct: return v; /// 1 %
|
||||
case Unit.Promile: return 0.1 * v; /// 1 promile = 0.1 %
|
||||
|
||||
/// Diameter, length: internal representation in mm
|
||||
case Unit.mm: return v; /// 1 mm
|
||||
case Unit.cm: return 10 * v; /// 1 cm = 10 mm
|
||||
case Unit.m: return 1000 * v; /// 1 m = 1000 mm
|
||||
case Unit.inch: return 25.4 * v; /// 1 inch = 25.4 mm
|
||||
|
||||
/// Density: internal representation in kg/m3
|
||||
case Unit.kgpm3: return v;
|
||||
case Unit.kgpl: return 1000 * v;
|
||||
|
||||
/// Energy, internal representation in Joul
|
||||
case Unit.J: return v; /// 1 Joul
|
||||
case Unit.kJ: return 1000 * v; /// 1 kJ = 1000 J
|
||||
case Unit.MJ: return 1000000 * v; /// 1 kJ = 1000000 J
|
||||
case Unit.Wh: return 3600 * v; /// 1 Wh = 3600 J
|
||||
case Unit.kWh: return 3600000 * v; /// 1 kWh = 3600000 J
|
||||
case Unit.MWh: return 3600000000 * v; /// 1 kWh = 3600000000 J
|
||||
|
||||
default: return v;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{6D3384DC-4638-4A92-91A8-F39D900377C6}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>DeviceTest</RootNamespace>
|
||||
<AssemblyName>DeviceTest</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile>
|
||||
</TargetFrameworkProfile>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<StartupObject>DeviceTest.Program</StartupObject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\log4net.2.0.2\lib\net40-full\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DeviceTestDlg.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="DeviceTestDlg.Designer.cs">
|
||||
<DependentUpon>DeviceTestDlg.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="LocalSettings.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="DeviceTestDlg.resx">
|
||||
<DependentUpon>DeviceTestDlg.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<None Include="app.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Config\Config.csproj">
|
||||
<Project>{743DF7DB-C7B6-42EB-986D-0F485E5588E4}</Project>
|
||||
<Name>Config</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\TestBenchFramework\TBF.csproj">
|
||||
<Project>{8648FD92-CDA1-4C3A-B5F9-FE547CE1FA48}</Project>
|
||||
<Name>TBF</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
Generated
-584
@@ -1,584 +0,0 @@
|
||||
namespace DeviceTest
|
||||
{
|
||||
partial class DeviceTestDlg
|
||||
{
|
||||
/// <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.parentClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.classLabel = new System.Windows.Forms.Label();
|
||||
this.nameLabel = new System.Windows.Forms.Label();
|
||||
this.parentNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.configureParentButton = new System.Windows.Forms.Button();
|
||||
this.startButton = new System.Windows.Forms.Button();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent1Button = new System.Windows.Forms.Button();
|
||||
this.componentNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.component1ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton4 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton3 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton2 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton0 = new System.Windows.Forms.RadioButton();
|
||||
this.stopButton = new System.Windows.Forms.Button();
|
||||
this.groupBox3 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent2Button = new System.Windows.Forms.Button();
|
||||
this.component2NameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.component2ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.radioButton24 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton23 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton22 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton21 = new System.Windows.Forms.RadioButton();
|
||||
this.groupBox4 = new System.Windows.Forms.GroupBox();
|
||||
this.radioButton34 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton33 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton32 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton31 = new System.Windows.Forms.RadioButton();
|
||||
this.groupBox5 = new System.Windows.Forms.GroupBox();
|
||||
this.configureComponent3Button = new System.Windows.Forms.Button();
|
||||
this.component3NameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.component3ClassNameComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
this.groupBox3.SuspendLayout();
|
||||
this.groupBox4.SuspendLayout();
|
||||
this.groupBox5.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// parentClassNameComboBox
|
||||
//
|
||||
this.parentClassNameComboBox.FormattingEnabled = true;
|
||||
this.parentClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.parentClassNameComboBox.Name = "parentClassNameComboBox";
|
||||
this.parentClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.parentClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// classLabel
|
||||
//
|
||||
this.classLabel.AutoSize = true;
|
||||
this.classLabel.Location = new System.Drawing.Point(11, 22);
|
||||
this.classLabel.Name = "classLabel";
|
||||
this.classLabel.Size = new System.Drawing.Size(32, 13);
|
||||
this.classLabel.TabIndex = 1;
|
||||
this.classLabel.Text = "Class";
|
||||
//
|
||||
// nameLabel
|
||||
//
|
||||
this.nameLabel.AutoSize = true;
|
||||
this.nameLabel.Location = new System.Drawing.Point(11, 47);
|
||||
this.nameLabel.Name = "nameLabel";
|
||||
this.nameLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.nameLabel.TabIndex = 2;
|
||||
this.nameLabel.Text = "Name";
|
||||
//
|
||||
// parentNameTextBox
|
||||
//
|
||||
this.parentNameTextBox.Enabled = false;
|
||||
this.parentNameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.parentNameTextBox.Name = "parentNameTextBox";
|
||||
this.parentNameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.parentNameTextBox.TabIndex = 3;
|
||||
//
|
||||
// configureParentButton
|
||||
//
|
||||
this.configureParentButton.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureParentButton.Name = "configureParentButton";
|
||||
this.configureParentButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureParentButton.TabIndex = 4;
|
||||
this.configureParentButton.Text = "Configure";
|
||||
this.configureParentButton.UseVisualStyleBackColor = true;
|
||||
this.configureParentButton.Click += new System.EventHandler(this.configureParentButton_Click);
|
||||
//
|
||||
// startButton
|
||||
//
|
||||
this.startButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.startButton.Location = new System.Drawing.Point(520, 19);
|
||||
this.startButton.Name = "startButton";
|
||||
this.startButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.startButton.TabIndex = 7;
|
||||
this.startButton.Text = "Start";
|
||||
this.startButton.UseVisualStyleBackColor = true;
|
||||
this.startButton.Click += new System.EventHandler(this.startButton_Click);
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.configureParentButton);
|
||||
this.groupBox1.Controls.Add(this.parentNameTextBox);
|
||||
this.groupBox1.Controls.Add(this.nameLabel);
|
||||
this.groupBox1.Controls.Add(this.classLabel);
|
||||
this.groupBox1.Controls.Add(this.parentClassNameComboBox);
|
||||
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox1.TabIndex = 8;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Parent component";
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.configureComponent1Button);
|
||||
this.groupBox2.Controls.Add(this.componentNameTextBox);
|
||||
this.groupBox2.Controls.Add(this.label1);
|
||||
this.groupBox2.Controls.Add(this.label2);
|
||||
this.groupBox2.Controls.Add(this.component1ClassNameComboBox);
|
||||
this.groupBox2.Location = new System.Drawing.Point(12, 93);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox2.TabIndex = 9;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Component 1";
|
||||
//
|
||||
// configureComponentButton
|
||||
//
|
||||
this.configureComponent1Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent1Button.Name = "configureComponentButton";
|
||||
this.configureComponent1Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent1Button.TabIndex = 4;
|
||||
this.configureComponent1Button.Text = "Configure";
|
||||
this.configureComponent1Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent1Button.Click += new System.EventHandler(this.configureComponent1Button_Click);
|
||||
//
|
||||
// componentNameTextBox
|
||||
//
|
||||
this.componentNameTextBox.Enabled = false;
|
||||
this.componentNameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.componentNameTextBox.Name = "componentNameTextBox";
|
||||
this.componentNameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.componentNameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(11, 47);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(35, 13);
|
||||
this.label1.TabIndex = 2;
|
||||
this.label1.Text = "Name";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(11, 22);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(32, 13);
|
||||
this.label2.TabIndex = 1;
|
||||
this.label2.Text = "Class";
|
||||
//
|
||||
// componentClassNameComboBox
|
||||
//
|
||||
this.component1ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component1ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component1ClassNameComboBox.Name = "componentClassNameComboBox";
|
||||
this.component1ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component1ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// radioButton4
|
||||
//
|
||||
this.radioButton4.AutoSize = true;
|
||||
this.radioButton4.Location = new System.Drawing.Point(13, 118);
|
||||
this.radioButton4.Name = "radioButton4";
|
||||
this.radioButton4.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton4.TabIndex = 9;
|
||||
this.radioButton4.TabStop = true;
|
||||
this.radioButton4.Text = "spare";
|
||||
this.radioButton4.UseVisualStyleBackColor = true;
|
||||
this.radioButton4.CheckedChanged += new System.EventHandler(this.radioButton4_CheckedChanged);
|
||||
//
|
||||
// radioButton3
|
||||
//
|
||||
this.radioButton3.AutoSize = true;
|
||||
this.radioButton3.Location = new System.Drawing.Point(13, 95);
|
||||
this.radioButton3.Name = "radioButton3";
|
||||
this.radioButton3.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton3.TabIndex = 8;
|
||||
this.radioButton3.TabStop = true;
|
||||
this.radioButton3.Text = "spare";
|
||||
this.radioButton3.UseVisualStyleBackColor = true;
|
||||
this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged);
|
||||
//
|
||||
// radioButton2
|
||||
//
|
||||
this.radioButton2.AutoSize = true;
|
||||
this.radioButton2.Location = new System.Drawing.Point(13, 72);
|
||||
this.radioButton2.Name = "radioButton2";
|
||||
this.radioButton2.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton2.TabIndex = 7;
|
||||
this.radioButton2.TabStop = true;
|
||||
this.radioButton2.Text = "spare";
|
||||
this.radioButton2.UseVisualStyleBackColor = true;
|
||||
this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged);
|
||||
//
|
||||
// radioButton1
|
||||
//
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Location = new System.Drawing.Point(13, 49);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton1.TabIndex = 6;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "ReadPressureOp";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
|
||||
//
|
||||
// radioButton0
|
||||
//
|
||||
this.radioButton0.AutoSize = true;
|
||||
this.radioButton0.Location = new System.Drawing.Point(13, 26);
|
||||
this.radioButton0.Name = "radioButton0";
|
||||
this.radioButton0.Size = new System.Drawing.Size(94, 17);
|
||||
this.radioButton0.TabIndex = 5;
|
||||
this.radioButton0.TabStop = true;
|
||||
this.radioButton0.Text = "Stop operation";
|
||||
this.radioButton0.UseVisualStyleBackColor = true;
|
||||
this.radioButton0.CheckedChanged += new System.EventHandler(this.radioButton0_CheckedChanged);
|
||||
//
|
||||
// stopButton
|
||||
//
|
||||
this.stopButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.stopButton.Location = new System.Drawing.Point(520, 77);
|
||||
this.stopButton.Name = "stopButton";
|
||||
this.stopButton.Size = new System.Drawing.Size(73, 45);
|
||||
this.stopButton.TabIndex = 10;
|
||||
this.stopButton.Text = "Stop";
|
||||
this.stopButton.UseVisualStyleBackColor = true;
|
||||
this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
|
||||
//
|
||||
// groupBox3
|
||||
//
|
||||
this.groupBox3.Controls.Add(this.configureComponent2Button);
|
||||
this.groupBox3.Controls.Add(this.component2NameTextBox);
|
||||
this.groupBox3.Controls.Add(this.label3);
|
||||
this.groupBox3.Controls.Add(this.label4);
|
||||
this.groupBox3.Controls.Add(this.component2ClassNameComboBox);
|
||||
this.groupBox3.Location = new System.Drawing.Point(12, 174);
|
||||
this.groupBox3.Name = "groupBox3";
|
||||
this.groupBox3.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox3.TabIndex = 11;
|
||||
this.groupBox3.TabStop = false;
|
||||
this.groupBox3.Text = "Component 2";
|
||||
//
|
||||
// configureComponent2Button
|
||||
//
|
||||
this.configureComponent2Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent2Button.Name = "configureComponent2Button";
|
||||
this.configureComponent2Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent2Button.TabIndex = 4;
|
||||
this.configureComponent2Button.Text = "Configure";
|
||||
this.configureComponent2Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent2Button.Click += new System.EventHandler(this.configureComponent2Button_Click);
|
||||
//
|
||||
// component2NameTextBox
|
||||
//
|
||||
this.component2NameTextBox.Enabled = false;
|
||||
this.component2NameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.component2NameTextBox.Name = "component2NameTextBox";
|
||||
this.component2NameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.component2NameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(11, 47);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(35, 13);
|
||||
this.label3.TabIndex = 2;
|
||||
this.label3.Text = "Name";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(11, 22);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(32, 13);
|
||||
this.label4.TabIndex = 1;
|
||||
this.label4.Text = "Class";
|
||||
//
|
||||
// component2ClassNameComboBox
|
||||
//
|
||||
this.component2ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component2ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component2ClassNameComboBox.Name = "component2ClassNameComboBox";
|
||||
this.component2ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component2ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// radioButton24
|
||||
//
|
||||
this.radioButton24.AutoSize = true;
|
||||
this.radioButton24.Location = new System.Drawing.Point(212, 118);
|
||||
this.radioButton24.Name = "radioButton24";
|
||||
this.radioButton24.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton24.TabIndex = 9;
|
||||
this.radioButton24.TabStop = true;
|
||||
this.radioButton24.Text = "spare";
|
||||
this.radioButton24.UseVisualStyleBackColor = true;
|
||||
this.radioButton24.CheckedChanged += new System.EventHandler(this.radioButton24_CheckedChanged);
|
||||
//
|
||||
// radioButton23
|
||||
//
|
||||
this.radioButton23.AutoSize = true;
|
||||
this.radioButton23.Location = new System.Drawing.Point(212, 95);
|
||||
this.radioButton23.Name = "radioButton23";
|
||||
this.radioButton23.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton23.TabIndex = 8;
|
||||
this.radioButton23.TabStop = true;
|
||||
this.radioButton23.Text = "spare";
|
||||
this.radioButton23.UseVisualStyleBackColor = true;
|
||||
this.radioButton23.CheckedChanged += new System.EventHandler(this.radioButton23_CheckedChanged);
|
||||
//
|
||||
// radioButton22
|
||||
//
|
||||
this.radioButton22.AutoSize = true;
|
||||
this.radioButton22.Location = new System.Drawing.Point(212, 72);
|
||||
this.radioButton22.Name = "radioButton22";
|
||||
this.radioButton22.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton22.TabIndex = 7;
|
||||
this.radioButton22.TabStop = true;
|
||||
this.radioButton22.Text = "spare";
|
||||
this.radioButton22.UseVisualStyleBackColor = true;
|
||||
this.radioButton22.CheckedChanged += new System.EventHandler(this.radioButton22_CheckedChanged);
|
||||
//
|
||||
// radioButton21
|
||||
//
|
||||
this.radioButton21.AutoSize = true;
|
||||
this.radioButton21.Location = new System.Drawing.Point(212, 49);
|
||||
this.radioButton21.Name = "radioButton21";
|
||||
this.radioButton21.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton21.TabIndex = 6;
|
||||
this.radioButton21.TabStop = true;
|
||||
this.radioButton21.Text = "ReadPressureOp";
|
||||
this.radioButton21.UseVisualStyleBackColor = true;
|
||||
this.radioButton21.CheckedChanged += new System.EventHandler(this.radioButton21_CheckedChanged);
|
||||
//
|
||||
// groupBox4
|
||||
//
|
||||
this.groupBox4.Controls.Add(this.radioButton34);
|
||||
this.groupBox4.Controls.Add(this.radioButton33);
|
||||
this.groupBox4.Controls.Add(this.radioButton32);
|
||||
this.groupBox4.Controls.Add(this.radioButton31);
|
||||
this.groupBox4.Controls.Add(this.radioButton24);
|
||||
this.groupBox4.Controls.Add(this.radioButton4);
|
||||
this.groupBox4.Controls.Add(this.radioButton23);
|
||||
this.groupBox4.Controls.Add(this.radioButton0);
|
||||
this.groupBox4.Controls.Add(this.radioButton22);
|
||||
this.groupBox4.Controls.Add(this.radioButton3);
|
||||
this.groupBox4.Controls.Add(this.radioButton21);
|
||||
this.groupBox4.Controls.Add(this.radioButton1);
|
||||
this.groupBox4.Controls.Add(this.radioButton2);
|
||||
this.groupBox4.Location = new System.Drawing.Point(12, 349);
|
||||
this.groupBox4.Name = "groupBox4";
|
||||
this.groupBox4.Size = new System.Drawing.Size(581, 145);
|
||||
this.groupBox4.TabIndex = 12;
|
||||
this.groupBox4.TabStop = false;
|
||||
this.groupBox4.Text = "Operations";
|
||||
//
|
||||
// radioButton34
|
||||
//
|
||||
this.radioButton34.AutoSize = true;
|
||||
this.radioButton34.Location = new System.Drawing.Point(405, 118);
|
||||
this.radioButton34.Name = "radioButton34";
|
||||
this.radioButton34.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton34.TabIndex = 13;
|
||||
this.radioButton34.TabStop = true;
|
||||
this.radioButton34.Text = "spare";
|
||||
this.radioButton34.UseVisualStyleBackColor = true;
|
||||
this.radioButton34.CheckedChanged += new System.EventHandler(this.radioButton34_CheckedChanged);
|
||||
//
|
||||
// radioButton33
|
||||
//
|
||||
this.radioButton33.AutoSize = true;
|
||||
this.radioButton33.Location = new System.Drawing.Point(405, 95);
|
||||
this.radioButton33.Name = "radioButton33";
|
||||
this.radioButton33.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton33.TabIndex = 12;
|
||||
this.radioButton33.TabStop = true;
|
||||
this.radioButton33.Text = "spare";
|
||||
this.radioButton33.UseVisualStyleBackColor = true;
|
||||
this.radioButton33.CheckedChanged += new System.EventHandler(this.radioButton33_CheckedChanged);
|
||||
//
|
||||
// radioButton32
|
||||
//
|
||||
this.radioButton32.AutoSize = true;
|
||||
this.radioButton32.Location = new System.Drawing.Point(405, 72);
|
||||
this.radioButton32.Name = "radioButton32";
|
||||
this.radioButton32.Size = new System.Drawing.Size(51, 17);
|
||||
this.radioButton32.TabIndex = 11;
|
||||
this.radioButton32.TabStop = true;
|
||||
this.radioButton32.Text = "spare";
|
||||
this.radioButton32.UseVisualStyleBackColor = true;
|
||||
this.radioButton32.CheckedChanged += new System.EventHandler(this.radioButton32_CheckedChanged);
|
||||
//
|
||||
// radioButton31
|
||||
//
|
||||
this.radioButton31.AutoSize = true;
|
||||
this.radioButton31.Location = new System.Drawing.Point(405, 49);
|
||||
this.radioButton31.Name = "radioButton31";
|
||||
this.radioButton31.Size = new System.Drawing.Size(106, 17);
|
||||
this.radioButton31.TabIndex = 10;
|
||||
this.radioButton31.TabStop = true;
|
||||
this.radioButton31.Text = "ReadPressureOp";
|
||||
this.radioButton31.UseVisualStyleBackColor = true;
|
||||
this.radioButton31.CheckedChanged += new System.EventHandler(this.radioButton31_CheckedChanged);
|
||||
//
|
||||
// groupBox5
|
||||
//
|
||||
this.groupBox5.Controls.Add(this.configureComponent3Button);
|
||||
this.groupBox5.Controls.Add(this.component3NameTextBox);
|
||||
this.groupBox5.Controls.Add(this.label5);
|
||||
this.groupBox5.Controls.Add(this.label6);
|
||||
this.groupBox5.Controls.Add(this.component3ClassNameComboBox);
|
||||
this.groupBox5.Location = new System.Drawing.Point(12, 255);
|
||||
this.groupBox5.Name = "groupBox5";
|
||||
this.groupBox5.Size = new System.Drawing.Size(486, 75);
|
||||
this.groupBox5.TabIndex = 13;
|
||||
this.groupBox5.TabStop = false;
|
||||
this.groupBox5.Text = "Component 3";
|
||||
//
|
||||
// configureComponent3Button
|
||||
//
|
||||
this.configureComponent3Button.Location = new System.Drawing.Point(395, 19);
|
||||
this.configureComponent3Button.Name = "configureComponent3Button";
|
||||
this.configureComponent3Button.Size = new System.Drawing.Size(73, 45);
|
||||
this.configureComponent3Button.TabIndex = 4;
|
||||
this.configureComponent3Button.Text = "Configure";
|
||||
this.configureComponent3Button.UseVisualStyleBackColor = true;
|
||||
this.configureComponent3Button.Click += new System.EventHandler(this.configureComponent3Button_Click);
|
||||
//
|
||||
// component3NameTextBox
|
||||
//
|
||||
this.component3NameTextBox.Enabled = false;
|
||||
this.component3NameTextBox.Location = new System.Drawing.Point(77, 44);
|
||||
this.component3NameTextBox.Name = "component3NameTextBox";
|
||||
this.component3NameTextBox.Size = new System.Drawing.Size(299, 20);
|
||||
this.component3NameTextBox.TabIndex = 3;
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Location = new System.Drawing.Point(11, 47);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(35, 13);
|
||||
this.label5.TabIndex = 2;
|
||||
this.label5.Text = "Name";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.Location = new System.Drawing.Point(11, 22);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(32, 13);
|
||||
this.label6.TabIndex = 1;
|
||||
this.label6.Text = "Class";
|
||||
//
|
||||
// component3ClassNameComboBox
|
||||
//
|
||||
this.component3ClassNameComboBox.FormattingEnabled = true;
|
||||
this.component3ClassNameComboBox.Location = new System.Drawing.Point(77, 19);
|
||||
this.component3ClassNameComboBox.Name = "component3ClassNameComboBox";
|
||||
this.component3ClassNameComboBox.Size = new System.Drawing.Size(299, 21);
|
||||
this.component3ClassNameComboBox.TabIndex = 0;
|
||||
//
|
||||
// DeviceTestDlg
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(613, 502);
|
||||
this.Controls.Add(this.groupBox5);
|
||||
this.Controls.Add(this.groupBox4);
|
||||
this.Controls.Add(this.groupBox3);
|
||||
this.Controls.Add(this.stopButton);
|
||||
this.Controls.Add(this.groupBox2);
|
||||
this.Controls.Add(this.startButton);
|
||||
this.Controls.Add(this.groupBox1);
|
||||
this.Name = "DeviceTestDlg";
|
||||
this.Text = "Device test";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DeviceTestDlg_FormClosing);
|
||||
this.Load += new System.EventHandler(this.DeviceTestDlg_Load);
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
this.groupBox2.PerformLayout();
|
||||
this.groupBox3.ResumeLayout(false);
|
||||
this.groupBox3.PerformLayout();
|
||||
this.groupBox4.ResumeLayout(false);
|
||||
this.groupBox4.PerformLayout();
|
||||
this.groupBox5.ResumeLayout(false);
|
||||
this.groupBox5.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ComboBox parentClassNameComboBox;
|
||||
private System.Windows.Forms.Label classLabel;
|
||||
private System.Windows.Forms.Label nameLabel;
|
||||
private System.Windows.Forms.TextBox parentNameTextBox;
|
||||
private System.Windows.Forms.Button configureParentButton;
|
||||
private System.Windows.Forms.Button startButton;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.GroupBox groupBox2;
|
||||
private System.Windows.Forms.Button configureComponent1Button;
|
||||
private System.Windows.Forms.TextBox componentNameTextBox;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.ComboBox component1ClassNameComboBox;
|
||||
private System.Windows.Forms.RadioButton radioButton4;
|
||||
private System.Windows.Forms.RadioButton radioButton3;
|
||||
private System.Windows.Forms.RadioButton radioButton2;
|
||||
private System.Windows.Forms.RadioButton radioButton1;
|
||||
private System.Windows.Forms.RadioButton radioButton0;
|
||||
private System.Windows.Forms.Button stopButton;
|
||||
private System.Windows.Forms.GroupBox groupBox3;
|
||||
private System.Windows.Forms.RadioButton radioButton24;
|
||||
private System.Windows.Forms.RadioButton radioButton23;
|
||||
private System.Windows.Forms.RadioButton radioButton22;
|
||||
private System.Windows.Forms.RadioButton radioButton21;
|
||||
private System.Windows.Forms.Button configureComponent2Button;
|
||||
private System.Windows.Forms.TextBox component2NameTextBox;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.ComboBox component2ClassNameComboBox;
|
||||
private System.Windows.Forms.GroupBox groupBox4;
|
||||
private System.Windows.Forms.GroupBox groupBox5;
|
||||
private System.Windows.Forms.Button configureComponent3Button;
|
||||
private System.Windows.Forms.TextBox component3NameTextBox;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.ComboBox component3ClassNameComboBox;
|
||||
private System.Windows.Forms.RadioButton radioButton34;
|
||||
private System.Windows.Forms.RadioButton radioButton33;
|
||||
private System.Windows.Forms.RadioButton radioButton32;
|
||||
private System.Windows.Forms.RadioButton radioButton31;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,835 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using TBF.BenchControl;
|
||||
using TBF.BenchControl.Generic;
|
||||
using TBF.BenchControl.GenericDevices;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
public partial class DeviceTestDlg : Form
|
||||
{
|
||||
IList<string> compClasses;
|
||||
|
||||
IComponentFactory parentFactory;
|
||||
IComponentFactory component1Factory;
|
||||
IComponentFactory component2Factory;
|
||||
IComponentFactory component3Factory;
|
||||
|
||||
IComponentCfg parentCfg;
|
||||
IComponentCfg component1Cfg;
|
||||
IComponentCfg component2Cfg;
|
||||
IComponentCfg component3Cfg;
|
||||
|
||||
static IList<TBF.BenchControl.Generic.IDevice> tbfDevices;
|
||||
static IList<TBF.BenchControl.Generic.IComponent> tbfComponents;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent1forOp;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent2forOp;
|
||||
static TBF.BenchControl.Generic.IComponent tbfComponent3forOp;
|
||||
|
||||
static Thread workerThread;
|
||||
static bool workerThreadRunning;
|
||||
|
||||
|
||||
static int activeOperationId;
|
||||
|
||||
static IOperation operation1;
|
||||
static IOperation operation2;
|
||||
static IOperation operation3;
|
||||
static IOperation operation4;
|
||||
|
||||
static IOperation operation21;
|
||||
static IOperation operation22;
|
||||
static IOperation operation23;
|
||||
static IOperation operation24;
|
||||
|
||||
static IOperation operation31;
|
||||
static IOperation operation32;
|
||||
static IOperation operation33;
|
||||
static IOperation operation34;
|
||||
|
||||
|
||||
static TBF.Boxes.FloatBox floatBox;
|
||||
static Event evnt;
|
||||
|
||||
|
||||
static DeviceTestDlg()
|
||||
{
|
||||
floatBox = new TBF.Boxes.FloatBox();
|
||||
floatBox.Format = "F2";
|
||||
}
|
||||
|
||||
public DeviceTestDlg()
|
||||
{
|
||||
InitializeComponent();
|
||||
compClasses = new List<string>();
|
||||
radioButton0.Checked = true;
|
||||
stopButton.Enabled = false;
|
||||
|
||||
foreach (var componentFactory in TbfComponents.Factories)
|
||||
{
|
||||
compClasses.Add(componentFactory.ClassName);
|
||||
}
|
||||
|
||||
tbfComponents = new List<TBF.BenchControl.Generic.IComponent>();
|
||||
tbfDevices = new List<IDevice>();
|
||||
}
|
||||
|
||||
private void DeviceTestDlg_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
foreach (var clName in compClasses)
|
||||
{
|
||||
parentClassNameComboBox.Items.Add(clName);
|
||||
component1ClassNameComboBox.Items.Add(clName);
|
||||
component2ClassNameComboBox.Items.Add(clName);
|
||||
component3ClassNameComboBox.Items.Add(clName);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.ParentClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ParentName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ParentSettings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.ParentClassName, ref parentFactory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.ParentSettings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(parentFactory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.ParentName;
|
||||
config.ParentName = string.Empty;
|
||||
config.ItemNr = 0;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = parentFactory;
|
||||
parentCfg = config;
|
||||
}
|
||||
|
||||
parentClassNameComboBox.Text = Program.LocalSettings.ParentClassName;
|
||||
parentNameTextBox.Text = Program.LocalSettings.ParentName;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
parentFactory = null;
|
||||
parentCfg = null;
|
||||
parentClassNameComboBox.Text = string.Empty;
|
||||
parentNameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.ComponentClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ComponentName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.ComponentSettings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.ComponentClassName, ref component1Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.ComponentSettings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component1Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.ComponentName;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.ComponentParentName) ? string.Empty : Program.LocalSettings.ComponentParentName;
|
||||
config.ItemNr = 1;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component1Factory;
|
||||
component1Cfg = config;
|
||||
}
|
||||
|
||||
component1ClassNameComboBox.Text = Program.LocalSettings.ComponentClassName;
|
||||
componentNameTextBox.Text = Program.LocalSettings.ComponentName;
|
||||
|
||||
UpdateOperations(component1ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component1Factory = null;
|
||||
component1Cfg = null;
|
||||
component1ClassNameComboBox.Text = string.Empty;
|
||||
componentNameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.Component2ClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component2Name) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component2Settings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.Component2ClassName, ref component2Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.Component2Settings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component2Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.Component2Name;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component2ParentName) ? string.Empty : Program.LocalSettings.Component2ParentName;
|
||||
config.ItemNr = 2;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component2Factory;
|
||||
component2Cfg = config;
|
||||
}
|
||||
|
||||
component2ClassNameComboBox.Text = Program.LocalSettings.Component2ClassName;
|
||||
component2NameTextBox.Text = Program.LocalSettings.Component2Name;
|
||||
|
||||
UpdateOperations2(component2ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component2Factory = null;
|
||||
component2Cfg = null;
|
||||
component2ClassNameComboBox.Text = string.Empty;
|
||||
component2NameTextBox.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!string.IsNullOrEmpty(Program.LocalSettings.Component3ClassName) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component3Name) &&
|
||||
!string.IsNullOrEmpty(Program.LocalSettings.Component3Settings))
|
||||
{
|
||||
FactoryFromClassName(Program.LocalSettings.Component3ClassName, ref component3Factory);
|
||||
|
||||
using (var reader = new StringReader(Program.LocalSettings.Component3Settings))
|
||||
{
|
||||
IComponentCfg config = (IComponentCfg)(new XmlSerializer(component3Factory.DefaultConfig().GetType())).Deserialize(reader);
|
||||
config.Name = Program.LocalSettings.Component3Name;
|
||||
config.ParentName = string.IsNullOrEmpty(Program.LocalSettings.Component3ParentName) ? string.Empty : Program.LocalSettings.Component3ParentName;
|
||||
config.ItemNr = 3;
|
||||
config.DebugLevel = Config.Entities.DebugMode.Normal;
|
||||
config.LogLevel = Config.Entities.LogLevel.Debug;
|
||||
config.Corrections = null;
|
||||
config.Factory = component3Factory;
|
||||
component3Cfg = config;
|
||||
}
|
||||
|
||||
component3ClassNameComboBox.Text = Program.LocalSettings.Component3ClassName;
|
||||
component3NameTextBox.Text = Program.LocalSettings.Component3Name;
|
||||
|
||||
UpdateOperations3(component3ClassNameComboBox.Text);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
component3Factory = null;
|
||||
component3Cfg = null;
|
||||
component3ClassNameComboBox.Text = string.Empty;
|
||||
component3NameTextBox.Text = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
void SaveSettings()
|
||||
{
|
||||
Program.LocalSettings.ParentClassName = parentClassNameComboBox.Text;
|
||||
Program.LocalSettings.ParentName = parentNameTextBox.Text;
|
||||
Program.LocalSettings.ParentSettings = (parentCfg != null) ? parentCfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.ComponentClassName = component1ClassNameComboBox.Text;
|
||||
Program.LocalSettings.ComponentName = componentNameTextBox.Text;
|
||||
Program.LocalSettings.ComponentParentName = (component1Cfg != null) ? component1Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.ComponentSettings = (component1Cfg != null) ? component1Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Component2ClassName = component2ClassNameComboBox.Text;
|
||||
Program.LocalSettings.Component2Name = component2NameTextBox.Text;
|
||||
Program.LocalSettings.Component2ParentName = (component2Cfg != null) ? component2Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.Component2Settings = (component2Cfg != null) ? component2Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Component3ClassName = component3ClassNameComboBox.Text;
|
||||
Program.LocalSettings.Component3Name = component3NameTextBox.Text;
|
||||
Program.LocalSettings.Component3ParentName = (component3Cfg != null) ? component3Cfg.ParentName : string.Empty;
|
||||
Program.LocalSettings.Component3Settings = (component3Cfg != null) ? component3Cfg.CreateDbEntity().Parameters : string.Empty;
|
||||
|
||||
Program.LocalSettings.Save();
|
||||
}
|
||||
|
||||
|
||||
void UpdateOperations(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton1.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton1.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton1.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton1.Text = "SetTemperature(10)";
|
||||
radioButton2.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton1.Text = "SelectTank 1";
|
||||
radioButton2.Text = "SelectTank 2";
|
||||
radioButton3.Text = "SelectTank 3";
|
||||
radioButton4.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton1.Text = "spare";
|
||||
}
|
||||
///
|
||||
void UpdateOperations2(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton21.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton21.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton21.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton21.Text = "SetTemperature(10)";
|
||||
radioButton22.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton21.Text = "SelectTank 1";
|
||||
radioButton22.Text = "SelectTank 2";
|
||||
radioButton23.Text = "SelectTank 3";
|
||||
radioButton24.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton21.Text = "spare";
|
||||
}
|
||||
///
|
||||
void UpdateOperations3(string className)
|
||||
{
|
||||
if (className == "Keithley.TempMeter") radioButton31.Text = "ReadPressureOp";
|
||||
else if (className == "Network.Camera.CLP1611") radioButton31.Text = "Livestream";
|
||||
else if (className == "Network.Camera.Roi") radioButton31.Text = "RoiDetection";
|
||||
else if (className == "Modbus.Easytherm")
|
||||
{
|
||||
radioButton31.Text = "SetTemperature(10)";
|
||||
radioButton32.Text = "SetTemperature(20)";
|
||||
}
|
||||
else if (className == "Modbus.TankSelector")
|
||||
{
|
||||
radioButton31.Text = "SelectTank 1";
|
||||
radioButton32.Text = "SelectTank 2";
|
||||
radioButton33.Text = "SelectTank 3";
|
||||
radioButton34.Text = "SelectTank -";
|
||||
}
|
||||
else radioButton31.Text = "spare";
|
||||
}
|
||||
|
||||
|
||||
int GetActiveOperationId()
|
||||
{
|
||||
if (radioButton1.Checked) { return 1; }
|
||||
else if (radioButton2.Checked) { return 2; }
|
||||
else if (radioButton3.Checked) { return 3; }
|
||||
else if (radioButton4.Checked) { return 4; }
|
||||
else if (radioButton21.Checked) { return 21; }
|
||||
else if (radioButton22.Checked) { return 22; }
|
||||
else if (radioButton23.Checked) { return 23; }
|
||||
else if (radioButton24.Checked) { return 24; }
|
||||
else if (radioButton31.Checked) { return 31; }
|
||||
else if (radioButton32.Checked) { return 32; }
|
||||
else if (radioButton33.Checked) { return 33; }
|
||||
else if (radioButton34.Checked) { return 34; }
|
||||
else return 0; /// stopOperationRadioButton.Checked
|
||||
}
|
||||
|
||||
|
||||
private void radioButton0_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton1_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton2_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton3_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton4_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
///
|
||||
private void radioButton21_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton22_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton23_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton24_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
///
|
||||
private void radioButton31_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton32_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton33_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
private void radioButton34_CheckedChanged(object sender, EventArgs e) { activeOperationId = GetActiveOperationId(); }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Updates component factory
|
||||
/// </summary>
|
||||
/// <param name="className">Component class name</param>
|
||||
/// <param name="factory">Reference to a factory</param>
|
||||
/// <returns>true when factory changed</returns>
|
||||
bool FactoryFromClassName(string className, ref IComponentFactory factory)
|
||||
{
|
||||
foreach (var fac in TbfComponents.Factories)
|
||||
{
|
||||
if (className == fac.ClassName)
|
||||
{
|
||||
if (factory != fac)
|
||||
{
|
||||
factory = fac;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (factory != null)
|
||||
{
|
||||
factory = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void configureParentButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(parentClassNameComboBox.Text, ref parentFactory);
|
||||
if (parentFactory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid parent class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || parentCfg == null)
|
||||
{
|
||||
parentCfg = parentFactory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = parentCfg.GetControl();
|
||||
cfgControl.Config = parentCfg;
|
||||
cfgControl.Config.ItemNr = 0;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
cfgForm.TbfComponents = new List<Config.Entities.Component>();
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
parentNameTextBox.Text = parentCfg.Name;
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent1Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component1ClassNameComboBox.Text, ref component1Factory);
|
||||
if (component1Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component1Cfg == null)
|
||||
{
|
||||
component1Cfg = component1Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component1Cfg.GetControl();
|
||||
cfgControl.Config = component1Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
componentNameTextBox.Text = component1Cfg.Name;
|
||||
|
||||
UpdateOperations(component1ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent2Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component2ClassNameComboBox.Text, ref component2Factory);
|
||||
if (component2Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component2Cfg == null)
|
||||
{
|
||||
component2Cfg = component2Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component2Cfg.GetControl();
|
||||
cfgControl.Config = component2Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
component2NameTextBox.Text = component2Cfg.Name;
|
||||
|
||||
UpdateOperations2(component2ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void configureComponent3Button_Click(object sender, EventArgs e)
|
||||
{
|
||||
bool factoryChanged = FactoryFromClassName(component3ClassNameComboBox.Text, ref component3Factory);
|
||||
if (component3Factory == null)
|
||||
{
|
||||
MessageBox.Show("Invalid component class", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
return;
|
||||
}
|
||||
|
||||
if (factoryChanged || component3Cfg == null)
|
||||
{
|
||||
component3Cfg = component3Factory.DefaultConfig();
|
||||
}
|
||||
IComponentCfgCtrl cfgControl = component3Cfg.GetControl();
|
||||
cfgControl.Config = component3Cfg;
|
||||
cfgControl.Config.ItemNr = 1;
|
||||
|
||||
TBF.ComponentParametersDlg cfgForm = new TBF.ComponentParametersDlg();
|
||||
///
|
||||
IList<Config.Entities.Component> compEntities = new List<Config.Entities.Component>();
|
||||
if (parentFactory != null && parentCfg != null) compEntities.Add(parentCfg.CreateDbEntity());
|
||||
if (component1Factory != null && component1Cfg != null) compEntities.Add(component1Cfg.CreateDbEntity());
|
||||
if (component2Factory != null && component2Cfg != null) compEntities.Add(component2Cfg.CreateDbEntity());
|
||||
cfgForm.TbfComponents = compEntities;
|
||||
|
||||
cfgForm.ComponentCfgCtrl = cfgControl;
|
||||
cfgForm.UnlockAfterStart = true;
|
||||
DialogResult dr = cfgForm.ShowDialog();
|
||||
if (dr != DialogResult.OK) return;
|
||||
|
||||
component3NameTextBox.Text = component3Cfg.Name;
|
||||
|
||||
UpdateOperations3(component3ClassNameComboBox.Text);
|
||||
}
|
||||
|
||||
|
||||
private void startButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
tbfComponents.Clear();
|
||||
tbfDevices.Clear();
|
||||
tbfComponent1forOp = null;
|
||||
operation1 = null;
|
||||
operation2 = null;
|
||||
operation3 = null;
|
||||
operation4 = null;
|
||||
tbfComponent2forOp = null;
|
||||
operation21 = null;
|
||||
operation22 = null;
|
||||
operation23 = null;
|
||||
operation24 = null;
|
||||
tbfComponent3forOp = null;
|
||||
operation31 = null;
|
||||
operation32 = null;
|
||||
operation33 = null;
|
||||
operation34 = null;
|
||||
workerThreadRunning = false;
|
||||
|
||||
string initializedDeviceName = "none";
|
||||
try
|
||||
{
|
||||
if (parentFactory != null && parentCfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component = parentFactory.GetComponent(parentCfg, tbfComponents);
|
||||
tbfComponents.Add(component);
|
||||
IDevice dev = component as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component1Factory != null && component1Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component = component1Factory.GetComponent(component1Cfg, tbfComponents);
|
||||
tbfComponents.Add(component);
|
||||
tbfComponent1forOp = component;
|
||||
IDevice dev = component as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component2Factory != null && component2Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component2 = component2Factory.GetComponent(component2Cfg, tbfComponents);
|
||||
tbfComponents.Add(component2);
|
||||
tbfComponent2forOp = component2;
|
||||
IDevice dev = component2 as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
if (component3Factory != null && component3Cfg != null)
|
||||
{
|
||||
TBF.BenchControl.Generic.IComponent component3 = component3Factory.GetComponent(component3Cfg, tbfComponents);
|
||||
tbfComponents.Add(component3);
|
||||
tbfComponent3forOp = component3;
|
||||
IDevice dev = component3 as IDevice;
|
||||
if (dev != null)
|
||||
{
|
||||
initializedDeviceName = dev.Name;
|
||||
dev.Initialize();
|
||||
tbfDevices.Add(dev);
|
||||
}
|
||||
}
|
||||
|
||||
if (tbfComponents.Count == 0) throw new Exception("There are no components");
|
||||
|
||||
SaveSettings(); /// Save settings after successful initialization
|
||||
|
||||
workerThread = new Thread(Worker);
|
||||
workerThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
|
||||
workerThread.CurrentUICulture = Thread.CurrentThread.CurrentUICulture;
|
||||
workerThreadRunning = true;
|
||||
workerThread.Start();
|
||||
|
||||
startButton.Enabled = false;
|
||||
stopButton.Enabled = true;
|
||||
configureComponent2Button.Enabled = false;
|
||||
configureComponent1Button.Enabled = false;
|
||||
configureParentButton.Enabled = false;
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
workerThreadRunning = false;
|
||||
workerThread = null;
|
||||
|
||||
MessageBox.Show(exc.Message,
|
||||
string.Format("'{0}' initialization failed", initializedDeviceName),
|
||||
MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Exclamation);
|
||||
|
||||
foreach (var dev in tbfDevices) dev.StopDevice();
|
||||
tbfDevices.Clear();
|
||||
|
||||
startButton.Enabled = true;
|
||||
stopButton.Enabled = false;
|
||||
configureComponent2Button.Enabled = true;
|
||||
configureComponent1Button.Enabled = true;
|
||||
configureParentButton.Enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void Worker()
|
||||
{
|
||||
int activeOperationLocal = 0;
|
||||
int previousOperation = 0;
|
||||
|
||||
|
||||
if (tbfComponent1forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation2 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent1forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation1 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation2 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation3 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation4 = (tbfComponent1forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
if (tbfComponent2forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation22 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation21 = (tbfComponent2forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation21 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation22 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent2forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation21 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation22 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation23 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation24 = (tbfComponent2forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
if (tbfComponent3forOp is TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.PressureMeter.Meret.PressureMeter).ReadPressureOp(ref floatBox);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.CLP1611.Camera)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(false);
|
||||
operation33 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.CLP1611.Camera).LiveStreamOp(true);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Network.Camera.Roi.Roi)
|
||||
{
|
||||
operation31 = (tbfComponent3forOp as TBF.BenchControl.Network.Camera.Roi.Roi).RoiDetectionOp();
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.Easytherm.Easytherm)
|
||||
{
|
||||
operation31 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(10);
|
||||
operation32 = (tbfComponent1forOp as TBF.BenchControl.Modbus.Easytherm.Easytherm).SetTemperatureOp(20);
|
||||
}
|
||||
else if (tbfComponent3forOp is TBF.BenchControl.Modbus.TankSelector.TankSelector)
|
||||
{
|
||||
//operation31 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(1);
|
||||
//operation32 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(2);
|
||||
//operation33 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(3);
|
||||
//operation34 = (tbfComponent3forOp as TBF.BenchControl.Modbus.TankSelector.TankSelector).SelectTankOp(0);
|
||||
}
|
||||
|
||||
|
||||
while (workerThreadRunning)
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
|
||||
if (workerThreadRunning)
|
||||
{
|
||||
foreach (var d in tbfDevices) d.RunDeviceBefore();
|
||||
|
||||
if (tbfComponent1forOp != null)
|
||||
{
|
||||
previousOperation = activeOperationLocal;
|
||||
activeOperationLocal = activeOperationId;
|
||||
if (previousOperation == 0 && activeOperationLocal != 0)
|
||||
{
|
||||
switch (activeOperationLocal)
|
||||
{
|
||||
case 1: if (operation1 != null) operation1.Start(); Debug.WriteLine("op1.Start()"); break;
|
||||
case 2: if (operation2 != null) operation2.Start(); Debug.WriteLine("op2.Start()"); break;
|
||||
case 3: if (operation3 != null) operation3.Start(); Debug.WriteLine("op3.Start()"); break;
|
||||
case 4: if (operation4 != null) operation4.Start(); Debug.WriteLine("op4.Start()"); break;
|
||||
case 21: if (operation21 != null) operation21.Start(); Debug.WriteLine("op21.Start()"); break;
|
||||
case 22: if (operation22 != null) operation22.Start(); Debug.WriteLine("op22.Start()"); break;
|
||||
case 23: if (operation23 != null) operation23.Start(); Debug.WriteLine("op23.Start()"); break;
|
||||
case 24: if (operation24 != null) operation24.Start(); Debug.WriteLine("op24.Start()"); break;
|
||||
case 31: if (operation31 != null) operation31.Start(); Debug.WriteLine("op31.Start()"); break;
|
||||
case 32: if (operation32 != null) operation32.Start(); Debug.WriteLine("op32.Start()"); break;
|
||||
case 33: if (operation33 != null) operation33.Start(); Debug.WriteLine("op33.Start()"); break;
|
||||
case 34: if (operation34 != null) operation34.Start(); Debug.WriteLine("op34.Start()"); break;
|
||||
}
|
||||
}
|
||||
else if (previousOperation == activeOperationLocal && activeOperationLocal != 0)
|
||||
{
|
||||
switch (activeOperationLocal)
|
||||
{
|
||||
case 1: if (operation1 != null) evnt = operation1.Run(); Debug.WriteLine("op1.Run() -> {0}", evnt); break;
|
||||
case 2: if (operation2 != null) evnt = operation2.Run(); Debug.WriteLine("op2.Run() -> {0}", evnt); break;
|
||||
case 3: if (operation3 != null) evnt = operation3.Run(); Debug.WriteLine("op3.Run() -> {0}", evnt); break;
|
||||
case 4: if (operation4 != null) evnt = operation4.Run(); Debug.WriteLine("op4.Run() -> {0}", evnt); break;
|
||||
case 21: if (operation21 != null) evnt = operation21.Run(); Debug.WriteLine("op21.Run() -> {0}", evnt); break;
|
||||
case 22: if (operation22 != null) evnt = operation22.Run(); Debug.WriteLine("op22.Run() -> {0}", evnt); break;
|
||||
case 23: if (operation23 != null) evnt = operation23.Run(); Debug.WriteLine("op23.Run() -> {0}", evnt); break;
|
||||
case 24: if (operation24 != null) evnt = operation24.Run(); Debug.WriteLine("op24.Run() -> {0}", evnt); break;
|
||||
case 31: if (operation31 != null) evnt = operation31.Run(); Debug.WriteLine("op31.Run() -> {0}", evnt); break;
|
||||
case 32: if (operation32 != null) evnt = operation32.Run(); Debug.WriteLine("op32.Run() -> {0}", evnt); break;
|
||||
case 33: if (operation33 != null) evnt = operation33.Run(); Debug.WriteLine("op33.Run() -> {0}", evnt); break;
|
||||
case 34: if (operation34 != null) evnt = operation34.Run(); Debug.WriteLine("op34.Run() -> {0}", evnt); break;
|
||||
default: evnt = Event.None; break;
|
||||
}
|
||||
}
|
||||
else if (previousOperation != 0 && activeOperationLocal == 0)
|
||||
{
|
||||
switch (previousOperation)
|
||||
{
|
||||
case 1: if (operation1 != null) operation1.Stop(); Debug.WriteLine("op1.Stop()"); break;
|
||||
case 2: if (operation2 != null) operation2.Stop(); Debug.WriteLine("op2.Stop()"); break;
|
||||
case 3: if (operation3 != null) operation3.Stop(); Debug.WriteLine("op3.Stop()"); break;
|
||||
case 4: if (operation4 != null) operation4.Stop(); Debug.WriteLine("op4.Stop()"); break;
|
||||
case 21: if (operation21 != null) operation21.Stop(); Debug.WriteLine("op21.Stop()"); break;
|
||||
case 22: if (operation22 != null) operation22.Stop(); Debug.WriteLine("op22.Stop()"); break;
|
||||
case 23: if (operation23 != null) operation23.Stop(); Debug.WriteLine("op23.Stop()"); break;
|
||||
case 24: if (operation24 != null) operation24.Stop(); Debug.WriteLine("op24.Stop()"); break;
|
||||
case 31: if (operation31 != null) operation31.Stop(); Debug.WriteLine("op31.Stop()"); break;
|
||||
case 32: if (operation32 != null) operation32.Stop(); Debug.WriteLine("op32.Stop()"); break;
|
||||
case 33: if (operation33 != null) operation33.Stop(); Debug.WriteLine("op33.Stop()"); break;
|
||||
case 34: if (operation34 != null) operation34.Stop(); Debug.WriteLine("op34.Stop()"); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var d in tbfDevices) d.RunDeviceAfter();
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var d in tbfDevices) d.StopDevice();
|
||||
}
|
||||
|
||||
private void stopButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
Cursor = Cursors.WaitCursor;
|
||||
|
||||
workerThreadRunning = false;
|
||||
workerThread.Join(5000);
|
||||
workerThread = null;
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
|
||||
startButton.Enabled = true;
|
||||
stopButton.Enabled = false;
|
||||
configureParentButton.Enabled = true;
|
||||
configureComponent1Button.Enabled = true;
|
||||
configureComponent2Button.Enabled = true;
|
||||
configureComponent3Button.Enabled = true;
|
||||
}
|
||||
|
||||
private void DeviceTestDlg_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
Cursor = Cursors.WaitCursor;
|
||||
|
||||
if (workerThread != null)
|
||||
{
|
||||
workerThreadRunning = false;
|
||||
workerThread.Join(3000);
|
||||
workerThread = null;
|
||||
}
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
|
||||
SaveSettings();
|
||||
|
||||
Cursor = Cursors.Default;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,120 +0,0 @@
|
||||
<?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>
|
||||
@@ -1,126 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
/// <summary>
|
||||
/// Class to be serialized to an XML file...
|
||||
/// </summary>
|
||||
[XmlRootAttribute("DeviceTest")]
|
||||
public class LocalSettings
|
||||
{
|
||||
public string ParentClassName;
|
||||
public string ParentName;
|
||||
public string ParentSettings;
|
||||
|
||||
public string ComponentClassName;
|
||||
public string ComponentName;
|
||||
public string ComponentParentName;
|
||||
public string ComponentSettings;
|
||||
|
||||
public string Component2ClassName;
|
||||
public string Component2Name;
|
||||
public string Component2ParentName;
|
||||
public string Component2Settings;
|
||||
|
||||
public string Component3ClassName;
|
||||
public string Component3Name;
|
||||
public string Component3ParentName;
|
||||
public string Component3Settings;
|
||||
|
||||
public LocalSettings()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load public fields of this class from the XML file.
|
||||
/// </summary>
|
||||
/// <returns>LocalSettings object or null when Load() fails</returns>
|
||||
public static LocalSettings Load(string fileName)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (TextReader reader = new StreamReader(fileName))
|
||||
{
|
||||
LocalSettings ls = (new XmlSerializer(typeof(LocalSettings))).Deserialize(reader) as LocalSettings;
|
||||
// Copy the settings just in case De-serialize() completes OK
|
||||
return ls;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Save public fields of this class to the XML file.
|
||||
/// </summary>
|
||||
public void Save()
|
||||
{
|
||||
try
|
||||
{
|
||||
using (TextWriter writer = new StreamWriter(Program.LocalSettingsFileName))
|
||||
{
|
||||
(new XmlSerializer(typeof(LocalSettings))).Serialize(writer, this);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string msg = e.Message;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates history stored in a string array by a new latest string.
|
||||
/// </summary>
|
||||
/// <param name="lastStrValue">Last entered string</param>
|
||||
/// <returns>true = updated and saved</returns>
|
||||
public bool UpdateHistory(string lastStrValue, ref string[] history)
|
||||
{
|
||||
const int MaxHistoryLen = 10;
|
||||
|
||||
if (string.IsNullOrEmpty(lastStrValue)) return false;
|
||||
|
||||
int currentHistoryLength = (history != null) ? history.Length : 0;
|
||||
|
||||
int match = -1;
|
||||
for (int i = 0; i < currentHistoryLength; i++)
|
||||
{
|
||||
if (history[i] == lastStrValue)
|
||||
{
|
||||
match = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (match >= 0 || currentHistoryLength >= MaxHistoryLen)
|
||||
{
|
||||
/// History does not have to be extended (because of a match) or should not be extended (because of the lenght)
|
||||
if (match < 0) match = currentHistoryLength - 1;
|
||||
|
||||
for (int j = match; j > 0; j--)
|
||||
{
|
||||
history[j] = history[j - 1];
|
||||
}
|
||||
history[0] = lastStrValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/// History will be extended, new item inserted at the beginning
|
||||
string[] newHistory = new string[currentHistoryLength + 1];
|
||||
newHistory[0] = lastStrValue;
|
||||
for (int j = 1; j <= currentHistoryLength; j++)
|
||||
{
|
||||
newHistory[j] = history[j - 1];
|
||||
}
|
||||
history = newHistory;
|
||||
}
|
||||
Save();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2016-2017 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using log4net;
|
||||
|
||||
namespace DeviceTest
|
||||
{
|
||||
static class Program
|
||||
{
|
||||
/// Program information
|
||||
public static string Version; /// version string
|
||||
public static DateTime BuildDateTime; /// date and time of program build
|
||||
|
||||
/// log4net
|
||||
static ILog log;
|
||||
const string log4netConfigFName = "log4netConfig.xml";
|
||||
|
||||
/// Local settings
|
||||
public static readonly string LocAppDataDir;
|
||||
public static readonly string LocalSettingsFileName;
|
||||
public static readonly string LocalSettingsBackupName;
|
||||
public static LocalSettings LocalSettings;
|
||||
|
||||
static Program()
|
||||
{
|
||||
/// Program version string
|
||||
System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
Version ver = thisAssembly.GetName().Version;
|
||||
Version = string.Format("{0}.{1}.{2}", ver.Major, ver.Minor, ver.Build);
|
||||
BuildDateTime = new System.IO.FileInfo(thisAssembly.Location).LastWriteTime;
|
||||
|
||||
/// Local program configuration directory including the trailing backslash
|
||||
LocAppDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) +
|
||||
Path.DirectorySeparatorChar + "TestBenchFramework" + Path.DirectorySeparatorChar;
|
||||
LocalSettingsFileName = LocAppDataDir + "DeviceTest.xml";
|
||||
LocalSettingsBackupName = LocAppDataDir + "DeviceTest.backup.xml";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
///
|
||||
/// Load the local settings
|
||||
///
|
||||
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsFileName);
|
||||
if (Program.LocalSettings == null)
|
||||
{
|
||||
/// Loading local seetings from regular config file failed. Use the backup
|
||||
Program.LocalSettings = LocalSettings.Load(Program.LocalSettingsBackupName);
|
||||
if (Program.LocalSettings == null)
|
||||
{
|
||||
MessageBox.Show("Na tomto počítači nebol tento program ani raz spustený.\r\nPoužijú sa základné nastavenia.", "Upozornenie", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
Program.LocalSettings = new LocalSettings();
|
||||
Directory.CreateDirectory(LocAppDataDir);
|
||||
Program.LocalSettings.Save();
|
||||
}
|
||||
else
|
||||
{
|
||||
LocalSettings.Save(); /// Save the settings to overwrite the wrong file
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Loading local seetings from the regular config file was successful. Update the backup
|
||||
File.Copy(Program.LocalSettingsFileName, Program.LocalSettingsBackupName, true);
|
||||
}
|
||||
|
||||
/// Configure and start logging
|
||||
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(LocAppDataDir + log4netConfigFName));
|
||||
log = LogManager.GetLogger(typeof(Program));
|
||||
log.Fatal("--------------------------------------------------------------------------------");
|
||||
log.Fatal(string.Format("TBF ver.{0}", Version));
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
|
||||
try
|
||||
{
|
||||
DeviceTestDlg dlg = new DeviceTestDlg();
|
||||
Application.Run(dlg);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
LogException(log, "Exception in Application.Run(DeviceTestDlg)", exc);
|
||||
MessageBox.Show("Program havaroval:" +
|
||||
Environment.NewLine + Environment.NewLine + exc.Message +
|
||||
((exc.InnerException == null) ? string.Empty : (Environment.NewLine + exc.InnerException.Message)) +
|
||||
Environment.NewLine + exc.StackTrace,
|
||||
"Pozor!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
|
||||
}
|
||||
}
|
||||
|
||||
static void LogException(ILog log, string description, Exception e)
|
||||
{
|
||||
log.FatalFormat("---------------( {0} )---------------", description);
|
||||
log.FatalFormat("Message : {0}", e.Message);
|
||||
if (e.InnerException != null)
|
||||
{
|
||||
log.FatalFormat("InnerMessage : {0}", e.InnerException.Message);
|
||||
}
|
||||
log.FatalFormat("StackTrace : {0}{1}", Environment.NewLine, e.StackTrace);
|
||||
log.Fatal("--------------------------------------");
|
||||
}
|
||||
}
|
||||
}
|
||||
-63
@@ -1,63 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace DeviceTest.Properties {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DeviceTest.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
<?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.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: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" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
</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" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
-26
@@ -1,26 +0,0 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace DeviceTest.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
@@ -1,3 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,36 +0,0 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("Dirichlet.Numerics")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Dirichlet.Numerics")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2012")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("a588abc0-c631-4475-9eab-4163d9f81fed")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +0,0 @@
|
||||
Copyright 2014 Rick Sladkey
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -1,525 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<diagram program="umlet" version="12.2">
|
||||
<zoom_level>8</zoom_level>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>0</y>
|
||||
<w>40</w>
|
||||
<h>64</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;48;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.InitialState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>8</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes>i</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>48</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>'Test Start' transition sequence</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>56</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.RegionEndState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>96</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>88</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>344</x>
|
||||
<y>128</y>
|
||||
<w>160</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Initialize (single) test results</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>136</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Decision</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>176</y>
|
||||
<w>32</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>184</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Decision</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>224</y>
|
||||
<w>32</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.RegionEndState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>272</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>232</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>264</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>344</x>
|
||||
<y>304</y>
|
||||
<w>160</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Make the water tank empty</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>312</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.RegionEndState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>352</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>344</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>272</x>
|
||||
<y>168</y>
|
||||
<w>160</w>
|
||||
<h>128</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-
|
||||
m2=[Emptying always]</panel_attributes>
|
||||
<additional_attributes>144;112;24;112;24;24;136;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>216</y>
|
||||
<w>176</w>
|
||||
<h>160</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-
|
||||
m2=[Enough room in tank]</panel_attributes>
|
||||
<additional_attributes>24;144;160;144;160;24;32;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>344</x>
|
||||
<y>384</y>
|
||||
<w>160</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Set the required water flow</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>392</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>432</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Measure the 'start' mass of water</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>440</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>344</x>
|
||||
<y>480</y>
|
||||
<w>160</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Start the test (diverter, etc.)</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>488</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.RegionEndState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>528</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>344</x>
|
||||
<y>560</y>
|
||||
<w>160</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Read intermediate results</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>520</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>568</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Decision</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>608</y>
|
||||
<w>32</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>272</x>
|
||||
<y>512</y>
|
||||
<w>160</w>
|
||||
<h>128</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-
|
||||
m2=[Test in progress]</panel_attributes>
|
||||
<additional_attributes>144;24;24;24;24;112;136;112</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>616</y>
|
||||
<w>40</w>
|
||||
<h>64</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;48;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Text</type>
|
||||
<coordinates>
|
||||
<x>424</x>
|
||||
<y>640</y>
|
||||
<w>104</w>
|
||||
<h>24</h>
|
||||
</coordinates>
|
||||
<panel_attributes>[Test completed]</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>664</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Measure the 'end' mass of water</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>712</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Calculate and save this test results</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>672</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>720</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Decision</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>760</y>
|
||||
<w>32</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>768</y>
|
||||
<w>40</w>
|
||||
<h>64</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;48;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>408</x>
|
||||
<y>80</y>
|
||||
<w>216</w>
|
||||
<h>712</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-
|
||||
m2=[More repetitions to be done]</panel_attributes>
|
||||
<additional_attributes>24;24;200;24;200;696;32;696</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Text</type>
|
||||
<coordinates>
|
||||
<x>264</x>
|
||||
<y>792</y>
|
||||
<w>160</w>
|
||||
<h>24</h>
|
||||
</coordinates>
|
||||
<panel_attributes>[All test repetitions completed]</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>816</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Stop any running tests, etc. (?)</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>328</x>
|
||||
<y>864</y>
|
||||
<w>192</w>
|
||||
<h>32</h>
|
||||
</coordinates>
|
||||
<panel_attributes>'Test End' transition sequence</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>824</y>
|
||||
<w>40</w>
|
||||
<h>56</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;40;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>872</y>
|
||||
<w>40</w>
|
||||
<h>64</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>24;48;24;24</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.FinalState</type>
|
||||
<coordinates>
|
||||
<x>416</x>
|
||||
<y>920</y>
|
||||
<w>16</w>
|
||||
<h>16</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
</diagram>
|
||||
-261
@@ -1,261 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<diagram program="umlet" version="12.2">
|
||||
<zoom_level>10</zoom_level>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>120</y>
|
||||
<w>120</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Load the default
|
||||
procedure
|
||||
</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>40</y>
|
||||
<w>50</w>
|
||||
<h>100</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;80;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.InitialState</type>
|
||||
<coordinates>
|
||||
<x>450</x>
|
||||
<y>60</y>
|
||||
<w>20</w>
|
||||
<h>20</h>
|
||||
</coordinates>
|
||||
<panel_attributes>i</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>190</y>
|
||||
<w>120</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Reset valves,
|
||||
pumps, etc.
|
||||
</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>130</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;60;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>400</x>
|
||||
<y>260</y>
|
||||
<w>120</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Detect cameras</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>200</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;60;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>370</x>
|
||||
<y>550</y>
|
||||
<w>180</w>
|
||||
<h>110</h>
|
||||
</coordinates>
|
||||
<panel_attributes>complex
|
||||
state
|
||||
--
|
||||
some more...
|
||||
|
||||
|
||||
-.</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>370</x>
|
||||
<y>390</y>
|
||||
<w>180</w>
|
||||
<h>60</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Display prompt, enable
|
||||
'Cycle' and 'Test' buttons
|
||||
and wait for a selection</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>320</y>
|
||||
<w>50</w>
|
||||
<h>90</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;70;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.RegionEndState</type>
|
||||
<coordinates>
|
||||
<x>450</x>
|
||||
<y>330</y>
|
||||
<w>20</w>
|
||||
<h>20</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>270</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;60;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Decision</type>
|
||||
<coordinates>
|
||||
<x>440</x>
|
||||
<y>480</y>
|
||||
<w>40</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes/>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>420</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;60;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>430</x>
|
||||
<y>490</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;60;30;30</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>620</x>
|
||||
<y>430</y>
|
||||
<w>160</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Disable 'Cycle'
|
||||
and 'Test' buttons</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.State</type>
|
||||
<coordinates>
|
||||
<x>620</x>
|
||||
<y>360</y>
|
||||
<w>160</w>
|
||||
<h>40</h>
|
||||
</coordinates>
|
||||
<panel_attributes>Empty the tank</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>450</x>
|
||||
<y>440</y>
|
||||
<w>270</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>250;30;250;60;30;60</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>670</x>
|
||||
<y>370</y>
|
||||
<w>50</w>
|
||||
<h>80</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;30;30;60</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.Relation</type>
|
||||
<coordinates>
|
||||
<x>440</x>
|
||||
<y>310</y>
|
||||
<w>280</w>
|
||||
<h>70</h>
|
||||
</coordinates>
|
||||
<panel_attributes>lt=<-</panel_attributes>
|
||||
<additional_attributes>30;30;260;30;260;50</additional_attributes>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Text</type>
|
||||
<coordinates>
|
||||
<x>490</x>
|
||||
<y>480</y>
|
||||
<w>180</w>
|
||||
<h>20</h>
|
||||
</coordinates>
|
||||
<panel_attributes>'Empty a tank' selected
|
||||
</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
<element>
|
||||
<type>com.umlet.element.custom.Text</type>
|
||||
<coordinates>
|
||||
<x>290</x>
|
||||
<y>520</y>
|
||||
<w>160</w>
|
||||
<h>20</h>
|
||||
</coordinates>
|
||||
<panel_attributes>'Cycle' or 'Test' selected
|
||||
</panel_attributes>
|
||||
<additional_attributes/>
|
||||
</element>
|
||||
</diagram>
|
||||
@@ -1,73 +0,0 @@
|
||||
Otazky:
|
||||
-------
|
||||
- ako pouzit T6
|
||||
- co je 'T to Open' pri RV
|
||||
- na co sluzia VI2P, VI3P a VI4P
|
||||
|
||||
|
||||
TODO:
|
||||
-----
|
||||
- nefunguje pumpa P3
|
||||
- nahlad na cestu v procedure
|
||||
- purgeStart a purgeEnd --> transitionSteps/Sequences
|
||||
- horeuvedene pre RegulValve
|
||||
- volba procedury nie je zablokovana pocas testov
|
||||
- vsetky Target... v Process tabe
|
||||
- Hmotnosti:
|
||||
1 netarovat, merat okamzitu,
|
||||
2 nulovacia procedura na tlacitko manualne,
|
||||
3 pri starte sa spytat ci vynulovat vahy
|
||||
- Preco sa nenacitaju zmeny v Test-e ???
|
||||
|
||||
|
||||
- pouzit oneskorenie na ventily
|
||||
- skontrolovat doc (freq v Hz)
|
||||
|
||||
Demo version:
|
||||
|
||||
- pouzit progress bary na vyber testu
|
||||
- vycistit Measurement
|
||||
- simulacia skonci pri druhom 'start_measurement'
|
||||
- pri simulacii sa meni mass pri merani end-mass (klapka by mala byt vypnuta!)
|
||||
|
||||
- otvorit Proceduru (v dalsom okne v zamknutom stave) aj ked je okno Procedures zamknute
|
||||
- pridat seriove cisla do parametrov komponentov
|
||||
- zapamatavat si sirky stlpcov v PathsDlg, ... (aj inde)
|
||||
- skontroluj vsetky ListViewEx-y + skorsie spracovanie vysledkov (dolezite aj pre spravnu tvorbu noveho mena)
|
||||
- preco posledne okno skace
|
||||
- chyba spracovanie procedure / metrology2 Tol.Abzug, Fehl.Korr -+
|
||||
- vsetky mena stlpcov a tabov do Strings.xxx
|
||||
|
||||
Testovanie na stanici:
|
||||
|
||||
- pouzivat skutocne 'rvalves'
|
||||
- ked vyberiem priamo Q1, Q2, Q3 (poskonceni predchadzajuceho testu), neprepise sa obsah combo boxu
|
||||
- prislusne EtPulses by mali ist cez RegisterReader komponent + common RegisterReader pre Master
|
||||
- ako je to s WM0 ...
|
||||
- na zaciatku zmerat vahu a dovolit vypustit tanky
|
||||
- updatovat vahu - obrazok = je nespravna kapacita vahy
|
||||
- spracovanie vysledkov podla excelu: corr. na hustotu vzduchu (zavazie), corr. na hustotu vody v zav. od teploty
|
||||
- podpora pre zbieranie vysledkov
|
||||
- logovanie vysledkov do excelu
|
||||
- zastavit vodu na konci skusky
|
||||
- Pri nastavovani prietoku nie je nic vidno
|
||||
- pouzivat skutocne 'rvalves'
|
||||
- pri vytvarani testov vyberat cesty podla prietoku
|
||||
- ked sa zada cesta napisanim mena = skontrolovat
|
||||
- zapamatat si stav ventilu pri prietoku
|
||||
- nulovanie = nulovanie vahy
|
||||
- zmenit text: tarovanie -> vypustanie
|
||||
|
||||
- pripravit IDC100: !ReadRegisterOp, Idc100.GetValue-SetValue (na konci), GetState a ukoncenie operacie
|
||||
- sub-sekvencie pre Q-set a metody
|
||||
- zobrazit typizovanu schemu
|
||||
|
||||
Neskor:
|
||||
|
||||
- nevidno ci su neulozene zmeny
|
||||
- upozornenie pri cancel ak su neulozene zmeny
|
||||
- spravne updatovat tlacitka ked su FixedItems (FixedRows)
|
||||
- ked odomknem Komponenty tak sa zrusi vyber
|
||||
- vaha ToString - prve zobrazit capacity
|
||||
- moznost menenia poradia aj v components
|
||||
- rozdelit ventily podla ciest?
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 64 KiB |
@@ -1,91 +0,0 @@
|
||||
Assumption
|
||||
----------
|
||||
The installation consists of one or more similar test benches. Each test bench is controlled by one PC-based computer. In addition, one or more PC-s can run the same application and manipulated data shared by the test benches (e.g. PC located in offices). All PC-s run the same version of software (this is a must now - Munich - in the future we can try to deal with backward/forward compatibility issues).
|
||||
|
||||
Development environment
|
||||
-----------------------
|
||||
- Visual Studio 2012 Professional
|
||||
- Database: MySQL (???)
|
||||
|
||||
User iterface
|
||||
-------------
|
||||
- WindowsFormsApplication
|
||||
- Main part of the window occupies a tab control with hidden tabs
|
||||
(see http://weblogs.asp.net/kdente/archive/2005/11/14/430591.aspx)
|
||||
Tabs swithing is done programatically
|
||||
|
||||
Tabs:
|
||||
|
||||
Procedure
|
||||
- Procedure Info (summary, header)
|
||||
- Procedure History (changes)
|
||||
- Procedure Metrology
|
||||
- Procedure Technical
|
||||
- Procedure Purge
|
||||
- Procedure End
|
||||
- Procedure Adjustment
|
||||
- Procedure View
|
||||
- Procedure Inputs
|
||||
Home
|
||||
Insert
|
||||
Results
|
||||
- Results
|
||||
- Results D
|
||||
- Meters Ch
|
||||
- Temp Ch
|
||||
- Pressure
|
||||
Bench parameters
|
||||
- Technical
|
||||
- Balance
|
||||
- Temperature
|
||||
- Pressure
|
||||
- Flowmeter
|
||||
- Density
|
||||
Logs
|
||||
|
||||
|
||||
|
||||
Sensus Testbench Framework application settings consist of
|
||||
----------------------------------------------------------
|
||||
S1. Local settings stored on each PC
|
||||
S1.1 language settings, appearance, etc. (no other impact on the system function)
|
||||
S1.2 specification of databases used to store other settings (see 2.)
|
||||
There might be several sets of DB settings (1.2) when one should be able to access more test benches. When starting the system, this is indicated on the login screen as 'Test bench'/'Pruefstation'.
|
||||
|
||||
S2. Settings stored in databases:
|
||||
S2.1 'users' (typically shared between all benches - centralized access control)
|
||||
S2.2 'watermeter_types' info (typically shared between more benches)
|
||||
S2.3 'test_procedures' (typically shared between more identical benches)
|
||||
S2.4 'metrological_parameters' of the system (always unique for each system, not shared)
|
||||
S2.5 'watermeters' info (typically centralized / shared)
|
||||
S2.6 'test_results' (typically centralized / shared)
|
||||
etc.
|
||||
The databases might be running either on the local PC or remote,
|
||||
each database might be used by a single bench, or shared by more test benches. This configured in 1.2.
|
||||
|
||||
Application can be used to:
|
||||
---------------------------
|
||||
A1. Change local settings (S1.1, S1.2)
|
||||
A2. Change settings stored in the databases
|
||||
A3. Control system and run test procedures - this is only possible on PC-s controlling the benches. When procedure is started, local copy of necessary information from the DB-s is made to avoid problems.
|
||||
|
||||
User access control:
|
||||
--------------------
|
||||
U1. Access to
|
||||
U1.1 information read
|
||||
U1.2 information write/modify
|
||||
U1.3 action start
|
||||
is controlled by an access control mechanism.
|
||||
U2. Users
|
||||
U3. Groups
|
||||
Each user is a member of one or more groups. In case needed, a group with a single user is created. Access to information/actions is granted to groups.
|
||||
Muenich: Grooups are 'Tester',
|
||||
'Testing specialist',
|
||||
'Head of lab'
|
||||
'Maintenance specialist'
|
||||
'Metrologist'
|
||||
'Calibration specialist'
|
||||
U4. When necessary, system prompts user to authenticate himself/herself (login dialog). Authentication is invalidated as follows (optional):
|
||||
U4.1 When user closes the dialog, which was protected.
|
||||
U4.2 After certain time period
|
||||
U4.3 Never
|
||||
@@ -1,25 +0,0 @@
|
||||
<log4net>
|
||||
<!-- A1 is set to be a ConsoleAppender -->
|
||||
<appender name="A1" type="log4net.Appender.ConsoleAppender">
|
||||
<!-- A1 uses PatternLayout -->
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<!-- Print the date in ISO 8601 format -->
|
||||
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<!-- Set root logger level to DEBUG and its only appender to A1 -->
|
||||
<root>
|
||||
<level value="DEBUG" />
|
||||
<appender-ref ref="A1" />
|
||||
</root>
|
||||
|
||||
<!-- Print only messages of level WARN or above in the package NHibernate -->
|
||||
<logger name="NHibernate">
|
||||
<level value="WARN" />
|
||||
</logger>
|
||||
<logger name="TestBenchFramework.BenchControl.StateMachine">
|
||||
<level value="WARN" />
|
||||
</logger>
|
||||
|
||||
</log4net>
|
||||
@@ -1,27 +0,0 @@
|
||||
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in StateMachine.Worker()
|
||||
State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...)
|
||||
|
||||
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
|
||||
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
|
||||
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
|
||||
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
|
||||
|
||||
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
|
||||
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
|
||||
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
|
||||
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
|
||||
|
||||
State.Create(...).AddOperation(...).AddOperation(...).EnterState() . . in the sequence in Execute(...)
|
||||
|
||||
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
|
||||
WaitNextTick() (may throw QuitStateMachineException) . . . . . . . . in WaitRunDevsRunOps()
|
||||
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in WaitRunDevsRunOps()
|
||||
IList<Event> events = State.RunOperations(); . . . . . . . . . . . . . in WaitRunDevsRunOps()
|
||||
|
||||
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in WaitRunDevsRunOps()
|
||||
WaitNextTick() (assume QuitStateMachineException thrown) . . . . . . in WaitRunDevsRunOps()
|
||||
foreach (var device in devices) device.RunDeviceBefore(); . . . . . . in StateMachine.Worker() catch()
|
||||
State.RunOperations(); . . . . . . . . . . . . . . . . . . . . . . . . in StateMachine.Worker() catch()
|
||||
State.Empty.EnterState(); . . . . . . . . . . . . . . . . . . . . . . in StateMachine.Worker() catch()
|
||||
foreach (var device in devices) device.RunDeviceAfter(); . . . . . . . in StateMachine.Worker() catch()
|
||||
foreach (var device in devices) device.StopDevice(); . . . . . . . . . in StateMachine.Worker() catch()
|
||||
@@ -1,11 +0,0 @@
|
||||
Showing tabs in the designer:
|
||||
- select mainTabControl
|
||||
- in Properies change SizeMode to normal
|
||||
- in Properies change ItemSize to 0; 20
|
||||
|
||||
Hiding tabs in the designer:
|
||||
- select mainTabControl
|
||||
- in Properies change SizeMode to Fixed
|
||||
- in Poperties change ItemSize to 0; 1
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
af242843887f3bdcc52e485483356eaccd37ba67a35941530bd195a8310fc7d5aca8560576dfb62ad5a4bd2df789a5e8be068e62e7c976d6eeed8d63abbd9909
|
||||
|
||||
|
||||
= staratura
|
||||
@@ -0,0 +1,249 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Timers;
|
||||
using System.IO.Ports;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public class CR95HF_Reader
|
||||
{
|
||||
|
||||
private readonly byte [] CR95HF_CMD_ECHO = { 0x55 };
|
||||
private readonly byte[] CR95HF_CMD_IDN = { 0x01, 0x00 }; //CommandCode(0x01), Length(0x00)
|
||||
private readonly byte[] CR95HF_CMD_PROTOCOL_SELECT_ON = { 0x02, 0x02, 0x01, 0x0D }; //CommandCode(0x02), Length(0x02), ISO/IEC 15693(0x01), 26 Kbps H, Wait for SOF, 10% modulation, Single subcarrier S, CRC appended (0x0D)
|
||||
private readonly byte[] CR95HF_CMD_PROTOCOL_SELECT_OFF = { 0x02, 0x02, 0x00, 0x00 }; //CommandCode(0x02), Length(0x02), Protocol off (0x00), Protocol off (0x00)
|
||||
private List<byte> CR95HF_CMD_SEND_RECEIVE = new List<byte>(); // Command code (0x04), Length (this is number of bytes after this length byte), REQUEST_FLAGS(0x02) and payload (this varies based on device command)
|
||||
|
||||
private readonly byte REQUEST_FLAGS = 0x02; // Single subcarrier freq, High data rate, No Inventory/ProtExtn/Select/Address/Option flags
|
||||
|
||||
private SERIAL_Driver _SERIAL_Driver;
|
||||
public event DelNfc_CR95HF_MessageHandler MessageEvent;
|
||||
|
||||
private static readonly Dictionary<byte, string> CR95HF_ErrorCodes = new Dictionary<byte, string>
|
||||
{
|
||||
{ 0x00 , "Success, No error" },
|
||||
{ 0x80 , "Success, No error" },
|
||||
{ 0xA0 , "Success, No error" },
|
||||
{ 0xC0 , "Success, No error" },
|
||||
{ 0x82 , "Invalid command length" },
|
||||
{ 0x83 , "Invalid protocol"},
|
||||
{ 0x63 , "EEmdSOFerror23, SOF error in high part(duration 2 to 3 etu) in ISO/IEC 14443B"},
|
||||
{ 0x65 , "EEmdSOFerror10, SOF error in low part(duration 10 to 11 etu) in ISO/IEC 14443B"},
|
||||
{ 0x66 , "EEmdEgt error, Extended Guard Time error in ISO/IEC 14443B"},
|
||||
{ 0x67 , "ETr1 Too Big Too long, TR1 send by the card, reception stopped in ISO/IEC 14443BT"},
|
||||
{ 0x68 , "ETr1Too small Too small, TR1 send by the card in ISO/IEC 14443B"},
|
||||
{ 0x71 , "EinternalError, Wrong frame format decoded"},
|
||||
{ 0x85 , "EUserStop, Stopped by user(used only in Card mode)"},
|
||||
{ 0x86 , "ECommError, Hardware communication error"},
|
||||
{ 0x87 , "EFrameWaitTOut,Frame wait time out (no valid reception)"},
|
||||
{ 0x88 , "EInvalidSof,Invalid SOF" },
|
||||
{ 0x89 , "EBufOverflow,Too many bytes received and data still arriving" },
|
||||
{ 0x8A , "EFramingError,if start bit = 1 or stop bit = 0"},
|
||||
{ 0x8B , "EEgtError,EGT time out" },
|
||||
{ 0x8C , "EInvalidLen,Valid for ISO/IEC 18092, if Length<3" },
|
||||
{ 0x8D , "ECrcError,CRC error, Valid only for ISO/IEC 18092" },
|
||||
{ 0x8E , "ERecvLost,CRC error,When reception is lost without EOF received(or subcarrier was lost)"},
|
||||
{ 0x8F , "ENoField,CRC error,When Listen command detects the absence of external field)"},
|
||||
{ 0x90 , "EUnintByte,Residual bits in last byte. Useful for ACK/NAK reception of ISO/IEC 14443 Type A"},
|
||||
{ 0xFF , "Invalid COM port, request Failed" },
|
||||
};
|
||||
|
||||
public CR95HF_Reader(SERIAL_Driver serialdriver)
|
||||
{
|
||||
_SERIAL_Driver = serialdriver;
|
||||
}
|
||||
|
||||
#region Message Event
|
||||
private void OnMessageEvent(string message)
|
||||
{
|
||||
NfcMessageEventArgs e = new NfcMessageEventArgs();
|
||||
e.Message = message;
|
||||
|
||||
if (MessageEvent != null)
|
||||
{
|
||||
MessageEvent(this, e);
|
||||
}
|
||||
e = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
public bool OpenConnection(string comport, int baudrate, int databits, Parity parity, StopBits stopbits)
|
||||
{
|
||||
return _SERIAL_Driver.OpenConnection(comport, baudrate, databits, parity, stopbits);//Port Intialization and Port Open;
|
||||
}
|
||||
|
||||
public bool CR95HF_Connect()
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
|
||||
if (_SERIAL_Driver.isOpen())
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_IDN));
|
||||
_SERIAL_Driver.SendMessage(CR95HF_CMD_IDN, CR95HF_CMD_IDN.Length);
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if (bytesReceived.Length == 17 && (bytesReceived[0] == 0x00 || bytesReceived[0] == 0x80))
|
||||
{
|
||||
string strReader = System.Text.Encoding.ASCII.GetString(bytesReceived);
|
||||
strReader = strReader.Substring(2, 12);
|
||||
OnMessageEvent("CombiHead '" + strReader + "'");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
|
||||
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
|
||||
else
|
||||
OnMessageEvent("NFC CR95HF error: Unidentified");
|
||||
return false;
|
||||
}
|
||||
|
||||
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_ON));
|
||||
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_ON, CR95HF_CMD_PROTOCOL_SELECT_ON.Length);
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
|
||||
{
|
||||
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
|
||||
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
|
||||
else
|
||||
OnMessageEvent("NFC CR95HF error: Unidentified");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
OnMessageEvent("NFC CR95HF: Protocol ON");
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CR95HF_RFProtocolOn()
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
|
||||
if (_SERIAL_Driver.isOpen())
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_ON));
|
||||
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_ON, CR95HF_CMD_PROTOCOL_SELECT_ON.Length);
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
|
||||
{
|
||||
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
|
||||
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
|
||||
else
|
||||
OnMessageEvent("NFC CR95HF error: Unidentified");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CR95HF_RFProtocolOff()
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
|
||||
if (_SERIAL_Driver.isOpen())
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_PROTOCOL_SELECT_OFF));
|
||||
_SERIAL_Driver.SendMessage(CR95HF_CMD_PROTOCOL_SELECT_OFF, CR95HF_CMD_PROTOCOL_SELECT_OFF.Length);
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] != 0x00) && (bytesReceived[0] != 0x80))
|
||||
{
|
||||
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
|
||||
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
|
||||
else
|
||||
OnMessageEvent("NFC CR95HF error: Unidentified");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CR95HF_SendRecv(byte[] fromDevice, out byte[] toDevice)
|
||||
{
|
||||
CR95HF_CMD_SEND_RECEIVE = new List<byte>();
|
||||
toDevice = null;
|
||||
|
||||
if (_SERIAL_Driver.isOpen())
|
||||
{
|
||||
CR95HF_CMD_SEND_RECEIVE.Add(0x04);//Command Code
|
||||
CR95HF_CMD_SEND_RECEIVE.Add((byte)(1 + fromDevice.Length)); // This is bytes from device + 1 (because request flags byte added here)
|
||||
CR95HF_CMD_SEND_RECEIVE.Add(REQUEST_FLAGS);
|
||||
CR95HF_CMD_SEND_RECEIVE.AddRange(fromDevice);
|
||||
|
||||
//OnMessageEvent("Tx- " + Tools.ByteArrayToHexString(CR95HF_CMD_SEND_RECEIVE.ToArray()));
|
||||
_SERIAL_Driver.SendMessage(CR95HF_CMD_SEND_RECEIVE.ToArray(), (3 + fromDevice.Length)); // This is bytes from device + 3 (because request flags + length + reader command)
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
byte[] bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == 0x00) || (bytesReceived[0] == 0x80) || (bytesReceived[0] == 0xA0) || (bytesReceived[0] == 0xC0))
|
||||
{
|
||||
toDevice = new byte[bytesReceived[1]];
|
||||
for (int i = 0; i < Convert.ToInt32(bytesReceived[1]); i++)
|
||||
{
|
||||
toDevice[i] = bytesReceived[2 + i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (CR95HF_ErrorCodes.ContainsKey(bytesReceived[0]))
|
||||
OnMessageEvent("NFC CR95HF error: " + CR95HF_ErrorCodes[bytesReceived[0]]);
|
||||
else
|
||||
OnMessageEvent("NFC CR95HF error: Unidentified");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public bool CR95HF_Echo()
|
||||
{
|
||||
if (_SERIAL_Driver.isOpen())
|
||||
{
|
||||
if (_SERIAL_Driver.SendMessage(CR95HF_CMD_ECHO, 1))
|
||||
{
|
||||
if (_SERIAL_Driver.GetRawData().Length == 0) return false;
|
||||
byte[] bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
if ((bytesReceived.Length == 1) && (bytesReceived[0] == CR95HF_CMD_ECHO[0]))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,664 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.IO.Ports;
|
||||
using System.Timers;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public class MCI_Protocol
|
||||
{
|
||||
private bool MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
|
||||
private readonly byte STX = (byte) 0x02;
|
||||
private readonly byte ETX = (byte) 0x03;
|
||||
private readonly byte RX_ACK_RESPONSE_MSG_ID = (byte) 0xC9;
|
||||
private readonly byte RX_ACK_PASSTHROUGH_MSG_ID = (byte)0xCE;
|
||||
private readonly ushort[] MciPasswords = { 0x0000, 0x55AA, 0x1234, 0x97D1 };
|
||||
|
||||
public event DelNfc_MCI_MessageHandler MessageEvent;
|
||||
|
||||
public enum StructName
|
||||
{
|
||||
Calibration,
|
||||
Configuration,
|
||||
Status,
|
||||
Power,
|
||||
LCD,
|
||||
unused1,
|
||||
unused2,
|
||||
Diagnostics,
|
||||
ProductionInfo,
|
||||
AckResponse,
|
||||
RadioParams,
|
||||
RadioInfo,
|
||||
Command,
|
||||
EEPROM_Metro,
|
||||
ST25_Chip_Registers,
|
||||
IndexReset,
|
||||
NfcSecurity
|
||||
}
|
||||
|
||||
public static readonly Dictionary<byte, string> StructName_id_to_str = new Dictionary<byte, string>
|
||||
{
|
||||
{0, "Calibration"},
|
||||
{1, "Configuration"},
|
||||
{2, "Status"},
|
||||
{3, "Power"},
|
||||
{4, "LCD"},
|
||||
{5, "unused1"},
|
||||
{6, "unused2"},
|
||||
{7, "Diagnostics"},
|
||||
{8, "ProductionInfo"},
|
||||
{9, "AckResponse"},
|
||||
{10, "RadioParams"},
|
||||
{11, "RadioInfo"},
|
||||
{12, "Command"},
|
||||
{13, "EEPROM_Metro"},
|
||||
{14, "ST25_Chip_Registers"},
|
||||
{15, "IndexReset"},
|
||||
{16, "NfcSecurity"}
|
||||
};
|
||||
|
||||
private string StructToStr(StructName StName)
|
||||
{
|
||||
return StructName_id_to_str[Convert.ToByte(StName)];
|
||||
}
|
||||
|
||||
private bool IsValidStruct(StructName StName)
|
||||
{
|
||||
return MCI_Protocol.StructName_id_to_str.ContainsKey(Convert.ToByte(StName));
|
||||
}
|
||||
|
||||
public enum MCI_ErrorCodes
|
||||
{
|
||||
// these first 0..8 error codes are defined both in
|
||||
// radio and metro. They can return these codes.
|
||||
// higher codes will not be returned
|
||||
Success_No_error = 0,
|
||||
MCI_Error_MeterAns_Timeout = 1,
|
||||
MCI_Error_MeterAns_Wrong_CRC = 2,
|
||||
MCI_Error_MeterAns_Wrong_password = 3,
|
||||
MCI_Error_MeterAns_Data_not_available = 4,
|
||||
MCI_Error_MeterAns_Invalid_access = 5,
|
||||
MCI_Error_MeterAns_Command_not_supported = 6,
|
||||
MCI_Error_MeterAns_Command_not_executed = 7,
|
||||
MCI_Error_MeterAns_Unidentified = 8,
|
||||
// in case higher errors will be defined for the IMI in future
|
||||
// we keep some distance with the errorcodes...
|
||||
|
||||
// host error codes from MCI_Read/Write start from 20:
|
||||
MCI_Error_Host_Bad_MCI_ID = 20,
|
||||
MCI_Error_Host_WriteReq_denied = 21,
|
||||
MCI_Error_Host_WriteReq_bad_device_ans = 22,
|
||||
MCI_Error_Host_ReadReq_denied = 23,
|
||||
MCI_Error_Host_ReadReq_bad_device_ans = 24,
|
||||
MCI_Error_Host_Bad_Payload_Len = 25,
|
||||
MCI_Error_Host_MeterCRCDoesNotMatch = 26,
|
||||
MCI_Error_Host_ReadReqBadResponseStructure = 27,
|
||||
MCI_Error_Host_InvalidStructureID_CannotSendMsg = 28,
|
||||
MCI_Error_Host_CommandNotInCmdCodeList = 29,
|
||||
|
||||
// host error codes from method MCI_TxRequest_RxResponse start from 40
|
||||
MCI_Error_Host_MB_CTRL_Reg_Read1 = 40,
|
||||
MCI_Error_Host_MB_disabled1 = 41,
|
||||
MCI_Error_Host_MB_LEN_Reg_read1 = 42,
|
||||
MCI_Error_Host_MB_msg_read1 = 43,
|
||||
MCI_Error_Host_req_not_sent = 44,
|
||||
MCI_Error_Host_req_not_read_by_iperl = 45,
|
||||
MCI_Error_Host_MB_CTRL_Reg_Read2 = 46,
|
||||
MCI_Error_Host_MB_disabled2 = 47,
|
||||
MCI_Error_Host_MB_LEN_Reg_read2 = 48,
|
||||
MCI_Error_Host_MB_msg_read2 = 49,
|
||||
MCI_Error_Host_Timeout = 50,
|
||||
MCI_Error_Host_msg_write = 51
|
||||
}
|
||||
|
||||
public static string GetMCIErrorMessage(byte ErrorCode)
|
||||
{
|
||||
// this is called reflection. The variable names will be
|
||||
// returned. No need of copys of variable names to string values.
|
||||
return ((MCI_ErrorCodes) ErrorCode).ToString();
|
||||
}
|
||||
|
||||
public static readonly Dictionary<byte, string> MCI_CmdCodes = new Dictionary<byte, string>
|
||||
{
|
||||
{0x00 , "Command: No Operation" },
|
||||
{0x01 , "Command: Clear Alarms" },
|
||||
{0x04 , "Command: Clear Diag" },
|
||||
{0x05 , "Command: Clear Peak flowrate" },
|
||||
{0x06 , "Command: Enter Active mode" },
|
||||
{0x07 , "Command: Enter Test mode" },
|
||||
{0x09 , "Command: Reset Accumulated Volume" },
|
||||
{0x0A , "Command: Factory Default" },
|
||||
{0x0B , "Command: Seal" },
|
||||
{0x0C , "Command: Send radio address to radio FW" },
|
||||
{0x0D , "Command: Adjust Field" },
|
||||
{0x0E , "Command: LCD All segments ON" },
|
||||
{0x0F , "Command: LCD All segments OFF" },
|
||||
{0x10 , "Command: LCD Even segments ON" },
|
||||
{0x11 , "Command: LCD Odd segments ON" },
|
||||
{0x12 , "Command: LNA ON" },
|
||||
{0x13 , "Command: LNA OFF" },
|
||||
{0x14 , "Command: EPD ON" },
|
||||
{0x15 , "Command: EPD OFF" },
|
||||
{0x16 , "Command: Enter LPM4" },
|
||||
{0x17 , "Command: Select drive coil connectivity" },
|
||||
{0x1A , "Command: Enter VRTM" },
|
||||
{0x1B , "Custom Package Mode ON" },
|
||||
{0x1C , "Custom Package Mode OFF" },
|
||||
{0x20 , "Command: Deinstall" },
|
||||
{0x21 , "Command: Audit Mode" },
|
||||
{0x22 , "Command: Diagnostic Refresh" },
|
||||
{0x23 , "Command: NFC Security Reset Access Level" }
|
||||
};
|
||||
|
||||
Dictionary<int, byte[]> MCI_Write_Info = new Dictionary<int, byte[]>();
|
||||
Dictionary<int, byte[]> MCI_Read_Info = new Dictionary<int, byte[]>();
|
||||
Dictionary<int, byte[]> MCI_ReadResponse_Info = new Dictionary<int, byte[]>();
|
||||
|
||||
private byte MB_Ctrl_Reg_Value;
|
||||
private byte MB_LEN_Dyn_Register;
|
||||
|
||||
private ST25DV_Device _ST25DV_Device;
|
||||
Tools.Crc16Ccitt Crc = new Tools.Crc16Ccitt(Tools.InitialCrcValue.NonZero1);
|
||||
|
||||
private System.Timers.Timer _ReqResCycleTimeoutTimer = new System.Timers.Timer();
|
||||
|
||||
public MCI_Protocol(ST25DV_Device ST25DVDevice)
|
||||
{
|
||||
_ST25DV_Device = ST25DVDevice;
|
||||
Init_MCI_Info_MsgId_Password();
|
||||
}
|
||||
private void Init_MCI_Info_MsgId_Password()
|
||||
{
|
||||
//Write request
|
||||
byte[] value1 = { 0x40, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(0, value1);//Calibration
|
||||
|
||||
byte [] value2 = { 0x41, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(1, value2); //Configuration
|
||||
|
||||
byte[] value3 = { 0x42, 0x34, 0x12 };
|
||||
MCI_Write_Info.Add(2, value3); //Status
|
||||
|
||||
byte[] value4 = { 0x43, 0x34, 0x12 };
|
||||
MCI_Write_Info.Add(3, value4);//Power
|
||||
|
||||
byte[] value5 = { 0x44, 0xAA, 0x55 };
|
||||
MCI_Write_Info.Add(4, value5); //LCD
|
||||
|
||||
byte[] value6 = { 0x48, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(8, value6);//ProductionInfo
|
||||
|
||||
byte[] value7 = { 0x4E, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(10, value7);//RadioParams
|
||||
|
||||
byte[] value8 = { 0x4E, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(11, value8);//RadioInfo
|
||||
|
||||
byte[] value9 = { 0x4A, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(12, value9);//Command
|
||||
|
||||
byte[] valueIndexResetWrite = { 0x52, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(15, valueIndexResetWrite);//Index reset
|
||||
|
||||
byte[] valueNfcSecuritySignedWrite = { 0x54, 0xD1, 0x97 };
|
||||
MCI_Write_Info.Add(16, valueNfcSecuritySignedWrite);//NFC Security signed message - while writing
|
||||
|
||||
//Read request
|
||||
byte[] value10 = { 0x00, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(0, value10);//Calibration
|
||||
|
||||
byte[] value11 = { 0x01, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(1, value11); //Configuration
|
||||
|
||||
byte[] value12 = { 0x02, 0x34, 0x12 };
|
||||
MCI_Read_Info.Add(2, value12); //Status
|
||||
|
||||
byte[] value13 = { 0x03, 0x34, 0x12 };
|
||||
MCI_Read_Info.Add(3, value13);//Power
|
||||
|
||||
byte[] value14 = { 0x04, 0xAA, 0x55 };
|
||||
MCI_Read_Info.Add(4, value14); //LCD
|
||||
|
||||
byte[] value15 = { 0x07, 0xAA, 0x55 };
|
||||
MCI_Read_Info.Add(7, value15); //Diag
|
||||
|
||||
byte[] value16 = { 0x08, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(8, value16);//ProductionInfo
|
||||
|
||||
byte[] value17 = { 0x0E, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(10, value17);//RadioParams
|
||||
|
||||
byte[] value18 = { 0x0E, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(11, value18);//RadioInfo
|
||||
|
||||
byte[] valueIndexResetRead = { 0x12, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(15, valueIndexResetRead);//Index reset
|
||||
|
||||
byte[] valueNfcSecurityUnsignedRead = { 0x14, 0xD1, 0x97 };
|
||||
MCI_Read_Info.Add(16, valueNfcSecurityUnsignedRead);//NFC Security non-signed message - while reading
|
||||
|
||||
//Read response
|
||||
byte[] value19 = { 0xC0, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(0, value19);//Calibration
|
||||
|
||||
byte[] value20 = { 0xC1, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(1, value20); //Configuration
|
||||
|
||||
byte[] value21 = { 0xC2, 0x34, 0x12 };
|
||||
MCI_ReadResponse_Info.Add(2, value21); //Status
|
||||
|
||||
byte[] value22 = { 0xC3, 0x34, 0x12 };
|
||||
MCI_ReadResponse_Info.Add(3, value22);//Power
|
||||
|
||||
byte[] value23 = { 0xC4, 0xAA, 0x55 };
|
||||
MCI_ReadResponse_Info.Add(4, value23); //LCD
|
||||
|
||||
byte[] value24 = { 0xC7, 0xAA, 0x55 };
|
||||
MCI_ReadResponse_Info.Add(7, value24); //Diag
|
||||
|
||||
byte[] value25 = { 0xC8, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(8, value25);//ProductionInfo
|
||||
|
||||
byte[] value26 = { 0xC9, 0x00, 0x00 };
|
||||
MCI_ReadResponse_Info.Add(9, value26);//Ack response
|
||||
|
||||
byte[] value27 = { 0xCE, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(10, value27);//RadioParams
|
||||
|
||||
byte[] value28 = { 0xCE, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(11, value28);//RadioInfo
|
||||
|
||||
byte[] valueIndexResetReadResponse = { 0xD2, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(15, valueIndexResetReadResponse);//Index reset
|
||||
|
||||
byte[] valueNfcSecurityUnsignedReadResponse = { 0xD4, 0xD1, 0x97 };
|
||||
MCI_ReadResponse_Info.Add(16, valueNfcSecurityUnsignedReadResponse);//NFC Security non-signed message response - while reading
|
||||
}
|
||||
public bool MCI_Write(StructName StName, ushort offset, byte payloadlength, byte[] inBuffer, int timeoutMs,
|
||||
out byte errorCode)
|
||||
{
|
||||
List<byte> RequestMessage = new List<byte>();
|
||||
byte[] ResponseMessage = null;
|
||||
byte[] crcValue = new byte[2];
|
||||
|
||||
errorCode = (byte) MCI_ErrorCodes.Success_No_error;
|
||||
|
||||
if (payloadlength != inBuffer.Length)
|
||||
{
|
||||
OnMessageEvent("Insufficient Payload !, Payload length given as: " + inBuffer.Length);
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_Bad_Payload_Len;
|
||||
return false;
|
||||
}
|
||||
if (StName == StructName.Command)
|
||||
{
|
||||
if (MCI_Protocol.MCI_CmdCodes.ContainsKey(inBuffer[0]))
|
||||
{
|
||||
OnMessageEvent("Write " + MCI_Protocol.MCI_CmdCodes[inBuffer[0]]);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("Command: Not supported");
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_CommandNotInCmdCodeList;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IsValidStruct(StName))
|
||||
{
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_InvalidStructureID_CannotSendMsg;
|
||||
OnMessageEvent("Write request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
|
||||
return false;
|
||||
}
|
||||
OnMessageEvent("Write " + StructToStr(StName) + ": " + Tools.BytesToHex(inBuffer));
|
||||
}
|
||||
|
||||
byte[] MsgId_Password = MCI_Write_Info[(int)StName];
|
||||
|
||||
RequestMessage.Add(STX);
|
||||
RequestMessage.Add(Convert.ToByte(6 + payloadlength));
|
||||
RequestMessage.Add(MsgId_Password[0]);
|
||||
RequestMessage.Add((byte)(offset & 0x00FF));
|
||||
RequestMessage.Add((byte)((offset & 0xFF00) >> 8));
|
||||
RequestMessage.Add(payloadlength);
|
||||
|
||||
for (int i = 0; i < payloadlength; i++) // copy Buffer -> Request Payload
|
||||
{
|
||||
RequestMessage.Add(inBuffer[i]);
|
||||
}
|
||||
|
||||
RequestMessage.Add(MsgId_Password[1]);
|
||||
RequestMessage.Add(MsgId_Password[2]);
|
||||
// calc CRC and add to request
|
||||
crcValue = Crc.calcCRCfromMessage(RequestMessage.ToArray());
|
||||
RequestMessage.Add(crcValue[0]);
|
||||
RequestMessage.Add(crcValue[1]);
|
||||
RequestMessage.Add(ETX);
|
||||
|
||||
OnMessageEvent("Write Request: " + Tools.BytesToHex(RequestMessage.ToArray()));
|
||||
errorCode = MCI_TxRequest_RxResponse(RequestMessage.ToArray(), out ResponseMessage, timeoutMs);
|
||||
if (errorCode != (byte)MCI_ErrorCodes.Success_No_error)
|
||||
{
|
||||
OnMessageEvent("WriteReq denied");
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_WriteReq_denied;
|
||||
return false;
|
||||
}
|
||||
//Response message received
|
||||
byte[] RxCrcComputed = Crc.calcCRCfromMessage(ResponseMessage);
|
||||
byte[] RxCrcMeter = new byte[2];
|
||||
// CRC starts at length + STX(1) + lenbyte(1) = RespMsg[1] + 2.
|
||||
Array.Copy(ResponseMessage, ResponseMessage[1] + 2, RxCrcMeter, 0, 2);
|
||||
OnMessageEvent(Crc.commentCRC(RxCrcMeter, RxCrcComputed));
|
||||
if (!Crc.crc_do_match(RxCrcMeter, RxCrcComputed))
|
||||
{
|
||||
OnMessageEvent("CRC from Meter and PC do not match!");
|
||||
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_MeterCRCDoesNotMatch;
|
||||
return false;
|
||||
}
|
||||
if ((ResponseMessage[0] == STX)
|
||||
&& (ResponseMessage[1] == 0x07)
|
||||
&& (ResponseMessage[2] == RX_ACK_PASSTHROUGH_MSG_ID || ResponseMessage[2] == RX_ACK_RESPONSE_MSG_ID)
|
||||
&& (ResponseMessage[11] == ETX))
|
||||
{
|
||||
errorCode = ResponseMessage[6]; // meter error. Must be between 0..8
|
||||
OnMessageEvent("Write " + StructToStr(StName) + "Request Response: " + Tools.BytesToHex(ResponseMessage));
|
||||
if (errorCode != 0)
|
||||
{
|
||||
OnMessageEvent("Write Calibration: Failed with error " + Tools.ByteToHexString(errorCode));
|
||||
return false;
|
||||
}
|
||||
OnMessageEvent("Write : Success");
|
||||
return true;
|
||||
}
|
||||
OnMessageEvent("WriteReq bad device ans");
|
||||
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_WriteReq_bad_device_ans;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool MCI_Read(StructName StName, ushort offset, byte payloadlength, int timeoutMs,
|
||||
out byte[] outBuffer, out byte errorCode)
|
||||
{
|
||||
List<byte> RequestMessage = new List<byte>();
|
||||
byte[] ResponseMessage = null;
|
||||
|
||||
byte RxMsgLength;
|
||||
byte RxMsgId;
|
||||
byte [] RxOffset = new byte[2];
|
||||
byte RxPayloadlength;
|
||||
byte[] RxCrcMeter = new byte[2];
|
||||
byte[] RxPassword = new byte[2];
|
||||
|
||||
byte[] MsgId_Password = MCI_Read_Info[(byte)StName];
|
||||
byte[] crcValue;
|
||||
outBuffer = null;
|
||||
errorCode = (byte)0x00; //Success, No error
|
||||
|
||||
if (! IsValidStruct(StName))
|
||||
{
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_InvalidStructureID_CannotSendMsg;
|
||||
OnMessageEvent("Read request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
|
||||
return false;
|
||||
}
|
||||
OnMessageEvent("Read " + StructToStr(StName));
|
||||
|
||||
RequestMessage.Add(STX);
|
||||
RequestMessage.Add(0x06);
|
||||
RequestMessage.Add(MsgId_Password[0]);
|
||||
RequestMessage.Add((byte)(offset & 0x00FF));
|
||||
RequestMessage.Add((byte)((offset & 0xFF00) >> 8));
|
||||
RequestMessage.Add(payloadlength);
|
||||
RequestMessage.Add(MsgId_Password[1]);
|
||||
RequestMessage.Add(MsgId_Password[2]);
|
||||
|
||||
crcValue = Crc.calcCRCfromMessage(RequestMessage.ToArray());
|
||||
RequestMessage.AddRange(crcValue);
|
||||
RequestMessage.Add(ETX);
|
||||
|
||||
OnMessageEvent("Read Request: " + Tools.BytesToHex(RequestMessage.ToArray()));
|
||||
errorCode = MCI_TxRequest_RxResponse(RequestMessage.ToArray(), out ResponseMessage, timeoutMs);
|
||||
if (errorCode != (byte) MCI_ErrorCodes.Success_No_error)
|
||||
{
|
||||
OnMessageEvent("Read Request:" + MCI_Protocol.GetMCIErrorMessage(errorCode));
|
||||
return false;
|
||||
}
|
||||
if ((ResponseMessage[0] == STX) && (ResponseMessage[11] == ETX)
|
||||
&& (ResponseMessage[1] == 0x07)
|
||||
&& (ResponseMessage[2] == RX_ACK_PASSTHROUGH_MSG_ID || ResponseMessage[2] == RX_ACK_RESPONSE_MSG_ID) )
|
||||
{
|
||||
//Ack message received, not served the read request
|
||||
errorCode = ResponseMessage[6]; // forward error message from meter
|
||||
OnMessageEvent("Read " + StructToStr(StName) + ": Failed with error "
|
||||
+ Tools.ByteToHexString(errorCode));
|
||||
return false;
|
||||
}
|
||||
//Response message received
|
||||
RxMsgLength = ResponseMessage[1];
|
||||
RxMsgId = ResponseMessage[2];
|
||||
// RxOffset[0] = ResponseMessage[3];
|
||||
// RxOffset[1] = ResponseMessage[4];
|
||||
RxPayloadlength = ResponseMessage[5];
|
||||
// RxPassword[0] = ResponseMessage[6 + RxPayloadlength];
|
||||
// RxPassword[1] = ResponseMessage[7 + RxPayloadlength];
|
||||
RxCrcMeter[0] = ResponseMessage[8 + RxPayloadlength];
|
||||
RxCrcMeter[1] = ResponseMessage[9 + RxPayloadlength];
|
||||
|
||||
|
||||
byte[] RxCrcComputed = Crc.calcCRCfromMessage(ResponseMessage);
|
||||
OnMessageEvent(Crc.commentCRC(RxCrcMeter, RxCrcComputed));
|
||||
if (!Crc.crc_do_match(RxCrcMeter, RxCrcComputed))
|
||||
{
|
||||
errorCode = (byte) MCI_ErrorCodes.MCI_Error_Host_MeterCRCDoesNotMatch;
|
||||
return false;
|
||||
}
|
||||
|
||||
//TODO, verify received password matches with expected password or not?
|
||||
if (!((ResponseMessage[0] == STX) && (ResponseMessage[10 + RxPayloadlength] == ETX)
|
||||
&& ((ResponseMessage[2] & 0x3F) == (MsgId_Password[0] & 0x3F))))
|
||||
{
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_ReadReqBadResponseStructure;
|
||||
return false;
|
||||
}
|
||||
|
||||
outBuffer = new byte[RxPayloadlength];
|
||||
for (int i = 0; i < RxPayloadlength; i++)
|
||||
{
|
||||
outBuffer[i] = (ResponseMessage[6 + i]);
|
||||
}
|
||||
OnMessageEvent("Read Request Response: " + Tools.BytesToHex(ResponseMessage));
|
||||
|
||||
|
||||
if (IsValidStruct(StName))
|
||||
{
|
||||
OnMessageEvent("Read " + StructToStr(StName) + ": " + Tools.BytesToHex(outBuffer)
|
||||
+ " Success");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("Read Failed! Unknown MCI ID: " + Convert.ToByte(StName));
|
||||
errorCode = (byte)MCI_ErrorCodes.MCI_Error_Host_Bad_MCI_ID;
|
||||
return false;
|
||||
}
|
||||
errorCode = (byte)0x00; //Success, No error
|
||||
return true;
|
||||
}
|
||||
|
||||
private byte MCI_TxRequest_RxResponse(byte[] InBuffer, out byte[] OutBuffer, int timeout)
|
||||
{
|
||||
// return message is the errorcode, 0 means no error.
|
||||
byte[] responseMsg = null;
|
||||
OutBuffer = null;
|
||||
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
StartReqResCycleTimeoutTimer(timeout);
|
||||
|
||||
if (!_ST25DV_Device.ST25DV_ReadMailboxControlReg(out MB_Ctrl_Reg_Value))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB CTRL Reg read (1) failed");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte) MCI_ErrorCodes.MCI_Error_Host_MB_CTRL_Reg_Read1;
|
||||
}
|
||||
//Mailbox enable/disable check, proceed further only if enabled
|
||||
if ((MB_Ctrl_Reg_Value & 0x01) == 0x00)
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB feature (1) disabled");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_disabled1;
|
||||
}
|
||||
//Checking iPERL previous message is in mailbox or not, if present then read it and return failure
|
||||
if ((MB_Ctrl_Reg_Value & 0x02) == 0x02)
|
||||
{
|
||||
byte returnError;
|
||||
OnMessageEvent("NFC DLL Error: Previous message not read, reading now !");
|
||||
if (!_ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MB_LEN_Dyn_Register))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB LEN Reg read (1) failed");
|
||||
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_MB_LEN_Reg_read1;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: Previous message length " + MB_LEN_Dyn_Register);
|
||||
if (!_ST25DV_Device.ST25DV_ReadMessage(MB_LEN_Dyn_Register, out responseMsg))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB message read (1) failed");
|
||||
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_MB_msg_read1;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: Previous message read as " + Tools.BytesToHex(responseMsg));
|
||||
OnMessageEvent("NFC DLL Error: Present request not sent, retry again !");
|
||||
returnError = (byte)MCI_ErrorCodes.MCI_Error_Host_req_not_sent;
|
||||
}
|
||||
}
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return returnError;
|
||||
}
|
||||
|
||||
//Checking previous app message is in mailbox or not, if present then return failure !
|
||||
if ((MB_Ctrl_Reg_Value & 0x04) == 0x04)
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: Previous sent request is not read by iPERL. So, present request will not be sent, retry again !");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_req_not_read_by_iperl;
|
||||
}
|
||||
//Mailbox free, so sending request message
|
||||
if (_ST25DV_Device.ST25DV_WriteMessage(InBuffer))
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
if (!_ST25DV_Device.ST25DV_ReadMailboxControlReg(out MB_Ctrl_Reg_Value))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB CTRL Reg read (2) failed");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_CTRL_Reg_Read2;
|
||||
}
|
||||
//Mailbox enable/disable check, proceed further only if enabled
|
||||
if ((MB_Ctrl_Reg_Value & 0x01) == 0x00)
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB feature (2) disabled");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_disabled2;
|
||||
}
|
||||
|
||||
//Proceed further only if host replied response message, otherwise wait in this loop
|
||||
if ((MB_Ctrl_Reg_Value & 0x02) == 0x02)
|
||||
{
|
||||
if (!_ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MB_LEN_Dyn_Register))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB LEN Reg read (2) failed");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_LEN_Reg_read2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!_ST25DV_Device.ST25DV_ReadMessage(MB_LEN_Dyn_Register, out responseMsg))
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB message read (2) failed");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_MB_msg_read2;
|
||||
}
|
||||
else
|
||||
{
|
||||
OutBuffer = new byte[responseMsg.Length];
|
||||
OutBuffer = responseMsg;
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.Success_No_error;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Checking timeout occured or not
|
||||
if(MCI_CycleResponseMsgTimeoutFlag)
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: Timeout");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_Timeout;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFC DLL Error: MB Msg write failed");
|
||||
MCI_CycleResponseMsgTimeoutFlag = false;
|
||||
stopReqResCycleTimeoutTimer();
|
||||
return (byte)MCI_ErrorCodes.MCI_Error_Host_msg_write;
|
||||
}
|
||||
}
|
||||
|
||||
#region Message Event
|
||||
private void OnMessageEvent(string message)
|
||||
{
|
||||
NfcMessageEventArgs e = new NfcMessageEventArgs();
|
||||
e.Message = message;
|
||||
|
||||
if (MessageEvent != null)
|
||||
{
|
||||
MessageEvent(this, e);
|
||||
}
|
||||
e = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void StartReqResCycleTimeoutTimer(int timeoutMilliSec)
|
||||
{
|
||||
_ReqResCycleTimeoutTimer.Elapsed += new ElapsedEventHandler(ReqResCycleTimeoutEvent);
|
||||
_ReqResCycleTimeoutTimer.Interval = timeoutMilliSec;
|
||||
_ReqResCycleTimeoutTimer.Enabled = true;
|
||||
_ReqResCycleTimeoutTimer.Stop();
|
||||
_ReqResCycleTimeoutTimer.Start();
|
||||
}
|
||||
|
||||
private void stopReqResCycleTimeoutTimer()
|
||||
{
|
||||
_ReqResCycleTimeoutTimer.Stop();
|
||||
}
|
||||
|
||||
#region Timer Event
|
||||
private void ReqResCycleTimeoutEvent(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
MCI_CycleResponseMsgTimeoutFlag = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,655 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public class NFCHeadConfig
|
||||
{
|
||||
private SERIAL_Driver _SERIAL_Driver;
|
||||
public event DelNfc_NFCHeadConfig_MessageHandler MessageEvent;
|
||||
|
||||
private readonly byte NFC_HEAD_CONFIG_MAX_RETRIES = 5;
|
||||
private readonly byte[] NFCHeadConfig_OK_res_msg = Encoding.ASCII.GetBytes("OK\n"); //'OK\n' - ack - request is implemented successfully
|
||||
private readonly byte[] NFCHeadConfig_crst_req_msg = Encoding.ASCII.GetBytes("crst\r\n"); //'crst\r\n' - command - reset message
|
||||
private readonly byte[] NFCHeadConfig_cdoff_req_msg = Encoding.ASCII.GetBytes("cdoff\r\n"); //'cdoff\r\n' - command - data mode off request message
|
||||
private readonly byte[] NFCHeadConfig_cdon_req_msg = Encoding.ASCII.GetBytes("cdon\r\n"); //'cdon\r\n' - command - data mode on request message
|
||||
private readonly byte[] NFCHeadConfig_cpon_req_msg = Encoding.ASCII.GetBytes("cpon\r\n"); //'cpon\r\n' - command - pulse output enable command request message
|
||||
private readonly byte[] NFCHeadConfig_cnfc_req_msg = Encoding.ASCII.GetBytes("cnfc\r\n"); //'cnfc\r\n' - command - nfc interface configure request message
|
||||
private readonly byte[] NFCHeadConfig_crfid_req_msg = Encoding.ASCII.GetBytes("crfid\r\n"); //'crfid\r\n' - command - rfid interface configure request message
|
||||
private readonly byte[] NFCHeadConfig_cadc_req_msg = Encoding.ASCII.GetBytes("cadc\r\n"); //'cadc\r\n' - command - adc sampling start request message
|
||||
private byte[] NFCHeadConfig_gw_write_req_msg = Encoding.ASCII.GetBytes("gw00\r\n"); //'gw00\r\n' - write request - gain write request message. here 00 are hex digits and to be replaced with value to be written
|
||||
private readonly byte[] NFCHeadConfig_ir_read_req_msg = Encoding.ASCII.GetBytes("ir\r\n"); //'ir\r\n' - read request - interface read request message
|
||||
private readonly byte[] NFCHeadConfig_ir_read_res_msg_nfc = Encoding.ASCII.GetBytes("INFC\n"); //'INFC\n' - read response - NFC interface read response message
|
||||
private readonly byte[] NFCHeadConfig_ir_read_res_msg_rfid = Encoding.ASCII.GetBytes("IRFID\n"); //'IRFID\n' - read response - RFID interface read response message
|
||||
private readonly byte[] NFCHeadConfig_gr_read_req_msg = Encoding.ASCII.GetBytes("gr\r\n"); //'gr\r\n' - read request - gain read request message
|
||||
private readonly byte[] NFCHeadConfig_gr_read_res_msg = Encoding.ASCII.GetBytes("GR00\n"); //'GR00\n' - read response - gain read response message. here 00 are hex digits
|
||||
private readonly byte[] NFCHeadConfig_opr_read_req_msg = Encoding.ASCII.GetBytes("opr\r\n"); //'opr\r\n' - read request - opamp output read request message
|
||||
private readonly byte[] NFCHeadConfig_opr_read_res_msg = Encoding.ASCII.GetBytes("OP0000\n"); //'OP0000\n' - read response - opamp output read response message. here 0000 are hex digits
|
||||
private readonly byte[] NFCHeadConfig_fr_read_req_msg = Encoding.ASCII.GetBytes("fr\r\n"); //'fr\r\n' - read request - firmware read request message
|
||||
private readonly byte[] NFCHeadConfig_fr_read_res_msg = Encoding.ASCII.GetBytes("V1.23\n"); //'V1.23\n' - read response - firmware read response message. here 1 is major number and 23 is minor numer
|
||||
|
||||
public NFCHeadConfig(SERIAL_Driver serialdriver)
|
||||
{
|
||||
_SERIAL_Driver = serialdriver;
|
||||
}
|
||||
|
||||
#region Message Event
|
||||
private void OnMessageEvent(string message)
|
||||
{
|
||||
NfcMessageEventArgs e = new NfcMessageEventArgs();
|
||||
e.Message = message;
|
||||
|
||||
if (MessageEvent != null)
|
||||
{
|
||||
MessageEvent(this, e);
|
||||
}
|
||||
e = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
private byte HexToAscii(byte u8HexDigit)
|
||||
{
|
||||
if (u8HexDigit < 10)
|
||||
{
|
||||
u8HexDigit += 0x30; //'0' - 0x30
|
||||
}
|
||||
else if (u8HexDigit < 16)
|
||||
{
|
||||
u8HexDigit -= 10;
|
||||
u8HexDigit += 0x61; //'a' - 0x61
|
||||
}
|
||||
else
|
||||
{
|
||||
u8HexDigit = 0xFF;
|
||||
}
|
||||
return u8HexDigit;
|
||||
}
|
||||
|
||||
static byte AsciiToHex(byte u8AsciiByte)
|
||||
{
|
||||
if (('0' <= u8AsciiByte) && ('9' >= u8AsciiByte))
|
||||
{
|
||||
u8AsciiByte -= 0x30; //'0' - 0x30
|
||||
}
|
||||
else if (('A' <= u8AsciiByte) && ('F' >= u8AsciiByte))
|
||||
{
|
||||
u8AsciiByte -= 0x41; //'A' - 0x41
|
||||
u8AsciiByte += 0xA;
|
||||
}
|
||||
else if (('a' <= u8AsciiByte) && ('f' >= u8AsciiByte))
|
||||
{
|
||||
u8AsciiByte -= 0x61; //'a' - 0x61
|
||||
u8AsciiByte += 0xA;
|
||||
}
|
||||
else
|
||||
{
|
||||
u8AsciiByte = 0xFF;
|
||||
}
|
||||
return u8AsciiByte;
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_PulseLedOutputEnable()
|
||||
{
|
||||
//Switching off data mode or changing to command mode ("cdoff\r\n")
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
return false; // true - success, false - failed
|
||||
}
|
||||
|
||||
//Pulse output enable command ("cpon\r\n")
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cpon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
return false; // true - success, false - failed
|
||||
}
|
||||
return true; // true - success, false - failed
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_DataLedOutputEnable()
|
||||
{
|
||||
//Switching on data mode ("cdon\r\n")
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
return false; // true - success, false - failed
|
||||
}
|
||||
return true; // true - success, false - failed
|
||||
}
|
||||
|
||||
public ushort NFCHeadConfig_ReadOpampOutput()
|
||||
{
|
||||
ushort temp = 0;
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
ushort retVal = 0; // 0 - failed, any other value is Opamp Output
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
retVal = 0;
|
||||
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
|
||||
return retVal; // 0 - failed, any other value is Opamp Output
|
||||
}
|
||||
|
||||
//NFC head is in command mode
|
||||
//Sending command 'cadc\r\n' for starting sampling of OP_OUT
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cadc_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
retVal = 0;
|
||||
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
|
||||
return retVal; // 0 - failed, any other value is Opamp Output
|
||||
}
|
||||
|
||||
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Start");
|
||||
|
||||
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_opr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_opr_read_req_msg));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_opr_read_req_msg));
|
||||
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_opr_read_req_msg, NFCHeadConfig_opr_read_req_msg.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_opr_read_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_opr_read_res_msg[1]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
//'OP' received as first 2 charaters in the response. 3rd to 6th are hex digits of OP_OUT from MSB to LSB respectively
|
||||
temp = AsciiToHex(bytesReceived[2]);
|
||||
retVal = (ushort)(temp << 12);
|
||||
temp = AsciiToHex(bytesReceived[3]);
|
||||
retVal += (ushort)(temp << 8);
|
||||
temp = AsciiToHex(bytesReceived[4]);
|
||||
retVal += (ushort)(temp << 4);
|
||||
temp = AsciiToHex(bytesReceived[5]);
|
||||
retVal += temp;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (retVal == 0)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadOpampOutput........Failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadOpampOutput: " + retVal + " ........Success");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return retVal; // 0 - failed, any other value is gain
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_SetGain(byte gain)
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
bool bRetVal = false;
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
bRetVal = false;
|
||||
OnMessageEvent("NFCHeadConfig_SetGain........Failed");
|
||||
return bRetVal; // true - success, false - failed
|
||||
}
|
||||
|
||||
OnMessageEvent("NFCHeadConfig_SetGain........Start");
|
||||
|
||||
NFCHeadConfig_gw_write_req_msg[2] = HexToAscii((byte)((gain & 0xF0) >> 4)); //Higher nibble of gain
|
||||
NFCHeadConfig_gw_write_req_msg[3] = HexToAscii((byte)(gain & 0x0F)); //Lower nibble of gain
|
||||
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gw_write_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_gw_write_req_msg));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gw_write_req_msg));
|
||||
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_gw_write_req_msg, NFCHeadConfig_gw_write_req_msg.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
|
||||
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
//'OK\n' received
|
||||
bRetVal = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (bRetVal)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_SetGain........Success");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_SetGain........Failed");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return bRetVal;
|
||||
}
|
||||
|
||||
public byte NFCHeadConfig_ReadGain()
|
||||
{
|
||||
byte temp = 0;
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
byte retVal = 0; // 0 - failed, any other value is gain
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
retVal = 0;
|
||||
OnMessageEvent("NFCHeadConfig_ReadGain........Failed");
|
||||
return retVal; // 0 - failed, any other value is gain
|
||||
}
|
||||
|
||||
OnMessageEvent("NFCHeadConfig_ReadGain........Start");
|
||||
|
||||
//NFC head is in command mode
|
||||
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_gr_read_req_msg));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_gr_read_req_msg));
|
||||
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_gr_read_req_msg, NFCHeadConfig_gr_read_req_msg.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_gr_read_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_gr_read_res_msg[1])
|
||||
&& (bytesReceived[4] == NFCHeadConfig_gr_read_res_msg[4]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
//'GR' received as first 2 charaters in the response. 3rd and 4th are gain as hex digits
|
||||
temp = AsciiToHex(bytesReceived[2]);
|
||||
retVal = (byte)(temp << 4);
|
||||
temp = AsciiToHex(bytesReceived[3]);
|
||||
retVal += temp; // 0 - failed, any other value is gain
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (retVal == 0)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadGain........Failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadGain: " + retVal + " ........Success");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return retVal; // 0 - failed, any other value is gain
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_SetInterface(bool value)
|
||||
{
|
||||
byte[] bytesTransmit;
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
bool bRetVal = false;
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
bRetVal = false;
|
||||
OnMessageEvent("NFCHeadConfig_SetInterface........Failed");
|
||||
return bRetVal; // true - success, false - failed
|
||||
}
|
||||
|
||||
//NFC head is in command mode
|
||||
if (value) //true - NFC, false - RFID
|
||||
{
|
||||
bytesTransmit = NFCHeadConfig_cnfc_req_msg;
|
||||
OnMessageEvent("NFCHeadConfig_SetInterface: NFC........Start");
|
||||
}
|
||||
else
|
||||
{
|
||||
bytesTransmit = NFCHeadConfig_crfid_req_msg;
|
||||
OnMessageEvent("NFCHeadConfig_SetInterface: RFID........Start");
|
||||
}
|
||||
|
||||
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(bytesTransmit) + "=0x" + Tools.ByteArrayToHexString(bytesTransmit));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(bytesTransmit));
|
||||
if (_SERIAL_Driver.SendMessage(bytesTransmit, bytesTransmit.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
|
||||
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
//'OK\n' received
|
||||
bRetVal = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (bRetVal)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_SetInterface........Success");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_SetInterface........Failed");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return bRetVal;
|
||||
}
|
||||
|
||||
public byte NFCHeadConfig_ReadInterface()
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
byte retVal = 0; // 0 - failed, 1 - NFC, 2 - RFID
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
retVal = 0;
|
||||
OnMessageEvent("NFCHeadConfig_ReadInterface........Failed");
|
||||
return retVal; // 0 - failed, any other value is gain
|
||||
}
|
||||
|
||||
OnMessageEvent("NFCHeadConfig_ReadInterface........Start");
|
||||
|
||||
//NFC head is in command mode
|
||||
while (retryCounter++ < NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_ir_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_ir_read_req_msg));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_ir_read_req_msg));
|
||||
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_ir_read_req_msg, NFCHeadConfig_ir_read_req_msg.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_ir_read_res_msg_nfc[0]) && (bytesReceived[1] == NFCHeadConfig_ir_read_res_msg_nfc[1])
|
||||
&& (bytesReceived[2] == NFCHeadConfig_ir_read_res_msg_nfc[2]) && (bytesReceived[3] == NFCHeadConfig_ir_read_res_msg_nfc[3]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
retVal = 1; // 0 - failed, 1 - NFC, 2 - RFID
|
||||
break;
|
||||
}
|
||||
else if ((bytesReceived[0] == NFCHeadConfig_ir_read_res_msg_rfid[0]) && (bytesReceived[1] == NFCHeadConfig_ir_read_res_msg_rfid[1])
|
||||
&& (bytesReceived[2] == NFCHeadConfig_ir_read_res_msg_rfid[2]) && (bytesReceived[3] == NFCHeadConfig_ir_read_res_msg_rfid[3])
|
||||
&& (bytesReceived[4] == NFCHeadConfig_ir_read_res_msg_rfid[4]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
retVal = 2; // 0 - failed, 1 - NFC, 2 - RFID
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (retVal == 0)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadInterface........Failed");
|
||||
}
|
||||
else if (retVal == 1)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadInterface: NFC ........Success");
|
||||
}
|
||||
else if (retVal == 2)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadInterface: RFID ........Success");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return retVal; // 0 - failed, 1 - NFC, 2 - RFID
|
||||
}
|
||||
|
||||
public byte[] NFCHeadConfig_ReadFirmwareVersion()
|
||||
{
|
||||
byte[] bytesReceived = { 0 };
|
||||
int retryCounter = 0;
|
||||
|
||||
//Switching off data mode (means command mode is on)
|
||||
if (NFCHeadConfig_cmd_tx(NFCHeadConfig_cdoff_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES) == false)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Failed");
|
||||
return bytesReceived; // 0 - failed
|
||||
}
|
||||
|
||||
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Start");
|
||||
|
||||
//NFC head is in command mode
|
||||
while (retryCounter++ <= NFC_HEAD_CONFIG_MAX_RETRIES)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_fr_read_req_msg) + "=0x" + Tools.ByteArrayToHexString(NFCHeadConfig_fr_read_req_msg));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(NFCHeadConfig_fr_read_req_msg));
|
||||
if (_SERIAL_Driver.SendMessage(NFCHeadConfig_fr_read_req_msg, NFCHeadConfig_fr_read_req_msg.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if (bytesReceived[0] == NFCHeadConfig_fr_read_res_msg[0])
|
||||
{
|
||||
//'V' is received as first character in the response. So, the firmware version string is followed and ended with '\n'
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived));
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
|
||||
if (bytesReceived[0] == 0)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Failed");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_ReadFirmwareVersion........Success");
|
||||
}
|
||||
|
||||
//Switching data mode on (means command mode is off)
|
||||
NFCHeadConfig_cmd_tx(NFCHeadConfig_cdon_req_msg, NFC_HEAD_CONFIG_MAX_RETRIES);
|
||||
|
||||
return bytesReceived; // 0 - failed, any other value is firmware version
|
||||
}
|
||||
private bool NFCHeadConfig_cmd_tx(byte[] requestTxMessage, int retries)
|
||||
{
|
||||
byte[] bytesReceived;
|
||||
int retryCounter = 0;
|
||||
bool bRetVal = false;
|
||||
|
||||
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cpon........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdoff........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdon........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cnfc........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crfid........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cadc........Start");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crst........Start");
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cmd_tx: unidentified command........Failed");
|
||||
bRetVal = false;
|
||||
return bRetVal;
|
||||
}
|
||||
|
||||
while (++retryCounter <= retries)
|
||||
{
|
||||
//OnMessageEvent("Tx- " + Encoding.ASCII.GetString(requestTxMessage) + "=0x" + Tools.ByteArrayToHexString(requestTxMessage));
|
||||
OnMessageEvent("Tx- " + Encoding.ASCII.GetString(requestTxMessage));
|
||||
if (_SERIAL_Driver.SendMessage(requestTxMessage, requestTxMessage.Length))
|
||||
{
|
||||
bytesReceived = _SERIAL_Driver.GetRawData();
|
||||
//OnMessageEvent("Rx- " + Encoding.ASCII.GetString(bytesReceived) + "=0x" + Tools.ByteArrayToHexString(bytesReceived));
|
||||
if ((bytesReceived[0] == NFCHeadConfig_OK_res_msg[0]) && (bytesReceived[1] == NFCHeadConfig_OK_res_msg[1])
|
||||
&& (bytesReceived[2] == NFCHeadConfig_OK_res_msg[2]))
|
||||
{
|
||||
OnMessageEvent("Rx- " + Encoding.ASCII.GetString(NFCHeadConfig_OK_res_msg));
|
||||
//'OK\n' received
|
||||
bRetVal = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
Thread.Sleep(1000);
|
||||
}
|
||||
}
|
||||
if (bRetVal == true)
|
||||
{
|
||||
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cpon........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdoff........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdon........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cnfc........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crfid........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cadc........Success");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crst........Success");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (requestTxMessage == NFCHeadConfig_cpon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cpon........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdoff_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdoff........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cdon_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cdon........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cnfc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cnfc........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crfid_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crfid........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_cadc_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_cadc........Failed");
|
||||
}
|
||||
else if (requestTxMessage == NFCHeadConfig_crst_req_msg)
|
||||
{
|
||||
OnMessageEvent("NFCHeadConfig_crst........Failed");
|
||||
}
|
||||
}
|
||||
return bRetVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,561 @@
|
||||
|
||||
using System;
|
||||
using System.IO.Ports;
|
||||
using System.Diagnostics;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public sealed class NfcDataHandler
|
||||
{
|
||||
|
||||
public SERIAL_Driver _SERIAL_Driver;
|
||||
public SERIAL_Driver _SERIAL_Driver_Head_Config;
|
||||
|
||||
public CR95HF_Reader _CR95HF_Reader;
|
||||
public ST25DV_Device _ST25DV_Device;
|
||||
public MCI_Protocol _MCI_Protocol;
|
||||
public NFCHeadConfig _NFCHead_Config;
|
||||
|
||||
public byte LastErrorCode { get; set; }
|
||||
public string LastErrorMessage { get; set; }
|
||||
public byte[] LastData { get; set; }
|
||||
|
||||
public event DelNfcMessageHandler MessageEvent;
|
||||
|
||||
private string _ComPort = "";
|
||||
|
||||
public NfcDataHandler()
|
||||
{
|
||||
_SERIAL_Driver = new SERIAL_Driver();
|
||||
_SERIAL_Driver_Head_Config = new SERIAL_Driver();
|
||||
_CR95HF_Reader = new CR95HF_Reader(_SERIAL_Driver);
|
||||
_ST25DV_Device = new ST25DV_Device(_CR95HF_Reader);
|
||||
_MCI_Protocol = new MCI_Protocol(_ST25DV_Device);
|
||||
_NFCHead_Config = new NFCHeadConfig(_SERIAL_Driver_Head_Config);
|
||||
LastErrorCode = 0;
|
||||
}
|
||||
|
||||
public bool OpenConnection(string comport, int baudrate, int databits, Parity parity, StopBits stopbits)
|
||||
{
|
||||
_ComPort = comport;
|
||||
bool isopen = _SERIAL_Driver.OpenConnection(comport, baudrate, databits, parity, stopbits);
|
||||
if(!isopen)OnMessageEvent(_SERIAL_Driver.ErrorMessage);
|
||||
return isopen;
|
||||
}
|
||||
|
||||
public bool isOpen()
|
||||
{
|
||||
return _SERIAL_Driver.isOpen();
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
_SERIAL_Driver.Close();
|
||||
_SERIAL_Driver.Dispose();
|
||||
}
|
||||
|
||||
public bool OpenConnectionSTM(string comport)
|
||||
{
|
||||
// helper for lazy people who don't know the comport settings or don't have
|
||||
// parameters of type 'Parity' or 'StopBits' in their language (Python) at hand
|
||||
// used here: https://slm.sms-esaap.com/iPERL/tetoo/-/tree/dev/tetoo/nfcs5_dll_wrapper
|
||||
return OpenConnection(comport, 57600, 8, Parity.None, StopBits.Two);
|
||||
}
|
||||
|
||||
|
||||
public bool NFCHead_OpenConnection(string comport)
|
||||
{
|
||||
if (isOpen() && _ComPort == comport)
|
||||
{
|
||||
OnMessageEvent(comport + "......... Already in use ");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isopen = _SERIAL_Driver_Head_Config.OpenConnection(comport, 9600, 8, Parity.None, StopBits.Two);
|
||||
OnMessageEvent(_SERIAL_Driver_Head_Config.ErrorMessage);
|
||||
return isopen;
|
||||
}
|
||||
|
||||
public bool isNFCHeadOpen()
|
||||
{
|
||||
return _SERIAL_Driver_Head_Config.isOpen();
|
||||
}
|
||||
|
||||
public void NFCHeadClose()
|
||||
{
|
||||
if (_SERIAL_Driver_Head_Config.isOpen())
|
||||
{
|
||||
_SERIAL_Driver_Head_Config.Close();
|
||||
_SERIAL_Driver_Head_Config.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public bool ConnectReader()
|
||||
{
|
||||
if (_CR95HF_Reader.CR95HF_Connect())
|
||||
{
|
||||
OnMessageEvent("CombiHead.......Connected");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("CombiHead.......Not connected");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool RFProtocolON()
|
||||
{
|
||||
if (_CR95HF_Reader.CR95HF_RFProtocolOn())
|
||||
{
|
||||
OnMessageEvent("NFC CR95HF RF Protocol ON........Success");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFC CR95HF RF Protocol ON........Failed");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool RFProtocolOFF()
|
||||
{
|
||||
if (_CR95HF_Reader.CR95HF_RFProtocolOff())
|
||||
{
|
||||
OnMessageEvent("NFC CR95HF RF Protocol OFF........Success");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("NFC CR95HF RF Protocol OFF........Failed");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool ConnectDevice()
|
||||
{
|
||||
byte[] responseData;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_RFProtocolOn())
|
||||
{
|
||||
if (GetSystemInfo())
|
||||
{
|
||||
responseData = LastData;
|
||||
if (responseData[0] == 0x0F)
|
||||
OnMessageEvent("Device -> ST25DV04K");
|
||||
else
|
||||
OnMessageEvent("Device -> ST25DV16K or 64K");
|
||||
|
||||
OnMessageEvent("UID -> " + Tools.ByteToHexString(responseData[1]) + " " + Tools.ByteToHexString(responseData[2]) + " " + Tools.ByteToHexString(responseData[3]) + " " + Tools.ByteToHexString(responseData[4]) +
|
||||
" " + Tools.ByteToHexString(responseData[5]) + " " + Tools.ByteToHexString(responseData[6]) + " " + Tools.ByteToHexString(responseData[7]) + " " + Tools.ByteToHexString(responseData[8]));
|
||||
//OnMessageEvent("DSFID -> " + Tools.ByteToHexString(responseData[9]));
|
||||
//OnMessageEvent("AFI -> " + Tools.ByteToHexString(responseData[10]));
|
||||
//OnMessageEvent("Block size -> " + Tools.ByteToHexString(responseData[11]));
|
||||
//OnMessageEvent("Memory size -> " + Tools.ByteToHexString(responseData[12]));
|
||||
//if (responseData[13] == 0x24)
|
||||
// OnMessageEvent("IC Ref -> ST25DV04K");
|
||||
//else
|
||||
// OnMessageEvent("IC Ref -> ST25DV16K or 64K");
|
||||
OnMessageEvent("iPERL.......Connected");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("iPERL.......Not connected");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool GetSystemInfo()
|
||||
{
|
||||
byte[] responseData = null;
|
||||
try
|
||||
{
|
||||
if (_ST25DV_Device.ST25DV_GetSystemInfo(out responseData))
|
||||
{
|
||||
LastData = responseData;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnMessageEvent(ex.Message);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadSingleBlock(byte blockNumber, out byte[] outBuffer)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_ReadSingleBlock(blockNumber, out outBuffer);
|
||||
}
|
||||
|
||||
public bool ST25DV_WriteSingleBlock(byte blockNumber, byte[] inBuffer)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_WriteSingleBlock(blockNumber, inBuffer);
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMultipleBlocks(byte startingBlockNumber, byte numberOfBlocks, out byte[] OutBuffer)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_ReadMultipleBlocks(startingBlockNumber, numberOfBlocks, out OutBuffer);
|
||||
}
|
||||
|
||||
public bool Echo()
|
||||
{
|
||||
if (!_CR95HF_Reader.CR95HF_Echo())
|
||||
{
|
||||
OnMessageEvent("Echo..Failed. CombiHead connection...Lost");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadConfiguration(byte pointer, out byte value)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_ReadConfiguration(pointer, out value, true);
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadDynamicConfiguration(byte regAddress, out byte OutBuffer)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_ReadDynamicConfiguration(regAddress, out OutBuffer, true);
|
||||
}
|
||||
|
||||
public bool ST25DV_WriteDynamicConfiguration(byte regAddress, byte regValue)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_WriteDynamicConfiguration(regAddress, regValue, true);
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMailboxMessageLength(out byte MessageLength)
|
||||
{
|
||||
return _ST25DV_Device.ST25DV_ReadMailboxMessageLength(out MessageLength, true);
|
||||
}
|
||||
|
||||
// This function-header is needed for calls to the DLL without need for using enums.
|
||||
// In python 3.11 the module pythonnet (v3.x) does not support casting 'int' to 'enum' aynmore,
|
||||
// so this workaround is needed.
|
||||
public bool MCI_Read_pythonwrapper_enum(int STIndex, ushort offset, byte payloadlength, int timeoutMs)
|
||||
{
|
||||
return MCI_Read((MCI_Protocol.StructName)STIndex, offset, payloadlength, timeoutMs);
|
||||
}
|
||||
|
||||
public bool MCI_Read(MCI_Protocol.StructName StName, ushort offset, byte payloadlength, int timeoutMs)
|
||||
{
|
||||
LastErrorMessage = string.Empty;
|
||||
byte[] response;
|
||||
byte errorCode = 0;
|
||||
if (ST25DV_MailboxCommStart())
|
||||
{
|
||||
bool worked = _MCI_Protocol.MCI_Read(StName, offset, payloadlength, timeoutMs, out response, out errorCode);
|
||||
LastErrorCode = errorCode;
|
||||
LastData = response;
|
||||
if (!worked)
|
||||
{
|
||||
SetLastErrorMesage();
|
||||
ST25DV_MailboxCommStop();
|
||||
return false;
|
||||
}
|
||||
return ST25DV_MailboxCommStop();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// This function-header is needed for calls to the DLL without need for using enums.
|
||||
// In python 3.11 the module pythonnet (v3.x) does not support casting 'int' to 'enum' aynmore,
|
||||
// so this workaround is needed.
|
||||
public bool MCI_Write_pythonwrapper_enum(int STIndex, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
|
||||
{
|
||||
return MCI_Write((MCI_Protocol.StructName)STIndex, offset, payloadlength, payload, timeoutMs);
|
||||
}
|
||||
|
||||
public bool MCI_Write(MCI_Protocol.StructName StName, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
|
||||
{
|
||||
LastErrorMessage = string.Empty;
|
||||
LastData = null;
|
||||
byte errorCode = 0;
|
||||
if (ST25DV_MailboxCommStart())
|
||||
{
|
||||
bool ans = _MCI_Protocol.MCI_Write(StName, offset, payloadlength, payload, timeoutMs, out errorCode);
|
||||
LastErrorCode = errorCode;
|
||||
if (!ans)
|
||||
{
|
||||
SetLastErrorMesage();
|
||||
ST25DV_MailboxCommStop();
|
||||
return false;
|
||||
}
|
||||
return ST25DV_MailboxCommStop();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool MCI_Read(byte msgId, ushort offset, byte payloadlength, int timeoutMs)
|
||||
{
|
||||
LastErrorMessage = string.Empty;
|
||||
byte[] response;
|
||||
byte errorCode = 0;
|
||||
if (ST25DV_MailboxCommStart())
|
||||
{
|
||||
bool ans = _MCI_Protocol.MCI_Read((MCI_Protocol.StructName) msgId, offset, payloadlength, timeoutMs,
|
||||
out response, out errorCode);
|
||||
LastErrorCode = errorCode;
|
||||
LastData = response;
|
||||
if (!ans)
|
||||
{
|
||||
SetLastErrorMesage();
|
||||
ST25DV_MailboxCommStop();
|
||||
return false;
|
||||
}
|
||||
return ST25DV_MailboxCommStop();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool MCI_Write(byte msgId, ushort offset, byte payloadlength, byte[] payload, int timeoutMs)
|
||||
{
|
||||
LastErrorMessage = string.Empty;
|
||||
LastData = null;
|
||||
byte errorCode = 0;
|
||||
if (ST25DV_MailboxCommStart())
|
||||
{
|
||||
bool ans = _MCI_Protocol.MCI_Write((MCI_Protocol.StructName) msgId, offset, payloadlength, payload,
|
||||
timeoutMs, out errorCode);
|
||||
LastErrorCode = errorCode;
|
||||
if (!ans)
|
||||
{
|
||||
SetLastErrorMesage();
|
||||
ST25DV_MailboxCommStop();
|
||||
return false;
|
||||
}
|
||||
return ST25DV_MailboxCommStop();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool ST25DV_MailboxCommStart()
|
||||
{
|
||||
bool success = false;
|
||||
byte[] EepromBlockRead = { 0, 0, 0, 0 };
|
||||
byte[] EepromBlockWrite = { 0, 0, 0, 0 };
|
||||
|
||||
//Byte-2 in block-2 represent the EEPROM I2C interface status ->
|
||||
//0xA5-EEPROM I2C Interface Idle, 0x5A-EEPROM I2C Interface Active
|
||||
success = _ST25DV_Device.ST25DV_ReadSingleBlock(2, out EepromBlockRead, false);
|
||||
if (success)
|
||||
{
|
||||
if (EepromBlockRead[1] == 0xA5) //0xA5-EEPROM I2C Interface Idle
|
||||
{
|
||||
//Byte-1 in block-64 represent the Mailbox RF interface status ->
|
||||
//0xA5-Mailbox RF Interface Idle, 0x5A-Mailbox RF Interface Active
|
||||
EepromBlockWrite[0] = 0x5A; //Raising Mailbox RF interface Active flag to avoid collisions with host interface
|
||||
success = _ST25DV_Device.ST25DV_WriteSingleBlock(64, EepromBlockWrite, false);
|
||||
if (success)
|
||||
{
|
||||
//Sets 0x01 (MB_EN) in the register (MB_CTRL_Dyn) with address 0x0D
|
||||
if (_ST25DV_Device.ST25DV_WriteDynamicConfiguration(0x0D, 0x01, false))
|
||||
{
|
||||
return true; //With this we proceed for mailbox communication with ST25
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "MB_CTRL_Dyn writing failed(ST25DV_MailboxCommStart), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "Mailbox RF interface status writing failed(ST25DV_MailboxCommStart), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "EEPROM interface busy(ST25DV_MailboxCommStart), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "EEPROM interface status reading failed(ST25DV_MailboxCommStart), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private bool ST25DV_MailboxCommStop()
|
||||
{
|
||||
bool success = false;
|
||||
byte[] EepromBlockWrite = { 0, 0, 0, 0 };
|
||||
|
||||
//Sets 0x00 (MB_EN) in the register (MB_CTRL_Dyn) with address 0x0D
|
||||
if (_ST25DV_Device.ST25DV_WriteDynamicConfiguration(0x0D, 0x00, false))
|
||||
{
|
||||
//Byte-1 in block-64 represent the Mailbox RF interface status ->
|
||||
//0xA5-Mailbox RF Interface Idle, 0x5A-Mailbox RF Interface Active
|
||||
EepromBlockWrite[0] = 0xA5; //Raising Mailbox RF interface Idle flag to avoid collisions with host interface
|
||||
success = _ST25DV_Device.ST25DV_WriteSingleBlock(64, EepromBlockWrite, false);
|
||||
if (success)
|
||||
{
|
||||
return true; //With this we proceed for interpreting the communication happened with ST25
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "Mailbox RF interface status writing failed(ST25DV_MailboxCommStop), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LastErrorCode = 0x08; //MCI Error: Unidentified
|
||||
LastErrorMessage = "MB_CTRL_Dyn writing failed(ST25DV_MailboxCommStop), try again";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void SetLastErrorMesage()
|
||||
{
|
||||
try
|
||||
{
|
||||
LastErrorMessage = MCI_Protocol.GetMCIErrorMessage(LastErrorCode);
|
||||
}
|
||||
catch
|
||||
{
|
||||
LastErrorMessage = "MCI Error: The Errorcode '" + LastErrorCode as string +
|
||||
"' couldn't be converted to string with the enum MCI_ErrorCodes!";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_PulseLedOutputEnable()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_PulseLedOutputEnable(); // true - success, false - failed
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_DataLedOutputEnable()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_DataLedOutputEnable(); // true - success, false - failed
|
||||
}
|
||||
|
||||
public ushort NFCHeadConfig_ReadOpampOutput()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_ReadOpampOutput(); // 0 - failed, any other value is opamp output
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_SetGain(byte gain)
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_SetGain(gain); // true - success, false - failed
|
||||
}
|
||||
|
||||
public byte NFCHeadConfig_ReadGain()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_ReadGain(); // 0 - failed, any other value is gain
|
||||
}
|
||||
|
||||
public bool NFCHeadConfig_SetInterface(bool value)
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_SetInterface(value); // true - success, false - failed
|
||||
}
|
||||
|
||||
public byte NFCHeadConfig_ReadInterface()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_ReadInterface(); // 0 - failed, 1 - NFC, 2 - RFID
|
||||
}
|
||||
|
||||
public byte[] NFCHeadConfig_ReadFirmwareVersion()
|
||||
{
|
||||
return _NFCHead_Config.NFCHeadConfig_ReadFirmwareVersion(); // 0 - failed, any other value is firmware version
|
||||
}
|
||||
|
||||
public bool NFCSecurity_SendSignedCommand(byte[] payload, int timeoutMs)
|
||||
{
|
||||
byte payloadLength = Convert.ToByte(payload.Length);
|
||||
ushort offset = 0;
|
||||
|
||||
try
|
||||
{
|
||||
if ( (!MCI_Write(MCI_Protocol.StructName.NfcSecurity, offset, payloadLength, payload, timeoutMs)) || (LastErrorCode != 0x00))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnMessageEvent(ex.Message);
|
||||
}
|
||||
return true; // true - success, false - failed
|
||||
}
|
||||
|
||||
public byte NFCSecurity_ReadPrivilegeLevel(int timeoutMs)
|
||||
{
|
||||
ushort offset = 0;
|
||||
byte payloadLength = 1;
|
||||
byte payload = 4;
|
||||
try
|
||||
{
|
||||
if ((!MCI_Read(MCI_Protocol.StructName.NfcSecurity, offset, payloadLength, timeoutMs)) || (LastErrorCode != 0x00))
|
||||
{
|
||||
payload = 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
payload = LastData[0];
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnMessageEvent(ex.Message);
|
||||
}
|
||||
|
||||
return payload; // 0 - No Security, 1 - Customer Maintenance, 2 - Customer Admin, 3 - Sensus Admin, 4 and above - failed
|
||||
}
|
||||
|
||||
public bool NFCSecurity_ClearPrivilegeLevel(int timeoutMs)
|
||||
{
|
||||
ushort offset = 0;
|
||||
byte payloadLength = 1;
|
||||
byte [] payload = { 0x23 }; // 0x23 - Command code for 'NFC Security reset access level'
|
||||
|
||||
try
|
||||
{
|
||||
if ((!MCI_Write(MCI_Protocol.StructName.Command, offset, payloadLength, payload, timeoutMs)) || (LastErrorCode != 0x00))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OnMessageEvent(ex.Message);
|
||||
}
|
||||
return true; // true - success, false - failed
|
||||
}
|
||||
|
||||
public string GetDllVersion()
|
||||
{
|
||||
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
|
||||
string str = "NfcS5 DLL v" + fvi.FileVersion;
|
||||
return str.Remove(str.Length - 2); // only show x.y.z version, hide 4th number
|
||||
}
|
||||
|
||||
#region Message Event
|
||||
private void OnMessageEvent(string message)
|
||||
{
|
||||
NfcMessageEventArgs e = new NfcMessageEventArgs();
|
||||
e.Message = message;
|
||||
|
||||
if (MessageEvent != null)
|
||||
{
|
||||
MessageEvent(this, e);
|
||||
}
|
||||
e = null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public delegate void DelNfcMessageHandler(object sender, NfcMessageEventArgs e);
|
||||
public delegate void DelNfc_ST25DV_MessageHandler(object sender, NfcMessageEventArgs e);
|
||||
public delegate void DelNfc_CR95HF_MessageHandler(object sender, NfcMessageEventArgs e);
|
||||
public delegate void DelNfc_MCI_MessageHandler(object sender, NfcMessageEventArgs e);
|
||||
public delegate void DelNfc_NFCHeadConfig_MessageHandler(object sender, NfcMessageEventArgs e);
|
||||
public class NfcMessageEventArgs
|
||||
{
|
||||
public string Message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO.Ports;
|
||||
using System.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public class SERIAL_Driver
|
||||
{
|
||||
public string ErrorMessage { get; private set; }
|
||||
public Collection<byte> SerialPortReadBuffer = new Collection<byte>();
|
||||
private SerialPort _serialPort;
|
||||
|
||||
private List<byte[]> _binMessages = new List<byte[]>();
|
||||
private bool _isReading;
|
||||
private Parity Parity { get; set; }
|
||||
private StopBits StopBits { get; set; }
|
||||
|
||||
public SERIAL_Driver()
|
||||
{
|
||||
_serialPort = new SerialPort();
|
||||
}
|
||||
|
||||
public bool OpenConnection(string comPort, int baudrate, int dataBits, Parity parity, StopBits stopbits, int readTimeout=1000, int writeTimeout = 1000)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
if ((_serialPort != null) && (_serialPort.IsOpen))
|
||||
{
|
||||
_serialPort.DataReceived -= DataReceivedHandler;
|
||||
_serialPort.Close();
|
||||
_serialPort.Dispose();
|
||||
_serialPort = null;
|
||||
}
|
||||
try
|
||||
{
|
||||
ErrorMessage = "";
|
||||
//_serialPort = new SerialPort(comPort, 57600, Parity.None, 8, StopBits.Two);
|
||||
_serialPort = new SerialPort(comPort, baudrate, parity, dataBits, stopbits);
|
||||
_serialPort.ReadTimeout = readTimeout;
|
||||
_serialPort.WriteTimeout = writeTimeout;
|
||||
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
|
||||
_serialPort.Open();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrorMessage = String.Format("COM error: Open failed {0}.{1}", comPort, ex.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!_serialPort.IsOpen)
|
||||
{
|
||||
ErrorMessage = String.Format("COM error: Can't Open {0}.", comPort);
|
||||
return false;
|
||||
}
|
||||
}//End Lock
|
||||
return true;
|
||||
}
|
||||
public bool SendMessage(byte[] sendDataBytes, int length, int readTimeout = 1000, int writeTimeout=1000)
|
||||
{
|
||||
if (!isOpen()) return false;
|
||||
if (sendDataBytes.Length == 0) return true; // nothing to send - no error
|
||||
try
|
||||
{
|
||||
PrepareReading(); //clear read buffer etc.
|
||||
_serialPort.WriteTimeout = writeTimeout;
|
||||
_serialPort.ReadTimeout = readTimeout;
|
||||
_serialPort.Write(sendDataBytes, 0, length);
|
||||
_isReading = true;
|
||||
Thread.Sleep(100);
|
||||
var stopWatch = Stopwatch.StartNew(); //start stop watch for data recevie timeout
|
||||
while (_isReading) //wait until reading finishes or timeout occur
|
||||
{
|
||||
if (stopWatch.ElapsedMilliseconds > readTimeout)
|
||||
{
|
||||
stopWatch.Stop();
|
||||
ErrorMessage = "COM error: Receive timeout";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrorMessage = String.Format("COM error: Transmit timeout {0}.{1}", _serialPort.PortName, ex.Message);
|
||||
return false; // Exception in send function
|
||||
}
|
||||
return true;
|
||||
}
|
||||
private void PrepareReading()
|
||||
{
|
||||
_serialPort.DiscardInBuffer();
|
||||
if(_binMessages != null) _binMessages.Clear();
|
||||
_isReading = true;
|
||||
}
|
||||
public byte[] GetRawData()
|
||||
{
|
||||
try
|
||||
{
|
||||
return _binMessages[0].ToArray();
|
||||
}
|
||||
catch(Exception)
|
||||
{
|
||||
byte[] err = { 0xFF };
|
||||
return err;
|
||||
}
|
||||
}
|
||||
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
|
||||
{
|
||||
if (!_serialPort.IsOpen) return;
|
||||
lock (this)
|
||||
{
|
||||
Thread.Sleep(100);
|
||||
SerialPortReadBuffer = new Collection<byte>();
|
||||
while (_serialPort.BytesToRead > 0)
|
||||
{
|
||||
SerialPortReadBuffer.Add((byte)_serialPort.ReadByte());
|
||||
}
|
||||
|
||||
_binMessages.Add(SerialPortReadBuffer.ToArray());
|
||||
_isReading = false;
|
||||
}
|
||||
}
|
||||
public void Close()
|
||||
{
|
||||
if (isOpen())
|
||||
{
|
||||
_serialPort.Close();
|
||||
}
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
if (_serialPort != null)
|
||||
{
|
||||
_serialPort.Dispose();
|
||||
}
|
||||
}
|
||||
public bool isOpen()
|
||||
{
|
||||
if(_serialPort != null)
|
||||
return _serialPort.IsOpen;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public class ST25DV_Device
|
||||
{
|
||||
private readonly byte[] ST25DV_CMD_GET_SYSTEM_INFO = { 0x2B }; //Command code
|
||||
private byte[] ST25DV_CMD_READ_SINGLE_BLOCK = { 0x20, 0x00 }; //Command code, EEPROM block number (this will be received from caller).
|
||||
private byte[] ST25DV_CMD_WRITE_SINGLE_BLOCK = { 0x21, 0x00, 0x00, 0x00, 0x00, 0x00 }; //Command code, EEPROM block number (this will be received from caller), 4-byte payload to be written (this will be received from caller).
|
||||
private byte[] ST25DV_CMD_READ_MULTIPLE_BLOCKS = { 0x23, 0x00, 0x00 }; //Command code, EEPROM starting block number (this will be received from caller), number of blocks (this will be received from caller)
|
||||
private byte[] ST25DV_CMD_READ_CONFIG = { 0xA0, 0x02, 0x00 }; //Command code, IC Mfg Code, Register address (this will be received from caller)
|
||||
private byte[] ST25DV_CMD_READ_DYNAMIC_CONFIG = { 0xAD, 0x02, 0x00 }; //Command code, IC Mfg Code, Register address (this will be received from caller)
|
||||
private byte[] ST25DV_CMD_WRITE_DYNAMIC_CONFIG = { 0xAE, 0x02, 0x00, 0x00 }; //Command code, IC Mfg Code, Register address, register value to be written
|
||||
private readonly byte[] ST25DV_CMD_READ_MAILBOX_CONTROL_REG = { 0xAD, 0x02, 0x0D }; //Command code, IC Mfg Code, MB_CTRL_Dyn Register address
|
||||
private readonly byte[] ST25DV_CMD_READ_MAILBOX_MESSAGE_LENGTH = { 0xAB, 0x02 }; //Command code, IC Mfg Code
|
||||
private byte[] ST25DV_CMD_READ_MESSAGE = { 0xAC, 0x02, 0x00, 0x00 }; //Command code, IC Mfg Code, Mailbox pointer(mostly this is 0), NumberofBytesToRead (this will be received from caller)
|
||||
|
||||
private CR95HF_Reader _CR95HF_Reader;
|
||||
private System.Timers.Timer _CycleTimeoutTimer = new System.Timers.Timer();
|
||||
|
||||
private static readonly Dictionary<byte, string> ST25DV_ErrorCodes = new Dictionary<byte, string>
|
||||
{
|
||||
{0x00 , "Success, No error" },
|
||||
{0x01 , "Command is not supported" },
|
||||
{0x02 , "Command is not recognized(format error)" },
|
||||
{0x03 , "Option not supported" },
|
||||
{0x0F , "Error with no information given" },
|
||||
{0x10 , "The specified block is not available" },
|
||||
{0x11 , "The specified block is already locked and thus cannot be locked again" },
|
||||
{0x12 , "The specified block is locked and its contents cannot be changed" },
|
||||
{0x13 , "The specified block was not successfully programmed" },
|
||||
{0x14 , "The specified block was not successfully locked" },
|
||||
{0x15 , "The specified block is protected in read" }
|
||||
};
|
||||
|
||||
public event DelNfc_ST25DV_MessageHandler MessageEvent;
|
||||
|
||||
public ST25DV_Device(CR95HF_Reader CR95HFReader)
|
||||
{
|
||||
_CR95HF_Reader = CR95HFReader;
|
||||
}
|
||||
|
||||
#region Message Event
|
||||
private void OnMessageEvent(string message)
|
||||
{
|
||||
NfcMessageEventArgs e = new NfcMessageEventArgs();
|
||||
e.Message = message;
|
||||
|
||||
if (MessageEvent != null)
|
||||
{
|
||||
MessageEvent(this, e);
|
||||
}
|
||||
e = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
public bool ST25DV_GetSystemInfo(out byte[] responseData)
|
||||
{
|
||||
byte[] response = new byte[20];
|
||||
responseData = null;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_GET_SYSTEM_INFO, out response))
|
||||
{
|
||||
if (response == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//Success - ResponseFlags = 0x00, 14 bytes payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
responseData = new byte[14];
|
||||
for (int i=0; i<14; i++)
|
||||
{
|
||||
responseData[i] = response[i + 1];
|
||||
}
|
||||
//OnMessageEvent("Read GetSystemInfo: " + Tools.ByteArrayToHexString(responseData));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((responseData[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(responseData[1])))
|
||||
OnMessageEvent("Read GetSystemInfo: Failed with ST25DV error - " + ST25DV_ErrorCodes[responseData[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read GetSystemInfo: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadSingleBlock(byte blockNumber, out byte[] outBuffer, bool logEnabled = false)
|
||||
{
|
||||
byte[] response = null;
|
||||
outBuffer = null;
|
||||
int StartingByteAddress = Convert.ToInt32(blockNumber) * 4;
|
||||
|
||||
ST25DV_CMD_READ_SINGLE_BLOCK[1] = blockNumber;
|
||||
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Read EEPROM: 0x04" + " bytes from the address 0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
|
||||
}
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_SINGLE_BLOCK, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = new byte[4];
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
outBuffer[i] = response[1 + i];
|
||||
}
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Read EEPROM: " + Tools.BytesToHex(outBuffer));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read EEPROM: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read EEPROM: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_WriteSingleBlock(byte blockNumber, byte[] inBuffer, bool logEnabled = false)
|
||||
{
|
||||
byte[] response = null;
|
||||
int StartingByteAddress = Convert.ToInt32(blockNumber) * 4;
|
||||
|
||||
ST25DV_CMD_WRITE_SINGLE_BLOCK[1] = blockNumber;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
ST25DV_CMD_WRITE_SINGLE_BLOCK[2 + i] = inBuffer[i];
|
||||
}
|
||||
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Write EEPROM: 0x04 bytes 0x" + Tools.BytesToHex(inBuffer) + " to the address 0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
|
||||
}
|
||||
|
||||
//This will disable MB, 0x0D is MB_CTRL_Dyn register pointer and 0x00 is the value written
|
||||
if (ST25DV_WriteDynamicConfiguration(0x0D, 0x00, false))
|
||||
{
|
||||
_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_SINGLE_BLOCK, out response);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnMessageEvent("Write EEPROM: MB disable failed");
|
||||
return false;
|
||||
}
|
||||
//This function will leave ST25DV with MB disabled state and it needs to be enabled by I2C interface
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMultipleBlocks(byte startingBlockNumber, byte numberOfBlocks, out byte [] outBuffer)
|
||||
{
|
||||
byte[] response = new byte[16]; //Maximum allowed to read is 16 bytes (4 blocks) with this command
|
||||
outBuffer = null;
|
||||
|
||||
ST25DV_CMD_READ_MULTIPLE_BLOCKS[1] = startingBlockNumber;
|
||||
ST25DV_CMD_READ_MULTIPLE_BLOCKS[2] = numberOfBlocks;
|
||||
|
||||
if (Convert.ToInt32(numberOfBlocks) >= 4) //maximum allowed to read with one command is 4 blocks (means 3)
|
||||
{
|
||||
OnMessageEvent("Read EEPROM: Invalid Input"); //TBD-needs to validate startingBlockNumber based on 4K or 16K or 64K chip read info
|
||||
return false;
|
||||
}
|
||||
|
||||
int totalReadBytes = (Convert.ToInt32(numberOfBlocks) + 1) * 4;
|
||||
int StartingByteAddress = Convert.ToInt32(startingBlockNumber) * 4;
|
||||
|
||||
OnMessageEvent("Read EEPROM: " + "0x" + Tools.DecimalToHexString(totalReadBytes.ToString(),1) + " bytes from the byte " + "0x" + Tools.DecimalToHexString(StartingByteAddress.ToString(), 1));
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MULTIPLE_BLOCKS, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = new byte[response.Length-4];
|
||||
for (int i = 0; i < response.Length-4; i++)
|
||||
{
|
||||
outBuffer[i] = response[1 + i];
|
||||
}
|
||||
OnMessageEvent("Read EEPROM: " + Tools.BytesToHex(outBuffer));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read EEPROM: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read EEPROM: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadConfiguration(byte regAddress, out byte outBuffer, bool logEnabled = false)
|
||||
{
|
||||
byte[] response = null;
|
||||
ST25DV_CMD_READ_CONFIG[2] = regAddress;
|
||||
outBuffer = 0x00;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_CONFIG, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, 1 byte payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = response[1];
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Read Static Config Register @address: " + "0x" + Tools.DecimalToHexString(Convert.ToInt32(regAddress).ToString(), 1) + " as " + Tools.ByteToHexString(outBuffer));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read Static Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read Static Config Register: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadDynamicConfiguration(byte regAddress, out byte outBuffer, bool logEnabled = false)
|
||||
{
|
||||
byte[] response = null;
|
||||
ST25DV_CMD_READ_DYNAMIC_CONFIG[2] = regAddress;
|
||||
outBuffer = 0x00;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_DYNAMIC_CONFIG, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, 1 byte payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = response[1];
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Read Dynamic Config Register @address: " + "0x" + Tools.DecimalToHexString(Convert.ToInt32(regAddress).ToString(), 1) + " as " + Tools.ByteToHexString(outBuffer));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read Dynamic Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read Dynamic Config Register: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_WriteDynamicConfiguration(byte regAddress, byte regValue, bool logEnabled)
|
||||
{
|
||||
byte[] response = null;
|
||||
ST25DV_CMD_WRITE_DYNAMIC_CONFIG[2] = regAddress;
|
||||
ST25DV_CMD_WRITE_DYNAMIC_CONFIG[3] = regValue;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_DYNAMIC_CONFIG, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, success
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Write Dynamic Config Register: Success");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Write Dynamic Config Register: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Write Dynamic Config Register: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMailboxControlReg(out byte outBuffer)
|
||||
{
|
||||
byte[] response = null;
|
||||
outBuffer = 0x00;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MAILBOX_CONTROL_REG, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, 1 byte payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = response[1];
|
||||
//OnMessageEvent("Read Dynamic Config Register MBCtrl @address: 0x0D" + " as " + Tools.ByteToHexString(outBuffer));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read Dynamic Config Register MBCtrl: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read Dynamic Config Register MBCtrl: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMailboxMessageLength(out byte outBuffer, bool logEnabled = false)
|
||||
{
|
||||
byte[] response = null;
|
||||
outBuffer = 0x00;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MAILBOX_MESSAGE_LENGTH, out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00, 1 byte payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
outBuffer = response[1];
|
||||
if (logEnabled)
|
||||
{
|
||||
OnMessageEvent("Read Mailbox Message Length: " + Tools.ByteToHexString(outBuffer));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read Mailbox Message Length: Failed with ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read Mailbox Message Length: Failed with ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_ReadMessage(byte bytesToRead, out byte[] outBuffer)
|
||||
{
|
||||
byte[] response = null;
|
||||
outBuffer = null;
|
||||
|
||||
ST25DV_CMD_READ_MESSAGE[2] = 0x00; //Pointer in mailbox, 0x00 indicates reads from beginning
|
||||
ST25DV_CMD_READ_MESSAGE[3] = bytesToRead;
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_READ_MESSAGE, out response))
|
||||
{
|
||||
outBuffer = new byte[response.Length-4];
|
||||
//Success - ResponseFlags = 0x00, payload
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
for (int i = 0; i < response.Length-4; i++)
|
||||
{
|
||||
outBuffer[i] = response[1 + i];
|
||||
}
|
||||
//OnMessageEvent("Read Message: " + Tools.ByteArrayToHexString(outBuffer));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Read Message Failed: With ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Read Message Failed: With ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool ST25DV_WriteMessage(byte [] inBuffer)
|
||||
{
|
||||
byte[] response = null;
|
||||
List<byte> ST25DV_CMD_WRITE_MESSAGE = new List<byte>();
|
||||
|
||||
ST25DV_CMD_WRITE_MESSAGE.Add(0xAA); //Write message command code
|
||||
ST25DV_CMD_WRITE_MESSAGE.Add(0x02); //IC Mfg Code
|
||||
ST25DV_CMD_WRITE_MESSAGE.Add(Convert.ToByte(inBuffer.Length - 1)); //This is the app given payload - 1
|
||||
ST25DV_CMD_WRITE_MESSAGE.AddRange(inBuffer);
|
||||
|
||||
if (_CR95HF_Reader.CR95HF_SendRecv(ST25DV_CMD_WRITE_MESSAGE.ToArray(), out response))
|
||||
{
|
||||
//Success - ResponseFlags = 0x00
|
||||
//Error - ResponseFlags = 0x01, 1 byte error code
|
||||
if (response[0] == 0x00)
|
||||
{
|
||||
//OnMessageEvent("Write Message: " + Tools.ByteArrayToHexString(inBuffer));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((response[0] == 0x01) && (ST25DV_ErrorCodes.ContainsKey(response[1])))
|
||||
OnMessageEvent("Write Message Failed: With ST25DV error - " + ST25DV_ErrorCodes[response[1]]);
|
||||
}
|
||||
}
|
||||
OnMessageEvent("Write Message Failed: With ST25DV Unidentified error");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
//*****************************************************************************
|
||||
// Copyright 2020 Sensus GmbH Ludwigshafen. All rights reserved.
|
||||
// Author: Venkat, Rajeshwar
|
||||
//*****************************************************************************
|
||||
|
||||
namespace Sensus.iPerl.NfcHandler
|
||||
{
|
||||
public static class Tools
|
||||
{
|
||||
public static bool ByteArrayCompare(byte[] a1, byte[] a2)
|
||||
{
|
||||
// thanks to https://stackoverflow.com/questions/43289/comparing-two-byte-arrays-in-net
|
||||
if (a1.Length != a2.Length)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < a1.Length; i++)
|
||||
if (a1[i] != a2[i])
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
public static string SwapHex(string sHex)
|
||||
{
|
||||
string sResult = "";
|
||||
int iPos = sHex.Length - 2;
|
||||
while (iPos >= 0)
|
||||
{
|
||||
sResult += sHex.Substring(iPos, 2);
|
||||
sHex = sHex.Remove(iPos, 2);
|
||||
iPos = sHex.Length - 2;
|
||||
}
|
||||
return sResult;
|
||||
}
|
||||
public static string DecimalToHexString(string value, int size = 1)
|
||||
{
|
||||
try
|
||||
{
|
||||
long Lval = long.Parse(value);
|
||||
if (size == 1) return Lval.ToString("X2");
|
||||
if (size == 2) return Lval.ToString("X4");
|
||||
if (size == 4) return Lval.ToString("X8");
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
if (size == 1) return "00";
|
||||
if (size == 2) return "0000";
|
||||
if (size == 4) return "00000000";
|
||||
}
|
||||
return "00";
|
||||
}
|
||||
public static string ByteToHexString(byte data)
|
||||
{
|
||||
List<byte> val = new List<byte>();
|
||||
val.Add(data);
|
||||
byte[] arr = val.ToArray();
|
||||
return BytesToHex(arr);
|
||||
}
|
||||
public static string BytesToHex(byte[] data)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
foreach (byte b in data)
|
||||
sb.Append(b.ToString("X2"));
|
||||
|
||||
return sb.ToString();
|
||||
|
||||
}
|
||||
public static byte[] HexStringToByteArray(String hexString)
|
||||
{
|
||||
int numberChars = hexString.Length;
|
||||
byte[] bytes = new byte[numberChars / 2];
|
||||
for (int i = 0; i < numberChars; i += 2)
|
||||
{
|
||||
bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
public enum InitialCrcValue
|
||||
{
|
||||
Zeros,
|
||||
NonZero1 = 0xffff,
|
||||
NonZero2 = 0x1D0F
|
||||
}
|
||||
|
||||
public class Crc16Ccitt
|
||||
{
|
||||
private const ushort poly = 0x1021;
|
||||
ushort[] table = new ushort[256];
|
||||
ushort initialValue = 0;
|
||||
|
||||
public ushort ComputeChecksum(byte[] bytes)
|
||||
{
|
||||
ushort crc = this.initialValue;
|
||||
for (int i = 0; i < bytes.Length; ++i)
|
||||
{
|
||||
crc = (ushort)((crc << 8) ^ table[((crc >> 8) ^ (0xff & bytes[i]))]);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
public byte[] ComputeChecksumBytes(byte[] bytes)
|
||||
{
|
||||
ushort crc = ComputeChecksum(bytes);
|
||||
return BitConverter.GetBytes(crc);
|
||||
}
|
||||
public Crc16Ccitt(InitialCrcValue initialValue)
|
||||
{
|
||||
this.initialValue = (ushort) initialValue;
|
||||
ushort temp, a;
|
||||
for (int i = 0; i < table.Length; ++i)
|
||||
{
|
||||
temp = 0;
|
||||
a = (ushort) (i << 8);
|
||||
for (int j = 0; j < 8; ++j)
|
||||
{
|
||||
if (((temp ^ a) & 0x8000) != 0)
|
||||
{
|
||||
temp = (ushort) ((temp << 1) ^ poly);
|
||||
}
|
||||
else
|
||||
{
|
||||
temp <<= 1;
|
||||
}
|
||||
a <<= 1;
|
||||
}
|
||||
table[i] = temp;
|
||||
}
|
||||
}
|
||||
public byte[] calcCRCfromMessage(byte[] message)
|
||||
{
|
||||
// CRC calculation goes from MessageID to Password
|
||||
// For Read this means MsgID (1) + Offset (2) + PayloadLength (1) + Password (2) = 6
|
||||
// for write the length of the payload comes on top.
|
||||
// STX(1), length(1), CRC(2) and ETX(1) are excluded, in total 5 bytes.
|
||||
//
|
||||
// the method works both for sending messages (where the CRC and ETX are not in message)
|
||||
// and for receiving messages (where the CRC and ETX are included at the end)
|
||||
byte[] crc_msg = new byte[message[1]]; // message length is 2nd byte
|
||||
Array.Copy(message, 2, crc_msg, 0, crc_msg.Length);
|
||||
return ComputeChecksumBytes(crc_msg);
|
||||
}
|
||||
public string commentCRC(byte[] crc_meter, byte[] crc_computed)
|
||||
{
|
||||
bool crc_do_match = Tools.ByteArrayCompare(crc_meter, crc_computed);
|
||||
string crcComment = crc_do_match ? "ok." : "CRC DOESN'T MATCH!!";
|
||||
return "CRC Meter: " + Tools.BytesToHex(crc_meter) + (crc_do_match ? " == " : " != ")
|
||||
+ "CRC Computed: " + Tools.BytesToHex(crc_computed) + ". " + crcComment;
|
||||
}
|
||||
public bool crc_do_match(byte[] a, byte[] b)
|
||||
{
|
||||
return ByteArrayCompare(a, b);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,18 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.30703</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{439D0878-C76E-452B-B17D-209A89E91D36}</ProjectGuid>
|
||||
<ProjectGuid>{5954D496-CAAB-4F7A-BDE2-BDC8F47DAB19}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Dirichlet.Numerics</RootNamespace>
|
||||
<AssemblyName>Dirichlet.Numerics</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<RootNamespace>Sensus.iPerl</RootNamespace>
|
||||
<AssemblyName>NfcS5_DLL</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@@ -33,12 +31,24 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Int128.cs" />
|
||||
<Compile Include="NfcHandler\CR95HF_Reader.cs" />
|
||||
<Compile Include="NfcHandler\MCI_Protocol.cs" />
|
||||
<Compile Include="NfcHandler\NfcDataHandler.cs" />
|
||||
<Compile Include="NfcHandler\NFCHeadConfig.cs" />
|
||||
<Compile Include="NfcHandler\NfcMessageEventArgs.cs" />
|
||||
<Compile Include="NfcHandler\SERIAL_Driver.cs" />
|
||||
<Compile Include="NfcHandler\ST25DV_Device.cs" />
|
||||
<Compile Include="NfcHandler\Tools.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="UInt128.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
@@ -48,4 +58,4 @@
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
</Project>
|
||||
@@ -5,12 +5,12 @@ using System.Runtime.InteropServices;
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("DeviceTest")]
|
||||
[assembly: AssemblyTitle("NfcS5_DLL")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("DeviceTest")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||
[assembly: AssemblyProduct("NfcS5_DLL")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2022")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
@@ -20,7 +20,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("a3e8ad92-6617-4f5c-88ce-346d28120fb7")]
|
||||
[assembly: Guid("5954d496-caab-4f7a-bde2-bdc8f47dab19")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
[assembly: AssemblyVersion("1.14.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.14.0.0")]
|
||||
@@ -1 +0,0 @@
|
||||
Test StartTime: when? Start of flow set or start of real test?
|
||||
@@ -1,192 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Results.Entities;
|
||||
|
||||
namespace Results
|
||||
{
|
||||
public class BatchResults
|
||||
{
|
||||
public readonly int WMPositionsCount;
|
||||
|
||||
public IList<Entities.TestData> TestDataList;
|
||||
public IList<Entities.Components> ComponentsList;
|
||||
public IList<Entities.WaterMeterData> WaterMeterDataList;
|
||||
|
||||
private BatchResults(int wmPositionsCount)
|
||||
{
|
||||
WMPositionsCount = wmPositionsCount;
|
||||
|
||||
TestDataList = new List<Entities.TestData>();
|
||||
ComponentsList = new List<Entities.Components>();
|
||||
WaterMeterDataList = new List<Entities.WaterMeterData>();
|
||||
}
|
||||
|
||||
|
||||
public Batch Batch;
|
||||
public WaterMeter[] WaterMeters;
|
||||
|
||||
public static BatchResults NewFromProcedure(int batchNr, int benchId, string user, int userNr, string programVer,
|
||||
Config.Entities.Procedure procedure,
|
||||
WaterMeterData[] waterMeterDatas, int[] waterMeterParts)
|
||||
{
|
||||
BatchResults d = new BatchResults(waterMeterDatas.Length);
|
||||
int year = DateTime.Now.Year;
|
||||
|
||||
/// Create new batch
|
||||
d.Batch = new Batch()
|
||||
{
|
||||
TestBenchId = benchId,
|
||||
BatchNr = batchNr,
|
||||
ProgramVersion = programVer,
|
||||
UserName = user,
|
||||
UserNumber = userNr,
|
||||
ProcedureName = procedure.Name,
|
||||
ProcedureDescription = procedure.Description,
|
||||
WatermetersStr = procedure.Watermeters,
|
||||
ProcedureRevision = procedure.Revision,
|
||||
ProtocolTitle = procedure.ProtocolTitle,
|
||||
StartTime = DateTime.Now,
|
||||
Compound = (procedure.MetersKind == Config.Entities.MetersKind.Combined),
|
||||
#if HEAT_METERS
|
||||
HeatMeter = (procedure.MetersKind == Config.Entities.MetersKind.HeatMeter),
|
||||
#endif
|
||||
};
|
||||
|
||||
///
|
||||
/// Add watermeter to an array, array index is WM position.
|
||||
/// AddWaterMetersToBatch() has to be used before saving results.
|
||||
///
|
||||
d.WaterMeters = new WaterMeter[d.WMPositionsCount];
|
||||
for (int i = 0; i < d.WMPositionsCount; i++)
|
||||
{
|
||||
if (waterMeterDatas[i] == null) continue;
|
||||
WaterMeterData wmd = WaterMeterData.UpdateList(d.WaterMeterDataList, waterMeterDatas[i]);
|
||||
d.WaterMeters[i] = new WaterMeter()
|
||||
{
|
||||
Batch = d.Batch,
|
||||
WaterMeterData = wmd,
|
||||
WMPosition = i + 1,
|
||||
YearOfProduction = year,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
foreach (var t in procedure.Tests)
|
||||
{
|
||||
if (t.Publish != (byte)Config.Entities.Publish.Never)
|
||||
{
|
||||
TestData td = TestData.UpdateList(d.TestDataList, new TestData(t));
|
||||
|
||||
for (int rnr = 1; rnr <= t.Repeats; rnr++)
|
||||
{
|
||||
/// Create an empty test result and add it to the list
|
||||
TestRslt tr = new TestRslt(d.Batch, td, t.Part, rnr);
|
||||
d.Batch.TestRslts.Add(tr);
|
||||
|
||||
for (int i = 0; i < d.WMPositionsCount; i++)
|
||||
{
|
||||
if (d.WaterMeters[i] == null) continue;
|
||||
|
||||
if (t.Part != 0 && waterMeterParts[i] != 0 && t.Part != waterMeterParts[i]) continue;
|
||||
|
||||
///
|
||||
/// Create empty watermeter test results and add them to the list and to dictionaries
|
||||
///
|
||||
IList<MeterTestRslt> wmtrs = d.WaterMeters[i].MeterTestRslts;
|
||||
if (d.Batch.Compound)
|
||||
{
|
||||
/// Compound water meter
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundMain));
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.CompoundAux));
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Compound));
|
||||
}
|
||||
else if (d.Batch.HeatMeter)
|
||||
{
|
||||
/// Heat meter
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterVolume));
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.HeatMeterEnergy));
|
||||
}
|
||||
else
|
||||
{
|
||||
/// Water meter
|
||||
wmtrs.Add(new MeterTestRslt(d.WaterMeters[i], tr, Config.Entities.CompoundMeterId.Single));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
public static BatchResults FromBatch(Batch batch)
|
||||
{
|
||||
int wmCount = batch.WaterMeters.Count;
|
||||
if (wmCount == 0) return null;
|
||||
|
||||
BatchResults batchResults = new BatchResults(wmCount);
|
||||
batchResults.Batch = batch;
|
||||
batchResults.WaterMeters = new WaterMeter[wmCount];
|
||||
for (int i = 0; i < wmCount; i++) batchResults.WaterMeters[i] = batch.WaterMeters[i];
|
||||
|
||||
return batchResults;
|
||||
}
|
||||
|
||||
public TestRslt GetTestRslt(string name, int part)
|
||||
{
|
||||
return Batch.GetTestRslt(name, part);
|
||||
}
|
||||
|
||||
public MeterTestRslt GetMeterTestRslt(string name, int wmnr0, Config.Entities.CompoundMeterId meterId)
|
||||
{
|
||||
if (WaterMeters[wmnr0] != null)
|
||||
{
|
||||
return WaterMeters[wmnr0].GetMeterTestRslt(name, meterId);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Returns true when all tests were done
|
||||
/// </summary>
|
||||
/// <returns>true = all tests done</returns>
|
||||
public bool AllTestsDone()
|
||||
{
|
||||
for (int i = 0; i < WMPositionsCount; i++)
|
||||
{
|
||||
if (WaterMeters[i] != null)
|
||||
{
|
||||
foreach (var mtr in WaterMeters[i].MeterTestRslts)
|
||||
{
|
||||
if (!mtr.TestDone) return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds non-null water meters from an array to a Batch water meters list.
|
||||
/// This method should be used when results are prepared and
|
||||
/// all disabled water meters are deleted.
|
||||
/// </summary>
|
||||
public void AddWaterMetersToBatch()
|
||||
{
|
||||
for (int i = 0; i < WMPositionsCount; i++)
|
||||
{
|
||||
if (WaterMeters[i] != null)
|
||||
{
|
||||
WaterMeters[i].Passed = WaterMeters[i].PassedFromTests();
|
||||
if (!WaterMeters[i].Disabled)
|
||||
{
|
||||
Batch.WaterMeters.Add(WaterMeters[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
-274
@@ -1,274 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2013-2016 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using FluentNHibernate.Cfg;
|
||||
using FluentNHibernate.Cfg.Db;
|
||||
using log4net;
|
||||
using NHibernate;
|
||||
using NHibernate.Cfg;
|
||||
using NHibernate.Tool.hbm2ddl;
|
||||
using Results.Entities;
|
||||
|
||||
namespace Results
|
||||
{
|
||||
public static class DB
|
||||
{
|
||||
static readonly ILog log = LogManager.GetLogger(typeof(DB));
|
||||
|
||||
/// <summary> Session factory for all regular sessions, not for CreateEmptyResultsDB(). </summary>
|
||||
public static ISessionFactory SessionFactory;
|
||||
|
||||
/// <summary> Connection string for all sessions </summary>
|
||||
private static string connectionString;
|
||||
///
|
||||
public static string ConnectionString
|
||||
{
|
||||
get { return connectionString; }
|
||||
set { connectionString = value; SessionFactory = null; }
|
||||
}
|
||||
|
||||
/// <summary> Database type (MySQL or SQLite) for all sessions </summary>
|
||||
private static Users.Entities.DBType dbType;
|
||||
///
|
||||
public static Users.Entities.DBType DbType
|
||||
{
|
||||
get { return dbType; }
|
||||
set { dbType = value; SessionFactory = null; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <returns>A database session</returns>
|
||||
static ISessionFactory CreateSessionFactory()
|
||||
{
|
||||
return CreateSessionFactory(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// NHibernate session factory (to create the database session 'SessionFactory')
|
||||
/// </summary>
|
||||
/// <param name="createDB">true = Create a new DB, false = Regular DB</param>
|
||||
/// <returns>A database session</returns>
|
||||
public static ISessionFactory CreateSessionFactory(bool createDB)
|
||||
{
|
||||
FluentConfiguration cfg = Fluently.Configure();
|
||||
|
||||
switch (dbType)
|
||||
{
|
||||
default:
|
||||
case Users.Entities.DBType.SQLite:
|
||||
cfg = cfg.Database(SQLiteConfiguration.Standard.UsingFile(connectionString));
|
||||
break;
|
||||
case Users.Entities.DBType.MySql:
|
||||
cfg = cfg.Database(MySQLConfiguration.Standard.ConnectionString(connectionString));
|
||||
break;
|
||||
}
|
||||
|
||||
cfg = cfg.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entities.WaterMeterData>());
|
||||
|
||||
if (createDB)
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchemaCreate).BuildSessionFactory();
|
||||
}
|
||||
else
|
||||
{
|
||||
return cfg.ExposeConfiguration(BuildSchema).BuildSessionFactory();
|
||||
}
|
||||
}
|
||||
|
||||
static void BuildSchema(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration with mapping info and exports a database schema
|
||||
new SchemaExport(config).SetOutputFile("db_schema");
|
||||
}
|
||||
|
||||
static void BuildSchemaCreate(Configuration config)
|
||||
{
|
||||
/// This NHibernate tool takes a configuration with mapping info and exports a database schema
|
||||
new SchemaExport(config).Create(true, true);
|
||||
}
|
||||
|
||||
/// Create a NHibernate session for the given database
|
||||
public static ISession CreateSession()
|
||||
{
|
||||
if (string.IsNullOrEmpty(connectionString))
|
||||
{
|
||||
throw new Exception("Connection string was not specified");
|
||||
}
|
||||
|
||||
if (SessionFactory == null) SessionFactory = CreateSessionFactory();
|
||||
|
||||
return SessionFactory.OpenSession();
|
||||
}
|
||||
|
||||
|
||||
public static void SaveObject(object obj)
|
||||
{
|
||||
SaveObject(CreateSession(), obj);
|
||||
}
|
||||
///
|
||||
public static void SaveObject(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
session.SaveOrUpdate(obj);
|
||||
try { transaction.Commit(); }
|
||||
catch { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void DeleteObject(object obj)
|
||||
{
|
||||
DeleteObject(CreateSession(), obj);
|
||||
}
|
||||
///
|
||||
public static void DeleteObject(ISession session, object obj)
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
session.Delete(obj);
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Create an empty users database.
|
||||
/// Database contains only the user 'admin' and the control board component 'CB'.
|
||||
/// </summary>
|
||||
/// <param name="dbType">DBType.SQLite or DBType.MySql</param>
|
||||
/// <param name="connectionString">Connection string</param>
|
||||
/// <returns>true=success, false=error</returns>
|
||||
public static bool CreateEmptyDB()
|
||||
{
|
||||
ISessionFactory sessionFactory = CreateSessionFactory(true);
|
||||
if (sessionFactory == null) return false;
|
||||
|
||||
/// Populate the database
|
||||
using (var session = sessionFactory.OpenSession())
|
||||
{
|
||||
using (var transaction = session.BeginTransaction())
|
||||
{
|
||||
transaction.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Shared data
|
||||
/// </summary>
|
||||
public static IList<Entities.TestData> TestDataList;
|
||||
public static IList<Entities.Components> ComponentsList;
|
||||
public static IList<Entities.WaterMeterData> WaterMeterDataList;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Loads shared data from the database
|
||||
/// </summary>
|
||||
/// <exception>Throws NHibernate exceptions</exception>
|
||||
public static void LoadSharedData()
|
||||
{
|
||||
ISession session = DB.CreateSession();
|
||||
|
||||
TestDataList = session.QueryOver<TestData>().List();
|
||||
ComponentsList = session.QueryOver<Components>().List();
|
||||
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads shared data from the database
|
||||
/// </summary>
|
||||
/// <exception>Throws NHibernate exceptions</exception>
|
||||
public static int GetMaxSavedBatchNr()
|
||||
{
|
||||
ISession session = DB.CreateSession();
|
||||
IList<Entities.Batch> batches = session.QueryOver<Batch>().List();
|
||||
|
||||
int maxBatchNr = 0;
|
||||
foreach (var b in batches)
|
||||
{
|
||||
if (b.BatchNr > maxBatchNr) maxBatchNr = b.BatchNr;
|
||||
}
|
||||
return maxBatchNr;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Update TestData, Components and WaterMeterData fo tests and water meters in batch results
|
||||
/// with existing data in static lists TestDataList, ComponentsList and WaterMeterDataList.
|
||||
/// </summary>
|
||||
/// <param name="batch">Batch results</param>
|
||||
/// <returns>true when any data modiifed</returns>
|
||||
public static bool UpdateBatchData(Entities.Batch batch)
|
||||
{
|
||||
ISession session = DB.CreateSession();
|
||||
|
||||
if (session == null) return false;
|
||||
|
||||
foreach (var tr in batch.TestRslts)
|
||||
{
|
||||
/// Search in TestDataList and update test data in the new batch
|
||||
TestData td = TestData.UpdateList(TestDataList, tr.TestData);
|
||||
tr.TestData = td;
|
||||
|
||||
/// Search in ComponentsList and update components in the new batch
|
||||
Components cd = Components.UpdateList(ComponentsList, tr.Components);
|
||||
tr.Components = cd;
|
||||
}
|
||||
|
||||
foreach (var wm in batch.WaterMeters)
|
||||
{
|
||||
/// Search in WaterMeterDataList and update water meter data in the new batch
|
||||
WaterMeterData wmd = WaterMeterData.UpdateList(WaterMeterDataList, wm.WaterMeterData);
|
||||
wm.WaterMeterData = wmd;
|
||||
}
|
||||
|
||||
return true; /// TODO: Really check for modifications
|
||||
}
|
||||
|
||||
|
||||
public static bool SaveNewBatch(Entities.Batch batch)
|
||||
{
|
||||
ISession session = DB.CreateSession();
|
||||
if (session == null) return false;
|
||||
|
||||
TestDataList = session.QueryOver<TestData>().List();
|
||||
ComponentsList = session.QueryOver<Components>().List();
|
||||
WaterMeterDataList = session.QueryOver<WaterMeterData>().List();
|
||||
|
||||
UpdateBatchData(batch);
|
||||
|
||||
ITransaction transaction = session.BeginTransaction();
|
||||
if (transaction == null) return false;
|
||||
|
||||
try
|
||||
{
|
||||
foreach (var td in TestDataList) if (td.Id == 0) session.SaveOrUpdate(td);
|
||||
foreach (var cd in ComponentsList) if (cd.Id == 0) session.SaveOrUpdate(cd);
|
||||
foreach (var wd in WaterMeterDataList) if (wd.Id == 0) session.SaveOrUpdate(wd);
|
||||
|
||||
session.SaveOrUpdate(batch);
|
||||
|
||||
transaction.Commit();
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
transaction.Rollback();
|
||||
log.FatalFormat("Saving results of batch #{0} into the results DB failed: {1}", batch.BatchNr, exc.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
session.Flush();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,81 +0,0 @@
|
||||
///
|
||||
/// Copyright (c) 2015-2016 Sensus Metering Systems
|
||||
///
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Results.Entities
|
||||
{
|
||||
public class Batch
|
||||
{
|
||||
public virtual int Id { get; protected set; }
|
||||
public virtual int BatchNr { get; set; }
|
||||
public virtual int TestBenchId { get; set; }
|
||||
public virtual string ProgramVersion { get; set; }
|
||||
public virtual string UserName { get; set; }
|
||||
public virtual int UserNumber { get; set; }
|
||||
public virtual string ProcedureName { get; set; }
|
||||
public virtual string ProcedureDescription { get; set; } /// CEVAK, not mapped to DB
|
||||
public virtual int ProcedureRevision { get; set; }
|
||||
public virtual string WatermetersStr { get; set; } /// CEVAK, not mapped to DB
|
||||
public virtual string ProtocolTitle { get; set; }
|
||||
public virtual string Remark { get; set; }
|
||||
public virtual float Custom1 { get; set; }
|
||||
public virtual float Custom2 { get; set; }
|
||||
public virtual float Custom3 { get; set; }
|
||||
public virtual DateTime StartTime { get; set; }
|
||||
public virtual DateTime EndTime { get; set; }
|
||||
public virtual bool RsltsSent { get; set; }
|
||||
public virtual bool RsltsPrinted { get; set; }
|
||||
public virtual IList<TestData> Tests { get; set; }
|
||||
public virtual IList<WaterMeter> WaterMeters { get; set; }
|
||||
public virtual IList<TestRslt> TestRslts { get; set; }
|
||||
public virtual bool Compound { get; set; } /// Not mapped to DB now
|
||||
public virtual bool HeatMeter { get; set; } /// Not mapped to DB now
|
||||
|
||||
public Batch()
|
||||
{
|
||||
Tests = new List<TestData>();
|
||||
WaterMeters = new List<WaterMeter>();
|
||||
TestRslts = new List<TestRslt>();
|
||||
}
|
||||
|
||||
public virtual float AmbientTempAve()
|
||||
{
|
||||
if (TestRslts.Count == 0) return 0;
|
||||
float sum = 0;
|
||||
foreach (var tr in TestRslts) sum += tr.AmbTempMean;
|
||||
return sum / TestRslts.Count;
|
||||
}
|
||||
|
||||
public virtual float AmbientPressAve()
|
||||
{
|
||||
if (TestRslts.Count == 0) return 0;
|
||||
float sum = 0;
|
||||
foreach (var tr in TestRslts) sum += tr.AmbPressMean;
|
||||
return sum / TestRslts.Count;
|
||||
}
|
||||
|
||||
public virtual float AmbientHumiAve()
|
||||
{
|
||||
if (TestRslts.Count == 0) return 0;
|
||||
float sum = 0;
|
||||
foreach (var tr in TestRslts) sum += tr.AmbHumiMean;
|
||||
return sum / TestRslts.Count;
|
||||
}
|
||||
|
||||
public virtual TestRslt GetTestRslt(string name, int part)
|
||||
{
|
||||
foreach (var tr in TestRslts)
|
||||
{
|
||||
if (part == tr.Part && name.Equals(tr.Name())) return tr;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("Batch #{0}, Start:{1}, End:{2}, Procedure:{3}", BatchNr, StartTime, EndTime, ProcedureName);
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user