Version 4 - Added HidGuardian support and implemented a GUI
This commit is contained in:
parent
32aca0aed9
commit
db90d8357b
9 changed files with 1705 additions and 25 deletions
|
@ -30,5 +30,10 @@
|
||||||
<!--Also swaps buttons when using "Also use for buttons/axes"-->
|
<!--Also swaps buttons when using "Also use for buttons/axes"-->
|
||||||
<!--On is "true"; off is "false". Default: false -->
|
<!--On is "true"; off is "false". Default: false -->
|
||||||
<add key="SwapButtons" value="false" />
|
<add key="SwapButtons" value="false" />
|
||||||
|
|
||||||
|
<!-- Determines whether or not HidGuardian's process whitelist is purged on start-up -->
|
||||||
|
<!-- Can interfere with other programs using HidGuardian, but prevents whitelist from being clogged from crashed instances -->
|
||||||
|
<!-- Default: true -->
|
||||||
|
<add key="PurgeWhitelist" value="true"/>
|
||||||
</appSettings>
|
</appSettings>
|
||||||
</configuration>
|
</configuration>
|
|
@ -5,7 +5,7 @@
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{1BF709E9-C133-41DF-933A-C9FF3F664C7B}</ProjectGuid>
|
<ProjectGuid>{1BF709E9-C133-41DF-933A-C9FF3F664C7B}</ProjectGuid>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<RootNamespace>BetterJoyForCemu</RootNamespace>
|
<RootNamespace>BetterJoyForCemu</RootNamespace>
|
||||||
<AssemblyName>BetterJoyForCemu</AssemblyName>
|
<AssemblyName>BetterJoyForCemu</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
|
||||||
|
@ -71,13 +71,23 @@
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
<Prefer32Bit>true</Prefer32Bit>
|
<Prefer32Bit>true</Prefer32Bit>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject>
|
||||||
|
</StartupObject>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationIcon>betterjoyforcemu_icon.ico</ApplicationIcon>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="Crc32.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dc0b95cf99bf4e99, processorArchitecture=MSIL">
|
<Reference Include="Crc32.NET, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dc0b95cf99bf4e99, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Crc32.NET.1.2.0\lib\net20\Crc32.NET.dll</HintPath>
|
<HintPath>..\packages\Crc32.NET.1.2.0\lib\net20\Crc32.NET.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
<Reference Include="System.Numerics" />
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.ServiceProcess" />
|
||||||
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
@ -88,6 +98,12 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="HIDapi.cs" />
|
<Compile Include="HIDapi.cs" />
|
||||||
<Compile Include="Joycon.cs" />
|
<Compile Include="Joycon.cs" />
|
||||||
|
<Compile Include="MainForm.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="MainForm.Designer.cs">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="Program.cs" />
|
<Compile Include="Program.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="UpdServer.cs" />
|
<Compile Include="UpdServer.cs" />
|
||||||
|
@ -97,6 +113,7 @@
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="betterjoyforcemu_icon.ico" />
|
||||||
<Content Include="hidapi.dll">
|
<Content Include="hidapi.dll">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
@ -107,5 +124,10 @@
|
||||||
<Name>ViGEmClient</Name>
|
<Name>ViGEmClient</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="MainForm.resx">
|
||||||
|
<DependentUpon>MainForm.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
</Project>
|
</Project>
|
|
@ -211,6 +211,8 @@ namespace BetterJoyForCemu {
|
||||||
|
|
||||||
bool toRumble = Boolean.Parse(ConfigurationSettings.AppSettings["EnableRumble"]);
|
bool toRumble = Boolean.Parse(ConfigurationSettings.AppSettings["EnableRumble"]);
|
||||||
|
|
||||||
|
public MainForm form;
|
||||||
|
|
||||||
public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, int id = 0, bool isPro=false, bool usb = false) {
|
public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, int id = 0, bool isPro=false, bool usb = false) {
|
||||||
handle = handle_;
|
handle = handle_;
|
||||||
imu_enabled = imu;
|
imu_enabled = imu;
|
||||||
|
@ -243,7 +245,7 @@ namespace BetterJoyForCemu {
|
||||||
public void DebugPrint(String s, DebugType d) {
|
public void DebugPrint(String s, DebugType d) {
|
||||||
if (debug_type == DebugType.NONE) return;
|
if (debug_type == DebugType.NONE) return;
|
||||||
if (d == DebugType.ALL || d == debug_type || debug_type == DebugType.ALL) {
|
if (d == DebugType.ALL || d == debug_type || debug_type == DebugType.ALL) {
|
||||||
Console.WriteLine(s);
|
form.console.Text += s + "\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public bool GetButtonDown(Button b) {
|
public bool GetButtonDown(Button b) {
|
||||||
|
@ -285,7 +287,7 @@ namespace BetterJoyForCemu {
|
||||||
Subcommand(0x03, new byte[] { 0x3f }, 1, false);
|
Subcommand(0x03, new byte[] { 0x3f }, 1, false);
|
||||||
|
|
||||||
a = Enumerable.Repeat((byte)0, 64).ToArray();
|
a = Enumerable.Repeat((byte)0, 64).ToArray();
|
||||||
Console.WriteLine("Using USB.");
|
form.console.Text += "Using USB.\r\n";
|
||||||
|
|
||||||
a[0] = 0x80;
|
a[0] = 0x80;
|
||||||
a[1] = 0x01;
|
a[1] = 0x01;
|
||||||
|
@ -378,7 +380,7 @@ namespace BetterJoyForCemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts_en == raw_buf[1]) {
|
if (ts_en == raw_buf[1]) {
|
||||||
Console.WriteLine("Duplicate timestamp enqueued.");
|
form.console.Text += "Duplicate timestamp enqueued.\r\n";
|
||||||
DebugPrint(string.Format("Duplicate timestamp enqueued. TS: {0:X2}", ts_en), DebugType.THREADING);
|
DebugPrint(string.Format("Duplicate timestamp enqueued. TS: {0:X2}", ts_en), DebugType.THREADING);
|
||||||
}
|
}
|
||||||
ts_en = raw_buf[1];
|
ts_en = raw_buf[1];
|
||||||
|
@ -399,7 +401,7 @@ namespace BetterJoyForCemu {
|
||||||
attempts = 0;
|
attempts = 0;
|
||||||
} else if (attempts > 1000) {
|
} else if (attempts > 1000) {
|
||||||
state = state_.DROPPED;
|
state = state_.DROPPED;
|
||||||
Console.WriteLine("Dropped");
|
//form.console.Text += "Dropped\r\n";
|
||||||
DebugPrint("Connection lost. Is the Joy-Con connected?", DebugType.ALL);
|
DebugPrint("Connection lost. Is the Joy-Con connected?", DebugType.ALL);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -609,7 +611,7 @@ namespace BetterJoyForCemu {
|
||||||
PollThreadObj = new Thread(new ThreadStart(Poll));
|
PollThreadObj = new Thread(new ThreadStart(Poll));
|
||||||
PollThreadObj.Start();
|
PollThreadObj.Start();
|
||||||
|
|
||||||
Console.WriteLine("Starting poll thread.");
|
form.console.Text += "Starting poll thread.\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -675,13 +677,13 @@ namespace BetterJoyForCemu {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (buf_[i] != 0xff) {
|
if (buf_[i] != 0xff) {
|
||||||
Console.WriteLine("Using user stick calibration data.");
|
form.console.Text += "Using user stick calibration data.\r\n";
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
Console.WriteLine("Using factory stick calibration data.");
|
form.console.Text += "Using factory stick calibration data.\r\n";
|
||||||
buf_ = ReadSPI(0x60, (isLeft ? (byte)0x3d : (byte)0x46), 9); // get user calibration data if possible
|
buf_ = ReadSPI(0x60, (isLeft ? (byte)0x3d : (byte)0x46), 9); // get user calibration data if possible
|
||||||
}
|
}
|
||||||
stick_cal[isLeft ? 0 : 2] = (UInt16)((buf_[1] << 8) & 0xF00 | buf_[0]); // X Axis Max above center
|
stick_cal[isLeft ? 0 : 2] = (UInt16)((buf_[1] << 8) & 0xF00 | buf_[0]); // X Axis Max above center
|
||||||
|
@ -698,13 +700,13 @@ namespace BetterJoyForCemu {
|
||||||
found = false;
|
found = false;
|
||||||
for (int i = 0; i < 9; ++i) {
|
for (int i = 0; i < 9; ++i) {
|
||||||
if (buf_[i] != 0xff) {
|
if (buf_[i] != 0xff) {
|
||||||
Console.WriteLine("Using user stick calibration data.");
|
form.console.Text += "Using user stick calibration data.\r\n";
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
Console.WriteLine("Using factory stick calibration data.");
|
form.console.Text += "Using factory stick calibration data.\r\n";
|
||||||
buf_ = ReadSPI(0x60, (!isLeft ? (byte)0x3d : (byte)0x46), 9); // get user calibration data if possible
|
buf_ = ReadSPI(0x60, (!isLeft ? (byte)0x3d : (byte)0x46), 9); // get user calibration data if possible
|
||||||
}
|
}
|
||||||
stick2_cal[!isLeft ? 0 : 2] = (UInt16)((buf_[1] << 8) & 0xF00 | buf_[0]); // X Axis Max above center
|
stick2_cal[!isLeft ? 0 : 2] = (UInt16)((buf_[1] << 8) & 0xF00 | buf_[0]); // X Axis Max above center
|
||||||
|
|
118
BetterJoyForCemu/MainForm.Designer.cs
generated
Normal file
118
BetterJoyForCemu/MainForm.Designer.cs
generated
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
namespace BetterJoyForCemu {
|
||||||
|
partial class MainForm {
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing) {
|
||||||
|
if (disposing && (components != null)) {
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent() {
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
|
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
|
||||||
|
this.console = new System.Windows.Forms.TextBox();
|
||||||
|
this.label1 = new System.Windows.Forms.Label();
|
||||||
|
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
|
||||||
|
this.contextMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
|
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.label2 = new System.Windows.Forms.Label();
|
||||||
|
this.contextMenu.SuspendLayout();
|
||||||
|
this.SuspendLayout();
|
||||||
|
//
|
||||||
|
// console
|
||||||
|
//
|
||||||
|
this.console.Location = new System.Drawing.Point(12, 25);
|
||||||
|
this.console.Multiline = true;
|
||||||
|
this.console.Name = "console";
|
||||||
|
this.console.ReadOnly = true;
|
||||||
|
this.console.Size = new System.Drawing.Size(260, 224);
|
||||||
|
this.console.TabIndex = 0;
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
this.label1.AutoSize = true;
|
||||||
|
this.label1.Location = new System.Drawing.Point(12, 9);
|
||||||
|
this.label1.Name = "label1";
|
||||||
|
this.label1.Size = new System.Drawing.Size(83, 13);
|
||||||
|
this.label1.TabIndex = 1;
|
||||||
|
this.label1.Text = "Console Output:";
|
||||||
|
//
|
||||||
|
// notifyIcon
|
||||||
|
//
|
||||||
|
this.notifyIcon.BalloonTipText = "Double click the tray icon to maximise";
|
||||||
|
this.notifyIcon.BalloonTipTitle = "BetterJoyForCemu";
|
||||||
|
this.notifyIcon.ContextMenuStrip = this.contextMenu;
|
||||||
|
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon")));
|
||||||
|
this.notifyIcon.Text = "BetterJoyForCemu";
|
||||||
|
this.notifyIcon.Visible = true;
|
||||||
|
this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick);
|
||||||
|
//
|
||||||
|
// contextMenu
|
||||||
|
//
|
||||||
|
this.contextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.exitToolStripMenuItem});
|
||||||
|
this.contextMenu.Name = "contextMenu";
|
||||||
|
this.contextMenu.Size = new System.Drawing.Size(153, 48);
|
||||||
|
//
|
||||||
|
// exitToolStripMenuItem
|
||||||
|
//
|
||||||
|
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
|
||||||
|
this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||||
|
this.exitToolStripMenuItem.Text = "Exit";
|
||||||
|
this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
this.label2.AutoSize = true;
|
||||||
|
this.label2.Location = new System.Drawing.Point(244, 9);
|
||||||
|
this.label2.Name = "label2";
|
||||||
|
this.label2.Size = new System.Drawing.Size(28, 13);
|
||||||
|
this.label2.TabIndex = 2;
|
||||||
|
this.label2.Text = "v4.0";
|
||||||
|
//
|
||||||
|
// MainForm
|
||||||
|
//
|
||||||
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||||
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
|
this.ClientSize = new System.Drawing.Size(284, 261);
|
||||||
|
this.Controls.Add(this.label2);
|
||||||
|
this.Controls.Add(this.label1);
|
||||||
|
this.Controls.Add(this.console);
|
||||||
|
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.Name = "MainForm";
|
||||||
|
this.Text = "BetterJoyForCemu";
|
||||||
|
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
|
||||||
|
this.Load += new System.EventHandler(this.MainForm_Load);
|
||||||
|
this.Resize += new System.EventHandler(this.MainForm_Resize);
|
||||||
|
this.contextMenu.ResumeLayout(false);
|
||||||
|
this.ResumeLayout(false);
|
||||||
|
this.PerformLayout();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public System.Windows.Forms.TextBox console;
|
||||||
|
private System.Windows.Forms.Label label1;
|
||||||
|
private System.Windows.Forms.NotifyIcon notifyIcon;
|
||||||
|
private System.Windows.Forms.Label label2;
|
||||||
|
private System.Windows.Forms.ContextMenuStrip contextMenu;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
|
||||||
|
}
|
||||||
|
}
|
47
BetterJoyForCemu/MainForm.cs
Normal file
47
BetterJoyForCemu/MainForm.cs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Data;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace BetterJoyForCemu {
|
||||||
|
public partial class MainForm : Form {
|
||||||
|
public MainForm() {
|
||||||
|
InitializeComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_Resize(object sender, EventArgs e) {
|
||||||
|
if (this.WindowState == FormWindowState.Minimized) {
|
||||||
|
notifyIcon.Visible = true;
|
||||||
|
notifyIcon.ShowBalloonTip(1);
|
||||||
|
this.ShowInTaskbar = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) {
|
||||||
|
this.WindowState = FormWindowState.Normal;
|
||||||
|
this.ShowInTaskbar = true;
|
||||||
|
notifyIcon.Visible = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_Load(object sender, EventArgs e) {
|
||||||
|
this.ShowInTaskbar = true;
|
||||||
|
notifyIcon.Visible = false;
|
||||||
|
|
||||||
|
Program.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
|
||||||
|
Program.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
|
||||||
|
Program.Stop();
|
||||||
|
Application.Exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1403
BetterJoyForCemu/MainForm.resx
Normal file
1403
BetterJoyForCemu/MainForm.resx
Normal file
File diff suppressed because it is too large
Load diff
|
@ -17,6 +17,11 @@ using Nefarius.ViGEm.Client;
|
||||||
using Nefarius.ViGEm.Client.Targets;
|
using Nefarius.ViGEm.Client.Targets;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Configuration;
|
using System.Configuration;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.IO;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
using System.ServiceProcess;
|
||||||
|
|
||||||
namespace BetterJoyForCemu {
|
namespace BetterJoyForCemu {
|
||||||
public class JoyconManager {
|
public class JoyconManager {
|
||||||
|
@ -32,6 +37,8 @@ namespace BetterJoyForCemu {
|
||||||
public List<Joycon> j; // Array of all connected Joy-Cons
|
public List<Joycon> j; // Array of all connected Joy-Cons
|
||||||
static JoyconManager instance;
|
static JoyconManager instance;
|
||||||
|
|
||||||
|
public MainForm form;
|
||||||
|
|
||||||
public static JoyconManager Instance {
|
public static JoyconManager Instance {
|
||||||
get { return instance; }
|
get { return instance; }
|
||||||
}
|
}
|
||||||
|
@ -51,7 +58,7 @@ namespace BetterJoyForCemu {
|
||||||
ptr = HIDapi.hid_enumerate(vendor_id_, 0x0);
|
ptr = HIDapi.hid_enumerate(vendor_id_, 0x0);
|
||||||
if (ptr == IntPtr.Zero) {
|
if (ptr == IntPtr.Zero) {
|
||||||
HIDapi.hid_free_enumeration(ptr);
|
HIDapi.hid_free_enumeration(ptr);
|
||||||
Console.WriteLine("No Joy-Cons found!");
|
form.console.Text += "No Joy-Cons found!\r\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,27 +69,49 @@ namespace BetterJoyForCemu {
|
||||||
if (enumerate.product_id == product_l || enumerate.product_id == product_r || enumerate.product_id == product_pro) {
|
if (enumerate.product_id == product_l || enumerate.product_id == product_r || enumerate.product_id == product_pro) {
|
||||||
if (enumerate.product_id == product_l) {
|
if (enumerate.product_id == product_l) {
|
||||||
isLeft = true;
|
isLeft = true;
|
||||||
Console.WriteLine("Left Joy-Con connected.");
|
form.console.Text += "Left Joy-Con connected.\r\n";
|
||||||
} else if (enumerate.product_id == product_r) {
|
} else if (enumerate.product_id == product_r) {
|
||||||
isLeft = false;
|
isLeft = false;
|
||||||
Console.WriteLine("Right Joy-Con connected.");
|
form.console.Text += "Right Joy-Con connected.\r\n";
|
||||||
} else if (enumerate.product_id == product_pro) {
|
} else if (enumerate.product_id == product_pro) {
|
||||||
isLeft = true;
|
isLeft = true;
|
||||||
Console.WriteLine("Pro controller connected.");
|
form.console.Text += "Pro controller connected.\r\n";
|
||||||
} else {
|
} else {
|
||||||
Console.WriteLine("Non Joy-Con input device skipped.");
|
form.console.Text += "Non Joy-Con input device skipped.\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add controller to block-list for HidGuardian
|
||||||
|
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"http://localhost:26762/api/v1/hidguardian/affected/add/");
|
||||||
|
string postData = @"hwids=HID\" + enumerate.path.Split('#')[1].ToUpper();
|
||||||
|
var data = Encoding.UTF8.GetBytes(postData);
|
||||||
|
|
||||||
|
request.Method = "POST";
|
||||||
|
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
|
||||||
|
request.ContentLength = data.Length;
|
||||||
|
|
||||||
|
using (var stream = request.GetRequestStream())
|
||||||
|
stream.Write(data, 0, data.Length);
|
||||||
|
|
||||||
|
try {
|
||||||
|
var response = (HttpWebResponse)request.GetResponse();
|
||||||
|
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
|
||||||
|
} catch (Exception e) {
|
||||||
|
form.console.Text += "Unable to add controller to block-list.\r\n";
|
||||||
|
}
|
||||||
|
// -------------------- //
|
||||||
|
|
||||||
IntPtr handle = HIDapi.hid_open_path(enumerate.path);
|
IntPtr handle = HIDapi.hid_open_path(enumerate.path);
|
||||||
try {
|
try {
|
||||||
HIDapi.hid_set_nonblocking(handle, 1);
|
HIDapi.hid_set_nonblocking(handle, 1);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Console.WriteLine("Unable to open path to device - are you using the correct (64 vs 32-bit) version for your PC?");
|
form.console.Text += "Unable to open path to device - are you using the correct (64 vs 32-bit) version for your PC?\r\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
j.Add(new Joycon(handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft, j.Count, enumerate.product_id == product_pro, enumerate.serial_number == "000000000001"));
|
j.Add(new Joycon(handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft, j.Count, enumerate.product_id == product_pro, enumerate.serial_number == "000000000001"));
|
||||||
|
|
||||||
|
j.Last().form = form;
|
||||||
|
|
||||||
byte[] mac = new byte[6];
|
byte[] mac = new byte[6];
|
||||||
for (int n = 0; n < 6; n++)
|
for (int n = 0; n < 6; n++)
|
||||||
mac[n] = byte.Parse(enumerate.serial_number.Substring(n * 2, 2), System.Globalization.NumberStyles.HexNumber);
|
mac[n] = byte.Parse(enumerate.serial_number.Substring(n * 2, 2), System.Globalization.NumberStyles.HexNumber);
|
||||||
|
@ -102,7 +131,7 @@ namespace BetterJoyForCemu {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found == 2) {
|
if (found == 2) {
|
||||||
Console.WriteLine("Both joycons successfully found.");
|
form.console.Text += "Both joycons successfully found.\r\n";
|
||||||
Joycon temp = null;
|
Joycon temp = null;
|
||||||
foreach (Joycon v in j) {
|
foreach (Joycon v in j) {
|
||||||
if (v.isLeft && !v.isPro) {
|
if (v.isLeft && !v.isPro) {
|
||||||
|
@ -124,7 +153,7 @@ namespace BetterJoyForCemu {
|
||||||
}
|
}
|
||||||
} // Join up the two joycons
|
} // Join up the two joycons
|
||||||
} else if (found != 0)
|
} else if (found != 0)
|
||||||
Console.WriteLine("Only one joycon found. Please connect both and then restart the program.");
|
form.console.Text += "Only one joycon found. Please connect both and then restart the program.\r\n";
|
||||||
|
|
||||||
HIDapi.hid_free_enumeration(top_ptr);
|
HIDapi.hid_free_enumeration(top_ptr);
|
||||||
}
|
}
|
||||||
|
@ -205,7 +234,43 @@ namespace BetterJoyForCemu {
|
||||||
|
|
||||||
public static ViGEmClient emClient;
|
public static ViGEmClient emClient;
|
||||||
|
|
||||||
static void Main(string[] args) {
|
private static readonly HttpClient client = new HttpClient();
|
||||||
|
|
||||||
|
static JoyconManager mgr;
|
||||||
|
static HighResTimer timer;
|
||||||
|
static string pid;
|
||||||
|
|
||||||
|
static MainForm form;
|
||||||
|
|
||||||
|
public static void Start() {
|
||||||
|
pid = Process.GetCurrentProcess().Id.ToString(); // get current process id for HidCerberus.Srv
|
||||||
|
|
||||||
|
var HidCerberusService = new ServiceController("HidCerberus Service");
|
||||||
|
if (HidCerberusService.Status == ServiceControllerStatus.Stopped) {
|
||||||
|
form.console.Text += "HidGuardian was stopped. Starting...\r\n";
|
||||||
|
|
||||||
|
try {
|
||||||
|
HidCerberusService.Start();
|
||||||
|
} catch (Exception e) {
|
||||||
|
form.console.Text += "Unable to start HidGuardian - everything should work fine without it, but if you need it, run the app again as an admin.\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpWebResponse response;
|
||||||
|
if (Boolean.Parse(ConfigurationSettings.AppSettings["PurgeWhitelist"])) {
|
||||||
|
try {
|
||||||
|
response = (HttpWebResponse)WebRequest.Create(@"http://localhost:26762/api/v1/hidguardian/whitelist/purge/").GetResponse(); // remove all programs allowed to see controller
|
||||||
|
} catch (Exception e) {
|
||||||
|
form.console.Text += "Unable to purge whitelist.\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
response = (HttpWebResponse)WebRequest.Create(@"http://localhost:26762/api/v1/hidguardian/whitelist/add/" + pid).GetResponse(); // add BetterJoyForCemu to allowed processes
|
||||||
|
} catch (Exception e) {
|
||||||
|
form.console.Text += "Unable to add program to whitelist.\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
emClient = new ViGEmClient(); // Manages emulated XInput
|
emClient = new ViGEmClient(); // Manages emulated XInput
|
||||||
|
|
||||||
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
|
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) {
|
||||||
|
@ -217,22 +282,38 @@ namespace BetterJoyForCemu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JoyconManager mgr = new JoyconManager();
|
mgr = new JoyconManager();
|
||||||
|
mgr.form = form;
|
||||||
mgr.Awake();
|
mgr.Awake();
|
||||||
mgr.Start();
|
mgr.Start();
|
||||||
|
|
||||||
server = new UdpServer(mgr.j);
|
server = new UdpServer(mgr.j);
|
||||||
|
server.form = form;
|
||||||
|
|
||||||
server.Start(IPAddress.Parse(ConfigurationSettings.AppSettings["IP"]), Int32.Parse(ConfigurationSettings.AppSettings["Port"]));
|
server.Start(IPAddress.Parse(ConfigurationSettings.AppSettings["IP"]), Int32.Parse(ConfigurationSettings.AppSettings["Port"]));
|
||||||
HighResTimer timer = new HighResTimer(pollsPerSecond, new HighResTimer.ActionDelegate(mgr.Update));
|
timer = new HighResTimer(pollsPerSecond, new HighResTimer.ActionDelegate(mgr.Update));
|
||||||
timer.Start();
|
timer.Start();
|
||||||
|
|
||||||
Console.Write("Press enter to quit.");
|
form.console.Text += "All systems go\r\n";
|
||||||
Console.ReadLine();
|
}
|
||||||
|
|
||||||
|
public static void Stop() {
|
||||||
|
try {
|
||||||
|
HttpWebResponse response = (HttpWebResponse)WebRequest.Create(@"http://localhost:26762/api/v1/hidguardian/whitelist/remove/" + pid).GetResponse(); // add BetterJoyForCemu to allowed processes
|
||||||
|
} catch (Exception e) {
|
||||||
|
form.console.Text += "Unable to remove program from whitelist.\r\n";
|
||||||
|
}
|
||||||
|
|
||||||
server.Stop();
|
server.Stop();
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
mgr.OnApplicationQuit();
|
mgr.OnApplicationQuit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void Main(string[] args) {
|
||||||
|
Application.EnableVisualStyles();
|
||||||
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
form = new MainForm();
|
||||||
|
Application.Run(form);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace BetterJoyForCemu {
|
||||||
|
|
||||||
List<Joycon> controllers;
|
List<Joycon> controllers;
|
||||||
|
|
||||||
|
public MainForm form;
|
||||||
|
|
||||||
public UdpServer(List<Joycon> p) {
|
public UdpServer(List<Joycon> p) {
|
||||||
controllers = p;
|
controllers = p;
|
||||||
}
|
}
|
||||||
|
@ -293,7 +295,7 @@ namespace BetterJoyForCemu {
|
||||||
udpSock.Close();
|
udpSock.Close();
|
||||||
udpSock = null;
|
udpSock = null;
|
||||||
|
|
||||||
Console.WriteLine("Could not start server. Make sure that only one instance of the program is running at a time and no other CemuHook applications are running.");
|
form.console.Text += "Could not start server. Make sure that only one instance of the program is running at a time and no other CemuHook applications are running.\r\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,7 +304,7 @@ namespace BetterJoyForCemu {
|
||||||
serverId = BitConverter.ToUInt32(randomBuf, 0);
|
serverId = BitConverter.ToUInt32(randomBuf, 0);
|
||||||
|
|
||||||
running = true;
|
running = true;
|
||||||
Console.WriteLine("Starting server on {0}:{1}", ip.ToString(), port);
|
form.console.Text += String.Format("Starting server on {0}:{1}\r\n", ip.ToString(), port);
|
||||||
StartReceive();
|
StartReceive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
BIN
BetterJoyForCemu/betterjoyforcemu_icon.ico
Normal file
BIN
BetterJoyForCemu/betterjoyforcemu_icon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
Loading…
Add table
Reference in a new issue