Code: Select all
is_production = True # True if hooked up to EEG machine, False if debugging locally
fix_cross_signal = 1
def get_arrow_signal(condition) -> int:
"""
Get the EEG stimuli value for the given condition
"""
match condition:
case '<<<<<': # left option 1
return 2
case '>><>>': # left option 2
return 3
case '>>>>>': # right option 1
return 4
case '<<><<': # right option 2
return 5
case _:
raise Exception(f"Unexpected condition: {condition}")
# there are 4 conditions, so the number of trials is 4n: num_conditions (4) * num_reps (n)
if is_production:
n_reps_prac = 2 # (2 * 4 = 8) for prod
n_reps_block = 60 # (60 * 4 = 240) for prod
import serial
port = serial.Serial('COM7', 115200)
else: # debug, no EEG hardware
# redefine these here to prevent accidental override in prod
n_reps_prac = 1 # (1 * 4 = 4) for debug
n_reps_block = 5 # (5 * 4 = 20) for debug
def trigger_eeg_stim(window: Window, component: TextStim, stimulus_pulse_started: bool, stimulus_pulse_ended: bool,
stimulus_pulse_start_time: Timestamp, global_clock: Clock, signal: int):
"""
Update/draw components on each frame
Send trigger to port, converting to bytes
Acceptable trigger values are 1-255 (integer values)
Does nothing if not production (using EEG)
"""
if is_production: # requires EEG hardware
if component.status == STARTED and not stimulus_pulse_started:
signal_bytes = str(signal).encode()
window.callOnFlip(port.write, signal_bytes)
stimulus_pulse_start_time = global_clock.getTime()
stimulus_pulse_started = True
# set port back to zero after 5 ms
if stimulus_pulse_started and not stimulus_pulse_ended:
if global_clock.getTime() - stimulus_pulse_start_time >= 0.005: #this allows port to be flushed and reset for next trig
window.callOnFlip(port.write, str.encode('0'))
stimulus_pulse_ended = True
return window, stimulus_pulse_started, stimulus_pulse_ended, stimulus_pulse_start_time