onepad: remove SDL1 manual detection code path

This commit is contained in:
Gregory Hainaut 2017-04-16 13:58:22 +02:00
parent 61182249f0
commit 94e19ac903
12 changed files with 8 additions and 630 deletions

View File

@ -25,13 +25,6 @@ void GamePad::EnumerateGamePads(std::vector<std::unique_ptr<GamePad>> &vgamePad)
#endif #endif
} }
void GamePad::UpdateReleaseState()
{
#ifdef SDL_BUILD
JoystickInfo::UpdateReleaseState();
#endif
}
/** /**
* Safely dispatch to the Rumble method above * Safely dispatch to the Rumble method above
**/ **/

View File

@ -4,10 +4,6 @@
#include "controller.h" #include "controller.h"
#ifdef SDL_BUILD #ifdef SDL_BUILD
#include <SDL.h> #include <SDL.h>
#define HAT_UP SDL_HAT_UP
#define HAT_DOWN SDL_HAT_DOWN
#define HAT_RIGHT SDL_HAT_RIGHT
#define HAT_LEFT SDL_HAT_LEFT
#endif #endif
class GamePad class GamePad
@ -15,16 +11,8 @@ class GamePad
public: public:
GamePad() GamePad()
: devname("") : devname("")
, _id(-1)
, numbuttons(0)
, numaxes(0)
, numhats(0)
, deadzone(1500) , deadzone(1500)
, pad(-1)
{ {
vbuttonstate.clear();
vaxisstate.clear();
vhatstate.clear();
} }
virtual ~GamePad() virtual ~GamePad()
@ -39,7 +27,6 @@ public:
* Find every interesting devices and create right structure for them(depend on backend) * Find every interesting devices and create right structure for them(depend on backend)
*/ */
static void EnumerateGamePads(std::vector<std::unique_ptr<GamePad>> &vgamePad); static void EnumerateGamePads(std::vector<std::unique_ptr<GamePad>> &vgamePad);
static void UpdateReleaseState();
/* /*
* Update state of every attached devices * Update state of every attached devices
@ -63,93 +50,19 @@ public:
*/ */
virtual bool TestForce(float strength = 0.6) { return false; } virtual bool TestForce(float strength = 0.6) { return false; }
virtual bool PollButtons(u32 &pkey) { return false; }
virtual bool PollAxes(u32 &pkey) { return false; }
virtual bool PollHats(u32 &pkey) { return false; }
virtual int GetHat(int key_to_axis)
{
return 0;
}
virtual int GetButton(int key_to_button)
{
return 0;
}
const string &GetName() const string &GetName()
{ {
return devname; return devname;
} }
int GetPAD()
{
return pad;
}
int GetNumButtons()
{
return numbuttons;
}
int GetNumAxes()
{
return numaxes;
}
int GetNumHats()
{
return numhats;
}
virtual int GetDeadzone() virtual int GetDeadzone()
{ {
return deadzone; return deadzone;
} }
virtual void SaveState() {}
int GetButtonState(int i)
{
return vbuttonstate[i];
}
int GetAxisState(int i)
{
return vaxisstate[i];
}
int GetHatState(int i)
{
//PAD_LOG("Getting POV State of %d.\n", i);
return vhatstate[i];
}
void SetButtonState(int i, int state)
{
vbuttonstate[i] = state;
}
void SetAxisState(int i, int value)
{
vaxisstate[i] = value;
}
void SetHatState(int i, int value)
{
//PAD_LOG("We should set %d to %d.\n", i, value);
vhatstate[i] = value;
}
virtual int GetAxisFromKey(int pad, int index) { return 0; }
// These fields need to be inherited by child classes
protected: protected:
string devname; // pretty device name string devname; // pretty device name
int _id;
int numbuttons, numaxes, numhats;
int deadzone; int deadzone;
int pad;
std::vector<int> vbuttonstate, vaxisstate, vhatstate;
}; };
extern std::vector<std::unique_ptr<GamePad>> s_vgamePad; extern std::vector<std::unique_ptr<GamePad>> s_vgamePad;

