byte[] IGXDLMSBase.Invoke(GXDLMSSettings settings, ValueEventArgs e) { //Image transfer initiate if (e.Index == 1) { ImageFirstNotTransferredBlockNumber = 0; ImageTransferredBlocksStatus = ""; object[] value = (object[])e.Parameters; byte[] imageIdentifier = (byte[])value[0]; ImageSize = (UInt32)value[1]; ImageTransferStatus = ImageTransferStatus.TransferInitiated; List <GXDLMSImageActivateInfo> list; if (ImageActivateInfo == null) { list = new List <GXDLMSImageActivateInfo>(); } else { list = new List <GXDLMSImageActivateInfo>(ImageActivateInfo); } GXDLMSImageActivateInfo item = null; foreach (GXDLMSImageActivateInfo it in list) { if (it.Identification == imageIdentifier) { item = it; break; } } if (item == null) { item = new Objects.GXDLMSImageActivateInfo(); list.Add(item); } item.Size = ImageSize; item.Identification = imageIdentifier; ImageActivateInfo = list.ToArray(); int cnt = (int)Math.Ceiling((double)ImageSize / ImageBlockSize); StringBuilder sb = new StringBuilder(cnt); for (uint pos = 0; pos < cnt; ++pos) { sb.Append('0'); } ImageTransferredBlocksStatus = sb.ToString(); return(null); } //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; ImageTransferStatus = ImageTransferStatus.TransferInitiated; return(null); } //Image verify else if (e.Index == 3) { return(null); } //Image activate. else if (e.Index == 4) { return(null); } else { e.Error = ErrorCode.ReadWriteDenied; return(null); } }
/// <summary> /// Data interface do not have any methods. /// </summary> /// <param name="index"></param> byte[][] IGXDLMSBase.Invoke(object sender, int index, Object parameters) { ImageTransferStatus = ImageTransferStatus.NotInitiated; GXDLMSServerBase s = sender as GXDLMSServerBase; //Image transfer initiate if (index == 1) { ImageFirstNotTransferredBlockNumber = 0; ImageTransferredBlocksStatus = ""; object[] value = (object[])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(s.Acknowledge(Command.MethodResponse, 0)); } //Image block transfer else if (index == 2) { object[] value = (object[])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(s.Acknowledge(Command.MethodResponse, 0)); } //Image verify else if (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(s.Acknowledge(Command.MethodResponse, 0)); } //Image activate. else if (index == 4) { ImageTransferStatus = ImageTransferStatus.ActivationSuccessful; return(s.Acknowledge(Command.MethodResponse, 0)); } else { throw new ArgumentException("Invoke failed. Invalid attribute index."); } }
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); } }