Gamepad 心理变态IO游戏机

Gamepad 心理变态IO游戏机,gamepad,xinput,psychopy,Gamepad,Xinput,Psychopy,我在Windows中的单机版PsychoPy 1.80.07中使用Builder。我试图找出如何创建一个代码组件来接收来自Logitech F310 Gamepad的响应。理想情况下,我只想使用触发器。我在运行实验时没有得到任何错误代码(这是Stroop键盘IO演示,IO键盘代码组件代码替换为以下代码)。它似乎运行良好,但它只是显示第一次试用,并等待受试者的反应,因为它认为它没有听到游戏板。此外,我能够运行XInput Gamepad编码器演示,一切正常。我是一个编码新手,所以如果能帮我指出哪里

我在Windows中的单机版PsychoPy 1.80.07中使用Builder。我试图找出如何创建一个代码组件来接收来自Logitech F310 Gamepad的响应。理想情况下,我只想使用触发器。我在运行实验时没有得到任何错误代码(这是Stroop键盘IO演示,IO键盘代码组件代码替换为以下代码)。它似乎运行良好,但它只是显示第一次试用,并等待受试者的反应,因为它认为它没有听到游戏板。此外,我能够运行XInput Gamepad编码器演示,一切正常。我是一个编码新手,所以如果能帮我指出哪里出了错,我将不胜感激

以下是我的代码组件中的内容:

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

如果您想获取gamepad上左右触发器的最新值,可以使用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,以便在您希望接受gamepad触发器状态作为响应时有意义。例如,如果要在按下任一触发器超过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'] 

我怀疑gamePadState包含的不仅仅是与按下的按钮对应的字符串,因此您的“IfAnyState in…”检查将始终失败。你能告诉我们“打印(任何状态);打印(类型(任何状态))”的结果是什么吗?索尔,它正在工作!现在我需要做的就是让它做我实验中需要的事情。我希望gamepad响应被限制在从第168帧开始并持续48帧的窗口内。我还想通过将响应与$correctAns进行比较来记录RT和响应是否正确。我还需要通过RT的并行端口(地址0xDF00)发送ttl信号,如果响应正确,则发送“5”,如果响应不正确,则发送“10”。一旦这些问题解决了,我就准备走了。