Difference between revisions of "Arcade Machine"

From Technologia Incognita
Jump to: navigation, search
Line 128: Line 128:
 
== Key remapping ==
 
== Key remapping ==
  
Mapping keys is fairly trivial if you have some C knowledge.
+
Key mapping (in Keyboard); only relevant for developers:
Open up custom_map.h in uinput-mapper; and edit as you like.
 
 
 
There are currently a few limitations:
 
 
 
* You can only emulate joystick devices
 
* The Joystick buttons are still coded into map.c as well; this will be changed later. As a consequence you cannot use keys other than in the example below.
 
* The last argument to the KEYMAP macro can be a statement or a function; applied to the input value.
 
 
 
When you're done, run Make:
 
 
 
    make
 
 
 
And restart the map program.
 
  
 
     #ifndef H_GLOBAL_MAP
 
     #ifndef H_GLOBAL_MAP
 
     #define H_GLOBAL_MAP
 
     #define H_GLOBAL_MAP
 
      
 
      
    /* Set up amount of joysticks here */
+
            /* Set up amount of joysticks here */
 
     #define JOYCOUNT 2
 
     #define JOYCOUNT 2
 
      
 
      
    /* Set up event to read from */
+
            /* Set up event to read from */
 
     #define INPUT_PATH "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
 
     #define INPUT_PATH "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
 
      
 
      
 
     #endif
 
     #endif
 
      
 
      
    /* Now follows keymapping, do not touch ifdef */
+
            /* Now follows keymapping, do not touch ifdef */
 
     #ifdef H_IN_CASE
 
     #ifdef H_IN_CASE
 
     #define KEYMAP(in_key, out_key, out_type, device, val) \
 
     #define KEYMAP(in_key, out_key, out_type, device, val) \
        case in_key: \
+
                case in_key: \
            je.type = out_type; \
+
                    je.type = out_type; \
            je.code = out_key; \
+
                    je.code = out_key; \
            je.value = val(e.value); \
+
                    je.value = val(e.value); \
            j = device; \
+
                    j = device; \
            break;
+
                    break;
 
      
 
      
 
     /* First joystick */
 
     /* First joystick */
Line 168: Line 155:
 
     /* HAT */
 
     /* HAT */
 
     KEYMAP(KEY_UP, ABS_HAT0Y, EV_ABS, 0, -)
 
     KEYMAP(KEY_UP, ABS_HAT0Y, EV_ABS, 0, -)
     KEYMAP(KEY_DOWN, ABS_HAT0Y, EV_ABS, 0, +)
+
     KEYMAP(KEY_DOWN, ABS_HAT0Y, EV_ABS, 0, )
 
     KEYMAP(KEY_LEFT, ABS_HAT0X, EV_ABS, 0, -)
 
     KEYMAP(KEY_LEFT, ABS_HAT0X, EV_ABS, 0, -)
     KEYMAP(KEY_RIGHT, ABS_HAT0X, EV_ABS, 0, +)
+
     KEYMAP(KEY_RIGHT, ABS_HAT0X, EV_ABS, 0, )
 
      
 
      
 
     /* Red buttons */
 
     /* Red buttons */
     KEYMAP(KEY_LEFTCTRL, BTN_0, EV_KEY, 0, +)
+
     KEYMAP(KEY_LEFTCTRL, BTN_0, EV_KEY, 0, )
     KEYMAP(KEY_LEFTALT, BTN_1, EV_KEY, 0, +)
+
     KEYMAP(KEY_LEFTALT, BTN_1, EV_KEY, 0, )
     KEYMAP(KEY_SPACE, BTN_2, EV_KEY, 0, +)
+
     KEYMAP(KEY_SPACE, BTN_2, EV_KEY, 0, )
 
      
 
      
 
     /* Yellow button */
 
     /* Yellow button */
     KEYMAP(KEY_1, BTN_3, EV_KEY, 0, +)
+
     KEYMAP(KEY_1, BTN_3, EV_KEY, 0, )
 
      
 
      
 
     /* Second joystick */
 
     /* Second joystick */
Line 184: Line 171:
 
     /* HAT*/
 
     /* HAT*/
 
     KEYMAP(KEY_R, ABS_HAT0Y, EV_ABS, 1, -)
 
     KEYMAP(KEY_R, ABS_HAT0Y, EV_ABS, 1, -)
     KEYMAP(KEY_F, ABS_HAT0Y, EV_ABS, 1, +)
+
     KEYMAP(KEY_F, ABS_HAT0Y, EV_ABS, 1, )
 
     KEYMAP(KEY_D, ABS_HAT0X, EV_ABS, 1, -)
 
     KEYMAP(KEY_D, ABS_HAT0X, EV_ABS, 1, -)
     KEYMAP(KEY_G, ABS_HAT0X, EV_ABS, 1, +)
+
     KEYMAP(KEY_G, ABS_HAT0X, EV_ABS, 1, )
 
      
 
      
 
     /* Red buttons */
 
     /* Red buttons */
     KEYMAP(KEY_A, BTN_0, EV_KEY, 1, +)
+
     KEYMAP(KEY_A, BTN_0, EV_KEY, 1, )
     KEYMAP(KEY_S, BTN_1, EV_KEY, 1, +)
+
     KEYMAP(KEY_S, BTN_1, EV_KEY, 1, )
     KEYMAP(KEY_Q, BTN_2, EV_KEY, 1, +)
+
     KEYMAP(KEY_Q, BTN_2, EV_KEY, 1, )
 
      
 
      
 
     /* Yellow button */
 
     /* Yellow button */
     KEYMAP(KEY_2, BTN_3, EV_KEY, 1, +)
+
     KEYMAP(KEY_2, BTN_3, EV_KEY, 1,)
 
     #endif
 
     #endif
  

