summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/input
diff options
context:
space:
mode:
author Patrick Lessard <palessar@cgocable.ca>2016-08-02 00:18:36 -0400
committer Patrick Lessard <palessar@cgocable.ca>2016-08-02 00:18:36 -0400
commit87a73f6f51ac8a1504fcdfc2728135300fea44aa (patch)
treee75a354fd83b0ab6fa0fbb522eba626643f6a04a /src/osd/modules/input
parent3e22960ea459f1b145d54d7ac40a525028e4fdf7 (diff)
Patch to fix the Gun#2 not working in Mame, please refer to Bug id 6185 on Mametesters.
Diffstat (limited to 'src/osd/modules/input')
-rw-r--r--src/osd/modules/input/input_rawinput.cpp153
1 files changed, 131 insertions, 22 deletions
diff --git a/src/osd/modules/input/input_rawinput.cpp b/src/osd/modules/input/input_rawinput.cpp
index c3ed46ca3f6..0a9466598cc 100644
--- a/src/osd/modules/input/input_rawinput.cpp
+++ b/src/osd/modules/input/input_rawinput.cpp
@@ -366,28 +366,88 @@ public:
void process_event(RAWINPUT &rawinput) override
{
- // If this data was intended for a rawinput lightgun, ignore it.
+
+ // If this data was intended for a rawinput mouse
+ if (rawinput.data.mouse.usFlags == MOUSE_MOVE_RELATIVE)
+ {
+
+ mouse.lX += rawinput.data.mouse.lLastX * INPUT_RELATIVE_PER_PIXEL;
+ mouse.lY += rawinput.data.mouse.lLastY * INPUT_RELATIVE_PER_PIXEL;
+
+ // update zaxis
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
+ mouse.lZ += static_cast<INT16>(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL;
+
+ // update the button states; always update the corresponding mouse buttons
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) mouse.rgbButtons[0] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) mouse.rgbButtons[0] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) mouse.rgbButtons[1] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) mouse.rgbButtons[1] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) mouse.rgbButtons[2] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) mouse.rgbButtons[2] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) mouse.rgbButtons[3] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) mouse.rgbButtons[3] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) mouse.rgbButtons[4] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) mouse.rgbButtons[4] = 0x00;
+ }
+ }
+};
+
+//============================================================
+// rawinput_lightgun_device
+//============================================================
+
+class rawinput_lightgun_device : public rawinput_device
+{
+private:
+ std::mutex m_device_lock;
+public:
+ mouse_state lightgun;
+
+ rawinput_lightgun_device(running_machine& machine, const char* name, input_module& module)
+ : rawinput_device(machine, name, DEVICE_CLASS_LIGHTGUN, module),
+ lightgun({0})
+ {
+ }
+
+ void poll() override
+ {
+ lightgun.lZ = 0;
+
+ rawinput_device::poll();
+ }
+
+ void reset() override
+ {
+ memset(&lightgun, 0, sizeof(lightgun));
+ }
+
+ void process_event(RAWINPUT &rawinput) override
+ {
+ // If this data was intended for a rawinput lightgun
if (rawinput.data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
- return;
+ {
- mouse.lX += rawinput.data.mouse.lLastX * INPUT_RELATIVE_PER_PIXEL;
- mouse.lY += rawinput.data.mouse.lLastY * INPUT_RELATIVE_PER_PIXEL;
-
- // update zaxis
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
- mouse.lZ += static_cast<INT16>(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL;
-
- // update the button states; always update the corresponding mouse buttons
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) mouse.rgbButtons[0] = 0x80;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) mouse.rgbButtons[0] = 0x00;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) mouse.rgbButtons[1] = 0x80;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) mouse.rgbButtons[1] = 0x00;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) mouse.rgbButtons[2] = 0x80;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) mouse.rgbButtons[2] = 0x00;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) mouse.rgbButtons[3] = 0x80;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) mouse.rgbButtons[3] = 0x00;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) mouse.rgbButtons[4] = 0x80;
- if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) mouse.rgbButtons[4] = 0x00;
+ // update the X/Y positions
+ lightgun.lX = normalize_absolute_axis(rawinput.data.mouse.lLastX, 0, INPUT_ABSOLUTE_MAX);
+ lightgun.lY = normalize_absolute_axis(rawinput.data.mouse.lLastY, 0, INPUT_ABSOLUTE_MAX);
+
+ // update zaxis
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_WHEEL)
+ lightgun.lZ += static_cast<INT16>(rawinput.data.mouse.usButtonData) * INPUT_RELATIVE_PER_PIXEL;
+
+ // update the button states; always update the corresponding mouse buttons
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) lightgun.rgbButtons[0] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) lightgun.rgbButtons[0] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) lightgun.rgbButtons[1] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) lightgun.rgbButtons[1] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) lightgun.rgbButtons[2] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) lightgun.rgbButtons[2] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) lightgun.rgbButtons[3] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) lightgun.rgbButtons[3] = 0x00;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) lightgun.rgbButtons[4] = 0x80;
+ if (rawinput.data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) lightgun.rgbButtons[4] = 0x00;
+ }
}
};
@@ -669,12 +729,61 @@ protected:
}
};
+//============================================================
+// lightgun_input_rawinput - rawinput lightgun module
+//============================================================
+
+class lightgun_input_rawinput : public rawinput_module
+{
+public:
+ lightgun_input_rawinput()
+ : rawinput_module(OSD_LIGHTGUNINPUT_PROVIDER, "rawinput")
+ {
+ }
+
+protected:
+ USHORT usagepage() override { return 1; }
+ USHORT usage() override { return 2; }
+ void add_rawinput_device(running_machine& machine, RAWINPUTDEVICELIST * device) override
+ {
+
+ // make sure this is a mouse
+ if (device->dwType != RIM_TYPEMOUSE)
+ return;
+
+ // allocate and link in a new device
+ rawinput_lightgun_device *devinfo = create_rawinput_device<rawinput_lightgun_device>(machine, device);
+ if (devinfo == nullptr)
+ return;
+
+ // populate the axes
+ for (int axisnum = 0; axisnum < 3; axisnum++)
+ {
+ devinfo->device()->add_item(
+ default_axis_name[axisnum],
+ static_cast<input_item_id>(ITEM_ID_XAXIS + axisnum),
+ generic_axis_get_state<LONG>,
+ &devinfo->lightgun.lX + axisnum);
+ }
+
+ // populate the buttons
+ for (int butnum = 0; butnum < 5; butnum++)
+ {
+ devinfo->device()->add_item(
+ default_button_name(butnum),
+ static_cast<input_item_id>(ITEM_ID_BUTTON1 + butnum),
+ generic_button_get_state<BYTE>,
+ &devinfo->lightgun.rgbButtons[butnum]);
+ }
+ }
+};
+
#else
MODULE_NOT_SUPPORTED(keyboard_input_rawinput, OSD_KEYBOARDINPUT_PROVIDER, "rawinput")
MODULE_NOT_SUPPORTED(mouse_input_rawinput, OSD_MOUSEINPUT_PROVIDER, "rawinput")
-//MODULE_NOT_SUPPORTED(lightgun_input_rawinput, OSD_LIGHTGUNINPUT_PROVIDER, "rawinput")
+MODULE_NOT_SUPPORTED(lightgun_input_rawinput, OSD_LIGHTGUNINPUT_PROVIDER, "rawinput")
#endif
MODULE_DEFINITION(KEYBOARDINPUT_RAWINPUT, keyboard_input_rawinput)
MODULE_DEFINITION(MOUSEINPUT_RAWINPUT, mouse_input_rawinput)
-//MODULE_DEFINITION(LIGHTGUNINPUT_RAWINPUT, lightgun_input_rawinput)
+MODULE_DEFINITION(LIGHTGUNINPUT_RAWINPUT, lightgun_input_rawinput)