示例#1
0
def main():
    BoardShim.enable_dev_board_logger ()
    # use synthetic board for demo
    params = BrainFlowInputParams ()
    board = BoardShim (BoardIds.SYNTHETIC_BOARD.value, params)
    board.prepare_session ()
    board.start_stream ()
    time.sleep (10)
    data = board.get_board_data ()
    board.stop_stream ()
    board.release_session ()

    eeg_channels = BoardShim.get_eeg_channels (BoardIds.SYNTHETIC_BOARD.value)
    eeg_data = data[eeg_channels, :]
    eeg_data = eeg_data / 1000000 # BrainFlow returns uV, convert to V for MNE

    # Creating MNE objects from brainflow data arrays
    ch_types = ['eeg'] * len (eeg_channels)
    ch_names = BoardShim.get_eeg_names (BoardIds.SYNTHETIC_BOARD.value)
    sfreq = BoardShim.get_sampling_rate (BoardIds.SYNTHETIC_BOARD.value)
    info = mne.create_info (ch_names = ch_names, sfreq = sfreq, ch_types = ch_types)
    raw = mne.io.RawArray (eeg_data, info)
    # its time to plot something!
    raw.plot_psd (average = True)
    plt.savefig ('psd.png')
示例#2
0
    def __init__(
        self,
        board_name: str,
        serial_port: str = "",
        mac_address: str = "",
        ip_address: str = "",
        ip_port: int = 0,
        ip_protocol: int = 0,
        other_info: str = "",
        timeout: int = 0,
        serial_number: str = "",
        board_file: str = "",
    ):

        self.board_name = board_name
        if not valid_boardname(board_name):
            raise BoardException(
                f"Invalid board name in config: {self.board_name}")
        else:
            self.board_id = BoardIds[self.board_name].value
        # Get and set vars with basic info about the board:
        self.sample_rate = BoardShim.get_sampling_rate(self.board_id)
        try:
            self.channel_names = BoardShim.get_eeg_names(self.board_id)
        except Exception:
            self.channel_names = []
        self.channel_count = len(BoardShim.get_eeg_channels(self.board_id))
        # Prepare the board params object:
        self.params = BrainFlowInputParams()
        # Load params into the object from init function args:
        self.params.serial_port = serial_port
        self.params.mac_address = mac_address
        self.params.ip_address = ip_address
        self.params.ip_port = ip_port
        self.params.ip_protocol = ip_protocol
        self.params.other_info = other_info
        self.params.timeout = timeout
        self.params.serial_number = serial_number
        self.params.file = board_file

        # Construct the board object:
        try:
            self.board = BoardShim(self.board_id, self.params)
        except Exception as e:
            raise BoardException(
                f"Failed to instantiate board object for {self.board_name}" +
                str(e))
        # Initial values:
        self.is_ready = False
        self.is_recording = False
        # Self-check via our 'ping' function:
        self.ping()
示例#3
0
def get_eeg_channels(board_id):
    eeg_channels = BoardShim.get_eeg_channels(board_id)
    # optional: filter some channels we dont want to consider
    try:
        eeg_names = BoardShim.get_eeg_names(board_id)
        selected_channels = list()
        # blacklisted_channels = {'O1', 'O2'}
        blacklisted_channels = set()
        for i, channel in enumerate(eeg_names):
            if not channel in blacklisted_channels:
                selected_channels.append(eeg_channels[i])
        eeg_channels = selected_channels
    except Exception as e:
        print(str(e))
    print('channels to use: %s' % str(eeg_channels))
    return eeg_channels
