2014-09-12 178 views
0

我在Windows中使用Builder独立的PsychoPy 1.80.07。我试图找出如何创建一个代码组件来接收来自Logitech F310游戏手柄的响应。理想情况下,我想只使用触发器。当我运行实验(这是Stroop键盘IO演示,IO键盘代码组件代码替换为下面的代码)时,我没有收到任何错误代码。它似乎运行良好,但它只是显示第一次审判,并等待主题响应,因为它认为它不听手柄。另外,我可以运行XInput Gamepad Coder Demo,一切正常。我是编码方面的新手,所以任何帮助指出我犯过错误的地方都会非常感谢!Psychopy IO游戏手柄

以下是我在我的代码组件:

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

我可疑的是,gamePadState不仅包含与按下按钮相对应的字符串,因此您的“如果anyState in ...”检查总是失败。你能让我们知道“print(anyState); print(type(anyState))”的结果是什么吗? – 2014-09-14 21:10:50

回答

1

如果你想在游戏手柄的左,右触发器的最新值,您可以直接与getTriggers读取这些值()并且根本不使用getEvents()。

getTriggers()将返回一个dict,其中包含iohub触发器的最后读取状态以及读取值的时间。

例如,假定“游戏手柄”是牵着你的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   

然后后面的代码中,你可以再次访问响应字典的值:

resp_time = response['time'] 
left_val, right_val = response['left_trigger'], response['right_trigger'] 
+0

溶胶,它工作!现在我只需要跳转到让我做我需要的实验。我希望游戏手柄响应仅限于从168帧开始的窗口,并持续到接下来的48帧。我也想通过比较对$ correctAns的响应来记录RT以及响应是否正确。如果响应正确,我也需要通过并行端口(地址0xDF00)发送一个ttl信号,如果响应正确,则发送“5”,如果不正确,则发送“10”。一旦这些问题得到解决,我会立即开始。 – SkepticalMat 2014-09-16 19:05:11