| Reference | Downloads | Github

How to get a cedrus response to work with pyxid?

Dear discourse community,

I’m writing an n-back paradigm and I would like to program a cedrus response box for participants to press if the word is semantically related and another button if the word is semantically unrelated. I am having trouble working with pyxid and getting the response box to be recognised in my script (although it seems to work in the shell). Further, I am a little unsure on how to write code for the response box to await for key presses. Please see below for full code:

from numpy.random import choice
from psychopy import core, visual, gui, data, event, parallel
from collections import defaultdict
from import fromFile, toFile
import numpy as np
import win32api
import pyxid

#get a list of all attached xid devices
devices = pyxid.get_xid_devices()

#Particiapnts information GUI
info = {'Participant':'','ExpVersion': 1.1,
        'Group': ['Pilot']}
OKGO = 0 
while OKGO == 0:
    dictDlg = gui.DlgFromDict(dictionary=info,
            title='Prospective memory - on going', fixed=['ExpVersion'])
    if len(info['Participant']) == 0:
        print "did not enter participant number"
        win32api.MessageBox(0,'You did not enter the participant number','Error')
        OKGO = 1
if dictDlg.OK:
    print('User Cancelled')

myWin = visual.Window([800,600],allowGUI=True, monitor='laptop', units='deg')

# fixation cross
myFix = visual.ShapeStim(myWin, 
    vertices=((0, -0.5), (0, 0.5), (0,0), (-0.5,0), (0.5, 0)),

number_of_elements = 10

words = open('D:/PhD/Paradigms/Prospective memory/test_word_list.txt').read().split()

def default_probs():
    f = np.ones(len(categories))
    return f/f.sum()

 def update_probs(category):
     f = np.ones(len(categories)) * number_of_elements
     f[category] += nrep
     return f/f.sum()

 def get_nrep(categories, prob=0.70):
    n_reps = (len(categories) - 1.0)/(1-prob) - (len(categories) - 1.0)
    return int(round(n_reps))

 word_presentation = visual.TextStim(myWin, pos=[0,0],text=u'')

categories = defaultdict(list)
for i, word in enumerate(words):

category_labels = categories.keys()
nrep = get_nrep(categories, prob=0.70)
prob = default_probs()

max_iterations = 25
prob = default_probs()
hold_category = -1
category_repeated = -1
for iteration in xrange(max_iterations):
    print('Iterations is %d' % iteration)
    print('Prob is %s' % str(prob))
    category = choice(category_labels, p=prob)
    print 'category is:'
    print category

    if category == hold_category:
        category_repeated = 99
    hold_category = category
    words_in_category = categories[category]

    sampled_word = choice(words_in_category)

    word_presentation.text = sampled_word
    if category_repeated == 99:
        print "Category has repeated!"

    dev = devices[0]
    if dev.is_response_device():
        while True:
            if dev.response_queue_size() > 0:
                response = dev.get_next_response()
                print "it worked"
    prob = update_probs(category)
    category_repeated = -1

    print('Category is "%s". Word is "%s"' % (category, sampled_word))
    for thisKey in allKeys:
        if thisKey in ['q', 'escape']:
            core.quit() #abort experiment
            print 'Escape key has been pressed' 

Thank you in advance for any help/advice


Just an update for this problem. It turns out that this is a problem with the response box and the drivers for windows 8 and above.

One of our own users @cbrnr recently raised an issue on the pyxid repository that sounds like the issue you’re having?

He suggests that some recent changes they made have broken the pyxid lib. I’m currently rebuilding PsychoPy Standalone to use the version of pyxid that he found to work

1 Like