/// <summary> /// Next step in the update firmware process for 1 micro. Send address, data bytes or end program /// </summary> /// <remarks></remarks> private void Event_UpdateFirmwareStepFinished() { //Sequence (1 byte) + address data bytes byte[] SendData = null; // //Pasar al siguiente estado // if (m_UpdateFirmwareState == UpdateFirmwareState.ClearingFlash | m_UpdateFirmwareState == UpdateFirmwareState.SendingData) { if (m_UpdateFirmwareState == UpdateFirmwareState.ClearingFlash) { m_UpdateFirmwareState = UpdateFirmwareState.SendingAddress; //Inicializa el contador de secuencia m_UpdateFirmwareSequence = (byte)0; } if (m_s19rec != null) { m_s19recAntAddress = RoutinesLibrary.Data.DataType.IntegerUtils.BytesToInt(m_s19rec.address.ToArray(), true); //is BigEndian } //No hay mas datos para leer if (!m_MicroPrograms.getNextUpdaterData(ref m_s19rec)) { m_UpdateFirmwareState = UpdateFirmwareState.EndProgramming; if (m_FramesSOLD_02 != null) { m_FramesSOLD_02.EndProgramming((byte)m_MicroUpdatingProgress); } if (m_FramesHA_02 != null) { m_FramesHA_02.EndProgramming((byte)m_MicroUpdatingProgress); } if (m_FramesSF_02 != null) { m_FramesSF_02.EndProgramming((byte)m_MicroUpdatingProgress); } if (m_FramesFE_02 != null) { m_FramesFE_02.EndProgramming((byte)m_MicroUpdatingProgress); } } } else if (m_UpdateFirmwareState == UpdateFirmwareState.SendingAddress) { m_UpdateFirmwareState = UpdateFirmwareState.SendingData; } else if (m_UpdateFirmwareState == UpdateFirmwareState.EndProgramming) { m_UpdateFirmwareState = UpdateFirmwareState.None; //Añadir micro actualizado m_MicrosPendingReset.Add((byte)m_MicroUpdatingProgress); //Actualizar siguiente micro m_MicrosPendingUpdate.Remove((byte)m_MicroUpdatingProgress); UpdateNextMicro(); } // //Enviar dato // if (m_UpdateFirmwareState == UpdateFirmwareState.SendingData) { //No es un bloque consecutivo. Enviar address if ((m_s19recAntAddress + CMicroPrograms02.BLOCK_MICRO_PROGRAM) < RoutinesLibrary.Data.DataType.IntegerUtils.BytesToInt(m_s19rec.address.ToArray(), true)) //is BigEndian { m_UpdateFirmwareState = UpdateFirmwareState.SendingAddress; } else { SendData = new byte[m_s19rec.data.ToArray().Length + 1]; SendData[0] = m_UpdateFirmwareSequence; Array.Copy(m_s19rec.data.ToArray(), 0, SendData, 1, m_s19rec.data.ToArray().Length); m_s19recAntAddress = RoutinesLibrary.Data.DataType.IntegerUtils.BytesToInt(m_s19rec.address.ToArray(), true); //is BigEndian if (m_FramesSOLD_02 != null) { m_FramesSOLD_02.DataMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesHA_02 != null) { m_FramesHA_02.DataMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesSF_02 != null) { m_FramesSF_02.DataMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesFE_02 != null) { m_FramesFE_02.DataMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } } } // //Enviar address // if (m_UpdateFirmwareState == UpdateFirmwareState.SendingAddress) { SendData = new byte[m_s19rec.address.ToArray().Length + 1]; SendData[0] = m_UpdateFirmwareSequence; Array.Copy(m_s19rec.address.ToArray(), 0, SendData, 1, m_s19rec.address.ToArray().Length); m_s19recAntAddress = RoutinesLibrary.Data.DataType.IntegerUtils.BytesToInt(m_s19rec.address.ToArray(), true); //is BigEndian if (m_FramesSOLD_02 != null) { m_FramesSOLD_02.AddressMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesHA_02 != null) { m_FramesHA_02.AddressMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesSF_02 != null) { m_FramesSF_02.AddressMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } if (m_FramesFE_02 != null) { m_FramesFE_02.AddressMemoryFlash(SendData, (byte)m_MicroUpdatingProgress); } } //Siguiente secuencia if (m_UpdateFirmwareSequence == 255) { m_UpdateFirmwareSequence = (byte)0; } else { m_UpdateFirmwareSequence += 1; } }
/// <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(); } } }