Revision as of 20:37, 4 December 2012

Projects
Participants Control-k, Maijin, Realitygaps, Wizzup
Skills Programming
Status Active
Niche Software
Purpose Fun

Arcade Machine

We now own a <MODEL> Arcade Machine. The plan is to bring new life into the machine by putting a computer in there and hooking that computer to the joystick input and screens. The computer will run MAME and other emulators, such as Amiga or SNES emulators.

PS: I set the niche mostly to software because the electronics/mechanics are probably quite simple in this case.

Getting it to work

There's a basic UvA machine in the Arcade Box; with Wake on Lan. Just send the WOL packet to the right mac address, which can be found on the machine:

 00:21:70:03:31:1b

Here is an example command line that will turn on the machine (etherwake defaults to eth0, so wlan0 is specified)

 sudo etherwake 00:21:70:03:31:1b -i wlan0

Or:

   wakeonlan 00:21:70:03:31:1b

From: http://gsd.di.uminho.pt/jpo/software/wakeonlan/

Input

Arcade Machine input

The input can be read as PS2 (and USB); using a chip that we got alongside the Arcade Machine:

http://www.ultimarc.com/jpac.html http://www.ultimarc.com/jpac2.html

The Arcade Machine input exposes itself as a single keyboard over USB and PS/2. This is problematic for most games, with the exception of MAME and a few emulators.

The chip does not expose more than one HID, we will have to fiddle around a bit to get all the software to read from the input devices as two seperate devices. MAME is known to handle the basic PS2 input just fine (AFAIK), but for other emulators this can be a problem. Solutions include writing our own input driver or perhaps faking a device in X.

See the "Writing out own input driver" below for more details.

Basic instructions:

 ./disable_unusable_keyboard.sh
 cd uinput-mapper/
 make
 sudo ./map

Other Input

We attached two PlayStation controllers, but I (Wizzup) am not a big fan of them. Regardless, there's a USB hub so feel free to plug in other controllers! It would be nice to have proper SNES ones.

This may be useful: https://www.thinkgeek.com/product/f08d/ and http://www.amazon.com/Classic-USB-Super-Nintendo-Controller-PC/dp/B002JAU20W Or we can make our own.

Coin Input

This should be handled by the Input over PS2/USB as well. It is probably mapped to a key.

Video

We replaced the built-in monitor with a TFT monitor.

Sound

The sound works and is connected to the computer as well.

Games

Emulators:

  • ZSNES (SNES)
  • UAE (Amiga)
  • MAME
  • ...

Writing our own input driver

Code: https://github.com/MerlijnWajer/uinput-mapper

Compile:

 make

Run:

 ./map

Map:

  • Creates two joystick input devices in /dev/input
  • Both joystick devices are mapped sanely.
  • HAT0X / HAT0Y seem to work now that we specified absmin and absmax.

Keys are mapped like this:

 HAT -> HAT0X, HAT0Y
 Red Buttons, left to right: BTN_0, BTN_1, BTN_2
 Yellow Button: BTN_3


Notes / Future usage:

  • ./disable_unusable_keyboard.sh
  • ./uinput-mapper/map &
  • Run your emulator

What uinput-mapper does is the following: - Turn input from one keyboard into several virtual input devices.

Key remapping

Key mapping (in Keyboard); only relevant for developers:

   #ifndef H_GLOBAL_MAP
   #define H_GLOBAL_MAP
   
           /* Set up amount of joysticks here */
   #define JOYCOUNT 2
   
           /* Set up event to read from */
   #define INPUT_PATH "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
   
   #endif
   
           /* Now follows keymapping, do not touch ifdef */
   #ifdef H_IN_CASE
   #define KEYMAP(in_key, out_key, out_type, device, val) \
               case in_key: \
                   je.type = out_type; \
                   je.code = out_key; \
                   je.value = val(e.value); \
                   j = device; \
                   break;
   
   /* First joystick */
   
   /* HAT */
   KEYMAP(KEY_UP, ABS_HAT0Y, EV_ABS, 0, -)
   KEYMAP(KEY_DOWN, ABS_HAT0Y, EV_ABS, 0, )
   KEYMAP(KEY_LEFT, ABS_HAT0X, EV_ABS, 0, -)
   KEYMAP(KEY_RIGHT, ABS_HAT0X, EV_ABS, 0, )
   
   /* Red buttons */
   KEYMAP(KEY_LEFTCTRL, BTN_0, EV_KEY, 0, )
   KEYMAP(KEY_LEFTALT, BTN_1, EV_KEY, 0, )
   KEYMAP(KEY_SPACE, BTN_2, EV_KEY, 0, )
   
   /* Yellow button */
   KEYMAP(KEY_1, BTN_3, EV_KEY, 0, )
   
   /* Second joystick */
   
   /* HAT*/
   KEYMAP(KEY_R, ABS_HAT0Y, EV_ABS, 1, -)
   KEYMAP(KEY_F, ABS_HAT0Y, EV_ABS, 1, )
   KEYMAP(KEY_D, ABS_HAT0X, EV_ABS, 1, -)
   KEYMAP(KEY_G, ABS_HAT0X, EV_ABS, 1, )
   
   /* Red buttons */
   KEYMAP(KEY_A, BTN_0, EV_KEY, 1, )
   KEYMAP(KEY_S, BTN_1, EV_KEY, 1, )
   KEYMAP(KEY_Q, BTN_2, EV_KEY, 1, )
   
   /* Yellow button */
   KEYMAP(KEY_2, BTN_3, EV_KEY, 1,)
   #endif


Other uses

  • We can use it to control a variety of stuff. (light, sound)
  • We can hook other consoles into it.
  •  ???