aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-11 03:41:20 +0200
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-03-11 03:41:20 +0200
commite774f9a90fd812a9de8c3efe966a759bee8be703 (patch)
treeda7a59af6af40ff810254df9e08f6a0f5a31fe1c /Software/Visual_Studio/PPC
parenteb793f20dc078a304a423a481e5bb0eddce71471 (diff)
downloadTango-e774f9a90fd812a9de8c3efe966a759bee8be703.tar.gz
Tango-e774f9a90fd812a9de8c3efe966a759bee8be703.zip
Working on FSE/PPC performance provider.
Implemented resolution service. a lot of work!
Diffstat (limited to 'Software/Visual_Studio/PPC')
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Console/DefaultConsoleEngineService.cs22
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/DefaultPerformanceService.cs227
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/IPerformanceService.cs14
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj4
-rw-r--r--Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs3
5 files changed, 264 insertions, 6 deletions
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Console/DefaultConsoleEngineService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Console/DefaultConsoleEngineService.cs
index 42228614e..02d510a93 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Console/DefaultConsoleEngineService.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Console/DefaultConsoleEngineService.cs
@@ -4,6 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Console;
+using Tango.Console.Network;
using Tango.Core.DI;
using Tango.Integration.ExternalBridge;
using Tango.PPC.Common.ExternalBridge;
@@ -21,16 +22,27 @@ namespace Tango.PPC.Common.Console
externalBridge.RegisterRequestHandler(this);
}
- [ExternalBridgeRequestHandlerMethod(typeof(ConsoleCommandDTO))]
- public async void OnConsoleCommandReceived(ConsoleCommandDTO command, String token, ITransporter transporter)
+ [ExternalBridgeRequestHandlerMethod(typeof(GetCurrentDirectoryRequest))]
+ public async void OnGetCurrentDirectoryRequest(GetCurrentDirectoryRequest request, String token, ITransporter transporter)
+ {
+ await transporter.SendGenericResponse(new GetCurrentDirectoryResponse() { CurrentDirectory = Environment.CurrentDirectory }, token);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(ConsoleCommandRequest))]
+ public async void OnConsoleCommandRequest(ConsoleCommandRequest request, String token, ITransporter transporter)
{
if (Enabled)
{
try
{
ConsoleExecutionEngine engine = new ConsoleExecutionEngine();
- var result = await engine.Execute(command);
- await transporter.SendGenericResponse<ConsoleCommandExecutionResult>(result, token, new TransportResponseConfig()
+ var result = await engine.Execute(request);
+ await transporter.SendGenericResponse<ConsoleCommandResponse>(new ConsoleCommandResponse()
+ {
+ Output = result.Output,
+ Suggestions = result.Suggestions,
+ WorkingFolder = result.WorkingFolder
+ }, token, new TransportResponseConfig()
{
Immediate = true,
});
@@ -44,7 +56,7 @@ namespace Tango.PPC.Common.Console
public void OnReceiverDisconnected(ExternalBridgeReceiver receiver)
{
-
+
}
}
}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/DefaultPerformanceService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/DefaultPerformanceService.cs
new file mode 100644
index 000000000..700cc0d47
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/DefaultPerformanceService.cs
@@ -0,0 +1,227 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Tango.Core;
+using Tango.Core.DI;
+using Tango.Integration.ExternalBridge;
+using Tango.Integration.ExternalBridge.Network.Performance;
+using Tango.PPC.Common.ExternalBridge;
+
+namespace Tango.PPC.Common.Performance
+{
+ [TangoCreateWhenRegistered]
+ public class DefaultPerformanceService : ExtendedObject, IPerformanceService
+ {
+ #region Nested Classes
+
+ public static class PerformanceInfo
+ {
+ [DllImport("psapi.dll", SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool GetPerformanceInfo([Out] out PerformanceInformation PerformanceInformation, [In] int Size);
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct PerformanceInformation
+ {
+ public int Size;
+ public IntPtr CommitTotal;
+ public IntPtr CommitLimit;
+ public IntPtr CommitPeak;
+ public IntPtr PhysicalTotal;
+ public IntPtr PhysicalAvailable;
+ public IntPtr SystemCache;
+ public IntPtr KernelTotal;
+ public IntPtr KernelPaged;
+ public IntPtr KernelNonPaged;
+ public IntPtr PageSize;
+ public int HandlesCount;
+ public int ProcessCount;
+ public int ThreadCount;
+ }
+
+ public static Int64 GetPhysicalAvailableMemoryInMiB()
+ {
+ PerformanceInformation pi = new PerformanceInformation();
+ if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
+ {
+ return Convert.ToInt64((pi.PhysicalAvailable.ToInt64() * pi.PageSize.ToInt64() / 1048576));
+ }
+ else
+ {
+ return -1;
+ }
+
+ }
+
+ public static Int64 GetTotalMemoryInMiB()
+ {
+ PerformanceInformation pi = new PerformanceInformation();
+ if (GetPerformanceInfo(out pi, Marshal.SizeOf(pi)))
+ {
+ return Convert.ToInt64((pi.PhysicalTotal.ToInt64() * pi.PageSize.ToInt64() / 1048576));
+ }
+ else
+ {
+ return -1;
+ }
+
+ }
+ }
+
+ #endregion
+
+ private class PerformanceClient
+ {
+ public ExternalBridgeReceiver Receiver { get; set; }
+ public String Token { get; set; }
+ }
+
+ private List<PerformanceClient> _clients;
+ private PerformancePackage _package;
+ private bool _isStarted;
+ private Thread _performanceThread;
+
+ public bool Enabled { get; set; } = true;
+
+ public DefaultPerformanceService(IPPCExternalBridgeService externalBridge)
+ {
+ _package = new PerformancePackage();
+ _clients = new List<PerformanceClient>();
+ externalBridge.RegisterRequestHandler(this);
+ }
+
+ [ExternalBridgeRequestHandlerMethod(typeof(StartPerformanceUpdatesRequest))]
+ public async void OnStartPerformanceUpdatesRequest(StartPerformanceUpdatesRequest request, String token, ExternalBridgeReceiver receiver)
+ {
+ if (Enabled)
+ {
+ try
+ {
+ if (!_clients.Exists(x => x.Receiver == receiver))
+ {
+ _clients.Add(new PerformanceClient() { Receiver = receiver, Token = token });
+ OnReceiversChanged();
+ }
+
+ await receiver.SendGenericResponse(new StartPerformanceUpdatesResponse() { Package = _package }, token);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error sending performance package.");
+ }
+ }
+ }
+
+ public void OnReceiverDisconnected(ExternalBridgeReceiver receiver)
+ {
+ _clients.RemoveAll(x => x.Receiver == receiver);
+ OnReceiversChanged();
+ }
+
+ private void OnReceiversChanged()
+ {
+ if (_clients.Count > 0 && !_isStarted)
+ {
+ _isStarted = true;
+ _performanceThread = new Thread(PerformanceThreadMethod);
+ _performanceThread.IsBackground = true;
+ _performanceThread.Start();
+ }
+ else if (_clients.Count == 0 && _isStarted)
+ {
+ _isStarted = false;
+ }
+ }
+
+ private async void PerformanceThreadMethod()
+ {
+ while (_isStarted)
+ {
+ try
+ {
+ _package.ApplicationCPU = (int)GetAppCPU();
+ _package.CPU = (int)GetTotalCPU();
+ _package.ApplicationRAM = (int)BytesToMegaBytes(GetAppRam());
+ _package.RAM = (int)PerformanceInfo.GetTotalMemoryInMiB();
+ _package.MaxRAM = (int)PerformanceInfo.GetPhysicalAvailableMemoryInMiB();
+
+ DriveInfo info = new DriveInfo("C");
+ _package.DiskCapacity = (int)BytesToMegaBytes(info.TotalSize);
+ _package.AvailableDiskSpace = (int)BytesToMegaBytes(info.AvailableFreeSpace);
+ _package.DateTime = DateTime.Now;
+
+ foreach (var client in _clients.ToList())
+ {
+ try
+ {
+ await client.Receiver.SendGenericResponse(new StartPerformanceUpdatesResponse() { Package = _package }, client.Token);
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error sending performance package.");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogManager.Log(ex, "Error creating performance package.");
+ }
+
+ Thread.Sleep(2000);
+ }
+ }
+
+ #region Helpers
+
+ private float BytesToMegaBytes(long bytes)
+ {
+ return bytes / 1024f / 1024f;
+ }
+
+ public float GetAppCPU()
+ {
+ PerformanceCounter cpuCounter = new PerformanceCounter();
+ cpuCounter.CategoryName = "Process";
+ cpuCounter.CounterName = "% Processor Time";
+ cpuCounter.InstanceName = Process.GetCurrentProcess().ProcessName;
+
+ // will always start at 0
+ float firstValue = cpuCounter.NextValue();
+ System.Threading.Thread.Sleep(1000);
+ // now matches task manager reading
+ float secondValue = cpuCounter.NextValue();
+
+ return secondValue / Environment.ProcessorCount;
+ }
+
+ public float GetTotalCPU()
+ {
+ PerformanceCounter cpuCounter = new PerformanceCounter();
+ cpuCounter.CategoryName = "Processor";
+ cpuCounter.CounterName = "% Processor Time";
+ cpuCounter.InstanceName = "_Total";
+
+ // will always start at 0
+ float firstValue = cpuCounter.NextValue();
+ System.Threading.Thread.Sleep(1000);
+ // now matches task manager reading
+ float secondValue = cpuCounter.NextValue();
+
+ return secondValue;
+ }
+
+ public long GetAppRam()
+ {
+ Process proc = Process.GetCurrentProcess();
+ return proc.PrivateMemorySize64;
+ }
+
+ #endregion
+ }
+}
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/IPerformanceService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/IPerformanceService.cs
new file mode 100644
index 000000000..c3bfd1543
--- /dev/null
+++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Performance/IPerformanceService.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Integration.ExternalBridge;
+
+namespace Tango.PPC.Common.Performance
+{
+ public interface IPerformanceService : IExternalBridgeRequestHandler
+ {
+ bool Enabled { get; set; }
+ }
+}
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 f7b3f9e4c..df6b881a0 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
@@ -159,6 +159,8 @@
<Compile Include="MachineSetup\MachineSetupManager.cs" />
<Compile Include="MachineSetup\MachineSetupProgress.cs" />
<Compile Include="MachineSetup\MachineSetupResult.cs" />
+ <Compile Include="Performance\DefaultPerformanceService.cs" />
+ <Compile Include="Performance\IPerformanceService.cs" />
<Compile Include="RemoteDesktop\DefaultRemoteDesktopService.cs" />
<Compile Include="RemoteDesktop\IRemoteDesktopService.cs" />
<Compile Include="Synchronization\DefaultMachineDataSynchronizer.cs" />
@@ -437,7 +439,7 @@
</Target>
<ProjectExtensions>
<VisualStudio>
- <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" />
+ <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" />
</VisualStudio>
</ProjectExtensions>
</Project> \ No newline at end of file
diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
index a8cbcfe2d..da6c630d4 100644
--- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
+++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModelLocator.cs
@@ -20,6 +20,7 @@ using Tango.PPC.Common.Modules;
using Tango.PPC.Common.Navigation;
using Tango.PPC.Common.Notifications;
using Tango.PPC.Common.OS;
+using Tango.PPC.Common.Performance;
using Tango.PPC.Common.Printing;
using Tango.PPC.Common.RemoteAssistance;
using Tango.PPC.Common.RemoteDesktop;
@@ -82,6 +83,7 @@ namespace Tango.PPC.UI
TangoIOC.Default.Unregister<IMachineDataSynchronizer>();
TangoIOC.Default.Unregister<IConsoleEngineService>();
TangoIOC.Default.Unregister<IRemoteDesktopService>();
+ TangoIOC.Default.Unregister<IPerformanceService>();
if (App.StartupArgs.Contains("-webDebug"))
{
@@ -117,6 +119,7 @@ namespace Tango.PPC.UI
TangoIOC.Default.Register<IUnifiedWriteFilterManager, AlternativeUnifiedWriteFilterManager>();
TangoIOC.Default.Register<IOperationSystemManager, DefaultOperationSystemManager>();
TangoIOC.Default.Register<IBackupManager, DefaultBackupManager>();
+ TangoIOC.Default.Register<IPerformanceService, DefaultPerformanceService>();
TangoIOC.Default.Register<LoadingViewVM>();
TangoIOC.Default.Register<MainViewVM>();