def __init__(self, lpttype='USB2LPT', portaddr=None, verbose=True): self.evefile = None self.lpttype = lpttype self.verbose = verbose if self.lpttype in ['USB2LPT', 'DESKTOP']: if self.lpttype == 'USB2LPT': if ctypes.sizeof(ctypes.c_voidp) == 4: dllname = 'LptControl_USB2LPT32.dll' # 32 bit else: dllname = 'LptControl_USB2LPT64.dll' # 64 bit if portaddr not in [0x278, 0x378]: self.print('Warning: LPT port address %d is unusual.' % portaddr) elif self.lpttype == 'DESKTOP': if ctypes.sizeof(ctypes.c_voidp) == 4: dllname = 'LptControl_Desktop32.dll' # 32 bit else: dllname = 'LptControl_Desktop64.dll' # 64 bit if portaddr not in [0x278, 0x378]: self.print('Warning: LPT port address %d is unusual.' % portaddr) self.portaddr = portaddr search = [] search.append(os.path.dirname(__file__) + '/' + dllname) search.append(os.path.dirname(__file__) + '/libs/' + dllname) search.append(os.getcwd() + '/' + dllname) search.append(os.getcwd() + '/libs/' + dllname) for f in search: if os.path.exists(f): dllpath = f break else: self.print('ERROR: Cannot find the required library %s' % dllname) raise RuntimeError self.print('Loading %s' % dllpath) self.lpt = ctypes.cdll.LoadLibrary(dllpath) elif self.lpttype == 'ARDUINO': import serial, serial.tools.list_ports BAUD_RATE = 115200 # portaddr should be None or in the form of 'COM1', 'COM2', etc. if portaddr is None: arduinos = [x for x in serial.tools.list_ports.grep('Arduino')] if len(arduinos) == 0: print('No Arduino found. Stop.') sys.exit() for i, a in enumerate(arduinos): print('Found', a[0]) try: com_port = arduinos[0].device except AttributeError: # depends on Python distribution com_port = arduinos[0][0] else: com_port = portaddr self.ser = serial.Serial(com_port, BAUD_RATE) time.sleep(1) # doesn't work without this delay. why? print('Connected to %s.' % com_port) elif self.lpttype == 'SOFTWARE': from pycnbi.stream_receiver.stream_receiver import StreamReceiver self.print('Using software trigger') # get data file location LSL_SERVER = 'StreamRecorderInfo' inlet = cnbi_lsl.start_client(LSL_SERVER) fname = inlet.info().source_id() if fname[-4:] != '.pcl': self.print('ERROR: Received wrong record file name format %s' % fname) sys.exit(-1) evefile = fname[:-8] + '-eve.txt' eveoffset_file = fname[:-8] + '-eve-offset.txt' self.print('Event file is: %s' % evefile) self.evefile = open(evefile, 'a') # check server LSL time server integrity self.print( "Checking LSL server's timestamp integrity for logging software triggers." ) amp_name, amp_serial = pu.search_lsl() sr = StreamReceiver(window_size=1, buffer_size=1, amp_serial=amp_serial, eeg_only=False, amp_name=amp_name) local_time = pylsl.local_clock() server_time = sr.get_window_list()[1][-1] lsl_time_offset = local_time - server_time with open(eveoffset_file, 'a') as f: f.write('Local time: %.6f, Server time: %.6f, Offset: %.6f\n' % (local_time, server_time, lsl_time_offset)) self.print('LSL timestamp offset (%.3f) saved to %s' % (lsl_time_offset, eveoffset_file)) elif self.lpttype == 'FAKE' or self.lpttype is None or self.lpttype is False: self.print('WARNING: Using a fake trigger.') self.lpttype = 'FAKE' self.lpt = None else: self.print('ERROR: Unknown LPT port type %s' % lpttype) sys.exit(-1)
def __init__(self, lpttype='USB2LPT', portaddr=None, verbose=False): self.evefile = None self.lpttype = lpttype self.verbose = verbose if self.lpttype in ['USB2LPT', 'DESKTOP']: if self.lpttype == 'USB2LPT': if ctypes.sizeof(ctypes.c_voidp) == 4: dllname = 'LptControl_USB2LPT32.dll' # 32 bit else: dllname = 'LptControl_USB2LPT64.dll' # 64 bit if portaddr not in [0x278, 0x378]: self.print('Warning: LPT port address %d is unusual.' % portaddr) elif self.lpttype == 'DESKTOP': if ctypes.sizeof(ctypes.c_voidp) == 4: dllname = 'LptControl_Desktop32.dll' # 32 bit else: dllname = 'LptControl_Desktop64.dll' # 64 bit if portaddr not in [0x278, 0x378]: self.print('Warning: LPT port address %d is unusual.' % portaddr) self.portaddr = portaddr search = [] search.append(os.path.dirname(__file__) + '/' + dllname) search.append(os.path.dirname(__file__) + '/libs/' + dllname) search.append(os.getcwd() + '/' + dllname) search.append(os.getcwd() + '/libs/' + dllname) for f in search: if os.path.exists(f): dllpath = f break else: self.print('ERROR: Cannot find the required library %s' % dllname) raise RuntimeError self.print('Loading %s' % dllpath) self.lpt = ctypes.cdll.LoadLibrary(dllpath) elif self.lpttype == 'ARDUINO': import serial, serial.tools.list_ports BAUD_RATE = 115200 # portaddr should be None or in the form of 'COM1', 'COM2', etc. if portaddr is None: arduinos = [x for x in serial.tools.list_ports.grep('Arduino')] if len(arduinos) == 0: print('No Arduino found. Stop.') sys.exit() for i, a in enumerate(arduinos): print('Found %s' % a) com_port = arduinos[0].device else: com_port = portaddr self.ser = serial.Serial(com_port, BAUD_RATE) time.sleep(1) # doesn't work without this delay. why? print('Connected to %s.' % com_port) if com_port[:3] != 'COM': self.print('Warning: COM port %d is unusual.' % portaddr) elif self.lpttype == 'SOFTWARE': self.print('Using software trigger') # get data file location LSL_SERVER = 'StreamRecorderInfo' inlet = cnbi_lsl.start_client(LSL_SERVER) fname = inlet.info().source_id() if fname[-4:] != '.pcl': self.print('ERROR: Received wrong record file name format %s' % fname) sys.exit(-1) evefile = fname[:-8] + '-eve.txt' self.print('Event file is: %s' % evefile) self.evefile = open(evefile, 'a') # unbuffered writing elif self.lpttype == 'FAKE' or self.lpttype is None or self.lpttype is False: self.print('WARNING: Using a fake trigger.') self.lpttype = 'FAKE' self.lpt = None else: self.print('ERROR: Unknown LPT port type %s' % lpttype) sys.exit(-1)
from __future__ import print_function, division import pycnbi import pycnbi.utils.cnbi_lsl as cnbi_lsl import time LSL_SERVER = 'RexController' print('Connecting to %s server' % LSL_SERVER) inlet = cnbi_lsl.start_client(LSL_SERVER) while True: # pull_chunk if 0: data, ts = inlet.pull_chunk() if len(data) > 0: print('Recevied data', data) else: print('.', end='') time.sleep(0.1) # pull_sample if 1: data, ts = inlet.pull_sample() print('Recevied data type', type(data), 'value', data)