mirror of
https://github.com/ndeadly/MissionControl
synced 2025-02-20 15:18:28 +00:00
btdrv-mitm: improve handling of analog stick values
This commit is contained in:
parent
24de4fa145
commit
6177f83489
5 changed files with 17 additions and 57 deletions
btdrv-mitm/source/controllers
|
@ -1,5 +1,4 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cmath>
|
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
@ -10,7 +9,7 @@ namespace controller {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const constexpr uint8_t dualshock4_joystick_nbits = 8;
|
const constexpr float scale_factor = float(UINT12_MAX) / UINT8_MAX;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,32 +64,11 @@ namespace controller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dualshock4Controller::mapStickValues(SwitchStickData *dst, const Dualshock4StickData *src) {
|
|
||||||
|
|
||||||
dst->x = static_cast<uint16_t>(src->x * (powf(2, 12) - 1) / UINT8_MAX) & 0xfff;
|
|
||||||
dst->y = static_cast<uint16_t>((UINT8_MAX - src->y) * (powf(2, 12) - 1) / UINT8_MAX) & 0xfff;
|
|
||||||
|
|
||||||
/*
|
|
||||||
dst->dx = unsigned_to_signed(src->x, dualshock4_joystick_nbits);
|
|
||||||
dst->dy = -unsigned_to_signed(src->y, dualshock4_joystick_nbits);
|
|
||||||
|
|
||||||
float angle = atan2(dst->dy, dst->dx);
|
|
||||||
float magnitude = hypot(dst->dx, dst->dy);
|
|
||||||
|
|
||||||
if (magnitude < m_innerDeadzone) {
|
|
||||||
dst->dx = 0;
|
|
||||||
dst->dy = 0;
|
|
||||||
}
|
|
||||||
else if (magnitude > m_outerDeadzone) {
|
|
||||||
dst->dx = JOYSTICK_MAX * cos(angle);
|
|
||||||
dst->dy = JOYSTICK_MAX * sin(angle);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void Dualshock4Controller::handleInputReport0x01(const Dualshock4ReportData *src, SwitchReportData *dst) {
|
void Dualshock4Controller::handleInputReport0x01(const Dualshock4ReportData *src, SwitchReportData *dst) {
|
||||||
this->mapStickValues(&dst->report0x30.left_stick, &src->report0x01.left_stick);
|
dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x01.left_stick.x * scale_factor) & 0xfff;
|
||||||
this->mapStickValues(&dst->report0x30.right_stick, &src->report0x01.right_stick);
|
dst->report0x30.left_stick.y = static_cast<uint16_t>((UINT8_MAX - src->report0x01.left_stick.y) * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.x = static_cast<uint16_t>(src->report0x01.right_stick.x * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.y = static_cast<uint16_t>((UINT8_MAX - src->report0x01.right_stick.y) * scale_factor) & 0xfff;
|
||||||
|
|
||||||
dst->report0x30.buttons.dpad_down = (src->report0x01.buttons.dpad == Dualshock4DPad_S) ||
|
dst->report0x30.buttons.dpad_down = (src->report0x01.buttons.dpad == Dualshock4DPad_S) ||
|
||||||
(src->report0x01.buttons.dpad == Dualshock4DPad_SE) ||
|
(src->report0x01.buttons.dpad == Dualshock4DPad_SE) ||
|
||||||
|
@ -126,8 +104,10 @@ namespace controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dualshock4Controller::handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst) {
|
void Dualshock4Controller::handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst) {
|
||||||
this->mapStickValues(&dst->report0x30.left_stick, &src->report0x11.left_stick);
|
dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x11.left_stick.x * scale_factor) & 0xfff;
|
||||||
this->mapStickValues(&dst->report0x30.right_stick, &src->report0x11.right_stick);
|
dst->report0x30.left_stick.y = static_cast<uint16_t>((UINT8_MAX - src->report0x11.left_stick.y) * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.x = static_cast<uint16_t>(src->report0x11.right_stick.x * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.y = static_cast<uint16_t>((UINT8_MAX - src->report0x11.right_stick.y) * scale_factor) & 0xfff;
|
||||||
|
|
||||||
dst->report0x30.buttons.dpad_down = (src->report0x11.buttons.dpad == Dualshock4DPad_S) ||
|
dst->report0x30.buttons.dpad_down = (src->report0x11.buttons.dpad == Dualshock4DPad_S) ||
|
||||||
(src->report0x11.buttons.dpad == Dualshock4DPad_SE) ||
|
(src->report0x11.buttons.dpad == Dualshock4DPad_SE) ||
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
#include "bluetoothcontroller.hpp"
|
#include "bluetoothcontroller.hpp"
|
||||||
#include "switchcontroller.hpp"
|
#include "switchcontroller.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace controller {
|
namespace controller {
|
||||||
|
|
||||||
enum Dualshock4ControllerVariant {
|
enum Dualshock4ControllerVariant {
|
||||||
|
@ -113,7 +112,6 @@ namespace controller {
|
||||||
void convertReportFormat(const HidReport *inReport, HidReport *outReport);
|
void convertReportFormat(const HidReport *inReport, HidReport *outReport);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void mapStickValues(SwitchStickData *dst, const Dualshock4StickData *src);
|
|
||||||
void handleInputReport0x01(const Dualshock4ReportData *src, SwitchReportData *dst);
|
void handleInputReport0x01(const Dualshock4ReportData *src, SwitchReportData *dst);
|
||||||
void handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst);
|
void handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "bluetoothcontroller.hpp"
|
#include "bluetoothcontroller.hpp"
|
||||||
|
|
||||||
|
#define UINT12_MAX 0xfff
|
||||||
|
|
||||||
namespace controller {
|
namespace controller {
|
||||||
|
|
||||||
enum BatteryLevel {
|
enum BatteryLevel {
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cmath>
|
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
#include "xboxone.hpp"
|
#include "xboxone.hpp"
|
||||||
|
@ -8,7 +7,7 @@ namespace controller {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const constexpr uint8_t xboxone_joystick_nbits = 16;
|
const constexpr float scale_factor = float(UINT12_MAX) / UINT16_MAX;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,30 +40,12 @@ namespace controller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void XboxOneController::mapStickValues(SwitchStickData *dst, const XboxOneStickData *src) {
|
|
||||||
dst->x = static_cast<uint16_t>(src->x * (powf(2, 12) - 1) / UINT16_MAX) & 0xfff;
|
|
||||||
dst->y = static_cast<uint16_t>((UINT16_MAX - src->y) * (powf(2, 12) - 1) / UINT16_MAX) & 0xfff;
|
|
||||||
/*
|
|
||||||
dst->dx = unsigned_to_signed(src->x, xboxone_joystick_nbits);
|
|
||||||
dst->dy = -unsigned_to_signed(src->y, xboxone_joystick_nbits);
|
|
||||||
|
|
||||||
float angle = atan2(dst->dy, dst->dx);
|
|
||||||
float magnitude = hypot(dst->dx, dst->dy);
|
|
||||||
|
|
||||||
if (magnitude < m_innerDeadzone) {
|
|
||||||
dst->dx = 0;
|
|
||||||
dst->dy = 0;
|
|
||||||
}
|
|
||||||
else if (magnitude > m_outerDeadzone) {
|
|
||||||
dst->dx = JOYSTICK_MAX * cos(angle);
|
|
||||||
dst->dy = JOYSTICK_MAX * sin(angle);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void XboxOneController::handleInputReport0x01(const XboxOneReportData *src, SwitchReportData *dst) {
|
void XboxOneController::handleInputReport0x01(const XboxOneReportData *src, SwitchReportData *dst) {
|
||||||
this->mapStickValues(&dst->report0x30.left_stick, &src->report0x01.left_stick);
|
dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x01.left_stick.x * scale_factor) & 0xfff;
|
||||||
this->mapStickValues(&dst->report0x30.right_stick, &src->report0x01.right_stick);
|
dst->report0x30.left_stick.y = static_cast<uint16_t>((UINT16_MAX - src->report0x01.left_stick.y) * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.x = static_cast<uint16_t>(src->report0x01.right_stick.x * scale_factor) & 0xfff;
|
||||||
|
dst->report0x30.right_stick.y = static_cast<uint16_t>((UINT16_MAX - src->report0x01.right_stick.y) * scale_factor) & 0xfff;
|
||||||
|
|
||||||
|
|
||||||
dst->report0x30.buttons.dpad_down = (src->report0x01.buttons.dpad == XboxOneDPad_S) ||
|
dst->report0x30.buttons.dpad_down = (src->report0x01.buttons.dpad == XboxOneDPad_S) ||
|
||||||
(src->report0x01.buttons.dpad == XboxOneDPad_SE) ||
|
(src->report0x01.buttons.dpad == XboxOneDPad_SE) ||
|
||||||
|
|
|
@ -65,7 +65,6 @@ namespace controller {
|
||||||
void convertReportFormat(const HidReport *inReport, HidReport *outReport);
|
void convertReportFormat(const HidReport *inReport, HidReport *outReport);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void mapStickValues(SwitchStickData *dst, const XboxOneStickData *src);
|
|
||||||
void handleInputReport0x01(const XboxOneReportData *src, SwitchReportData *dst);
|
void handleInputReport0x01(const XboxOneReportData *src, SwitchReportData *dst);
|
||||||
void handleInputReport0x02(const XboxOneReportData *src, SwitchReportData *dst);
|
void handleInputReport0x02(const XboxOneReportData *src, SwitchReportData *dst);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue