diff --git a/OpenBCI_GUI/BoardBrainFlowStreaming.pde b/OpenBCI_GUI/BoardBrainFlowStreaming.pde index 7545c5a91..fa4632e1b 100644 --- a/OpenBCI_GUI/BoardBrainFlowStreaming.pde +++ b/OpenBCI_GUI/BoardBrainFlowStreaming.pde @@ -26,8 +26,9 @@ public enum BrainFlowStreaming_Boards } } -class BoardBrainFlowStreaming extends BoardBrainFlow { +class BoardBrainFlowStreaming extends BoardBrainFlow implements AccelerometerCapableBoard { + private int[] accelChannelsCache = null; private BoardIds masterBoardId; private String ipAddress; private int ipPort; @@ -104,4 +105,42 @@ class BoardBrainFlowStreaming extends BoardBrainFlow { minSampleIndex, maxSampleIndex); } + @Override + public boolean isAccelerometerActive() { + return true; + } + + @Override + public void setAccelerometerActive(boolean active) { + outputWarn("Accelerometer is always active for Playback board"); + } + + @Override + public boolean canDeactivateAccelerometer() { + return false; + } + + @Override + public int[] getAccelerometerChannels() { + if (accelChannelsCache == null) { + try { + accelChannelsCache = BoardShim.get_accel_channels(getBoardIdInt()); + } catch (BrainFlowError e) { + e.printStackTrace(); + } + } + + return accelChannelsCache; + } + + @Override + public List getDataWithAccel(int maxSamples) { + return getData(maxSamples); + } + + @Override + public int getAccelSampleRate() { + return getSampleRate(); + } + }; diff --git a/OpenBCI_GUI/BoardBrainflowPlayback.pde b/OpenBCI_GUI/BoardBrainflowPlayback.pde new file mode 100644 index 000000000..2d2619fbc --- /dev/null +++ b/OpenBCI_GUI/BoardBrainflowPlayback.pde @@ -0,0 +1,143 @@ +import brainflow.*; + +import org.apache.commons.lang3.tuple.Pair; + +public enum BrainFlowPlaybackBoards +{ + CYTON("Cyton", BoardIds.CYTON_BOARD), + CYTONDAISY("CytonDaisy", BoardIds.CYTON_DAISY_BOARD), + GANGLION("Ganglion", BoardIds.GANGLION_BOARD), + SYNTHETIC("Synthetic", BoardIds.SYNTHETIC_BOARD); + + private String name; + private BoardIds boardId; + + BrainFlowPlaybackBoards(String _name, BoardIds _boardId) { + this.name = _name; + this.boardId = _boardId; + } + + public String getName() { + return name; + } + + public BoardIds getBoardId() { + return boardId; + } +} + +class BoardBrainFlowPlayback extends BoardBrainFlow implements AccelerometerCapableBoard { + + private int[] accelChannelsCache = null; + private BoardIds masterBoardId; + private String filePath; + + public BoardBrainFlowPlayback(BoardIds masterBoardId, String filePath) { + super(); + this.masterBoardId = masterBoardId; + this.filePath = filePath; + } + + // implement mandatory abstract functions + @Override + protected BrainFlowInputParams getParams() { + BrainFlowInputParams params = new BrainFlowInputParams(); + params.file = filePath; + params.master_board = masterBoardId.get_code(); + return params; + } + + // for playback board need to use master board id in function like get_eeg_channels + @Override + public BoardIds getBoardId() { + return masterBoardId; + } + + @Override + public boolean initializeInternal() { + try { + // here we need to provide board id of playback board + boardShim = new BoardShim (BoardIds.PLAYBACK_FILE_BOARD.get_code(), getParams()); + try { + BoardShim.enable_dev_board_logger(); + BoardShim.set_log_file(directoryManager.getConsoleDataPath() + "Brainflow_" + + directoryManager.getFileNameDateTime() + ".txt"); + } catch (BrainFlowError e) { + e.printStackTrace(); + } + boardShim.prepare_session(); + boardShim.config_board("loopback_true"); + return true; + } catch (Exception e) { + boardShim = null; + outputError("ERROR: " + e + " when initializing Brainflow board. Data will not stream."); + e.printStackTrace(); + return false; + } + } + + @Override + public void setEXGChannelActive(int channelIndex, boolean active) { + outputWarn("EXG is always active for Playback board"); + } + + @Override + public boolean isEXGChannelActive(int channelIndex) { + return true; + } + + @Override + protected void addChannelNamesInternal(String[] channelNames) { + // do nothing here + } + + @Override + protected PacketLossTracker setupPacketLossTracker() { + if (masterBoardId == BoardIds.CYTON_DAISY_BOARD) { + return new PacketLossTrackerCytonSerialDaisy(getSampleIndexChannel(), getTimestampChannel()); + } + final int minSampleIndex = 0; + final int maxSampleIndex = 255; + return new PacketLossTracker(getSampleIndexChannel(), getTimestampChannel(), + minSampleIndex, maxSampleIndex); + } + + @Override + public boolean isAccelerometerActive() { + return true; + } + + @Override + public void setAccelerometerActive(boolean active) { + outputWarn("Accelerometer is always active for Playback board"); + } + + @Override + public boolean canDeactivateAccelerometer() { + return false; + } + + @Override + public int[] getAccelerometerChannels() { + if (accelChannelsCache == null) { + try { + accelChannelsCache = BoardShim.get_accel_channels(getBoardIdInt()); + } catch (BrainFlowError e) { + e.printStackTrace(); + } + } + + return accelChannelsCache; + } + + @Override + public List getDataWithAccel(int maxSamples) { + return getData(maxSamples); + } + + @Override + public int getAccelSampleRate() { + return getSampleRate(); + } + +}; diff --git a/OpenBCI_GUI/OpenBCI_GUI.pde b/OpenBCI_GUI/OpenBCI_GUI.pde index 67c8d1c78..0e92bd950 100644 --- a/OpenBCI_GUI/OpenBCI_GUI.pde +++ b/OpenBCI_GUI/OpenBCI_GUI.pde @@ -97,6 +97,7 @@ final int DATASOURCE_GANGLION = 1; //looking for signal from OpenBCI board via final int DATASOURCE_PLAYBACKFILE = 2; //playback from a pre-recorded text file final int DATASOURCE_SYNTHETIC = 3; //Synthetically generated data final int DATASOURCE_STREAMING = 5; +final int DATASOURCE_BRAINFLOW_PLAYBACK = 6; public int eegDataSource = -1; //default to none of the options final static int NUM_ACCEL_DIMS = 3; @@ -625,6 +626,13 @@ void initSystem() { controlPanel.streamingBoardBox.getPort() ); println("OpenBCI_GUI: Init session using Streaming data source"); + case DATASOURCE_BRAINFLOW_PLAYBACK: + currentBoard = new BoardBrainFlowPlayback( + // todo get from UI + BoardIds.SYNTHETIC_BOARD, + "D:\\workspace\\brainflow\\python_package\\examples\\test.txt" + ); + println("OpenBCI_GUI: Init session using BrainFlow Playback data source"); default: break; }