#!/usr/bin/python
import uinput
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
# Up, Down, left, right, fire
GPIO.setup(2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(11, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(9, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(8, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(28, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(30, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(29, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(31, GPIO.IN, pull_up_down=GPIO.PUD_UP)

events = (uinput.KEY_ESC, uinput.KEY_UP, uinput.KEY_DOWN, uinput.KEY_RIGHT, uinput.KEY_LEFT, uinput.KEY_ENTER, uinput.KEY_A, uinput.KEY_B, uinput.KEY_C, uinput.KEY_D, uinput.KEY_E, uinput.KEY_F, uinput.KEY_G, uinput.KEY_H, uinput.KEY_I, uinput.KEY_J, uinput.KEY_K, uinput.KEY_L, uinput.KEY_M, uinput.KEY_N, uinput.KEY_O, uinput.KEY_P, uinput.KEY_Q, uinput.KEY_R, uinput.KEY_S, uinput.KEY_T, uinput.KEY_U, uinput.KEY_V)

device = uinput.Device(events)

# Bools to keep track of movement
resetbutton = False
p1b3 = False
p1b2 = False
p1b1 = False
p1right = False
p1left = False
p1down = False
p1up = False
p1start = False 

p2b3 = False
p2b2 = False
p2b1 = False
p2right = False
p2left = False
p2down = False
p2up = False
p2start = False

aux1 = False
aux2 = False
exitgame = False
aux4 = False

while True:
	if (not p2b3) and (not GPIO.input(2)):  # button pressed
		p2b3 = True
		device.emit(uinput.KEY_A, 1)
	if p2b3 and GPIO.input(2):              # button released
		p2b3 = False
		device.emit(uinput.KEY_A, 0) 
	if (not resetbutton) and (not GPIO.input(3)):  # button pressed
		resetbutton = True
		device.emit(uinput.KEY_U, 1) 
	if resetbutton and GPIO.input(3):              # button released
		resetbutton = False
		device.emit(uinput.KEY_U, 0) 

	if (not p1b3) and (not GPIO.input(4)):  # button pressed
		p1b3 = True
		device.emit(uinput.KEY_C, 1)
	if p1b3 and GPIO.input(4):              # button released
		p1b3 = False
		device.emit(uinput.KEY_C, 0) 
	if (not p1b2) and (not GPIO.input(14)):  # button pressed
		p1b2 = True
		device.emit(uinput.KEY_D, 1)
	if p1b2 and GPIO.input(14):              # button released
		p1b2 = False
		device.emit(uinput.KEY_D, 0) 
	if (not p1b1) and (not GPIO.input(15)):  # button pressed
		p1b1 = True
		device.emit(uinput.KEY_ENTER, 1)
	if p1b1 and GPIO.input(15):              # button released
		p1b1 = False
		device.emit(uinput.KEY_ENTER, 0) 
	if (not p1right) and (not GPIO.input(17)):  # button pressed
		p1right = True
		device.emit(uinput.KEY_RIGHT, 1)
	if p1right and GPIO.input(17):              # button released
		p1right = False
		device.emit(uinput.KEY_RIGHT, 0) 
	if (not p1left) and (not GPIO.input(18)):  # button pressed
		p1left = True
		device.emit(uinput.KEY_LEFT, 1)
	if p1left and GPIO.input(18):              # button released
		p1left = False
		device.emit(uinput.KEY_LEFT, 0) 
	if (not p1down) and (not GPIO.input(27)):  # button pressed
		p1down = True
		device.emit(uinput.KEY_DOWN, 1)
	if p1down and GPIO.input(27):              # button released
		p1down = False
		device.emit(uinput.KEY_DOWN, 0) 
	if (not p1up) and (not GPIO.input(23)):  # button pressed
		p1up = True
		device.emit(uinput.KEY_UP, 1)
	if p1up and GPIO.input(23):              # button released
		p1up = False
		device.emit(uinput.KEY_UP, 0) 
	if (not p1start) and (not GPIO.input(22)):  # button pressed
		p1start = True
		device.emit(uinput.KEY_J, 1)
	if p1start and GPIO.input(22):              # button released
		p1start = False
		device.emit(uinput.KEY_J, 0) 
	if (not p2b2) and (not GPIO.input(24)):  # button pressed
		p2b2 = True
		device.emit(uinput.KEY_K, 1)
	if p2b2 and GPIO.input(24):              # button released
		p2b2 = False
		device.emit(uinput.KEY_K, 0) 
	if (not p2b1) and (not GPIO.input(10)):  # button pressed
		p2b1 = True
		device.emit(uinput.KEY_L, 1)
	if p2b1 and GPIO.input(10):              # button released
		p2b1 = False
		device.emit(uinput.KEY_L, 0) 
	if (not p2right) and (not GPIO.input(9)):  # button pressed
		p2right = True
		device.emit(uinput.KEY_M, 1)
	if p2right and GPIO.input(9):              # button released
		p2right = False
		device.emit(uinput.KEY_M, 0) 
	if (not p2left) and (not GPIO.input(11)):  # button pressed
		p2left = True
		device.emit(uinput.KEY_O, 1)
	if p2left and GPIO.input(11):              # button released
		p2left = False
		device.emit(uinput.KEY_O, 0) 
	if (not p2down) and (not GPIO.input(25)):  # button pressed
		p2down = True
		device.emit(uinput.KEY_P, 1)
	if p2down and GPIO.input(25):              # button released
		p2down = False
		device.emit(uinput.KEY_P, 0) 
	if (not p2up) and (not GPIO.input(8)):  # button pressed
		p2up = True
		device.emit(uinput.KEY_Q, 1)
	if p2up and GPIO.input(8):              # button released
		p2up = False
		device.emit(uinput.KEY_Q, 0) 
	if (not p2start) and (not GPIO.input(7)):  # button pressed
		p2start = True
		device.emit(uinput.KEY_R, 1)
	if p2start and GPIO.input(7):              # button released
		p2start = False
		device.emit(uinput.KEY_R, 0) 
	if (not aux1) and (not GPIO.input(28)):  # button pressed
		aux1 = True
		device.emit(uinput.KEY_S, 1)
	if aux1 and GPIO.input(28):              # button released
		aux1 = False
		device.emit(uinput.KEY_S, 0) 
	if (not aux2) and (not GPIO.input(30)):  # button pressed
		aux2 = True
		device.emit(uinput.KEY_T, 1)
	if aux2 and GPIO.input(30):              # button released
		aux2 = False
		device.emit(uinput.KEY_T, 0) 
	if (not exitgame) and (not GPIO.input(29)):  # button pressed
		exitgame = True
		device.emit(uinput.KEY_ESC, 1)
	if exitgame and GPIO.input(29):              # button released
		exitgame = False
		device.emit(uinput.KEY_ESC, 0) 
	if (not aux4) and (not GPIO.input(31)):  # button pressed
		aux4 = True
		device.emit(uinput.KEY_V, 1)
	if aux4 and GPIO.input(31):              # button released
		aux4 = False
		device.emit(uinput.KEY_V, 0) 
	time.sleep(.02)  # Poll every 20ms (otherwise CPU load gets too high)
