/// <summary>
        /// Initialize the update process of one micro
        /// </summary>
        private void UpdateNextMicro()
        {
            //
            //Select next micro to update
            //
            CFirmwareStation infoUpdateFirmware = null;

            m_MicroUpdatingProgress = (short)(-1);

            //Recorrer la lista de micros para encontrar el micro actualizable con la dirección más alta
            foreach (DictionaryEntry microPendingUpdateEntry in m_MicrosPendingUpdate)
            {
                //Recorrer la lista de firmwares disponibles
                foreach (CFirmwareStation infoUpdateFirmwareEntry in m_InfoUpdateFirmware)
                {
                    //Coincide el modelo de estación
                    if (((CFirmwareStation)microPendingUpdateEntry.Value).Model == infoUpdateFirmwareEntry.Model)
                    {
                        //Coincide la versión de hardware
                        if (((CFirmwareStation)microPendingUpdateEntry.Value).HardwareVersion == infoUpdateFirmwareEntry.HardwareVersion)
                        {
                            //Hemos encontrado un micro a actualizar
                            //Comprobar que se vaya a cambiar la versión de software
                            if (((CFirmwareStation)microPendingUpdateEntry.Value).SoftwareVersion != infoUpdateFirmwareEntry.SoftwareVersion)
                            {
                                //Comprobar que dirección es más alta
                                if (m_MicroUpdatingProgress < System.Convert.ToByte(microPendingUpdateEntry.Key))
                                {
                                    infoUpdateFirmware      = infoUpdateFirmwareEntry;
                                    m_MicroUpdatingProgress = System.Convert.ToByte(microPendingUpdateEntry.Key);
                                }
                            }

                            //Siguiente micro a buscar
                            break;
                        }
                    }
                }
            }

            //
            //Actualizar micro
            //

            //No hay más micros para actualizar
            if (m_MicroUpdatingProgress == -1)
            {
                //Enviar Reset a todos los micros
                foreach (byte microAddress in m_MicrosPendingReset)
                {
                    if (m_FramesSOLD_02 != null)
                    {
                        m_FramesSOLD_02.DeviceReset(microAddress);
                    }
                    if (m_FramesHA_02 != null)
                    {
                        m_FramesHA_02.DeviceReset(microAddress);
                    }
                    if (m_FramesSF_02 != null)
                    {
                        m_FramesSF_02.DeviceReset(microAddress);
                    }
                    if (m_FramesFE_02 != null)
                    {
                        m_FramesFE_02.DeviceReset(microAddress);
                    }
                }

                m_MicrosPendingUpdate = null;
                if (UpdateMicroFirmwareFinishedEvent != null)
                {
                    UpdateMicroFirmwareFinishedEvent(m_UUID);
                }
            }
            else
            {
                //Initialize variables
                m_s19rec           = null;
                m_s19recAntAddress = 0;

                string sErr = "";

                //Decrypt
                byte[] fileReader = File.ReadAllBytes(infoUpdateFirmware.FileName);
                byte[] Key        = JBC_encryption.JBC_ENCRYPTION_KEY;
                byte[] IV         = JBC_encryption.JBC_ENCRYPTION_IV;
                string decrypted  = System.Convert.ToString(RoutinesLibrary.Security.AES.DecryptStringFromBytes_AES(fileReader, Key, IV));

                //Carriage Return (0x0D AKA Char 13) and Line Feed (0x0A AKA Char 10) and remove empty lines
                string[] sTextLines = decrypted.Replace("\r", "").Split((char[])(new[] { '\n' }), StringSplitOptions.RemoveEmptyEntries);


                //Cargamos el archivo de firmware
                if (m_MicroPrograms.LoadFromData(ref sTextLines, ref sErr))
                {
                    m_MicroPrograms.initUpdaterData();

                    //Actualiza el estado
                    m_UpdateFirmwareState = UpdateFirmwareState.ClearingFlash;

                    //Borrar memoria flash
                    if (m_FramesSOLD_02 != null)
                    {
                        m_FramesSOLD_02.ClearMemoryFlash(infoUpdateFirmware.ProtocolVersion + ":" +
                                                         infoUpdateFirmware.ModelVersion + ":" +
                                                         infoUpdateFirmware.SoftwareVersion + ":" +
                                                         infoUpdateFirmware.HardwareVersion + ":B", (byte)m_MicroUpdatingProgress);
                    }
                    if (m_FramesHA_02 != null)
                    {
                        m_FramesHA_02.ClearMemoryFlash(infoUpdateFirmware.ProtocolVersion + ":" +
                                                       infoUpdateFirmware.ModelVersion + ":" +
                                                       infoUpdateFirmware.SoftwareVersion + ":" +
                                                       infoUpdateFirmware.HardwareVersion + ":B", (byte)m_MicroUpdatingProgress);
                    }
                    if (m_FramesSF_02 != null)
                    {
                        m_FramesSF_02.ClearMemoryFlash(infoUpdateFirmware.ProtocolVersion + ":" +
                                                       infoUpdateFirmware.ModelVersion + ":" +
                                                       infoUpdateFirmware.SoftwareVersion + ":" +
                                                       infoUpdateFirmware.HardwareVersion + ":B", (byte)m_MicroUpdatingProgress);
                    }
                    if (m_FramesFE_02 != null)
                    {
                        m_FramesFE_02.ClearMemoryFlash(infoUpdateFirmware.ProtocolVersion + ":" +
                                                       infoUpdateFirmware.ModelVersion + ":" +
                                                       infoUpdateFirmware.SoftwareVersion + ":" +
                                                       infoUpdateFirmware.HardwareVersion + ":B", (byte)m_MicroUpdatingProgress);
                    }

                    //No se puede cargar el archivo de firmware probamos con el siguiente micro
                }
                else
                {
                    m_MicrosPendingUpdate.Remove((byte)m_MicroUpdatingProgress);
                    UpdateNextMicro();
                }
            }
        }