Skip to content

Commit

Permalink
add support for ganglion via native ble (#574)
Browse files Browse the repository at this point in the history
* add support for ganglion device without dongle

Signed-off-by: Andrey Parfenov <a1994ndrey@gmail.com>
  • Loading branch information
Andrey1994 committed Nov 3, 2022
1 parent c3e6d64 commit e811496
Show file tree
Hide file tree
Showing 580 changed files with 79,250 additions and 5,664 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/cppcheck.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
env:
DEBIAN_FRONTEND: noninteractive
- name: Run Cppcheck
run: cppcheck --std=c++11 -ithird_party/spdlog -ithird_party/libsvm -ithird_party/SimpleBLE -ithird_party/SimpleDBus -ithird_party/SimpleBluez --error-exitcode=1 --xml --xml-version=2 --force src cpp_package third_party 2>cppcheck_res.xml
run: cppcheck --std=c++11 -ithird_party/spdlog -ithird_party/libsvm -ithird_party/SimpleBLE -ithird_party/fmt -ithird_party/SimpleDBus -ithird_party/SimpleBluez --error-exitcode=1 --xml --xml-version=2 --force src cpp_package third_party 2>cppcheck_res.xml
- name: Generate Report
if: ${{ failure() }}
run: cppcheck-htmlreport --title=BrainFlow --file=cppcheck_res.xml --report-dir=report
Expand Down
21 changes: 12 additions & 9 deletions .github/workflows/deploy_cpp_libs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ jobs:
# need to build SimpleBLE outside from BrainFlow because they have different Windows System Versions
- name: Compile SimpleBLE ${{ matrix.build_type }} ${{ matrix.arch }} with MSVC runtime ${{ matrix.msvc_runtime }}
run: |
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\%BUILD%_%RUNTIME%_%ARCH%
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\%BUILD%_%RUNTIME%_%ARCH%
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\%BUILD%_%RUNTIME%_%ARCH%
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\%BUILD%_%RUNTIME%_%ARCH%
cmake -G "Visual Studio 16 2019" -A %ARCH% -DMSVC_RUNTIME=%RUNTIME% -DCMAKE_SYSTEM_VERSION=10.0.19041.0 -DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%\artifacts\%ARCH%_%BUILD%_%RUNTIME%\ ..
cmake --build . --target install --config %BUILD% -j 2 --parallel 2
shell: cmd
Expand All @@ -46,7 +46,7 @@ jobs:

# Start Deploy Stage
- name: Upload ${{ matrix.build_type }} ${{ matrix.arch }} with MSVC runtime ${{ matrix.msvc_runtime }}
uses: actions/upload-artifact@v1
uses: actions/upload-artifact@v2
with:
name: compiled_libs
path: artifacts
Expand All @@ -65,9 +65,9 @@ jobs:
- name: Clone Repository
uses: actions/checkout@v2
- name: Setup Cmake
uses: jwlawson/actions-setup-cmake@v1.4
uses: jwlawson/actions-setup-cmake@v1.13
with:
cmake-version: '3.16.x'
cmake-version: '3.21.x'
- name: Install Ninja
if: (matrix.os == 'macos-11.0')
uses: seanmiddleditch/gha-setup-ninja@master
Expand All @@ -77,11 +77,12 @@ jobs:
- name: Compile SimpleBLE MacOS
if: (matrix.os == 'macos-11.0')
run: |
mkdir $GITHUB_WORKSPACE/third_party/SimpleBLE/build
cd $GITHUB_WORKSPACE/third_party/SimpleBLE/build
mkdir $GITHUB_WORKSPACE/third_party/SimpleBLE/simpleble/build
cd $GITHUB_WORKSPACE/third_party/SimpleBLE/simpleble/build
cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/artifacts/macos_$BUILD -DCMAKE_BUILD_TYPE=$BUILD ..
ninja
ninja install
ls -l $GITHUB_WORKSPACE/artifacts/macos_$BUILD/
env:
BUILD: ${{ matrix.build_type }}
- name: Compile BrainFlow for MacOS
Expand All @@ -92,17 +93,19 @@ jobs:
cmake -G Ninja -DBUILD_BLUETOOTH=ON -DWARNINGS_AS_ERRORS=ON -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/artifacts/macos_$BUILD -DCMAKE_BUILD_TYPE=$BUILD ..
ninja
ninja install
ls -l $GITHUB_WORKSPACE/artifacts/macos_$BUILD/
env:
BUILD: ${{ matrix.build_type }}
- name: Compile BrainFlow in ManyLinux
if: (matrix.os == 'ubuntu-latest')
run: |
docker pull dockcross/manylinux2014-x64:20210708-94745ff
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -e BUILD=$BUILD -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE dockcross/manylinux2014-x64:20210708-94745ff /bin/bash -c "yum install -y bluez-libs-devel dbus-devel && /opt/python/cp36-cp36m/bin/pip3.6 install cmake==3.13.3 && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && cmake -DBUILD_BLE=ON -DBUILD_BLUETOOTH=ON -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/artifacts/linux_${BUILD} -DCMAKE_BUILD_TYPE=$BUILD .. && make && make install"
docker run -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -e BUILD=$BUILD -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE dockcross/manylinux2014-x64:20210708-94745ff /bin/bash -c "yum install -y bluez-libs-devel dbus-devel && /opt/python/cp36-cp36m/bin/pip3.6 install cmake==3.21.4 && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && /opt/_internal/cpython-3.6.14/bin/cmake -DBUILD_BLE=ON -DBUILD_BLUETOOTH=ON -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/artifacts/linux_${BUILD} -DCMAKE_BUILD_TYPE=$BUILD .. && make && make install"
env:
BUILD: ${{ matrix.build_type }}
- name: Upload Artifacts
uses: actions/upload-artifact@v1
uses: actions/upload-artifact@v2
with:
name: compiled_libs
path: artifacts
10 changes: 5 additions & 5 deletions .github/workflows/run_unix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ jobs:
with:
version: 1.3.1
- name: Setup Cmake
uses: jwlawson/actions-setup-cmake@v1.4
uses: jwlawson/actions-setup-cmake@v1.13
with:
cmake-version: '3.16.x'
cmake-version: '3.21.x'
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
Expand All @@ -54,8 +54,8 @@ jobs:
- name: Compile SimpleBLE MacOS
if: (matrix.os == 'macos-11.0')
run: |
mkdir $GITHUB_WORKSPACE/third_party/SimpleBLE/build
cd $GITHUB_WORKSPACE/third_party/SimpleBLE/build
mkdir $GITHUB_WORKSPACE/third_party/SimpleBLE/simpleble/build
cd $GITHUB_WORKSPACE/third_party/SimpleBLE/simpleble/build
cmake -G Ninja -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/installed -DCMAKE_BUILD_TYPE=Release ..
ninja
ninja install
Expand Down Expand Up @@ -84,7 +84,7 @@ jobs:
if: (matrix.os == 'ubuntu-latest')
run: |
docker pull dockcross/manylinux2014-x64:20210708-94745ff
docker run -e BRAINFLOW_VERSION=$BRAINFLOW_VERSION -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE dockcross/manylinux2014-x64:20210708-94745ff /bin/bash -c "yum install -y bluez-libs-devel dbus-devel && /opt/python/cp36-cp36m/bin/pip3.6 install cmake==3.13.3 && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && cmake -DBRAINFLOW_VERSION=$BRAINFLOW_VERSION -DBUILD_ONNX=ON -DBUILD_BLE=ON -DBUILD_BLUETOOTH=ON -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/installed_docker -DCMAKE_BUILD_TYPE=Release .. && make && make install"
docker run -e BRAINFLOW_VERSION=$BRAINFLOW_VERSION -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE -v $GITHUB_WORKSPACE:$GITHUB_WORKSPACE dockcross/manylinux2014-x64:20210708-94745ff /bin/bash -c "yum install -y bluez-libs-devel dbus-devel && /opt/python/cp36-cp36m/bin/pip3.6 install cmake==3.21.4 && cd $GITHUB_WORKSPACE && mkdir build_docker && cd build_docker && /opt/_internal/cpython-3.6.14/bin/cmake -DBRAINFLOW_VERSION=$BRAINFLOW_VERSION -DBUILD_ONNX=ON -DBUILD_BLE=ON -DBUILD_BLUETOOTH=ON -DCMAKE_INSTALL_PREFIX=$GITHUB_WORKSPACE/installed_docker -DCMAKE_BUILD_TYPE=Release .. && make && make install"
env:
BRAINFLOW_VERSION: ${{ steps.version.outputs.version }}
- name: Setup Python Package
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/run_windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,15 @@ jobs:
# need to build SimpleBLE outside from BrainFlow because they have different Windows System Versions
- name: Compile SimpleBLE x32
run: |
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\build32
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\build32
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\build32
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\build32
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_SYSTEM_VERSION=10.0.19041.0 -DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%\installed32\ ..
cmake --build . --target install --config Release -j 2 --parallel 2
shell: cmd
- name: Compile SimpleBLE x64
run: |
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\build64
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\build64
mkdir %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\build64
cd %GITHUB_WORKSPACE%\third_party\SimpleBLE\simpleble\build64
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0.19041.0 -DCMAKE_INSTALL_PREFIX=%GITHUB_WORKSPACE%\installed64\ ..
cmake --build . --target install --config Release -j 2 --parallel 2
shell: cmd
Expand Down
10 changes: 6 additions & 4 deletions cpp_package/examples/signal_processing/src/peaks_detection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,24 @@ int main (int argc, char *argv[])
int board_id = (int)BoardIds::SYNTHETIC_BOARD;
// use synthetic board for demo
BoardShim *board = new BoardShim (board_id, params);
double *peaks = NULL;

try
{
board->prepare_session ();
board->start_stream ();

#ifdef _WIN32
Sleep (5000);
Sleep (15000);
#else
sleep (5);
sleep (15);
#endif

board->stop_stream ();
BrainFlowArray<double, 2> data = board->get_board_data ();
board->release_session ();

double *peaks = new double[data.get_size (1)];
peaks = new double[data.get_size (1)];
std::vector<int> eeg_channels = BoardShim::get_eeg_channels (board_id);

for (int i = 0; i < eeg_channels.size (); i++)
Expand All @@ -51,7 +52,6 @@ int main (int argc, char *argv[])
peaks);
DataFilter::detect_peaks_z_score (peaks, data.get_size (1), 20, 3.5, 0.0, peaks);
}
delete[] peaks;
}
catch (const BrainFlowException &err)
{
Expand All @@ -63,6 +63,8 @@ int main (int argc, char *argv[])
}
}

