aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2019-10-30 14:05:30 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2019-10-30 14:05:30 +0200
commit27671ba7c2a09b201a9fe92b11bad482ab93f93f (patch)
treefa70936d29adc9ecf0bdf6a7637c7d390d95a901 /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
parent50a9c8b799fd444d773d852542ec2a920e152b2c (diff)
downloadTango-27671ba7c2a09b201a9fe92b11bad482ab93f93f.tar.gz
Tango-27671ba7c2a09b201a9fe92b11bad482ab93f93f.zip
Implemented PPC rollback procedures.
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs88
1 files changed, 79 insertions, 9 deletions
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);
}