Setting up your Xbox 360 controller on Ubuntu

As much as people want to deny it, the Xbox 360 controller is the best gamepad you can buy. And since i already have a 360, using my current xbox controllers makes a lot of sense for emulation on ubuntu. However, the usb receiver/gamepad compatibility in ubuntu is sketchy at best for older Ubuntu versions.

If you are using Ubuntu 9.04, it’s basically plug and play. As soon as you connect the receiver and sync your controller, you should just have to map your buttons like any other gamepad. For Ubuntu 8.04 and 8.10 you have to do the following.

First thing is, plug in that usb receiver and then attempt to sync your controller with the receiver. First thing i noticed was that it doesn’t connect like it does with the xbox where you will get the top left part of the ring lit up representing player 1. In ubuntu, I got the full ring blinking constantly. Not sure why this is, but i just ignore it.

When you first plug it in, you notice, it’s basically the mouse… as you move the left analog, your mouse cursor moves. Fantastic, another mouse, this isn’t what i want. After doing a bit or research, this is apparently a problem in 8.04 and 8.10. To get it working as a joystick/gamepad, open up terminal and type:

xinput list

you will get a list of devices. despite what you read online elsewhere, you don’t get one for the controller, but 4 of “Xbox Wireless Receiver” which look like this:

“Xbox 360 Wireless Receiver” id=6 [XExtensionPointer]
Num_buttons is 32
Num_axes is 2
Mode is Absolute
Motion_buffer is 256
Axis 0 :
Min_value is -32768
Max_value is 32767
Resolution is 10000
Axis 1 :
Min_value is -32768
Max_value is 32767
Resolution is 10000

You have to enable all 4 of them (cause who knows which one your controller will pick) with the following command. The device number is the “id=6″ part from above.

sudo xinput set-int-prop [device number] ‘Device Enabled’ 32 0

Now the problem appears to be with this is when you restart your pc, these settings get reset. as of now, you gotta set them each time you reboot. I’m going to work on this issue. I’ll post when i got it worked out. But from here, just go into zsnes for example and map your buttons for your gamepad. Easy as that.

I must admit, playing Super Mario Bros. 3 with an Xbox 360 Controller is a bit surreal.

Configuring LIRC Button Presses (repeat and delay)

This post covers the LIRC button press configuration options found in an LIRC config file in mythbuntu. The LIRC config files are found in the .lirc directory in your home directory (/home/yourname/.lirc/ or ~/.lirc/ ).

An LIRC control configuration file has several options that are available when a button is pressed to control how that button is interpreted and translated into a key press. Here is a brief explanation of the options.

Here is an example of a key press configuration (taken from /home/yourname/.lirc/mythtv):

begin
remote = mceusb
prog = mythtv
button = Down
config = Down
repeat = 2
delay = 1
end

Ok lets break this down and explain how it works:

begin
remote = mceusb
# this is the id for the remote that this configuration belongs too

prog = mythtv
# this is the name of the executable of the program that this configuration triggers in

button = Down
# this is the id for the button that when pressed on the remote fires this event

config = Down
# this is the action that is fired when the button is pressed
# the config option can either be a X windows key press event
# or a shell command like “xmacro-wrap SaveState”

repeat = 3
# use the repeat command for buttons that you want to be able to
# just hold down and they keep repeating the command every ‘n’ cycles.
# In this example the command will be issued every 3 cycles
# which for the mceusb remote is about once every second.
# if you set repeat = 0 the command will be sent only once even if you
# hold the button down.

delay = 0
# the delay config option can be used in conjunction with the repeat command to
# to tweak the speed that the button presses are accepted
# a delay of 1 delays the repeat by one cycle set the delay to 0 to disable it.
end

There are some other options available but these are the most common options used with mythtv. for more information google wiki LIRC Configuration.

Hopefully this is the last LIRC post for mythbuntu even though there is more you can do hopefully this will give enough info to be deadly and come up with creative uses for LIRC in mythbuntu!

Adding LIRC to Mythbuntu Game Emulators