if (peaks != NULL)
delete[] peaks;
delete board;

return res;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ public enum BoardIds
MUSE_2016_BLED_BOARD = 42,
PIEEG_BOARD = 43,
EXPLORE_4_CHAN_BOARD = 44,
EXPLORE_8_CHAN_BOARD = 45
EXPLORE_8_CHAN_BOARD = 45,
GANGLION_NATIVE_BOARD = 46
};


Expand Down
35 changes: 35 additions & 0 deletions docs/SupportedBoards.rst
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,41 @@ Supported platforms:
- MacOS
- Devices like Raspberry Pi

Ganglion Native
~~~~~~~~~~~~~~~~~

.. image:: https://live.staticflickr.com/65535/48288408326_7f078cd2eb.jpg
:width: 400px
:height: 230px

`Ganglion Getting Started Guide from OpenBCI <https://docs.openbci.com/GettingStarted/Boards/GanglionGS/>`_

Unlike Ganglion board this BrainFlow board does not use BLED112 dongle, so you need to have BLE support on your device in order to use it.

To create such board you need to specify the following board ID and fields of BrainFlowInputParams object:

- :code:`BoardIds.GANGLION_NATIVE_BOARD`
- *optoinal:* :code:`mac_address`, if not provided BrainFlow will try to autodiscover the device

