- Implement gyro-to-joystick; still needs testing on joycons
This commit is contained in:
parent
4423bcf881
commit
d0709ac6ff
2 changed files with 39 additions and 19 deletions
|
@ -82,15 +82,25 @@
|
||||||
<add key="UseIncrementalLights" value="true" />
|
<add key="UseIncrementalLights" value="true" />
|
||||||
|
|
||||||
<!-- Determines whether or not to translate gyro movements into joystick ("joy") or mouse movement ("mouse"), or have no effect ("none") -->
|
<!-- Determines whether or not to translate gyro movements into joystick ("joy") or mouse movement ("mouse"), or have no effect ("none") -->
|
||||||
<!-- When "joy", turn gyro movements into joystick movement (left/right depends on setting) [not yet implemented]-->
|
<!-- When "joy_left" or "joy_right", turn gyro movements into respective left/right joystick (mouse-like) movements -->
|
||||||
<!-- When "mouse", turn gyro movements into mouse movement. Press either stick-button to reset to middle of primary display -->
|
<!-- When "mouse", turn gyro movements into mouse movement. Press either stick-button to reset to middle of primary display -->
|
||||||
<!-- Default: none -->
|
<!-- Default: none -->
|
||||||
<add key="GyroToJoyOrMouse" value="none"/>
|
<add key="GyroToJoyOrMouse" value="none"/>
|
||||||
|
<!-- Beta value of AHRS. Affects divergence of filter -->
|
||||||
|
<!-- Default: 0.05 -->
|
||||||
|
<add key="AHRS_beta" value="0.05"/>
|
||||||
<!-- Sensitivity of gyro-to-mouse movements -->
|
<!-- Sensitivity of gyro-to-mouse movements -->
|
||||||
<!-- Default: 1200; 800 -->
|
<!-- Default: 1200; 800 -->
|
||||||
<add key="GyroMouseSensitivityX" value="1200"/>
|
<add key="GyroMouseSensitivityX" value="1200"/>
|
||||||
<add key="GyroMouseSensitivityY" value="800"/>
|
<add key="GyroMouseSensitivityY" value="800"/>
|
||||||
<!-- Gyro Hold/Toggle activation -->
|
<!-- Sensitivity of gyro-to-joystick movements -->
|
||||||
|
<!-- Default: 40.0; 10.0 -->
|
||||||
|
<add key="GyroStickSensitivityX" value="40.0"/>
|
||||||
|
<add key="GyroStickSensitivityY" value="10.0"/>
|
||||||
|
<!-- Stick range reduction when gyro-to-joystick is enabled and active; divides range by factor (so 1 is no change; 1.5 is halved range (with deadzone in mind)) -->
|
||||||
|
<!-- Default: 1.5 -->
|
||||||
|
<add key="GyroStickReduction" value="1.5"/>
|
||||||
|
<!-- Gyro Hold/Toggle activation; true will require the mapped button to be continuously held down to keep gyro active -->
|
||||||
<!-- Default: true [hold], false [toggle] -->
|
<!-- Default: true [hold], false [toggle] -->
|
||||||
<add key="GyroHoldToggle" value="true"/>
|
<add key="GyroHoldToggle" value="true"/>
|
||||||
<!-- When two joycons are connected, it would take the gyro movement of the right joycon for mouse movement. This swaps that -->
|
<!-- When two joycons are connected, it would take the gyro movement of the right joycon for mouse movement. This swaps that -->
|
||||||
|
|
|
@ -279,7 +279,8 @@ namespace BetterJoyForCemu {
|
||||||
bool thirdParty = false;
|
bool thirdParty = false;
|
||||||
|
|
||||||
private float[] activeData;
|
private float[] activeData;
|
||||||
private MadgwickAHRS AHRS = new MadgwickAHRS(0.005f, 0.01f); // for getting filtered Euler angles of rotation; 5ms sampling rate
|
static float AHRS_beta = float.Parse(ConfigurationManager.AppSettings["AHRS_beta"]);
|
||||||
|
private MadgwickAHRS AHRS = new MadgwickAHRS(0.005f, AHRS_beta); // for getting filtered Euler angles of rotation; 5ms sampling rate
|
||||||
|
|
||||||
public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, string path, string serialNum, int id = 0, bool isPro = false, bool isSnes = false, bool thirdParty = false) {
|
public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, string path, string serialNum, int id = 0, bool isPro = false, bool isSnes = false, bool thirdParty = false) {
|
||||||
serial_number = serialNum;
|
serial_number = serialNum;
|
||||||
|
@ -688,6 +689,9 @@ namespace BetterJoyForCemu {
|
||||||
string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
|
string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
|
||||||
int GyroMouseSensitivityX = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivityX"]);
|
int GyroMouseSensitivityX = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivityX"]);
|
||||||
int GyroMouseSensitivityY = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivityY"]);
|
int GyroMouseSensitivityY = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivityY"]);
|
||||||
|
float GyroStickSensitivityX = float.Parse(ConfigurationManager.AppSettings["GyroStickSensitivityX"]);
|
||||||
|
float GyroStickSensitivityY = float.Parse(ConfigurationManager.AppSettings["GyroStickSensitivityY"]);
|
||||||
|
float GyroStickReduction = float.Parse(ConfigurationManager.AppSettings["GyroStickReduction"]);
|
||||||
bool GyroHoldToggle = Boolean.Parse(ConfigurationManager.AppSettings["GyroHoldToggle"]);
|
bool GyroHoldToggle = Boolean.Parse(ConfigurationManager.AppSettings["GyroHoldToggle"]);
|
||||||
bool GyroAnalogSliders = Boolean.Parse(ConfigurationManager.AppSettings["GyroAnalogSliders"]);
|
bool GyroAnalogSliders = Boolean.Parse(ConfigurationManager.AppSettings["GyroAnalogSliders"]);
|
||||||
int GyroAnalogSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroAnalogSensitivity"]);
|
int GyroAnalogSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroAnalogSensitivity"]);
|
||||||
|
@ -787,24 +791,30 @@ namespace BetterJoyForCemu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (extraGyroFeature == "joy") {
|
string res_val = Config.Value("active_gyro");
|
||||||
// TODO
|
if (res_val.StartsWith("joy_")) {
|
||||||
} else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
|
int i = Int32.Parse(res_val.Substring(4));
|
||||||
string res_val = Config.Value("active_gyro");
|
if (GyroHoldToggle) {
|
||||||
|
if (buttons_down[i] || (other != null && other.buttons_down[i]))
|
||||||
if (res_val.StartsWith("joy_")) {
|
active_gyro = true;
|
||||||
int i = Int32.Parse(res_val.Substring(4));
|
else if (buttons_up[i] || (other != null && other.buttons_up[i]))
|
||||||
if (GyroHoldToggle) {
|
active_gyro = false;
|
||||||
if (buttons_down[i] || (other != null && other.buttons_down[i]))
|
} else {
|
||||||
active_gyro = true;
|
if (buttons_down[i] || (other != null && other.buttons_down[i]))
|
||||||
else if (buttons_up[i] || (other != null && other.buttons_up[i]))
|
active_gyro = !active_gyro;
|
||||||
active_gyro = false;
|
|
||||||
} else {
|
|
||||||
if (buttons_down[i] || (other != null && other.buttons_down[i]))
|
|
||||||
active_gyro = !active_gyro;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extraGyroFeature.Substring(0, 3) == "joy") {
|
||||||
|
if (Config.Value("active_gyro") == "0" || active_gyro) {
|
||||||
|
float[] control_stick = (extraGyroFeature == "joy_left") ? stick : stick2;
|
||||||
|
float dx = (GyroStickSensitivityX * (cur_rotation[1] - cur_rotation[4])); // yaw
|
||||||
|
float dy = -(GyroStickSensitivityY * (cur_rotation[0] - cur_rotation[3])); // pitch
|
||||||
|
|
||||||
|
control_stick[0] = Math.Max(-1.0f, Math.Min(1.0f, control_stick[0] / GyroStickReduction + dx));
|
||||||
|
control_stick[1] = Math.Max(-1.0f, Math.Min(1.0f, control_stick[1] / GyroStickReduction + dy));
|
||||||
|
}
|
||||||
|
} else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
|
||||||
// gyro data is in degrees/s
|
// gyro data is in degrees/s
|
||||||
if (Config.Value("active_gyro") == "0" || active_gyro) {
|
if (Config.Value("active_gyro") == "0" || active_gyro) {
|
||||||
int dx = (int)(GyroMouseSensitivityX * (cur_rotation[1] - cur_rotation[4])); // yaw
|
int dx = (int)(GyroMouseSensitivityX * (cur_rotation[1] - cur_rotation[4])); // yaw
|
||||||
|
|
Loading…
Add table
Reference in a new issue