aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-08-12 19:00:36 +0300
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-08-12 19:00:36 +0300
commit18fc4053deb06af6643f28a6bb4fd66c6a9a93e0 (patch)
treedb2e3b344e30a95a3a09d662930ce129246a57d9 /Software/Visual_Studio/PPC
parentbbbc155a96729050b9aa7d966055726df46696af (diff)
downloadTango-18fc4053deb06af6643f28a6bb4fd66c6a9a93e0.tar.gz
Tango-18fc4053deb06af6643f28a6bb4fd66c6a9a93e0.zip
Implemented temporary DB user login for machine service machine setup.
Implemented Tango updater! Implemented support for software update on machine setup.
Diffstat (limited to 'Software/Visual_Studio/PPC')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs11
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs23
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs16
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs2
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs38
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs2
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs4
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj4
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs6
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs10
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs2
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs41
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs33
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs33
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml2
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config6
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml9
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs24
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.pngbin0 -> 2250 bytes
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml17
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs169
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs55
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs71
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx117
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs30
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings7
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj102
27 files changed, 716 insertions, 118 deletions
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 e1d06034f..aba2d2fcd 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/IPPCApplicationManager.cs
@@ -38,7 +38,7 @@ namespace Tango.PPC.Common.Application
/// <summary>
/// Occurs when machine setup is required.
/// </summary>
- event EventHandler<SetupRequiredEventArgs> SetupRequired;
+ event EventHandler SetupRequired;
/// <summary>
/// Gets a value indicating whether the application is shutting down.
@@ -51,8 +51,13 @@ namespace Tango.PPC.Common.Application
void ShutDown();
/// <summary>
- /// Gets the application version.
+ /// Gets the machine studio application version.
/// </summary>
- String Version { get; }
+ Version Version { get; }
+
+ /// <summary>
+ /// Gets the build date.
+ /// </summary>
+ String BuildDate { get; }
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs
deleted file mode 100644
index 9a545d781..000000000
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Application/SetupRequiredEventArgs.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Tango.PPC.Common.Application
-{
- public class SetupRequiredEventArgs : EventArgs
- {
- private Action _continueAction;
-
- public SetupRequiredEventArgs(Action continueAction)
- {
- _continueAction = continueAction;
- }
-
- public void Continue()
- {
- _continueAction?.Invoke();
- }
- }
-}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs
new file mode 100644
index 000000000..3b4dbf4f7
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/ApplicationStates.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.PPC.Common
+{
+ public enum ApplicationStates
+ {
+ PreSetup = 0,
+ SemiSetup = 1,
+ Default = 2,
+ Updating = 3,
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs
index 096431d63..8856bcfd4 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/IMachineSetupManager.cs
@@ -13,6 +13,6 @@ namespace Tango.PPC.Common.MachineSetup
double DownloadingPackagesProgress { get; }
String DownloadingPackagesStatus { get; }
event EventHandler<MachineSetupSteps> ProgressStep;
- Task Setup(String serialNumber, String hostAddress);
+ Task<MachineSetupResult> Setup(String serialNumber, String hostAddress);
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
index 72c6da515..01f828c3f 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupManager.cs
@@ -11,8 +11,10 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Core;
+using Tango.Core.DB;
using Tango.Core.IO;
using Tango.PMR.Synchronization;
+using Tango.PPC.Common.Application;
using Tango.Settings;
using Tango.SQLExaminer;
using Tango.Transport.Web;
@@ -21,6 +23,8 @@ namespace Tango.PPC.Common.MachineSetup
{
public class MachineSetupManager : ExtendedObject, IMachineSetupManager
{
+ private IPPCApplicationManager _applicationManager;
+
public event EventHandler<string> ProgressLog;
public event EventHandler<MachineSetupSteps> ProgressStep;
@@ -53,9 +57,14 @@ namespace Tango.PPC.Common.MachineSetup
set { _updatingPackagesStatus = value; RaisePropertyChangedAuto(); }
}
- public Task Setup(string serialNumber, string machineServiceAddress)
+ public MachineSetupManager(IPPCApplicationManager applicationManager)
{
- return Task.Factory.StartNew(() =>
+ _applicationManager = applicationManager;
+ }
+
+ public Task<MachineSetupResult> Setup(string serialNumber, string machineServiceAddress)
+ {
+ return Task.Factory.StartNew<MachineSetupResult>(() =>
{
//Connect to machine service and get matching packages for this machine.
@@ -94,15 +103,15 @@ namespace Tango.PPC.Common.MachineSetup
});
}))
{
- using (FtpClient ftp = new FtpClient(setup_response.FtpAddress, setup_response.UserName, setup_response.Password))
+ using (FtpClient ftp = new FtpClient(setup_response.FtpAddress, setup_response.FtpUserName, setup_response.FtpPassword))
{
LogManager.Log("Connecting to FTP site: " + setup_response.FtpAddress);
ftp.ConnectAsync().Wait();
LogManager.Log("Retrieving download size...");
- fileSize = (int)ftp.GetFileSize(setup_response.FilePath);
+ fileSize = (int)ftp.GetFileSize(setup_response.FtpFilePath);
LogManager.Log("Download size: " + fileSize + " bytes.");
LogManager.Log("Starting download...");
- ftp.DownloadAsync(fs, setup_response.FilePath).Wait();
+ ftp.DownloadAsync(fs, setup_response.FtpFilePath).Wait();
}
}
@@ -117,14 +126,16 @@ namespace Tango.PPC.Common.MachineSetup
String localAddress = SettingsManager.Default.GetOrCreate<CoreSettings>().DataBaseSource;
String remote_address = setup_response.DbAddress;
- DbManager db = new DbManager(new SqlConnection(String.Format("Server={0};Integrated security=SSPI", localAddress)));
+ DbManager db = DbManager.FromAddressAndName(localAddress, db_name);
if (!db.Exists(db_name))
{
throw new InvalidProgramException("Database tango does not exists.");
}
- db.ClearDb(db_name); //TODO: This is not working!
+ db.ClearDb();
+
+ db.Dispose();
ExaminerSequenceConfigurationRunner runner = new ExaminerSequenceConfigurationRunner(
Path.Combine(_newPackageTempFolder, "Synchronization Scripts", "config.xml"),
@@ -133,7 +144,9 @@ namespace Tango.PPC.Common.MachineSetup
{
Address = remote_address,
DataBaseName = db_name,
- IntegratedSecurity = true,
+ IntegratedSecurity = false,
+ UserName = setup_response.DbUserName,
+ Password = setup_response.DbPassword,
},
new ExaminerSequenceDataSource()
{
@@ -142,12 +155,12 @@ namespace Tango.PPC.Common.MachineSetup
IntegratedSecurity = true,
}, serialNumber);
- runner.Log += (x, msg) =>
+ runner.Log += (x, msg) =>
{
ProgressLog.Invoke(this, msg);
};
- runner.ScriptExecuting += (x, item) =>
+ runner.ScriptExecuting += (x, item) =>
{
if (item.Type == ExaminerSequenceItemType.Data && item.RequiresSerialNumber)
{
@@ -160,6 +173,11 @@ namespace Tango.PPC.Common.MachineSetup
};
runner.Run().Wait();
+
+ return new MachineSetupResult()
+ {
+ UpdatePackagePath = _newPackageTempFolder,
+ };
});
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs
index 5887a6d34..c459ddf50 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/MachineSetup/MachineSetupResult.cs
@@ -8,6 +8,6 @@ namespace Tango.PPC.Common.MachineSetup
{
public class MachineSetupResult
{
- public bool Completed { get; set; }
+ public String UpdatePackagePath { get; set; }
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs
index aecf93a0d..2b87e89bb 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/PPCSettings.cs
@@ -26,9 +26,9 @@ namespace Tango.PPC.Common
public List<LogCategory> LoggingCategories { get; set; }
/// <summary>
- /// Gets or sets a value indicating whether this instance has setup.
+ /// Gets or sets the state of the application.
/// </summary>
- public bool HasSetup { get; set; }
+ public ApplicationStates ApplicationState { get; set; }
/// <summary>
/// Gets the update service address.
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 aeb478a36..1214093b9 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
@@ -102,7 +102,7 @@
<Compile Include="..\..\Versioning\GlobalVersionInfo.cs">
<Link>GlobalVersionInfo.cs</Link>
</Compile>
- <Compile Include="Application\SetupRequiredEventArgs.cs" />
+ <Compile Include="ApplicationStates.cs" />
<Compile Include="Connection\DefaultMachineProvider.cs" />
<Compile Include="Connection\IMachineProvider.cs" />
<Compile Include="Connection\MachineOperatorChangedEventArgs.cs" />
@@ -280,7 +280,7 @@
</Target>
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
+ <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
</VisualStudio>
</ProjectExtensions>
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs
index 6a0f92966..d429c8935 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Publisher/MainWindowVM.cs
@@ -28,7 +28,13 @@ namespace Tango.PPC.Publisher
public class MainWindowVM : ViewModel
{
private IPPCUpdateService _client;
+
+#if DEBUG
+ private String _appPath = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\Debug\\PPC";
+#else
private String _appPath = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\Release\\PPC";
+#endif
+
private BasicHashGenerator _hashGenerator;
private List<MachineVersion> _machineVersions;
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs
index f33ca1c42..4187967dc 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/App.xaml.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Configuration;
using System.Data;
+using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@@ -20,6 +21,7 @@ namespace Tango.PPC.UI
/// </summary>
public partial class App : Application
{
+ public static String[] StartupArgs { get; private set; }
private LogManager LogManager = LogManager.Default;
/// <summary>
@@ -28,6 +30,14 @@ namespace Tango.PPC.UI
/// <param name="e">A <see cref="T:System.Windows.StartupEventArgs" /> that contains the event data.</param>
protected override void OnStartup(StartupEventArgs e)
{
+ //If no debugger is attached and the argument --debug was passed launch the debugger
+ if (e.Args.Contains("-debug") && !Debugger.IsAttached)
+ {
+ Debugger.Launch();
+ }
+
+ StartupArgs = e.Args;
+
LogManager.RegisterLogger(new VSOutputLogger());
LogManager.RegisterLogger(new FileLogger());
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs
index 181c05145..ca26b7761 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/MainWindow.xaml.cs
@@ -37,7 +37,7 @@ namespace Tango.PPC.UI
WindowStyle = WindowStyle.None;
ResizeMode = ResizeMode.NoResize;
WindowStartupLocation = WindowStartupLocation.Manual;
- Topmost = false; // sure?
+ Topmost = true; // sure?
var screens = System.Windows.Forms.Screen.AllScreens;
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs
index e75a0616c..f2fba05fe 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/PPCApplication/DefaultPPCApplicationManager.cs
@@ -53,11 +53,11 @@ namespace Tango.PPC.UI.PPCApplication
/// Gets the application version.
/// </summary>
/// <exception cref="NotImplementedException"></exception>
- public string Version
+ public Version Version
{
get
{
- throw new NotImplementedException();
+ return AssemblyHelper.GetCurrentAssemblyVersion();
}
}
@@ -102,32 +102,26 @@ namespace Tango.PPC.UI.PPCApplication
settings.Save();
}
- if (settings.HasSetup)
+ if (App.StartupArgs.Contains("-update_ok"))
+ {
+ settings.ApplicationState = ApplicationStates.Default;
+ settings.Save();
+ }
+
+ if (settings.ApplicationState == ApplicationStates.Default)
{
ObservablesEntitiesAdapter.Instance.Initialize();
}
});
- if (settings.HasSetup)
+ if (settings.ApplicationState == ApplicationStates.PreSetup || settings.ApplicationState == ApplicationStates.SemiSetup)
{
- PostSetup();
+ SetupRequired?.Invoke(this, new EventArgs());
}
else
{
- SetupRequiredEventArgs args = new SetupRequiredEventArgs(() =>
- {
- Task.Factory.StartNew(() =>
- {
- ObservablesEntitiesAdapter.Instance.Initialize();
-
- InvokeUI(() =>
- {
- PostSetup();
- });
- });
- });
- SetupRequired?.Invoke(this, args);
+ PostSetup();
}
};
}
@@ -198,7 +192,16 @@ namespace Tango.PPC.UI.PPCApplication
}
public event EventHandler Ready;
- public event EventHandler<SetupRequiredEventArgs> SetupRequired;
+ public event EventHandler SetupRequired;
public event EventHandler ContentRendered;
+
+ public String BuildDate
+ {
+ get
+ {
+ return AssemblyHelper.GetCurrentAssemblyBuildDate().ToShortDateString();
+ }
+ }
+
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs
index 2a76ba80f..77767d588 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs
@@ -26,12 +26,8 @@ namespace Tango.PPC.UI.ViewModels
/// Represents the PPC loading splash screen view model.
/// </summary>
/// <seealso cref="Tango.PPC.Common.PPCViewModel" />
- public class LoadingViewVM : PPCViewModel, INavigationObjectReceiver<MachineSetupResult>
+ public class LoadingViewVM : PPCViewModel
{
- private bool _setup;
- private SetupRequiredEventArgs _setupArgs;
- private bool _post_setup;
-
/// <summary>
/// Gets or sets the module loader.
/// </summary>
@@ -55,42 +51,17 @@ namespace Tango.PPC.UI.ViewModels
{
if (!DesignMode)
{
- applicationManager.SetupRequired += ApplicationManager_SetupRequired;
Task.Delay(1000).ContinueWith((x) => { IsLoading = true; });
}
}
- private void ApplicationManager_SetupRequired(object sender, SetupRequiredEventArgs e)
- {
- _setupArgs = e;
- _setup = true;
- NavigationManager.NavigateTo(NavigationView.MachineSetupView);
- }
-
/// <summary>
/// Called when the application has been started.
/// </summary>
public override void OnApplicationStarted()
{
IsLoading = false;
-
- if (!_setup || _post_setup)
- {
- NavigationManager.NavigateTo(NavigationView.LoginView);
- }
- }
-
- public async void OnNavigatedToWithObject(MachineSetupResult machineSetupResult)
- {
- if (machineSetupResult.Completed)
- {
- _post_setup = true;
- _setup = false;
- IsLoading = true;
-
- await Task.Delay(500);
- _setupArgs.Continue();
- }
+ NavigationManager.NavigateTo(NavigationView.LoginView);
}
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs
index 7b4016341..2877d52b3 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/MachineSetupViewVM.cs
@@ -1,11 +1,13 @@
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
using Tango.Core.Commands;
+using Tango.Core.Helpers;
using Tango.PPC.Common;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.MachineSetup;
@@ -27,9 +29,7 @@ namespace Tango.PPC.UI.ViewModels
Failed,
}
- private bool _postSetp;
-
- private SetupRequiredEventArgs _setupRequiredEventArgs;
+ private MachineSetupResult _setup_result;
public IMachineSetupManager MachineSetupManager { get; set; }
@@ -80,24 +80,9 @@ namespace Tango.PPC.UI.ViewModels
applicationManager.SetupRequired += ApplicationManager_SetupRequired;
}
- private void ApplicationManager_SetupRequired(object sender, SetupRequiredEventArgs e)
- {
- _setupRequiredEventArgs = e;
- }
-
- public override void OnApplicationStarted()
- {
- base.OnApplicationStarted();
-
- if (_postSetp)
- {
- NavigationManager.NavigateTo(Common.Navigation.NavigationView.LoginView);
- }
- }
-
- public override void OnNavigatedTo()
+ private void ApplicationManager_SetupRequired(object sender, EventArgs e)
{
- base.OnNavigatedTo();
+ NavigationManager.NavigateTo(NavigationView.MachineSetupView);
}
private void AppendLog(String msg)
@@ -117,9 +102,8 @@ namespace Tango.PPC.UI.ViewModels
try
{
- await MachineSetupManager.Setup(SerialNumber, HostAddress);
- Settings.HasSetup = true;
- _postSetp = true;
+ _setup_result = await MachineSetupManager.Setup(SerialNumber, HostAddress);
+ Settings.ApplicationState = ApplicationStates.SemiSetup;
Settings.Save();
State = MachineSetupStates.Completed;
}
@@ -132,7 +116,8 @@ namespace Tango.PPC.UI.ViewModels
private void CompleteSetup()
{
- NavigationManager.NavigateWithObject(NavigationView.LoadingView, new MachineSetupResult() { Completed = true });
+ Process.Start(AssemblyHelper.GetCurrentAssemblyFolder() + "\\Tango.PPC.Updater.exe", _setup_result.UpdatePackagePath);
+ Environment.Exit(0);
}
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml
index e300d95aa..9ff98ce52 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Views/MachineSetupView.xaml
@@ -37,7 +37,7 @@
<TextBlock>SERIAL NUMBER</TextBlock>
<touch:TouchTextBox Foreground="{StaticResource TangoGrayTextBrush}" Margin="0 10 0 0" Text="{Binding SerialNumber}" KeyboardContainer="{Binding ElementName=Container}" />
- <TextBlock Margin="0 40 0 0">HOST ADDRESS</TextBlock>
+ <TextBlock Margin="0 40 0 0">MACHINE SERVICE ADDRESS</TextBlock>
<touch:TouchTextBox Foreground="{StaticResource TangoGrayTextBrush}" Margin="0 10 0 0" Text="{Binding HostAddress}" KeyboardContainer="{Binding ElementName=Container}" />
<touch:TouchButton Margin="0 200 0 0" Padding="20" Width="300" CornerRadius="35" Command="{Binding StartCommand}">INSTALL</touch:TouchButton>
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config
new file mode 100644
index 000000000..8324aa6ff
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <startup>
+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
+ </startup>
+</configuration> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml
new file mode 100644
index 000000000..35893782c
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml
@@ -0,0 +1,9 @@
+<Application x:Class="Tango.PPC.Updater.App"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:local="clr-namespace:Tango.PPC.Updater"
+ StartupUri="MainWindow.xaml">
+ <Application.Resources>
+
+ </Application.Resources>
+</Application>
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs
new file mode 100644
index 000000000..bf390b97d
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/App.xaml.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace Tango.PPC.Updater
+{
+ /// <summary>
+ /// Interaction logic for App.xaml
+ /// </summary>
+ public partial class App : Application
+ {
+ public static String[] StartupArgs { get; private set; }
+
+ protected override void OnStartup(StartupEventArgs e)
+ {
+ StartupArgs = e.Args;
+ base.OnStartup(e);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.png b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.png
new file mode 100644
index 000000000..46446c02f
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Images/package.png
Binary files differ
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml
new file mode 100644
index 000000000..77a87d224
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml
@@ -0,0 +1,17 @@
+<Window x:Class="Tango.PPC.Updater.MainWindow"
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+ xmlns:local="clr-namespace:Tango.PPC.Updater"
+ mc:Ignorable="d"
+ WindowStyle="None" ResizeMode="NoResize" Width="800" Height="1280">
+
+ <Grid>
+ <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
+ <Image Source="/Images/package.png" Width="200" />
+ <TextBlock x:Name="txtStatus" Margin="0 100 0 0" FontSize="22" Text="Updating Tango..." HorizontalAlignment="Center"></TextBlock>
+ <ProgressBar x:Name="prog" Margin="0 30 0 0" Width="500" Height="10" Maximum="100" Value="50" BorderThickness="0" Foreground="#1c63ea"></ProgressBar>
+ </StackPanel>
+ </Grid>
+</Window>
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs
new file mode 100644
index 000000000..a1c68bd78
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/MainWindow.xaml.cs
@@ -0,0 +1,169 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Threading;
+
+namespace Tango.PPC.Updater
+{
+ /// <summary>
+ /// Interaction logic for MainWindow.xaml
+ /// </summary>
+ public partial class MainWindow : Window
+ {
+ private String _appPath = AppDomain.CurrentDomain.BaseDirectory;
+ private String _msProcessName = "Tango.PPC.UI";
+ private String _sourceFolder = App.StartupArgs.FirstOrDefault();
+
+ public MainWindow()
+ {
+ if (!Directory.Exists(_sourceFolder))
+ {
+ ShowError("This update utility can only be executed by the main Tango.");
+ Environment.Exit(0);
+ }
+
+ InitializeComponent();
+
+ WindowStyle = WindowStyle.None;
+ ResizeMode = ResizeMode.NoResize;
+ WindowStartupLocation = WindowStartupLocation.Manual;
+ Topmost = true; // sure?
+
+ var screens = System.Windows.Forms.Screen.AllScreens;
+
+ //Search for the vertical touch monitor.
+ var touch_screen = screens.Where(x => x.Bounds.Height > x.Bounds.Width).Last();
+
+ if (touch_screen != null)
+ {
+ Left = touch_screen.Bounds.Left;
+ Top = touch_screen.Bounds.Top;
+ Width = touch_screen.Bounds.Width;
+ Height = touch_screen.Bounds.Height;
+ }
+
+ ContentRendered += MainWindow_ContentRendered;
+ }
+
+ private void MainWindow_ContentRendered(object sender, EventArgs e)
+ {
+ Update();
+ }
+
+ private void Update()
+ {
+ EnsureTangoIsDown();
+ ReplaceFiles();
+ StartTango();
+ Environment.Exit(0);
+ }
+
+ private void StartTango()
+ {
+ txtStatus.Text = "Update completed. Starting application...";
+ DoEvents();
+ Thread.Sleep(1000);
+
+ Process p = new Process();
+ p.StartInfo.FileName = _appPath + "\\" + _msProcessName + ".exe";
+ p.StartInfo.LoadUserProfile = true;
+ p.StartInfo.UseShellExecute = true;
+ p.StartInfo.Arguments = "-update_ok";
+ p.Start();
+ }
+
+ private void ReplaceFiles()
+ {
+ int maxProgress = Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories).Length;
+ int progress = 0;
+
+ foreach (string dirPath in Directory.GetDirectories(_sourceFolder, "*", SearchOption.AllDirectories))
+ {
+ try
+ {
+ Directory.CreateDirectory(dirPath.Replace(_sourceFolder, _appPath));
+ }
+ catch (Exception ex)
+ {
+ ShowError("Could not create directory " + Path.GetFileName(dirPath) + Environment.NewLine + ex.Message);
+ }
+ }
+
+ foreach (string newPath in Directory.GetFiles(_sourceFolder, "*.*", SearchOption.AllDirectories))
+ {
+ try
+ {
+ txtStatus.Text = "Copying file " + Path.GetFileName(newPath);
+ DoEvents();
+
+ File.Copy(newPath, newPath.Replace(_sourceFolder, _appPath), true);
+
+ prog.Maximum = maxProgress;
+ prog.Value = progress++;
+ DoEvents();
+
+ Thread.Sleep(30);
+ }
+ catch (Exception ex)
+ {
+ if (!newPath.ToLower().Contains("updater.exe"))
+ {
+ ShowError("Could not create file " + Path.GetFileName(newPath) + Environment.NewLine + ex.Message);
+ }
+ }
+ }
+ }
+
+ private void EnsureTangoIsDown()
+ {
+ Process appProcess = null;
+
+ int tries = 0;
+
+ do
+ {
+ appProcess = Process.GetProcessesByName(_msProcessName).FirstOrDefault();
+
+ if (appProcess != null)
+ {
+ tries++;
+ appProcess.Kill();
+ Thread.Sleep(1000);
+ }
+
+ if (tries > 10)
+ {
+ ShowError("The main Tango process seems to in a frozen state. Please restart your computer and try again.");
+ Environment.Exit(0);
+ }
+
+ } while (appProcess != null);
+ }
+
+ /// <summary>
+ /// Forces UI rendering.
+ /// </summary>
+ private void DoEvents()
+ {
+ Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(delegate { }));
+ }
+
+ private void ShowError(String error)
+ {
+ MessageBox.Show(error, "Tango Update", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..499122342
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Tango.PPC.Updater")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Tango.PPC.Updater")]
+[assembly: AssemblyCopyright("Copyright © 2018")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
+//inside a <PropertyGroup>. For example, if you are using US english
+//in your source files, set the <UICulture> to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..8b92f59d7
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.Designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.PPC.Updater.Properties
+{
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources
+ {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources()
+ {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager
+ {
+ get
+ {
+ if ((resourceMan == null))
+ {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.PPC.Updater.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture
+ {
+ get
+ {
+ return resourceCulture;
+ }
+ set
+ {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx
new file mode 100644
index 000000000..af7dbebba
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..58f5a764e
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Tango.PPC.Updater.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings
new file mode 100644
index 000000000..033d7a5e9
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj
new file mode 100644
index 000000000..41b03e807
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Updater/Tango.PPC.Updater.csproj
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{D0E71A4D-9EEA-4F07-983F-EEB4416C587F}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>Tango.PPC.Updater</RootNamespace>
+ <AssemblyName>Tango.PPC.Updater</AssemblyName>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>..\..\Build\Debug\PPC\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>..\..\Build\Release\PPC\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ </ItemGroup>
+ <ItemGroup>
+ <ApplicationDefinition Include="App.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </ApplicationDefinition>
+ <Page Include="MainWindow.xaml">
+ <Generator>MSBuild:Compile</Generator>
+ <SubType>Designer</SubType>
+ </Page>
+ <Compile Include="App.xaml.cs">
+ <DependentUpon>App.xaml</DependentUpon>
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="MainWindow.xaml.cs">
+ <DependentUpon>MainWindow.xaml</DependentUpon>
+ <SubType>Code</SubType>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="App.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <Resource Include="Images\package.png" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file