Skip to content

Instantly share code, notes, and snippets.

@gwbischof
Created June 21, 2019 21:31
Show Gist options
  • Save gwbischof/86320a790b8a0708b3ca71bb90714f35 to your computer and use it in GitHub Desktop.
Save gwbischof/86320a790b8a0708b3ca71bb90714f35 to your computer and use it in GitHub Desktop.
pdf gamepad
import inputs
import time
import threading
from epics import caget, caput, cainfo
class GamePad:
def __init__(self, ldms_button='BTN_TL',rdms_button='BTN_TR',
activate_button='BTN_START', status_pv=None):
self._ldms_button = ldms_button
self._rdms_button = rdms_button
self._act_button = activate_button
self._ldms = 0
self._rdms = 0
self._active = 0
self._enabled = False
self._run = True
self._gp = None
self._thread = threading.Thread(target=self._main_loop)
self._thread.start()
self._move_buttons=dict()
self._trigger_L = False
self._trigger_R = False
self._trigger_old_L = False
self._trigger_old_R = False
self._step_size = 1
#self._v_thread = threading.Thread(target=self._vib_loop)
#self._v_thread.start()
def _main_loop(self):
while self._run:
events = inputs.get_gamepad()
for event in events:
self._enable(event.code, event.state)
if self._enabled:
getattr(self, event.code)(event.state)
if event.code != 'SYN_REPORT':
#if event.code == 'ABS_X':
print(event.ev_type, event.code, event.state)
def _enable(self, code, value):
if code == self._ldms_button:
self._ldms = value
if code == self._rdms_button:
self._rdms = value
if (self._ldms or self._rdms):
if code == self._act_button:
print(self._active)
self._active += value
if self._active >= 5:
self._enabled = True
else:
self._enabled = False
else:
self._enabled = False
self._active = 0
#def _vib_loop(self):
# inputs.devices.codes['ForceFeedback'] = {num: "SYN_REPORT" for num in range(20)}
# while self._run:
# if not self._gp:
# self._gp = inputs.devices.gamepads[0]
# if self._enabled:
# ...
#self._gp.set_vibration(1,1,500)
# time.sleep(3)
#def _update_status(self, value):
# ...
def __del__(self):
self.run = False
self._thread.join()
def ABS_X(self, value):
# Left stick X.
...
def ABS_Y(self, value):
# Left stick Y.
...
def ABS_Z(self, value):
# Left trigger.
if value>100:
self._trigger_L=True
self._move_buttons['TRIGGER_LEFT'] = 1
elif value<30:
self._trigger_L=False
self._move_buttons['TRIGGER_LEFT'] = 0
if not self._trigger_old_L and self._trigger_L:
caput('XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWV', self._step_size, wait = False)
#caput('XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWF', 1, wait = False)
self.continuous_move('TRIGGER_LEFT',
'XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWR')
self._trigger_old_L = self._trigger_L
def ABS_RX(self, value):
...
def ABS_RY(self, value):
...
def ABS_RZ(self, value):
# Right trigger.
if value>100:
self._trigger_R=True
self._move_buttons['TRIGGER_RIGHT'] = 1
elif value<30:
self._trigger_R=False
self._move_buttons['TRIGGER_RIGHT'] = 0
if not self._trigger_old_R and self._trigger_R:
caput('XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWV', self._step_size, wait = False)
#caput('XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWF', 1, wait = False)
self.continuous_move('TRIGGER_RIGHT',
'XF:28ID1B-ES{Env:1-Ax:Z}Mtr.TWF')
self._trigger_old_R = self._trigger_R
def ABS_HAT0X(self, value):
# d-pad x, -1 is left, 1 is right.
if value==1:
self._move_buttons['DPAD_RIGHT'] = 1
caput('XF:28ID1B-ES{Env:1-Ax:X}Mtr.TWV', self._step_size, wait=False)
self.continuous_move('DPAD_RIGHT',
'XF:28ID1B-ES{Env:1-Ax:X}Mtr.TWR')
elif value==-1:
self._move_buttons['DPAD_LEFT'] = 1
caput('XF:28ID1B-ES{Env:1-Ax:X}Mtr.TWV', self._step_size, wait=False)
self.continuous_move('DPAD_LEFT',
'XF:28ID1B-ES{Env:1-Ax:X}Mtr.TWF')
else:
self._move_buttons['DPAD_LEFT'] = 0
self._move_buttons['DPAD_RIGHT'] = 0
def ABS_HAT0Y(self, value):
# d-pad y, -1 is up, 1 is down.
if value==1:
self._move_buttons['DPAD_DOWN'] = 1
caput('XF:28ID1B-ES{Env:1-Ax:Y}Mtr.TWV', self._step_size, wait=False)
self.continuous_move('DPAD_DOWN',
'XF:28ID1B-ES{Env:1-Ax:Y}Mtr.TWR')
elif value==-1:
self._move_buttons['DPAD_UP'] = 1
caput('XF:28ID1B-ES{Env:1-Ax:Y}Mtr.TWV', self._step_size, wait=False)
self.continuous_move('DPAD_UP',
'XF:28ID1B-ES{Env:1-Ax:Y}Mtr.TWF')
else:
self._move_buttons['DPAD_DOWN'] = 0
self._move_buttons['DPAD_UP'] = 0
def continuous_move(self, move_button, move_pv):
def thread_function():
while self._move_buttons[move_button] and (self._ldms or self._rdms):
caput(move_pv, 1, wait=True)
#caput(step_pv, step_size, wait=False)
t1 = threading.Thread(target=thread_function)
t1.start()
def BTN_START(self, value):
# Start button.
...
def BTN_SELECT(self, value):
# Select button.
...
def BTN_NORTH(self, value):
# X button.
self._step_size = 100
def BTN_SOUTH(self, value):
# A button.
...
def BTN_EAST(self, value):
# B button.
self._step_size = 1
def BTN_WEST(self, value):
# Y button.
self._step_size = 10
def BTN_THUMBL(self, value):
# Left stick button.
...
def BTN_THUMBR(self, value):
# Right stick button.
...
def BTN_TL(self, value):
# Top left button.
#self._ldms = value
#if value == 1:
# self._ldms = True
#else:
# self._ldms = False
...
def BTN_TR(self, value):
# Top right button.
#self._rdms = value
#if value == 1:
# self._rdms = True
#else:
# self._rdms = False
...
def BTN_MODE(self, value):
# Center xbox button.
...
def SYN_REPORT(self, value):
# Don't know.
...
gp = GamePad()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment