mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-20 19:45:20 +00:00
Added pressure support for keys, redid analog 'key' stick support
This commit is contained in:
parent
0d4e950769
commit
387eac4d08
2 changed files with 101 additions and 46 deletions
|
@ -93,6 +93,7 @@ struct Button
|
|||
u32 m_offset;
|
||||
u32 m_keyCode;
|
||||
u32 m_outKeyCode;
|
||||
u16 m_value;
|
||||
bool m_pressed;
|
||||
bool m_flush;
|
||||
|
||||
|
@ -102,6 +103,7 @@ struct Button
|
|||
, m_offset(offset)
|
||||
, m_keyCode(keyCode)
|
||||
, m_outKeyCode(outKeyCode)
|
||||
, m_value(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
@ -111,15 +113,17 @@ struct AnalogStick
|
|||
u32 m_offset;
|
||||
u32 m_keyCodeMin;
|
||||
u32 m_keyCodeMax;
|
||||
bool m_min_pressed;
|
||||
bool m_max_pressed;
|
||||
u16 m_value;
|
||||
//bool m_min_pressed;
|
||||
//bool m_max_pressed;
|
||||
|
||||
AnalogStick(u32 offset, u32 keyCodeMin, u32 keyCodeMax)
|
||||
: m_min_pressed(false)
|
||||
, m_max_pressed(false)
|
||||
, m_offset(offset)
|
||||
:// m_min_pressed(false)
|
||||
//, m_max_pressed(false)
|
||||
m_offset(offset)
|
||||
, m_keyCodeMin(keyCodeMin)
|
||||
, m_keyCodeMax(keyCodeMax)
|
||||
, m_value(128)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
@ -134,10 +138,15 @@ struct Pad
|
|||
std::vector<Button> m_buttons;
|
||||
std::vector<AnalogStick> m_sticks;
|
||||
|
||||
s16 m_analog_left_x;
|
||||
s16 m_analog_left_y;
|
||||
s16 m_analog_right_x;
|
||||
s16 m_analog_right_y;
|
||||
//These hold bits for their respective buttons
|
||||
u16 m_digital_1;
|
||||
u16 m_digital_2;
|
||||
|
||||
//All sensors go from 0-255
|
||||
u16 m_analog_left_x;
|
||||
u16 m_analog_left_y;
|
||||
u16 m_analog_right_x;
|
||||
u16 m_analog_right_y;
|
||||
|
||||
u16 m_press_right;
|
||||
u16 m_press_left;
|
||||
|
@ -152,6 +161,8 @@ struct Pad
|
|||
u16 m_press_R1;
|
||||
u16 m_press_R2;
|
||||
|
||||
//Except for these...0-1023
|
||||
//~399 on sensor y is a level non moving controller
|
||||
u16 m_sensor_x;
|
||||
u16 m_sensor_y;
|
||||
u16 m_sensor_z;
|
||||
|
@ -163,6 +174,9 @@ struct Pad
|
|||
, m_device_capability(device_capability)
|
||||
, m_device_type(device_type)
|
||||
|
||||
, m_digital_1(0)
|
||||
, m_digital_2(0)
|
||||
|
||||
, m_analog_left_x(128)
|
||||
, m_analog_left_y(128)
|
||||
, m_analog_right_x(128)
|
||||
|
@ -182,7 +196,7 @@ struct Pad
|
|||
, m_press_R2(0)
|
||||
|
||||
, m_sensor_x(0)
|
||||
, m_sensor_y(0)
|
||||
, m_sensor_y(399)
|
||||
, m_sensor_z(0)
|
||||
, m_sensor_g(0)
|
||||
{
|
||||
|
@ -207,25 +221,34 @@ public:
|
|||
virtual void Close()=0;
|
||||
virtual ~PadHandlerBase() = default;
|
||||
|
||||
void Key(const u32 code, bool pressed)
|
||||
//Set value to set pressure/axi to certain level, otherwise 0/255 default
|
||||
void Key(const u32 code, bool pressed, u16 value=256)
|
||||
{
|
||||
for(Pad& pad : m_pads)
|
||||
{
|
||||
for(Button& button : pad.m_buttons)
|
||||
for (Button& button : pad.m_buttons)
|
||||
{
|
||||
if(button.m_keyCode != code)
|
||||
if (button.m_keyCode != code)
|
||||
continue;
|
||||
|
||||
//This is for reporting when a controller connects/disconnects, shouldn't be here
|
||||
//pad.m_port_status |= CELL_PAD_STATUS_ASSIGN_CHANGES;
|
||||
|
||||
if(button.m_pressed && !pressed)
|
||||
if (value >= 256){ value = 255; }
|
||||
|
||||
//Todo: Is this flush necessary once games hit decent speeds?
|
||||
if (button.m_pressed && !pressed)
|
||||
{
|
||||
button.m_flush = true;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
button.m_pressed = pressed;
|
||||
if (pressed)
|
||||
button.m_value = value;
|
||||
else
|
||||
button.m_value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -234,15 +257,25 @@ public:
|
|||
if (stick.m_keyCodeMax != code && stick.m_keyCodeMin != code)
|
||||
continue;
|
||||
|
||||
//slightly less hack job for key based analog stick
|
||||
// should also fix/make transitions when using keys smoother
|
||||
// the logic here is that when a key is released,
|
||||
// if we are at the opposite end of the axis, dont reset to middle
|
||||
if (stick.m_keyCodeMax == code)
|
||||
{
|
||||
stick.m_min_pressed = false; //!!! need fix !!!
|
||||
stick.m_max_pressed = pressed;
|
||||
/*stick.m_min_pressed = false; //!!! need fix !!!
|
||||
stick.m_max_pressed = pressed;*/
|
||||
if (pressed) stick.m_value = 255;
|
||||
else if (stick.m_value==0) stick.m_value = 0;
|
||||
else stick.m_value = 128;
|
||||
}
|
||||
if (stick.m_keyCodeMin == code)
|
||||
{
|
||||
stick.m_max_pressed = false; //!!!
|
||||
stick.m_min_pressed = pressed;
|
||||
/*stick.m_max_pressed = false; //!!!
|
||||
stick.m_min_pressed = pressed;*/
|
||||
if (pressed) stick.m_value = 0;
|
||||
else if (stick.m_value == 255) stick.m_value = 255;
|
||||
else stick.m_value = 128;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,57 +92,79 @@ int cellPadGetData(u32 port_no, u32 data_addr)
|
|||
CellPadData data;
|
||||
memset(&data, 0, sizeof(CellPadData));
|
||||
|
||||
u16 d1 = 0;
|
||||
u16 d2 = 0;
|
||||
|
||||
for(Button& button : pad.m_buttons)
|
||||
{
|
||||
switch(button.m_offset)
|
||||
//using an if/else here, not doing switch in switch
|
||||
//plus side is this gives us the ability to check if anything changed eventually
|
||||
|
||||
if (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL1)
|
||||
{
|
||||
case CELL_PAD_BTN_OFFSET_DIGITAL1:
|
||||
if (button.m_pressed) d1 |= button.m_outKeyCode;
|
||||
break;
|
||||
case CELL_PAD_BTN_OFFSET_DIGITAL2:
|
||||
if (button.m_pressed) d2 |= button.m_outKeyCode;
|
||||
break;
|
||||
if (button.m_pressed) pad.m_digital_1 |= button.m_outKeyCode;
|
||||
|
||||
switch (button.m_outKeyCode)
|
||||
{
|
||||
case CELL_PAD_CTRL_LEFT: pad.m_press_left = button.m_value; break;
|
||||
case CELL_PAD_CTRL_DOWN: pad.m_press_down = button.m_value; break;
|
||||
case CELL_PAD_CTRL_RIGHT: pad.m_press_right = button.m_value; break;
|
||||
case CELL_PAD_CTRL_UP: pad.m_press_up = button.m_value; break;
|
||||
//These arent pressure btns
|
||||
case CELL_PAD_CTRL_R3:
|
||||
case CELL_PAD_CTRL_L3:
|
||||
case CELL_PAD_CTRL_START:
|
||||
case CELL_PAD_CTRL_SELECT:
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
else if (button.m_offset == CELL_PAD_BTN_OFFSET_DIGITAL2)
|
||||
{
|
||||
if (button.m_pressed) pad.m_digital_2 |= button.m_outKeyCode;
|
||||
switch (button.m_outKeyCode)
|
||||
{
|
||||
case CELL_PAD_CTRL_SQUARE: pad.m_press_square = button.m_value; break;
|
||||
case CELL_PAD_CTRL_CROSS: pad.m_press_cross = button.m_value; break;
|
||||
case CELL_PAD_CTRL_CIRCLE: pad.m_press_circle = button.m_value; break;
|
||||
case CELL_PAD_CTRL_TRIANGLE: pad.m_press_triangle = button.m_value; break;
|
||||
case CELL_PAD_CTRL_R1: pad.m_press_R1 = button.m_value; break;
|
||||
case CELL_PAD_CTRL_L1: pad.m_press_L1 = button.m_value; break;
|
||||
case CELL_PAD_CTRL_R2: pad.m_press_R2 = button.m_value; break;
|
||||
case CELL_PAD_CTRL_L2: pad.m_press_L2 = button.m_value; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
if(button.m_flush)
|
||||
{
|
||||
button.m_pressed = false;
|
||||
button.m_flush = false;
|
||||
button.m_value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
u16 lx = 128;
|
||||
u16 ly = 128;
|
||||
u16 rx = 128;
|
||||
u16 ry = 128;
|
||||
for (const AnalogStick& stick : pads[port_no].m_sticks)
|
||||
{
|
||||
u16* res;
|
||||
switch (stick.m_offset)
|
||||
{
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X: res = &lx; break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y: res = &ly; break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X: res = ℞ break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y: res = &ry; break;
|
||||
default: continue;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X: pad.m_analog_left_x = stick.m_value; break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y: pad.m_analog_left_y = stick.m_value; break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X: pad.m_analog_right_x = stick.m_value; break;
|
||||
case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y: pad.m_analog_right_y = stick.m_value; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
if (stick.m_max_pressed && !stick.m_min_pressed)
|
||||
/*if (stick.m_max_pressed && !stick.m_min_pressed)
|
||||
*res = 255;
|
||||
if (stick.m_min_pressed && !stick.m_max_pressed)
|
||||
*res = 0;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
data.len = pad.m_buttons.size();
|
||||
data.button[CELL_PAD_BTN_OFFSET_DIGITAL1] = d1;
|
||||
data.button[CELL_PAD_BTN_OFFSET_DIGITAL2] = d2;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X] = rx;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y] = ry;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X] = lx;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y] = ly;
|
||||
data.button[CELL_PAD_BTN_OFFSET_DIGITAL1] = pad.m_digital_1;
|
||||
data.button[CELL_PAD_BTN_OFFSET_DIGITAL2] = pad.m_digital_2;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X] = pad.m_analog_right_x;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y] = pad.m_analog_right_y;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X] = pad.m_analog_left_x;
|
||||
data.button[CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y] = pad.m_analog_left_y;
|
||||
data.button[CELL_PAD_BTN_OFFSET_PRESS_RIGHT] = pad.m_press_right;
|
||||
data.button[CELL_PAD_BTN_OFFSET_PRESS_LEFT] = pad.m_press_left;
|
||||
data.button[CELL_PAD_BTN_OFFSET_PRESS_UP] = pad.m_press_up;
|
||||
|
|
Loading…
Add table
Reference in a new issue