View File

@ -279,10 +279,6 @@ Dialog::Dialog()
Bind(wxEVT_BUTTON, &Dialog::OnButtonClicked, this); Bind(wxEVT_BUTTON, &Dialog::OnButtonClicked, this);
m_time_update_gui.SetOwner(this);
Bind(wxEVT_TIMER, &Dialog::JoystickEvent, this);
m_time_update_gui.Start(UPDATE_TIME, wxTIMER_CONTINUOUS);
for (int i = 0; i < GAMEPAD_NUMBER; ++i) { for (int i = 0; i < GAMEPAD_NUMBER; ++i) {
for (int j = 0; j < NB_IMG; ++j) { for (int j = 0; j < NB_IMG; ++j) {
m_pressed[i][j] = false; m_pressed[i][j] = false;
@ -404,124 +400,6 @@ void Dialog::OnButtonClicked(wxCommandEvent &event)
} }
} }
void Dialog::JoystickEvent(wxTimerEvent &event)
{
#ifdef SDL_BUILD
u32 key;
int map;
std::map<u32, int>::iterator it;
std::map<u32, int>::iterator it2;
SDL_JoystickEventState(SDL_ENABLE);
SDL_Event events;
while (SDL_PollEvent(&events)) {
switch (events.type) {
case SDL_KEYDOWN:
case SDL_KEYUP:
break;
case SDL_JOYAXISMOTION:
if (events.jaxis.which < GAMEPAD_NUMBER) {
key = axis_to_key(false, (events.jaxis.value < 0), events.jaxis.axis);
it = m_map_images[events.jaxis.which].find(key);
if (it != m_map_images[events.jaxis.which].end()) {
map = m_map_images[events.jaxis.which][key];
if (events.jaxis.value == 0) {
if (map >= PAD_L_UP && map <= PAD_L_LEFT)
m_pan_tabs[events.jaxis.which]->HideImg(img_left_cursor);
else if (map >= PAD_R_UP && map <= PAD_R_LEFT)
m_pan_tabs[events.jaxis.which]->HideImg(img_right_cursor);
else if (map < PAD_L_UP)
m_pan_tabs[events.jaxis.which]->HideImg(map);
} else {
if (map >= PAD_L_UP && map <= PAD_L_LEFT) {
m_pan_tabs[events.jaxis.which]->MoveJoystick(events.jaxis.axis, events.jaxis.value);
m_pan_tabs[events.jaxis.which]->ShowImg(img_left_cursor);
} else if (map >= PAD_R_UP && map <= PAD_R_LEFT) {
m_pan_tabs[events.jaxis.which]->MoveJoystick(events.jaxis.axis, events.jaxis.value);
m_pan_tabs[events.jaxis.which]->ShowImg(img_right_cursor);
} else if (map < PAD_L_UP) { // if this is not a joystick
m_pan_tabs[events.jaxis.which]->ShowImg(map);
}
}
break;
}
// Hack Dualshock 4 (L2, R2)
key = axis_to_key(false, (events.jaxis.value > 0), events.jaxis.axis);
it2 = m_map_images[events.jaxis.which].find(key);
if (it2 != m_map_images[events.jaxis.which].end()) {
map = m_map_images[events.jaxis.which][key];
if (map < PAD_L_UP) { // if this is not a joystick
m_pan_tabs[events.jaxis.which]->HideImg(map);
}
break;
}
}
break;
case SDL_JOYBUTTONDOWN:
if (events.jbutton.which < GAMEPAD_NUMBER) {
key = button_to_key(events.jbutton.button);
it = m_map_images[events.jbutton.which].find(key);
if (it != m_map_images[events.jbutton.which].end()) {
map = m_map_images[events.jbutton.which][key];
m_pan_tabs[events.jbutton.which]->ShowImg(map);
}
}
break;
case SDL_JOYBUTTONUP:
if (events.jbutton.which < GAMEPAD_NUMBER) {
key = button_to_key(events.jbutton.button);
it = m_map_images[events.jbutton.which].find(key);
if (it != m_map_images[events.jbutton.which].end()) {
map = m_map_images[events.jbutton.which][key];
m_pan_tabs[events.jbutton.which]->HideImg(map);
}
}
break;
case SDL_JOYHATMOTION:
if (events.jhat.which < GAMEPAD_NUMBER) {
switch (events.jhat.value) {
case SDL_HAT_UP:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_up);
}
break;
case SDL_HAT_DOWN:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_bottom);
}
break;
case SDL_HAT_RIGHT:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_right);
}
break;
case SDL_HAT_LEFT:
key = hat_to_key(events.jhat.value, events.jhat.hat);
it = m_map_images[events.jhat.which].find(key);
if (it != m_map_images[events.jhat.which].end()) {
m_pan_tabs[events.jhat.which]->ShowImg(img_dp_left);
}
break;
case SDL_HAT_CENTERED:
m_pan_tabs[events.jhat.which]->HideImg(img_dp_up);
m_pan_tabs[events.jhat.which]->HideImg(img_dp_bottom);
m_pan_tabs[events.jhat.which]->HideImg(img_dp_right);
m_pan_tabs[events.jhat.which]->HideImg(img_dp_left);
}
}
break;
default:
break;
}
}
#endif // SDL_BUILD
}
/****************************************/ /****************************************/
/*********** Methods functions **********/ /*********** Methods functions **********/
/****************************************/ /****************************************/
@ -531,8 +409,6 @@ void Dialog::config_key(int pad, int key)
bool captured = false; bool captured = false;
u32 key_pressed = 0; u32 key_pressed = 0;
// I don't have any guarantee that not-yet-pressed state is egual to released state
GamePad::UpdateReleaseState();
while (!captured) { while (!captured) {
if (PollX11KeyboardMouseEvent(key_pressed)) { if (PollX11KeyboardMouseEvent(key_pressed)) {
// special case for keyboard/mouse to handle multiple keys // special case for keyboard/mouse to handle multiple keys
@ -541,32 +417,8 @@ void Dialog::config_key(int pad, int key)
clear_key(pad, key); clear_key(pad, key);
set_keyboad_key(pad, key_pressed, key); set_keyboad_key(pad, key_pressed, key);
m_simulatedKeys[pad][key] = key_pressed; m_simulatedKeys[pad][key] = key_pressed;
m_map_images[pad][key_pressed] = key;
} }
captured = true; captured = true;
} else {
GamePad::UpdateGamePadState();
for (auto &j : s_vgamePad) {
if (j->PollButtons(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
captured = true;
} else if (j->PollAxes(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
captured = true;
} else if (j->PollHats(key_pressed)) {
clear_key(pad, key);
set_key(pad, key, key_pressed);
m_map_images[pad][key_pressed] = key;
captured = true;
}
if (captured)
break;
}
} }
} }
m_bt_gamepad[pad][key]->SetLabel( m_bt_gamepad[pad][key]->SetLabel(
@ -580,23 +432,7 @@ void Dialog::clear_key(int pad, int key)
m_simulatedKeys[pad][key] = 0; m_simulatedKeys[pad][key] = 0;
// erase gamepad entry (keysim map) // erase gamepad entry (keysim map)
std::map<u32, u32>::iterator it1; conf->keysym_map[pad].erase(keysim);
it1 = conf->keysym_map[pad].find(keysim);
if (it1 != conf->keysym_map[pad].end())
conf->keysym_map[pad].erase(it1);
// erase gamepad entry (image map)
int val = get_key(pad, key);
std::map<u32, int>::iterator it2;
it2 = m_map_images[pad].find(val);
if (it2 != m_map_images[pad].end()) {
m_map_images[pad].erase(it2);
}
// Erase the keyboard image map
//m_map_images[pad].erase(keysim);
// Erase the Gamepad binded key
set_key(pad, key, 0);
} }
@ -604,15 +440,6 @@ void Dialog::clear_key(int pad, int key)
void Dialog::repopulate() void Dialog::repopulate()
{ {
for (int gamepad_id = 0; gamepad_id < GAMEPAD_NUMBER; ++gamepad_id) { for (int gamepad_id = 0; gamepad_id < GAMEPAD_NUMBER; ++gamepad_id) {
for (int key = 0; key < MAX_KEYS; key++) {
if (get_key(gamepad_id, key) != 0) {
m_bt_gamepad[gamepad_id][key]->SetLabel(
KeyName(gamepad_id, key).c_str());
m_map_images[gamepad_id][get_key(gamepad_id, key)] = key;
}
}
// keyboard/mouse key // keyboard/mouse key
map<u32, u32>::iterator it; map<u32, u32>::iterator it;
for (it = conf->keysym_map[gamepad_id].begin(); for (it = conf->keysym_map[gamepad_id].begin();
@ -624,7 +451,6 @@ void Dialog::repopulate()
KeyName(gamepad_id, key, keysym).c_str()); KeyName(gamepad_id, key, keysym).c_str());
m_simulatedKeys[gamepad_id][key] = keysym; m_simulatedKeys[gamepad_id][key] = keysym;
m_map_images[gamepad_id][keysym] = key;
} }
} }
} }