示例#4
0
def main():
    '''
    Connect to the Brainstorm
    '''
    # Authentication
    username = '******'
    password = ''

    ## Set Connection Details
    # brainstorm = brainsatplay.Brainstorm('https://localhost') # Local
    brainstorm = brainsatplay.Brainstorm()  # Deployed Server

    ## Connect
    res = brainstorm.connect(username,
                             password)  # All optional (defaults to guest)
    '''
    Subscribe to a Particular Game
    '''
    # # Connection Settings
    # appname = 'brainstorm'
    # devices = []
    # props = ['raw','times','sps','deviceType','format','eegChannelTags']
    # sessionid = None
    # spectating = False # Spectate to view data without sending it

    # res = brainstorm.getSessions(appname)

    # if res['msg'] != 'appNotFound':
    #     sessionid = res['sessions'][0]['id']
    # else:
    #     res = brainstorm.createSession(appname, devices, props)
    #     sessionid = res['sessionInfo']['id']

    # # Handle Data from Subscribed Games
    #     def newData(json):
    #         for user in json['userData']:
    #             name = user['username']
    #             print('Data for {}'.format(name))
    # res = brainstorm.subscribeToSession(sessionid,spectating, newData)
    '''
    Stream your Data
    '''

    # Setup Brainflow
    params = BrainFlowInputParams()
    board_id = BoardIds['SYNTHETIC_BOARD'].value
    board = BoardShim(board_id, params)
    board.rate = BoardShim.get_sampling_rate(board_id)
    board.channels = BoardShim.get_eeg_channels(board_id)
    board.time_channel = BoardShim.get_timestamp_channel(board_id)
    board.eeg_channels = BoardShim.get_eeg_channels(board_id)
    board.eeg_names = BoardShim.get_eeg_names(board_id)
    board.prepare_session()
    board.start_stream(num_samples=450000)

    # Handle CTRL-C Exit
    def onStop():
        board.stop_stream()
        board.release_session()

    loopCount = 0

    # Start Stream Loop
    def streamLoop():
        pass_data = []
        rate = DataFilter.get_nearest_power_of_two(board.rate)
        data = board.get_board_data()
        t = data[board.time_channel]

        data = data[board.eeg_channels]

        for entry in data:
            pass_data.append((entry).tolist())

        data = {}
        data['raw'] = pass_data
        data['times'] = t.tolist()

        # Send Metadata on First Loop
        if loopCount == 0:
            data['sps'] = board.rate
            data['deviceType'] = 'eeg'
            data['format'] = 'brainflow'
            tags = []
            for i, channel in enumerate(board.eeg_channels):
                tags.append({
                    'ch': channel - 1,
                    'tag': board.eeg_names[i],
                    'analyze': True
                })

            data['eegChannelTags'] = tags

        return data

    res = brainstorm.startStream(streamLoop, onStop)
示例#5
0
markers_filename = "data/" + session_id + ".json"
data_filename = "data/" + session_id + ".raw"

all_data = []
with open(data_filename, "rb") as f:
    while True:
        block = f.read(8 * CNT_CHANNELS)
        if not block:
            break
        all_data.append(struct.unpack("<" + "d" * CNT_CHANNELS, block))
all_data = np.array(list(zip(*all_data)))

all_data /= 1000000  # uV to V

ch_types = ["eeg"] * CNT_CHANNELS
ch_names = BoardShim.get_eeg_names(BoardIds.SYNTHETIC_BOARD)[:CNT_CHANNELS]
sfreq = BoardShim.get_sampling_rate(BoardIds.SYNTHETIC_BOARD)

info = mne.create_info(ch_names=ch_names, sfreq=sfreq, ch_types=ch_types)
raw = mne.io.RawArray(all_data, info)

onset = []
duration = []
description = []
with open(markers_filename) as f:
    prev_marker = None
    for marker in json.loads(f.read()):
        onset.append(marker["start"] / sfreq)
        duration.append((marker["end"] - marker["start"]) / sfreq)
        description.append(marker["key"])
