Migrate to OrbisLib2 and use TinyIPC for broadcasting commands to instances of orbislib.
This commit is contained in:
+3
-9
@@ -18,18 +18,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Misc", "Misc", "{DBCE3AAD-3
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisNeighborHood", "Windows\OrbisNeighborHood\OrbisNeighborHood.csproj", "{81B068F7-776C-429F-BB7B-5563F75F1A39}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installer", "Installer", "{6046C772-BE17-4BC8-A362-AD8C77F9178E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisLib", "Windows\Libraries\OrbisLib\OrbisLib.csproj", "{6AE42BFE-1833-4804-96EB-38D323B6C28E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OrbisSuiteService", "Windows\OrbisSuiteService\OrbisSuiteService.csproj", "{D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OrbisSuite", "Playstation\OrbisSuite\OrbisSuite.vcxproj", "{228AA300-11F5-49B1-A6B5-4986635C6D0B}"
|
||||
EndProject
|
||||
@@ -37,15 +31,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OrbisToolbox-2.0", "Playsta
|
||||
EndProject
|
||||
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "BootstrapperSetup", "Windows\Installer\BootstrapperSetup\BootstrapperSetup.wixproj", "{0978D0B2-FFA5-42B2-81AC-0CFD85DE9184}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{A37095E9-80BD-4A6B-AF8B-33D278CF92F3} = {A37095E9-80BD-4A6B-AF8B-33D278CF92F3}
|
||||
{33C378F9-36C5-4C2C-8350-FD1C8DD5AB66} = {33C378F9-36C5-4C2C-8350-FD1C8DD5AB66}
|
||||
{A37095E9-80BD-4A6B-AF8B-33D278CF92F3} = {A37095E9-80BD-4A6B-AF8B-33D278CF92F3}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "DummyInstaller", "Windows\Installer\DummyInstaller\DummyInstaller.wixproj", "{A37095E9-80BD-4A6B-AF8B-33D278CF92F3}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} = {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF}
|
||||
{81B068F7-776C-429F-BB7B-5563F75F1A39} = {81B068F7-776C-429F-BB7B-5563F75F1A39}
|
||||
{6AE42BFE-1833-4804-96EB-38D323B6C28E} = {6AE42BFE-1833-4804-96EB-38D323B6C28E}
|
||||
{81B068F7-776C-429F-BB7B-5563F75F1A39} = {81B068F7-776C-429F-BB7B-5563F75F1A39}
|
||||
{D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF} = {D7CFB2D5-FAC2-42D5-ABA7-81CE762575EF}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetupBA", "Windows\Installer\SetupBA\SetupBA.csproj", "{33C378F9-36C5-4C2C-8350-FD1C8DD5AB66}"
|
||||
|
||||
@@ -96,7 +96,7 @@ void* SocketListener::DoWork()
|
||||
int optval = 1;
|
||||
sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_NOSIGPIPE, &optval, sizeof(optval));
|
||||
|
||||
int sock_timeout = 2000000;
|
||||
int sock_timeout = 3000000;
|
||||
sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_SNDTIMEO, &sock_timeout, sizeof(sock_timeout));
|
||||
sceNetSetsockopt(ClientSocket, ORBIS_NET_SOL_SOCKET, ORBIS_NET_SO_RCVTIMEO, &sock_timeout, sizeof(sock_timeout));
|
||||
|
||||
|
||||
@@ -22,23 +22,17 @@ void Target::HandleAPI(OrbisNetId Sock, APIPacket* Packet)
|
||||
|
||||
ChangeSystemState(SystemState::Suspend);
|
||||
|
||||
SendStatus(Sock, APIResults::API_OK);
|
||||
|
||||
break;
|
||||
|
||||
case APICommands::API_TARGET_SHUTDOWN:
|
||||
|
||||
ChangeSystemState(SystemState::Shutdown);
|
||||
|
||||
SendStatus(Sock, APIResults::API_OK);
|
||||
|
||||
break;
|
||||
|
||||
case APICommands::API_TARGET_REBOOT:
|
||||
|
||||
ChangeSystemState(SystemState::Reboot);
|
||||
|
||||
SendStatus(Sock, APIResults::API_OK);
|
||||
ChangeSystemState(SystemState::Reboot);;
|
||||
|
||||
break;
|
||||
|
||||
@@ -52,16 +46,12 @@ void Target::HandleAPI(OrbisNetId Sock, APIPacket* Packet)
|
||||
|
||||
RingBuzzer((BuzzerType)RecieveInt(Sock));
|
||||
|
||||
SendStatus(Sock, APIResults::API_OK);
|
||||
|
||||
break;
|
||||
|
||||
case APICommands::API_TARGET_SET_LED:
|
||||
|
||||
SetConsoleLED((ConsoleLEDColours)RecieveInt(Sock));
|
||||
|
||||
SendStatus(Sock, APIResults::API_OK);
|
||||
|
||||
break;
|
||||
|
||||
case APICommands::API_TARGET_DUMP_PROC:
|
||||
@@ -142,8 +132,8 @@ void Target::DoNotify(OrbisNetId Sock)
|
||||
{
|
||||
auto Packet = new TargetNotifyPacket();
|
||||
|
||||
sceNetRecv(Sock, Packet, sizeof(TargetNotifyPacket), 0);
|
||||
|
||||
auto res = sceNetRecv(Sock, Packet, sizeof(TargetNotifyPacket), 0);
|
||||
klog("%llX\n", res);
|
||||
if (!strcmp(Packet->IconURI, ""))
|
||||
Notify(Packet->Message);
|
||||
else
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#pragma once
|
||||
#define ORBISLIB_MAJOR 3
|
||||
#define ORBISLIB_MINOR 0
|
||||
#define ORBISLIB_BUILDVERSION 664
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
#if defined(_DEBUG)
|
||||
#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__)
|
||||
#else
|
||||
#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__)
|
||||
#endif
|
||||
#pragma once
|
||||
#define ORBISLIB_MAJOR 3
|
||||
#define ORBISLIB_MINOR 0
|
||||
#define ORBISLIB_BUILDVERSION 668
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
#if defined(_DEBUG)
|
||||
#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__)
|
||||
#else
|
||||
#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__)
|
||||
#endif
|
||||
|
||||
@@ -2,230 +2,102 @@
|
||||
using OrbisSuite.Common.Dispatcher;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using TinyIpc.Messaging;
|
||||
|
||||
namespace OrbisSuite
|
||||
{
|
||||
public class DispatcherClient
|
||||
{
|
||||
private OrbisLib PS4;
|
||||
private Listener? _EventListener;
|
||||
private int _Port = -1;
|
||||
private Task _HeartbeatTask;
|
||||
private CancellationToken _HeartbeatCancellationToken;
|
||||
private TinyMessageBus _ServiceMessageBus;
|
||||
|
||||
public DispatcherClient(OrbisLib PS4)
|
||||
{
|
||||
this.PS4 = PS4;
|
||||
|
||||
_HeartbeatTask = Task.Run(() => DoHeartbeat());
|
||||
_ServiceMessageBus = new TinyMessageBus("OrbisSuite");
|
||||
_ServiceMessageBus.MessageReceived += _ServiceMessageBus_MessageReceived; ;
|
||||
}
|
||||
|
||||
private void _EventListener_SocketAccepted(Socket e)
|
||||
private void _ServiceMessageBus_MessageReceived(object? sender, TinyMessageReceivedEventArgs e)
|
||||
{
|
||||
try
|
||||
var Packet = (ForwardPacket)Helpers.ByteArrayToObject(e.Message.ToArray());
|
||||
|
||||
switch (Packet.Type)
|
||||
{
|
||||
var Packet = (ForwardPacket)e.RecvObject();
|
||||
|
||||
switch (Packet.Type)
|
||||
{
|
||||
default:
|
||||
Console.WriteLine("Invalid Packet...");
|
||||
break;
|
||||
|
||||
// Debugging
|
||||
case ForwardPacket.PacketType.Print:
|
||||
PS4.DefaultTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
PS4.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.SerialCom:
|
||||
Console.Write(Encoding.UTF8.GetString(Packet.SerialCom.Data));
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.Intercept:
|
||||
PS4.DefaultTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.Continue:
|
||||
PS4.DefaultTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Process States
|
||||
case ForwardPacket.PacketType.ProcessDie:
|
||||
PS4.DefaultTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessAttach:
|
||||
PS4.DefaultTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
PS4.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessDetach:
|
||||
PS4.DefaultTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Target State
|
||||
case ForwardPacket.PacketType.TargetSuspend:
|
||||
PS4.DefaultTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetResume:
|
||||
PS4.DefaultTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetShutdown:
|
||||
PS4.DefaultTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetNewTitle:
|
||||
PS4.DefaultTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
PS4.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAvailability:
|
||||
PS4.Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAPIAvailability:
|
||||
PS4.Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
// Misc
|
||||
case ForwardPacket.PacketType.DBTouched:
|
||||
PS4.Events.FireDBTouched();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to connect to the Dispatcher.
|
||||
/// </summary>
|
||||
/// <returns>Returns true if the connection was successful.</returns>
|
||||
private bool Connect()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_Port != -1)
|
||||
{
|
||||
Console.WriteLine("[Connect] Already Connected!");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000))
|
||||
{
|
||||
Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.NewClient, System.Diagnostics.Process.GetCurrentProcess().ProcessName, -1));
|
||||
|
||||
_Port = Sock.RecvInt32();
|
||||
Sock.Close();
|
||||
|
||||
if (_Port != -1)
|
||||
{
|
||||
Console.WriteLine($"Starting up _EventListener on port { _Port }");
|
||||
_EventListener = new Listener(_Port);
|
||||
_EventListener.Start();
|
||||
_EventListener.SocketAccepted += _EventListener_SocketAccepted;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a Heart beat Packet.
|
||||
/// </summary>
|
||||
/// <returns>Returns true if the packet was sent successfully.</returns>
|
||||
private bool DoHeartBeat()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_Port == -1)
|
||||
{
|
||||
Console.WriteLine("[DoHeartBeat] Not Connected!");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000))
|
||||
{
|
||||
Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.HeartBeat, System.Diagnostics.Process.GetCurrentProcess().ProcessName, _Port));
|
||||
|
||||
var Result = Sock.RecvInt32();
|
||||
Sock.Close();
|
||||
|
||||
return (Result == 1);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Task will Send heartbeat packets to the Service. This will also ensure that we are always connected to the service.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task DoHeartbeat()
|
||||
{
|
||||
while (!Connect())
|
||||
{
|
||||
await Task.Delay(500, _HeartbeatCancellationToken);
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
|
||||
if (_Port != -1)
|
||||
Console.WriteLine("[DispatcherClient] Connection Sucessful!");
|
||||
|
||||
while (true)
|
||||
{
|
||||
await Task.Delay(5000, _HeartbeatCancellationToken);
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
default:
|
||||
Console.WriteLine("Invalid Packet...");
|
||||
break;
|
||||
|
||||
if (!DoHeartBeat())
|
||||
{
|
||||
_Port = -1;
|
||||
// Debugging
|
||||
case ForwardPacket.PacketType.Print:
|
||||
PS4.DefaultTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
PS4.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
break;
|
||||
|
||||
while (!Connect())
|
||||
{
|
||||
await Task.Delay(500, _HeartbeatCancellationToken);
|
||||
case ForwardPacket.PacketType.SerialCom:
|
||||
Console.Write(Encoding.UTF8.GetString(Packet.SerialCom.Data));
|
||||
break;
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
case ForwardPacket.PacketType.Intercept:
|
||||
PS4.DefaultTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
if (_Port != -1)
|
||||
Console.WriteLine("[DispatcherClient] Reconnection Sucessful!");
|
||||
}
|
||||
case ForwardPacket.PacketType.Continue:
|
||||
PS4.DefaultTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Process States
|
||||
case ForwardPacket.PacketType.ProcessDie:
|
||||
PS4.DefaultTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessAttach:
|
||||
PS4.DefaultTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
PS4.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessDetach:
|
||||
PS4.DefaultTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Target State
|
||||
case ForwardPacket.PacketType.TargetSuspend:
|
||||
PS4.DefaultTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetResume:
|
||||
PS4.DefaultTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetShutdown:
|
||||
PS4.DefaultTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
PS4.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetNewTitle:
|
||||
PS4.DefaultTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
PS4.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAvailability:
|
||||
PS4.Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAPIAvailability:
|
||||
PS4.Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
// Misc
|
||||
case ForwardPacket.PacketType.DBTouched:
|
||||
PS4.Events.FireDBTouched();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Nullable>annotations</Nullable>
|
||||
<RootNamespace>OrbisSuite</RootNamespace>
|
||||
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<UseWPF>true</UseWPF>
|
||||
@@ -18,6 +18,7 @@
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
|
||||
<PackageReference Include="System.Data.SQLite" Version="1.0.115.5" />
|
||||
<PackageReference Include="System.Json" Version="4.7.1" />
|
||||
<PackageReference Include="TinyIpc" Version="4.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace OrbisLib2.Common.API
|
||||
/// </summary>
|
||||
/// <param name="IPAddress">IP Address of the remote target.</param>
|
||||
/// <param name="Port">The port of the remote target.</param>
|
||||
/// <param name="TimeOut">The time we should wait before timing out.</param>
|
||||
/// <param name="TimeOut">The time we should wait before timing out represented as seconds.</param>
|
||||
/// <param name="Sock">The socket created when connecting.</param>
|
||||
/// <returns>Returns true if successful.</returns>
|
||||
private static bool Connect(string IPAddress, int Port, int TimeOut, out Socket Sock)
|
||||
@@ -26,7 +26,7 @@ namespace OrbisLib2.Common.API
|
||||
/// Makes an API call to the remote target.
|
||||
/// </summary>
|
||||
/// <param name="DesiredTarget">The desired target to recieve the command.</param>
|
||||
/// <param name="TimeOut">The time the socket should wait before timing out.</param>
|
||||
/// <param name="TimeOut">The time the socket should wait before timing out represented as seconds.</param>
|
||||
/// <param name="Command">The command to be run.</param>
|
||||
/// <param name="AdditionalCommunications">Optional lambda to send/recv additional data.</param>
|
||||
/// <returns>Returns result of the communications with the API.</returns>
|
||||
@@ -40,10 +40,7 @@ namespace OrbisLib2.Common.API
|
||||
if (Connect(DesiredTarget.IPAddress, Settings.CreateInstance().APIPort, TimeOut, out Socket Sock))
|
||||
{
|
||||
// Send Inital Packet.
|
||||
Sock.Send(Helper.StructToBytes(new APIPacket() { PacketVersion = Config.PacketVersion, Command = Command }));
|
||||
|
||||
// Get API Response.
|
||||
var result = (APIResults)Sock.RecvInt32();
|
||||
var result = SendNextPacket(Sock, new APIPacket() { PacketVersion = Config.PacketVersion, Command = Command });
|
||||
|
||||
// Call lambda for additional calls.
|
||||
if (result == APIResults.API_OK && AdditionalCommunications != null)
|
||||
|
||||
@@ -125,7 +125,7 @@ namespace OrbisLib2.Common.API
|
||||
API_ERROR_DEBUG_TO_ATTACHED,
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 40), Serializable]
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi, Size = 8), Serializable]
|
||||
public struct APIPacket
|
||||
{
|
||||
public int PacketVersion;
|
||||
@@ -310,7 +310,7 @@ namespace OrbisLib2.Common.API
|
||||
public MemoryInfo VRam;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4, CharSet = CharSet.Ansi)]
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4, Size = 2048, CharSet = CharSet.Ansi)]
|
||||
public struct TargetNotifyPacket
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
|
||||
|
||||
@@ -105,6 +105,10 @@ namespace OrbisLib2.Common.Database
|
||||
return (result > 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Duplicates this class to a new instance.
|
||||
/// </summary>
|
||||
/// <returns>Returns the new instance.</returns>
|
||||
public SavedTarget Clone()
|
||||
{
|
||||
return (SavedTarget)this.MemberwiseClone();
|
||||
|
||||
@@ -7,217 +7,92 @@ using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using TinyIpc.Messaging;
|
||||
|
||||
namespace OrbisLib2.Common.Dispatcher
|
||||
{
|
||||
public class DispatcherClient
|
||||
{
|
||||
private Listener? _EventListener;
|
||||
private int _Port = -1;
|
||||
private Task _HeartbeatTask;
|
||||
private CancellationToken _HeartbeatCancellationToken;
|
||||
|
||||
public DispatcherClient()
|
||||
{
|
||||
_HeartbeatTask = Task.Run(() => DoHeartbeat());
|
||||
}
|
||||
|
||||
private void _EventListener_SocketAccepted(Socket e)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Packet = (ForwardPacket)e.RecvObject();
|
||||
|
||||
switch (Packet.Type)
|
||||
{
|
||||
default:
|
||||
Console.WriteLine("Invalid Packet...");
|
||||
break;
|
||||
|
||||
// Debugging
|
||||
case ForwardPacket.PacketType.Print:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.SerialCom:
|
||||
// TODO:
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.Intercept:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.Continue:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Process States
|
||||
case ForwardPacket.PacketType.ProcessDie:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessAttach:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessDetach:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Target State
|
||||
case ForwardPacket.PacketType.TargetSuspend:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetResume:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetShutdown:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetNewTitle:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAvailability:
|
||||
Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAPIAvailability:
|
||||
Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
// Misc
|
||||
case ForwardPacket.PacketType.DBTouched:
|
||||
Events.FireDBTouched();
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
private static TinyMessageBus _ServiceMessageBus;
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to connect to the Dispatcher.
|
||||
/// Call this to subscribe for events from the windows service.
|
||||
/// </summary>
|
||||
/// <returns>Returns true if the connection was successful.</returns>
|
||||
private bool Connect()
|
||||
public static void Subscribe()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (_Port != -1)
|
||||
{
|
||||
Console.WriteLine("[Connect] Already Connected!");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000))
|
||||
{
|
||||
Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.NewClient, System.Diagnostics.Process.GetCurrentProcess().ProcessName, -1));
|
||||
|
||||
_Port = Sock.RecvInt32();
|
||||
Sock.Close();
|
||||
|
||||
if (_Port != -1)
|
||||
{
|
||||
Console.WriteLine($"Starting up _EventListener on port {_Port}");
|
||||
_EventListener = new Listener(_Port);
|
||||
_EventListener.Start();
|
||||
_EventListener.SocketAccepted += _EventListener_SocketAccepted;
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return false;
|
||||
_ServiceMessageBus = new TinyMessageBus("OrbisSuite");
|
||||
_ServiceMessageBus.MessageReceived += _ServiceMessageBus_MessageReceived;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a Heart beat Packet.
|
||||
/// </summary>
|
||||
/// <returns>Returns true if the packet was sent successfully.</returns>
|
||||
private bool DoHeartBeat()
|
||||
private static void _ServiceMessageBus_MessageReceived(object? sender, TinyMessageReceivedEventArgs e)
|
||||
{
|
||||
try
|
||||
var Packet = (ForwardPacket)Helper.ByteArrayToObject(e.Message.ToArray());
|
||||
|
||||
switch (Packet.Type)
|
||||
{
|
||||
if (_Port == -1)
|
||||
{
|
||||
Console.WriteLine("[DoHeartBeat] Not Connected!");
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
if (Sock.EasyConnect("127.0.0.1", Config.DispatcherPort, 1000))
|
||||
{
|
||||
Sock.SendObject(new DispatcherClientPacket(DispatcherClientPacket.PacketType.HeartBeat, System.Diagnostics.Process.GetCurrentProcess().ProcessName, _Port));
|
||||
|
||||
var Result = Sock.RecvInt32();
|
||||
Sock.Close();
|
||||
|
||||
return (Result == 1);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Task will Send heartbeat packets to the Service. This will also ensure that we are always connected to the service.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task DoHeartbeat()
|
||||
{
|
||||
while (!Connect())
|
||||
{
|
||||
await Task.Delay(500, _HeartbeatCancellationToken);
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
|
||||
if (_Port != -1)
|
||||
Console.WriteLine("[DispatcherClient] Connection Sucessful!");
|
||||
|
||||
while (true)
|
||||
{
|
||||
await Task.Delay(5000, _HeartbeatCancellationToken);
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
default:
|
||||
Console.WriteLine("Invalid Packet...");
|
||||
break;
|
||||
|
||||
if (!DoHeartBeat())
|
||||
{
|
||||
_Port = -1;
|
||||
// Debugging
|
||||
case ForwardPacket.PacketType.Print:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcPrintEvent(Packet.SenderIPAddress, Packet.Print.Sender, Packet.Print.Data);
|
||||
break;
|
||||
|
||||
while (!Connect())
|
||||
{
|
||||
await Task.Delay(500, _HeartbeatCancellationToken);
|
||||
case ForwardPacket.PacketType.SerialCom:
|
||||
// TODO:
|
||||
break;
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
case ForwardPacket.PacketType.Intercept:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcInterceptEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
if (_Port != -1)
|
||||
Console.WriteLine("[DispatcherClient] Reconnection Sucessful!");
|
||||
}
|
||||
case ForwardPacket.PacketType.Continue:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcContinueEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Process States
|
||||
case ForwardPacket.PacketType.ProcessDie:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcDieEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessAttach:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcAttachEvent(Packet.SenderIPAddress, Packet.ProcessName);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.ProcessDetach:
|
||||
TargetManager.SelectedTarget.Events.RaiseProcDetachEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
// Target State
|
||||
case ForwardPacket.PacketType.TargetSuspend:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetSuspendEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetResume:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetResumeEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetShutdown:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetShutdownEvent(Packet.SenderIPAddress);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetNewTitle:
|
||||
TargetManager.SelectedTarget.Events.RaiseTargetNewTitleEvent(Packet.SenderIPAddress, Packet.TitleChange.TitleID);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAvailability:
|
||||
Events.FireTargetAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
case ForwardPacket.PacketType.TargetAPIAvailability:
|
||||
Events.FireTargetAPIAvailability(Packet.TargetAvailability.Available, Packet.TargetAvailability.Name);
|
||||
break;
|
||||
|
||||
// Misc
|
||||
case ForwardPacket.PacketType.DBTouched:
|
||||
Events.FireDBTouched();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace OrbisLib2.Common.Helpers
|
||||
/// <returns></returns>
|
||||
public static bool EasyConnect(this Socket s, string IPAddress, int Port, int TimeOut)
|
||||
{
|
||||
s.ReceiveTimeout = s.SendTimeout = TimeOut;
|
||||
s.ReceiveTimeout = s.SendTimeout = TimeOut * 1000;
|
||||
var result = s.BeginConnect(IPAddress, Port, null, null);
|
||||
|
||||
result.AsyncWaitHandle.WaitOne(3000, true);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
// This file is used by Code Analysis to maintain SuppressMessage
|
||||
// attributes that are applied to this project.
|
||||
// Project-level suppressions either have no target or are given
|
||||
// a specific target and scoped to a namespace, type, member, etc.
|
||||
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
|
||||
[assembly: SuppressMessage("Interoperability", "CA1416:Validate platform compatibility", Justification = "<Pending>", Scope = "member", Target = "~M:OrbisLib2.Common.Dispatcher.DispatcherClient.Subscribe")]
|
||||
@@ -12,6 +12,7 @@
|
||||
<PackageReference Include="sqlite-net-pcl" Version="1.8.116" />
|
||||
<PackageReference Include="System.Data.SQLite" Version="1.0.117" />
|
||||
<PackageReference Include="System.Json" Version="4.7.1" />
|
||||
<PackageReference Include="TinyIpc" Version="4.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
var AppList = new List<AppInfo>();
|
||||
|
||||
var result = API.SendCommand(Target, 5000, APICommands.API_APPS_GET_LIST, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(Target, 5, APICommands.API_APPS_GET_LIST, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Get the number of apps installed.
|
||||
int Count = Sock.RecvInt32();
|
||||
@@ -71,7 +71,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
var resultBuffer = new byte[200];
|
||||
var result = API.SendCommand(Target, 5000, APICommands.API_APPS_GET_INFO_STR, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(Target, 5, APICommands.API_APPS_GET_INFO_STR, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
Sock.Send(Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray());
|
||||
@@ -94,7 +94,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
AppState result = AppState.STATE_ERROR;
|
||||
API.SendCommand(Target, 5000, APICommands.API_APPS_STATUS, (Socket Sock, APIResults Result) =>
|
||||
API.SendCommand(Target, 5, APICommands.API_APPS_STATUS, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray();
|
||||
@@ -116,7 +116,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
API.SendCommand(Target, 5000, APICommands.APP_START, (Socket Sock, APIResults Result) =>
|
||||
API.SendCommand(Target, 5, APICommands.API_APPS_START, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray();
|
||||
@@ -138,7 +138,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
API.SendCommand(Target, 5000, APICommands.API_APPS_STOP, (Socket Sock, APIResults Result) =>
|
||||
API.SendCommand(Target, 5, APICommands.API_APPS_STOP, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray();
|
||||
@@ -160,7 +160,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
API.SendCommand(Target, 5000, APICommands.API_APPS_SUSPEND, (Socket Sock, APIResults Result) =>
|
||||
API.SendCommand(Target, 5, APICommands.API_APPS_SUSPEND, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray();
|
||||
@@ -182,7 +182,7 @@ namespace OrbisLib2.Targets
|
||||
}
|
||||
|
||||
int result = 0;
|
||||
API.SendCommand(Target, 5000, APICommands.API_APPS_RESUME, (Socket Sock, APIResults Result) =>
|
||||
API.SendCommand(Target, 5, APICommands.API_APPS_RESUME, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
// Send the titleId of the app.
|
||||
var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray();
|
||||
|
||||
@@ -12,7 +12,20 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
public class Target
|
||||
{
|
||||
private SavedTarget _SavedTarget;
|
||||
private int _SavedTargetId = 0;
|
||||
|
||||
public SavedTarget SavedTarget
|
||||
{
|
||||
get
|
||||
{
|
||||
var savedTarget = SavedTarget.FindTarget(x => x.Id == _SavedTargetId);
|
||||
|
||||
if (savedTarget == null)
|
||||
savedTarget = new SavedTarget();
|
||||
|
||||
return savedTarget;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Weather or not this is our default target to be selected on start up.
|
||||
@@ -21,12 +34,7 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SavedTarget.IsDefault;
|
||||
}
|
||||
set
|
||||
{
|
||||
_SavedTarget.IsDefault = value;
|
||||
_SavedTarget.Save();
|
||||
return SavedTarget.IsDefault;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,12 +45,7 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SavedTarget.Name;
|
||||
}
|
||||
set
|
||||
{
|
||||
_SavedTarget.Name = value;
|
||||
_SavedTarget.Save();
|
||||
return SavedTarget.Name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,12 +56,7 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SavedTarget.IPAddress;
|
||||
}
|
||||
set
|
||||
{
|
||||
_SavedTarget.IPAddress = value;
|
||||
_SavedTarget.Save();
|
||||
return SavedTarget.IPAddress;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,20 +67,16 @@ namespace OrbisLib2.Targets
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SavedTarget.PayloadPort;
|
||||
}
|
||||
set
|
||||
{
|
||||
_SavedTarget.PayloadPort = value;
|
||||
_SavedTarget.Save();
|
||||
return SavedTarget.PayloadPort;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public TargetInfo Info
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SavedTarget.Info;
|
||||
return SavedTarget.Info;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +89,7 @@ namespace OrbisLib2.Targets
|
||||
|
||||
public Target(SavedTarget SavedTarget)
|
||||
{
|
||||
_SavedTarget = SavedTarget;
|
||||
_SavedTargetId = SavedTarget.Id;
|
||||
|
||||
Events = new TargetEvents(this);
|
||||
// Debug = new Debug(this);
|
||||
@@ -105,25 +99,31 @@ namespace OrbisLib2.Targets
|
||||
Application = new Application(this);
|
||||
}
|
||||
|
||||
public Target Clone()
|
||||
{
|
||||
return new Target(SavedTarget.Clone());
|
||||
}
|
||||
|
||||
public bool Shutdown()
|
||||
{
|
||||
return API.SendCommand(this, 3000, APICommands.API_TARGET_SHUTDOWN) == APIResults.API_OK;
|
||||
return API.SendCommand(this, 5, APICommands.API_TARGET_SHUTDOWN) == APIResults.API_OK;
|
||||
}
|
||||
|
||||
public bool Reboot()
|
||||
{
|
||||
return API.SendCommand(this, 3000, APICommands.API_TARGET_REBOOT) == APIResults.API_OK;
|
||||
return API.SendCommand(this, 5, APICommands.API_TARGET_REBOOT) == APIResults.API_OK;
|
||||
}
|
||||
|
||||
public bool Suspend()
|
||||
{
|
||||
return API.SendCommand(this, 3000, APICommands.API_TARGET_RESTMODE) == APIResults.API_OK;
|
||||
return API.SendCommand(this, 5, APICommands.API_TARGET_RESTMODE) == APIResults.API_OK;
|
||||
}
|
||||
|
||||
public bool Notify(string Message)
|
||||
{
|
||||
var result = API.SendCommand(this, 3000, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(this, 5, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
Console.WriteLine($"Message: {Message}");
|
||||
Result = API.SendNextPacket(Sock, new TargetNotifyPacket() { Message = Message });
|
||||
});
|
||||
|
||||
@@ -132,7 +132,7 @@ namespace OrbisLib2.Targets
|
||||
|
||||
public bool Notify(string IconURI, string Message)
|
||||
{
|
||||
var result = API.SendCommand(this, 3000, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(this, 5, APICommands.API_TARGET_NOTIFY, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
Result = API.SendNextPacket(Sock, new TargetNotifyPacket() { IconURI = IconURI, Message = Message });
|
||||
});
|
||||
@@ -142,7 +142,7 @@ namespace OrbisLib2.Targets
|
||||
|
||||
public bool Buzzer(BuzzerType Type)
|
||||
{
|
||||
var result = API.SendCommand(this, 3000, APICommands.API_TARGET_BUZZER, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(this, 5, APICommands.API_TARGET_BUZZER, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
Result = API.SendInt32(Sock, (int)Type);
|
||||
});
|
||||
@@ -152,7 +152,7 @@ namespace OrbisLib2.Targets
|
||||
|
||||
public bool SetLED(ConsoleLEDColours Colour)
|
||||
{
|
||||
var result = API.SendCommand(this, 3000, APICommands.API_TARGET_SET_LED, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(this, 5, APICommands.API_TARGET_SET_LED, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
Result = API.SendInt32(Sock, (int)Colour);
|
||||
});
|
||||
@@ -162,7 +162,7 @@ namespace OrbisLib2.Targets
|
||||
|
||||
public bool SetSettings(bool ShowDebugTitleIdLabel, bool ShowDevkitPanel, bool ShowDebugSettings, bool ShowAppHome)
|
||||
{
|
||||
var result = API.SendCommand(this, 3000, APICommands.API_TARGET_SET_SETTINGS, (Socket Sock, APIResults Result) =>
|
||||
var result = API.SendCommand(this, 5, APICommands.API_TARGET_SET_SETTINGS, (Socket Sock, APIResults Result) =>
|
||||
{
|
||||
Result = API.SendNextPacket(Sock, new TargetSettingsPacket()
|
||||
{
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace OrbisLib2.Targets
|
||||
get
|
||||
{
|
||||
// Set initially as the default target.
|
||||
if (SelectedTarget == null)
|
||||
if (_SelectedTarget == null)
|
||||
{
|
||||
var defaultTarget = SavedTarget.FindDefaultTarget();
|
||||
|
||||
@@ -103,19 +103,19 @@ namespace OrbisLib2.Targets
|
||||
/// <summary>
|
||||
/// Updates extended information about the Target. *Requires the Target to be on and the API running.
|
||||
/// </summary>
|
||||
/// <param name="TargetName">The name of the target to update.</param>
|
||||
/// <param name="savedTarget">The identifier of the target to update.</param>
|
||||
/// <returns>Returns weather or not the action was successful or not.</returns>
|
||||
public static bool UpdateTargetInfo(string TargetName)
|
||||
public static bool UpdateTargetInfo(SavedTarget savedTarget)
|
||||
{
|
||||
Target? Target = GetTarget(TargetName);
|
||||
var Target = GetTarget(savedTarget.Name);
|
||||
if (Target == null)
|
||||
{
|
||||
Console.WriteLine($"Couldn't Find Target \"{TargetName}\".");
|
||||
Console.WriteLine($"Couldn't Find Target \"{savedTarget.Name}\".");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool labdaReult = false;
|
||||
var result = API.SendCommand(Target, 3000, APICommands.API_TARGET_INFO, (Sock, Result) =>
|
||||
var result = API.SendCommand(Target, 5, APICommands.API_TARGET_INFO, (Sock, Result) =>
|
||||
{
|
||||
var Packet = new TargetInfoPacket();
|
||||
var RawPacket = new byte[Marshal.SizeOf(Packet)];
|
||||
@@ -131,45 +131,45 @@ namespace OrbisLib2.Targets
|
||||
if (Packet.ConsoleName == null || Packet.ConsoleName == string.Empty)
|
||||
return;
|
||||
|
||||
Target.Info.SDKVersion = $"{(Packet.SDKVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SDKVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.SDKVersion & 0xFFF).ToString("X3")}";
|
||||
Target.Info.SoftwareVersion = $"{(Packet.SoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SoftwareVersion >> 16 & 0xFF).ToString("X2")}";
|
||||
Target.Info.FactorySoftwareVersion = $"{(Packet.FactorySoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.FactorySoftwareVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.FactorySoftwareVersion & 0xFFF).ToString("X3")}";
|
||||
Target.Info.CurrentTitleID = Packet.CurrentTitleID;
|
||||
Target.Info.ConsoleName = Packet.ConsoleName;
|
||||
Target.Info.MotherboardSerial = Packet.MotherboardSerial;
|
||||
Target.Info.Serial = Packet.Serial;
|
||||
Target.Info.Model = Packet.Model;
|
||||
Target.Info.MACAddressLAN = Packet.MACAddressLAN.ToUpper();
|
||||
Target.Info.MACAddressWIFI = Packet.MACAddressWIFI.ToUpper();
|
||||
Target.Info.UART = Packet.UART > 0;
|
||||
Target.Info.IDUMode = Packet.IDUMode > 0;
|
||||
Target.Info.IDPS = BitConverter.ToString(Packet.IDPS).Replace("-", string.Empty);
|
||||
Target.Info.PSID = BitConverter.ToString(Packet.PSID).Replace("-", string.Empty);
|
||||
Target.Info.ConsoleType = (ConsoleType)Packet.ConsoleType;
|
||||
savedTarget.Info.SDKVersion = $"{(Packet.SDKVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SDKVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.SDKVersion & 0xFFF).ToString("X3")}";
|
||||
savedTarget.Info.SoftwareVersion = $"{(Packet.SoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.SoftwareVersion >> 16 & 0xFF).ToString("X2")}";
|
||||
savedTarget.Info.FactorySoftwareVersion = $"{(Packet.FactorySoftwareVersion >> 24 & 0xFF).ToString("X1")}.{(Packet.FactorySoftwareVersion >> 12 & 0xFFF).ToString("X3")}.{(Packet.FactorySoftwareVersion & 0xFFF).ToString("X3")}";
|
||||
savedTarget.Info.CurrentTitleID = Packet.CurrentTitleID;
|
||||
savedTarget.Info.ConsoleName = Packet.ConsoleName;
|
||||
savedTarget.Info.MotherboardSerial = Packet.MotherboardSerial;
|
||||
savedTarget.Info.Serial = Packet.Serial;
|
||||
savedTarget.Info.Model = Packet.Model;
|
||||
savedTarget.Info.MACAddressLAN = Packet.MACAddressLAN.ToUpper();
|
||||
savedTarget.Info.MACAddressWIFI = Packet.MACAddressWIFI.ToUpper();
|
||||
savedTarget.Info.UART = Packet.UART > 0;
|
||||
savedTarget.Info.IDUMode = Packet.IDUMode > 0;
|
||||
savedTarget.Info.IDPS = BitConverter.ToString(Packet.IDPS).Replace("-", string.Empty);
|
||||
savedTarget.Info.PSID = BitConverter.ToString(Packet.PSID).Replace("-", string.Empty);
|
||||
savedTarget.Info.ConsoleType = (ConsoleType)Packet.ConsoleType;
|
||||
|
||||
// Debugging.
|
||||
Target.Info.IsAttached = Packet.Attached > 0;
|
||||
savedTarget.Info.IsAttached = Packet.Attached > 0;
|
||||
// TODO: Implement this into the API.
|
||||
Target.Info.CurrentProcessId = 0;// TODO: Update this to process Id Packet.CurrentProc;
|
||||
savedTarget.Info.CurrentProcessId = 0;// TODO: Update this to process Id Packet.CurrentProc;
|
||||
|
||||
// Storage.
|
||||
Target.Info.HDDUsedSpace = (long)(Packet.TotalSpace - Packet.FreeSpace);
|
||||
Target.Info.HDDFreeSpace = (long)Packet.FreeSpace;
|
||||
Target.Info.HDDTotalSpace = (long)Packet.TotalSpace;
|
||||
savedTarget.Info.HDDUsedSpace = (long)(Packet.TotalSpace - Packet.FreeSpace);
|
||||
savedTarget.Info.HDDFreeSpace = (long)Packet.FreeSpace;
|
||||
savedTarget.Info.HDDTotalSpace = (long)Packet.TotalSpace;
|
||||
|
||||
// Perf Stats.
|
||||
Target.Info.CPUTemp = Packet.CPUTemp;
|
||||
Target.Info.SOCTemp = Packet.SOCTemp;
|
||||
Target.Info.ThreadCount = Packet.ThreadCount;
|
||||
Target.Info.AverageCPUUsage = Packet.AverageCPUUsage;
|
||||
Target.Info.BusyCore = Packet.BusyCore;
|
||||
Target.Info.RamUsage = Packet.Ram.Used;
|
||||
Target.Info.VRamUsage = Packet.VRam.Used;
|
||||
savedTarget.Info.CPUTemp = Packet.CPUTemp;
|
||||
savedTarget.Info.SOCTemp = Packet.SOCTemp;
|
||||
savedTarget.Info.ThreadCount = Packet.ThreadCount;
|
||||
savedTarget.Info.AverageCPUUsage = Packet.AverageCPUUsage;
|
||||
savedTarget.Info.BusyCore = Packet.BusyCore;
|
||||
savedTarget.Info.RamUsage = Packet.Ram.Used;
|
||||
savedTarget.Info.VRamUsage = Packet.VRam.Used;
|
||||
|
||||
labdaReult = true;
|
||||
});
|
||||
|
||||
return result == APIResults.API_OK && labdaReult && Target.Info.Save();
|
||||
return result == APIResults.API_OK && labdaReult && savedTarget.Info.Save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Common;
|
||||
using OrbisLib2.Common.API;
|
||||
using OrbisLib2.General;
|
||||
using OrbisLib2.Targets;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
@@ -72,7 +73,7 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
// Get Current App status.
|
||||
var newAppState = currentTarget.Application.GetAppState(App.TitleId);
|
||||
@@ -133,7 +134,7 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
if (AppState == AppState.STATE_RUNNING || AppState == AppState.STATE_SUSPENDED)
|
||||
{
|
||||
currentTarget.Application.Stop(App.TitleId);
|
||||
@@ -149,7 +150,7 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
if (AppState == AppState.STATE_SUSPENDED)
|
||||
{
|
||||
currentTarget.Application.Resume(App.TitleId);
|
||||
|
||||
@@ -1,21 +1,14 @@
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Common.Database;
|
||||
using OrbisLib2.Common.Database.Types;
|
||||
using OrbisLib2.General;
|
||||
using OrbisLib2.Targets;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
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.Shapes;
|
||||
|
||||
namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
@@ -28,8 +21,8 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
OrbisLib.Instance.Events.DBTouched += Events_DBTouched;
|
||||
OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
Events.DBTouched += Events_DBTouched;
|
||||
Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
RefreshTarget();
|
||||
}
|
||||
|
||||
@@ -45,11 +38,11 @@ namespace OrbisNeighborHood.Controls
|
||||
|
||||
private void RefreshTarget()
|
||||
{
|
||||
var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info;
|
||||
var CurrentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
if (CurrentTarget != null)
|
||||
{
|
||||
switch (CurrentTarget.Details.Status)
|
||||
switch (CurrentTarget.Info.Status)
|
||||
{
|
||||
case TargetStatusType.Offline:
|
||||
CurrentTargetState.Fill = new SolidColorBrush(Color.FromRgb(255, 0, 0));
|
||||
@@ -74,7 +67,7 @@ namespace OrbisNeighborHood.Controls
|
||||
|
||||
CurrentTargetName.Text = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name;
|
||||
|
||||
if (CurrentTarget.Details.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}"))
|
||||
if (CurrentTarget.Info.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}"))
|
||||
{
|
||||
CurrentTargetTitleName.Text = "Unknown Title";
|
||||
CurrentTargetTitleId.Text = "-";
|
||||
@@ -82,7 +75,7 @@ namespace OrbisNeighborHood.Controls
|
||||
}
|
||||
else
|
||||
{
|
||||
var Title = new TMDB(CurrentTarget.Details.CurrentTitleID);
|
||||
var Title = new TMDB(CurrentTarget.Info.CurrentTitleID);
|
||||
Regex rgx = new Regex(@"[^0-9a-zA-Z +.:']");
|
||||
CurrentTargetTitleName.Text = Title.Names.First();
|
||||
CurrentTargetTitleId.Text = Title.NPTitleID;
|
||||
@@ -94,11 +87,11 @@ namespace OrbisNeighborHood.Controls
|
||||
|
||||
private void CurrentTargetTitleImage_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info;
|
||||
var CurrentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
if (CurrentTarget != null && CurrentTarget.Details.CurrentTitleID != null && Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}"))
|
||||
if (CurrentTarget != null && CurrentTarget.Info.CurrentTitleID != null && Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}"))
|
||||
{
|
||||
var Title = new TMDB(CurrentTarget.Details.CurrentTitleID);
|
||||
var Title = new TMDB(CurrentTarget.Info.CurrentTitleID);
|
||||
var url = $"https://store.playstation.com/product/{Title.ContentID}/";
|
||||
|
||||
System.Diagnostics.Process.Start(new ProcessStartInfo
|
||||
|
||||
@@ -1,20 +1,8 @@
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
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.Shapes;
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Dialog;
|
||||
|
||||
namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
|
||||
@@ -1,24 +1,18 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
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.Shapes;
|
||||
using Microsoft.Win32;
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Common.Database;
|
||||
using SimpleUI.Controls;
|
||||
using OrbisLib2.Common.Database.Types;
|
||||
using OrbisLib2.Common.API;
|
||||
using OrbisLib2.Targets;
|
||||
using OrbisLib2.Common.Database;
|
||||
|
||||
namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
@@ -36,24 +30,31 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
_thisTarget = OrbisLib.Instance.Targets[TargetName];
|
||||
_thisTargetInfo = _thisTarget.Info;
|
||||
_thisTarget = TargetManager.GetTarget(TargetName);
|
||||
if(_thisTarget != null )
|
||||
{
|
||||
_thisTargetInfo = _thisTarget.Info;
|
||||
|
||||
this.TargetName = _thisTarget.Info.Name;
|
||||
TargetStatus = _thisTarget.Info.Details.Status;
|
||||
ConsoleModel = _thisTarget.Info.Details.ModelType;
|
||||
IsDefault = _thisTarget.Info.IsDefault;
|
||||
FirmwareVersion = _thisTarget.Info.Details.SoftwareVersion;
|
||||
SDKVersion = _thisTarget.Info.Details.SDKVersion;
|
||||
IPAddress = _thisTarget.Info.IPAddress;
|
||||
ConsoleName = _thisTarget.Info.Details.ConsoleName;
|
||||
PayloadPort = _thisTarget.Info.PayloadPort.ToString();
|
||||
this.TargetName = _thisTarget.Name;
|
||||
TargetStatus = _thisTarget.Info.Status;
|
||||
ConsoleModel = _thisTarget.Info.ModelType;
|
||||
IsDefault = _thisTarget.IsDefault;
|
||||
FirmwareVersion = _thisTarget.Info.SoftwareVersion;
|
||||
SDKVersion = _thisTarget.Info.SDKVersion;
|
||||
IPAddress = _thisTarget.IPAddress;
|
||||
ConsoleName = _thisTarget.Info.ConsoleName;
|
||||
PayloadPort = _thisTarget.PayloadPort.ToString();
|
||||
|
||||
LocateTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable;
|
||||
SendPayload.IsEnabled = _thisTarget.Info.Details.IsAvailable;
|
||||
RestartTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable;
|
||||
ShutdownTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable;
|
||||
SuspendTarget.IsEnabled = _thisTarget.Info.Details.IsAPIAvailable;
|
||||
LocateTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable;
|
||||
SendPayload.IsEnabled = _thisTarget.Info.IsAvailable;
|
||||
RestartTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable;
|
||||
ShutdownTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable;
|
||||
SuspendTarget.IsEnabled = _thisTarget.Info.IsAPIAvailable;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("TargetPanel(): Target not found when it should have been!");
|
||||
}
|
||||
}
|
||||
|
||||
#region Properties
|
||||
@@ -211,7 +212,7 @@ namespace OrbisNeighborHood.Controls
|
||||
var result = SimpleMessageBox.ShowWarning(Window.GetWindow(this), "Are you sure you want to delete this target?", "Delete this Target?", SimpleUI.SimpleMessageBoxButton.YesNo);
|
||||
if(result == SimpleUI.SimpleMessageBoxResult.Yes)
|
||||
{
|
||||
_thisTargetInfo.Remove();
|
||||
TargetManager.DeleteTarget(_thisTarget.Name);
|
||||
TargetChanged?.Invoke(this, e);
|
||||
}
|
||||
}
|
||||
@@ -222,7 +223,7 @@ namespace OrbisNeighborHood.Controls
|
||||
{
|
||||
var editTargetViewModel = MainViewModel.Instance.EditTargetVM;
|
||||
editTargetViewModel.TargetChanged += EditTargetVM_TargetChanged;
|
||||
editTargetViewModel.CurrentTarget = _thisTargetInfo.Clone();
|
||||
editTargetViewModel.CurrentTarget = _thisTarget.SavedTarget.Clone();
|
||||
editTargetViewModel.CallingVM = MainViewModel.Instance.TargetVM;
|
||||
MainViewModel.Instance.CurrentView = editTargetViewModel;
|
||||
}
|
||||
@@ -235,17 +236,18 @@ namespace OrbisNeighborHood.Controls
|
||||
|
||||
private void DefaultTargetElement_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
if (!_thisTargetInfo.IsDefault)
|
||||
var savedTarget = _thisTarget.SavedTarget;
|
||||
if (!savedTarget.IsDefault)
|
||||
{
|
||||
_thisTargetInfo.IsDefault = true;
|
||||
_thisTargetInfo.Save();
|
||||
savedTarget.IsDefault = true;
|
||||
savedTarget.Save();
|
||||
TargetChanged?.Invoke(this, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void LocateTarget_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
_thisTarget.Buzzer(OrbisSuite.Common.BuzzerType.RingThree);
|
||||
_thisTarget.Buzzer(BuzzerType.RingThree);
|
||||
}
|
||||
|
||||
private void SendPayload_Click(object sender, RoutedEventArgs e)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using OrbisNeighborHood.Controls;
|
||||
using OrbisSuite;
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows;
|
||||
@@ -7,8 +6,9 @@ using System.Windows.Controls;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Linq;
|
||||
using OrbisLib2.Targets;
|
||||
using OrbisLib2.General;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
@@ -50,8 +50,8 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
OrbisLib.Instance.Events.DBTouched += Events_DBTouched;
|
||||
OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
Events.DBTouched += Events_DBTouched;
|
||||
Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
|
||||
// Refresh the info about the current target.
|
||||
RefreshTargetInfo();
|
||||
@@ -96,7 +96,7 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
|
||||
private void RefreshTargetInfo()
|
||||
{
|
||||
var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info;
|
||||
var CurrentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
if (CurrentTarget != null)
|
||||
{
|
||||
@@ -112,7 +112,7 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
|
||||
public void AddApp(string appCachePath, AppInfo App)
|
||||
{
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
// Make sure the titleId format is correct. Helps weed out bad entries and folders.
|
||||
if (!Regex.IsMatch(App.TitleId, @"[a-zA-Z]{4}\d{5}"))
|
||||
@@ -144,7 +144,7 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
}
|
||||
|
||||
// Cache icon0.png for app if we have not already.
|
||||
if (!File.Exists(Path.Combine(currentAppPath, "icon0.png")) && !string.IsNullOrEmpty(App.MetaDataPath) && currentTarget.Info.Details.IsAvailable) //TODO: Maybe add a isFTPAvailable.
|
||||
if (!File.Exists(Path.Combine(currentAppPath, "icon0.png")) && !string.IsNullOrEmpty(App.MetaDataPath) && currentTarget.Info.IsAvailable) //TODO: Maybe add a isFTPAvailable.
|
||||
{
|
||||
currentTarget.FTP.DownloadFile($"{App.MetaDataPath}/icon0.png", Path.Combine(currentAppPath, "icon0.png"));
|
||||
}
|
||||
@@ -173,11 +173,11 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
Dispatcher.Invoke(() => AppList.Items.Clear());
|
||||
|
||||
// Make sure we have a target we can pull the db from.
|
||||
if (OrbisLib.Instance.TargetManagement.TargetList == null)
|
||||
if (TargetManager.Targets.Count <= 0)
|
||||
return;
|
||||
|
||||
// Make sure the Target is online so we can pull the db.
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
if (currentTarget == null)
|
||||
{
|
||||
Console.WriteLine("No current target we can use to load apps.");
|
||||
@@ -206,12 +206,12 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
try
|
||||
{
|
||||
// Make sure we have a target we can pull the db from.
|
||||
if (OrbisLib.Instance.TargetManagement.TargetList == null)
|
||||
if (TargetManager.Targets.Count <= 0)
|
||||
continue;
|
||||
|
||||
// Make sure the Target is online so we can pull the db.
|
||||
var currentTarget = OrbisLib.Instance.SelectedTarget;
|
||||
if (currentTarget == null || !currentTarget.Info.Details.IsAvailable)
|
||||
var currentTarget = TargetManager.SelectedTarget;
|
||||
if (currentTarget == null || !currentTarget.Info.IsAvailable)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1,23 +1,14 @@
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Common.Database;
|
||||
using OrbisLib2.Common.Database.Types;
|
||||
using OrbisLib2.General;
|
||||
using OrbisLib2.Targets;
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
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.Shapes;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
@@ -32,8 +23,8 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
OrbisLib.Instance.Events.DBTouched += Events_DBTouched;
|
||||
OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
Events.DBTouched += Events_DBTouched;
|
||||
Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
|
||||
RefreshTargetInfo();
|
||||
}
|
||||
@@ -196,39 +187,39 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
|
||||
private void RefreshTargetInfo()
|
||||
{
|
||||
var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info;
|
||||
var CurrentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
if (CurrentTarget != null)
|
||||
{
|
||||
TitleString = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name;
|
||||
TargetName = CurrentTarget.IsDefault ? $"★{CurrentTarget.Name}" : CurrentTarget.Name;
|
||||
TargetStatus = CurrentTarget.Details.Status;
|
||||
FirmwareVersion = CurrentTarget.Details.SoftwareVersion;
|
||||
SDKVersion = CurrentTarget.Details.SDKVersion;
|
||||
TargetStatus = CurrentTarget.Info.Status;
|
||||
FirmwareVersion = CurrentTarget.Info.SoftwareVersion;
|
||||
SDKVersion = CurrentTarget.Info.SDKVersion;
|
||||
IPAddress = CurrentTarget.IPAddress;
|
||||
ConsoleName = CurrentTarget.Details.ConsoleName;
|
||||
ConsoleName = CurrentTarget.Info.ConsoleName;
|
||||
PayloadPort = CurrentTarget.PayloadPort.ToString();
|
||||
|
||||
// Storage Stats.
|
||||
HDDFreeSpace = Utilities.BytesToString(CurrentTarget.Details.HDDFreeSpace);
|
||||
HDDUsedSpace = Utilities.BytesToString(CurrentTarget.Details.HDDUsedSpace);
|
||||
HDDTotalSpace = Utilities.BytesToString(CurrentTarget.Details.HDDTotalSpace);
|
||||
HDDFreeSpace = Utilities.BytesToString(CurrentTarget.Info.HDDFreeSpace);
|
||||
HDDUsedSpace = Utilities.BytesToString(CurrentTarget.Info.HDDUsedSpace);
|
||||
HDDTotalSpace = Utilities.BytesToString(CurrentTarget.Info.HDDTotalSpace);
|
||||
|
||||
if (CurrentTarget.Details.HDDTotalSpace != 0)
|
||||
StorageUsagePercentage = (int)(((double)CurrentTarget.Details.HDDUsedSpace / (double)CurrentTarget.Details.HDDTotalSpace) * 100.0);
|
||||
if (CurrentTarget.Info.HDDTotalSpace != 0)
|
||||
StorageUsagePercentage = (int)(((double)CurrentTarget.Info.HDDUsedSpace / (double)CurrentTarget.Info.HDDTotalSpace) * 100.0);
|
||||
else
|
||||
StorageUsagePercentage = 0;
|
||||
|
||||
// System Stats.
|
||||
CPUTemp = $"{CurrentTarget.Details.CPUTemp} °C";
|
||||
SOCTemp = $"{CurrentTarget.Details.SOCTemp} °C";
|
||||
ThreadCount = CurrentTarget.Details.ThreadCount;
|
||||
AverageCPUUsage = CurrentTarget.Details.AverageCPUUsage;
|
||||
TopCore = $"Core {CurrentTarget.Details.BusyCore}";
|
||||
RamUsage = $"{CurrentTarget.Details.RamUsage} MB";
|
||||
VRamUsage = $"{CurrentTarget.Details.VRamUsage} MB";
|
||||
CPUTemp = $"{CurrentTarget.Info.CPUTemp} °C";
|
||||
SOCTemp = $"{CurrentTarget.Info.SOCTemp} °C";
|
||||
ThreadCount = CurrentTarget.Info.ThreadCount;
|
||||
AverageCPUUsage = CurrentTarget.Info.AverageCPUUsage;
|
||||
TopCore = $"Core {CurrentTarget.Info.BusyCore}";
|
||||
RamUsage = $"{CurrentTarget.Info.RamUsage} MB";
|
||||
VRamUsage = $"{CurrentTarget.Info.VRamUsage} MB";
|
||||
|
||||
if (CurrentTarget.Details.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Details.CurrentTitleID, @"CUSA\d{5}"))
|
||||
if (CurrentTarget.Info.CurrentTitleID == null || !Regex.IsMatch(CurrentTarget.Info.CurrentTitleID, @"CUSA\d{5}"))
|
||||
{
|
||||
TitleName = "Unknown Title";
|
||||
TitleId = "-";
|
||||
@@ -237,7 +228,7 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
}
|
||||
else
|
||||
{
|
||||
var Title = new TMDB(CurrentTarget.Details.CurrentTitleID);
|
||||
var Title = new TMDB(CurrentTarget.Info.CurrentTitleID);
|
||||
Regex rgx = new Regex(@"[^0-9a-zA-Z +.:']");
|
||||
TitleName = Title.Names.First();
|
||||
TitleId = Title.NPTitleID;
|
||||
@@ -254,12 +245,12 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
|
||||
private void EditButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var CurrentTarget = OrbisLib.Instance.SelectedTarget.Info;
|
||||
var CurrentTarget = TargetManager.SelectedTarget;
|
||||
|
||||
if (MainViewModel.Instance != null)
|
||||
{
|
||||
var editTargetViewModel = MainViewModel.Instance.EditTargetVM;
|
||||
editTargetViewModel.CurrentTarget = CurrentTarget.Clone();
|
||||
editTargetViewModel.CurrentTarget = CurrentTarget.SavedTarget.Clone();
|
||||
editTargetViewModel.CallingVM = MainViewModel.Instance.DashboardHomeVM;
|
||||
MainViewModel.Instance.CurrentView = editTargetViewModel;
|
||||
}
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
using OrbisSuite.Common.Database;
|
||||
using SimpleUI.Skins;
|
||||
using SimpleUI.Skins;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Text.RegularExpressions;
|
||||
using OrbisLib2.Common.Database;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
|
||||
@@ -1,23 +1,11 @@
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisLib2.Common.Database;
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisNeighborHood.MVVM.ViewModel.SubView;
|
||||
using OrbisSuite.Common.Database;
|
||||
using SimpleUI.Controls;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
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.Animation;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
{
|
||||
@@ -26,7 +14,7 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
/// </summary>
|
||||
public partial class AddTargetView : UserControl
|
||||
{
|
||||
private TargetInfo _newTarget;
|
||||
private SavedTarget _newTarget;
|
||||
|
||||
#region Constructor
|
||||
|
||||
@@ -34,7 +22,7 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
_newTarget = new TargetInfo();
|
||||
_newTarget = new SavedTarget();
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -103,50 +91,50 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
private void ShowTitleIdLabels_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _newTarget.Details.ShowTitleId;
|
||||
Switch.IsToggled = _newTarget.Info.ShowTitleId;
|
||||
|
||||
}
|
||||
|
||||
private void ShowTitleIdLabels_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_newTarget.Details.ShowTitleId = Switch.IsToggled;
|
||||
_newTarget.Info.ShowTitleId = Switch.IsToggled;
|
||||
}
|
||||
|
||||
private void ShowDevkitPanel_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _newTarget.Details.ShowDevkitPanel;
|
||||
Switch.IsToggled = _newTarget.Info.ShowDevkitPanel;
|
||||
}
|
||||
|
||||
private void ShowDevkitPanel_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_newTarget.Details.ShowDevkitPanel = Switch.IsToggled;
|
||||
_newTarget.Info.ShowDevkitPanel = Switch.IsToggled;
|
||||
}
|
||||
|
||||
private void ShowToolboxShortcut_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _newTarget.Details.ShowToolboxShortcut;
|
||||
Switch.IsToggled = _newTarget.Info.ShowToolboxShortcut;
|
||||
}
|
||||
|
||||
private void ShowToolboxShortcut_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_newTarget.Details.ShowToolboxShortcut = Switch.IsToggled;
|
||||
_newTarget.Info.ShowToolboxShortcut = Switch.IsToggled;
|
||||
}
|
||||
|
||||
private void ShowAppHome_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _newTarget.Details.ShowAppHome;
|
||||
Switch.IsToggled = _newTarget.Info.ShowAppHome;
|
||||
}
|
||||
|
||||
private void ShowAppHome_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_newTarget.Details.ShowAppHome = Switch.IsToggled;
|
||||
_newTarget.Info.ShowAppHome = Switch.IsToggled;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,23 +1,12 @@
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisLib2.Common.Database;
|
||||
using OrbisLib2.Targets;
|
||||
using OrbisNeighborHood.MVVM.ViewModel;
|
||||
using OrbisNeighborHood.MVVM.ViewModel.SubView;
|
||||
using OrbisSuite;
|
||||
using OrbisSuite.Common.Database;
|
||||
using SimpleUI.Controls;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
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.Shapes;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
{
|
||||
@@ -26,11 +15,10 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
/// </summary>
|
||||
public partial class EditTargetView : UserControl
|
||||
{
|
||||
private TargetInfo _thisTarget;
|
||||
private SavedTarget _thisTarget;
|
||||
public EditTargetView()
|
||||
{
|
||||
InitializeComponent();
|
||||
_thisTarget = new TargetInfo();
|
||||
}
|
||||
|
||||
#region Target Info
|
||||
@@ -97,62 +85,74 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
private void ShowTitleIdLabels_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _thisTarget.Details.ShowTitleId;
|
||||
Switch.IsToggled = _thisTarget.Info.ShowTitleId;
|
||||
|
||||
}
|
||||
|
||||
private void ShowTitleIdLabels_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_thisTarget.Details.ShowTitleId = Switch.IsToggled;
|
||||
_thisTarget.Info.ShowTitleId = Switch.IsToggled;
|
||||
|
||||
var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name];
|
||||
currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome);
|
||||
var currentTarget = TargetManager.GetTarget(_thisTarget.Name);
|
||||
if(currentTarget != null)
|
||||
{
|
||||
currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome);
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowDevkitPanel_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _thisTarget.Details.ShowDevkitPanel;
|
||||
Switch.IsToggled = _thisTarget.Info.ShowDevkitPanel;
|
||||
}
|
||||
|
||||
private void ShowDevkitPanel_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_thisTarget.Details.ShowDevkitPanel = Switch.IsToggled;
|
||||
_thisTarget.Info.ShowDevkitPanel = Switch.IsToggled;
|
||||
|
||||
var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name];
|
||||
currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome);
|
||||
var currentTarget = TargetManager.GetTarget(_thisTarget.Name);
|
||||
if (currentTarget != null)
|
||||
{
|
||||
currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome);
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowToolboxShortcut_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _thisTarget.Details.ShowToolboxShortcut;
|
||||
Switch.IsToggled = _thisTarget.Info.ShowToolboxShortcut;
|
||||
}
|
||||
|
||||
private void ShowToolboxShortcut_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_thisTarget.Details.ShowToolboxShortcut = Switch.IsToggled;
|
||||
_thisTarget.Info.ShowToolboxShortcut = Switch.IsToggled;
|
||||
|
||||
var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name];
|
||||
currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome);
|
||||
var currentTarget = TargetManager.GetTarget(_thisTarget.Name);
|
||||
if (currentTarget != null)
|
||||
{
|
||||
currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome);
|
||||
}
|
||||
}
|
||||
|
||||
private void ShowAppHome_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
Switch.IsToggled = _thisTarget.Details.ShowAppHome;
|
||||
Switch.IsToggled = _thisTarget.Info.ShowAppHome;
|
||||
}
|
||||
|
||||
private void ShowAppHome_MouseDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
var Switch = (SimpleSwitch)sender;
|
||||
_thisTarget.Details.ShowAppHome = Switch.IsToggled;
|
||||
_thisTarget.Info.ShowAppHome = Switch.IsToggled;
|
||||
|
||||
var currentTarget = OrbisLib.Instance.Targets[_thisTarget.Name];
|
||||
currentTarget.SetSettings(_thisTarget.Details.ShowTitleId, _thisTarget.Details.ShowDevkitPanel, _thisTarget.Details.ShowToolboxShortcut, _thisTarget.Details.ShowAppHome);
|
||||
var currentTarget = TargetManager.GetTarget(_thisTarget.Name);
|
||||
if (currentTarget != null)
|
||||
{
|
||||
currentTarget.SetSettings(_thisTarget.Info.ShowTitleId, _thisTarget.Info.ShowDevkitPanel, _thisTarget.Info.ShowToolboxShortcut, _thisTarget.Info.ShowAppHome);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -220,7 +220,8 @@ namespace OrbisNeighborHood.MVVM.View.SubView
|
||||
var dc = ((EditTargetViewModel)DataContext);
|
||||
if (dc == null || dc.CurrentTarget == null)
|
||||
{
|
||||
_thisTarget = new TargetInfo();
|
||||
// Abort
|
||||
MainViewModel.Instance.CurrentView = MainViewModel.Instance.DashboardHomeVM;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
using OrbisNeighborHood.Controls;
|
||||
using System.Windows.Controls;
|
||||
using OrbisSuite;
|
||||
using System;
|
||||
using OrbisLib2.General;
|
||||
using OrbisLib2.Targets;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
@@ -17,8 +17,8 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
InitializeComponent();
|
||||
RefreshTargets();
|
||||
|
||||
OrbisLib.Instance.Events.DBTouched += Events_DBTouched;
|
||||
OrbisLib.Instance.Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
Events.DBTouched += Events_DBTouched;
|
||||
Events.TargetStateChanged += Events_TargetStateChanged;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -46,15 +46,16 @@ namespace OrbisNeighborHood.MVVM.View
|
||||
{
|
||||
TargetList.Items.Clear();
|
||||
|
||||
if (OrbisLib.Instance.TargetManagement.TargetList == null)
|
||||
return;
|
||||
|
||||
foreach (var Target in OrbisLib.Instance.TargetManagement.TargetList)
|
||||
if (TargetManager.Targets.Count > 0)
|
||||
{
|
||||
var targetView = new TargetPanel(Target.Name);
|
||||
targetView.TargetChanged += Target_TargetChanged;
|
||||
TargetList.Items.Add(targetView);
|
||||
foreach (var Target in TargetManager.Targets)
|
||||
{
|
||||
var targetView = new TargetPanel(Target.Name);
|
||||
targetView.TargetChanged += Target_TargetChanged;
|
||||
TargetList.Items.Add(targetView);
|
||||
}
|
||||
}
|
||||
|
||||
var newTargetView = new NewTargetPanel();
|
||||
newTargetView.TargetChanged += Target_TargetChanged;
|
||||
TargetList.Items.Add(newTargetView);
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
using OrbisNeighborHood.MVVM.View.SubView;
|
||||
using OrbisSuite.Common.Database;
|
||||
using OrbisLib2.Common.Database;
|
||||
using OrbisLib2.Targets;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace OrbisNeighborHood.MVVM.ViewModel.SubView
|
||||
@@ -29,7 +25,7 @@ namespace OrbisNeighborHood.MVVM.ViewModel.SubView
|
||||
|
||||
#region Dependency Properties
|
||||
|
||||
public TargetInfo? CurrentTarget { get; set; }
|
||||
public SavedTarget CurrentTarget { get; set; }
|
||||
|
||||
public object CallingVM { get; set; }
|
||||
|
||||
|
||||
@@ -1,22 +1,5 @@
|
||||
using OrbisSuite;
|
||||
using OrbisLib2.Common.Dispatcher;
|
||||
using SimpleUI.Controls;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
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.Shapes;
|
||||
using OrbisSuite.Common.Database;
|
||||
|
||||
namespace OrbisNeighborHood
|
||||
{
|
||||
@@ -28,6 +11,7 @@ namespace OrbisNeighborHood
|
||||
public NeighborHood()
|
||||
{
|
||||
InitializeComponent();
|
||||
DispatcherClient.Subscribe();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Libraries\OrbisLib\OrbisLib.csproj" />
|
||||
<ProjectReference Include="..\Libraries\OrbisLib2\OrbisLib2.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1 +1 @@
|
||||
1991
|
||||
2047
|
||||
|
||||
@@ -1 +1 @@
|
||||
Version 3.0.1991 Debug Build Thursday December 22 2022 9:17 PM
|
||||
Version 3.0.2047 Debug Build Friday December 23 2022 10:35 AM
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0-windows</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Nullable>annotations</Nullable>
|
||||
<ApplicationIcon>OrbisTaskbarApp.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -14,10 +14,11 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Windows.Compatibility" Version="6.0.0" />
|
||||
<PackageReference Include="TinyIpc" Version="4.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Libraries\OrbisLib\OrbisLib.csproj" />
|
||||
<ProjectReference Include="..\Libraries\OrbisLib2\OrbisLib2.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
using OrbisSuite.Common;
|
||||
using System.Net.Sockets;
|
||||
|
||||
namespace OrbisSuiteService.Service
|
||||
{
|
||||
class ClientInstance
|
||||
{
|
||||
/// <summary>
|
||||
/// The port used to communicate with the client.
|
||||
/// </summary>
|
||||
public int Port
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The last known name of the client.
|
||||
/// </summary>
|
||||
public string Name
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The last time the client sent a heartbeat packet.
|
||||
/// </summary>
|
||||
public int LastUpdate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="Port">Port of the client.</param>
|
||||
/// <param name="Name">Name of the client</param>
|
||||
/// <param name="LastUpdate">Set the last time we got a packet from the client.</param>
|
||||
public ClientInstance(int Port, string Name, int LastUpdate)
|
||||
{
|
||||
this.Port = Port;
|
||||
this.Name = Name;
|
||||
this.LastUpdate = LastUpdate;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a seralizable object to the client.
|
||||
/// </summary>
|
||||
/// <param name="obj">A serializable object we would like to send.</param>
|
||||
/// <returns>Returns if the data was sent or not.</returns>
|
||||
public bool SendObject(object obj)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
if (Sock.EasyConnect("127.0.0.1", Port, 1000))
|
||||
{
|
||||
Sock.SendObject(obj);
|
||||
|
||||
Sock.Close();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using OrbisSuite.Common;
|
||||
using OrbisLib2.Common;
|
||||
|
||||
namespace OrbisSuiteService.Service
|
||||
{
|
||||
|
||||
@@ -1,21 +1,13 @@
|
||||
using OrbisSuite.Common;
|
||||
using OrbisSuite.Common.Dispatcher;
|
||||
using OrbisSuite.Common.Database;
|
||||
using System.Net.Sockets;
|
||||
using TinyIpc.Messaging;
|
||||
using OrbisLib2.Common.Database;
|
||||
using OrbisLib2.Common.Dispatcher;
|
||||
using OrbisLib2.Common.Helpers;
|
||||
|
||||
namespace OrbisSuiteService.Service
|
||||
{
|
||||
public class Dispatcher
|
||||
{
|
||||
private static readonly int _maxClients = 20;
|
||||
private readonly int _clientMax = Config.DispatcherClientPort + _maxClients;
|
||||
private List<ClientInstance> _clients = new List<ClientInstance>();
|
||||
|
||||
private Listener _DispatcherListener = new Listener(Config.DispatcherPort);
|
||||
private Listener _EventListener = new Listener(Config.EventPort);
|
||||
|
||||
private Task _HeartbeatTask;
|
||||
private CancellationToken _HeartbeatCancellationToken;
|
||||
private TinyMessageBus _ServiceMessageBus;
|
||||
|
||||
private DBWatcher _DBWatcher = new DBWatcher();
|
||||
private Settings _Settings = Settings.CreateInstance();
|
||||
@@ -25,33 +17,18 @@ namespace OrbisSuiteService.Service
|
||||
|
||||
public Dispatcher()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Sets up dispatcher listener that will handle Client => Service requests.
|
||||
_DispatcherListener.SocketAccepted += _DispatcherListener_SocketAccepted;
|
||||
_DispatcherListener.Start();
|
||||
_ServiceMessageBus = new TinyMessageBus("OrbisSuite");
|
||||
|
||||
//Sets up Event Listener that will handle events from the Target Console => Service => All Clients.
|
||||
_EventListener.SocketAccepted += _EventListener_SocketAccepted;
|
||||
_EventListener.Start();
|
||||
|
||||
//Starts up heartbeat task that will check for clients that have not gracefully shutdown and time them out.
|
||||
_HeartbeatTask = Task.Run(() => DoHeartbeat());
|
||||
|
||||
//Helpers
|
||||
_DBWatcher.DBChanged += _DBWatcher_DBChanged;
|
||||
/*_SerialMonitor.NewSerialDataRecieved += _SerialMonitor_NewSerialDataRecieved;
|
||||
_SerialMonitor.Settings.PortName = "";
|
||||
_SerialMonitor.StartListening();*/
|
||||
_TargetWatcher = new TargetWatcher(this);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod().Name}] Error: {ex.Message}");
|
||||
}
|
||||
//Helpers
|
||||
_DBWatcher.DBChanged += _DBWatcher_DBChanged;
|
||||
/*_SerialMonitor.NewSerialDataRecieved += _SerialMonitor_NewSerialDataRecieved;
|
||||
_SerialMonitor.Settings.PortName = "";
|
||||
_SerialMonitor.StartListening();*/
|
||||
_TargetWatcher = new TargetWatcher(this);
|
||||
}
|
||||
|
||||
private byte[] _SerialDataBuffer = new byte[0];
|
||||
|
||||
private void _SerialMonitor_NewSerialDataRecieved(object sender, SerialDataEventArgs e)
|
||||
{
|
||||
_SerialDataBuffer = _SerialDataBuffer.Concat(e.Data).ToArray();
|
||||
@@ -61,7 +38,7 @@ namespace OrbisSuiteService.Service
|
||||
{
|
||||
var Packet = new ForwardPacket(ForwardPacket.PacketType.SerialCom, "");
|
||||
Packet.SerialCom.Data = _SerialDataBuffer;
|
||||
ForwardPacketAll(Packet);
|
||||
PublishEvent(Packet);
|
||||
|
||||
//Clear buffer for next print.
|
||||
_SerialDataBuffer = new byte[0];
|
||||
@@ -70,163 +47,12 @@ namespace OrbisSuiteService.Service
|
||||
|
||||
private void _DBWatcher_DBChanged()
|
||||
{
|
||||
ForwardPacketAll(new ForwardPacket(ForwardPacket.PacketType.DBTouched, ""));
|
||||
PublishEvent(new ForwardPacket(ForwardPacket.PacketType.DBTouched, ""));
|
||||
}
|
||||
|
||||
private void _EventListener_SocketAccepted(Socket e)
|
||||
public void PublishEvent(ForwardPacket Packet)
|
||||
{
|
||||
//This will be coming fromt the console which is c++ so we will have to marshal this when I figure out the packet structure.
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
private void _DispatcherListener_SocketAccepted(Socket e)
|
||||
{
|
||||
try
|
||||
{
|
||||
var Packet = (DispatcherClientPacket)e.RecvObject();
|
||||
|
||||
switch (Packet.Type)
|
||||
{
|
||||
default:
|
||||
Console.WriteLine("Invalid Packet...");
|
||||
break;
|
||||
|
||||
case DispatcherClientPacket.PacketType.NewClient:
|
||||
e.SendInt32(AddClient(Packet.ClientName));
|
||||
break;
|
||||
|
||||
case DispatcherClientPacket.PacketType.RemoveClient:
|
||||
RemoveClient(Packet.Port);
|
||||
break;
|
||||
|
||||
case DispatcherClientPacket.PacketType.HeartBeat:
|
||||
if (_clients.Any(p => p.Port == Packet.Port))
|
||||
{
|
||||
var Client = _clients.Where(p => p.Port == Packet.Port).First();
|
||||
var CurrentTick = (Environment.TickCount & Int32.MaxValue);
|
||||
|
||||
Console.WriteLine($"[HeartBeat] in {(CurrentTick - Client.LastUpdate).ToString()}ms from {Packet.ClientName}({Packet.Port.ToString()})");
|
||||
|
||||
// Update last time we got a heart beat.
|
||||
Client.LastUpdate = CurrentTick;
|
||||
|
||||
// Send Success.
|
||||
e.SendInt32(1);
|
||||
}
|
||||
else // Send Failure.
|
||||
e.SendInt32(0);
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a client to the '_clients'.
|
||||
/// </summary>
|
||||
/// <param name="Name">The text name of the client. Should be the other programs name.</param>
|
||||
/// <returns>Returns the port the Dispatcher will send the data on.</returns>
|
||||
public int AddClient(string Name)
|
||||
{
|
||||
try
|
||||
{
|
||||
int Port = Config.DispatcherClientPort;
|
||||
while (Port < _clientMax)
|
||||
{
|
||||
if (!_clients.Any(p => p.Port == Port))
|
||||
break;
|
||||
|
||||
Port++;
|
||||
|
||||
if (Port == _clientMax)
|
||||
{
|
||||
Console.WriteLine("Client List Full.");
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"New Client: {Name} {Port.ToString()}.");
|
||||
|
||||
_clients.Add(new ClientInstance(Port, Name, Environment.TickCount & Int32.MaxValue));
|
||||
|
||||
return Port;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Removes the client specified from the '_clients'.
|
||||
/// </summary>
|
||||
/// <param name="Port">The port of the client you want to remove.</param>
|
||||
public void RemoveClient(int Port)
|
||||
{
|
||||
if (_clients.Any(p => p.Port == Port))
|
||||
{
|
||||
var Client = _clients.Where(p => p.Port == Port);
|
||||
_clients.Remove(Client.First());
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Forwards a packet to all the clients in the '_clients'.
|
||||
/// </summary>
|
||||
/// <param name="Packet">The packet data that should be sent.</param>
|
||||
public void ForwardPacketAll(ForwardPacket Packet)
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (ClientInstance Client in _clients)
|
||||
Task.Factory.StartNew(() => Client.SendObject(Packet));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This task will check for client time outs. This way it keeps the client list fresh and keeps from unneeded thread hold ups.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task DoHeartbeat()
|
||||
{
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var CurrentTick = (Environment.TickCount & Int32.MaxValue);
|
||||
|
||||
foreach (var Client in _clients)
|
||||
{
|
||||
if (CurrentTick - Client.LastUpdate > 10000)
|
||||
{
|
||||
Console.WriteLine($"[Dispatcher] No response from client {Client.Name}({Client.Port.ToString()}) in more than 10000 ms. Last update was {(CurrentTick - Client.LastUpdate).ToString()} ms Timing Out!");
|
||||
|
||||
RemoveClient(Client.Port);
|
||||
}
|
||||
}
|
||||
|
||||
await Task.Delay(2000, _HeartbeatCancellationToken);
|
||||
|
||||
if (_HeartbeatCancellationToken.IsCancellationRequested)
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[{System.Reflection.MethodBase.GetCurrentMethod()?.Name}] Error: {ex.Message}");
|
||||
}
|
||||
_ServiceMessageBus.PublishAsync(Helper.ObjectToByteArray(Packet));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using OrbisSuite.Common;
|
||||
using OrbisSuite.Common.Database;
|
||||
using OrbisSuite.Common.Dispatcher;
|
||||
using OrbisLib2.Common.Database;
|
||||
using OrbisLib2.Common.Dispatcher;
|
||||
using OrbisLib2.Common.Helpers;
|
||||
using OrbisLib2.Targets;
|
||||
|
||||
namespace OrbisSuiteService.Service
|
||||
{
|
||||
@@ -15,57 +16,61 @@ namespace OrbisSuiteService.Service
|
||||
_dispatcher = dispatcher;
|
||||
_TargetWatcherTask = Task.Run(() => DoTargetWatcher());
|
||||
}
|
||||
|
||||
private async Task DoTargetWatcher()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Parallel.ForEach(SavedTargets.Targets, Target =>
|
||||
if(TargetManager.Targets.Count <= 0)
|
||||
{
|
||||
var oldAvailable = Target.Details.IsAvailable;
|
||||
var OldAPIAvailable = Target.Details.IsAPIAvailable;
|
||||
await Task.Delay(1000, _TargetWatcherCancellationToken);
|
||||
}
|
||||
|
||||
if(Helpers.PingHost(Target.IPAddress))
|
||||
Parallel.ForEach(SavedTarget.GetTargetList(), Target =>
|
||||
{
|
||||
var oldAvailable = Target.Info.IsAvailable;
|
||||
var OldAPIAvailable = Target.Info.IsAPIAvailable;
|
||||
|
||||
if(Helper.PingHost(Target.IPAddress))
|
||||
{
|
||||
var detail = Target.Details;
|
||||
var detail = Target.Info;
|
||||
detail.IsAvailable = true;
|
||||
}
|
||||
|
||||
Target.Details.IsAvailable = Helpers.PingHost(Target.IPAddress);
|
||||
Target.Details.IsAPIAvailable = Helpers.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort);
|
||||
Target.Details.Save();
|
||||
Target.Info.IsAvailable = Helper.PingHost(Target.IPAddress);
|
||||
Target.Info.IsAPIAvailable = Helper.TestTcpConnection(Target.IPAddress, Settings.CreateInstance().APIPort);
|
||||
Target.Info.Save();
|
||||
|
||||
if (Target.Details.IsAPIAvailable)
|
||||
SavedTargets.UpdateTargetInfo(Target.Name);
|
||||
if (Target.Info.IsAPIAvailable)
|
||||
TargetManager.UpdateTargetInfo(Target);
|
||||
else
|
||||
{
|
||||
Target.Details.CPUTemp = 0;
|
||||
Target.Details.SOCTemp = 0;
|
||||
Target.Details.ThreadCount = 0;
|
||||
Target.Details.AverageCPUUsage = 0;
|
||||
Target.Details.BusyCore = 0;
|
||||
Target.Details.RamUsage = 0;
|
||||
Target.Details.VRamUsage = 0;
|
||||
Target.Details.CurrentTitleID = "-";
|
||||
Target.Details.Save();
|
||||
Target.Info.CPUTemp = 0;
|
||||
Target.Info.SOCTemp = 0;
|
||||
Target.Info.ThreadCount = 0;
|
||||
Target.Info.AverageCPUUsage = 0;
|
||||
Target.Info.BusyCore = 0;
|
||||
Target.Info.RamUsage = 0;
|
||||
Target.Info.VRamUsage = 0;
|
||||
Target.Info.CurrentTitleID = "-";
|
||||
Target.Info.Save();
|
||||
}
|
||||
|
||||
// Forward Target Availability.
|
||||
if (oldAvailable != Target.Details.IsAvailable)
|
||||
if (oldAvailable != Target.Info.IsAvailable)
|
||||
{
|
||||
var Packet = new ForwardPacket(ForwardPacket.PacketType.TargetAvailability, Target.IPAddress);
|
||||
Packet.TargetAvailability.Available = Target.Details.IsAvailable;
|
||||
Packet.TargetAvailability.Available = Target.Info.IsAvailable;
|
||||
Packet.TargetAvailability.Name = Target.Name;
|
||||
_dispatcher.ForwardPacketAll(Packet);
|
||||
_dispatcher.PublishEvent(Packet);
|
||||
}
|
||||
|
||||
// Forward API Availability.
|
||||
if (OldAPIAvailable != Target.Details.IsAPIAvailable)
|
||||
if (OldAPIAvailable != Target.Info.IsAPIAvailable)
|
||||
{
|
||||
var Packet = new ForwardPacket(ForwardPacket.PacketType.TargetAPIAvailability, Target.IPAddress);
|
||||
Packet.TargetAPIAvailability.Available = Target.Details.IsAvailable;
|
||||
Packet.TargetAPIAvailability.Available = Target.Info.IsAvailable;
|
||||
Packet.TargetAPIAvailability.Name = Target.Name;
|
||||
_dispatcher.ForwardPacketAll(Packet);
|
||||
_dispatcher.PublishEvent(Packet);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user