From e47f736bca350350a55fa287093dad560da8f678 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Thu, 6 Dec 2018 15:48:47 +0200 Subject: Working on PPC firmware upgrade !!! --- .../Application/IPPCApplicationManager.cs | 5 ++ .../PPC/Tango.PPC.Common/ApplicationStates.cs | 8 +-- .../Connection/DefaultMachineProvider.cs | 64 ++++++++++++++++++++++ .../FirmwareUpgrade/DefaultFirmwareUpgrader.cs | 31 +++++++++++ .../FirmwareUpgrade/IFirmwareUpgrader.cs | 23 ++++++++ .../Tango.PPC.Common/Navigation/NavigationView.cs | 1 + .../PPC/Tango.PPC.Common/Tango.PPC.Common.csproj | 4 +- 7 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/DefaultFirmwareUpgrader.cs create mode 100644 Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/IFirmwareUpgrader.cs (limited to 'Software/Visual_Studio/PPC/Tango.PPC.Common') diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs index 003229e65..a1f9f6d38 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs @@ -40,6 +40,11 @@ namespace Tango.PPC.Common.Application /// event EventHandler SetupRequired; + /// + /// Occurs when firmware upgrade is required. + /// + event EventHandler FirmwareUpgradeRequired; + /// /// Occurs when the application has encountered an error when initializing. /// diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs index 7be896b0d..362b3941b 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs @@ -21,12 +21,12 @@ namespace Tango.PPC.Common /// SemiSetup = 1, /// - /// Application is ready to run as normal. + /// The application has been updated and should start in firmware upgrade mode. /// - Ready = 2, + FirmwareUpgrade = 2, /// - /// Updater utility should update the application assemblies and start the main application with startup arguments. + /// Application is ready to run as normal. /// - Updating = 3, + Ready = 3, } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs index 5b85aab52..8ca943b8c 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Connection/DefaultMachineProvider.cs @@ -118,6 +118,70 @@ namespace Tango.PPC.Common.Connection } } + public static async Task CreateMinimalMachineOperator() + { + var machineOperator = new MachineOperator(); + machineOperator.EnableDiagnostics = false; + machineOperator.EnableEmbeddedDebugging = false; + machineOperator.EnableEventsNotification = false; + machineOperator.EnableJobResume = false; + + LogManager.Default.Log("Starting machine connection procedure..."); + + var settings = SettingsManager.Default.GetOrCreate(); + + var demo = settings.DemoMode; + + if (!demo) + { + if (String.IsNullOrWhiteSpace(settings.EmbeddedComPort)) + { + TimeSpan timeout = TimeSpan.FromSeconds(SettingsManager.Default.GetOrCreate().MachineScanningTimeoutSeconds); + + LogManager.Default.Log("Scanning for machine on available serial ports..."); + Transport.Discovery.UsbCommunicationScanner scanner = new Transport.Discovery.UsbCommunicationScanner(UsbSerialBaudRates.BR_115200); + var response = await scanner.Scan(new ConnectRequest() { Password = "1234" }, timeout); + + LogManager.Default.Log("Machine discovered on port: " + response.Adapter.Address); + LogManager.Default.Log("Device Information:"); + LogManager.Default.Log(response.Response.DeviceInformation.ToJsonString()); + + LogManager.Default.Log("Disconnecting machine operator..."); + machineOperator.Adapter = response.Adapter; + machineOperator.JobHandlingMode = JobHandlerModes.SettingUp; + LogManager.Default.Log("Connecting machine operator..."); + await machineOperator.Connect(); + } + else + { + LogManager.Default.Log($"Connecting to machine on {settings.EmbeddedComPort}..."); + + UsbTransportAdapter adapter = new UsbTransportAdapter(settings.EmbeddedComPort, UsbSerialBaudRates.BR_115200); + machineOperator.Adapter = adapter; + machineOperator.JobHandlingMode = JobHandlerModes.SettingUp; + await machineOperator.Connect(); + } + } + else + { + LogManager.Default.Log("Application in demo mode!"); + + LogManager.Default.Log("Starting embedded emulator..."); + MachineEmulator emulator = new MachineEmulator(new BasicTransporter(new MemoryTransportAdapter("emulator"))); + await emulator.Start(); + + LogManager.Default.Log("Emulator started. Connecting to emulator..."); + + MemoryTransportAdapter adapter = new MemoryTransportAdapter("emulator"); + machineOperator.Adapter = adapter; + machineOperator.JobHandlingMode = JobHandlerModes.SettingUp; + LogManager.Default.Log("Connecting machine operator..."); + await machineOperator.Connect(); + } + + return machineOperator; + } + /// /// Tries to connect to the machine by scanning all available serial ports. /// The timeout for a scan cycle is specified on . diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/DefaultFirmwareUpgrader.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/DefaultFirmwareUpgrader.cs new file mode 100644 index 000000000..bc8d3d718 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/DefaultFirmwareUpgrader.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Integration.Upgrade; +using Tango.PPC.Common.Connection; + +namespace Tango.PPC.Common.FirmwareUpgrade +{ + public class DefaultFirmwareUpgrader : IFirmwareUpgrader + { + public async Task PerformUpgrade() + { + var tfpPath = Path.Combine(Core.Helpers.AssemblyHelper.GetCurrentAssemblyFolder(), "firmware_package.tfp"); + var stream = new FileStream(tfpPath, FileMode.Open); + var handler = await PerformUpgrade(stream); + handler.Failed += (_, __) => stream.Dispose(); + handler.Completed += (_, __) => stream.Dispose(); + handler.Canceled += (_, __) => stream.Dispose(); + return handler; + } + + public async Task PerformUpgrade(Stream tfpStream) + { + var op = await DefaultMachineProvider.CreateMinimalMachineOperator(); + return await op.UpgradeFirmware(tfpStream); + } + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/IFirmwareUpgrader.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/IFirmwareUpgrader.cs new file mode 100644 index 000000000..64f697833 --- /dev/null +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/FirmwareUpgrade/IFirmwareUpgrader.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Integration.Upgrade; + +namespace Tango.PPC.Common.FirmwareUpgrade +{ + public interface IFirmwareUpgrader + { + /// + /// Performs a firmware upgrade. + /// + Task PerformUpgrade(); + + /// + /// Performs a firmware upgrade from the specified TFP stream . + /// + Task PerformUpgrade(Stream tfpStream); + } +} diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs index eefb298f7..3c3a6e19b 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Navigation/NavigationView.cs @@ -17,6 +17,7 @@ namespace Tango.PPC.Common.Navigation LoginView, MachineSetupView, MachineUpdateView, + FirmwareUpgradeView, ExternalBridgeView, StorageView, HomeModule, diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj index 67e5a4548..8fe107074 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj @@ -128,6 +128,8 @@ + + @@ -325,7 +327,7 @@ - + \ No newline at end of file -- cgit v1.3.1