diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-10-30 14:05:30 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-10-30 14:05:30 +0200 |
| commit | 27671ba7c2a09b201a9fe92b11bad482ab93f93f (patch) | |
| tree | fa70936d29adc9ecf0bdf6a7637c7d390d95a901 /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate | |
| parent | 50a9c8b799fd444d773d852542ec2a920e152b2c (diff) | |
| download | Tango-27671ba7c2a09b201a9fe92b11bad482ab93f93f.tar.gz Tango-27671ba7c2a09b201a9fe92b11bad482ab93f93f.zip | |
Implemented PPC rollback procedures.
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate')
| -rw-r--r-- | Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs | 4 | ||||
| -rw-r--r-- | Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs | 88 |
2 files changed, 82 insertions, 10 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs index e6c91ec10..85d61d4cc 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs @@ -26,8 +26,10 @@ namespace Tango.PPC.Common.MachineUpdate /// Performs a machine update using the specified serial number and machine service address. /// </summary> /// <param name="serialNumber">The serial number.</param> + /// <param name="setupFirmware">if set to <c>true</c> updates the embedded device firmware.</param> + /// <param name="setupFPGA">if set to <c>true</c> updates the embedded device FPGA version and other parameters.</param> /// <returns></returns> - Task<MachineUpdateResult> Update(String serialNumber); + Task<MachineUpdateResult> Update(String serialNumber, bool setupFirmware, bool setupFPGA); /// <summary> /// Performs a machine update using the specified software update package path. diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs index 64123acca..a6509bd94 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs @@ -15,6 +15,7 @@ using Tango.Core.ExtensionMethods; using Tango.Core.Helpers; using Tango.Core.IO; using Tango.Integration.Operation; +using Tango.Integration.Upgrade; using Tango.PMR.Synchronization; using Tango.PPC.Common.Application; using Tango.PPC.Common.Connection; @@ -88,15 +89,26 @@ namespace Tango.PPC.Common.MachineUpdate #region Public Methods /// <summary> - /// Performs a machine setup using the specified serial number and machine service address. + /// Performs a machine update using the specified serial number and machine service address. /// </summary> /// <param name="serialNumber">The serial number.</param> - /// <param name="machineServiceAddress">The machine service address.</param> + /// <param name="setupFirmware">if set to <c>true</c> updates the embedded device firmware.</param> + /// <param name="setupFPGA">if set to <c>true</c> updates the embedded device FPGA version and other parameters.</param> /// <returns></returns> - public async Task<MachineUpdateResult> Update(string serialNumber) + /// <exception cref="System.InvalidOperationException"> + /// Could not perform an update while the machine is not connected. + /// or + /// or + /// </exception> + /// <exception cref="System.InvalidProgramException">Database tango does not exists.</exception> + public async Task<MachineUpdateResult> Update(String serialNumber, bool setupFirmware, bool setupFPGA) { TaskCompletionSource<MachineUpdateResult> result = new TaskCompletionSource<MachineUpdateResult>(); + var localDataSource = SettingsManager.Default.GetOrCreate<CoreSettings>().DataSource; + bool performDatabaseRollback = false; + String dbBackupFile = null; + try { var machineServiceAddress = SettingsManager.Default.GetOrCreate<PPCSettings>().GetMachineServiceAddress(); @@ -112,7 +124,7 @@ namespace Tango.PPC.Common.MachineUpdate IMachineOperator op = _machineProvider.MachineOperator; - if (_machineProvider.Machine.SetupFirmware) + if (setupFirmware) { LogManager.Log("Machine is configured to update firmware..."); @@ -188,8 +200,6 @@ namespace Tango.PPC.Common.MachineUpdate //Synchronize database UpdateProgress("Updating Database", "Initializing..."); - var localDataSource = SettingsManager.Default.GetOrCreate<CoreSettings>().DataSource; - LogManager.Log($"Synchronizing database '{update_response.DataSource.ToString()}' => '{localDataSource.ToString()}'..."); UpdateProgress("Updating Database", "Connecting to local database..."); @@ -202,6 +212,25 @@ namespace Tango.PPC.Common.MachineUpdate throw new InvalidProgramException("Database tango does not exists."); } + if (setupFirmware) + { + LogManager.Log("Setup firmware is active so a database rollback procedure should be configured."); + UpdateProgress("Updating Database", "Creating database backup..."); + + try + { + Directory.CreateDirectory("C:\\Backups"); + dbBackupFile = $"C:\\Backups\\{Path.GetRandomFileName()}.bak"; + LogManager.Log($"Creating database backup to '{dbBackupFile}'..."); + await Task.Factory.StartNew(() => db.Backup(localDataSource.Catalog, dbBackupFile)); + LogManager.Log("Database backup created successfully."); + } + catch (Exception ex) + { + throw LogManager.Log(ex, "Setup manager error while trying to create a database backup."); + } + } + LogManager.Log("Disposing database manager."); db.Dispose(); @@ -242,8 +271,10 @@ namespace Tango.PPC.Common.MachineUpdate } //Updating firmware - if (_machineProvider.Machine.SetupFirmware) + if (setupFirmware) { + performDatabaseRollback = true; + UpdateProgress("Updating Firmware", "Connecting to firmware device..."); LogManager.Log(""); LogManager.Log("-------------------------------------------------------------------------"); @@ -252,11 +283,21 @@ namespace Tango.PPC.Common.MachineUpdate UpdateProgress("Updating Firmware", "Loading firmware package..."); var tfpPath = Path.Combine(_newPackageTempFolder, "firmware_package.tfp"); var stream = new FileStream(tfpPath, FileMode.Open); + + if (setupFPGA) + { + op.FirmwareUpgradeMode = FirmwareUpgradeModes.DFU | FirmwareUpgradeModes.TFP_PACKAGE; + } + else + { + op.FirmwareUpgradeMode = FirmwareUpgradeModes.DFU; + } + var handler = await op.UpgradeFirmware(stream); handler.Failed += (_, ex) => { stream.Dispose(); - result.SetException(ex); + throw ex; }; handler.Completed += (_, __) => { @@ -270,7 +311,7 @@ namespace Tango.PPC.Common.MachineUpdate handler.Canceled += (_, __) => { stream.Dispose(); - result.SetException(new Exception("The operation has been canceled.")); + throw new Exception("The operation has been canceled."); }; handler.Progress += (_, e) => { @@ -288,6 +329,35 @@ namespace Tango.PPC.Common.MachineUpdate catch (Exception ex) { LogManager.Log(ex, "An error occurred in machine update."); + + if (performDatabaseRollback) + { + LogManager.Log("Rolling back database changes..."); + + using (DbManager db = DbManager.FromDataSource(localDataSource)) + { + try + { + UpdateProgress("Rollback", "Rolling back database changes..."); + await Task.Factory.StartNew(() => db.Restore(localDataSource.Catalog, dbBackupFile)); + LogManager.Log("Database restored successfully."); + } + catch (Exception e) + { + LogManager.Log(e, "Could not rollback the database."); + throw ex; + } + finally + { + try + { + File.Delete(dbBackupFile); + } + catch { } + } + } + } + result.SetException(ex); } |
