Skip to content

Commit

Permalink
Add input remapping
Browse files Browse the repository at this point in the history
  • Loading branch information
cathery committed Nov 7, 2019
1 parent d8c5237 commit 114e466
Show file tree
Hide file tree
Showing 18 changed files with 324 additions and 377 deletions.
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

23 changes: 15 additions & 8 deletions ControllerUSB/include/ControllerConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ enum ControllerButton
FACE_RIGHT,
FACE_DOWN,
FACE_LEFT,
LSTICK,
RSTICK,
LSTICK_CLICK,
RSTICK_CLICK,
LEFT_BUMPER,
Expand All @@ -23,14 +21,23 @@ enum ControllerButton
DPAD_LEFT,
SYNC,
GUIDE,
NUM_CONTROLLERBUTTONS,
};

struct NormalizedStick
{
float axis_x;
float axis_y;
};

struct ControllerConfig
{
uint16_t leftStickDeadzone;
uint16_t rightStickDeadzone;
uint16_t leftStickRotation;
uint16_t rightStickRotation;
uint16_t triggerDeadzone;
ControllerButton buttons[20];
uint8_t leftStickDeadzonePercent;
uint8_t rightStickDeadzonePercent;
uint16_t leftStickRotationDegrees;
uint16_t rightStickRotationDegrees;
uint8_t triggerDeadzonePercent;
ControllerButton buttons[NUM_CONTROLLERBUTTONS];
float triggers[2];
NormalizedStick sticks[2];
};
9 changes: 9 additions & 0 deletions ControllerUSB/include/ControllerTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,15 @@ enum VendorIDs
enum ProductIDs
{
PRODUCT_XBOX360 = 0x28e,
/*
PRODUCT_XBOX360_WIRELESS = 0x28F,
PRODUCT_XBOX360_WIRELESS_MODULE = 0x765,
PRODUCT_XBOX360_WIRELESS_ADAPTER = 0x719,
PRODUCT_XBOX360_WIRELESS_N_ADAPTER = 0x2A8,
PRODUCT_XBOX360_WIRELESS_NETWORK_ADAPTER = 0x292,
PRODUCT_XBOX360_WIRELESS_RECEIVER = 0x2A1,
PRODUCT_XBOX360_WIRELESS_RECEIVER_2 = 0x291,
*/
PRODUCT_XBOXONE2013 = 0x2d1,
PRODUCT_XBOXONE2015 = 0x2dd,
PRODUCT_XBOXONEELITE = 0x2e3,
Expand Down
2 changes: 1 addition & 1 deletion ControllerUSB/include/Controllers/Dualshock3Controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ class Dualshock3Controller : public IController
inline const Dualshock3ButtonData &GetButtonData() { return m_buttonData; };

float NormalizeTrigger(uint8_t value);
void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzone, float *x_out, float *y_out);
void NormalizeAxis(uint8_t x, uint8_t y, uint8_t deadzonePercent, float *x_out, float *y_out);

Status SendInitBytes();
Status SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude);
Expand Down
2 changes: 1 addition & 1 deletion ControllerUSB/include/Controllers/Dualshock4Controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class Dualshock4Controller : public IController
inline const Dualshock4ButtonData &GetButtonData() { return m_buttonData; };

float NormalizeTrigger(uint16_t value);
void NormalizeAxis(int16_t x, int16_t y, int16_t deadzone, float *x_out, float *y_out);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);

Status SendInitBytes();
Status SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude);
Expand Down
4 changes: 2 additions & 2 deletions ControllerUSB/include/Controllers/Xbox360Controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ class Xbox360Controller : public IController

inline const Xbox360ButtonData &GetButtonData() { return m_buttonData; };

float NormalizeTrigger(uint16_t value);
void NormalizeAxis(int16_t x, int16_t y, int16_t deadzone, float *x_out, float *y_out);
float NormalizeTrigger(uint8_t value);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);

Status SendInitBytes();
Status SetRumble(uint8_t strong_magnitude, uint8_t weak_magnitude);
Expand Down
2 changes: 1 addition & 1 deletion ControllerUSB/include/Controllers/XboxOneController.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ class XboxOneController : public IController
inline const XboxOneButtonData &GetButtonData() { return m_buttonData; };

float NormalizeTrigger(uint16_t value);
void NormalizeAxis(int16_t x, int16_t y, int16_t deadzone, float *x_out, float *y_out);
void NormalizeAxis(int16_t x, int16_t y, uint8_t deadzonePercent, float *x_out, float *y_out);