Initialization Example:

.. code-block:: python
params = BrainFlowInputParams()
board = BoardShim(BoardIds.GANGLION_NATIVE_BOARD, params)
To get Ganglion's MAC address you can use:

- Windows: `Bluetooth LE Explorer App <https://www.microsoft.com/en-us/p/bluetooth-le-explorer/9n0ztkf1qd98?activetab=pivot:overviewtab>`_
- Linux: hcitool command

Supported platforms:

- Windows >= 8.1
- Linux
- MacOS
- Devices like Raspberry Pi

Cyton Daisy
~~~~~~~~~~~~

Expand Down
3 changes: 2 additions & 1 deletion java_package/brainflow/src/main/java/brainflow/BoardIds.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ public enum BoardIds
MUSE_2016_BLED_BOARD (42),
PIEEG_BOARD (43),
EXPLORE_4_CHAN_BOARD (44),
EXPLORE_8_CHAN_BOARD (45);
EXPLORE_8_CHAN_BOARD (45),
GANGLION_NATIVE_BOARD (46);

private final int board_id;
private static final Map<Integer, BoardIds> bi_map = new HashMap<Integer, BoardIds> ();
Expand Down
1 change: 1 addition & 0 deletions julia_package/brainflow/src/board_shim.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export BrainFlowInputParams
PIEEG_BOARD = 43
EXPLORE_4_CHAN_BOARD = 44
EXPLORE_8_CHAN_BOARD = 45
GANGLION_NATIVE_BOARD = 46

