public void UpdateImage(GXDLMSImageTransfer target, byte[] data, string Identification)
{
//Check that image transfer ia enabled.
byte[] reply = ReadDataBlock(Client.Read(target, 5));
Client.UpdateValue(reply, target, 5);
if (!target.ImageTransferEnabled)
{
throw new Exception("Image transfer is not enabled");
}
//Step 1: The client gets the ImageBlockSize.
reply = ReadDataBlock(Client.Read(target, 2));
Client.UpdateValue(reply, target, 2);
// Step 2: The client initiates the Image transfer process.
ReadDataBlock(target.ImageTransferInitiate(Client, Identification, data.Length));
// Step 3: The client transfers ImageBlocks.
int ImageBlockCount;
ReadDataBlock(target.ImageBlockTransfer(Client, data, out ImageBlockCount));
//Step 4: The client checks the completeness of the Image in
//each server individually and transfers any ImageBlocks not (yet) transferred;
Client.UpdateValue(reply, target, 2);
// Step 5: The Image is verified;
ReadDataBlock(target.ImageVerify(Client));
// Step 6: Before activation, the Image is checked;
//Get list to imaages to activate.
reply = ReadDataBlock(Client.Read(target, 7));
Client.UpdateValue(reply, target, 7);
bool bFound = false;
foreach (GXDLMSImageActivateInfo it in target.ImageActivateInfo)
{
if (it.Identification == Identification)
{
bFound = true;
break;
}
}
//Read image transfer status.
reply = ReadDataBlock(Client.Read(target, 6));
Client.UpdateValue(reply, target, 6);
if (target.ImageTransferStatus != ImageTransferStatus.VerificationSuccessful)
{
throw new Exception("Image transfer status is " + target.ImageTransferStatus.ToString());
}
if (!bFound)
{
throw new Exception("Image not found.");
}
//Step 7: Activate image.
ReadDataBlock(target.ImageActivate(Client));
}