fixed trigger maps; improvements to dpad mapping

gyro
NepEgor 2 years ago
parent d8f1771713
commit 42b9ed80fb

@ -7,10 +7,10 @@ class TouchDpad : public TouchControl
{
public:
enum DpadType
enum DpadType : uint8_t
{
DPAD_TYPE_SECTOR4,
DPAD_TYPE_SECTOR8
DPAD_TYPE_SECTOR_4 = 4,
DPAD_TYPE_SECTOR_8 = 8,
};
private:
@ -28,13 +28,14 @@ class TouchDpad : public TouchControl
public:
TouchDpad() {}
TouchDpad(int32_t pos_x, int32_t pos_y, int32_t pos_r, DpadType dpad_type = DPAD_TYPE_SECTOR4);
TouchDpad(int32_t pos_x, int32_t pos_y, int32_t pos_r, DpadType dpad_type = DPAD_TYPE_SECTOR_4);
void init(int32_t pos_x, int32_t pos_y, int32_t pos_r, DpadType dpad_type = DPAD_TYPE_SECTOR4);
void init(int32_t pos_x, int32_t pos_y, int32_t pos_r, DpadType dpad_type = DPAD_TYPE_SECTOR_4);
void setDeadZoneInner(int32_t dead_zone_inner);
void setType(DpadType dpad_type) {this->dpad_type = dpad_type;}
DpadType getType() {return dpad_type;}
void setInvertX(bool invert_x = true);
void setInvertY(bool invert_y = true);

@ -86,7 +86,7 @@ int8_t TouchDpad::touch(int8_t fid, int32_t tx, int32_t ty)
{
switch (dpad_type)
{
case DPAD_TYPE_SECTOR4:
case DPAD_TYPE_SECTOR_4:
button |= (invert_y * ty > invert_x * -tx);
button |= (invert_y * ty > invert_x * tx) << 1;
@ -102,7 +102,7 @@ int8_t TouchDpad::touch(int8_t fid, int32_t tx, int32_t ty)
break;
case DPAD_TYPE_SECTOR8:
case DPAD_TYPE_SECTOR_8:
button |= (invert_y * ty > invert_x * -tx * k2);
button |= (invert_y * ty > invert_x * -tx * k1) << 1;
button |= (invert_y * ty > invert_x * tx * k1) << 2;

@ -3,7 +3,6 @@
#include <stdint.h>
#include "usbd_hid_composite_if.h"
#include "usbd_report.h"
class USB_Device
@ -63,6 +62,8 @@ class USB_Device
void button(uint16_t button, uint16_t value);
uint16_t isButtonPressed(uint16_t button);
void joystick(uint8_t id, int16_t x, int16_t y);
void triggers(uint8_t values[2]);

@ -1,5 +1,6 @@
#include "usb_device.h"
#include "usbd_hid_composite_if.h"
#include "usbd_hid_custom_if.h"
void USB_Device::begin()
@ -32,6 +33,11 @@ void USB_Device::button(uint16_t button, uint16_t value)
((xinput_report.buttons & ~button) & ~value);
}
uint16_t USB_Device::isButtonPressed(uint16_t button)
{
return xinput_report.buttons & button;
}
void USB_Device::joystick(uint8_t id, int16_t x, int16_t y)
{
if (id == 0)

@ -51,39 +51,45 @@ namespace InputMapper
pos_x = 20.636 * ppmX;
pos_y = 20.636 * ppmY;
pos_r = 45 * ppmX / 2;
tdpad_right.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR4);
tdpad_right.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR_4);
tdpad_right.setDeadZoneInner(dead_zone_inner);
pos_x = (62.5 - 20.636) * ppmX;
pos_y = 20.636 * ppmY;
tdpad_left.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR4);
tdpad_left.init(pos_x, pos_y, pos_r, TouchDpad::DPAD_TYPE_SECTOR_4);
tdpad_left.setDeadZoneInner(dead_zone_inner);
device.begin();
}
uint16_t dpad_map[][4] =
uint16_t dpad_left_map[] =
{
{
USB_Device::DPAD_UP,
USB_Device::DPAD_DOWN,
USB_Device::DPAD_LEFT,
USB_Device::DPAD_RIGHT,
},
{
USB_Device::FACE_Y,
USB_Device::FACE_A,
USB_Device::FACE_X,
USB_Device::FACE_B,
},
USB_Device::DPAD_UP,
USB_Device::DPAD_DOWN,
USB_Device::DPAD_LEFT,
USB_Device::DPAD_RIGHT,
};
uint16_t dpad_right_map[] =
{
USB_Device::FACE_Y,
USB_Device::FACE_A,
USB_Device::FACE_X,
USB_Device::FACE_B,
};
uint16_t* dpad_map[] =
{
dpad_left_map,
dpad_right_map,
};
uint16_t mapDpad(uint8_t dpad, uint8_t direction)
uint16_t mapDpad(uint8_t dpad, TouchDpad::DpadType dpad_type, uint8_t direction)
{
uint16_t button = 0;
for (uint8_t i = 0; i < 4; ++i)
for (uint8_t i = 0; i < dpad_type; ++i)
{
if (direction & (1 << i))
{
@ -98,7 +104,7 @@ namespace InputMapper
{
for (uint8_t c = 0; c < num_controls; ++c)
{
int res;
int res = 0;
switch(tcontrols[id][c]->getControlType())
{
@ -106,18 +112,24 @@ namespace InputMapper
break;
case TouchControl::CT_JOYSTICK:
res = tcontrols[id][c]->touch(fid, x, y);
device.joystick(id, ((TouchJoystick*)tcontrols[id][c])->getX(), ((TouchJoystick*)tcontrols[id][c])->getY());
{
res = tcontrols[id][c]->touch(fid, x, y);
TouchJoystick* tjoy = (TouchJoystick*)tcontrols[id][c];
device.joystick(id, tjoy->getX(), tjoy->getY());
}
break;
case TouchControl::CT_DPAD:
{
uint16_t prev_button = mapDpad(id, ((TouchDpad*)tcontrols[id][c])->getButton());
TouchDpad* dpad = (TouchDpad*)tcontrols[id][c];
uint16_t prev_button = mapDpad(id, dpad->getType(), dpad->getButton());
device.button(prev_button, 0);
res = tcontrols[id][c]->touch(fid, x, y);
uint16_t button = mapDpad(id, ((TouchDpad*)tcontrols[id][c])->getButton());
uint16_t button = mapDpad(id, dpad->getType(), dpad->getButton());
device.button(button, button);
}
break;

@ -3,7 +3,7 @@
#include "trackpad.h"
#include "input_mapper.h"
const uint8_t pin_trigger[2] = {PA0, PA1};
const uint8_t pin_trigger[2] = {PA1, PA0};
const uint8_t pin_button[] =
{

Loading…
Cancel
Save