Exemple #1
0
 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);
     }
 }
Exemple #2
0
        /// <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.");
            }
        }
Exemple #3
0
 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);
     }
 }