示例#6
0
class OpenBCIInterface:
    def __init__(self,
                 serial_port='COM5',
                 board_id=0,
                 log='store_true',
                 streamer_params='',
                 ring_buffer_size=45000):  # default board_id 2 for Cyton
        params = BrainFlowInputParams()
        params.serial_port = serial_port
        params.ip_port = 0
        params.mac_address = ''
        params.other_info = ''
        params.serial_number = ''
        params.ip_address = ''
        params.ip_protocol = 0
        params.timeout = 0
        params.file = ''
        self.streamer_params = streamer_params
        self.ring_buffer_size = ring_buffer_size
        self.board_id = board_id
        self.info_eeg = None
        self.info_aux = None
        self.outlet_eeg = None
        self.outlet_aux = None

        if (log):
            BoardShim.enable_dev_board_logger()
        else:
            BoardShim.disable_board_logger()

        self.board = BoardShim(board_id, params)

    def start_sensor(self):
        # tell the sensor to start sending frames
        self.board.prepare_session()
        print('OpenBCIInterface: connected to sensor')
        print(self.board.get_board_id())

        try:
            self.board.start_stream(self.ring_buffer_size,
                                    self.streamer_params)
            self.infor_test()
        except brainflow.board_shim.BrainFlowError:
            print('OpenBCIInterface: Board is not ready.')

    def process_frames(self):
        # return one or more frames of the sensor
        frames = self.board.get_board_data()
        return frames

    def stop_sensor(self):
        try:
            self.board.stop_stream()
            print('OpenBCIInterface: stopped streaming.')
            self.board.release_session()
            print('OpenBCIInterface: released session.')
        except brainflow.board_shim.BrainFlowError as e:
            print(e)

    def create_lsl(self,
                   name='OpenBCI_Cyton_8',
                   type='EEG',
                   channel_count=8,
                   nominal_srate=250.0,
                   channel_format='float32',
                   source_id='Cyton_0'):

        self.info_eeg = StreamInfo(name=name,
                                   type=type,
                                   channel_count=channel_count,
                                   nominal_srate=nominal_srate,
                                   channel_format=channel_format,
                                   source_id='')

        chns = self.info_eeg.desc().append_child('channels')

        self.labels = ['Fp1', 'Fp2', 'C3', 'C4', 'T5', 'T6', 'O1', 'O2']

        for label in self.labels:
            ch = chns.append_child("channel")
            ch.append_child_value('label', label)
            ch.append_child_value('unit', 'microvolts')
            ch.append_child_value('type', 'EEG')

        self.info_eeg.desc().append_child_value('manufacturer', 'OpenBCI Inc.')
        self.outlet_eeg = StreamOutlet(self.info_eeg)

        print("--------------------------------------\n" + \
              "LSL Configuration: \n" + \
              "  Stream 1: \n" + \
              "      Name: " + name + " \n" + \
              "      Type: " + type + " \n" + \
              "      Channel Count: " + str(channel_count) + "\n" + \
              "      Sampling Rate: " + str(nominal_srate) + "\n" + \
              "      Channel Format: " + channel_format + " \n" + \
              "      Source Id: " + source_id + " \n")

    def push_sample(self, samples):
        self.outlet_eeg.push_sample(samples)

    def infor_test(self):
        print(self.board.get_eeg_names(self.board_id))
        print(self.board.get_sampling_rate(self.board_id))
        print(self.board.get_board_id())
        print(self.board.get_package_num_channel(self.board_id))
        print(self.board.get_timestamp_channel(self.board_id))
        print(self.board.get_eeg_channels(self.board_id))
        print(self.board.get_accel_channels(self.board_id))
        print(self.board.get_marker_channel(self.board_id))
        print(self.board.get_other_channels(self.board_id))
        print(self.board.get_analog_channels(self.board_id))
        print(self.board.get_other_channels(self.board_id))
