/// <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(); } } }