Psychopy IO Gamepad
Я использую Builder в автономной версии PsychoPy 1.80.07 в Windows. Я пытаюсь понять, как создать компонент кода, чтобы получать ответы от геймпада Logitech F310. В идеале я хотел бы просто использовать триггеры. Я не получаю никакого кода ошибки при запуске эксперимента (это демонстрация ввода-вывода клавиатуры Stroop с заменой кода компонента кода ввода-вывода на код ниже). Кажется, что он работает нормально, но он просто показывает первое испытание и ожидает ответа от субъекта, поскольку думал, что он не слышит геймпад. Кроме того, я могу запустить демо-версию XInput Gamepad Coder, и все работает отлично. Я новичок в кодировании, поэтому любая помощь в указании, где я допустил ошибки, будет высоко ценится!
Вот что у меня в компоненте кода:
#Begin Experiment
try:
from psychopy import visual, core
from psychopy.iohub import launchHubServer, EventConstants
from psychopy.data import getDateStr
kwargs={'psychopy_monitor_name':'default','xinput.Gamepad':{}}
io=launchHubServer(**kwargs)
gamepad=io.devices.gamepad
except Exception, e:
import sys
print "!! Error starting ioHub: ",e," Exiting..."
sys.exit(1)
#Begin Routine
response_event=None
trial_start=0
io.clearEvents()
#Each Frame
if frameN == 0:
io.clearEvents('all')
trial_start=core.getTime()
else:
gamepadState=gamepad.getEvents()
for anyState in gamepadState:
if anyState in [u'left_trigger',u'right_trigger']:
response_event=gamepadState
continueRoutine = False
break
#End Routine
trials.addData("trial_start_time", trial_start)
if response_event:
trials.addData("resp.time", response_event.time)
trials.addData("resp.rt", response_event.time-trial_start)
trials.addData("resp.duration", response_event.duration)
trials.addData('resp.keys',response_event.key)
trials.addData('resp.corr', response_event.key.lower()==corrAns)
else:
trials.addData("resp.time",-1.0)
trials.addData("resp.rt", -1.0)
trials.addData("resp.duration", -1.0)
trials.addData('resp.keys','None')
trials.addData('resp.corr', False)
#End Experiment
io.quit()
1 ответ
Если вы хотите получить последнее значение левого и правого триггеров на геймпаде, вы можете прочитать эти значения напрямую с помощью getTriggers() и вообще не использовать getEvents().
getTriggers() вернет dict, содержащий последнее состояние чтения триггеров iohub и время чтения значений.
Например, предположим, что 'gamepad' является переменной, содержащей ваш экземпляр устройства iohub xinput gamepad:
gp_triggers = gamepad.getTriggers()
# psychopy time that the trigger values were actually read (in sec.msec)
trig_time = gp_triggers['time']
# values will be between 0.0 and 1.0. 0.0 = Not pressed at all; 1.0 = fully pressed.
left_val, right_val = gp_triggers['left_trigger'], gp_triggers['right_trigger']
Затем используйте left_val и right_val в условном выражении, которое имеет смысл, когда вы хотите принять состояние триггеров геймпада в качестве ответа. Например, если вы хотите принять ответ, когда любой триггер нажат более чем на 50%:
if left_val > 0.5 and right_val > 0.5:
# set some response vars like you were
response = gp_triggers
continueRoutine = False
break
Затем в вашем коде вы снова можете получить доступ к значениям ответа dict:
resp_time = response['time']
left_val, right_val = response['left_trigger'], response['right_trigger']