2014-09-12 150 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