- Introduced UInt128,

- Built size for readRegister from data type
This commit is contained in:
Thomas Wiedebusch 2023-09-06 14:44:33 +02:00
parent ceb2943063
commit 8c9d770439
7 changed files with 65 additions and 81 deletions

View File

@ -130,8 +130,8 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
detail = detailO.Property("type");
if (detail.Name == "type")
{
actualRegister.DataType =
typeof(String); // detail.Value.ToString();
// default type if not explicit defined
actualRegister.DataType = typeof(String);
switch (detail.Value.ToString().ToLower())
{
@ -157,17 +157,20 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
actualRegister.DataType = typeof(UInt16);
break;
case "uint8_t":
actualRegister.DataType = typeof(byte);
actualRegister.DataType = typeof(Byte);
break;
case "enum8":
actualRegister.DataType = typeof(Enum8);
break;
case "uint64_t":
actualRegister.DataType = typeof(UInt64);
break;
break;
case "uint96_t":
actualRegister.DataType = typeof(UInt96);
break;
case "uint128_t":
actualRegister.DataType = typeof(UInt128);
break;
case "int8_t":
actualRegister.DataType = typeof(SByte);
break;

View File

@ -1732,7 +1732,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
/// - PcbId handling improved,
/// - Removed retries as these are handled by the protocol.
/// </remarks>
public String GetPcbId(Int32 expectedLength = 12)
public String GetPcbId()
{
if (RequestPort == null)
@ -1745,7 +1745,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
_logger.Info($"Slot:{Slot} - Old PCB identification was {PcbId}");
var pcbIdRaw = ReadRegister(Register.Configexchange.PcbSerialNumber, expectedLength);
var pcbIdRaw = ReadRegister(Register.Configexchange.PcbSerialNumber);
if (pcbIdRaw != null)
{
PcbId = Encoding.ASCII.GetString(pcbIdRaw).Split('\0')[0];
@ -1898,14 +1898,21 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore
var hideDataInLog = regDef.RegisterName.Contains("EncryptionKey");
if (!expectedLength.HasValue || expectedLength.Value <= RegisterDefinition.ChunkSize)
// setup length based on data type
if (!expectedLength.HasValue)
{
expectedLength = RegisterConverter.SizeOf(regDef);
}
var dataLengthPreset = expectedLength.Value;
if (expectedLength.Value <= RegisterDefinition.ChunkSize)
{
RequestProtocol?.CommandToMeter(Commands.ReadData, regDef, hideDataInLog: hideDataInLog,
skipRetryErrorCode: skipRetryErrorCode);
}
else
{
RequestProtocol?.CommandToMeter(Commands.MultipleReadData, regDef, expectedLength: expectedLength,
RequestProtocol?.CommandToMeter(Commands.MultipleReadData, regDef, expectedLength: dataLengthPreset,
hideDataInLog: hideDataInLog, skipRetryErrorCode: skipRetryErrorCode);
}

View File

@ -593,20 +593,22 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol
/// <remarks date="2019-Jan-18" author="T.Wiedebusch">
/// - Default <see cref="CommunicationConfig.SkipRetryErrorCode"/> set.
/// </remarks>
/// <remarks date="2023-Sep-06" author="T.Wiedebusch">
/// - MultipleReadData based on data size.
/// </remarks>
public RequestRecord CommandToMeter(Byte command, RegisterDefinition meterRegister = null,
Byte[] payload = null, Int32? expectedLength = null, Boolean hideDataInLog = false,
Byte[] payload = null, Int32 expectedLength = 4, Boolean hideDataInLog = false,
UInt16 skipRetryErrorCode = CommunicationConfig.SkipRetryErrorCode)
{
if (command == Commands.MultipleReadData && meterRegister != null && meterRegister.DataType == typeof(String))
{
var completeResponse = new List<Byte>();
//TODO THW check this including the recursive call CommandToMeter
while (true)
while (!completeResponse.Contains(0))
{
var cRecord = CommandToMeter(Commands.ReadData, meterRegister, payload, expectedLength,
hideDataInLog, skipRetryErrorCode);
var cRecord = CommandToMeter(Commands.ReadData, meterRegister, payload, 4, hideDataInLog,
skipRetryErrorCode);
var rest = ProcessRecordList();
if (rest == RequestAcknowledgeState.Ok && cRecord != null && cRecord.ResponsePayload != null)
if (rest == RequestAcknowledgeState.Ok && cRecord?.ResponsePayload != null)
{
completeResponse.AddRange(cRecord.ResponsePayload);
if (cRecord.ResponsePayload.Contains(0))
@ -614,40 +616,9 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol
cRecord.ResponsePayload = completeResponse;
OnMeterRegisterUpdated?.Invoke(this,
new RegisterUpdatedEventArgs(meterRegister, completeResponse.ToArray()));
if (expectedLength.HasValue && completeResponse.Count < expectedLength.Value)
{
_logger.Debug("Too Short. Payload contains zero");
}
return cRecord;
}
}
else
{
if (expectedLength.HasValue && completeResponse.Any() &&
completeResponse.Count < expectedLength.Value)
{
if (rest != RequestAcknowledgeState.Ok)
{
_logger.Debug($"Too Short.Request Acknowledge State is {rest}");
}
else if (cRecord == null)
{
_logger.Debug("Too Short.Record is empty or null");
}
else if (cRecord.ResponsePayload == null)
{
_logger.Debug("Too Short.ResponsePayload is empty or null");
}
else
{
_logger.Debug("Too Short.Unkown reason");
}
}
return cRecord;
}
}
}
//the minimum payload is one 4 byte chunk
@ -692,20 +663,7 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Protocols.RequestProtocol
if (command == Commands.MultipleReadData)
{
//TODO THW create expected size out of meterRegister.DataType
if (!expectedLength.HasValue)
{
if ((meterRegister.DataType == typeof(UInt64) || meterRegister.DataType == typeof(Int64)))
{
expectedLength = 8;
}
else
{
expectedLength = 24;
}
}
var numberOfChunks = (UInt16)(expectedLength.Value / chunkSize);
var numberOfChunks = (UInt16)(expectedLength / chunkSize);
if (expectedLength % chunkSize != 0)
numberOfChunks++;
requestProtocol.Add((Byte)(numberOfChunks & 0xFF));

View File

@ -43,8 +43,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
// inverse the raw value to get a readable byte order MSB left and LSB last right position
var tmpList = regRawByteArray.ToList();
// reverse the list if it is not a string
if (registerDefinition.DataType != typeof(String))
// reverse the list if it is not a string or the UInt96 or UInt128 which will be used as
// placeholder for a string
if (registerDefinition.DataType != typeof(String) &&
registerDefinition.DataType != typeof(UInt96) &&
registerDefinition.DataType != typeof(UInt128))
{
tmpList.Reverse();
}
@ -86,8 +89,11 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
// inverse the raw value to get a readable byte order MSB left and LSB last right position
var tmpList = regRawByteArray.ToList();
// reverse the list if it is not a string
if (registerDefinition.DataType != typeof(String))
// reverse the list if it is not a string or the UInt96 or UInt128 which will be used as
// placeholder for a string
if (registerDefinition.DataType != typeof(String) &&
registerDefinition.DataType != typeof(UInt96) &&
registerDefinition.DataType != typeof(UInt128))
{
tmpList.Reverse();
}
@ -248,12 +254,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
size = 3 * 4;
}
else if (registerDefinition.DataType == typeof(String) ||
registerDefinition.DataType == typeof(UInt128))
else if (registerDefinition.DataType == typeof(UInt128))
{
size = 4 * 4;
}
else if (registerDefinition.DataType == typeof(String))
{
size = 6 * 4;
}
return size;
}
@ -288,37 +298,38 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
{
return ConvertTo<UInt16>(rawByteArray).ToString();
}
if (type == typeof(UInt32))
{
return ConvertTo<UInt32>(rawByteArray).ToString();
}
if (type == typeof(UInt64))
{
return ConvertTo<UInt64>(rawByteArray).ToString();
}
if (type == typeof(Int16))
{
return ConvertTo<Int16>(rawByteArray).ToString();
}
if (type == typeof(Int32))
{
return ConvertTo<Int32>(rawByteArray).ToString();
}
if (type == typeof(Int64))
{
return ConvertTo<Int64>(rawByteArray).ToString();
}
if (type == typeof(Byte) || type == typeof(Enum8))
{
return ConvertTo<Byte>(rawByteArray).ToString();
}
//if (type == typeof(UInt96) )
//{
// return ConvertTo<UInt96>(rawByteArray).ToString();
//}
//if (type == typeof(UInt128))
//{
// return ConvertTo<UInt128>(rawByteArray).ToString();
//}
if (type == typeof(SByte))
{
return ConvertTo<SByte>(rawByteArray).ToString();
@ -371,9 +382,16 @@ namespace Xylem.Common.Hardware.WaterMeter.Genesis.Registers
{
convertedObj = BitConverter.ToUInt64(rawByteArray, 0);
}
else if (type == typeof(UInt96))
{
return default(T);
}
else if (type == typeof(UInt128))
{
return default(T);
}
else if (type == typeof(Int16))
{
convertedObj = BitConverter.ToInt16(rawByteArray, 0);
}
else if (type == typeof(Int32))

View File

@ -986,7 +986,7 @@ namespace Xylem.Common.Hardware.WaterMeter.MagFlux.MagFluxCore
/// <inheritdoc/>>
public String GetPcbId(Int32 expectedLength = 12)
public String GetPcbId()
{
if (!string.IsNullOrEmpty(PcbId) && !string.Equals("?", PcbId))
{

View File

@ -100,9 +100,8 @@ namespace Xylem.Common.Hardware.WaterMeter.WaterMeterCore
/// <summary>
/// Read the PcbId from IMeter, if device has no readable PcbId simulate one
/// </summary>
/// <param name="expectedLength"></param>
/// <returns></returns>
String GetPcbId(Int32 expectedLength = 12);
String GetPcbId();
/// <summary>
/// Open Com ports, try some communication, login

View File

@ -9,7 +9,6 @@ using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@ -19,7 +18,6 @@ using Xylem.Common.Hardware.Interfaces.Ports.PortCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisCore;
using Xylem.Common.Hardware.WaterMeter.Genesis.GenesisStatus;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers;
using Xylem.Common.Hardware.WaterMeter.Genesis.Registers.DataTypes;
using Xylem.Common.Hardware.WaterMeter.WaterMeterCore;
using Xylem.Common.Logic.ServiceCore;
using Xylem.Common.Logic.SoftwareAccessHelper;
@ -225,7 +223,8 @@ namespace Xylem.Common.Ui.GenesisToolBox
registerGridView.Sort(registerGridView.Columns["isChecked"],
ListSortDirection.Descending);
registerGridView.Columns["RawValueFile"].Visible = false;
registerGridView.Sort(registerGridView.Columns["Name"],
ListSortDirection.Ascending);
var btnHistory = new DataGridViewButtonColumn();
btnHistory.Name = "btnHistory";
@ -688,7 +687,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
try
{
Byte[] rawRegister;
rawRegister = _currentGenesis.ReadRegister(reg, RegisterConverter.SizeOf(regDef));
rawRegister = _currentGenesis.ReadRegister(reg);
//var temp = RegisterConverter.GetRegisterContent(regDef, rawRegister);
((DataRow)rowItem)["RawValue"] = RegisterConverter.GetRegisterRawText(regDef, rawRegister);
@ -768,7 +767,7 @@ namespace Xylem.Common.Ui.GenesisToolBox
regDef.RegisterDetail.Privilege.Lvl8 == Access.Rw)
{
Byte[] rawRegister;
rawRegister = _currentGenesis.ReadRegister(reg, RegisterConverter.SizeOf(regDef));
rawRegister = _currentGenesis.ReadRegister(reg);
//var temp = RegisterConverter.GetRegisterContent(regDef, rawRegister);
((DataRow)rowItem)["RawValue"] = RegisterConverter.GetRegisterRawText(regDef, rawRegister);