View File

@ -77,8 +77,6 @@ class Dialog : public wxDialog
wxTimer m_time_update_gui; wxTimer m_time_update_gui;
// Check if the gui must display feddback image // Check if the gui must display feddback image
bool m_pressed[GAMEPAD_NUMBER][NB_IMG]; bool m_pressed[GAMEPAD_NUMBER][NB_IMG];
// Map the key pressed with the feedback image id
std::map<u32, int> m_map_images[GAMEPAD_NUMBER];
// methods // methods
void config_key(int, int); void config_key(int, int);

View File

@ -55,46 +55,6 @@ string KeyName(int pad, int key, int keysym)
if (pstr != NULL) if (pstr != NULL)
tmp = pstr; tmp = pstr;
} }
} else {
// joystick
KeyType k = type_of_joykey(pad, key);
switch (k) {
case PAD_JOYBUTTONS: {
int button = key_to_button(pad, key);
sprintf(&tmp[0], "JBut %d", button);
break;
}
case PAD_AXIS: {
if (key_to_axis_type(pad, key))
sprintf(&tmp[0], "JAxis %d Full", key_to_axis(pad, key));
else
sprintf(&tmp[0], "JAxis %d Half%s", key_to_axis(pad, key), key_to_axis_sign(pad, key) ? "-" : "+");
break;
}
case PAD_HAT: {
int axis = key_to_axis(pad, key);
switch (key_to_hat_dir(pad, key)) {
case HAT_UP:
sprintf(&tmp[0], "JPOVU-%d", axis);
break;
case HAT_RIGHT:
sprintf(&tmp[0], "JPOVR-%d", axis);
break;
case HAT_DOWN:
sprintf(&tmp[0], "JPOVD-%d", axis);
break;
case HAT_LEFT:
sprintf(&tmp[0], "JPOVL-%d", axis);
break;
}
break;
}
default:
break;
}
} }
return tmp; return tmp;
@ -135,12 +95,6 @@ void SaveConfig()
fprintf(f, "joy_pad_map = %d\n", conf->joyid_map); fprintf(f, "joy_pad_map = %d\n", conf->joyid_map);
fprintf(f, "ff_intensity = %d\n", conf->get_ff_intensity()); fprintf(f, "ff_intensity = %d\n", conf->get_ff_intensity());
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++) {
for (int key = 0; key < MAX_KEYS; key++) {
fprintf(f, "[%d][%d] = 0x%x\n", pad, key, get_key(pad, key));
}
}
map<u32, u32>::iterator it; map<u32, u32>::iterator it;
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++) for (int pad = 0; pad < GAMEPAD_NUMBER; pad++)
for (it = conf->keysym_map[pad].begin(); it != conf->keysym_map[pad].end(); ++it) for (it = conf->keysym_map[pad].begin(); it != conf->keysym_map[pad].end(); ++it)
@ -152,7 +106,6 @@ void SaveConfig()
void LoadConfig() void LoadConfig()
{ {
FILE *f; FILE *f;
char str[256];
bool have_user_setting = false; bool have_user_setting = false;
if (!conf) if (!conf)
@ -187,23 +140,11 @@ void LoadConfig()
goto error; goto error;
conf->set_ff_intensity(value); conf->set_ff_intensity(value);
for (int pad = 0; pad < GAMEPAD_NUMBER; pad++) {
for (int key = 0; key < MAX_KEYS; key++) {
sprintf(str, "[%d][%d] = 0x%%x\n", pad, key);
u32 temp = 0;
if (fscanf(f, str, &temp) == 0)
temp = 0;
set_key(pad, key, temp);
if (temp && pad == 0)
have_user_setting = true;
}
}
u32 pad; u32 pad;
u32 keysym; u32 keysym;
u32 index; u32 index;
while (fscanf(f, "PAD %u:KEYSYM 0x%x = %u\n", &pad, &keysym, &index) != EOF) { while (fscanf(f, "PAD %u:KEYSYM 0x%x = %u\n", &pad, &keysym, &index) == 3) {
set_keyboad_key(pad & 1, keysym, index); set_keyboad_key(pad & 1, keysym, index);
if (pad == 0) if (pad == 0)
have_user_setting = true; have_user_setting = true;

View File

@ -86,68 +86,6 @@ void PollForJoystickInput(int cpad)
int joyid = conf->get_joyid(cpad); int joyid = conf->get_joyid(cpad);
if (!GamePadIdWithinBounds(joyid)) if (!GamePadIdWithinBounds(joyid))
return; return;
GamePad::UpdateGamePadState();
for (int i = 0; i < MAX_KEYS; i++) {
auto &gamePad = s_vgamePad[joyid];
switch (type_of_joykey(cpad, i)) {
case PAD_JOYBUTTONS: {
int value = gamePad->GetButton(key_to_button(cpad, i));
if (value)
key_status->press(cpad, i);
else
key_status->release(cpad, i);
break;
}
case PAD_HAT: {
int value = gamePad->GetHat(key_to_axis(cpad, i));
// key_to_hat_dir and SDL_JoystickGetHat are a 4 bits bitmap, one for each directions. Only 1 bit can be high for
// key_to_hat_dir. SDL_JoystickGetHat handles diagonal too (2 bits) so you must check the intersection
// '&' not only equality '=='. -- Gregory
if (key_to_hat_dir(cpad, i) & value)
key_status->press(cpad, i);
else
key_status->release(cpad, i);
break;
}
case PAD_AXIS: {
int value = gamePad->GetAxisFromKey(cpad, i);
bool sign = key_to_axis_sign(cpad, i);
bool full_axis = key_to_axis_type(cpad, i);
if (IsAnalogKey(i)) {
if (abs(value) > gamePad->GetDeadzone())
key_status->press(cpad, i, value);
else
key_status->release(cpad, i);
} else {
if (full_axis) {
value += 0x8000;
if (value > gamePad->GetDeadzone())
key_status->press(cpad, i, min(value / 256, 0xFF));
else
key_status->release(cpad, i);
} else {
if (sign && (-value > gamePad->GetDeadzone()))
key_status->press(cpad, i, min(-value / 128, 0xFF));
else if (!sign && (value > gamePad->GetDeadzone()))
key_status->press(cpad, i, min(value / 128, 0xFF));
else
key_status->release(cpad, i);
}
}
}
default:
break;
}
}
} }
EXPORT_C_(void) EXPORT_C_(void)

View File

@ -26,17 +26,6 @@
// Joystick definitions // // Joystick definitions //
////////////////////////// //////////////////////////
static u32 s_bSDLInit = false;
void JoystickInfo::UpdateReleaseState()
{
SDL_JoystickUpdate();
// Save everything in the vector s_vjoysticks.
for (auto &j : s_vgamePad)
j->SaveState();
}
// opens handles to all possible joysticks // opens handles to all possible joysticks
void JoystickInfo::EnumerateJoysticks(std::vector<std::unique_ptr<GamePad>> &vjoysticks) void JoystickInfo::EnumerateJoysticks(std::vector<std::unique_ptr<GamePad>> &vjoysticks)
{ {
@ -144,7 +133,6 @@ void JoystickInfo::Destroy()
bool JoystickInfo::Init(int id) bool JoystickInfo::Init(int id)
{ {
Destroy(); Destroy();
_id = id;
joy = SDL_JoystickOpen(id); joy = SDL_JoystickOpen(id);
if (joy == NULL) { if (joy == NULL) {
@ -152,15 +140,8 @@ bool JoystickInfo::Init(int id)
return false; return false;
} }
numaxes = SDL_JoystickNumAxes(joy);
numbuttons = SDL_JoystickNumButtons(joy);
numhats = SDL_JoystickNumHats(joy);
devname = SDL_JoystickName(joy); devname = SDL_JoystickName(joy);
vaxisstate.resize(numaxes);
vbuttonstate.resize(numbuttons);
vhatstate.resize(numhats);
if (haptic == NULL) { if (haptic == NULL) {
if (!SDL_JoystickIsHaptic(joy)) { if (!SDL_JoystickIsHaptic(joy)) {
PAD_LOG("Haptic devices not supported!\n"); PAD_LOG("Haptic devices not supported!\n");
@ -174,16 +155,6 @@ bool JoystickInfo::Init(int id)
return true; return true;
} }
void JoystickInfo::SaveState()
{
for (int i = 0; i < numbuttons; ++i)
SetButtonState(i, SDL_JoystickGetButton(joy, i));
for (int i = 0; i < numaxes; ++i)
SetAxisState(i, SDL_JoystickGetAxis(joy, i));
for (int i = 0; i < numhats; ++i)
SetHatState(i, SDL_JoystickGetHat(joy, i));
}
bool JoystickInfo::TestForce(float strength = 0.60) bool JoystickInfo::TestForce(float strength = 0.60)
{ {
// This code just use standard rumble to check that SDL handles the pad correctly! --3kinox // This code just use standard rumble to check that SDL handles the pad correctly! --3kinox
@ -198,102 +169,3 @@ bool JoystickInfo::TestForce(float strength = 0.60)
return true; return true;
} }
bool JoystickInfo::PollButtons(u32 &pkey)
{
// MAKE sure to look for changes in the state!!
for (int i = 0; i < GetNumButtons(); ++i) {
int but = SDL_JoystickGetButton(GetJoy(), i);
if (but != GetButtonState(i)) {
// Pressure sensitive button are detected as both button (digital) and axes (analog). So better
// drop the button to emulate the pressure sensiblity of the ds2 :)
// Trick: detect the release of the button. It avoid all races condition between axes and buttons :)
// If the button support pressure it will be detected as an axis when it is pressed.
if (but) {
SetButtonState(i, but);
return false;
}
pkey = button_to_key(i);
return true;
}
}
return false;
}
bool JoystickInfo::PollAxes(u32 &pkey)
{
for (int i = 0; i < numaxes; ++i) {
s32 value = SDL_JoystickGetAxis(GetJoy(), i);
s32 old_value = GetAxisState(i);
if (abs(value - old_value) < 0x1000)
continue;
if (value != old_value) {
PAD_LOG("Change in joystick %d: %d.\n", i, value);
// There are several kinds of axes
// Half+: 0 (release) -> 32768
// Half-: 0 (release) -> -32768
// Full (like dualshock 3): -32768 (release) ->32768
const s32 full_axis_ceil = -0x6FFF;
const s32 half_axis_ceil = 0x1FFF;
// Normally, old_value contains the release state so it can be used to detect the types of axis.
bool is_full_axis = (old_value < full_axis_ceil);
if ((!is_full_axis && abs(value) <= half_axis_ceil) || (is_full_axis && value <= full_axis_ceil)) // we don't want this
{
continue;
}
if ((!is_full_axis && abs(value) > half_axis_ceil) || (is_full_axis && value > full_axis_ceil)) {
bool sign = (value < 0);
pkey = axis_to_key(is_full_axis, sign, i);
return true;
}
}
}
return false;
}
bool JoystickInfo::PollHats(u32 &pkey)
{
for (int i = 0; i < GetNumHats(); ++i) {
int value = SDL_JoystickGetHat(GetJoy(), i);
if ((value != GetHatState(i)) && (value != SDL_HAT_CENTERED)) {
switch (value) {
case SDL_HAT_UP:
case SDL_HAT_RIGHT:
case SDL_HAT_DOWN:
case SDL_HAT_LEFT:
pkey = hat_to_key(value, i);
PAD_LOG("Hat Pressed!");
return true;
default:
break;
}
}
}
return false;
}
int JoystickInfo::GetHat(int key_to_axis)
{
return SDL_JoystickGetHat(GetJoy(), key_to_axis);
}
int JoystickInfo::GetButton(int key_to_button)
{
return SDL_JoystickGetButton(GetJoy(), key_to_button);
}
int JoystickInfo::GetAxisFromKey(int pad, int index)
{
return SDL_JoystickGetAxis(GetJoy(), key_to_axis(pad, index));
}

View File

@ -62,21 +62,6 @@ public:
bool TestForce(float); bool TestForce(float);
bool PollButtons(u32 &pkey);
bool PollAxes(u32 &pkey);
bool PollHats(u32 &pkey);
int GetHat(int key_to_axis);
int GetButton(int key_to_button);
void SaveState();
int GetAxisFromKey(int pad, int index);
static void UpdateReleaseState();
private: private:
SDL_Joystick *GetJoy() SDL_Joystick *GetJoy()
{ {

View File

@ -38,77 +38,7 @@ __forceinline int get_keyboard_key(int pad, int keysym)
return -1; return -1;
} }
__forceinline void set_key(int pad, int index, int value)
{
conf->keys[pad][index] = value;
}
__forceinline int get_key(int pad, int index)
{
return conf->keys[pad][index];
}
__forceinline KeyType type_of_joykey(int pad, int index)
{
int key = get_key(pad, index);
if (key >= 0x10000 && key < 0x20000)
return PAD_JOYBUTTONS;
else if (key >= 0x20000 && key < 0x30000)
return PAD_AXIS;
else if (key >= 0x30000 && key < 0x40000)
return PAD_HAT;
else
return PAD_NULL;
}
__forceinline bool IsAnalogKey(int index) __forceinline bool IsAnalogKey(int index)
{ {
return ((index >= PAD_L_UP) && (index <= PAD_R_LEFT)); return ((index >= PAD_L_UP) && (index <= PAD_R_LEFT));
} }
//*******************************************************
// onepad key -> joy input
//*******************************************************
__forceinline int key_to_button(int pad, int index)
{
return (get_key(pad, index) & 0xff);
}
__forceinline int key_to_axis(int pad, int index)
{
return (get_key(pad, index) & 0xff);
}
__forceinline bool key_to_axis_sign(int pad, int index)
{
return ((get_key(pad, index) >> 8) & 0x1);
}
__forceinline bool key_to_axis_type(int pad, int index)
{
return ((get_key(pad, index) >> 9) & 0x1);
}
__forceinline int key_to_hat_dir(int pad, int index)
{
return ((get_key(pad, index) >> 8) & 0xF);
}
//*******************************************************
// joy input -> onepad key
//*******************************************************
__forceinline int button_to_key(int button_id)
{
return (0x10000 | button_id);
}
__forceinline int axis_to_key(int full_axis, int sign, int axis_id)
{
return (0x20000 | (full_axis << 9) | (sign << 8) | axis_id);
}
__forceinline int hat_to_key(int dir, int axis_id)
{
return (0x30000 | (dir << 8) | axis_id);
}

View File

@ -23,30 +23,10 @@
#include <string.h> // for memset #include <string.h> // for memset
#define MAX_KEYS 24 #define MAX_KEYS 24
enum KeyType {
PAD_JOYBUTTONS = 0,
PAD_AXIS,
PAD_HAT,
PAD_NULL = -1
};
extern void set_keyboad_key(int pad, int keysym, int index); extern void set_keyboad_key(int pad, int keysym, int index);
extern int get_keyboard_key(int pad, int keysym); extern int get_keyboard_key(int pad, int keysym);
extern void set_key(int pad, int index, int value);
extern int get_key(int pad, int index);
extern bool IsAnalogKey(int index); extern bool IsAnalogKey(int index);
extern KeyType type_of_joykey(int pad, int index);
extern int key_to_button(int pad, int index);
extern int key_to_axis(int pad, int index);
extern bool key_to_axis_sign(int pad, int index);
extern bool key_to_axis_type(int pad, int index);
extern int key_to_hat_dir(int pad, int index);
extern int button_to_key(int button_id);
extern int axis_to_key(int full_axis, int sign, int axis_id);
extern int hat_to_key(int dir, int axis_id);
class PADconf class PADconf
{ {
u32 ff_intensity; u32 ff_intensity;
@ -69,7 +49,6 @@ public:
u32 packed_options; // Only first 8 bits of each 16 bits series are really used, rest is padding u32 packed_options; // Only first 8 bits of each 16 bits series are really used, rest is padding
}; };
u32 keys[GAMEPAD_NUMBER][MAX_KEYS];
u32 log; u32 log;
u32 joyid_map; u32 joyid_map;
map<u32, u32> keysym_map[GAMEPAD_NUMBER]; map<u32, u32> keysym_map[GAMEPAD_NUMBER];
@ -78,7 +57,6 @@ public:
void init() void init()
{ {
memset(&keys, 0, sizeof(keys));
log = packed_options = joyid_map = 0; log = packed_options = joyid_map = 0;
ff_intensity = 0x7FFF; // set it at max value by default ff_intensity = 0x7FFF; // set it at max value by default
sensibility = 500; sensibility = 500;

View File

@ -267,10 +267,13 @@ LRESULT WINAPI PADwndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
for (int pad = 0; pad < GAMEPAD_NUMBER; ++pad) { for (int pad = 0; pad < GAMEPAD_NUMBER; ++pad) {
for (int i = 0; i < MAX_KEYS; i++) { for (int i = 0; i < MAX_KEYS; i++) {
assert(0);
#if 0
if (wParam == get_key(pad, i)) { if (wParam == get_key(pad, i)) {
key_status->press(pad, i); key_status->press(pad, i);
break; break;
} }
#endif
} }
} }
@ -281,10 +284,13 @@ LRESULT WINAPI PADwndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
case WM_KEYUP: case WM_KEYUP:
for (int pad = 0; pad < GAMEPAD_NUMBER; ++pad) { for (int pad = 0; pad < GAMEPAD_NUMBER; ++pad) {
for (int i = 0; i < MAX_KEYS; i++) { for (int i = 0; i < MAX_KEYS; i++) {
assert(0);
#if 0
if (wParam == get_key(pad, i)) { if (wParam == get_key(pad, i)) {
key_status->release(pad, i); key_status->release(pad, i);
break; break;
} }
#endif
} }
} }

View File

@ -158,8 +158,6 @@ void CloseLogging()
void clearPAD(int pad) void clearPAD(int pad)
{ {
conf->keysym_map[pad].clear(); conf->keysym_map[pad].clear();
for (int key = 0; key < MAX_KEYS; ++key)
set_key(pad, key, 0);
} }
EXPORT_C_(s32) EXPORT_C_(s32)