Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Supported by

[solved] (EEG) Sending trigger after trigger

edited September 2014 in OpenSesame

I was wondering if there would be a way to set up an experiment in which an EEG trigger could be sent whenever a certain key is pressed. I understand that opensesame would not log all of the keypresses (if in 1 sequence?) but i would wish for a trigger to be sent whenever a key is pressed.

So, currently i only have 1 keyboard response in a sequence, but i would wish to let's say send a '3' trigger whenever the letter A is pressed. I would wish for this to be done for an unlimited number of times. So, a participant could press A, 6 times within a sequence, and the EEG would receive 3 3 3 3 3 3. Is this possible without having time constraints for a response and without having 100's of keyboard responses in a sequence? currently i have 1 keyboard response item and then some python saying something like --> IF exp.get('response_keyboard_response') =='A': then send trigger 3. This would send one trigger, but not many.

Any thoughts?

Many thanks

Comments

  • edited 9:49AM

    Hi Joshua,

    If understand correctly, you want to continuously monitor the keyboard, and send a trigger whenever a certain key is pressed, at any time during the trial?

    Basically, you cannot do this with keyboard_responses, at least not, as you say, without having loads of them and having a very complicated experimental structure. You will probably be better off implementing your trial through an inline_script that continuously polls for key presses.

    If you have specific questions about how to do this, don't hesitate to ask. There are quite a few related discussions on the forum (but not exactly the same), for example this one:

    Good luck!

    Cheers,
    Sebastiaan

  • edited 9:49AM

    Hi Sebastiaan,

    That's exactly right. I will have a gander at the code you suggested in the link

  • edited August 2014

    Hi Sebastian, ive had a look at the link and im starting to make sense of it. Im wanting to drive my stimuli with a normal item structure, but just continuously monitor the keyboard in an inline script. Could you please comment on the below code? many thanks. Also would i insert this inline script before a loop or would it have to be in the loop of my trial sequence?

    from openexp.keyboard import keyboard
    
    my_keyboard = keyboard(self.experiment, keylist=["1","2","3","4"], timeout=0)
    
    
    l=[]
    
    while True:
        resp, time = my_keyboard.get_key()
        if resp =='1':
            global io
            trigger = 201
            port = 0x1030
            try:
                io.DlPortWritePortUchar(port, trigger)
            except:
                print 'Failed to send trigger!'
    
        if resp =='2':
            global io
            trigger = 202
            port = 0x1030
            try:
                io.DlPortWritePortUchar(port, trigger)
            except:
                print 'Failed to send trigger!'
    
        if resp =='3':
            global io
            trigger = 203
            port = 0x1030
            try:
                io.DlPortWritePortUchar(port, trigger)
            except:
                print 'Failed to send trigger!'
    
        if resp =='4':
            global io
            trigger = 204
            port = 0x1030
            try:
                io.DlPortWritePortUchar(port, trigger)
            except:
                print 'Failed to send trigger!'
    
        if resp =='':
            print 'shouldnt do this'
    
    
    l = l[-100:]
    
  • edited 9:49AM

    ignore the last conditional statement. Any thoughts on this? Many thanks

  • edited 9:49AM

    Hi Joshua,

    Well, one thing that is clearly wrong with this script is that the while loop will never ever break. So once the while loop starts, OpenSesame will freeze until you forcefully close the program, which is probably not what you want. Instead, you will probably want to break the loop after a given duration. For example, something like this:

    # Loop for 1000 ms
    start_time = self.time()
    duration = 1000
    while self.time() - start_time < duration
        # Do something
        pass
    

    Do you see the logic here?

    Secondly, there's a lot of redundancy in the code that--while not strictly incorrect--kind of suggests that you don't fully understand what is going on. ;) For example, this ...

    if resp =='1':
        global io
        trigger = 201
        port = 0x1030
        try:
            io.DlPortWritePortUchar(port, trigger)
        except:
            print 'Failed to send trigger!'
    
    if resp =='2':
        global io
        trigger = 202
        port = 0x1030
        try:
            io.DlPortWritePortUchar(port, trigger)
        except:
            print 'Failed to send trigger!'
    

    ... is equivalent to this ...

    global io
    port = 0x1030
    if resp =='1':  
        trigger = 201
    elif resp =='2':
        trigger = 202
    try:
        io.DlPortWritePortUchar(port, trigger)
    except:
        print 'Failed to send trigger!'
    

    See? Only the trigger depends on the response, so there's no need to duplicate whole chunks of code.

    So I would first make sure that the while loop stops when you want it to stop (for example after a specific duration), and then clean up the code so that there's no unnecessary duplication. After that you will have a nice runnable script that you can test and debug further.

    And don't forget:

    Cheers!
    Sebastiaan

  • edited 9:49AM

    Thanks for this Sebastiaan! I've managed to get it working before your response. I ended up closing the while loop and basically ended up driving the stimuli through the same inline script. Thanks for your advice :)

Sign In or Register to comment.