Most of the stuff in this post I found at an awesome wiki that explains how to completely configure mythgame for mythbuntu. This post just covers setting up zsnes and sdlmame to work with lirc so that you can use your remote to navigate menus and control volume and all that great stuff.

Here is a link to the article with information on almost every emulator out there and how to configure them: http://www.mythtv.org/wiki/Configuring_MythGame_Emulation#Remote_Control_Integration.

Step 1 Install Packages Using Synaptec Package Manager

  • xmacro
  • sdlmame
  • zsnes

Step 2 Edit LIRC Config Files

Run the following command from console:

nano ~/.lirc/irexec

File Contents:

begin
remote = mceusb
prog = irexec
button = Stop
config = xmacro-wrap extra1
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Power
config = xmacro-wrap Exit
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Pause
config = xmacro-wrap Pause
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Play
config = xmacro-wrap LoadState
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Record
config = xmacro-wrap SaveState
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = More
config = xmacro-wrap SelectState
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = VolDown
config = xmacro-wrap VolDown
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = VolUp
config = xmacro-wrap VolUp
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = OK
config = xmacro-wrap Return
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Home
config = xmacro-wrap Menu
repeat = 0
end
begin
remote = mceusb
prog = irexec
button = Up
config = xmacro-wrap Up
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = Down
config = xmacro-wrap Down
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = Left
config = xmacro-wrap Left
repeat = 1
end
begin
remote = mceusb
prog = irexec
button = Right
config = xmacro-wrap Right
repeat = 1
end

Run the following command from console:

nano ~/.lircrc

Add the following line to that file:

include ~/.lirc/irexec

You may need to restart your lirc daemon for changes to take effect.

/etc/init.d/lirc restart

Step 3 Create a macro-wrap Script

OH Wait! Here is one for you already that contains the commands for both zsnes:
run this command from console and paste the text in the box below in

sudo nano /usr/bin/xmacro-wrap

File Contents:

#!/bin/bash
# xmacroplay wrapper for emulators under mythTV

