- Introduced UInt128,
- Built size for readRegister from data type
This commit is contained in:
parent
ceb2943063
commit
8c9d770439
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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))
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user