byte[] IGXDLMSBase.Invoke(GXDLMSSettings settings, ValueEventArgs e)
{
ImageTransferStatus = ImageTransferStatus.NotInitiated;
//Image transfer initiate
if (e.Index == 1)
{
ImageFirstNotTransferredBlockNumber = 0;
ImageTransferredBlocksStatus = "";
object[] value = (object[])e.Parameters;
string ImageIdentifier = ASCIIEncoding.ASCII.GetString((byte[])value[0]);
ImageSize = (UInt32)value[1];
ImageTransferStatus = ImageTransferStatus.TransferInitiated;
List<GXDLMSImageActivateInfo> list = new List<GXDLMSImageActivateInfo>(ImageActivateInfo);
GXDLMSImageActivateInfo item = new GXDLMSImageActivateInfo();
item.Size = ImageSize;
item.Identification = ImageIdentifier;
list.Add(item);
ImageActivateInfo = list.ToArray();
StringBuilder sb = new StringBuilder((int)ImageSize);
for (uint pos = 0; pos < ImageSize; ++pos)
{
sb.Append('0');
}
ImageTransferredBlocksStatus = sb.ToString();
return new byte[] { 0 };
}
//Image block transfer
else if (e.Index == 2)
{
object[] value = (object[])e.Parameters;
uint imageIndex = (uint)value[0];
char[] tmp = ImageTransferredBlocksStatus.ToCharArray();
tmp[(int)imageIndex] = '1';
ImageTransferredBlocksStatus = new string(tmp);
ImageFirstNotTransferredBlockNumber = imageIndex + 1;
ImageData[imageIndex] = (byte[])value[1];
ImageTransferStatus = ImageTransferStatus.TransferInitiated;
return new byte[] { 0 };
}
//Image verify
else if (e.Index == 3)
{
ImageTransferStatus = ImageTransferStatus.VerificationInitiated;
//Check that size match.
int size = 0;
foreach (KeyValuePair<uint, byte[]> it in ImageData)
{
size += it.Value.Length;
}
if (size != ImageSize)
{
//Return HW error.
ImageTransferStatus = ImageTransferStatus.VerificationFailed;
throw new Exception("Invalid image size.");
}
ImageTransferStatus = ImageTransferStatus.VerificationSuccessful;
return new byte[] { 0 };
}
//Image activate.
else if (e.Index == 4)
{
ImageTransferStatus = ImageTransferStatus.ActivationSuccessful;
return new byte[] { 0 };
}
else
{
e.Error = ErrorCode.ReadWriteDenied;
return null;
}
}