aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2019-12-25 12:23:34 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2019-12-25 12:23:34 +0200
commit10a79597b2164b6d71d13a0c50c0fc190b322f14 (patch)
treebc16f7b6934aea6a0f25cf8e4ed239d5e67a1a3b /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
parent6230a690fcfae2c51aadf4ce57d555e502fcce93 (diff)
downloadTango-10a79597b2164b6d71d13a0c50c0fc190b322f14.tar.gz
Tango-10a79597b2164b6d71d13a0c50c0fc190b322f14.zip
added offline firmware updates support.
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.cs229
1 files changed, 152 insertions, 77 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 7228c53d3..ded4d1dae 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs
@@ -252,6 +252,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.EndDate = DateTime.UtcNow;
update.FailedReason = ex.FlattenMessage();
update.FailedLog = logs;
+ db.TangoUpdates.Add(update);
await db.SaveChangesAsync();
}
}
@@ -277,6 +278,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.EndDate = DateTime.UtcNow;
update.FailedReason = ex.FlattenMessage();
update.FailedLog = logs;
+ db.TangoUpdates.Add(update);
await db.SaveChangesAsync();
}
}
@@ -362,6 +364,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.UpdateCompleted;
update.StartDate = _updateStartDate;
update.EndDate = DateTime.UtcNow;
+ db.TangoUpdates.Add(update);
await db.SaveChangesAsync();
}
}
@@ -385,6 +388,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.OfflineUpdateCompleted;
update.StartDate = _updateStartDate;
update.EndDate = DateTime.UtcNow;
+ db.TangoUpdates.Add(update);
await db.SaveChangesAsync();
}
}
@@ -461,6 +465,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.EndDate = DateTime.UtcNow;
update.FailedReason = ex.FlattenMessage();
update.FailedLog = logs;
+ db.TangoUpdates.Add(update);
db.SaveChanges();
}
}
@@ -504,6 +509,7 @@ namespace Tango.PPC.Common.MachineUpdate
update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.DatabaseCompleted;
update.StartDate = _updateStartDate;
update.EndDate = DateTime.UtcNow;
+ db.TangoUpdates.Add(update);
db.SaveChanges();
}
}
@@ -517,19 +523,63 @@ namespace Tango.PPC.Common.MachineUpdate
_isUpdating = false;
}
- private void OnFailed(Exception ex, TaskCompletionSource<object> completionSource)
+ private void OnFailed(Exception ex, TaskCompletionSource<object> completionSource, String firmwareVersion)
{
LogManager.Log(ex, "An error occurred in firmware upgrade.");
completionSource.SetException(ex);
String logs = GetLogsStringAndClear();
+
+ try
+ {
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
+ {
+ TangoUpdate update = new TangoUpdate();
+ update.ApplicationVersion = _app_manager.Version.ToString();
+ update.FirmwareVersion = firmwareVersion;
+ update.MachineGuid = _machineProvider.Machine.Guid;
+ update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.OfflineFirmwareUpgradeFailed;
+ update.StartDate = _updateStartDate;
+ update.EndDate = DateTime.UtcNow;
+ update.FailedReason = ex.FlattenMessage();
+ update.FailedLog = logs;
+ db.TangoUpdates.Add(update);
+ db.SaveChanges();
+ }
+ }
+ catch (Exception exx)
+ {
+ LogManager.Log(exx, "Error saving firmware upgrade information to database.");
+ }
+
_isUpdating = false;
}
- private void OnCompleted(TaskCompletionSource<object> completionSource)
+ private void OnCompleted(TaskCompletionSource<object> completionSource, String firmwareVersion)
{
LogManager.Log("Firmware upgrade completed successfully.");
completionSource.SetResult(true);
+
+ try
+ {
+ using (ObservablesContext db = ObservablesContext.CreateDefault())
+ {
+ TangoUpdate update = new TangoUpdate();
+ update.ApplicationVersion = _app_manager.Version.ToString();
+ update.FirmwareVersion = firmwareVersion;
+ update.MachineGuid = _machineProvider.Machine.Guid;
+ update.UpdateStatus = BL.Enumerations.TangoUpdateStatuses.OfflineFirmwareUpgradeCompleted;
+ update.StartDate = _updateStartDate;
+ update.EndDate = DateTime.UtcNow;
+ db.TangoUpdates.Add(update);
+ db.SaveChanges();
+ }
+ }
+ catch (Exception exx)
+ {
+ LogManager.Log(exx, "Error saving firmware upgrade information to database.");
+ }
+
_isUpdating = false;
}
@@ -835,81 +885,6 @@ namespace Tango.PPC.Common.MachineUpdate
return await result.Task;
}
- public async Task UpdateFromTFP(String fileName)
- {
- _updateStartDate = DateTime.UtcNow;
- _logs.Clear();
-
- TaskCompletionSource<object> result = new TaskCompletionSource<object>();
-
- try
- {
- _isUpdating = true;
-
- LogManager.Log("Verifying machine connection and state...");
-
- UpdateProgress("Verifying machine state", "Initializing...");
-
- await Task.Delay(1000);
-
- IMachineOperator op = _machineProvider.MachineOperator;
-
- if (op.State != Transport.TransportComponentState.Connected)
- {
- throw LogManager.Log(new InvalidOperationException("Could not perform a firmware upgrade while the machine is not connected."));
- }
- if (!op.CanPrint)
- {
- throw LogManager.Log(new InvalidOperationException($"Could not perform a firmware upgrade while the machine is in {op.Status} status."));
- }
-
- UpdateProgress("Updating Firmware", "Connecting to firmware device...");
- LogManager.Log("");
- LogManager.Log("-------------------------------------------------------------------------");
- LogManager.Log("Updating Firmware...");
-
- UpdateProgress("Updating Firmware", "Loading firmware package...");
- var stream = new FileStream(fileName, FileMode.Open);
-
- if (!_machineProvider.Machine.IsDemo)
- {
- op.FirmwareUpgradeMode = FirmwareUpgradeModes.DFU | FirmwareUpgradeModes.TFP_PACKAGE;
- }
- else
- {
- op.FirmwareUpgradeMode = FirmwareUpgradeModes.TFP_PACKAGE;
- }
-
- var handler = await op.UpgradeFirmware(stream);
- handler.Failed += (_, ex) =>
- {
- stream.Dispose();
- OnFailed(ex, result);
- };
- handler.Completed += (_, __) =>
- {
- UpdateProgress("Updating Firmware", "Firmware update completed successfully.");
- stream.Dispose();
- OnCompleted(result);
- };
- handler.Canceled += (_, __) =>
- {
- stream.Dispose();
- OnFailed(new Exception("The operation has been canceled."), result);
- };
- handler.Progress += (_, e) =>
- {
- UpdateProgress("Updating Firmware", e.Message, false, e.Current, e.Total);
- };
- }
- catch (Exception ex)
- {
- OnFailed(ex, result);
- }
-
- await result.Task;
- }
-
/// <summary>
/// Checks if any update are available for the specified machine serial number.
/// </summary>
@@ -1495,6 +1470,106 @@ namespace Tango.PPC.Common.MachineUpdate
}
/// <summary>
+ /// Performs a firmware upgrade from the specified TFP file.
+ /// </summary>
+ /// <param name="fileName">Name of the file.</param>
+ /// <returns></returns>
+ /// <exception cref="InvalidOperationException">
+ /// Could not perform a firmware upgrade while the machine is not connected.
+ /// or
+ /// </exception>
+ public async Task UpdateFromTFP(String fileName)
+ {
+ _updateStartDate = DateTime.UtcNow;
+ _logs.Clear();
+
+ TaskCompletionSource<object> result = new TaskCompletionSource<object>();
+
+ String version = String.Empty;
+ Stream stream = null;
+
+ try
+ {
+ _isUpdating = true;
+
+ IMachineOperator op = _machineProvider.MachineOperator;
+
+ UpdateProgress("Updating Firmware", "Loading firmware package...");
+ stream = new FileStream(fileName, FileMode.Open);
+
+ var packageInfo = await op.GetFirmwarePackageInfo(stream);
+ stream.Position = 0;
+ version = packageInfo.FileDescriptors.FirstOrDefault(x => x.Destination == PMR.FirmwareUpgrade.VersionFileDestination.Mcu)?.Version;
+
+ LogManager.Log("Verifying machine connection and state...");
+
+ UpdateProgress("Verifying machine state", "Initializing...");
+
+ await Task.Delay(1000);
+
+ if (op.State != Transport.TransportComponentState.Connected)
+ {
+ throw LogManager.Log(new InvalidOperationException("Could not perform a firmware upgrade while the machine is not connected."));
+ }
+ if (!op.CanPrint)
+ {
+ throw LogManager.Log(new InvalidOperationException($"Could not perform a firmware upgrade while the machine is in {op.Status} status."));
+ }
+
+ UpdateProgress("Updating Firmware", "Connecting to firmware device...");
+ LogManager.Log("");
+ LogManager.Log("-------------------------------------------------------------------------");
+ LogManager.Log("Updating Firmware...");
+
+ if (!_machineProvider.Machine.IsDemo)
+ {
+ op.FirmwareUpgradeMode = FirmwareUpgradeModes.DFU | FirmwareUpgradeModes.TFP_PACKAGE;
+ }
+ else
+ {
+ op.FirmwareUpgradeMode = FirmwareUpgradeModes.TFP_PACKAGE;
+ }
+
+ var handler = await op.UpgradeFirmware(stream);
+ handler.Failed += (_, ex) =>
+ {
+ stream.Dispose();
+ OnFailed(ex, result, version);
+ };
+ handler.Completed += (_, __) =>
+ {
+ UpdateProgress("Updating Firmware", "Firmware update completed successfully.");
+ stream.Dispose();
+ OnCompleted(result, version);
+ };
+ handler.Canceled += (_, __) =>
+ {
+ stream.Dispose();
+ OnFailed(new Exception("The operation has been canceled."), result, version);
+ };
+ handler.Progress += (_, e) =>
+ {
+ UpdateProgress("Updating Firmware", e.Message, false, e.Current, e.Total);
+ };
+ }
+ catch (Exception ex)
+ {
+ try
+ {
+ if (stream != null)
+ {
+ stream.Dispose();
+ }
+ }
+ catch { }
+
+ OnFailed(ex, result, version);
+ }
+
+ await result.Task;
+ }
+
+ /// <summary>
/// Gets the update package file information.
/// </summary>
/// <param name="filePath">The file path.</param>