示例#7
0
class OpenBCILSLInterface:

    def __init__(self, stream_name='OpenBCI_Cyton_8', stream_type='EEG', serial_port='COM5', board_id="0",
                 log='store_true', streamer_params='',
                 ring_buffer_size=45000):  # default board_id 2 for Cyton
        self.params = BrainFlowInputParams()
        self.params.serial_port = serial_port
        self.params.ip_port = 0
        self.params.mac_address = ''
        self.params.other_info = ''
        self.params.serial_number = ''
        self.params.ip_address = ''
        self.params.ip_protocol = 0
        self.params.timeout = 0
        self.params.file = ''

        self.stream_name = stream_name
        self.stream_type = stream_type
        self.board_id = int(board_id)
        self.streamer_params = streamer_params
        self.ring_buffer_size = ring_buffer_size

        if (log):
            BoardShim.enable_dev_board_logger()
        else:
            BoardShim.disable_board_logger()

        try:
            self.board = BoardShim(self.board_id, self.params)
            self.info_print()

        except brainflow.board_shim.BrainFlowError:
            print('Cannot connect to board')

    def start_sensor(self):
        # tell the sensor to start sending frames
        try:
            self.board.prepare_session()
        except brainflow.board_shim.BrainFlowError:
            raise AssertionError('Unable to connect to device: please check the sensor connection or the COM port number in device preset.')
        print('OpenBCIInterface: connected to sensor')

        try:
            self.board.start_stream(self.ring_buffer_size, self.streamer_params)
        except brainflow.board_shim.BrainFlowError:
            raise AssertionError('Unable to connect to device: please check the sensor connection or the COM port number in device preset.')
        print('OpenBCIInterface: connected to sensor')

        self.create_lsl(name=self.stream_name,
                        type=self.stream_type,
                        nominal_srate=self.board.get_sampling_rate(self.board_id),
                        channel_format='float32',
                        source_id='Cyton_' + str(self.board_id))

    def process_frames(self):
        # return one or more frames of the sensor
        frames = self.board.get_board_data()

        for frame in frames.T:
            self.push_frame(frame)
        # TODO: fine push chunk error
        # frames = np.transpose(frames)
        # tesst = [[rand() for chan_ix in range(24)]
        #            for samp_ix in range(6)]
        # # frames = frames.astype('float32')
        # if frames.shape[0] > 0:
        #     self.push_frame(samples=frames)

        return frames

    def stop_sensor(self):
        try:
            self.board.stop_stream()
            print('OpenBCIInterface: stopped streaming.')
            self.board.release_session()
            print('OpenBCIInterface: released session.')
        except brainflow.board_shim.BrainFlowError as e:
            print(e)

    def create_lsl(self, name='OpenBCI_Cyton_8', type='EEG',
                   nominal_srate=250.0, channel_format='float32',
                   source_id='Cyton_0'):

        channel_count = self.board.get_num_rows(self.board_id)
        self.info_eeg = StreamInfo(name=name, type=type, channel_count=channel_count,
                                   nominal_srate=nominal_srate, channel_format=channel_format,
                                   source_id=source_id)

        # chns = self.info_eeg.desc().append_child('channels')
        #
        # self.labels = ['Fp1', 'Fp2', 'C3', 'C4', 'T5', 'T6', 'O1', 'O2']
        #
        # for label in self.labels:
        #     ch = chns.append_child("channel")
        #     ch.append_child_value('label', label)
        #     ch.append_child_value('unit', 'microvolts')
        #     ch.append_child_value('type', 'EEG')
        #
        # self.info_eeg.desc().append_child_value('manufacturer', 'OpenBCI Inc.')
        self.outlet_eeg = StreamOutlet(self.info_eeg)

        print("--------------------------------------\n" + \
              "LSL Configuration: \n" + \
              "  Stream 1: \n" + \
              "      Name: " + name + " \n" + \
              "      Type: " + type + " \n" + \
              "      Channel Count: " + str(channel_count) + "\n" + \
              "      Sampling Rate: " + str(nominal_srate) + "\n" + \
              "      Channel Format: " + channel_format + " \n" + \
              "      Source Id: " + source_id + " \n")

    def push_frame(self, samples):
        self.outlet_eeg.push_sample(samples)

    def info_print(self):
        print("Board Information:")
        print("Sampling Rate:", self.board.get_sampling_rate(self.board_id))
        print("Board Id:", self.board.get_board_id())
        print("EEG names:", self.board.get_eeg_names(self.board_id))
        print("Package Num Channel: ", self.board.get_package_num_channel(self.board_id))
        print("EEG Channels:", self.board.get_eeg_channels(self.board_id))
        print("Accel Channels: ", self.board.get_accel_channels(self.board_id))
        print("Other Channels:", self.board.get_other_channels(self.board_id))
        print("Analog Channels: ", self.board.get_analog_channels(self.board_id))
        print("TimeStamp: ", self.board.get_timestamp_channel(self.board_id))
        print("Marker Channel: ", self.board.get_marker_channel(self.board_id))