end

Expand Down
13 changes: 7 additions & 6 deletions matlab_package/brainflow/BoardIds.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,12 @@
ENOPHONE_BOARD(37)
MUSE_2_BOARD(38)
MUSE_S_BOARD(39)
BRAINALIVE_BOARD (40)
MUSE_2016_BOARD (41)
MUSE_2016_BLED_BOARD (42)
PIEEG_BOARD (43)
EXPLORE_4_CHAN_BOARD (44)
EXPLORE_8_CHAN_BOARD (45)
BRAINALIVE_BOARD(40)
MUSE_2016_BOARD(41)
MUSE_2016_BLED_BOARD(42)
PIEEG_BOARD(43)
EXPLORE_4_CHAN_BOARD(44)
EXPLORE_8_CHAN_BOARD(45)
GANGLION_NATIVE_BOARD(46)
end
end
1 change: 1 addition & 0 deletions python_package/brainflow/board_shim.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class BoardIds(enum.IntEnum):
PIEEG_BOARD = 43 #:
EXPLORE_4_CHAN_BOARD = 44 #:
EXPLORE_8_CHAN_BOARD = 45 #:
GANGLION_NATIVE_BOARD = 46 #:


class IpProtocolTypes(enum.IntEnum):
Expand Down
15 changes: 3 additions & 12 deletions python_package/examples/tests/ganglion_resist.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
import argparse
import time

from brainflow.board_shim import BoardShim, BrainFlowInputParams, BoardIds


def main():
parser = argparse.ArgumentParser()
parser.add_argument('--serial-port', type=str, help='serial port', required=True)
parser.add_argument('--mac-address', type=str, help='mac address', required=False, default='')
args = parser.parse_args()

BoardShim.enable_dev_board_logger()

params = BrainFlowInputParams()
params.serial_port = args.serial_port;
params.mac_address = args.mac_address;
board = BoardShim(BoardIds.GANGLION_BOARD.value, params)
board = BoardShim(BoardIds.GANGLION_NATIVE_BOARD.value, params)
board.prepare_session()

# expected result: 5 seconds of resistance data(unknown sampling rate) after that 5 seconds of exg data
board.config_board('z')
board.start_stream(45000, 'file://raw_data.csv:w')
board.start_stream(45000, f'file://raw_data.csv:w')
time.sleep(5)
board.config_board('Z')
time.sleep(5)
Expand All @@ -30,7 +21,7 @@ def main():

print(data)

resistance_channels = BoardShim.get_resistance_channels(BoardIds.GANGLION_BOARD.value)
resistance_channels = BoardShim.get_resistance_channels(BoardIds.GANGLION_NATIVE_BOARD.value)
print(resistance_channels)


Expand Down
3 changes: 2 additions & 1 deletion rust_package/brainflow/src/ffi/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ impl BoardIds {
pub const FIRST: BoardIds = BoardIds::PlaybackFileBoard;
}
impl BoardIds {
pub const LAST: BoardIds = BoardIds::Explore8ChanBoard;
pub const LAST: BoardIds = BoardIds::GanglionNativeBoard;
}
#[repr(i32)]
#[derive(FromPrimitive, ToPrimitive, Debug, Copy, Clone, Hash, PartialEq, Eq)]
Expand Down Expand Up @@ -86,6 +86,7 @@ pub enum BoardIds {
PieegBoard = 43,
Explore4ChanBoard = 44,
Explore8ChanBoard = 45,
GanglionNativeBoard = 46,
}
#[repr(i32)]
#[derive(FromPrimitive, ToPrimitive, Debug, Copy, Clone, Hash, PartialEq, Eq)]
Expand Down
4 changes: 4 additions & 0 deletions src/board_controller/board_controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include "galea.h"
#include "galea_serial.h"
#include "ganglion.h"
#include "ganglion_native.h"
#include "ganglion_wifi.h"
#include "gforce_dual.h"
#include "gforce_pro.h"
Expand Down Expand Up @@ -248,6 +249,9 @@ int prepare_session (int board_id, const char *json_brainflow_input_params)
case BoardIds::EXPLORE_8_CHAN_BOARD:
board = std::shared_ptr<Board> (new Explore (board_id, params));
break;
case BoardIds::GANGLION_NATIVE_BOARD:
board = std::shared_ptr<Board> (new GanglionNative (params));
break;
default:
return (int)BrainFlowExitCodes::UNSUPPORTED_BOARD_ERROR;
}
Expand Down

0 comments on commit e811496

Please sign in to comment.