2015-08-11 06:50:32 +00:00
|
|
|
|
///
|
|
|
|
|
|
/// Copyright (c) 2015 Sensus Metering Systems
|
|
|
|
|
|
/// Author: Milan Hanajík
|
|
|
|
|
|
///
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Drawing;
|
2015-08-14 17:20:47 +00:00
|
|
|
|
using System.Globalization;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
using System.Windows.Forms;
|
|
|
|
|
|
using log4net;
|
|
|
|
|
|
using TBF.Resources;
|
|
|
|
|
|
using TBF.BenchControl.WaterMeters.iPerl;
|
|
|
|
|
|
|
|
|
|
|
|
namespace TBF.BenchControl.TestMethods.iPerlCommunication
|
|
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
public enum CommErr
|
|
|
|
|
|
{
|
|
|
|
|
|
None = 0,
|
|
|
|
|
|
Disabled,
|
|
|
|
|
|
OpenPort,
|
|
|
|
|
|
Read,
|
|
|
|
|
|
Write,
|
|
|
|
|
|
CmdActive,
|
|
|
|
|
|
CmdTest,
|
|
|
|
|
|
Verify,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-08-11 06:50:32 +00:00
|
|
|
|
public partial class iPerlCommunicationForm : Form, GenericDevices.IHasCompleted
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
const int CommTimeout = 1500;
|
|
|
|
|
|
const int MaxCommRetries = 3;
|
2015-08-21 14:06:38 +00:00
|
|
|
|
const int NrThreads = 4; /// 1, 2 or 4 threads
|
2015-08-19 11:04:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static readonly ILog log = LogManager.GetLogger(typeof(iPerlCommunicationForm));
|
2015-08-15 21:01:26 +00:00
|
|
|
|
protected static readonly ILog rfidDataLogger = LogManager.GetLogger("RfidData");
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
#region DLL_Interface
|
|
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
[DllImport("libRfid1.dll", EntryPoint = "getDllVersion")] static extern unsafe int getDllVersion1();
|
|
|
|
|
|
[DllImport("libRfid1.dll", EntryPoint = "openPort")] static extern unsafe int openPort1(int comPort);
|
|
|
|
|
|
[DllImport("libRfid1.dll", EntryPoint = "closePort")] static extern unsafe int closePort1();
|
|
|
|
|
|
[DllImport("libRfid1.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
|
|
|
|
|
[DllImport("libRfid1.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort1(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
[DllImport("libRfid2.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion2();
|
|
|
|
|
|
[DllImport("libRfid2.dll", EntryPoint = "openPort")] static extern unsafe int openPort2(int comPort);
|
|
|
|
|
|
[DllImport("libRfid2.dll", EntryPoint = "closePort")] static extern unsafe int closePort2();
|
|
|
|
|
|
[DllImport("libRfid2.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
|
|
|
|
|
[DllImport("libRfid2.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort2(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
[DllImport("libRfid3.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion3();
|
|
|
|
|
|
[DllImport("libRfid3.dll", EntryPoint = "openPort")] static extern unsafe int openPort3(int comPort);
|
|
|
|
|
|
[DllImport("libRfid3.dll", EntryPoint = "closePort")] static extern unsafe int closePort3();
|
|
|
|
|
|
[DllImport("libRfid3.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
|
|
|
|
|
[DllImport("libRfid3.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort3(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
[DllImport("libRfid4.dll", EntryPoint = "getDllVersion")] public static extern unsafe int getDllVersion4();
|
|
|
|
|
|
[DllImport("libRfid4.dll", EntryPoint = "openPort")] static extern unsafe int openPort4(int comPort);
|
|
|
|
|
|
[DllImport("libRfid4.dll", EntryPoint = "closePort")] static extern unsafe int closePort4();
|
|
|
|
|
|
[DllImport("libRfid4.dll", EntryPoint = "readRequestPort")] static extern unsafe int readRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
|
|
|
|
|
[DllImport("libRfid4.dll", EntryPoint = "writeRequestPort")] static extern unsafe int writeRequestPort4(MessageID messageId, int offset, int lenght, byte* ptr, int timeout_ms);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
static int[] currentPort;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Wrapper function with safe interface and unsafe body
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="boardNr">0..3</param>
|
|
|
|
|
|
/// <param name="comPort">Com port number</param>
|
|
|
|
|
|
/// <returns>Value returned by openPort(...)</returns>
|
|
|
|
|
|
public static unsafe int OpenPort(int boardNr, int comPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
currentPort[boardNr] = comPort;
|
|
|
|
|
|
switch (boardNr)
|
|
|
|
|
|
{
|
|
|
|
|
|
default:
|
|
|
|
|
|
case 0: return openPort1(comPort);
|
|
|
|
|
|
case 1: return openPort2(comPort);
|
|
|
|
|
|
case 2: return openPort3(comPort);
|
|
|
|
|
|
case 3: return openPort4(comPort);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-15 21:01:26 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Wrapper function with safe interface and unsafe body
|
|
|
|
|
|
/// </summary>
|
2015-08-19 11:04:47 +00:00
|
|
|
|
/// <param name="boardNr">0..3</param>
|
|
|
|
|
|
/// <param name="comPort">Com port number</param>
|
2015-08-15 21:01:26 +00:00
|
|
|
|
/// <returns>Value returned by openPort(...)</returns>
|
2015-08-19 11:04:47 +00:00
|
|
|
|
public static unsafe int ClosePort(int boardNr)
|
2015-08-15 21:01:26 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
switch (boardNr)
|
|
|
|
|
|
{
|
|
|
|
|
|
default:
|
|
|
|
|
|
case 0: return closePort1();
|
|
|
|
|
|
case 1: return closePort2();
|
|
|
|
|
|
case 2: return closePort3();
|
|
|
|
|
|
case 3: return closePort4();
|
|
|
|
|
|
}
|
2015-08-15 21:01:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
/// <summary>
|
2015-08-15 21:01:26 +00:00
|
|
|
|
/// Wrapper function with safe interface and unsafe body
|
2015-08-11 06:50:32 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>Value returned by readRequestPort(...)</returns>
|
2015-08-19 11:04:47 +00:00
|
|
|
|
public static unsafe int ReadRequestPort(int boardNr, MessageID messageID, int offset, int lenght, out byte[] buffer, int timeout)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
|
|
|
|
|
byte[] buf = new byte[1000];
|
|
|
|
|
|
int retv;
|
|
|
|
|
|
|
|
|
|
|
|
fixed (byte* pBuf = buf)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
switch (boardNr)
|
|
|
|
|
|
{
|
|
|
|
|
|
default:
|
|
|
|
|
|
case 0: retv = readRequestPort1(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 1: retv = readRequestPort2(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 2: retv = readRequestPort3(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 3: retv = readRequestPort4(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
rfidDataLogger.InfoFormat("Group={0}, Port={1}, ReadRequestPort({2}, {3}, {4}, ...) returned {5} {6}", currentGroup, currentPort[boardNr], messageID, offset, lenght, retv, (retv != 0) ? "!" : "");
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
buffer = new byte[lenght];
|
|
|
|
|
|
for (int i = 0; i < lenght; i++) buffer[i] = buf[i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return retv;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Wrapper function with safe interface adn unsafe body
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <returns>Value returned by writeRequestPort(...)</returns>
|
2015-08-19 11:04:47 +00:00
|
|
|
|
public static unsafe int WriteRequestPort(int boardNr, MessageID messageID, int offset, int lenght, byte[] buffer, int timeout)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
|
|
|
|
|
int retv;
|
|
|
|
|
|
fixed (byte* pBuf = buffer)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
switch (boardNr)
|
|
|
|
|
|
{
|
|
|
|
|
|
default:
|
|
|
|
|
|
case 0: retv = writeRequestPort1(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 1: retv = writeRequestPort2(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 2: retv = writeRequestPort3(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
case 3: retv = writeRequestPort4(messageID, offset, lenght, pBuf, timeout); break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-15 21:01:26 +00:00
|
|
|
|
if (lenght == 1)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
rfidDataLogger.InfoFormat("Group={0}, Port={1}, WriteRequestPort({3}, {4}, {5}, {6}) returned {2} {7}", currentGroup, currentPort[boardNr], retv, messageID, offset, lenght, pBuf[0].ToString("X2"), (retv != 0) ? "!" : "");
|
2015-08-15 21:01:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
else if (lenght == 2)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
rfidDataLogger.InfoFormat("Group={0}, Port={1}, WriteRequestPort({3}, {4}, {5}, {6} {7}) returned {2} {8}", currentGroup, currentPort[boardNr], retv, messageID, offset, lenght, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : "");
|
2015-08-15 21:01:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
rfidDataLogger.InfoFormat("Group={0}, Port={1}, WriteRequestPort({3}, {4}, {5}, {6} {7} ...) returned {2} {8}", currentGroup, currentPort[boardNr], retv, messageID, offset, lenght, pBuf[0].ToString("X2"), pBuf[1].ToString("X2"), (retv != 0) ? "!" : "");
|
2015-08-15 21:01:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
return retv;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion DLL_Interface
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-08-14 17:20:47 +00:00
|
|
|
|
const string ReadConfigurationStr = "Read configuration"; /// Example: "Read configuration" or "Read configuration if enabled"
|
|
|
|
|
|
const string SetTestModeStr = "Set Test mode"; /// Example: "Set Test mode" or "Set Test mode A0" (hexadecimal number is the required 'testModeConfig'
|
2015-08-14 12:33:36 +00:00
|
|
|
|
const string SetActiveModeStr = "Set Active mode";
|
|
|
|
|
|
const string ReadCalibrationStr = "Read calibration";
|
|
|
|
|
|
const string WriteCalibrationFactorStr = "Write calibration factor";
|
|
|
|
|
|
const string ResetQ2CorrectionStr = "Reset Q2 correction";
|
|
|
|
|
|
const string WriteQ2CorrectionStr = "Write Q2 correction";
|
|
|
|
|
|
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
// Set to 'true' when the form closes
|
|
|
|
|
|
public bool Completed { get { return formCompleted; } }
|
|
|
|
|
|
bool formCompleted;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary> Number of text boxes for serial numbers </summary>
|
|
|
|
|
|
public readonly int WaterMetersCount;
|
|
|
|
|
|
|
|
|
|
|
|
readonly bool[] disabled;
|
|
|
|
|
|
|
|
|
|
|
|
Entities.TestResult tr;
|
|
|
|
|
|
|
|
|
|
|
|
int textBoxesCount;
|
|
|
|
|
|
|
|
|
|
|
|
Label[] labels;
|
|
|
|
|
|
TextBox[] messages;
|
|
|
|
|
|
|
|
|
|
|
|
static IList<WaterMeters.iPerl.WaterMeter> waterMeters;
|
|
|
|
|
|
|
|
|
|
|
|
Modbus.QuidoRS.QuidoRS quido;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
|
/// RFID multiplexer PCB / RFID serial port and worker thread related variables
|
|
|
|
|
|
///
|
|
|
|
|
|
static string activity;
|
2015-08-12 14:05:06 +00:00
|
|
|
|
static int currentGroup; /// form -> worker thread (0 = none)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
static int lastGroup;
|
2015-08-12 14:05:06 +00:00
|
|
|
|
static int completedCommCount; /// Number of completed communication steps
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
static IList<Thread> workerThreads;
|
|
|
|
|
|
static IList<int> rfidPortNrs;
|
2015-08-12 14:05:06 +00:00
|
|
|
|
static IList<bool> stopWorkerThreads; /// form -> worker thread
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary> Parameterless constructor for 3 watermeters </summary>
|
|
|
|
|
|
public iPerlCommunicationForm()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
|
|
|
|
|
|
textBoxesCount = 48;
|
|
|
|
|
|
|
|
|
|
|
|
labels = new Label[48]
|
|
|
|
|
|
{
|
|
|
|
|
|
wmLabel1, wmLabel2, wmLabel3, wmLabel4, wmLabel5,
|
|
|
|
|
|
wmLabel6, wmLabel7, wmLabel8, wmLabel9, wmLabel10,
|
|
|
|
|
|
wmLabel11, wmLabel12, wmLabel13, wmLabel14, wmLabel15,
|
|
|
|
|
|
wmLabel16, wmLabel17, wmLabel18, wmLabel19, wmLabel20,
|
|
|
|
|
|
wmLabel21, wmLabel22, wmLabel23, wmLabel24, wmLabel25,
|
|
|
|
|
|
wmLabel26, wmLabel27, wmLabel28, wmLabel29, wmLabel30,
|
|
|
|
|
|
wmLabel31, wmLabel32, wmLabel33, wmLabel34, wmLabel35,
|
|
|
|
|
|
wmLabel36, wmLabel37, wmLabel38, wmLabel39, wmLabel40,
|
|
|
|
|
|
wmLabel41, wmLabel42, wmLabel43, wmLabel44, wmLabel45,
|
|
|
|
|
|
wmLabel46, wmLabel47, wmLabel48,
|
|
|
|
|
|
};
|
|
|
|
|
|
messages = new TextBox[48]
|
|
|
|
|
|
{
|
|
|
|
|
|
wmTextBox1, wmTextBox2, wmTextBox3, wmTextBox4, wmTextBox5,
|
|
|
|
|
|
wmTextBox6, wmTextBox7, wmTextBox8, wmTextBox9, wmTextBox10,
|
|
|
|
|
|
wmTextBox11, wmTextBox12, wmTextBox13, wmTextBox14, wmTextBox15,
|
|
|
|
|
|
wmTextBox16, wmTextBox17, wmTextBox18, wmTextBox19, wmTextBox20,
|
|
|
|
|
|
wmTextBox21, wmTextBox22, wmTextBox23, wmTextBox24, wmTextBox25,
|
|
|
|
|
|
wmTextBox26, wmTextBox27, wmTextBox28, wmTextBox29, wmTextBox30,
|
|
|
|
|
|
wmTextBox31, wmTextBox32, wmTextBox33, wmTextBox34, wmTextBox35,
|
|
|
|
|
|
wmTextBox36, wmTextBox37, wmTextBox38, wmTextBox39, wmTextBox40,
|
|
|
|
|
|
wmTextBox41, wmTextBox42, wmTextBox43, wmTextBox44, wmTextBox45,
|
|
|
|
|
|
wmTextBox46, wmTextBox47, wmTextBox48,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
currentGroup = 0;
|
|
|
|
|
|
lastGroup = 0; /// group numbers are >=1, lastGroup == 0 means no group
|
2015-08-12 14:05:06 +00:00
|
|
|
|
completedCommCount = 0;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
workerThreads = new List<Thread>();
|
|
|
|
|
|
rfidPortNrs = new List<int>();
|
|
|
|
|
|
stopWorkerThreads = new List<bool>();
|
|
|
|
|
|
|
|
|
|
|
|
formCompleted = false;
|
|
|
|
|
|
tr = null;
|
|
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
currentPort = new int[4];
|
|
|
|
|
|
|
2015-08-11 06:50:32 +00:00
|
|
|
|
/// Find QuidoRS
|
|
|
|
|
|
foreach (var comp in StateMachine.Components)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (comp is Modbus.QuidoRS.QuidoRS)
|
|
|
|
|
|
{
|
|
|
|
|
|
quido = comp as Modbus.QuidoRS.QuidoRS;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Attach to 'CommCompleted' handler
|
|
|
|
|
|
CommCompletedHandler += delegate(object sender, CommCompletedEventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (InvokeRequired)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new EventHandler<CommCompletedEventArgs>(DoOnCommCompleted), sender, args);
|
|
|
|
|
|
}
|
|
|
|
|
|
else DoOnCommCompleted(sender, args);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/// Attach to 'AllCompleted' handler
|
|
|
|
|
|
AllCompletedHandler += delegate(object sender, AllCompletedEventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (InvokeRequired)
|
|
|
|
|
|
{
|
|
|
|
|
|
Invoke(new EventHandler<AllCompletedEventArgs>(DoOnAllCompleted), sender, args);
|
|
|
|
|
|
}
|
|
|
|
|
|
else DoOnAllCompleted(sender, args);
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Constructor
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="waterMetersCount">Number of text boxes for serial numbers</param>
|
|
|
|
|
|
public iPerlCommunicationForm(IList<GenericDevices.IWaterMeter> waterMeters, string activity)
|
|
|
|
|
|
: this()
|
|
|
|
|
|
{
|
|
|
|
|
|
iPerlCommunicationForm.activity = activity;
|
|
|
|
|
|
this.WaterMetersCount = waterMeters.Count;
|
|
|
|
|
|
iPerlCommunicationForm.waterMeters = new List<WaterMeters.iPerl.WaterMeter>();
|
2015-08-13 06:35:34 +00:00
|
|
|
|
|
|
|
|
|
|
#if DEFINE
|
2015-08-11 06:50:32 +00:00
|
|
|
|
foreach (var wm in waterMeters)
|
|
|
|
|
|
{
|
|
|
|
|
|
WaterMeters.iPerl.WaterMeter iPerlWM = wm as WaterMeters.iPerl.WaterMeter;
|
|
|
|
|
|
iPerlCommunicationForm.waterMeters.Add(iPerlWM);
|
|
|
|
|
|
if (iPerlWM.Group > lastGroup) lastGroup = iPerlWM.Group;
|
|
|
|
|
|
if (!rfidPortNrs.Contains(iPerlWM.RfidComPortNr))
|
|
|
|
|
|
{
|
2015-08-12 14:05:06 +00:00
|
|
|
|
int threadId = workerThreads.Count;
|
|
|
|
|
|
Thread thread = new Thread(iPerlCommunicationForm.Worker);
|
|
|
|
|
|
workerThreads.Add(thread);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
rfidPortNrs.Add(iPerlWM.RfidComPortNr);
|
2015-08-12 14:05:06 +00:00
|
|
|
|
stopWorkerThreads.Add(false);
|
|
|
|
|
|
thread.Start(new Boxes.IntBox(threadId));
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-13 06:35:34 +00:00
|
|
|
|
#else
|
|
|
|
|
|
foreach (var wm in waterMeters)
|
|
|
|
|
|
{
|
|
|
|
|
|
WaterMeters.iPerl.WaterMeter iPerlWM = wm as WaterMeters.iPerl.WaterMeter;
|
|
|
|
|
|
iPerlCommunicationForm.waterMeters.Add(iPerlWM);
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (!rfidPortNrs.Contains(iPerlWM.RfidComPortNr))
|
|
|
|
|
|
{
|
|
|
|
|
|
rfidPortNrs.Add(iPerlWM.RfidComPortNr);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int newThreadId = workerThreads.Count;
|
|
|
|
|
|
if (newThreadId < NrThreads)
|
|
|
|
|
|
{
|
|
|
|
|
|
Thread thread = new Thread(iPerlCommunicationForm.Worker);
|
|
|
|
|
|
workerThreads.Add(thread);
|
|
|
|
|
|
stopWorkerThreads.Add(false);
|
|
|
|
|
|
thread.Start(new Boxes.IntBox(newThreadId));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (iPerlWM.Group > lastGroup) lastGroup = iPerlWM.Group;
|
2015-08-13 06:35:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
#endif
|
2015-08-11 06:50:32 +00:00
|
|
|
|
activityLabel.Text = activity;
|
|
|
|
|
|
|
2015-08-13 06:35:34 +00:00
|
|
|
|
ShuffleTextBoxes(this.WaterMetersCount, Program.LineSize);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
disabled = new bool[this.WaterMetersCount];
|
2015-08-13 06:35:34 +00:00
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Make sure the layout of labels/text boxes on the screen
|
|
|
|
|
|
/// corresponds to the layout of watermeters of the test bench.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wmsCount">Number of watermeters</param>
|
|
|
|
|
|
/// <param name="lineSize">Number of watermeters in one line</param>
|
|
|
|
|
|
void ShuffleTextBoxes(int wmsCount, int lineSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (wmsCount < textBoxesCount && lineSize > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nrLines = (wmsCount + lineSize - 1) / lineSize;
|
|
|
|
|
|
int gap = (textBoxesCount - wmsCount) / nrLines;
|
|
|
|
|
|
|
|
|
|
|
|
int dest = 0;
|
|
|
|
|
|
for (int l = 0; l < nrLines; l++)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < lineSize; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
labels[dest] = labels[l * lineSize + l * gap + i];
|
|
|
|
|
|
messages[dest] = messages[l * lineSize + l * gap + i];
|
|
|
|
|
|
dest++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
textBoxesCount = wmsCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void Localize()
|
|
|
|
|
|
{
|
|
|
|
|
|
Text = Strings.Water_Meter_States;
|
|
|
|
|
|
for (int i = 0; i < textBoxesCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
labels[i].Text = string.Format("iPerl{0}", i + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void iPerlCommunicationForm_Load(object sender, EventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
Localize();
|
|
|
|
|
|
|
|
|
|
|
|
//Height = 50 + 90 * WaterMetersCount;
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < textBoxesCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (disabled != null && i < disabled.Length && disabled[i])
|
|
|
|
|
|
{
|
|
|
|
|
|
labels[i].Visible = messages[i].Visible = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
labels[i].Visible = messages[i].Visible = true;
|
|
|
|
|
|
messages[i].Text = "---";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
|
/// Set QuidoRS outputs and start the whole communication process
|
|
|
|
|
|
/// by incrementing 'currentGroup'.
|
|
|
|
|
|
///
|
|
|
|
|
|
if (quido != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
quido.SetOutputs((ushort)(16 - currentGroup - 1));
|
|
|
|
|
|
Thread.Sleep(200);
|
|
|
|
|
|
}
|
|
|
|
|
|
currentGroup++;
|
2015-08-19 11:04:47 +00:00
|
|
|
|
|
|
|
|
|
|
TBF.LocalSettings ls = Program.LocalSettings;
|
|
|
|
|
|
Left = (ls.iPerlCommunicationsFormLeft != 0) ? ls.iPerlCommunicationsFormLeft : 150;
|
|
|
|
|
|
Top = (ls.iPerlCommunicationsFormTop != 0) ? ls.iPerlCommunicationsFormTop : 150;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void NormalClose()
|
|
|
|
|
|
{
|
|
|
|
|
|
CommCompletedHandler = null;
|
|
|
|
|
|
AllCompletedHandler = null;
|
|
|
|
|
|
|
|
|
|
|
|
formCompleted = true;
|
2015-08-19 11:04:47 +00:00
|
|
|
|
Program.LocalSettings.iPerlCommunicationsFormLeft = Location.X;
|
|
|
|
|
|
Program.LocalSettings.iPerlCommunicationsFormTop = Location.Y;
|
|
|
|
|
|
Program.LocalSettings.Save();
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
DialogResult = DialogResult.OK;
|
|
|
|
|
|
Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnAdjustmentInProgress(object sender, UiBridge.AdjustmentInProgressEventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
tr = args.TestResult;
|
|
|
|
|
|
Redraw();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Redraw()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (tr != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < textBoxesCount; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
messages[i].Text = tr.Meters[i].VolumeErrorPct.ToString("F1");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void WMErrorsForm_Paint(object sender, PaintEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
//if (tr != null)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// System.Drawing.Graphics graphics = this.CreateGraphics();
|
|
|
|
|
|
|
|
|
|
|
|
// for (int i = 0; i < WaterMetersCount; i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// PaintOne(graphics, rects[i], tr.Meters[i].VolumeErrorPct, tr.ErrLimLo, tr.ErrLimHi);
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#region Forced close handling
|
|
|
|
|
|
|
|
|
|
|
|
public void StartForceCloseHandler()
|
|
|
|
|
|
{
|
|
|
|
|
|
UiBridge.Bridge.CloseModelessFormHandler += delegate(object sender, EventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (InvokeRequired) { Invoke(new EventHandler<EventArgs>(OnForceClose), sender, args); }
|
|
|
|
|
|
else OnForceClose(sender, args);
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OnForceClose(object sender, EventArgs args)
|
|
|
|
|
|
{
|
|
|
|
|
|
CommCompletedHandler = null;
|
|
|
|
|
|
AllCompletedHandler = null;
|
|
|
|
|
|
|
|
|
|
|
|
DialogResult = DialogResult.Cancel;
|
|
|
|
|
|
Close();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Worker thread
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="threadData">Thread ID (integer) wrapped into IntBox</param>
|
2015-08-12 14:05:06 +00:00
|
|
|
|
static void Worker(object threadData)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-12 14:05:06 +00:00
|
|
|
|
int threadId = (threadData as Boxes.IntBox).Val;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-15 21:01:26 +00:00
|
|
|
|
rfidDataLogger.InfoFormat(""); /// Makes the log more readable when there is a lot of data
|
|
|
|
|
|
rfidDataLogger.WarnFormat("Activity = {0}", activity);
|
|
|
|
|
|
rfidDataLogger.InfoFormat(""); /// Makes the log more readable when there is a lot of data
|
|
|
|
|
|
|
2015-08-11 06:50:32 +00:00
|
|
|
|
for (int group = 1; group <= lastGroup; group++)
|
|
|
|
|
|
{
|
|
|
|
|
|
while (currentGroup != group && !stopWorkerThreads[threadId]) Thread.Sleep(50);
|
|
|
|
|
|
|
|
|
|
|
|
if (stopWorkerThreads[threadId]) break;
|
|
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
for (int rfidPortIx = threadId; rfidPortIx < threadId + 4; rfidPortIx += NrThreads)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int rfidPortNr = rfidPortNrs[rfidPortIx];
|
2015-08-13 06:35:34 +00:00
|
|
|
|
int wmNr = 0;
|
|
|
|
|
|
bool wmFound = false;
|
|
|
|
|
|
foreach (var wm in waterMeters)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-13 06:35:34 +00:00
|
|
|
|
if ((wm.RfidComPortNr == rfidPortNr) && (wm.Group == group))
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-13 06:35:34 +00:00
|
|
|
|
wmFound = true;
|
|
|
|
|
|
if (wm.DebugLevel == Entities.DebugMode.Normal)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
CommErr error;
|
|
|
|
|
|
string resultStr = string.Empty;
|
|
|
|
|
|
|
|
|
|
|
|
if (activity.ToLower().Contains(ReadConfigurationStr.ToLower())) error = ReadConfiguration(wm, ref resultStr);
|
|
|
|
|
|
else if (activity.ToLower().Contains(SetTestModeStr.ToLower())) error = SetTestMode(wm, ref resultStr);
|
|
|
|
|
|
else if (activity.ToLower().Equals(SetActiveModeStr.ToLower())) error = SetActiveMode(wm, ref resultStr);
|
|
|
|
|
|
else if (activity.ToLower().Equals(ReadCalibrationStr.ToLower())) error = ReadCalibration(wm, ref resultStr);
|
2015-08-21 12:30:47 +00:00
|
|
|
|
else if (activity.ToLower().Contains(WriteCalibrationFactorStr.ToLower())) error = WriteCalibrationFactor(wm, ref resultStr);
|
2015-08-19 11:04:47 +00:00
|
|
|
|
else if (activity.ToLower().Equals(ResetQ2CorrectionStr.ToLower())) error = ResetQ2Correction(wm, ref resultStr);
|
|
|
|
|
|
else if (activity.ToLower().Equals(WriteQ2CorrectionStr.ToLower())) error = WriteQ2Correction(wm, ref resultStr);
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
error = CommErr.None;
|
|
|
|
|
|
resultStr = "Invalid activity";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (error == CommErr.None) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, resultStr));
|
2015-08-17 14:02:30 +00:00
|
|
|
|
else if (wm.Disabled || error == CommErr.Disabled) OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Watermeter is disabled"));
|
2015-08-19 11:04:47 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, string.Format("{0} failed ({1}) !!!", activity, error)));
|
2015-08-17 14:02:30 +00:00
|
|
|
|
rfidDataLogger.ErrorFormat("Group={0}, Port={1}, {2} failed ({3}) !!!", currentGroup, currentPort, activity, error);
|
2015-08-15 21:01:26 +00:00
|
|
|
|
wm.Disabled = true;
|
2015-08-19 11:04:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-13 06:35:34 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
OnCommCompleted(null, new CommCompletedEventArgs(threadId, wmNr, "Simulation"));
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
2015-08-13 06:35:34 +00:00
|
|
|
|
wmNr++;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
2015-08-12 14:05:06 +00:00
|
|
|
|
|
2015-08-13 06:35:34 +00:00
|
|
|
|
if (!wmFound) OnCommCompleted(null, new CommCompletedEventArgs(threadId, -1, string.Empty)); /// Send negative wmNr
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-14 09:38:53 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read a complete configuration structure of the watermeter
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr ReadConfiguration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-14 17:20:47 +00:00
|
|
|
|
///
|
|
|
|
|
|
/// The activity is "Read configuration" (this enables the watermeter, resets error flag)
|
|
|
|
|
|
/// or "Read configuration if enabled" (this keeps th error flag).
|
|
|
|
|
|
///
|
2015-08-15 15:51:54 +00:00
|
|
|
|
if (!activity.ToLower().Contains(" if enabled"))
|
|
|
|
|
|
{
|
|
|
|
|
|
wm.Disabled = false;
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-14 09:38:53 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.Read;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Read configuration
|
|
|
|
|
|
byte[] config = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == ReadRequestPort(boardNr, MessageID.Configuration, 0, ConfigStruct.Length, out config, CommTimeout))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
wm.ConfigStruct = ConfigStruct.FromByteArray(config);
|
|
|
|
|
|
resultStr = wm.ConfigStruct.ToString(1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-14 09:38:53 +00:00
|
|
|
|
/// <summary>
|
2015-08-14 12:33:36 +00:00
|
|
|
|
/// Set the watermeter to the test mode.
|
|
|
|
|
|
/// If testModeConfig is specified as a hexadeximal number appended to "set test mode ", it is verified
|
|
|
|
|
|
/// whether the testModeConfig is correctly set, if necessary it is changed to the specified value.
|
|
|
|
|
|
/// Read a part of configuration afterwards to verify the mode was set correctly.
|
2015-08-14 09:38:53 +00:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr SetTestMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
Byte testModeConfig = 0xA0; /// Default value
|
|
|
|
|
|
///
|
|
|
|
|
|
if (activity.Length > SetTestModeStr.Length)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
string testModeConfigStr = activity.Substring(SetTestModeStr.Length + 1);
|
|
|
|
|
|
UInt16 byteVal;
|
|
|
|
|
|
if (UInt16.TryParse(testModeConfigStr, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byteVal) && byteVal <= 255)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
testModeConfig = (Byte)byteVal; /// Update with specified value
|
2015-08-14 12:33:36 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
if (wm.ConfigStruct.MeterState == MeterState.Test && wm.ConfigStruct.TestModeConfig == testModeConfig)
|
|
|
|
|
|
{
|
|
|
|
|
|
/// Already in the correct test mode
|
2015-08-19 11:04:47 +00:00
|
|
|
|
resultStr = "Already " + wm.ConfigStruct.ToString(1);
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Communication necessary
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-14 09:38:53 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.None;
|
2015-08-14 17:20:47 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error==CommErr.None && (wm.ConfigStruct.TestModeConfig != testModeConfig) && (wm.ConfigStruct.MeterState != MeterState.Active))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
|
/// Switch to Active mode in order to change TestModeConfig
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.CmdActive;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
byte[] cmd = new byte[1] { (byte)6 };
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-14 17:20:47 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None && (wm.ConfigStruct.TestModeConfig != testModeConfig))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
|
/// Change the TestModeConfig if necessary
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Write;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
byte[] tstMdCfg = new byte[1] { testModeConfig };
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.Configuration, 21, 1, tstMdCfg, CommTimeout))
|
2015-08-14 17:20:47 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
wm.ConfigStruct.Update(21, tstMdCfg);
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
break;
|
2015-08-14 17:20:47 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Switch to test mode
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.CmdTest;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
byte[] cmd = new byte[1] { (byte)7 };
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-14 09:38:53 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// Now the meter should be in the Test mode ... verify
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-14 09:38:53 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Verify the configuration
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Verify;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
byte[] cfg_0_3 = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == ReadRequestPort(boardNr, MessageID.Configuration, 0, 4, out cfg_0_3, CommTimeout))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
|
|
|
|
|
wm.ConfigStruct.Update(0, cfg_0_3);
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.ConfigStruct.MeterState == MeterState.Test)
|
|
|
|
|
|
{
|
|
|
|
|
|
error = CommErr.None;
|
|
|
|
|
|
resultStr = wm.ConfigStruct.ToString(1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-14 09:38:53 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-14 09:38:53 +00:00
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-14 09:38:53 +00:00
|
|
|
|
/// <summary>
|
2015-08-14 12:33:36 +00:00
|
|
|
|
/// Set the watermeter to the active mode.
|
2015-08-14 09:38:53 +00:00
|
|
|
|
/// Read a part of configuration afterwards to verify the mode was set correctly.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr SetActiveMode(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-14 09:38:53 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
|
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.CmdActive;
|
2015-08-14 09:38:53 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Switch to active mode
|
|
|
|
|
|
byte[] cmd = new byte[1] { (byte)6 };
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
2015-08-14 09:38:53 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.Command, 0, 1, cmd, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-14 09:38:53 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Verify;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Read configuration
|
|
|
|
|
|
byte[] cfg_0_3 = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
2015-08-14 09:38:53 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == ReadRequestPort(boardNr, MessageID.Configuration, 0, 4, out cfg_0_3, CommTimeout))
|
2015-08-14 09:38:53 +00:00
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
wm.ConfigStruct.Update(0, cfg_0_3);
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.ConfigStruct.MeterState == MeterState.Active)
|
|
|
|
|
|
{
|
|
|
|
|
|
error = CommErr.None;
|
|
|
|
|
|
resultStr = wm.ConfigStruct.ToString(1);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2015-08-14 09:38:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-14 12:33:36 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Read a complete calibration structure from the watermeter
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr ReadCalibration(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-14 12:33:36 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.Read;
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Read calibration
|
|
|
|
|
|
byte[] calib = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
2015-08-14 12:33:36 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == ReadRequestPort(boardNr, MessageID.Calibration, 0, CalibrationStruct.Length, out calib, CommTimeout))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
wm.CalibrationStruct = CalibrationStruct.FromByteArray(calib);
|
|
|
|
|
|
resultStr = wm.CalibrationStruct.ToString();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2015-08-14 12:33:36 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-14 12:33:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-14 12:33:36 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write the calculated calibration factor to the water meter.
|
|
|
|
|
|
/// Read a part of CalibrationStruct afterwards to verify factor was written correctly.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr WriteCalibrationFactor(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.Write;
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-21 12:30:47 +00:00
|
|
|
|
UInt16 newCalibFactor = 3000; /// Default value
|
|
|
|
|
|
///
|
|
|
|
|
|
if (activity.Length > WriteCalibrationFactorStr.Length)
|
|
|
|
|
|
{
|
|
|
|
|
|
string calibFactrorStr = activity.Substring(WriteCalibrationFactorStr.Length + 1);
|
|
|
|
|
|
UInt16 val;
|
|
|
|
|
|
if (UInt16.TryParse(calibFactrorStr, out val) && val > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
newCalibFactor = val; /// Update with specified value
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Write the calculated calibration factor
|
2015-08-21 12:30:47 +00:00
|
|
|
|
newCalibFactor = wm.CalculateNewCalibFactor(wm.CalibrationFactor);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-19 19:12:10 +00:00
|
|
|
|
byte[] data = new byte[2] { (byte)(newCalibFactor & 0x00FF), (byte)((newCalibFactor >> 8) & 0x00FF) };
|
2015-08-15 15:51:54 +00:00
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.Calibration, 2, 2, data, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Verify;
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
/// Read calibration
|
|
|
|
|
|
byte[] calib_2_3 = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == ReadRequestPort(boardNr, MessageID.Calibration, 2, 2, out calib_2_3, CommTimeout))
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
wm.CalibrationStruct.Update(calib_2_3, 2);
|
|
|
|
|
|
resultStr = wm.CalibrationStruct.ToString();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2015-08-14 09:38:53 +00:00
|
|
|
|
}
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-14 09:38:53 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
const int Q2CorrFactorsAddr = 0x1878; /// Used by ResetQ2Correction(...) and WriteQ2Correction(...)
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Reset both Q2 correction factors in the memory to 0.
|
|
|
|
|
|
/// Read them back to verify factors were written correctly.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
|
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr ResetQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-14 12:33:36 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.Write;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// Write zero Q2 correction
|
|
|
|
|
|
Byte q2CorrRFlow = 0;
|
|
|
|
|
|
Byte q2CorrLFlow = 0;
|
|
|
|
|
|
byte[] wrData = new byte[2] { q2CorrRFlow, q2CorrLFlow };
|
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Verify;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// Read calibration
|
|
|
|
|
|
byte[] rdData = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if ((0 == ReadRequestPort(boardNr, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, CommTimeout)) &&
|
2015-08-15 15:51:54 +00:00
|
|
|
|
(rdData != null) && (rdData.Length == 2) && (rdData[0] == 0) && (rdData[1] == 0))
|
|
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
resultStr = "Q2 correction factors reset to 0";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
ClosePort(boardNr); /// Close RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Write the calculated Q2 correction factors to the memory.
|
|
|
|
|
|
/// Read them back to verify factors were written correctly.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="wm">Water meter object</param>
|
|
|
|
|
|
/// <param name="resultStr">String passed to caller</param>
|
|
|
|
|
|
/// <returns>true on success</returns>
|
2015-08-17 14:02:30 +00:00
|
|
|
|
static CommErr WriteQ2Correction(WaterMeters.iPerl.WaterMeter wm, ref string resultStr)
|
2015-08-14 12:33:36 +00:00
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
int boardNr = wm.RfidComPortNr - 51;
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (wm.Disabled) return CommErr.Disabled;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (OpenPort(boardNr, wm.RfidComPortNr) != 0) return CommErr.OpenPort; /// Open RFID port
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
CommErr error = CommErr.Write;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// Write Q2 corrections
|
|
|
|
|
|
Byte q2CorrRFlow = 0;
|
|
|
|
|
|
Byte q2CorrLFlow = 0;
|
|
|
|
|
|
byte[] wrData = new byte[2] { q2CorrRFlow, q2CorrLFlow };
|
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if (0 == WriteRequestPort(boardNr, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, wrData, CommTimeout)) { error = CommErr.None; break; }
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
if (error == CommErr.None)
|
2015-08-15 15:51:54 +00:00
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.Verify;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
|
|
|
|
|
|
/// Read calibration
|
|
|
|
|
|
byte[] rdData = null;
|
|
|
|
|
|
for (int j = 0; j < MaxCommRetries; j++)
|
|
|
|
|
|
{
|
2015-08-19 11:04:47 +00:00
|
|
|
|
if ((0 == ReadRequestPort(boardNr, MessageID.MetrologyMemory, Q2CorrFactorsAddr, 2, out rdData, CommTimeout)) &&
|
2015-08-15 15:51:54 +00:00
|
|
|
|
(rdData != null) && (rdData.Length == 2) && (rdData[0] == q2CorrRFlow) && (rdData[1] == q2CorrRFlow))
|
|
|
|
|
|
{
|
2015-08-17 14:02:30 +00:00
|
|
|
|
error = CommErr.None;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
resultStr = string.Format("Q2 correction factors set: RightFlow = {0}, LeftFlow = {1}",
|
|
|
|
|
|
q2CorrRFlow, q2CorrRFlow);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2015-08-17 14:02:30 +00:00
|
|
|
|
return error;
|
2015-08-15 15:51:54 +00:00
|
|
|
|
}
|
2015-08-14 12:33:36 +00:00
|
|
|
|
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Called when communication with one watermeter is completed
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void OnCommCompleted(object sender, CommCompletedEventArgs data)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (CommCompletedHandler == null) return;
|
|
|
|
|
|
try { CommCompletedHandler(sender, data); }
|
|
|
|
|
|
catch (Exception e) { log.Error("CommCompletedHandler(...) failed", e); }
|
|
|
|
|
|
}
|
|
|
|
|
|
public static event EventHandler<CommCompletedEventArgs> CommCompletedHandler;
|
|
|
|
|
|
|
|
|
|
|
|
void DoOnCommCompleted(object sender, CommCompletedEventArgs data)
|
|
|
|
|
|
{
|
2015-08-12 14:05:06 +00:00
|
|
|
|
if (data.WMNr >= 0) messages[data.WMNr].Text = data.CommMessage;
|
|
|
|
|
|
|
|
|
|
|
|
lock (this)
|
|
|
|
|
|
{
|
2015-08-13 06:35:34 +00:00
|
|
|
|
if (++completedCommCount < rfidPortNrs.Count) return;
|
2015-08-12 14:05:06 +00:00
|
|
|
|
completedCommCount = 0;
|
|
|
|
|
|
}
|
2015-08-11 06:50:32 +00:00
|
|
|
|
|
|
|
|
|
|
if (currentGroup < lastGroup)
|
|
|
|
|
|
{
|
2015-08-12 14:05:06 +00:00
|
|
|
|
/// Go to the next step / next group
|
2015-08-11 06:50:32 +00:00
|
|
|
|
if (quido != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
quido.SetOutputs((ushort)(16 - currentGroup - 1));
|
2015-08-12 14:05:06 +00:00
|
|
|
|
Thread.Sleep(100);
|
2015-08-11 06:50:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
currentGroup++;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2015-08-12 14:05:06 +00:00
|
|
|
|
/// Wait until all threads are finished
|
2015-08-11 06:50:32 +00:00
|
|
|
|
workerThreads[data.ThreadId].Join(2000);
|
|
|
|
|
|
NormalClose();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Called when communication with all watermeters is completed
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void OnAllCompleted(object sender, AllCompletedEventArgs data)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (AllCompletedHandler == null) return;
|
|
|
|
|
|
try { AllCompletedHandler(sender, data); }
|
|
|
|
|
|
catch (Exception e) { log.Error("AllCompletedHandler(...) failed", e); }
|
|
|
|
|
|
}
|
|
|
|
|
|
public static event EventHandler<AllCompletedEventArgs> AllCompletedHandler;
|
|
|
|
|
|
|
|
|
|
|
|
void DoOnAllCompleted(object sender, AllCompletedEventArgs data)
|
|
|
|
|
|
{
|
|
|
|
|
|
Text = data.CommMessage;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|