Implemented --mimic-xpad

This commit is contained in:
Ingo Ruhnke 2010-05-13 17:59:45 +02:00
parent 5c964ad321
commit b5b70320a8
5 changed files with 75 additions and 24 deletions

View file

@ -288,7 +288,7 @@ CommandLineOptions::parse_args(int argc, char** argv)
break;
case OPTION_MIMIC_XPAD:
//opts.mimic_xpad = true;
opts.uinput_config.mimic_xpad();
break;
case OPTION_TYPE:

View file

@ -93,7 +93,7 @@ LinuxUinput::~LinuxUinput()
}
void
LinuxUinput::add_abs(uint16_t code, int min, int max)
LinuxUinput::add_abs(uint16_t code, int min, int max, int fuzz, int flat)
{
// std::cout << "add_abs: " << abs2str(code) << " (" << min << ", " << max << ") " << name << std::endl;
@ -111,6 +111,8 @@ LinuxUinput::add_abs(uint16_t code, int min, int max)
user_dev.absmin[code] = min;
user_dev.absmax[code] = max;
user_dev.absfuzz[code] = fuzz;
user_dev.absflat[code] = flat;
}
}
@ -181,7 +183,7 @@ void
LinuxUinput::finish()
{
strncpy(user_dev.name, name.c_str(), UINPUT_MAX_NAME_SIZE);
user_dev.id.version = 0;
user_dev.id.version = 0x114; // FIXME: whats this for?
user_dev.id.bustype = BUS_USB;
user_dev.id.vendor = vendor;
user_dev.id.product = product;

View file

@ -55,7 +55,7 @@ public:
/*@{*/
/** Create an absolute axis */
void add_abs(uint16_t code, int min, int max);
void add_abs(uint16_t code, int min, int max, int fuzz = 0, int flat = 0);
/** Create an button */
void add_key(uint16_t code);

View file

@ -105,12 +105,12 @@ ButtonEvent::from_string(const std::string& str)
}
AxisEvent
AxisEvent::create(int type, int code)
AxisEvent::create(int type, int code, int fuzz, int flat)
{
AxisEvent ev;
ev.type = type;
ev.code = code;
switch (type)
{
case EV_REL:
@ -119,6 +119,8 @@ AxisEvent::create(int type, int code)
break;
case EV_ABS:
ev.abs.fuzz = fuzz;
ev.abs.flat = flat;
break;
case EV_KEY:
@ -196,23 +198,14 @@ AxisEvent::from_string(const std::string& str)
}
uInputCfg::uInputCfg() :
device_name(),
trigger_as_button(),
dpad_as_button(),
trigger_as_zaxis(),
dpad_only(),
force_feedback(),
extra_devices()
device_name("Xbox Gamepad (userspace driver)"),
trigger_as_button(false),
dpad_as_button(false),
trigger_as_zaxis(false),
dpad_only(false),
force_feedback(false),
extra_devices(true)
{
device_name = "Xbox Gamepad (userspace driver)";
trigger_as_button = false;
dpad_as_button = false;
trigger_as_zaxis = false;
dpad_only = false;
force_feedback = false;
extra_devices = true;
std::fill_n(btn_map, static_cast<int>(XBOX_BTN_MAX), ButtonEvent::create(-1, -1));
std::fill_n(axis_map, static_cast<int>(XBOX_AXIS_MAX), AxisEvent::create(-1, -1));
@ -260,6 +253,57 @@ uInputCfg::uInputCfg() :
axis_map[XBOX_AXIS_DPAD_X] = AxisEvent::create(EV_ABS, ABS_HAT0X);
axis_map[XBOX_AXIS_DPAD_Y] = AxisEvent::create(EV_ABS, ABS_HAT0Y);
}
void
uInputCfg::mimic_xpad()
{
device_name = "Microsoft X-Box 360 pad";
extra_devices = false;
btn_map[XBOX_BTN_START] = ButtonEvent::create(EV_KEY, BTN_START);
btn_map[XBOX_BTN_GUIDE] = ButtonEvent::create(EV_KEY, BTN_MODE);
btn_map[XBOX_BTN_BACK] = ButtonEvent::create(EV_KEY, BTN_BACK);
btn_map[XBOX_BTN_A] = ButtonEvent::create(EV_KEY, BTN_A);
btn_map[XBOX_BTN_B] = ButtonEvent::create(EV_KEY, BTN_B);
btn_map[XBOX_BTN_X] = ButtonEvent::create(EV_KEY, BTN_X);
btn_map[XBOX_BTN_Y] = ButtonEvent::create(EV_KEY, BTN_Y);
btn_map[XBOX_BTN_GREEN] = ButtonEvent::create(EV_KEY, BTN_0);
btn_map[XBOX_BTN_RED] = ButtonEvent::create(EV_KEY, BTN_1);
btn_map[XBOX_BTN_YELLOW] = ButtonEvent::create(EV_KEY, BTN_2);
btn_map[XBOX_BTN_BLUE] = ButtonEvent::create(EV_KEY, BTN_3);
btn_map[XBOX_BTN_ORANGE] = ButtonEvent::create(EV_KEY, BTN_4);
btn_map[XBOX_BTN_WHITE] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_BLACK] = ButtonEvent::create(EV_KEY, BTN_TR);
btn_map[XBOX_BTN_LB] = ButtonEvent::create(EV_KEY, BTN_TL);
btn_map[XBOX_BTN_RB] = ButtonEvent::create(EV_KEY, BTN_TR);
btn_map[XBOX_BTN_LT] = ButtonEvent::create(EV_KEY, BTN_TL2);
btn_map[XBOX_BTN_RT] = ButtonEvent::create(EV_KEY, BTN_TR2);
btn_map[XBOX_BTN_THUMB_L] = ButtonEvent::create(EV_KEY, BTN_THUMBL);
btn_map[XBOX_BTN_THUMB_R] = ButtonEvent::create(EV_KEY, BTN_THUMBR);
btn_map[XBOX_DPAD_UP] = ButtonEvent::create(EV_KEY, BTN_BASE);
btn_map[XBOX_DPAD_DOWN] = ButtonEvent::create(EV_KEY, BTN_BASE2);
btn_map[XBOX_DPAD_LEFT] = ButtonEvent::create(EV_KEY, BTN_BASE3);
btn_map[XBOX_DPAD_RIGHT] = ButtonEvent::create(EV_KEY, BTN_BASE4);
// Axis Mapping
axis_map[XBOX_AXIS_X1] = AxisEvent::create(EV_ABS, ABS_X, 16, 128);
axis_map[XBOX_AXIS_Y1] = AxisEvent::create(EV_ABS, ABS_Y, 16, 128);
axis_map[XBOX_AXIS_X2] = AxisEvent::create(EV_ABS, ABS_RX, 16, 128);
axis_map[XBOX_AXIS_Y2] = AxisEvent::create(EV_ABS, ABS_RY, 16, 128);
axis_map[XBOX_AXIS_LT] = AxisEvent::create(EV_ABS, ABS_Z);
axis_map[XBOX_AXIS_RT] = AxisEvent::create(EV_ABS, ABS_RZ);
axis_map[XBOX_AXIS_TRIGGER] = AxisEvent::create(EV_ABS, ABS_Z);
axis_map[XBOX_AXIS_DPAD_X] = AxisEvent::create(EV_ABS, ABS_HAT0X);
axis_map[XBOX_AXIS_DPAD_Y] = AxisEvent::create(EV_ABS, ABS_HAT0Y);
}
bool
uInput::need_keyboard_device()
@ -869,7 +913,7 @@ uInput::add_axis(int code, int min, int max)
switch(event.type)
{
case EV_ABS:
get_joystick_uinput()->add_abs(event.code, min, max);
get_joystick_uinput()->add_abs(event.code, min, max, event.abs.fuzz, event.abs.flat);
break;
case EV_REL:

View file

@ -64,7 +64,7 @@ struct ButtonEvent
struct AxisEvent
{
static AxisEvent invalid() { return create(-1, -1); }
static AxisEvent create(int type, int code);
static AxisEvent create(int type, int code, int fuzz = 0, int flat = 0);
static AxisEvent from_string(const std::string& str);
/** EV_KEY, EV_ABS, EV_REL */
@ -80,6 +80,8 @@ struct AxisEvent
} rel;
struct {
int fuzz;
int flat;
} abs;
struct {
@ -104,6 +106,9 @@ public:
AxisEvent axis_map[XBOX_AXIS_MAX];
uInputCfg();
/** Sets a button/axis mapping that is equal to the xpad kernel driver */
void mimic_xpad();
};
class uInput