onepad: handle correctly the release state of analog pad

Axe ranges from 0 to 255 but the release state value is 127 not 128.

close #243
This commit is contained in:
Gregory Hainaut 2016-07-25 19:55:54 +02:00
parent 77b9f2c15e
commit 0937526aac
2 changed files with 21 additions and 17 deletions

View File

@ -33,18 +33,18 @@ void KeyStatus::Init()
m_internal_button_pressure[pad][index] = 0xFF; m_internal_button_pressure[pad][index] = 0xFF;
} }
m_analog[pad].lx = 0x80; m_analog[pad].lx = m_analog_released_val;
m_analog[pad].ly = 0x80; m_analog[pad].ly = m_analog_released_val;
m_analog[pad].rx = 0x80; m_analog[pad].rx = m_analog_released_val;
m_analog[pad].ry = 0x80; m_analog[pad].ry = m_analog_released_val;
m_internal_analog_kbd[pad].lx = 0x80; m_internal_analog_kbd[pad].lx = m_analog_released_val;
m_internal_analog_kbd[pad].ly = 0x80; m_internal_analog_kbd[pad].ly = m_analog_released_val;
m_internal_analog_kbd[pad].rx = 0x80; m_internal_analog_kbd[pad].rx = m_analog_released_val;
m_internal_analog_kbd[pad].ry = 0x80; m_internal_analog_kbd[pad].ry = m_analog_released_val;
m_internal_analog_joy[pad].lx = 0x80; m_internal_analog_joy[pad].lx = m_analog_released_val;
m_internal_analog_joy[pad].ly = 0x80; m_internal_analog_joy[pad].ly = m_analog_released_val;
m_internal_analog_joy[pad].rx = 0x80; m_internal_analog_joy[pad].rx = m_analog_released_val;
m_internal_analog_joy[pad].ry = 0x80; m_internal_analog_joy[pad].ry = m_analog_released_val;
} }
} }
@ -69,8 +69,10 @@ void KeyStatus::press(u32 pad, u32 index, s32 value)
// Normal mode : expect value 0 -> 80 -> FF // Normal mode : expect value 0 -> 80 -> FF
// Reverse mode: expect value FF -> 7F -> 0 // Reverse mode: expect value FF -> 7F -> 0
u8 force = (value / 256); u8 force = (value / 256);
if (analog_is_reversed(pad,index)) analog_set(pad, index, 0x7F - force); if (analog_is_reversed(pad,index))
else analog_set(pad, index, 0x80 + force); analog_set(pad, index, m_analog_released_val - force);
else
analog_set(pad, index, m_analog_released_val + force);
} }
} }
@ -82,7 +84,7 @@ void KeyStatus::release(u32 pad, u32 index)
else else
set_bit(m_internal_button_joy[pad], index); set_bit(m_internal_button_joy[pad], index);
} else { } else {
analog_set(pad, index, 0x80); analog_set(pad, index, m_analog_released_val);
} }
} }
@ -163,7 +165,7 @@ u8 KeyStatus::get(u32 pad, u32 index)
u8 KeyStatus::analog_merge(u8 kbd, u8 joy) u8 KeyStatus::analog_merge(u8 kbd, u8 joy)
{ {
if (kbd != 0x80) if (kbd != m_analog_released_val)
return kbd; return kbd;
else else
return joy; return joy;

View File

@ -35,6 +35,8 @@ typedef struct
class KeyStatus class KeyStatus
{ {
private: private:
const u8 m_analog_released_val;
u16 m_button[GAMEPAD_NUMBER]; u16 m_button[GAMEPAD_NUMBER];
u16 m_internal_button_kbd[GAMEPAD_NUMBER]; u16 m_internal_button_kbd[GAMEPAD_NUMBER];
u16 m_internal_button_joy[GAMEPAD_NUMBER]; u16 m_internal_button_joy[GAMEPAD_NUMBER];
@ -53,7 +55,7 @@ class KeyStatus
u8 analog_merge(u8 kbd, u8 joy); u8 analog_merge(u8 kbd, u8 joy);
public: public:
KeyStatus() { Init(); } KeyStatus() : m_analog_released_val(0x7F) { Init(); }
void Init(); void Init();
void keyboard_state_acces(u32 pad) { m_state_acces[pad] = true; } void keyboard_state_acces(u32 pad) { m_state_acces[pad] = true; }