Implemented --mimic-xpad
This commit is contained in:
parent
5c964ad321
commit
b5b70320a8
5 changed files with 75 additions and 24 deletions
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue