aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2019-12-26 08:07:35 +0200
committerShlomo Hecht <shlomo@twine-s.com>2019-12-26 08:07:35 +0200
commit3d21d04d1dffe6fa13e64281ab004000a0ded41d (patch)
tree79bdd19a23cf57b8d0ea2d671860602cba64d204 /Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate
parente1a2dde7fe9c728dfb3247b34d89b947b4132fd2 (diff)
parent1ef776620088308e380a69271518c2c66fd673a0 (diff)
downloadTango-3d21d04d1dffe6fa13e64281ab004000a0ded41d.tar.gz
Tango-3d21d04d1dffe6fa13e64281ab004000a0ded41d.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs7
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/MachineUpdateManager.cs170
2 files changed, 175 insertions, 2 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 421b4ee54..3e3fbcc27 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineUpdate/IMachineUpdateManager.cs
@@ -54,6 +54,13 @@ namespace Tango.PPC.Common.MachineUpdate
Task<MachineUpdateResult> UpdateFromTUP(String fileName, bool setupFirmware, bool setupFPGA);
/// <summary>
+ /// Performs a firmware upgrade from the specified TFP file.
+ /// </summary>
+ /// <param name="fileName">Name of the file.</param>
+ /// <returns></returns>
+ Task UpdateFromTFP(String fileName);
+
+ /// <summary>
/// Checks if any update are available for the specified machine serial number.
/// </summary>
/// <param name="serialNumber">The serial number.</param>
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 8d6e02020..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,6 +523,66 @@ namespace Tango.PPC.Common.MachineUpdate
_isUpdating = false;
}
+ 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, 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;
+ }
+
private String GetLogsStringAndClear()
{
String logsString = String.Join(Environment.NewLine, _logs.ToList().Select(x => x.ToString()));
@@ -585,7 +651,7 @@ namespace Tango.PPC.Common.MachineUpdate
{
throw LogManager.Log(new InvalidOperationException("Could not perform an update while the machine is not connected."));
}
- if (op.Status != MachineStatuses.ReadyToDye)
+ if (!op.CanPrint)
{
throw LogManager.Log(new InvalidOperationException($"Could not perform an update while the machine is in {op.Status} status."));
}
@@ -1166,7 +1232,7 @@ namespace Tango.PPC.Common.MachineUpdate
{
throw LogManager.Log(new InvalidOperationException("Could not perform an update while the machine is not connected."));
}
- if (op.Status != MachineStatuses.ReadyToDye)
+ if (!op.CanPrint)
{
throw LogManager.Log(new InvalidOperationException($"Could not perform an update while the machine is in {op.Status} status."));
}
@@ -1404,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>