private static void HandleActionResponseNormal(GXDLMSSettings settings, GXReplyData data)
{
//Get Action-Result
byte ret = data.Data.GetUInt8();
if (data.Xml != null)
{
if (data.Xml
.OutputType == TranslatorOutputType.StandardXml)
{
data.Xml
.AppendStartTag(TranslatorTags.SingleResponse);
}
data.Xml.AppendLine(TranslatorTags.Result, null,
GXDLMSTranslator.ErrorCodeToString(
data.Xml.OutputType,
(ErrorCode)data.Error));
}
if (ret != 0)
{
data.Error = ret;
}
// Response normal. Get data if exists. Some meters do not return here anything.
if (data.Data.Position < data.Data.Size)
{
//Get-Data-Result
ret = data.Data.GetUInt8();
//If data.
if (ret == 0)
{
GetDataFromBlock(data.Data, 0);
}
else if (ret == 1) //Data-Access-Result
{
//Get Data-Access-Result
ret = data.Data.GetUInt8();
if (ret != 0)
{
data.Error = data.Data.GetUInt8();
//Handle Texas Instrument missing byte here.
if (ret == 9 && data.Error == 16)
{
data.Data.Position -= 2;
GetDataFromBlock(data.Data, 0);
data.Error = 0;
ret = 0;
}
}
else
{
GetDataFromBlock(data.Data, 0);
}
}
else
{
throw new GXDLMSException("parseApplicationAssociationResponse failed. Invalid tag.");
}
if (data.Xml != null)
{
data.Xml.AppendStartTag(TranslatorTags.ReturnParameters);
if (ret != 0)
{
data.Xml.AppendLine(
TranslatorTags.DataAccessError, null,
GXDLMSTranslator.ErrorCodeToString(
data.Xml.OutputType, (ErrorCode)
data.Error));
}
else
{
if (data.Error != 0)
{
data.Xml.AppendLine(TranslatorTags.Result,
null,
GXDLMSTranslator.ErrorCodeToString(
data.Xml.OutputType,
(ErrorCode)data.Error));
}
else
{
data.Xml.AppendStartTag(Command.ReadResponse,
SingleReadResponse.Data);
GXDataInfo di = new GXDataInfo();
di.xml = data.Xml;
GXCommon.GetData(settings, data.Data, di);
data.Xml.AppendEndTag(Command.ReadResponse,
SingleReadResponse.Data);
}
}
data.Xml.AppendEndTag(TranslatorTags.ReturnParameters);
if (data.Xml.OutputType == TranslatorOutputType.StandardXml)
{
data.Xml.AppendEndTag(TranslatorTags.SingleResponse);
}
}
}
}