Status SendInitBytes();
Status WriteAckGuideReport(uint8_t sequence);
Expand Down
43 changes: 3 additions & 40 deletions ControllerUSB/include/IController.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,46 +6,9 @@

struct NormalizedButtonData
{
//ABXY; BAYX; square triangle cross circle; etc.
bool bottom_action;
bool right_action;
bool left_action;
bool top_action;

//dpad directions
bool dpad_up;
bool dpad_down;
bool dpad_left;
bool dpad_right;

// back start; select start; view and menu; share and options; etc.
bool back;
bool start;

//bumpers
bool left_bumper;
bool right_bumper;

//stick buttons
bool left_stick_click;
bool right_stick_click;

//reserved for switch's capture and home buttons
bool capture;
bool home;

//reserved for xbox's large led button or dualshock's PS button
bool guide;

//trigger values from 0.0f to 1.0f
float left_trigger;
float right_trigger;

//stick position values from -1.0f to 1.0f
float left_stick_x;
float left_stick_y;
float right_stick_x;
float right_stick_y;
bool buttons[NUM_CONTROLLERBUTTONS];
float triggers[2];
NormalizedStick sticks[2];
};

class IController
Expand Down
32 changes: 26 additions & 6 deletions ControllerUSB/source/ControllerHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,23 @@ std::vector<uint16_t> GetVendorProducts(uint16_t vendor_id)
switch (vendor_id)
{
case VENDOR_MICROSOFT:
return {PRODUCT_XBOX360,
PRODUCT_XBOXONE2013,
PRODUCT_XBOXONE2015,
PRODUCT_XBOXONEELITE,
PRODUCT_XBOXONES,
PRODUCT_XBOXADAPTIVE};
return {
PRODUCT_XBOX360,
PRODUCT_XBOXONE2013,
PRODUCT_XBOXONE2015,
PRODUCT_XBOXONEELITE,
PRODUCT_XBOXONES,
PRODUCT_XBOXADAPTIVE,
/*
PRODUCT_XBOX360_WIRELESS,
PRODUCT_XBOX360_WIRELESS_MODULE,
PRODUCT_XBOX360_WIRELESS_ADAPTER,
PRODUCT_XBOX360_WIRELESS_N_ADAPTER,
PRODUCT_XBOX360_WIRELESS_NETWORK_ADAPTER,
PRODUCT_XBOX360_WIRELESS_RECEIVER,
PRODUCT_XBOX360_WIRELESS_RECEIVER_2
*/
};
case VENDOR_SONY:
return {PRODUCT_DUALSHOCK3,
PRODUCT_DUALSHOCK4};
Expand Down Expand Up @@ -51,6 +62,15 @@ ControllerType GetControllerTypeFromIds(uint16_t vendor_id, uint16_t product_id)
switch (product_id)
{
case PRODUCT_XBOX360:
/*
case PRODUCT_XBOX360_WIRELESS:
case PRODUCT_XBOX360_WIRELESS_MODULE:
case PRODUCT_XBOX360_WIRELESS_ADAPTER:
case PRODUCT_XBOX360_WIRELESS_N_ADAPTER:
case PRODUCT_XBOX360_WIRELESS_NETWORK_ADAPTER:
case PRODUCT_XBOX360_WIRELESS_RECEIVER:
case PRODUCT_XBOX360_WIRELESS_RECEIVER_2:
*/
return CONTROLLER_XBOX360;
case PRODUCT_XBOXONE2013:
case PRODUCT_XBOXONE2015:
Expand Down
82 changes: 43 additions & 39 deletions ControllerUSB/source/Controllers/Dualshock3Controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ Status Dualshock3Controller::OpenInterfaces()
}
void Dualshock3Controller::CloseInterfaces()
{
m_device->Reset();
//m_device->Reset();
m_device->Close();
}

Expand All @@ -117,16 +117,16 @@ Status Dualshock3Controller::GetInput()

float Dualshock3Controller::NormalizeTrigger(uint8_t value)
{
uint8_t deadzone = (UINT8_MAX * _dualshock3ControllerConfig.triggerDeadzonePercent) / 100;
//If the given value is below the trigger zone, save the calc and return 0, otherwise adjust the value to the deadzone
return value < _dualshock3ControllerConfig.triggerDeadzone
return value < deadzone
? 0
: static_cast<float>(value - _dualshock3ControllerConfig.triggerDeadzone) /
(UINT8_MAX - _dualshock3ControllerConfig.triggerDeadzone);
: static_cast<float>(value - deadzone) / (UINT8_MAX - deadzone);
}

void Dualshock3Controller::NormalizeAxis(uint8_t x,
uint8_t y,
uint8_t deadzone,
uint8_t deadzonePercent,
float *x_out,
float *y_out)
{
Expand All @@ -136,17 +136,18 @@ void Dualshock3Controller::NormalizeAxis(uint8_t x,
//This will never exceed 32767 because if the stick is
//horizontally maxed in one direction, vertically it must be neutral(0) and vice versa
float real_magnitude = std::sqrt(x_val * x_val + y_val * y_val);
float real_deadzone = (127 * deadzonePercent) / 100;
// Check if the controller is outside a circular dead zone.
if (real_magnitude > deadzone)
if (real_magnitude > real_deadzone)
{
// Clip the magnitude at its expected maximum value.
float magnitude = std::min(127.0f, real_magnitude);
// Adjust magnitude relative to the end of the dead zone.
magnitude -= deadzone;
magnitude -= real_deadzone;
// Normalize the magnitude with respect to its expected range giving a
// magnitude value of 0.0 to 1.0
//ratio = (currentValue / maxValue) / realValue
float ratio = (magnitude / (127 - deadzone)) / real_magnitude;
float ratio = (magnitude / (127 - real_deadzone)) / real_magnitude;
*x_out = x_val * ratio;
*y_out = y_val * ratio;
}
Expand All @@ -162,37 +163,40 @@ NormalizedButtonData Dualshock3Controller::GetNormalizedButtonData()
{
NormalizedButtonData normalData;

normalData.bottom_action = m_buttonData.cross;
normalData.right_action = m_buttonData.circle;
normalData.left_action = m_buttonData.square;
normalData.top_action = m_buttonData.triangle;

normalData.dpad_up = m_buttonData.dpad_up;
normalData.dpad_down = m_buttonData.dpad_down;
normalData.dpad_left = m_buttonData.dpad_left;
normalData.dpad_right = m_buttonData.dpad_right;

normalData.back = m_buttonData.back;
normalData.start = m_buttonData.start;

normalData.left_bumper = m_buttonData.bumper_left;
normalData.right_bumper = m_buttonData.bumper_right;

normalData.left_stick_click = m_buttonData.stick_left_click;
normalData.right_stick_click = m_buttonData.stick_right_click;

normalData.capture = false;
normalData.home = false;

normalData.guide = m_buttonData.guide;

normalData.left_trigger = m_buttonData.trigger_left;
normalData.right_trigger = m_buttonData.trigger_right;

NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock3ControllerConfig.leftStickDeadzone,
&normalData.left_stick_x, &normalData.left_stick_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock3ControllerConfig.rightStickDeadzone,
&normalData.right_stick_x, &normalData.right_stick_y);
normalData.triggers[0] = NormalizeTrigger(m_buttonData.trigger_left_pressure);
normalData.triggers[1] = NormalizeTrigger(m_buttonData.trigger_right_pressure);

NormalizeAxis(m_buttonData.stick_left_x, m_buttonData.stick_left_y, _dualshock3ControllerConfig.leftStickDeadzonePercent,
&normalData.sticks[0].axis_x, &normalData.sticks[0].axis_y);
NormalizeAxis(m_buttonData.stick_right_x, m_buttonData.stick_right_y, _dualshock3ControllerConfig.rightStickDeadzonePercent,
&normalData.sticks[1].axis_x, &normalData.sticks[1].axis_y);

bool buttons[NUM_CONTROLLERBUTTONS] = {
m_buttonData.triangle,
m_buttonData.circle,
m_buttonData.cross,
m_buttonData.square,
m_buttonData.stick_left_click,
m_buttonData.stick_right_click,
m_buttonData.bumper_left,
m_buttonData.bumper_right,
normalData.triggers[0] > 0,
normalData.triggers[1] > 0,
m_buttonData.back,
m_buttonData.start,
m_buttonData.dpad_up,
m_buttonData.dpad_right,
m_buttonData.dpad_down,
m_buttonData.dpad_left,
false,
m_buttonData.guide,
};

for (int i = 0; i != NUM_CONTROLLERBUTTONS; ++i)
{
ControllerButton button = _dualshock3ControllerConfig.buttons[i];
normalData.buttons[(button != NOT_SET ? button : i)] = buttons[i];
}

return normalData;
}
Expand Down
Loading

0 comments on commit 114e466

Please sign in to comment.