From 6177f83489247294c75ba908e96377621d4075fc Mon Sep 17 00:00:00 2001 From: ndeadly <24677491+ndeadly@users.noreply.github.com> Date: Wed, 1 Jul 2020 15:21:05 +0200 Subject: [PATCH] btdrv-mitm: improve handling of analog stick values --- btdrv-mitm/source/controllers/dualshock4.cpp | 38 +++++-------------- btdrv-mitm/source/controllers/dualshock4.hpp | 2 - .../source/controllers/switchcontroller.hpp | 2 + btdrv-mitm/source/controllers/xboxone.cpp | 31 +++------------ btdrv-mitm/source/controllers/xboxone.hpp | 1 - 5 files changed, 17 insertions(+), 57 deletions(-) diff --git a/btdrv-mitm/source/controllers/dualshock4.cpp b/btdrv-mitm/source/controllers/dualshock4.cpp index 3136308..25e5444 100644 --- a/btdrv-mitm/source/controllers/dualshock4.cpp +++ b/btdrv-mitm/source/controllers/dualshock4.cpp @@ -1,5 +1,4 @@ #include <cstring> -#include <cmath> #include <switch.h> #include <stratosphere.hpp> @@ -10,7 +9,7 @@ namespace controller { 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) { - this->mapStickValues(&dst->report0x30.left_stick, &src->report0x01.left_stick); - this->mapStickValues(&dst->report0x30.right_stick, &src->report0x01.right_stick); + dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x01.left_stick.x * scale_factor) & 0xfff; + 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) || (src->report0x01.buttons.dpad == Dualshock4DPad_SE) || @@ -126,8 +104,10 @@ namespace controller { } void Dualshock4Controller::handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst) { - this->mapStickValues(&dst->report0x30.left_stick, &src->report0x11.left_stick); - this->mapStickValues(&dst->report0x30.right_stick, &src->report0x11.right_stick); + dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x11.left_stick.x * scale_factor) & 0xfff; + 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) || (src->report0x11.buttons.dpad == Dualshock4DPad_SE) || diff --git a/btdrv-mitm/source/controllers/dualshock4.hpp b/btdrv-mitm/source/controllers/dualshock4.hpp index 09638cb..94022a7 100644 --- a/btdrv-mitm/source/controllers/dualshock4.hpp +++ b/btdrv-mitm/source/controllers/dualshock4.hpp @@ -2,7 +2,6 @@ #include "bluetoothcontroller.hpp" #include "switchcontroller.hpp" - namespace controller { enum Dualshock4ControllerVariant { @@ -113,7 +112,6 @@ namespace controller { void convertReportFormat(const HidReport *inReport, HidReport *outReport); private: - void mapStickValues(SwitchStickData *dst, const Dualshock4StickData *src); void handleInputReport0x01(const Dualshock4ReportData *src, SwitchReportData *dst); void handleInputReport0x11(const Dualshock4ReportData *src, SwitchReportData *dst); }; diff --git a/btdrv-mitm/source/controllers/switchcontroller.hpp b/btdrv-mitm/source/controllers/switchcontroller.hpp index 2f29d13..1d60990 100644 --- a/btdrv-mitm/source/controllers/switchcontroller.hpp +++ b/btdrv-mitm/source/controllers/switchcontroller.hpp @@ -1,6 +1,8 @@ #pragma once #include "bluetoothcontroller.hpp" +#define UINT12_MAX 0xfff + namespace controller { enum BatteryLevel { diff --git a/btdrv-mitm/source/controllers/xboxone.cpp b/btdrv-mitm/source/controllers/xboxone.cpp index 1a8a3e3..9b82f1b 100644 --- a/btdrv-mitm/source/controllers/xboxone.cpp +++ b/btdrv-mitm/source/controllers/xboxone.cpp @@ -1,5 +1,4 @@ #include <cstring> -#include <cmath> #include <stratosphere.hpp> #include "xboxone.hpp" @@ -8,7 +7,7 @@ namespace controller { 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) { - this->mapStickValues(&dst->report0x30.left_stick, &src->report0x01.left_stick); - this->mapStickValues(&dst->report0x30.right_stick, &src->report0x01.right_stick); + dst->report0x30.left_stick.x = static_cast<uint16_t>(src->report0x01.left_stick.x * scale_factor) & 0xfff; + 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) || (src->report0x01.buttons.dpad == XboxOneDPad_SE) || diff --git a/btdrv-mitm/source/controllers/xboxone.hpp b/btdrv-mitm/source/controllers/xboxone.hpp index 8877448..e6d429d 100644 --- a/btdrv-mitm/source/controllers/xboxone.hpp +++ b/btdrv-mitm/source/controllers/xboxone.hpp @@ -65,7 +65,6 @@ namespace controller { void convertReportFormat(const HidReport *inReport, HidReport *outReport); private: - void mapStickValues(SwitchStickData *dst, const XboxOneStickData *src); void handleInputReport0x01(const XboxOneReportData *src, SwitchReportData *dst); void handleInputReport0x02(const XboxOneReportData *src, SwitchReportData *dst);