Геймпад Psychopy IO

Я использую Builder в автономном PsychoPy 1.80.07 в Windows. Я пытаюсь понять, как создать компонент кода для получения ответов от геймпада Logitech F310. В идеале я хотел бы просто использовать триггеры. Я не получаю никакого кода ошибки, когда запускаю эксперимент (который представляет собой демонстрацию ввода-вывода клавиатуры Stroop с кодом компонента кода клавиатуры ввода-вывода, замененным приведенным ниже кодом). Кажется, он работает нормально, но он просто показывает первую пробную версию и ждет ответа субъекта, так как думает, что не слышит геймпад. Кроме того, я могу запустить XInput Gamepad Coder Demo, и все работает отлично. Я новичок в кодировании, поэтому любая помощь в указании на то, где я допустил ошибки, будет очень признательна!

Вот что у меня есть в моем компоненте кода:

#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()

person SkepticalMat    schedule 12.09.2014    source источник
comment
Я подозреваю, что gamePadState содержит больше, чем просто строки, соответствующие тому, какая кнопка была нажата, и, следовательно, ваша проверка if anyState in… всегда будет терпеть неудачу. Можете ли вы сообщить нам результат print(anyState); печать (тип (любое состояние)) есть?   -  person Michael MacAskill    schedule 15.09.2014


Ответы (1)


Если вы хотите получить последние значения левого и правого триггеров на геймпаде, вы можете прочитать эти значения непосредственно с помощью getTriggers() и вообще не использовать getEvents().

getTriggers() вернет dict, содержащий последнее состояние чтения триггеров iohub и время чтения значений.

Например, предположим, что «gamepad» — это переменная, содержащая экземпляр вашего геймпада iohub xinput:

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'] 
person Sol Simpson    schedule 15.09.2014
comment
Сол, работает! Теперь мне просто нужно сделать прыжок, чтобы заставить это делать то, что мне нужно в моем эксперименте. Я хочу, чтобы ответ геймпада был ограничен окном, начинающимся с кадра 168 и продолжающимся в течение следующих 48 кадров. Я также хочу зарегистрировать RT и правильность ответа, сравнив ответ с $correctAns. Мне также нужно отправить сигнал ttl через параллельный порт (адрес 0xDF00) на RT, который отправляет 5, если ответ правильный, и 10, если он неправильный. Я пойду, как только эти проблемы будут решены. - person SkepticalMat; 16.09.2014