diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-12-25 12:23:34 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-12-25 12:23:34 +0200 |
| commit | 10a79597b2164b6d71d13a0c50c0fc190b322f14 (patch) | |
| tree | bc16f7b6934aea6a0f25cf8e4ed239d5e67a1a3b /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs | |
| parent | 6230a690fcfae2c51aadf4ce57d555e502fcce93 (diff) | |
| download | Tango-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.cs | 229 |
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> |
