Compare commits
13 Commits
MilwaukeeT
...
master-2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6cb4b2bba8 | ||
|
|
56c2aeb647 | ||
|
|
a4d7dccde9 | ||
|
|
74655e976f | ||
|
|
7486b2a490 | ||
|
|
6e62be6e6c | ||
|
|
6c7dbfa5a0 | ||
|
|
c77fd822a6 | ||
|
|
60f30d65fd | ||
|
|
704232d231 | ||
|
|
79c5c022ea | ||
|
|
5bea046c01 | ||
|
|
6226a2812b |
22
.gitignore
vendored
22
.gitignore
vendored
@ -54,6 +54,28 @@ Users/bin/
|
||||
Users/obj/
|
||||
UserManagement/bin/
|
||||
UserManagement/obj/
|
||||
DataMatrix4Net/bin/
|
||||
DataMatrix4Net/obj/
|
||||
GenericTest/bin/
|
||||
GenericTest/obj/
|
||||
LabelPrinting/bin/
|
||||
LabelPrinting/obj/
|
||||
OrderManagement/bin/
|
||||
OrderManagement/obj/
|
||||
ProductionTracing/bin/
|
||||
ProductionTracing/obj/
|
||||
RecordProcessing/bin/
|
||||
RecordProcessing/obj/
|
||||
S640TestApp/bin/
|
||||
S640TestApp/obj/
|
||||
SchematicDrawing/bin/
|
||||
SchematicDrawing/obj/
|
||||
SharedDatabase/bin/
|
||||
SharedDatabase/obj/
|
||||
WorkflowConfigurator/bin/
|
||||
WorkflowConfigurator/obj/
|
||||
Workplace/bin/
|
||||
Workplace/obj/
|
||||
.vs/
|
||||
*.suo
|
||||
*.bak
|
||||
|
||||
14
TBF.sln
14
TBF.sln
@ -96,6 +96,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResultsParser", "ResultsPar
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sensus.iPerl.RfidCom", "..\iPerlHead\Sensus.iPerl.RfidCom\Sensus.iPerl.RfidCom.csproj", "{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NfcS5_DLL", "..\NfcS5_DLL\NfcS5_DLL.csproj", "{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -402,6 +404,18 @@ Global
|
||||
{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A3E14180-7F00-42E5-94A9-8DB62EAD6EE8}.Release|x86.Build.0 = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@ -14,6 +14,7 @@ using Users;
|
||||
using TBF.Resources;
|
||||
using TBF.Rig.Sequences;
|
||||
using TBF.UI.Shared;
|
||||
using System.Threading;
|
||||
|
||||
namespace TBF
|
||||
{
|
||||
@ -69,7 +70,9 @@ namespace TBF
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
|
||||
Application.ThreadException += new ThreadExceptionEventHandler(Form1_UIThreadException);
|
||||
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
|
||||
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);
|
||||
|
||||
/// Program version string
|
||||
System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
@ -536,7 +539,12 @@ namespace TBF
|
||||
log.Info("Exiting application.");
|
||||
}
|
||||
|
||||
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
|
||||
private static void Form1_UIThreadException(object sender, ThreadExceptionEventArgs e)
|
||||
{
|
||||
LogException(log, "Unhandled thread exception", (Exception)e.Exception);
|
||||
}
|
||||
|
||||
static void MyHandler(object sender, UnhandledExceptionEventArgs args)
|
||||
{
|
||||
LogException(log, "Unhandled exception", (Exception)args.ExceptionObject);
|
||||
}
|
||||
|
||||
@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("2.33.2138.0")]
|
||||
[assembly: AssemblyFileVersion("2.33.2138.0")]
|
||||
[assembly: AssemblyVersion("2.33.2140.0")]
|
||||
[assembly: AssemblyFileVersion("2.33.2140.0")]
|
||||
|
||||
9
TBF/Resources/Strings.Designer.cs
generated
9
TBF/Resources/Strings.Designer.cs
generated
@ -1941,6 +1941,15 @@ namespace TBF.Resources {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Error when saving and printing results.
|
||||
/// </summary>
|
||||
internal static string Error_when_saving_and_printing_results {
|
||||
get {
|
||||
return ResourceManager.GetString("Error_when_saving_and_printing_results", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Error while creating the database. Reason: .
|
||||
/// </summary>
|
||||
|
||||
@ -1701,4 +1701,7 @@
|
||||
<data name="PDF_files" xml:space="preserve">
|
||||
<value>PDF soubory</value>
|
||||
</data>
|
||||
<data name="Error_when_saving_and_printing_results" xml:space="preserve">
|
||||
<value>Chyba při ukládání a tisknutí výsledků</value>
|
||||
</data>
|
||||
</root>
|
||||
@ -2335,4 +2335,7 @@
|
||||
<data name="PDF_files" xml:space="preserve">
|
||||
<value>PDF files</value>
|
||||
</data>
|
||||
<data name="Error_when_saving_and_printing_results" xml:space="preserve">
|
||||
<value>Error when saving and printing results</value>
|
||||
</data>
|
||||
</root>
|
||||
@ -77,6 +77,7 @@ namespace TBF.Rig
|
||||
Starting, /// During initial phase of some process, sending a command to a device, etc.
|
||||
Busy, /// Useful when waiting in state until at least one is busy (all are done)
|
||||
Done, /// Useful when waiting in state until the first is done, the rest miht still be busy
|
||||
Crashed, /// Run() function of an operation crashed
|
||||
MakeSecondPass, /// Test completed OK but 2nd pass (evaluation) is required
|
||||
EndSession, /// Test completed OK (similarly to Event.Done), 'End session' button click is automatically invoked
|
||||
///
|
||||
|
||||
@ -5,11 +5,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using log4net;
|
||||
#if MANAGED
|
||||
using Oracle.ManagedDataAccess.Client;
|
||||
#else
|
||||
using Oracle.DataAccess.Client;
|
||||
#endif
|
||||
using Common;
|
||||
using Config;
|
||||
using Config.Entities;
|
||||
@ -113,9 +109,10 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
string procedureSignature;
|
||||
IList<SensusTestInfo> oracleTestInfo; /// Raw incomplete test info from Oracle DB (or null)
|
||||
LUTestData[] completeTestInfo; /// Complete test info obtained from the procedure
|
||||
LUTestData[] distinctTestInfo; /// Distinct test info obtained from the procedure - if Q3 is splitted to 2 parts, test info is only for one Q3
|
||||
|
||||
|
||||
public Database() {}
|
||||
public Database() {}
|
||||
|
||||
public Database(Generic.IComponentCfg cfg)
|
||||
: base(cfg)
|
||||
@ -396,14 +393,15 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
}
|
||||
|
||||
#if ORACLE_DB
|
||||
void GetTestInofFromProcedure(string logCaption)
|
||||
void GetTestInfoFromProcedure(string logCaption, Results.Entities.Batch bat = null)
|
||||
{
|
||||
///
|
||||
/// Select or create appropriate test infos
|
||||
///
|
||||
IList<LUTestData> testsToSave = new List<LUTestData>();
|
||||
int maxPruefungsNr = 0;
|
||||
foreach (var td in Sequences.ProcessData.BatchRslts.Batch.Tests)
|
||||
Results.Entities.Batch batch = Sequences.ProcessData.BatchRslts == null? bat : Sequences.ProcessData.BatchRslts.Batch;
|
||||
foreach (var td in batch.Tests)
|
||||
{
|
||||
for (int repNr = 1; repNr <= td.Repeats; repNr++)
|
||||
{
|
||||
@ -419,8 +417,11 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
Array.Sort(testsToSaveArr, new LUTestDataComparer());
|
||||
completeTestInfo = testsToSaveArr;
|
||||
|
||||
distinctTestInfo = testsToSave.GroupBy(x => x.TData.OraId).Select(group => group.First()).ToArray();
|
||||
Array.Sort(distinctTestInfo, new LUTestDataComparer());
|
||||
|
||||
log.WarnFormat("{0} selected test infos:", logCaption);
|
||||
foreach (var cti in completeTestInfo)
|
||||
foreach (var cti in distinctTestInfo)
|
||||
{
|
||||
log.WarnFormat(" ID={0} Rev={1} Test={2} PrfNrDB={3} QBzDB={4}",
|
||||
wmTypeId, wmTypeRevision, cti.TestName, cti.Id, cti.Designation);
|
||||
@ -429,7 +430,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
|
||||
public Retv ReadStartInfoFromDB(OracleConnection conn)
|
||||
{
|
||||
GetTestInofFromProcedure("ReadStartInfoFromDB"); /// Create appropriate test infos
|
||||
GetTestInfoFromProcedure("ReadStartInfoFromDB"); /// Create appropriate test infos
|
||||
|
||||
bool anyError = false;
|
||||
try
|
||||
@ -823,7 +824,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
throw new Exception(string.Format("Cannot save batch {0} to Oracle, missing entry in VT_WZTYP_SD", bat.BatchNr));
|
||||
}
|
||||
|
||||
GetTestInofFromProcedure("SaveBatchData"); /// Create appropriate test infos
|
||||
GetTestInfoFromProcedure("SaveBatchData", bat); /// Create appropriate test infos
|
||||
|
||||
if (dbCfg.DebugLevel == DebugMode.Normal)
|
||||
{
|
||||
@ -859,7 +860,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
log.WarnFormat("SIM: VT_PRUEFREIHE_PD inserted, BatchNr={0}, TypeId={1}, TypeRev={2}, Start={3}", bat.BatchNr, bat.WaterMeters[0].WaterMeterData.WMTypeId, wmTypeRevision, bat.StartTime);
|
||||
}
|
||||
|
||||
foreach (var testInfo in completeTestInfo)
|
||||
foreach (var testInfo in distinctTestInfo)
|
||||
{
|
||||
if ((testInfo.Id != 0) && (-20 <= testInfo.Id) && (testInfo.Id <= 20)) /// LU PruefungsNr-s are between -20 and 20
|
||||
{
|
||||
@ -1066,7 +1067,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + wm.Batch.TestBenchId });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.Batch.BatchNr });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = wm.OrigCalibFactor });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = wm.CalibFactor }); // korrimprate - should be new calib.factor, not wm.OrigCalibFactor
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO: pressure test
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.WMPosition });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.Passed ? 1 : 0 });
|
||||
@ -1082,7 +1083,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
}
|
||||
|
||||
|
||||
foreach (var testInfo in completeTestInfo)
|
||||
foreach (var testInfo in distinctTestInfo)
|
||||
{
|
||||
if ((testInfo.Id != 0) && (-20 <= testInfo.Id) && (testInfo.Id <= 20)) /// LU PruefungsNr-s are nonzero and between -20 and 20
|
||||
{
|
||||
@ -1299,7 +1300,7 @@ namespace TBF.Rig.Output.DB.SensusOracle
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = dbCfg.TestBenchGroupId + wm.Batch.TestBenchId });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.Batch.BatchNr });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = hydr_Pruefung });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = wm.OrigCalibFactor });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, Value = wm.CalibFactor });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = 0 }); /// TODO
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.WMPosition });
|
||||
cmd.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Int32, Value = wm.Passed ? 1 : 0 });
|
||||
|
||||
@ -434,7 +434,7 @@ namespace TBF.Rig.Sequences
|
||||
wm.Disabled = true;
|
||||
}
|
||||
else if (!wm.Disabled && (Users.CurrentUser.UserName() == "milan" ||
|
||||
Users.CurrentUser.UserName() == "augustin" ||
|
||||
Users.CurrentUser.UserName() == "jau" ||
|
||||
Users.CurrentUser.UserName() == "michal" ||
|
||||
Users.CurrentUser.UserName() == "michal2"))
|
||||
{
|
||||
@ -1343,21 +1343,17 @@ namespace TBF.Rig.Sequences
|
||||
printers.CopyTo(rsltProcessors, writers.Length);
|
||||
eventTriggers.CopyTo(rsltProcessors, writers.Length + printers.Length);
|
||||
///
|
||||
int rpix = 0; /// Component index in AddOperation() loop, afterwards rsltProcessors.Length
|
||||
State st = State.Create("MainSeq : Saving and printing results");
|
||||
int rpix = 0; /// Component index in AddOperation() loop
|
||||
try
|
||||
{
|
||||
State st = State.Create("MainSeq : Saving and printing results");
|
||||
for (rpix = 0; rpix < rsltProcessors.Length; rpix++ )
|
||||
{
|
||||
var rp = TbfComponents.FindComponent(rsltProcessors[rpix]) as IResultsProcessor;
|
||||
if (rp != null) st.AddOperation(rp.ProcessResultsOp(ProcessData.BatchRslts.Batch));
|
||||
}
|
||||
st.EnterState();
|
||||
do {
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) break;
|
||||
}
|
||||
while (e.Contains(Event.Busy));
|
||||
|
||||
st.EnterState(); /// Executes operation.Start() functions of result processors, should be inside try-catch
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
@ -1366,6 +1362,20 @@ namespace TBF.Rig.Sequences
|
||||
log.FatalFormat("FileWriter {0} crashed: {1}", rpName, exc.Message);
|
||||
goto error;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
/// Next line executes operation.Run() of result processors, already try-catch protected (generates Event.Crashed)
|
||||
e = StateMachine.WaitRunDevsRunOps();
|
||||
if (e.Contains(Event.Error)) break;
|
||||
}
|
||||
while (e.Contains(Event.Busy));
|
||||
|
||||
if (e.Contains(Event.Crashed))
|
||||
{
|
||||
Bridge.OnError(this, Strings.Error_when_saving_and_printing_results);
|
||||
}
|
||||
|
||||
if (e.Contains(Event.Error)) goto error;
|
||||
///
|
||||
if (!e.Contains(Event.ErrorProcessingResults))
|
||||
|
||||
@ -2049,7 +2049,7 @@ namespace TBF.Rig.Sequences
|
||||
/// <returns></returns>
|
||||
protected bool TestAndLogUiCmdStop(Test test, IList<Event> e)
|
||||
{
|
||||
if (!e.Contains(Event.UiCmdStop)) return false;
|
||||
if (e == null || !e.Contains(Event.UiCmdStop)) return false;
|
||||
|
||||
log.FatalFormat("STOP pressed: Procedure={0}, Test={1}, State={2}",
|
||||
(StateMachine.Procedure == null) ? "?" : StateMachine.Procedure.Name,
|
||||
@ -2064,14 +2064,24 @@ namespace TBF.Rig.Sequences
|
||||
log.FatalFormat(" Feeding path: {0}", (inPath != null) ? inPath.ToString() : "none");
|
||||
log.FatalFormat(" Bench path: {0}", (benchPath != null) ? benchPath.ToString() : "none");
|
||||
log.FatalFormat(" Output path: {0}", (outPath != null) ? outPath.ToString() : "none");
|
||||
if (inPath.Pump is IPump) log.FatalFormat(" Pump power: {0}%", (inPath.Pump as IPump).Power);
|
||||
else if (inPath.Pump is IValve) log.FatalFormat(" Feeding valve: {0}", (inPath.Pump as IValve).State ? "open" : "close");
|
||||
if (outPath.RegulValve is IRegValve) log.FatalFormat(" Regulation valve position: {0}%", outPath.RegulValve.Position);
|
||||
log.FatalFormat(" Flow: {0}", RefFlow);
|
||||
log.FatalFormat(" Mass: {0}", Mass);
|
||||
log.FatalFormat(" Start mass: {0}", StartMass);
|
||||
log.FatalFormat(" Liter/ref.pulse: {0}", LtrPerRefPulse);
|
||||
log.FatalFormat(" Reference pulses: {0}", RefPulses);
|
||||
try
|
||||
{
|
||||
if (inPath != null)
|
||||
{
|
||||
if (inPath.Pump is IPump) log.FatalFormat(" Pump power: {0}%", (inPath.Pump as IPump).Power);
|
||||
else if (inPath.Pump is IValve) log.FatalFormat(" Feeding valve: {0}", (inPath.Pump as IValve).State ? "open" : "close");
|
||||
}
|
||||
if (outPath != null && outPath.RegulValve is IRegValve) log.FatalFormat(" Regulation valve position: {0}%", outPath.RegulValve.Position);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.FatalFormat($" SequenceBase.TestAndLogUiCmdStop error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@ -185,19 +185,31 @@ namespace TBF.Rig
|
||||
/// <returns>List of Event-s returned from the state operations</returns>
|
||||
public static IList<Event> RunOperations()
|
||||
{
|
||||
IList<Event> events = new List<Event>();
|
||||
IList<Event> events = new List<Event>(); /// List of events from all operation.Run() - initially empty
|
||||
|
||||
foreach (IOperation operation in currentState.Operations)
|
||||
{
|
||||
Event evnt = operation.Run();
|
||||
if (evnt != Event.None)
|
||||
Event evnt;
|
||||
try
|
||||
{
|
||||
log.InfoFormat("Operation {0}.Run() returned {1}", operation, evnt);
|
||||
events.Add(evnt);
|
||||
}
|
||||
else
|
||||
evnt = operation.Run();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.DebugFormat("Operation {0}.Run() returned {1}", operation, evnt);
|
||||
log.FatalFormat("Operation {0}.Run() crashed: {1}", operation, ex);
|
||||
evnt = Event.Crashed;
|
||||
events.Add(Event.Crashed);
|
||||
}
|
||||
|
||||
if (evnt == Event.None)
|
||||
{
|
||||
/// Do not add Event.None to the list of events
|
||||
log.DebugFormat("Operation {0}.Run() returned {1}", operation, evnt);
|
||||
}
|
||||
else if (evnt != Event.Crashed)
|
||||
{
|
||||
events.Add(evnt);
|
||||
log.InfoFormat("Operation {0}.Run() returned {1}", operation, evnt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -4,7 +4,9 @@ using Sensus.iPerl.RfidCom.Services;
|
||||
using Sensus.iPerl.RfidCom.Structures;
|
||||
using System;
|
||||
using System.Threading;
|
||||
using TBF.Rig.Hart.Common;
|
||||
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
|
||||
using static Sensus.iPerl.NfcHandler.MCI_Protocol;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
{
|
||||
@ -23,7 +25,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
try
|
||||
{
|
||||
byte[] pcb = null;
|
||||
int readRetVal = iPerlCommunicationForm.ReadRequestPort(iHead, MessageID.Configuration, 16, 5, out pcb);
|
||||
int readRetVal = iPerlCommunicationForm.ReadRequestPort(iHead, MessageID.Configuration, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.Configuration, 16, 5, out pcb);
|
||||
if (readRetVal == 0)
|
||||
{
|
||||
return RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(BitConverter.ToString(pcb).Replace("-", string.Empty))).ToString();
|
||||
@ -39,12 +41,28 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
internal static string SetActiveMode(IperlHead iHead)
|
||||
{
|
||||
return RfidCommands.SetActiveMode($"COM{iHead.RfidComPortNr}") ? "OK" : "Error Set Active Mode";
|
||||
byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
|
||||
if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd))
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Error Set Active Mode";
|
||||
}
|
||||
}
|
||||
|
||||
internal static string SetTestMode(IperlHead iHead)
|
||||
{
|
||||
return RfidCommands.SetTestMode($"COM{iHead.RfidComPortNr}") ? "OK" : "Error Set Test Mode";
|
||||
byte[] cmd = new byte[1] { (byte)Command.SetTestMode };
|
||||
if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.Command, StructName.Command, 0, 1, cmd))
|
||||
{
|
||||
return "OK";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Error Set Test Mode";
|
||||
}
|
||||
}
|
||||
|
||||
#if IPERL
|
||||
@ -52,10 +70,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
{
|
||||
try
|
||||
{
|
||||
string payload = "03";
|
||||
RfidCommunicationService rfidCommunicationService = new RfidCommunicationService { ComPort = $"COM{iHead.RfidComPortNr}", WaitTimeAfterFailure = 2200, PassThroughWaitTime = 1500, MaxRetries = 3, TimeOut = 5000 };
|
||||
rfidCommunicationService.RfidWrite(Params.u8_WakeUpInterval, payload);
|
||||
return rfidCommunicationService.RfidRead<string>(Params.u8_WakeUpInterval).ToString() == payload ? "OK" : "Error";
|
||||
int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, 1, new byte[] { (byte)3 }); // WakeUpInterval
|
||||
return 0 == retValue ? "OK" : "Error";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -67,11 +83,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
{
|
||||
try
|
||||
{
|
||||
string payload = "01"; // 1 set the µC to the production mode, radio should not start
|
||||
RfidCommunicationService rfidCommunicationService = new RfidCommunicationService { ComPort = $"COM{iHead.RfidComPortNr}", WaitTimeAfterFailure = 2200, PassThroughWaitTime = 1500, MaxRetries = 3, TimeOut = 5000 };
|
||||
rfidCommunicationService.RfidWrite(SystemInfo.u8_system_state, payload);
|
||||
Thread.Sleep(1000); // must be for pass thru params
|
||||
return rfidCommunicationService.RfidRead<string>(SystemInfo.u8_system_state).ToString() == payload ? "OK" : "Error";
|
||||
int retValue = iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, 1, new byte[] { (byte)1 }); // System Status
|
||||
return 0 == retValue ? "OK" : "Error";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -85,7 +98,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
try
|
||||
{
|
||||
byte[] cmd = RfidHelper.HexStringToByteArray(custText);
|
||||
if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, 0x1899, 9, cmd))
|
||||
if (0 == iPerlCommunicationForm.WriteRequestPort(iHead, MessageID.RadioPassthrough, Sensus.iPerl.NfcHandler.MCI_Protocol.StructName.RadioParams, 0x1899, 9, cmd))
|
||||
{
|
||||
RfidCommunicationService rfidCommunicationService = new RfidCommunicationService { ComPort = $"COM{iHead.RfidComPortNr}", WaitTimeAfterFailure = 2200, PassThroughWaitTime = 1500, MaxRetries = 3, TimeOut = 5000 };
|
||||
//rfidCommunicationService.RfidWrite(Params.u8_Customer_Text, custText);
|
||||
|
||||
@ -2,6 +2,8 @@
|
||||
/// Copyright (c) 2015-2021 Sensus Slovensko a.s.
|
||||
///
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Threading;
|
||||
using System.Xml.Serialization;
|
||||
using Common;
|
||||
using Config.Entities;
|
||||
@ -27,6 +29,15 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
public int NrThreads; /// Numbwr of parallel threads (1, 2 or 4)
|
||||
public int IperlCheckErrorsToStop;
|
||||
|
||||
///
|
||||
/// NFC S4.5 Combihead params
|
||||
///
|
||||
public int MciTimeoutMs;
|
||||
public int BaudRate;
|
||||
public int DataBits;
|
||||
public Parity ParityBit;
|
||||
public StopBits StopBits;
|
||||
|
||||
public int DfltQ2c_15_rl;
|
||||
public int DfltQ2c_15_lr;
|
||||
public int DfltQ2c_20_rl;
|
||||
@ -65,8 +76,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
PassThroughWaitTime = 1500;
|
||||
NrThreads = 2; /// 1, 2 or 4 threads
|
||||
IperlCheckErrorsToStop = 10;
|
||||
MciTimeoutMs = 4000; // ms, NFC interface
|
||||
BaudRate = 57600; // NFC Interface
|
||||
DataBits = 8; // NFC Interface
|
||||
ParityBit = Parity.None; // NFC Interface
|
||||
StopBits = StopBits.Two; // NFC Interface
|
||||
|
||||
TestParams = CreateTestParamsProvider() as iPerlCommunicationParams;
|
||||
TestParams = CreateTestParamsProvider() as iPerlCommunicationParams;
|
||||
}
|
||||
|
||||
public TestMethodCfg(IComponentFactory factory)
|
||||
|
||||
@ -9,7 +9,6 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
using log4net;
|
||||
@ -18,14 +17,8 @@ using Config.Entities;
|
||||
using TBF.Resources;
|
||||
using TBF.Rig.Sequences;
|
||||
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
|
||||
using Sensus.iPerl.RfidCom;
|
||||
using Sensus.iPerl.RfidCom.Exceptions;
|
||||
using Sensus.iPerl.RfidCom.Helper;
|
||||
using Sensus.iPerl.RfidCom.Model.Enums;
|
||||
using Sensus.iPerl.RfidCom.Services;
|
||||
using Sensus.iPerl.RfidCom.Structures;
|
||||
using Results.Entities;
|
||||
using Results;
|
||||
using static Sensus.iPerl.NfcHandler.MCI_Protocol;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
{
|
||||
@ -110,115 +103,29 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
public static Color DirNokColor = Color.Red;
|
||||
|
||||
|
||||
#region iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort
|
||||
#region Simulation / RFID / NFC Interface: ReadRequestPort, WriteRequestPort
|
||||
/// <summary>
|
||||
/// Wrapper function with safe interface and unsafe body
|
||||
/// </summary>
|
||||
/// <param name="iperlHead">Water meter (iPerlHead) object</param>
|
||||
/// <returns>Value returned by readRequestPort(...)</returns>
|
||||
public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer)
|
||||
public static int ReadRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, out byte[] buffer)
|
||||
{
|
||||
Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries));
|
||||
|
||||
if (iperlHead.DebugLevel != DebugMode.Normal)
|
||||
if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation
|
||||
{
|
||||
///
|
||||
/// Simulation
|
||||
///
|
||||
if ((messageID == MessageID.Configuration) && (offset == 0) && (length == ConfigStruct.Length))
|
||||
{
|
||||
buffer = new byte[ConfigStruct.Length] { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
}
|
||||
else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStruct.Length))
|
||||
{
|
||||
buffer = new byte[CalibrationStruct.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0 };
|
||||
}
|
||||
else if ((messageID == MessageID.Calibration) && (offset == 0) && (length == CalibrationStructV4.Length))
|
||||
{
|
||||
buffer = new byte[CalibrationStructV4.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 150, 10 };
|
||||
}
|
||||
else if ((messageID == MessageID.Calibration) && (offset == 2) && (length == 2))
|
||||
{
|
||||
buffer = new byte[2] { 150, 10 };
|
||||
}
|
||||
else if ((messageID == MessageID.Calibration) && (offset == 34) && (length == 2))
|
||||
{
|
||||
buffer = new byte[2] { 150, 10 };
|
||||
}
|
||||
else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2))
|
||||
{
|
||||
buffer = new byte[2] { 0, 0 };
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = new byte[length];
|
||||
}
|
||||
|
||||
return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13
|
||||
return SimulationServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer);
|
||||
}
|
||||
|
||||
for (int i = 0; i < cfg.MaxCommRetries; i++)
|
||||
if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface
|
||||
{
|
||||
using (RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}"))
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] response = writer.ReadRequest((byte)messageID, offset, length, cfg.CommTimeout);
|
||||
string hexString = RfidHelper.ConvertByteArrayToHexString(response);
|
||||
string swapHexString = RfidHelper.SwapHexcode(hexString);
|
||||
string decString = RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(hexString)).ToString();
|
||||
|
||||
if (length > 10)
|
||||
{
|
||||
//if the result only contains "00"s we are working on the wrong COM port
|
||||
// or the module just isn't connected
|
||||
if (Regex.IsMatch(hexString, @"^(00)\1+$"))
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No RFID signal.");
|
||||
throw new RfidValidationException("Error_Rfid_NoSignal");
|
||||
}
|
||||
|
||||
//if the result only contains "03"s the meter did not answer.
|
||||
// Might be due to the module being positioned incorrectly.
|
||||
if (Regex.IsMatch(hexString, @"^(03)\1+$"))
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No meter signal.");
|
||||
throw new RfidValidationException("Error_Rfid_NoAnswerFromMeter");
|
||||
}
|
||||
}
|
||||
|
||||
writer.ClosePort();
|
||||
buffer = response;
|
||||
rfidDataLogger.Info($"{iperlHead.Name} ({iperlHead.SerialNr}): ReadRequestPort(COM{iperlHead.RfidComPortNr},...) returned HEX: {hexString}; SwapHexCodeToDecimal: {decString}");
|
||||
return 0;
|
||||
}
|
||||
catch (RfidDataNotAvailableException)
|
||||
{
|
||||
if (/*RfidHelper.IsPassThrough(messageID)*/ messageID == MessageID.ASICRegisterReadTest || messageID == MessageID.RadioPassthrough)
|
||||
{
|
||||
rfidDataLogger.Info($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {(i > 0 ? "<- Error: Invalid Pass-Through data." : "<- Info: Wait for Pass-Through data.")}");
|
||||
Thread.Sleep(cfg.PassThroughWaitTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
}
|
||||
catch (RfidValidationException)
|
||||
{
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {ex.Message}");
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
}
|
||||
return NfcServices.ReadRequest(cfg, iperlHead, structName, offset, length, out buffer);
|
||||
}
|
||||
else // RFID Interface
|
||||
{
|
||||
return RfidServices.ReadRequest(cfg, iperlHead, messageID, offset, length, out buffer);
|
||||
}
|
||||
rfidDataLogger.Error($"RFID reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
|
||||
log.Error($"RFID reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
|
||||
buffer = new byte[length];
|
||||
return 3;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -226,49 +133,23 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// </summary>
|
||||
/// <param name="iperlHead">Water meter (iPerlHead) object</param>
|
||||
/// <returns>Value returned by writeRequestPort(...)</returns>
|
||||
public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer)
|
||||
public static int WriteRequestPort(IperlHead iperlHead, MessageID messageID, StructName structName, int offset, int length, byte[] buffer)
|
||||
{
|
||||
Thread.Sleep(Math.Max(250, cfg.DelayBetweenRetries));
|
||||
|
||||
if (iperlHead.DebugLevel != DebugMode.Normal) return 0;
|
||||
|
||||
RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}");
|
||||
string payload = RfidHelper.ConvertByteArrayToHexString(buffer);
|
||||
//byte messageId = (byte)((int)valueDefinition.MessageType);
|
||||
//byte[] payloadBytes = RfidHelper.HexStringToByteArray(payload);
|
||||
|
||||
for (var i = 0; i < cfg.MaxCommRetries; i++)
|
||||
if (iperlHead.DebugLevel != DebugMode.Normal) // Simulation
|
||||
{
|
||||
try
|
||||
{
|
||||
if (writer.ClosePort()) writer.OpenPort();
|
||||
writer.WriteRequest((byte)messageID, offset, length, buffer, cfg.CommTimeout, false);
|
||||
writer.ClosePort();
|
||||
rfidDataLogger.InfoFormat($"{iperlHead.Name}({iperlHead.SerialNr},COM{iperlHead.RfidComPortNr}): WriteRequestPort({messageID}, {offset}, {length}, {payload})");
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (messageID == MessageID.RadioPassthrough || messageID == MessageID.ASICRegisterReadTest)
|
||||
{
|
||||
Thread.Sleep(1500);
|
||||
}
|
||||
else
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Error: {ex.Message}");
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
if (i > 1)
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Reopen the com port.");
|
||||
writer.ClosePort();
|
||||
}
|
||||
}
|
||||
}
|
||||
return SimulationServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer);
|
||||
}
|
||||
|
||||
if (iperlHead.CommInterface == CommunicationInterface.NFC) // NFC Interface
|
||||
{
|
||||
return NfcServices.WriteRequest(cfg, iperlHead, structName, offset, length, buffer);
|
||||
}
|
||||
else // RFID Interface
|
||||
{
|
||||
return RfidServices.WriteRequest(cfg, iperlHead, messageID, offset, length, buffer);
|
||||
}
|
||||
writer.ClosePort();
|
||||
rfidDataLogger.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
|
||||
log.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
|
||||
return 2;
|
||||
}
|
||||
#endregion iPerl_Head_RFID_Interface: ReadRequestPort, WriteRequestPort
|
||||
|
||||
@ -308,7 +189,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// RFID multiplexer PCB / RFID serial port and worker thread related variables
|
||||
///
|
||||
static TestMethod testMethod;
|
||||
static TestMethodCfg cfg;
|
||||
public static TestMethodCfg cfg;
|
||||
static IList<Config.Entities.Test> tests;
|
||||
static IList<iPerlCommunicationParams> multiTestParams;
|
||||
|
||||
@ -979,7 +860,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Read configuration
|
||||
byte[] config = null;
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config);
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config);
|
||||
if (readRetVal == 0)
|
||||
{
|
||||
error = CommErr.None;
|
||||
@ -1032,7 +913,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Switch to Active mode in order to change TestModeConfig
|
||||
error = CommErr.CmdActive;
|
||||
byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
|
||||
{
|
||||
error = CommErr.None;
|
||||
}
|
||||
@ -1046,7 +927,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Change the TestModeConfig if necessary
|
||||
error = CommErr.Write;
|
||||
byte[] tstMdCfg = new byte[1] { testModeConfig };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Configuration, 21, 1, tstMdCfg))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 21, 1, tstMdCfg))
|
||||
{
|
||||
ihead.ConfigStruct.Update(21, tstMdCfg);
|
||||
error = CommErr.None;
|
||||
@ -1061,7 +942,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Switch to test mode
|
||||
error = CommErr.CmdTest;
|
||||
byte[] cmd = new byte[1] { (byte)Command.SetTestMode };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
|
||||
{
|
||||
error = CommErr.None;
|
||||
}
|
||||
@ -1074,9 +955,11 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
if (error == CommErr.None)
|
||||
{
|
||||
/// Verify the configuration
|
||||
Thread.Sleep(2000); // RFID: 1000 ms is enough, NFC needs min 2000 ms
|
||||
error = CommErr.Verify;
|
||||
byte[] config = null;
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Configuration, 0, ConfigStruct.Length, out config))
|
||||
int retVal = ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 0, ConfigStruct.Length, out config);
|
||||
if (0 == retVal)
|
||||
{
|
||||
ihead.ConfigStruct = ConfigStruct.FromByteArray(config);
|
||||
if ((ihead.ConfigStruct.MeterState == MeterState.Test) && (ihead.ConfigStruct.TestModeConfig == testModeConfig))
|
||||
@ -1104,7 +987,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Switch to active mode
|
||||
byte[] cmd = new byte[1] { (byte)Command.SetActiveMode };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, 0, 1, cmd))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Command, StructName.Command, 0, 1, cmd))
|
||||
{
|
||||
error = CommErr.None;
|
||||
}
|
||||
@ -1158,7 +1041,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Read calibration
|
||||
byte[] calib = null;
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStruct.Length, out calib);
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStruct.Length, out calib);
|
||||
if (readRetVal == 0)
|
||||
{
|
||||
ihead.CalibrationStruct = CalibrationStruct.FromByteArray(calib);
|
||||
@ -1192,7 +1075,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Read calibration
|
||||
byte[] calib = null;
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Calibration, 0, CalibrationStructV4.Length, out calib);
|
||||
readRetVal = ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 0, CalibrationStructV4.Length, out calib);
|
||||
if (readRetVal == 0)
|
||||
{
|
||||
ihead.CalibrationStructV4 = CalibrationStructV4.FromByteArray(calib);
|
||||
@ -1321,14 +1204,14 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write the new calibration factor (up to cfg.MaxCommRetries tims)
|
||||
///
|
||||
error = CommErr.Write;
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
|
||||
{
|
||||
///
|
||||
/// Read and verify the calibration factor
|
||||
///
|
||||
error = CommErr.ReadAfterWrite;
|
||||
byte[] calib_2_3 = null;
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
|
||||
{
|
||||
error = CommErr.Verify;
|
||||
if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1])
|
||||
@ -1478,8 +1361,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write the new calibration factor (up to cfg.MaxCommRetries tims)
|
||||
///
|
||||
error = CommErr.Write;
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data) &&
|
||||
0 == WriteRequestPort(ihead, MessageID.Calibration, 34, 2, dataLNA))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data) &&
|
||||
0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, dataLNA))
|
||||
{
|
||||
///
|
||||
/// Read and verify the calibration factor
|
||||
@ -1487,8 +1370,8 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
error = CommErr.ReadAfterWrite;
|
||||
byte[] calib_2_3 = null;
|
||||
byte[] calib_34_35 = null;
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3) &&
|
||||
0 == ReadRequestPort(ihead, MessageID.Calibration, 34, 2, out calib_34_35))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3) &&
|
||||
0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 34, 2, out calib_34_35))
|
||||
{
|
||||
error = CommErr.Verify;
|
||||
if (calib_2_3 != null && calib_2_3.Length == 2 && data[0] == calib_2_3[0] && data[1] == calib_2_3[1] &&
|
||||
@ -1555,7 +1438,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
if (ihead.FactorLimitLo <= ihead.CalibFactor && ihead.CalibFactor <= ihead.FactorLimitHi)
|
||||
{
|
||||
resultStr = "Calibratin factor is OK";
|
||||
resultStr = "Calibration factor is OK";
|
||||
return CommErr.None; /// No need to update the calibration factor
|
||||
}
|
||||
|
||||
@ -1588,7 +1471,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
}
|
||||
|
||||
byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
|
||||
{
|
||||
error = CommErr.None;
|
||||
ihead.CalibrationStruct.Update(data, 2);
|
||||
@ -1600,7 +1483,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Read calibration
|
||||
byte[] calib_2_3 = null;
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
|
||||
{
|
||||
error = CommErr.None;
|
||||
ihead.CalibrationStruct.Update(calib_2_3, 2);
|
||||
@ -1657,7 +1540,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
}
|
||||
|
||||
byte[] data = new byte[2] { (byte)(defaultCalibFactor & 0x00FF), (byte)((defaultCalibFactor >> 8) & 0x00FF) };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, 2, 2, data))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, data))
|
||||
{
|
||||
error = CommErr.None;
|
||||
ihead.CalibrationStructV4.Update(data, 2);
|
||||
@ -1669,7 +1552,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
/// Read calibration
|
||||
byte[] calib_2_3 = null;
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, 2, 2, out calib_2_3))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Calibration, StructName.Calibration, 2, 2, out calib_2_3))
|
||||
{
|
||||
error = CommErr.None;
|
||||
ihead.CalibrationStructV4.Update(calib_2_3, 2);
|
||||
@ -1697,7 +1580,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write zero Q2 correction
|
||||
byte[] rdData = null;
|
||||
///
|
||||
if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, 2, out rdData))
|
||||
{
|
||||
error = CommErr.None;
|
||||
}
|
||||
@ -1796,7 +1679,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write zero Q2 correction
|
||||
byte[] wrData = new byte[2] { (byte)factorLR, (byte)factorRL };
|
||||
///
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData))
|
||||
{
|
||||
wm.Q2CorrRL = ihead.Q2CorrRL = factorRL;
|
||||
wm.Q2CorrLR = ihead.Q2CorrLR = factorLR;
|
||||
@ -1905,7 +1788,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write zero Q2 correction
|
||||
byte[] wrData = new byte[1] { 0 };
|
||||
///
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData))
|
||||
{
|
||||
error = CommErr.None;
|
||||
}
|
||||
@ -2186,7 +2069,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write R-L Q2 correction factor only
|
||||
///
|
||||
byte[] wrData = new byte[1] { (byte)q2CorrRL };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrRL, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrRL, wrData.Length, wrData))
|
||||
{
|
||||
wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
|
||||
resultStr = string.Format("Q2 correction: RL={0}", q2CorrRL);
|
||||
@ -2204,7 +2087,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write L-R Q2 correction factor only
|
||||
///
|
||||
byte[] wrData = new byte[1] { (byte)q2CorrLR };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddrLR, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddrLR, wrData.Length, wrData))
|
||||
{
|
||||
wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
|
||||
resultStr = string.Format("Q2 correction: LR={0}", q2CorrLR);
|
||||
@ -2217,7 +2100,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
/// Write both Q2 correction factors
|
||||
///
|
||||
byte[] wrData = new byte[2] { (byte)q2CorrLR, (byte)q2CorrRL };
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Q2CorrFactorsAddr, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Q2CorrFactorsAddr, wrData.Length, wrData))
|
||||
{
|
||||
wm.Q2CorrRL = ihead.Q2CorrRL = q2CorrRL;
|
||||
wm.Q2CorrLR = ihead.Q2CorrLR = q2CorrLR;
|
||||
@ -2325,7 +2208,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
Byte hz2CorrectionByte = (byte)(hz2CorrectionFactor & 0x000000FF);
|
||||
byte[] wrData = new byte[1] { hz2CorrectionByte };
|
||||
///
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, Hz2CorrFactorsAddr, wrData.Length, wrData))
|
||||
if (0 == WriteRequestPort(ihead, MessageID.MetrologyMemory, StructName.ProductionInfo, Hz2CorrFactorsAddr, wrData.Length, wrData))
|
||||
{
|
||||
error = CommErr.None;
|
||||
wm.Hz2Correction = ihead.Hz2Correction = hz2CorrectionFactor;
|
||||
@ -2383,42 +2266,42 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
List<iPerlDataWrite> dataToBeWritten = new List<iPerlDataWrite>
|
||||
{
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x1985, new byte[] { arrow }, "Arrow"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x199C, new byte[5], "Clear S/N"),
|
||||
new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current")
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), // ?????
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 5:0x1985, new byte[] { arrow }, "Arrow"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 28:0x199C, new byte[5], "Clear S/N"),
|
||||
new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { (byte)0xA0 }, "Test mode config = A0"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 14:0x198E, new byte[] { (byte)(2510 & 0xFF), (byte)((2510 >> 8) & 0xFF) }, "Receipt mean current")
|
||||
};
|
||||
|
||||
// check meter status: 1-Idle, 2-Active, 3-Test, 4-End Of Life
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Configuration, 1, 1, out byte[] rdData))
|
||||
if (0 == ReadRequestPort(ihead, MessageID.Configuration, StructName.Configuration, 1, 1, out byte[] rdData))
|
||||
{
|
||||
int eMeterState = (int)((SByte)rdData[0]);
|
||||
switch (eMeterState)
|
||||
{
|
||||
case 1: // Idle -> Test -> Active
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetTestMode }, "Set test mode"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetTestMode }, "Set test mode"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
|
||||
break;
|
||||
case 3: // Test Mode -> Active
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)1 }, "System Status"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, 0x1898, new byte[] { (byte)3 }, "WakeUpInterval"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F,
|
||||
(byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D,
|
||||
(byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07,
|
||||
(byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x1898, new byte[] { (byte)3 }, "WakeUpInterval"));
|
||||
dataToBeWritten.Add(new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioParams, 0x18A2, new byte[] { (byte)0x4A, (byte)0x53, (byte)0x3B, (byte)0x8F,
|
||||
(byte)0x70, (byte)0x31, (byte)0xC2, (byte)0x5D,
|
||||
(byte)0x6F, (byte)0x2D, (byte)0xE8, (byte)0x07,
|
||||
(byte)0x6E, (byte)0x0F, (byte)0x97, (byte)0xC3, }, "AES Key Crypted"));
|
||||
|
||||
int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
|
||||
int mask = 1;
|
||||
foreach (var wData in dataToBeWritten)
|
||||
{
|
||||
bool isSuccessfullyWritten = false;
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data))
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
|
||||
{
|
||||
isSuccessfullyWritten = true;
|
||||
}
|
||||
@ -2475,10 +2358,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
|
||||
{
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed
|
||||
new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)1 }, "System Status"),
|
||||
new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
|
||||
new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0xA5 }, "Open Sealing"), /// 0x5A=sealed, 0xA5=unsealed ??????
|
||||
new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)1 }, "System Status"),
|
||||
new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
|
||||
new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
|
||||
};
|
||||
|
||||
if (ihead.ConfigStruct != null) ihead.OrigTestModeConfig = ihead.ConfigStruct.TestModeConfig;
|
||||
@ -2488,7 +2371,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
foreach (var wData in dataToBeWritten)
|
||||
{
|
||||
bool isSuccessfullyWritten = false;
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data))
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
|
||||
{
|
||||
isSuccessfullyWritten = true;
|
||||
}
|
||||
@ -2535,10 +2418,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
|
||||
iPerlDataWrite[] dataToBeWritten = new iPerlDataWrite[]
|
||||
{
|
||||
new iPerlDataWrite(MessageID.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
|
||||
new iPerlDataWrite(MessageID.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
|
||||
new iPerlDataWrite(MessageID.RadioPassthrough, 0x1804, new byte[] { (byte)0 }, "System Status"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, 0x19A1, new byte[] { (byte)0x5A }, "Close Sealing"),
|
||||
new iPerlDataWrite(MessageID.Command, StructName.Command, 0x0000, new byte[] { (byte)Command.SetActiveMode }, "Set active mode"),
|
||||
new iPerlDataWrite(MessageID.Configuration, StructName.Configuration, 0x0015, new byte[] { testModeConfig }, string.Format("Test mode config = {0:X2}", testModeConfig)),
|
||||
new iPerlDataWrite(MessageID.RadioPassthrough, StructName.RadioInfo, 0x1804, new byte[] { (byte)0 }, "System Status"),
|
||||
new iPerlDataWrite(MessageID.MetrologyMemory, StructName.Calibration, ihead.CommInterface == CommunicationInterface.NFC? 33:0x19A1, new byte[] { (byte)0x5A }, "Close Sealing") /// 0x5A=sealed, 0xA5=unsealed ??????
|
||||
};
|
||||
|
||||
int successfyllyWrittenFlags = 0; /// Ones in this word represent communication failures, LSB represents the first step
|
||||
@ -2546,7 +2429,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
foreach (var wData in dataToBeWritten)
|
||||
{
|
||||
bool isSuccessfullyWritten = false;
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.Offset, wData.Data.Length, wData.Data))
|
||||
if (0 == WriteRequestPort(ihead, wData.MessageID, wData.StructName, wData.Offset, wData.Data.Length, wData.Data))
|
||||
{
|
||||
isSuccessfullyWritten = true;
|
||||
}
|
||||
|
||||
@ -2,19 +2,22 @@
|
||||
/// Copyright (c) 2021 Sensus Slovensko a.s.
|
||||
///
|
||||
using TBF.Rig.TestMethods.iPerlCommunication.iPerlHead;
|
||||
using static Sensus.iPerl.NfcHandler.MCI_Protocol;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication
|
||||
{
|
||||
public class iPerlDataWrite
|
||||
{
|
||||
public MessageID MessageID;
|
||||
public StructName StructName;
|
||||
public int Offset;
|
||||
public byte[] Data;
|
||||
public string Description;
|
||||
|
||||
public iPerlDataWrite(MessageID mesageID, int offset, byte[] data, string description)
|
||||
public iPerlDataWrite(MessageID mesageID, StructName structName, int offset, byte[] data, string description)
|
||||
{
|
||||
MessageID = mesageID;
|
||||
StructName = structName;
|
||||
Offset = offset;
|
||||
Data = data;
|
||||
Description = description;
|
||||
|
||||
@ -104,4 +104,10 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
Flush = 0,
|
||||
ProcessAndSave,
|
||||
}
|
||||
|
||||
public enum CommunicationInterface
|
||||
{
|
||||
RFID,
|
||||
NFC
|
||||
}
|
||||
}
|
||||
|
||||
@ -43,6 +43,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
public int MuxBoardNrOrGroup14 { get { return iperlHeadCfg.MuxBoardNr; } }
|
||||
public int Group { get { return iperlHeadCfg.Group; } }
|
||||
public iPerlHead.MeterType MeterType { get { return iperlHeadCfg.MeterType; } }
|
||||
public CommunicationInterface CommInterface { get { return iperlHeadCfg.CommunicationInterface; } }
|
||||
|
||||
public int Position
|
||||
{
|
||||
@ -1008,6 +1009,22 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
}
|
||||
}
|
||||
|
||||
public string ReadOptoData()
|
||||
{
|
||||
string received = ".";
|
||||
lock (this)
|
||||
{
|
||||
int nrBytes = optoSerialPort.BytesToRead;
|
||||
if (nrBytes > 0)
|
||||
{
|
||||
char[] buffer = new char[nrBytes];
|
||||
optoSerialPort.Read(buffer, 0, nrBytes);
|
||||
received = new string(buffer);
|
||||
}
|
||||
}
|
||||
return received;
|
||||
}
|
||||
|
||||
|
||||
void OptoTelegramReceived(int currentIx, bool async, Int64 volumeRawExt, Int64 timestampRawExt)
|
||||
{
|
||||
@ -1039,6 +1056,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Called from the state machine when a test is selected and UI needs to be updated.
|
||||
/// </summary>
|
||||
public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
|
||||
|
||||
@ -25,6 +25,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
public int RfidComPortNr; /// 0 = use MuxBoardNr
|
||||
public int MuxBoardNr; /// 0 = use RfidComPort(Nr), otherwise mux. board nr. 1 .. 4
|
||||
public int Group; /// Number written to QuidoRS to connct the watermeter to RfidComPort, 1 .. 10
|
||||
public CommunicationInterface CommunicationInterface; /// Communication Interface: RFID or NFC
|
||||
|
||||
/// <summary> Procedure parameters </summary>
|
||||
[XmlIgnore]
|
||||
@ -45,6 +46,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
RfidComPortNr = 0; /// = use mux. board
|
||||
MuxBoardNr = 1;
|
||||
ProcParams = CreateProcParamsProvider() as ProcParams;
|
||||
CommunicationInterface = CommunicationInterface.RFID;
|
||||
}
|
||||
|
||||
public IperlHeadCfg(IComponentFactory factory)
|
||||
@ -55,12 +57,13 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
|
||||
public string ToString(int i)
|
||||
{
|
||||
return string.Format("{0} Group1 (mux#)={1}, Group2={2}, Opto=Com{3}, RFID=Com{4}",
|
||||
return string.Format("{0} Group1 (mux#)={1}, Group2={2}, Opto=Com{3}, RFID=Com{4}, Interface={5}",
|
||||
Name,
|
||||
MuxBoardNr,
|
||||
Group,
|
||||
OptoComPortNr,
|
||||
RfidComPortNr);
|
||||
RfidComPortNr,
|
||||
CommunicationInterface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,16 +3,14 @@
|
||||
///
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Windows.Forms;
|
||||
using Common;
|
||||
using Config.Entities;
|
||||
using TBF.Rig.Generic;
|
||||
using TBF.Resources;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl
|
||||
public partial class IperlHeadCfgCtrl : UserControl, IComponentCfgCtrl
|
||||
{
|
||||
public bool ShowMore { get { return false; } }
|
||||
|
||||
@ -55,7 +53,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
rfidPortNrTextBox.Text = config.RfidComPortNr.ToString();
|
||||
muxBoardNrTextBox.Text = config.MuxBoardNr.ToString();
|
||||
groupTextBox.Text = config.Group.ToString();
|
||||
}
|
||||
comboBoxCommunicationInterface.SelectedItem = config.CommunicationInterface.ToString();
|
||||
tabPage2.Controls.Add(new IperlHeadTestCtrl(config));
|
||||
}
|
||||
|
||||
public void Unlock()
|
||||
{
|
||||
@ -68,6 +68,7 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
rfidPortNrTextBox.Enabled = true;
|
||||
muxBoardNrTextBox.Enabled = true;
|
||||
groupTextBox.Enabled = true;
|
||||
comboBoxCommunicationInterface.Enabled = true;
|
||||
}
|
||||
|
||||
public CfgUpdateFlags VerifyCfg(ref string message)
|
||||
@ -144,8 +145,9 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
config.RfidComPortNr = int.Parse(rfidPortNrTextBox.Text);
|
||||
config.MuxBoardNr = int.Parse(muxBoardNrTextBox.Text);
|
||||
config.Group = int.Parse(groupTextBox.Text);
|
||||
config.CommunicationInterface = (CommunicationInterface)comboBoxCommunicationInterface.SelectedIndex;
|
||||
|
||||
return flags;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,149 +31,145 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.nameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.nameLabel = new System.Windows.Forms.Label();
|
||||
this.classNameLabel = new System.Windows.Forms.Label();
|
||||
this.optoSerialPortTextBox = new System.Windows.Forms.TextBox();
|
||||
this.optoSerialPortLabel = new System.Windows.Forms.Label();
|
||||
this.muxBoardNrTextBox = new System.Windows.Forms.TextBox();
|
||||
this.muxBoardNrLabel = new System.Windows.Forms.Label();
|
||||
this.groupTextBox = new System.Windows.Forms.TextBox();
|
||||
this.groupLabel = new System.Windows.Forms.Label();
|
||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.comboBoxCommunicationInterface = new System.Windows.Forms.ComboBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.rfidPortNrTextBox = new System.Windows.Forms.TextBox();
|
||||
this.rfidSerialPortNrLabel = new System.Windows.Forms.Label();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton2 = new System.Windows.Forms.RadioButton();
|
||||
this.optoDataGroupBox = new System.Windows.Forms.GroupBox();
|
||||
this.tcpipPortLabel = new System.Windows.Forms.Label();
|
||||
this.tcpipPortTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ipAddressLabel = new System.Windows.Forms.Label();
|
||||
this.ipAddressTextBox = new System.Windows.Forms.TextBox();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.optoDataGroupBox.SuspendLayout();
|
||||
this.radioButton1 = new System.Windows.Forms.RadioButton();
|
||||
this.radioButton2 = new System.Windows.Forms.RadioButton();
|
||||
this.optoSerialPortLabel = new System.Windows.Forms.Label();
|
||||
this.optoSerialPortTextBox = new System.Windows.Forms.TextBox();
|
||||
this.groupTextBox = new System.Windows.Forms.TextBox();
|
||||
this.groupLabel = new System.Windows.Forms.Label();
|
||||
this.muxBoardNrTextBox = new System.Windows.Forms.TextBox();
|
||||
this.muxBoardNrLabel = new System.Windows.Forms.Label();
|
||||
this.nameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.nameLabel = new System.Windows.Forms.Label();
|
||||
this.classNameLabel = new System.Windows.Forms.Label();
|
||||
this.tabPage2 = new System.Windows.Forms.TabPage();
|
||||
this.tabControl1.SuspendLayout();
|
||||
this.tabPage1.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.optoDataGroupBox.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// nameTextBox
|
||||
// tabControl1
|
||||
//
|
||||
this.nameTextBox.Enabled = false;
|
||||
this.nameTextBox.Location = new System.Drawing.Point(135, 40);
|
||||
this.nameTextBox.Name = "nameTextBox";
|
||||
this.nameTextBox.Size = new System.Drawing.Size(121, 20);
|
||||
this.nameTextBox.TabIndex = 2;
|
||||
this.tabControl1.Controls.Add(this.tabPage1);
|
||||
this.tabControl1.Controls.Add(this.tabPage2);
|
||||
this.tabControl1.Location = new System.Drawing.Point(3, 3);
|
||||
this.tabControl1.Name = "tabControl1";
|
||||
this.tabControl1.SelectedIndex = 0;
|
||||
this.tabControl1.Size = new System.Drawing.Size(611, 432);
|
||||
this.tabControl1.TabIndex = 0;
|
||||
//
|
||||
// nameLabel
|
||||
// tabPage1
|
||||
//
|
||||
this.nameLabel.AutoSize = true;
|
||||
this.nameLabel.Location = new System.Drawing.Point(25, 43);
|
||||
this.nameLabel.Name = "nameLabel";
|
||||
this.nameLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.nameLabel.TabIndex = 1;
|
||||
this.nameLabel.Text = "Name";
|
||||
this.tabPage1.Controls.Add(this.label4);
|
||||
this.tabPage1.Controls.Add(this.label3);
|
||||
this.tabPage1.Controls.Add(this.groupBox1);
|
||||
this.tabPage1.Controls.Add(this.optoDataGroupBox);
|
||||
this.tabPage1.Controls.Add(this.groupTextBox);
|
||||
this.tabPage1.Controls.Add(this.groupLabel);
|
||||
this.tabPage1.Controls.Add(this.muxBoardNrTextBox);
|
||||
this.tabPage1.Controls.Add(this.muxBoardNrLabel);
|
||||
this.tabPage1.Controls.Add(this.nameTextBox);
|
||||
this.tabPage1.Controls.Add(this.nameLabel);
|
||||
this.tabPage1.Controls.Add(this.classNameLabel);
|
||||
this.tabPage1.Location = new System.Drawing.Point(4, 25);
|
||||
this.tabPage1.Name = "tabPage1";
|
||||
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tabPage1.Size = new System.Drawing.Size(603, 403);
|
||||
this.tabPage1.TabIndex = 0;
|
||||
this.tabPage1.Text = "Config";
|
||||
this.tabPage1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// classNameLabel
|
||||
// label4
|
||||
//
|
||||
this.classNameLabel.AutoSize = true;
|
||||
this.classNameLabel.Location = new System.Drawing.Point(132, 16);
|
||||
this.classNameLabel.Name = "classNameLabel";
|
||||
this.classNameLabel.Size = new System.Drawing.Size(60, 13);
|
||||
this.classNameLabel.TabIndex = 0;
|
||||
this.classNameLabel.Text = "ClassName";
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(208, 101);
|
||||
this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(40, 16);
|
||||
this.label4.TabIndex = 25;
|
||||
this.label4.Text = "1 .. 10";
|
||||
//
|
||||
// optoSerialPortTextBox
|
||||
// label3
|
||||
//
|
||||
this.optoSerialPortTextBox.Enabled = false;
|
||||
this.optoSerialPortTextBox.Location = new System.Drawing.Point(329, 42);
|
||||
this.optoSerialPortTextBox.Name = "optoSerialPortTextBox";
|
||||
this.optoSerialPortTextBox.Size = new System.Drawing.Size(34, 20);
|
||||
this.optoSerialPortTextBox.TabIndex = 7;
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(208, 72);
|
||||
this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(33, 16);
|
||||
this.label3.TabIndex = 24;
|
||||
this.label3.Text = "1 .. 4";
|
||||
//
|
||||
// optoSerialPortLabel
|
||||
// groupBox1
|
||||
//
|
||||
this.optoSerialPortLabel.AutoSize = true;
|
||||
this.optoSerialPortLabel.Location = new System.Drawing.Point(241, 45);
|
||||
this.optoSerialPortLabel.Name = "optoSerialPortLabel";
|
||||
this.optoSerialPortLabel.Size = new System.Drawing.Size(72, 13);
|
||||
this.optoSerialPortLabel.TabIndex = 6;
|
||||
this.optoSerialPortLabel.Text = "Serial port nr.:";
|
||||
this.groupBox1.Controls.Add(this.comboBoxCommunicationInterface);
|
||||
this.groupBox1.Controls.Add(this.label1);
|
||||
this.groupBox1.Controls.Add(this.rfidPortNrTextBox);
|
||||
this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel);
|
||||
this.groupBox1.Location = new System.Drawing.Point(10, 259);
|
||||
this.groupBox1.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Padding = new System.Windows.Forms.Padding(4);
|
||||
this.groupBox1.Size = new System.Drawing.Size(552, 68);
|
||||
this.groupBox1.TabIndex = 23;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "RFID / NFC communication (in case mux. board is not used)";
|
||||
//
|
||||
// muxBoardNrTextBox
|
||||
// comboBoxCommunicationInterface
|
||||
//
|
||||
this.muxBoardNrTextBox.Enabled = false;
|
||||
this.muxBoardNrTextBox.Location = new System.Drawing.Point(135, 63);
|
||||
this.muxBoardNrTextBox.Name = "muxBoardNrTextBox";
|
||||
this.muxBoardNrTextBox.Size = new System.Drawing.Size(34, 20);
|
||||
this.muxBoardNrTextBox.TabIndex = 9;
|
||||
this.comboBoxCommunicationInterface.Enabled = false;
|
||||
this.comboBoxCommunicationInterface.FormattingEnabled = true;
|
||||
this.comboBoxCommunicationInterface.Items.AddRange(new object[] {
|
||||
"RFID",
|
||||
"NFC"});
|
||||
this.comboBoxCommunicationInterface.Location = new System.Drawing.Point(201, 27);
|
||||
this.comboBoxCommunicationInterface.Name = "comboBoxCommunicationInterface";
|
||||
this.comboBoxCommunicationInterface.Size = new System.Drawing.Size(71, 24);
|
||||
this.comboBoxCommunicationInterface.TabIndex = 9;
|
||||
//
|
||||
// muxBoardNrLabel
|
||||
// label1
|
||||
//
|
||||
this.muxBoardNrLabel.AutoSize = true;
|
||||
this.muxBoardNrLabel.Location = new System.Drawing.Point(25, 66);
|
||||
this.muxBoardNrLabel.Name = "muxBoardNrLabel";
|
||||
this.muxBoardNrLabel.Size = new System.Drawing.Size(106, 13);
|
||||
this.muxBoardNrLabel.TabIndex = 8;
|
||||
this.muxBoardNrLabel.Text = "Group 1 (mux. board)";
|
||||
//
|
||||
// groupTextBox
|
||||
//
|
||||
this.groupTextBox.Enabled = false;
|
||||
this.groupTextBox.Location = new System.Drawing.Point(135, 86);
|
||||
this.groupTextBox.Name = "groupTextBox";
|
||||
this.groupTextBox.Size = new System.Drawing.Size(34, 20);
|
||||
this.groupTextBox.TabIndex = 11;
|
||||
//
|
||||
// groupLabel
|
||||
//
|
||||
this.groupLabel.AutoSize = true;
|
||||
this.groupLabel.Location = new System.Drawing.Point(25, 89);
|
||||
this.groupLabel.Name = "groupLabel";
|
||||
this.groupLabel.Size = new System.Drawing.Size(45, 13);
|
||||
this.groupLabel.TabIndex = 10;
|
||||
this.groupLabel.Text = "Group 2";
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(41, 30);
|
||||
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(153, 16);
|
||||
this.label1.TabIndex = 8;
|
||||
this.label1.Text = "Communication Interface";
|
||||
//
|
||||
// rfidPortNrTextBox
|
||||
//
|
||||
this.rfidPortNrTextBox.Enabled = false;
|
||||
this.rfidPortNrTextBox.Location = new System.Drawing.Point(329, 21);
|
||||
this.rfidPortNrTextBox.Location = new System.Drawing.Point(439, 26);
|
||||
this.rfidPortNrTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.rfidPortNrTextBox.Name = "rfidPortNrTextBox";
|
||||
this.rfidPortNrTextBox.Size = new System.Drawing.Size(34, 20);
|
||||
this.rfidPortNrTextBox.Size = new System.Drawing.Size(44, 22);
|
||||
this.rfidPortNrTextBox.TabIndex = 7;
|
||||
//
|
||||
// rfidSerialPortNrLabel
|
||||
//
|
||||
this.rfidSerialPortNrLabel.AutoSize = true;
|
||||
this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(241, 24);
|
||||
this.rfidSerialPortNrLabel.Location = new System.Drawing.Point(321, 30);
|
||||
this.rfidSerialPortNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.rfidSerialPortNrLabel.Name = "rfidSerialPortNrLabel";
|
||||
this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(72, 13);
|
||||
this.rfidSerialPortNrLabel.Size = new System.Drawing.Size(88, 16);
|
||||
this.rfidSerialPortNrLabel.TabIndex = 6;
|
||||
this.rfidSerialPortNrLabel.Text = "Serial port nr.:";
|
||||
//
|
||||
// radioButton1
|
||||
//
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Enabled = false;
|
||||
this.radioButton1.Location = new System.Drawing.Point(22, 19);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(83, 17);
|
||||
this.radioButton1.TabIndex = 0;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "Use TCP/IP";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// radioButton2
|
||||
//
|
||||
this.radioButton2.AutoSize = true;
|
||||
this.radioButton2.Enabled = false;
|
||||
this.radioButton2.Location = new System.Drawing.Point(234, 19);
|
||||
this.radioButton2.Name = "radioButton2";
|
||||
this.radioButton2.Size = new System.Drawing.Size(92, 17);
|
||||
this.radioButton2.TabIndex = 1;
|
||||
this.radioButton2.TabStop = true;
|
||||
this.radioButton2.Text = "Use serial port";
|
||||
this.radioButton2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// optoDataGroupBox
|
||||
//
|
||||
this.optoDataGroupBox.Controls.Add(this.tcpipPortLabel);
|
||||
@ -184,125 +180,222 @@ namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
this.optoDataGroupBox.Controls.Add(this.radioButton2);
|
||||
this.optoDataGroupBox.Controls.Add(this.optoSerialPortLabel);
|
||||
this.optoDataGroupBox.Controls.Add(this.optoSerialPortTextBox);
|
||||
this.optoDataGroupBox.Location = new System.Drawing.Point(28, 114);
|
||||
this.optoDataGroupBox.Location = new System.Drawing.Point(10, 131);
|
||||
this.optoDataGroupBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.optoDataGroupBox.Name = "optoDataGroupBox";
|
||||
this.optoDataGroupBox.Size = new System.Drawing.Size(414, 97);
|
||||
this.optoDataGroupBox.TabIndex = 5;
|
||||
this.optoDataGroupBox.Padding = new System.Windows.Forms.Padding(4);
|
||||
this.optoDataGroupBox.Size = new System.Drawing.Size(552, 119);
|
||||
this.optoDataGroupBox.TabIndex = 18;
|
||||
this.optoDataGroupBox.TabStop = false;
|
||||
this.optoDataGroupBox.Text = "Opto-data";
|
||||
//
|
||||
// tcpipPortLabel
|
||||
//
|
||||
this.tcpipPortLabel.AutoSize = true;
|
||||
this.tcpipPortLabel.Location = new System.Drawing.Point(31, 71);
|
||||
this.tcpipPortLabel.Location = new System.Drawing.Point(41, 87);
|
||||
this.tcpipPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.tcpipPortLabel.Name = "tcpipPortLabel";
|
||||
this.tcpipPortLabel.Size = new System.Drawing.Size(47, 13);
|
||||
this.tcpipPortLabel.Size = new System.Drawing.Size(54, 16);
|
||||
this.tcpipPortLabel.TabIndex = 4;
|
||||
this.tcpipPortLabel.Text = "Port nr..:";
|
||||
//
|
||||
// tcpipPortTextBox
|
||||
//
|
||||
this.tcpipPortTextBox.Enabled = false;
|
||||
this.tcpipPortTextBox.Location = new System.Drawing.Point(107, 68);
|
||||
this.tcpipPortTextBox.Location = new System.Drawing.Point(143, 84);
|
||||
this.tcpipPortTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.tcpipPortTextBox.Name = "tcpipPortTextBox";
|
||||
this.tcpipPortTextBox.Size = new System.Drawing.Size(39, 20);
|
||||
this.tcpipPortTextBox.Size = new System.Drawing.Size(51, 22);
|
||||
this.tcpipPortTextBox.TabIndex = 5;
|
||||
//
|
||||
// ipAddressLabel
|
||||
//
|
||||
this.ipAddressLabel.AutoSize = true;
|
||||
this.ipAddressLabel.Location = new System.Drawing.Point(31, 48);
|
||||
this.ipAddressLabel.Location = new System.Drawing.Point(41, 59);
|
||||
this.ipAddressLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.ipAddressLabel.Name = "ipAddressLabel";
|
||||
this.ipAddressLabel.Size = new System.Drawing.Size(63, 13);
|
||||
this.ipAddressLabel.Size = new System.Drawing.Size(78, 16);
|
||||
this.ipAddressLabel.TabIndex = 2;
|
||||
this.ipAddressLabel.Text = "IP address.:";
|
||||
//
|
||||
// ipAddressTextBox
|
||||
//
|
||||
this.ipAddressTextBox.Enabled = false;
|
||||
this.ipAddressTextBox.Location = new System.Drawing.Point(107, 45);
|
||||
this.ipAddressTextBox.Location = new System.Drawing.Point(143, 55);
|
||||
this.ipAddressTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.ipAddressTextBox.Name = "ipAddressTextBox";
|
||||
this.ipAddressTextBox.Size = new System.Drawing.Size(98, 20);
|
||||
this.ipAddressTextBox.Size = new System.Drawing.Size(129, 22);
|
||||
this.ipAddressTextBox.TabIndex = 3;
|
||||
//
|
||||
// groupBox1
|
||||
// radioButton1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.rfidPortNrTextBox);
|
||||
this.groupBox1.Controls.Add(this.rfidSerialPortNrLabel);
|
||||
this.groupBox1.Location = new System.Drawing.Point(28, 218);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(414, 55);
|
||||
this.groupBox1.TabIndex = 12;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "RFID communication (in case mux. board is not used)";
|
||||
this.radioButton1.AutoSize = true;
|
||||
this.radioButton1.Checked = true;
|
||||
this.radioButton1.Enabled = false;
|
||||
this.radioButton1.Location = new System.Drawing.Point(29, 23);
|
||||
this.radioButton1.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.radioButton1.Name = "radioButton1";
|
||||
this.radioButton1.Size = new System.Drawing.Size(99, 20);
|
||||
this.radioButton1.TabIndex = 0;
|
||||
this.radioButton1.TabStop = true;
|
||||
this.radioButton1.Text = "Use TCP/IP";
|
||||
this.radioButton1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label3
|
||||
// radioButton2
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(176, 66);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(31, 13);
|
||||
this.label3.TabIndex = 13;
|
||||
this.label3.Text = "1 .. 4";
|
||||
this.radioButton2.AutoSize = true;
|
||||
this.radioButton2.Enabled = false;
|
||||
this.radioButton2.Location = new System.Drawing.Point(312, 23);
|
||||
this.radioButton2.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.radioButton2.Name = "radioButton2";
|
||||
this.radioButton2.Size = new System.Drawing.Size(115, 20);
|
||||
this.radioButton2.TabIndex = 1;
|
||||
this.radioButton2.Text = "Use serial port";
|
||||
this.radioButton2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label4
|
||||
// optoSerialPortLabel
|
||||
//
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(176, 89);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(37, 13);
|
||||
this.label4.TabIndex = 14;
|
||||
this.label4.Text = "1 .. 10";
|
||||
this.optoSerialPortLabel.AutoSize = true;
|
||||
this.optoSerialPortLabel.Location = new System.Drawing.Point(321, 55);
|
||||
this.optoSerialPortLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.optoSerialPortLabel.Name = "optoSerialPortLabel";
|
||||
this.optoSerialPortLabel.Size = new System.Drawing.Size(88, 16);
|
||||
this.optoSerialPortLabel.TabIndex = 6;
|
||||
this.optoSerialPortLabel.Text = "Serial port nr.:";
|
||||
//
|
||||
// WaterMeterCfgCtrl
|
||||
// optoSerialPortTextBox
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.optoSerialPortTextBox.Enabled = false;
|
||||
this.optoSerialPortTextBox.Location = new System.Drawing.Point(439, 52);
|
||||
this.optoSerialPortTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.optoSerialPortTextBox.Name = "optoSerialPortTextBox";
|
||||
this.optoSerialPortTextBox.Size = new System.Drawing.Size(44, 22);
|
||||
this.optoSerialPortTextBox.TabIndex = 7;
|
||||
//
|
||||
// groupTextBox
|
||||
//
|
||||
this.groupTextBox.Enabled = false;
|
||||
this.groupTextBox.Location = new System.Drawing.Point(153, 97);
|
||||
this.groupTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.groupTextBox.Name = "groupTextBox";
|
||||
this.groupTextBox.Size = new System.Drawing.Size(44, 22);
|
||||
this.groupTextBox.TabIndex = 22;
|
||||
//
|
||||
// groupLabel
|
||||
//
|
||||
this.groupLabel.AutoSize = true;
|
||||
this.groupLabel.Location = new System.Drawing.Point(6, 101);
|
||||
this.groupLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.groupLabel.Name = "groupLabel";
|
||||
this.groupLabel.Size = new System.Drawing.Size(54, 16);
|
||||
this.groupLabel.TabIndex = 21;
|
||||
this.groupLabel.Text = "Group 2";
|
||||
//
|
||||
// muxBoardNrTextBox
|
||||
//
|
||||
this.muxBoardNrTextBox.Enabled = false;
|
||||
this.muxBoardNrTextBox.Location = new System.Drawing.Point(153, 69);
|
||||
this.muxBoardNrTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.muxBoardNrTextBox.Name = "muxBoardNrTextBox";
|
||||
this.muxBoardNrTextBox.Size = new System.Drawing.Size(44, 22);
|
||||
this.muxBoardNrTextBox.TabIndex = 20;
|
||||
//
|
||||
// muxBoardNrLabel
|
||||
//
|
||||
this.muxBoardNrLabel.AutoSize = true;
|
||||
this.muxBoardNrLabel.Location = new System.Drawing.Point(6, 72);
|
||||
this.muxBoardNrLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.muxBoardNrLabel.Name = "muxBoardNrLabel";
|
||||
this.muxBoardNrLabel.Size = new System.Drawing.Size(131, 16);
|
||||
this.muxBoardNrLabel.TabIndex = 19;
|
||||
this.muxBoardNrLabel.Text = "Group 1 (mux. board)";
|
||||
//
|
||||
// nameTextBox
|
||||
//
|
||||
this.nameTextBox.Enabled = false;
|
||||
this.nameTextBox.Location = new System.Drawing.Point(153, 40);
|
||||
this.nameTextBox.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.nameTextBox.Name = "nameTextBox";
|
||||
this.nameTextBox.Size = new System.Drawing.Size(160, 22);
|
||||
this.nameTextBox.TabIndex = 17;
|
||||
//
|
||||
// nameLabel
|
||||
//
|
||||
this.nameLabel.AutoSize = true;
|
||||
this.nameLabel.Location = new System.Drawing.Point(6, 44);
|
||||
this.nameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.nameLabel.Name = "nameLabel";
|
||||
this.nameLabel.Size = new System.Drawing.Size(44, 16);
|
||||
this.nameLabel.TabIndex = 16;
|
||||
this.nameLabel.Text = "Name";
|
||||
//
|
||||
// classNameLabel
|
||||
//
|
||||
this.classNameLabel.AutoSize = true;
|
||||
this.classNameLabel.Location = new System.Drawing.Point(149, 11);
|
||||
this.classNameLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.classNameLabel.Name = "classNameLabel";
|
||||
this.classNameLabel.Size = new System.Drawing.Size(78, 16);
|
||||
this.classNameLabel.TabIndex = 15;
|
||||
this.classNameLabel.Text = "ClassName";
|
||||
//
|
||||
// tabPage2
|
||||
//
|
||||
this.tabPage2.Location = new System.Drawing.Point(4, 25);
|
||||
this.tabPage2.Name = "tabPage2";
|
||||
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.tabPage2.Size = new System.Drawing.Size(603, 403);
|
||||
this.tabPage2.TabIndex = 1;
|
||||
this.tabPage2.Text = "Test";
|
||||
this.tabPage2.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// IperlHeadCfgCtrl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.label4);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.groupBox1);
|
||||
this.Controls.Add(this.optoDataGroupBox);
|
||||
this.Controls.Add(this.groupTextBox);
|
||||
this.Controls.Add(this.groupLabel);
|
||||
this.Controls.Add(this.muxBoardNrTextBox);
|
||||
this.Controls.Add(this.muxBoardNrLabel);
|
||||
this.Controls.Add(this.nameTextBox);
|
||||
this.Controls.Add(this.nameLabel);
|
||||
this.Controls.Add(this.classNameLabel);
|
||||
this.Name = "WaterMeterCfgCtrl";
|
||||
this.Size = new System.Drawing.Size(500, 300);
|
||||
this.Controls.Add(this.tabControl1);
|
||||
this.Margin = new System.Windows.Forms.Padding(4);
|
||||
this.Name = "IperlHeadCfgCtrl";
|
||||
this.Size = new System.Drawing.Size(617, 438);
|
||||
this.Load += new System.EventHandler(this.WaterMeterCfgCtrl_Load);
|
||||
this.optoDataGroupBox.ResumeLayout(false);
|
||||
this.optoDataGroupBox.PerformLayout();
|
||||
this.tabControl1.ResumeLayout(false);
|
||||
this.tabPage1.ResumeLayout(false);
|
||||
this.tabPage1.PerformLayout();
|
||||
this.groupBox1.ResumeLayout(false);
|
||||
this.groupBox1.PerformLayout();
|
||||
this.optoDataGroupBox.ResumeLayout(false);
|
||||
this.optoDataGroupBox.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TextBox nameTextBox;
|
||||
private System.Windows.Forms.Label nameLabel;
|
||||
private System.Windows.Forms.Label classNameLabel;
|
||||
private System.Windows.Forms.TextBox optoSerialPortTextBox;
|
||||
private System.Windows.Forms.Label optoSerialPortLabel;
|
||||
private System.Windows.Forms.TextBox muxBoardNrTextBox;
|
||||
private System.Windows.Forms.Label muxBoardNrLabel;
|
||||
private System.Windows.Forms.TextBox groupTextBox;
|
||||
private System.Windows.Forms.Label groupLabel;
|
||||
private System.Windows.Forms.TabControl tabControl1;
|
||||
private System.Windows.Forms.TabPage tabPage1;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.ComboBox comboBoxCommunicationInterface;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.TextBox rfidPortNrTextBox;
|
||||
private System.Windows.Forms.Label rfidSerialPortNrLabel;
|
||||
private System.Windows.Forms.RadioButton radioButton1;
|
||||
private System.Windows.Forms.RadioButton radioButton2;
|
||||
private System.Windows.Forms.GroupBox optoDataGroupBox;
|
||||
private System.Windows.Forms.Label tcpipPortLabel;
|
||||
private System.Windows.Forms.TextBox tcpipPortTextBox;
|
||||
private System.Windows.Forms.Label ipAddressLabel;
|
||||
private System.Windows.Forms.TextBox ipAddressTextBox;
|
||||
private System.Windows.Forms.GroupBox groupBox1;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.Label label4;
|
||||
}
|
||||
private System.Windows.Forms.RadioButton radioButton1;
|
||||
private System.Windows.Forms.RadioButton radioButton2;
|
||||
private System.Windows.Forms.Label optoSerialPortLabel;
|
||||
private System.Windows.Forms.TextBox optoSerialPortTextBox;
|
||||
private System.Windows.Forms.TextBox groupTextBox;
|
||||
private System.Windows.Forms.Label groupLabel;
|
||||
private System.Windows.Forms.TextBox muxBoardNrTextBox;
|
||||
private System.Windows.Forms.Label muxBoardNrLabel;
|
||||
private System.Windows.Forms.TextBox nameTextBox;
|
||||
private System.Windows.Forms.Label nameLabel;
|
||||
private System.Windows.Forms.Label classNameLabel;
|
||||
private System.Windows.Forms.TabPage tabPage2;
|
||||
}
|
||||
}
|
||||
|
||||
137
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs
generated
Normal file
137
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/IperlHeadTestCtrl.Designer.cs
generated
Normal file
@ -0,0 +1,137 @@
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
partial class IperlHeadTestCtrl
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Component Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.optoTestGroupBox = new System.Windows.Forms.GroupBox();
|
||||
this.optoListBox = new System.Windows.Forms.ListBox();
|
||||
this.rfidOutputListBox = new System.Windows.Forms.ListBox();
|
||||
this.RfidTestGroupBox = new System.Windows.Forms.GroupBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.rfidCommandComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.commandTestButton = new System.Windows.Forms.Button();
|
||||
this.optoTestGroupBox.SuspendLayout();
|
||||
this.RfidTestGroupBox.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// optoTestGroupBox
|
||||
//
|
||||
this.optoTestGroupBox.Controls.Add(this.optoListBox);
|
||||
this.optoTestGroupBox.Location = new System.Drawing.Point(5, 4);
|
||||
this.optoTestGroupBox.Name = "optoTestGroupBox";
|
||||
this.optoTestGroupBox.Size = new System.Drawing.Size(591, 161);
|
||||
this.optoTestGroupBox.TabIndex = 2;
|
||||
this.optoTestGroupBox.TabStop = false;
|
||||
this.optoTestGroupBox.Text = "Opto-data";
|
||||
//
|
||||
// optoListBox
|
||||
//
|
||||
this.optoListBox.FormattingEnabled = true;
|
||||
this.optoListBox.ItemHeight = 16;
|
||||
this.optoListBox.Location = new System.Drawing.Point(7, 22);
|
||||
this.optoListBox.Name = "optoListBox";
|
||||
this.optoListBox.Size = new System.Drawing.Size(573, 132);
|
||||
this.optoListBox.TabIndex = 0;
|
||||
//
|
||||
// rfidOutputListBox
|
||||
//
|
||||
this.rfidOutputListBox.FormattingEnabled = true;
|
||||
this.rfidOutputListBox.ItemHeight = 16;
|
||||
this.rfidOutputListBox.Location = new System.Drawing.Point(5, 54);
|
||||
this.rfidOutputListBox.Name = "rfidOutputListBox";
|
||||
this.rfidOutputListBox.SelectionMode = System.Windows.Forms.SelectionMode.None;
|
||||
this.rfidOutputListBox.Size = new System.Drawing.Size(575, 164);
|
||||
this.rfidOutputListBox.TabIndex = 3;
|
||||
//
|
||||
// RfidTestGroupBox
|
||||
//
|
||||
this.RfidTestGroupBox.Controls.Add(this.rfidOutputListBox);
|
||||
this.RfidTestGroupBox.Controls.Add(this.label2);
|
||||
this.RfidTestGroupBox.Controls.Add(this.rfidCommandComboBox);
|
||||
this.RfidTestGroupBox.Controls.Add(this.commandTestButton);
|
||||
this.RfidTestGroupBox.Location = new System.Drawing.Point(5, 171);
|
||||
this.RfidTestGroupBox.Name = "RfidTestGroupBox";
|
||||
this.RfidTestGroupBox.Size = new System.Drawing.Size(591, 224);
|
||||
this.RfidTestGroupBox.TabIndex = 3;
|
||||
this.RfidTestGroupBox.TabStop = false;
|
||||
this.RfidTestGroupBox.Text = "RFID / NFC data";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(2, 25);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(69, 16);
|
||||
this.label2.TabIndex = 2;
|
||||
this.label2.Text = "Command";
|
||||
//
|
||||
// rfidCommandComboBox
|
||||
//
|
||||
this.rfidCommandComboBox.FormattingEnabled = true;
|
||||
this.rfidCommandComboBox.Location = new System.Drawing.Point(86, 19);
|
||||
this.rfidCommandComboBox.Name = "rfidCommandComboBox";
|
||||
this.rfidCommandComboBox.Size = new System.Drawing.Size(341, 24);
|
||||
this.rfidCommandComboBox.TabIndex = 1;
|
||||
//
|
||||
// commandTestButton
|
||||
//
|
||||
this.commandTestButton.Location = new System.Drawing.Point(449, 19);
|
||||
this.commandTestButton.Name = "commandTestButton";
|
||||
this.commandTestButton.Size = new System.Drawing.Size(126, 24);
|
||||
this.commandTestButton.TabIndex = 0;
|
||||
this.commandTestButton.Text = "Send command";
|
||||
this.commandTestButton.UseVisualStyleBackColor = true;
|
||||
this.commandTestButton.MouseClick += new System.Windows.Forms.MouseEventHandler(this.CommandTestButtonClick);
|
||||
//
|
||||
// IperlHeadTestCtrl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.optoTestGroupBox);
|
||||
this.Controls.Add(this.RfidTestGroupBox);
|
||||
this.Name = "IperlHeadTestCtrl";
|
||||
this.Size = new System.Drawing.Size(611, 432);
|
||||
this.Load += new System.EventHandler(this.UserControl_Load);
|
||||
this.optoTestGroupBox.ResumeLayout(false);
|
||||
this.RfidTestGroupBox.ResumeLayout(false);
|
||||
this.RfidTestGroupBox.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.GroupBox optoTestGroupBox;
|
||||
private System.Windows.Forms.ListBox rfidOutputListBox;
|
||||
private System.Windows.Forms.GroupBox RfidTestGroupBox;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.ComboBox rfidCommandComboBox;
|
||||
private System.Windows.Forms.Button commandTestButton;
|
||||
private System.Windows.Forms.ListBox optoListBox;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,155 @@
|
||||
using Common;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Windows.Forms;
|
||||
using TBF.Rig.DataEntry.S620.CheckItems;
|
||||
using TBF.Rig.Generic;
|
||||
using TBF.Rig.Sequences;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
public partial class IperlHeadTestCtrl : UserControl
|
||||
{
|
||||
IperlHeadCfg config;
|
||||
IperlHead iPerlHead;
|
||||
Thread optoThread;
|
||||
|
||||
private bool stopWorkerThread;
|
||||
public event EventHandler<OptoReceivedEventArgs> OptoReceivedHandler;
|
||||
|
||||
public IperlHeadTestCtrl(IperlHeadCfg config)
|
||||
{
|
||||
this.config = config;
|
||||
InitializeComponent();
|
||||
if (config == null) return;
|
||||
|
||||
iPerlCommunicationForm.cfg = new TestMethodCfg(null); // default values for iPerlCommunication
|
||||
|
||||
foreach(var head in ProcessData.IperlHeads)
|
||||
{
|
||||
if (head != null && head.Name == config.Name) { iPerlHead = head; }
|
||||
}
|
||||
|
||||
rfidCommandComboBox.DisplayMember = "Name";
|
||||
rfidCommandComboBox.ValueMember = "Value";
|
||||
var items = new[]
|
||||
{
|
||||
new {Name = "Read PCB", Value = "ReadPCB" },
|
||||
new {Name = "Set Test Mode", Value = "SetTestMode" },
|
||||
new {Name = "Set Active Mode", Value = "SetActiveMode" }
|
||||
};
|
||||
/*
|
||||
// CTRL+ALT+double click - hidden poweruser menu
|
||||
if (((Keyboard.ModifierKeys & Keys.Control) == Keys.Control) && ((Keyboard.ModifierKeys & Keys.Alt) == Keys.Alt) && Users.CurrentUser.AuthorizedAs == AuthorizedAs.PowerUser)
|
||||
{
|
||||
Array.Resize(ref items, items.Length + 1);
|
||||
items[items.Length - 1] = new { Name = "Kluc", Value = "Kluc" };
|
||||
}
|
||||
*/
|
||||
rfidCommandComboBox.DataSource = items;
|
||||
|
||||
stopWorkerThread = false;
|
||||
|
||||
OptoReceivedHandler += (EventHandler<OptoReceivedEventArgs>)((sndr, args) =>
|
||||
{
|
||||
if (this.InvokeRequired)
|
||||
this.Invoke((Delegate)new EventHandler<OptoReceivedEventArgs>(this.OnOptoReceived2), sndr, (object)args);
|
||||
else
|
||||
this.OnOptoReceived2(sndr, args);
|
||||
});
|
||||
}
|
||||
|
||||
public void OnOptoReceived2(object sender, OptoReceivedEventArgs args)
|
||||
{
|
||||
optoListBox.Items.Insert(0,args.Data);
|
||||
}
|
||||
|
||||
private void CommandTestButtonClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
rfidOutputListBox.Items.Clear();
|
||||
|
||||
using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug))
|
||||
{
|
||||
ListItem rfidListItem = new ListItem();
|
||||
rfidListItem.Attributes.Add("style", "font-weight:bold");
|
||||
switch (rfidCommandComboBox.SelectedValue)
|
||||
{
|
||||
case "ReadPCB":
|
||||
rfidListItem.Text = $"PCB: {OpticalHeadTest.ReadRequest_PCB(iPerlHead)}";
|
||||
break;
|
||||
case "SetTestMode":
|
||||
rfidListItem.Text = OpticalHeadTest.SetTestMode(iPerlHead);
|
||||
optoListBox.Items.Clear();
|
||||
stopWorkerThread = false;
|
||||
optoThread = new Thread(OptoWorker);
|
||||
if (!optoThread.IsAlive)
|
||||
{
|
||||
optoThread.Start();
|
||||
}
|
||||
break;
|
||||
case "SetActiveMode":
|
||||
rfidListItem.Text = OpticalHeadTest.SetActiveMode(iPerlHead);
|
||||
stopWorkerThread = true;
|
||||
break;
|
||||
}
|
||||
rfidOutputListBox.Items.Add(rfidListItem);
|
||||
rfidOutputListBox.Items.AddRange(logChecker.Messages.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
private void OptoWorker()
|
||||
{
|
||||
while (!this.stopWorkerThread)
|
||||
{
|
||||
Thread.Sleep(250);
|
||||
if (this.stopWorkerThread)
|
||||
break;
|
||||
|
||||
string buffer = iPerlHead.ReadOptoData();
|
||||
if (string.IsNullOrEmpty(buffer))
|
||||
{
|
||||
this.OnOptoReceived((object)this, new OptoReceivedEventArgs("."));
|
||||
}
|
||||
else
|
||||
OnOptoReceived((object)this, new OptoReceivedEventArgs(buffer));
|
||||
}
|
||||
}
|
||||
|
||||
public void OnOptoReceived(object sender, OptoReceivedEventArgs args)
|
||||
{
|
||||
if (this.OptoReceivedHandler == null)
|
||||
return;
|
||||
try
|
||||
{
|
||||
this.OptoReceivedHandler(sender, args);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
private void UserControl_Load(object sender, EventArgs e)
|
||||
{
|
||||
this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing);
|
||||
}
|
||||
|
||||
void ParentForm_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
//OnHandleDestroyed(new EventArgs());
|
||||
stopWorkerThread = true;
|
||||
if (optoThread != null)
|
||||
{
|
||||
optoThread.Abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
293
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs
Normal file
293
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/NfcServices.cs
Normal file
@ -0,0 +1,293 @@
|
||||
using log4net;
|
||||
using Sensus.iPerl.NfcHandler;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using static Sensus.iPerl.NfcHandler.MCI_Protocol;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
internal class NfcServices
|
||||
{
|
||||
protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
|
||||
internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, out byte[] buffer)
|
||||
{
|
||||
NfcDataHandler _nfcDataHandler = new NfcDataHandler();
|
||||
MessageEventHandlers(_nfcDataHandler);
|
||||
CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader);
|
||||
ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device);
|
||||
MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol);
|
||||
NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config);
|
||||
try
|
||||
{
|
||||
rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length}");
|
||||
OpenConnection(_nfcDataHandler, cfg, iperlHead);
|
||||
|
||||
buffer = MciRead(_nfcDataHandler, cfg, structName, (ushort)offset, length);
|
||||
|
||||
CloseComPort(_nfcDataHandler);
|
||||
|
||||
rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} ReadRequest : {structName}, {offset}, {length} ; Response= {ByteArrayToHexString(buffer)} ; Error: {_nfcDataHandler.LastErrorMessage}");
|
||||
|
||||
return Convert.ToInt32(_nfcDataHandler.LastErrorCode); //return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} ReadRequest Error: {ex.Message}");
|
||||
buffer = new byte[length];
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MCI_Protocol.StructName structName, int offset, int length, byte[] buffer)
|
||||
{
|
||||
NfcDataHandler _nfcDataHandler = new NfcDataHandler();
|
||||
MessageEventHandlers(_nfcDataHandler);
|
||||
CR95HF_MessageEventHandlers(_nfcDataHandler._CR95HF_Reader);
|
||||
ST25DV_MessageEventHandlers(_nfcDataHandler._ST25DV_Device);
|
||||
MCI_MessageEventHandlers(_nfcDataHandler._MCI_Protocol);
|
||||
NFCHeadConfig_MessageEventHandlers(_nfcDataHandler._NFCHead_Config);
|
||||
try
|
||||
{
|
||||
rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} WriteRequest : {structName}, {offset}, {length}, {ByteArrayToHexString(buffer)}");
|
||||
OpenConnection(_nfcDataHandler, cfg, iperlHead);
|
||||
|
||||
MciWrite(_nfcDataHandler, cfg, structName, (ushort)offset, length, buffer);
|
||||
|
||||
CloseComPort(_nfcDataHandler);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} WriteRequest Error: {ex.Message}");
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OpenConnection(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, IperlHead iperlHead)
|
||||
{
|
||||
string comPort = $"COM{iperlHead.RfidComPortNr}";
|
||||
int retryCount = 0 ;
|
||||
Open:
|
||||
nfcDataHandler.Close();
|
||||
Thread.Sleep(100);
|
||||
if (nfcDataHandler.OpenConnection(comPort, cfg.BaudRate, cfg.DataBits, cfg.ParityBit, cfg.StopBits))
|
||||
{
|
||||
rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Port Open");
|
||||
|
||||
if (nfcDataHandler.ConnectReader())
|
||||
{
|
||||
rfidDataLogger.Info($"NFC COM{iperlHead.RfidComPortNr} Reader connected");
|
||||
if (!nfcDataHandler.ConnectDevice())
|
||||
{
|
||||
rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect device.");
|
||||
for (int i = 0; i < cfg.MaxCommRetries; i++)
|
||||
{
|
||||
if (nfcDataHandler.Echo()) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
retryCount++;
|
||||
rfidDataLogger.Error($"NFC COM{iperlHead.RfidComPortNr} Error connect reader. Reconnect comport {retryCount}");
|
||||
if (retryCount < cfg.MaxCommRetries)
|
||||
goto Open;
|
||||
}
|
||||
}
|
||||
else
|
||||
rfidDataLogger.Error($"Open NFC COM{iperlHead.RfidComPortNr} Port Failed");
|
||||
}
|
||||
|
||||
private static void CloseComPort(NfcDataHandler nfcDataHandler)
|
||||
{
|
||||
nfcDataHandler.Close();
|
||||
}
|
||||
|
||||
private static byte[] MciRead(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, StructName structName, ushort offset, int length)
|
||||
{
|
||||
bool isReadValues = false;
|
||||
int retryCount = 0;
|
||||
Read:
|
||||
try
|
||||
{
|
||||
isReadValues = false;
|
||||
long num1 = (long)length;
|
||||
int timeoutMs = 4000;
|
||||
byte payloadlength = Convert.ToByte(num1.ToString("X2"), 16);
|
||||
if (nfcDataHandler.MCI_Read(structName, offset, payloadlength, timeoutMs))
|
||||
{
|
||||
byte[] lastData = nfcDataHandler.LastData;
|
||||
if ((long)lastData.Length >= num1)
|
||||
{
|
||||
rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}");
|
||||
return lastData;
|
||||
}
|
||||
else
|
||||
rfidDataLogger.Info($"COM: MciRead ({structName},{offset},{length}) = {ByteArrayToHexString(lastData)}");
|
||||
}
|
||||
else if (nfcDataHandler.LastErrorCode == (byte)0)
|
||||
{
|
||||
rfidDataLogger.Info($"MCI Error: Unidentified");
|
||||
retryCount++;
|
||||
if (retryCount < cfg.MaxCommRetries)
|
||||
goto Read;
|
||||
}
|
||||
else
|
||||
{
|
||||
rfidDataLogger.Info("Last error message: " + nfcDataHandler.LastErrorMessage);
|
||||
retryCount++;
|
||||
if (retryCount < cfg.MaxCommRetries)
|
||||
goto Read;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error("MciRead Last error message: " + ex.Message);
|
||||
retryCount++;
|
||||
if (retryCount < cfg.MaxCommRetries)
|
||||
goto Read;
|
||||
}
|
||||
return new byte[length];
|
||||
}
|
||||
|
||||
private static void MciWrite(NfcDataHandler nfcDataHandler, TestMethodCfg cfg, MCI_Protocol.StructName structName, ushort offset, int length, byte[] payload)
|
||||
{
|
||||
int retryCount = 0;
|
||||
Write:
|
||||
try
|
||||
{
|
||||
long num1 = (long)length;
|
||||
int timeoutMs = 4000;
|
||||
byte payloadlength = Convert.ToByte(num1);
|
||||
if ((int)payloadlength != payload.Length)
|
||||
rfidDataLogger.Error("Insufficient Payload -- Payload lenth : " + (object)payload.Length);
|
||||
else if (nfcDataHandler.MCI_Write(structName, offset, payloadlength, payload, timeoutMs))
|
||||
{
|
||||
// OK
|
||||
}
|
||||
else if (nfcDataHandler.LastErrorCode > (byte)0)
|
||||
{
|
||||
rfidDataLogger.Error("Last error message: " + nfcDataHandler.LastErrorMessage);
|
||||
//int num2 = (int)MessageBox.Show(this._nfcDataHandler.LastErrorMessage);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error("MciWrite error message: " + ex.Message);
|
||||
retryCount++;
|
||||
if (retryCount < cfg.MaxCommRetries)
|
||||
goto Write;
|
||||
}
|
||||
}
|
||||
|
||||
private static void MciWriteCommand(NfcDataHandler nfcDataHandler, byte commandcode)
|
||||
{
|
||||
try
|
||||
{
|
||||
ushort offset = 0;
|
||||
int timeoutMs = 4000;
|
||||
byte payloadlength = 1;
|
||||
byte[] payload = new byte[1] { commandcode };
|
||||
if (nfcDataHandler.MCI_Write(MCI_Protocol.StructName.Command, offset, payloadlength, payload, timeoutMs) || nfcDataHandler.LastErrorCode <= (byte)0)
|
||||
return;
|
||||
rfidDataLogger.Error("MciWriteCommand Last error message: " + nfcDataHandler.LastErrorMessage);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error("MciWriteCommand Last error message: " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public static string ByteArrayToHexString(byte[] data)
|
||||
{
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
foreach (byte num in data)
|
||||
stringBuilder.Append(num.ToString("X2"));
|
||||
return stringBuilder.ToString();
|
||||
}
|
||||
|
||||
private static byte[] BuildPayLoad(string strPayLoad, int length)
|
||||
{
|
||||
byte[] collection;
|
||||
|
||||
if (strPayLoad.Split(':').Length > 1)
|
||||
{
|
||||
uint timestamp = ConvertDateTimeToTimestamp(Convert.ToDateTime(DateTime.ParseExact(strPayLoad, "HH:mm:ss dd/MM/yyyy", (IFormatProvider)CultureInfo.InvariantCulture)));
|
||||
byte[] bytes = BitConverter.GetBytes(timestamp);
|
||||
return bytes;
|
||||
}
|
||||
else if (strPayLoad.Split(',').Length > 1)
|
||||
{
|
||||
string[] strArray = strPayLoad.Split(',');
|
||||
collection = new byte[strArray.Length];
|
||||
for (int index3 = 0; index3 < strArray.Length; ++index3)
|
||||
collection[index3] = Convert.ToByte(strArray[index3], 16);
|
||||
return collection;
|
||||
}
|
||||
else
|
||||
{
|
||||
//int num = strPayLoad.Split(',').Length;
|
||||
collection = HexStringToByteArray(strPayLoad.Substring(strPayLoad.Length - length * 2).ToUpper());
|
||||
Array.Reverse((Array)collection);
|
||||
return collection;
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] HexStringToByteArray(string hexString)
|
||||
{
|
||||
int length = hexString.Length;
|
||||
byte[] byteArray = new byte[length / 2];
|
||||
for (int startIndex = 0; startIndex < length; startIndex += 2)
|
||||
byteArray[startIndex / 2] = Convert.ToByte(hexString.Substring(startIndex, 2), 16);
|
||||
return byteArray;
|
||||
}
|
||||
|
||||
private static uint ConvertDateTimeToTimestamp(DateTime datetime)
|
||||
{
|
||||
TimeSpan utcOffset = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now);
|
||||
return (uint)((datetime - new DateTime(2000, 1, 1, 0, 0, 0).ToLocalTime()).TotalSeconds + utcOffset.TotalSeconds);
|
||||
}
|
||||
|
||||
#region EventHandlers
|
||||
public static void MCI_MessageEventHandlers(MCI_Protocol e)
|
||||
{
|
||||
DelNfc_MCI_MessageHandler mciMessageHandler = new DelNfc_MCI_MessageHandler(OnHandler);
|
||||
e.MessageEvent += mciMessageHandler;
|
||||
}
|
||||
|
||||
public static void ST25DV_MessageEventHandlers(ST25DV_Device e)
|
||||
{
|
||||
DelNfc_ST25DV_MessageHandler dvMessageHandler = new DelNfc_ST25DV_MessageHandler(OnHandler);
|
||||
e.MessageEvent += dvMessageHandler;
|
||||
}
|
||||
|
||||
public static void CR95HF_MessageEventHandlers(CR95HF_Reader e)
|
||||
{
|
||||
DelNfc_CR95HF_MessageHandler hfMessageHandler = new DelNfc_CR95HF_MessageHandler(OnHandler);
|
||||
e.MessageEvent += hfMessageHandler;
|
||||
}
|
||||
|
||||
public static void NFCHeadConfig_MessageEventHandlers(NFCHeadConfig e)
|
||||
{
|
||||
DelNfc_NFCHeadConfig_MessageHandler configMessageHandler = new DelNfc_NFCHeadConfig_MessageHandler(OnHandler);
|
||||
e.MessageEvent += configMessageHandler;
|
||||
}
|
||||
|
||||
public static void MessageEventHandlers(NfcDataHandler e)
|
||||
{
|
||||
DelNfcMessageHandler nfcMessageHandler = new DelNfcMessageHandler(OnHandler);
|
||||
e.MessageEvent += nfcMessageHandler;
|
||||
}
|
||||
|
||||
public static void OnHandler(object sender, NfcMessageEventArgs e)
|
||||
{
|
||||
if (e.Message == null)
|
||||
return;
|
||||
string message = e.Message.Replace("\n", " ").Replace("\r", "");
|
||||
rfidDataLogger.Debug(message);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
123
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs
Normal file
123
TBF/Rig/TestMethods/iPerlCommunication/iPerlHead/RfidServices.cs
Normal file
@ -0,0 +1,123 @@
|
||||
using Sensus.iPerl.RfidCom.Exceptions;
|
||||
using Sensus.iPerl.RfidCom.Helper;
|
||||
using Sensus.iPerl.RfidCom;
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
internal class RfidServices
|
||||
{
|
||||
protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
|
||||
private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm));
|
||||
|
||||
internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer)
|
||||
{
|
||||
for (int i = 0; i < cfg.MaxCommRetries; i++)
|
||||
{
|
||||
rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} reading: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},{offset}, {length}... timeout {cfg.CommTimeout})");
|
||||
using (RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}"))
|
||||
{
|
||||
try
|
||||
{
|
||||
byte[] response = writer.ReadRequest((byte)messageID, offset, length, cfg.CommTimeout);
|
||||
string hexString = RfidHelper.ConvertByteArrayToHexString(response);
|
||||
string swapHexString = RfidHelper.SwapHexcode(hexString);
|
||||
string decString = RfidHelper.HexLiteral2Unsigned(RfidHelper.SwapHexcode(hexString)).ToString();
|
||||
|
||||
if (length > 10)
|
||||
{
|
||||
//if the result only contains "00"s we are working on the wrong COM port
|
||||
// or the module just isn't connected
|
||||
if (Regex.IsMatch(hexString, @"^(00)\1+$"))
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No RFID signal.");
|
||||
throw new RfidValidationException("Error_Rfid_NoSignal");
|
||||
}
|
||||
|
||||
//if the result only contains "03"s the meter did not answer.
|
||||
// Might be due to the module being positioned incorrectly.
|
||||
if (Regex.IsMatch(hexString, @"^(03)\1+$"))
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) <- Error: No meter signal.");
|
||||
throw new RfidValidationException("Error_Rfid_NoAnswerFromMeter");
|
||||
}
|
||||
}
|
||||
|
||||
writer.ClosePort();
|
||||
buffer = response;
|
||||
rfidDataLogger.Info($"{iperlHead.Name} ({iperlHead.SerialNr}): ReadRequestPort(COM{iperlHead.RfidComPortNr},...) returned HEX: {hexString}; SwapHexCodeToDecimal: {decString}");
|
||||
return 0;
|
||||
}
|
||||
catch (RfidDataNotAvailableException)
|
||||
{
|
||||
if (/*RfidHelper.IsPassThrough(messageID)*/ messageID == MessageID.ASICRegisterReadTest || messageID == MessageID.RadioPassthrough)
|
||||
{
|
||||
rfidDataLogger.Info($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {(i > 0 ? "<- Error: Invalid Pass-Through data." : "<- Info: Wait for Pass-Through data.")}");
|
||||
Thread.Sleep(cfg.PassThroughWaitTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
}
|
||||
catch (RfidValidationException)
|
||||
{
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...) {ex.Message}");
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
}
|
||||
}
|
||||
}
|
||||
rfidDataLogger.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
|
||||
log.Error($"{iperlHead.CommInterface} reading failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: ReadRequestPort ({messageID},...)");
|
||||
buffer = new byte[length];
|
||||
return 3;
|
||||
}
|
||||
|
||||
internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer)
|
||||
{
|
||||
RfidLogic writer = new RfidLogic($"COM{iperlHead.RfidComPortNr}");
|
||||
string payload = RfidHelper.ConvertByteArrayToHexString(buffer);
|
||||
|
||||
for (var i = 0; i < cfg.MaxCommRetries; i++)
|
||||
{
|
||||
rfidDataLogger.Error($"{iperlHead.CommInterface} Start {i} writting: COM{iperlHead.RfidComPortNr}: WriteRequest ({messageID},{offset}, {length}, {payload}... timeout {cfg.CommTimeout})");
|
||||
try
|
||||
{
|
||||
if (writer.ClosePort()) writer.OpenPort();
|
||||
writer.WriteRequest((byte)messageID, offset, length, buffer, cfg.CommTimeout, false);
|
||||
writer.ClosePort();
|
||||
rfidDataLogger.InfoFormat($"{iperlHead.Name}({iperlHead.SerialNr},COM{iperlHead.RfidComPortNr}): WriteRequestPort({messageID}, {offset}, {length}, {payload})");
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (messageID == MessageID.RadioPassthrough || messageID == MessageID.ASICRegisterReadTest)
|
||||
{
|
||||
Thread.Sleep(1500);
|
||||
}
|
||||
else
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Error: {ex.Message}");
|
||||
Thread.Sleep(cfg.WaitTimeAfterFailure);
|
||||
if (i > 1)
|
||||
{
|
||||
rfidDataLogger.Error($"COM{iperlHead.RfidComPortNr}: Reopen the com port.");
|
||||
writer.ClosePort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
writer.ClosePort();
|
||||
rfidDataLogger.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
|
||||
log.Error($"RFID writing failed after {cfg.MaxCommRetries} retries: COM{iperlHead.RfidComPortNr}: WriteRequestPort ({messageID},...) {System.Text.Encoding.UTF8.GetString(buffer)}");
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace TBF.Rig.TestMethods.iPerlCommunication.iPerlHead
|
||||
{
|
||||
internal class SimulationServices
|
||||
{
|
||||
const int Q2CorrFactorsAddr = 0x1878;
|
||||
|
||||
internal static int ReadRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, out byte[] buffer)
|
||||
{
|
||||
byte[] configurationBuffer = new byte[ConfigStruct.Length] { 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
byte[] calibrationBuffer = new byte[CalibrationStructV4.Length] { 3, 0, 150, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0, 150, 10 };
|
||||
buffer = new byte[length];
|
||||
|
||||
if (messageID == MessageID.Configuration)
|
||||
{
|
||||
Array.Copy(GetPCB(iperlHead), 0, configurationBuffer, 16, 5); // set PCB Number according to iPerlHead configuration
|
||||
Array.Copy(configurationBuffer,offset,buffer,0,length);
|
||||
}
|
||||
else if (messageID == MessageID.Calibration)
|
||||
{
|
||||
Array.Copy(calibrationBuffer, offset, buffer, 0, length);
|
||||
}
|
||||
else if ((messageID == MessageID.MetrologyMemory) && (offset == Q2CorrFactorsAddr) && (length == 2))
|
||||
{
|
||||
buffer = new byte[2] { 0, 0 };
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = new byte[length];
|
||||
}
|
||||
|
||||
return iperlHead.Name.Equals("iPerl13") ? 2 : 0; /// Simulates an error on position 13
|
||||
}
|
||||
|
||||
internal static int WriteRequest(TestMethodCfg cfg, IperlHead iperlHead, MessageID messageID, int offset, int length, byte[] buffer)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static Array GetPCB(IperlHead iperlHead)
|
||||
{
|
||||
string pcbStr = iperlHead.RfidComPortNr.ToString().PadRight(10,'0') + iperlHead.Position.ToString("D2");
|
||||
long decVal = Convert.ToInt64(pcbStr);
|
||||
string nHexStr = decVal.ToString("X4");
|
||||
|
||||
string hexStr = "";
|
||||
for (int a = nHexStr.Length; a >= 1; a = a - 2)
|
||||
{
|
||||
hexStr = hexStr + nHexStr.Substring(a - 2, 2);
|
||||
}
|
||||
|
||||
return Enumerable.Range(0, hexStr.Length)
|
||||
.Where(x => x % 2 == 0)
|
||||
.Select(x => Convert.ToByte(hexStr.Substring(x, 2), 16))
|
||||
.ToArray();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1635,8 +1635,17 @@
|
||||
<DependentUpon>IperlHeadCfgCtrl.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\FlowDirectionDetection.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\IperlHeadTestCtrl.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\IperlHeadTestCtrl.Designer.cs">
|
||||
<DependentUpon>IperlHeadTestCtrl.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\NfcServices.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\OptoReceivedEventArgs.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\ProcParams.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\RfidServices.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\SimulationServices.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\iPerlHead\StatusStruct.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\OpticalHeadTest.cs" />
|
||||
<Compile Include="Rig\TestMethods\iPerlCommunication\SequenceConditionOp.cs" />
|
||||
@ -2184,6 +2193,7 @@
|
||||
<Compile Include="Strings.Designer.cs" />
|
||||
<Compile Include="Tools\ByteFormatter.cs" />
|
||||
<Compile Include="Tools\IniUtil.cs" />
|
||||
<Compile Include="Tools\LogChecker.cs" />
|
||||
<Compile Include="Tools\XmlTools.cs" />
|
||||
<Compile Include="UiBridge\ActivityEventArgs.cs" />
|
||||
<Compile Include="UiBridge\AdjustmentInProgressEventArgs.cs" />
|
||||
@ -3305,6 +3315,9 @@
|
||||
<EmbeddedResource Include="Rig\TestMethods\iPerlCommunication\iPerlHead\IperlHeadCfgCtrl.resx">
|
||||
<DependentUpon>IperlHeadCfgCtrl.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Rig\TestMethods\iPerlCommunication\iPerlHead\IperlHeadTestCtrl.resx">
|
||||
<DependentUpon>IperlHeadTestCtrl.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Rig\TestMethods\LiveStream\CfgCtrl.resx">
|
||||
<DependentUpon>CfgCtrl.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@ -3825,6 +3838,10 @@
|
||||
<Project>{a3e14180-7f00-42e5-94a9-8db62ead6ee8}</Project>
|
||||
<Name>Sensus.iPerl.RfidCom</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\NfcS5_DLL\NfcS5_DLL.csproj">
|
||||
<Project>{34F6AA20-3BEC-44B4-9D18-DC66BAB79A83}</Project>
|
||||
<Name>NfcS5_DLL</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Common\Common.csproj">
|
||||
<Project>{c8939821-ba5c-4988-a3d0-bf53b74865c7}</Project>
|
||||
<Name>Common</Name>
|
||||
|
||||
50
TBF/Tools/LogChecker.cs
Normal file
50
TBF/Tools/LogChecker.cs
Normal file
@ -0,0 +1,50 @@
|
||||
using log4net.Appender;
|
||||
using log4net.Core;
|
||||
using log4net.Repository.Hierarchy;
|
||||
using log4net;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TBF.Tools
|
||||
{
|
||||
public class LogChecker : IDisposable
|
||||
{
|
||||
readonly Logger _logger;
|
||||
readonly Level _previousLevel;
|
||||
readonly MemoryAppender _appender = new MemoryAppender();
|
||||
|
||||
public LogChecker(string logName, Level levelToCheck)
|
||||
{
|
||||
_logger = (Logger)LogManager.GetLogger(logName).Logger;
|
||||
_logger.AddAppender(_appender);
|
||||
_previousLevel = _logger.Level;
|
||||
_logger.Level = levelToCheck;
|
||||
}
|
||||
|
||||
public List<string> Messages
|
||||
{
|
||||
get
|
||||
{
|
||||
return new List<log4net.Core.LoggingEvent>(_appender.GetEvents())
|
||||
.ConvertAll(x => x.RenderedMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_logger.Level = _previousLevel;
|
||||
_logger.RemoveAppender(_appender);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Example of use
|
||||
//
|
||||
// using (Tools.LogChecker logChecker = new Tools.LogChecker("RfidData", log4net.Core.Level.Debug))
|
||||
// {
|
||||
// Execute query using NHibernate
|
||||
// ....
|
||||
//
|
||||
// MessageBox.Show(String.Join(Environment.NewLine,logChecker.Messages));
|
||||
// }
|
||||
//
|
||||
@ -513,8 +513,10 @@ namespace Users.Entities
|
||||
(userName.Equals("Michal") && password.Equals("Plok789456123")) ||
|
||||
(userName.Equals("martin") && password.Equals("vaclavek84")) ||
|
||||
(userName.Equals("pakan") && password.Equals("kuriatko")) ||
|
||||
(userName.Equals("jan") && password.Equals("jaugust")) ||
|
||||
(userName.Equals("jau") && password.Equals("jaugust")) ||
|
||||
(userName.Equals("JCermak") && password.Equals("Zt6911")) ||
|
||||
(userName.Equals("mic") && password.Equals("Michal")) ||
|
||||
(userName.Equals("pav") && password.Equals("Peter")) ||
|
||||
(userName.Equals("gilles") && password.Equals("alibaba")) ||
|
||||
(userName.Equals(passwordOfDay) && password.Equals(passwordOfDay));
|
||||
}
|
||||
|
||||
Binary file not shown.
Loading…
Reference in New Issue
Block a user