JoyCons power-off feature (#334)

* Tracking button down timestamps (for long press detection)
* Added joycons power-off functionality
This commit is contained in:
Abk16 2020-05-09 15:54:11 +00:00 committed by GitHub
parent fb9240d568
commit 3b10bb609f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 1 deletions

View file

@ -79,5 +79,11 @@
<!-- Have ShowAsXInput as false if using this -->
<!-- Default: false -->
<add key="ShowAsDS4" value="false"/>
<!-- Automatically power off joycons at program exit -->
<!-- Default: false -->
<add key="AutoPowerOff" value="false" />
<!-- Power off joycons when Capture (left only) or Home (right only or combined) buttons are pressed for a long interval (2s) -->
<!-- Default: false -->
<add key="HomeLongPowerOff" value="false" />
</appSettings>
</configuration>

View file

@ -76,6 +76,7 @@ namespace BetterJoyForCemu {
private bool[] buttons_up = new bool[20];
private bool[] buttons = new bool[20];
private bool[] down_ = new bool[20];
private long[] buttons_down_timestamp = new long[20];
private float[] stick = { 0, 0 };
private float[] stick2 = { 0, 0 };
@ -250,6 +251,8 @@ namespace BetterJoyForCemu {
imu_enabled = imu;
do_localize = localize;
rumble_obj = new Rumble(160, 320, 0);
for (int i = 0; i < buttons_down_timestamp.Length; i++)
buttons_down_timestamp[i] = -1;
filterweight = alpha;
isLeft = left;
@ -417,6 +420,18 @@ namespace BetterJoyForCemu {
Subcommand(0x38, a, 25, false);
}
private void SetHCIState(byte state) {
byte[] a = { state };
Subcommand(0x06, a, 1, false);
}
public void PowerOff() {
if (state > state_.DROPPED) {
SetHCIState(0x00);
state = state_.DROPPED;
}
}
private void BatteryChanged() { // battery changed level
foreach (var v in form.con) {
if (v.Tag == this) {
@ -590,6 +605,18 @@ namespace BetterJoyForCemu {
string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
int GyroMouseSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivity"]);
private void DoThingsWithButtons() {
int powerOffButton = (int)((!isLeft || other != null) ? Button.HOME : Button.CAPTURE);
if (buttons[powerOffButton]) {
long timestamp = Stopwatch.GetTimestamp();
if ((timestamp - buttons_down_timestamp[powerOffButton]) / 10000 > 2000.0) {
PowerOff();
if (other != null)
other.PowerOff();
return;
}
}
if (buttons_down[(int)Button.CAPTURE])
Simulate(Config.Value("capture"));
if (buttons_down[(int)Button.HOME])
@ -802,11 +829,15 @@ namespace BetterJoyForCemu {
buttons[(int)Button.MINUS] = other.buttons[(int)Button.MINUS];
}
long timestamp = Stopwatch.GetTimestamp();
lock (buttons_up) {
lock (buttons_down) {
for (int i = 0; i < buttons.Length; ++i) {
buttons_up[i] = (down_[i] & !buttons[i]);
buttons_down[i] = (!down_[i] & buttons[i]);
if (down_[i] != buttons[i])
buttons_down_timestamp[i] = (buttons[i] ? timestamp : -1);
}
}
}

View file

@ -255,6 +255,7 @@ namespace BetterJoyForCemu {
AppendTextBox("Error writing app settings.\r\n");
}
ConfigurationManager.AppSettings["AutoPowerOff"] = "false"; // Prevent joycons poweroff when applying settings
Application.Restart();
Environment.Exit(0);
}

View file

@ -300,7 +300,10 @@ namespace BetterJoyForCemu {
public void OnApplicationQuit() {
foreach (Joycon v in j) {
v.Detach();
if (Boolean.Parse(ConfigurationManager.AppSettings["AutoPowerOff"]))
v.PowerOff();
else
v.Detach();
if (v.xin != null) {
v.xin.Disconnect();