Migrate to OrbisLib2 and use TinyIPC for broadcasting commands to instances of orbislib.

This commit is contained in:
Greg
2022-12-23 10:36:50 -07:00
parent 92b753adf4
commit 40d4941d3a
36 changed files with 473 additions and 1028 deletions
+3 -9
View File
@@ -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}"
+1 -1
View File
@@ -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));
+3 -13
View File
@@ -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
+11 -11
View File
@@ -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;
}
}
}
+2 -1
View File
@@ -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();
+35 -35
View File
@@ -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; }
+2 -18
View File
@@ -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
{
+17 -191
View File
@@ -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);
}
});