# finds an emulator running and loads its keytable.
# add your emulator below! Use the ‘unused’ key for unused commands
function keyAssign {
# master list of commands
COMMAND=( ‘Exit’ ‘Reset’ ‘SaveState’ ‘LoadState’ ‘PickState’ \
‘IncState’ ‘DecState’ ‘Fastforward’ ‘SlowDown’ ‘Rewind’ \
‘Pause’ ‘Return’ ‘Menu’ ‘VolUp’ ‘VolDown’ \
‘Mute’ ‘Up’ ‘Down’ ‘Left’ ‘Right’ \
‘Extra1′ ‘Extra2′ ‘Extra3′ ‘Extra4′ ‘Extra5′)
let NUMCOMMANDS=${#COMMAND[@]}-1
KEYS=”

####### ########################################################
# Add other emulators below! ##################################################
####### ########################################################

#zsnes configuration
if ps -A | egrep -q ‘ zsnes’; then
# quit reset save_st load_st pick_st
KEYS=( ‘F11′ ‘F10′ ‘F2′ ‘F4′ ‘F3′ \
# st+ st- ffwd slow rwnd
‘unused’ ‘unused’ ‘unused’ ‘unused’ ‘unused’ \
# pause ok menu vol+ vol-
‘p’ ‘Return’ ‘Escape’ ‘F8′ ‘F9′ \
# mute up down left right
‘unused’ ‘Up’ ‘Down’ ‘Left’ ‘Right’ \
# extra1 extra2 extra3 extra4 extra5
‘Escape’ ‘unused’ ‘unused’ ‘unused’ ‘unused’ )
PASSNUMERAL=’true’ #use numbers to change state for fceu
EMUNAME=”ZSNES”
#sdlmame configuration
elif ps -A | egrep -q ‘ sdlmame’; then
# quit reset save_st load_st pick_st
KEYS=( ‘Escape’ ‘F3′ ‘F7′ ‘Shift_L+F7′ ‘unused’ \
# st+ st- ffwd slow rwnd
‘unused’ ‘unused’ ‘unused’ ‘unused’ ‘comma’ \
# pause ok menu vol+ vol-
‘unused’ ‘Return’ ‘Tab’ ‘Right’ ‘Left’ \
# mute up down left right
‘asciitilde’ ‘Up’ ‘Down’ ‘Left’ ‘Right’ \
# extra1 extra2 extra3 extra4 extra5
‘Escape’ ‘unused’ ‘unused’ ‘unused’ ‘unused’ )
PASSNUMERAL=’true’ #use numbers to change state for nestopia
EMUNAME=”SDLMAME”
fi
}

#use KeyStr and hold down for a little bit. $1 is keystr, [$2] is delay
function pressKey {
echo “KeyStrPress $1″ | xmacroplay “:0.0″
local SLEEPTIME=.05 #.05 is a good default hold time for fceu and zsnes
if [ $# == 2 ]; then
SLEEPTIME=$2
fi
sleep $SLEEPTIME
echo “KeyStrRelease $1″ | xmacroplay “:0.0″
debugOutput “$1 ($SLEEPTIME seconds)” 1
}

#output to console/logfile
function debugOutput {
ECHOCOMMAND=”echo”

# use “debugOutput text 1″ or similar to prevent newline
if [ $# == 2 ]; then
ECHOCOMMAND=”echo -n”
fi
if [ $DEBUGMODE != 'none' ]; then
$ECHOCOMMAND “$1″
fi
if [ $DEBUGMODE = 'true' ]; then
$ECHOCOMMAND “$1″ >> ~/.xmacro-wrap.log

#trim log
if [ ! -z "$LOGFILESIZE" ]; then
cat ~/.xmacro-wrap.log | tail -n $LOGFILESIZE > ~/.xmacro-wrap.log
fi
fi
}

#send the key!
function sendData {
KEYSYM=’undefined’

# see if a numeral was entered
# if so, set the key symbol to that number if allowed by settings
# if the numeral is also a command, the numeral will be overwritten later
for i in 0 1 2 3 4 5 6 7 8 9; do
if [ "$1" == $i ] && [ "$PASSNUMERAL" = 'true' ]; then
KEYSYM=$1
fi
done

#find the key we want to send
# look for a match in our definitions
for i in `seq 0 $NUMCOMMANDS`; do
if [ "${COMMAND[i]}” = “$1″ ]; then
KEYSYM=${KEYS[i]}
COMMANDNAME=${COMMAND[i]}
fi
done

#if not legal key
if [ "$KEYSYM" = 'undefined' ] || [ "$KEYSYM" = 'unused' ]; then
debugOutput ” $KEYSYM for $EMUNAME”
exit 1
fi

#otherwise do it!
pressKey $KEYSYM $2
debugOutput ” sent to $EMUNAME”
exit 0
}

# true logs to file and to stdout
# false logs to stdout only
# none is silent
DEBUGMODE=’true’
LOGFILESIZE=’50′ #number of lines, use blank for unlimited

if [ "$#" == "0" ] || [ "$#" -gt "3" ]; then
echo ‘Wrapper for xmacroplay for use with emulators’
echo ”
echo ‘Usage: xmacro-wrap COMMAND [DURATION]‘
echo ‘ or: xmacro-wrap KEYSTR direct [DURATION]‘
echo ”
echo ‘COMMAND is any internally recognized command, for example’
echo ‘ Exit, Reset, SaveState, Mute.’
echo ”
echo ‘DURATION is in seconds.’
echo ”
echo ‘Direct mode is invoked like this: xmacro-wrap backslash direct 1′
echo ‘ (Sends backslash key, held for 1 second)’
echo ‘ see X11/keysymdef.h’
echo ”
exit 1
fi

#direct mode option
if [ "$2" = "direct" ]; then
debugOutput “Direct output: ” 1
pressKey $1 $3
exit 0
fi

DATESTR=”`date +%m/%d/%y` `date +%T`”
keyAssign
# if an emulator isn’t running, KEYS is blank
if [ -z "$KEYS" ]; then
debugOutput “$DATESTR, no emulator to pass command \”$1\”!”
exit 1
else
debugOutput “$DATESTR, command \”$1\”: ” 1
fi
sendData $@

Run the following command in console:

sudo chmod 755 /usr/bin/xmacro-wrap

Step 4 Create Game Launcher Scripts

Run the following command from console:

nano ~/snes.sh

File Contents:

#!/bin/bash
# zsnes path + executable
ZSNES=/usr/bin/zsnes
# irexec path + executable
IREXEC=/usr/bin/irexec
# irexec process name to kill
IREXEC_PS=irexec

$IREXEC &
$ZSNES “$1″
killall $IREXEC_PS
exit 0

Run the following command from console:

nano ~/mame.sh

File Contents:

#!/bin/bash
# zsnes path + executable
MAME=/usr/games/sdlmame
# irexec path + executable
IREXEC=/usr/bin/irexec
# irexec process name to kill
IREXEC_PS=irexec

$IREXEC &
$MAME -skip_gameinfo $1
killall $IREXEC_PS
exit 0

Run the following commands from console:

chmod 755 ~/snes.sh
chmod 755 ~/mame.sh

Step 5 Configuring Mythbuntu Game Players

Configure zsnes keys MISC->Misc Keys:

Start up the Myth Frontend Interface.
Select Utilities / Setup -> Setup -> Media Settings -> Game Settings -> Game Players.
New Game Player
Type: SNES
Command: ~/snes.sh

New Game Player
Type: MAME
Command: ~/mame.sh

Step 6 Problems

This guide requires that you have setup the proper keys in zsnes to match the keys in the xmacro-wrap script.

Make sure that in /etc/mame.ini file the rom-path is set to the path where all of the roms are located or sdlmame may not work.

Enjoy!

**Edit here is an updated set of lirc and shell scripts for running macrowrap!

mythbuntu-macrowrap-lirc

Mupen64plus with LIRC for mythbuntu 9.04

Instructions for compiling and installing mupen64plus with support your remote control in 64 bit mythbuntu.

Step 1 Install Development Packages

Install the following packages using the synaptec package manager:

  • sdlmame
  • liblircclient
  • liblircclient-dev
  • libqt4
  • libqt4-dev
  • libxtst
  • libxtst-dev
  • libsamplerate
  • libsdl1.2-dev
  • libsdl-ttf2.0-0
  • libsdl-ttf2.0-dev
  • g++

Step 2 Installing mupen64plus

Download the latest source for mupen64plus to your Desktop:

http://mupen64plus.googlecode.com/files/Mupen64Plus-1-5-src.tar.gz

Open up a console and run the following commands:

cd Desktop
tar xzf Mupen64Plus-1-5-src.tar.gz
cd Mupen64Plus-1-5-src
make LIRC=1 all
sudo make install
cd /usr/local/bin
sudo chmod 4755 mupen64plus

Step 3 Configure The Buttons on Your Remote:

run the following command from console (note the ~ is a linux alias for your home directory):

nano ~/.lirc/mupen64plus

# Add the following Lines to the file .lirc/mupen64plus
# replace mceusb with the name of your remote
# you can find the name or your remote by checking any of the files in your .lirc/ directory

# start .lirc/mupen64plus
begin
remote = mceusb
prog = mupen64plus
button = Stop
config = quit
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = Power
config = quit
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = Pause
config = pause
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = Play
config = pause
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = VolDown
config = vol-
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = VolUp
config = vol+
repeat = 0
delay = 0
end
begin
remote = mceusb
prog = mupen64plus
button = Home
config = fullscreen
repeat = 0
delay = 0
end
# end .lirc/mupen64plus
# save the file and exit nano

Run the following command from console:

nano ~/.lircrc

# add the fololowing line to the end of .lircrc

include ~/.lirc/mupen64plus

# save the file and exit nano

Step 4 Configuring Mupen64plus

Run the following command from console and use the gui to setup and configure controllers video settings etc.:

sudo mupen64plus

for best results use the Glide plugin for video not sure why this is best but it sems to work for most games!

Step 5 Configuring Mythbuntu Game Settings

  1. Start up the Myth Frontend Interface.
  2. Select Utilities / Setup -> Setup -> Media Settings -> Game Settings -> Game Players.
  3. Command: mupen64plus –nogui –fullscreen

Rock out with your frock out using mupen64plus!