Skip to content

Commit b8ea896

Browse files
authored
add ganglion native ble scan (#3)
* add ganglion native ble scan Signed-off-by: Andrey Parfenov <a1994ndrey@gmail.com>
1 parent 721d74f commit b8ea896

493 files changed

Lines changed: 109114 additions & 16 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.travis.yml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
sudo: required
2-
dist: xenial
2+
dist: jammy
33

44
os:
55
- linux
66
- osx
77

8-
osx_image: xcode9.4
8+
osx_image: xcode14.1
99

1010
services:
1111
- docker
@@ -24,19 +24,23 @@ addons:
2424
- python3
2525
- python3-setuptools
2626
- python3-pip
27+
- ninja-build
2728

2829
install:
2930
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then
30-
docker pull dockcross/manylinux-x64 ;
31+
docker pull dockcross/manylinux2014-x64:20210708-94745ff ;
32+
fi
33+
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then
34+
brew install ninja ;
3135
fi
3236

3337
script:
3438
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then
35-
docker run -e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR dockcross/manylinux-x64 /bin/bash -c "/opt/python/cp36-cp36m/bin/pip3.6 install cmake==3.13.0 && cd $TRAVIS_BUILD_DIR && mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/installed_docker -DCMAKE_BUILD_TYPE=Release .. && make" ;
39+
docker run -e TRAVIS_BUILD_DIR=$TRAVIS_BUILD_DIR -v $TRAVIS_BUILD_DIR:$TRAVIS_BUILD_DIR 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 $TRAVIS_BUILD_DIR && mkdir build && cd build && /opt/_internal/cpython-3.6.14/bin/cmake -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/installed_docker -DCMAKE_BUILD_TYPE=Release .. && make" ;
3640
fi
3741
# build for mac
3842
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then
39-
cd $TRAVIS_BUILD_DIR && mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/installed -DCMAKE_BUILD_TYPE=Release .. && make ;
43+
cd $TRAVIS_BUILD_DIR && mkdir build && cd build && cmake -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/installed -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 .. && ninja ;
4044
fi
4145
- cd $TRAVIS_BUILD_DIR && cd java-package/openbci_gui_helpers && mvn package
4246

CMakeLists.txt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required (VERSION 3.10)
22
project (OpenBCI_GUI_Helpers)
33

4-
set (CMAKE_CXX_STANDARD 11)
4+
set (CMAKE_CXX_STANDARD 17)
55
set (CMAKE_VERBOSE_MAKEFILE ON)
66
set (BRAINFLOW_VERSION 2.1.0)
77

@@ -51,6 +51,8 @@ endmacro ()
5151
# link msvc runtime statically
5252
configure_msvc_runtime ()
5353

54+
add_subdirectory(${CMAKE_HOME_DIRECTORY}/third_party/SimpleBLE/simpleble)
55+
5456
SET (GANGLION_LIB "GanglionScan")
5557
set (GANGLION_SOURCE_LIB
5658
${CMAKE_HOME_DIRECTORY}/src/callbacks.cpp
@@ -80,4 +82,34 @@ set_target_properties (${GANGLION_LIB}
8082
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
8183
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
8284
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
85+
)
86+
87+
SET (GANGLION_NATIVE_LIB "GanglionNativeScan")
88+
set (GANGLION_NATIVE_SOURCE_LIB
89+
${CMAKE_HOME_DIRECTORY}/src/openbci_gui_native_helpers.cpp
90+
)
91+
92+
add_library (${GANGLION_NATIVE_LIB} SHARED ${GANGLION_NATIVE_SOURCE_LIB})
93+
94+
target_include_directories (${GANGLION_NATIVE_LIB} PUBLIC
95+
$<BUILD_INTERFACE:${CMAKE_HOME_DIRECTORY}/src/inc>
96+
$<BUILD_INTERFACE:${CMAKE_HOME_DIRECTORY}/third_party/json>
97+
$<BUILD_INTERFACE:${CMAKE_HOME_DIRECTORY}/third_party/SimpleBLE/simpleble/include/simpleble>
98+
)
99+
100+
target_link_libraries (${GANGLION_NATIVE_LIB} PRIVATE simpleble)
101+
102+
set_property (TARGET ${GANGLION_NATIVE_LIB} PROPERTY POSITION_INDEPENDENT_CODE ON)
103+
104+
set_target_properties (${GANGLION_NATIVE_LIB}
105+
PROPERTIES
106+
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
107+
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
108+
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
109+
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
110+
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
111+
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
112+
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
113+
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
114+
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/java-package/openbci_gui_helpers/src/main/resources/
83115
)

appveyor.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
image:
2-
- Visual Studio 2017
2+
- Visual Studio 2019
33

44
stack: python 3
55

@@ -23,7 +23,7 @@ init:
2323
- cmd: set JAVA_HOME=C:\Program Files\Java\jdk1.8.0
2424

2525
install:
26-
- mkdir %APPVEYOR_BUILD_FOLDER%\build64 && cd %APPVEYOR_BUILD_FOLDER%\build64 && cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_SYSTEM_VERSION=8.1 -DCMAKE_INSTALL_PREFIX=..\installed64\ .. && cmake --build . --config Release > build64_stdout.txt
26+
- mkdir %APPVEYOR_BUILD_FOLDER%\build64 && cd %APPVEYOR_BUILD_FOLDER%\build64 && cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0.19041.0 -DCMAKE_INSTALL_PREFIX=..\installed64\ .. && cmake --build . --config Release > build64_stdout.txt
2727
# mvn package for java
2828
- cd %APPVEYOR_BUILD_FOLDER%\java-package\openbci_gui_helpers && mvn package > maven_package_stdout.txt
2929
deploy_script:

java-package/openbci_gui_helpers/pom.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
<include>GanglionScan.dll</include>
6060
<include>libGanglionScan.so</include>
6161
<include>libGanglionScan.dylib</include>
62+
<include>GanglionNativeScan.dll</include>
63+
<include>libGanglionNativeScan.so</include>
64+
<include>libGanglionNativeScan.dylib</include>
6265
</includes>
6366
</resource>
6467
</resources>

java-package/openbci_gui_helpers/src/main/java/openbci_gui_helpers/GUIHelper.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
package openbci_gui_helpers;
22

33
import java.io.File;
4-
import java.io.IOException;
54
import java.io.InputStream;
5+
import java.lang.reflect.Type;
66
import java.nio.file.Files;
7-
import java.util.Arrays;
8-
import java.util.HashMap;
97
import java.util.Map;
108

119
import org.apache.commons.lang3.SystemUtils;
1210

13-
import com.sun.jna.Library;
14-
import com.sun.jna.Native;
15-
16-
import java.lang.reflect.Type;
1711
import com.google.gson.Gson;
1812
import com.google.gson.reflect.TypeToken;
13+
import com.sun.jna.Library;
14+
import com.sun.jna.Native;
1915

2016
public class GUIHelper
2117
{
@@ -24,24 +20,35 @@ private interface DllInterface extends Library
2420
int scan_for_ganglions (String serial_port, int timeout_sec, byte[] output, int[] output_len);
2521
}
2622

23+
private interface DllNativeInterface extends Library
24+
{
25+
int scan_for_ganglions (int timeout_sec, byte[] output, int[] output_len);
26+
}
27+
2728
private static DllInterface instance;
29+
private static DllNativeInterface instance_native;
2830

2931
static
3032
{
3133
String lib_name = "libGanglionScan.so";
34+
String lib_native_name = "libGanglionNativeScan.so";
3235
if (SystemUtils.IS_OS_WINDOWS)
3336
{
3437
lib_name = "GanglionScan.dll";
38+
lib_native_name = "GanglionNativeScan.dll";
3539

3640
} else if (SystemUtils.IS_OS_MAC)
3741
{
3842
lib_name = "libGanglionScan.dylib";
43+
lib_native_name = "libGanglionNativeScan.dylib";
3944
}
4045

4146
// need to extract libraries from jar
4247
unpack_from_jar (lib_name);
48+
unpack_from_jar (lib_native_name);
4349

4450
instance = (DllInterface) Native.loadLibrary (lib_name, DllInterface.class);
51+
instance_native = (DllNativeInterface) Native.loadLibrary (lib_native_name, DllNativeInterface.class);
4552
}
4653

4754
private static void unpack_from_jar (String lib_name)
@@ -77,4 +84,22 @@ public static Map<String, String> scan_for_ganglions (String port_name, int time
7784
return map;
7885
}
7986

87+
public static Map<String, String> scan_for_ganglions (int timeout_sec) throws GanglionError
88+
{
89+
int[] len = new int[1];
90+
byte[] output_json = new byte[10240];
91+
int ec = instance_native.scan_for_ganglions (timeout_sec, output_json, len);
92+
if (ec != GanglionExitCodes.STATUS_OK.get_code ())
93+
{
94+
throw new GanglionError ("Error in scan for ganglions", ec);
95+
}
96+
String json = new String (output_json, 0, len[0]);
97+
Gson gson = new Gson ();
98+
Type type = new TypeToken<Map<String, String>> ()
99+
{
100+
}.getType ();
101+
Map<String, String> map = gson.fromJson (json, type);
102+
return map;
103+
}
104+
80105
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package openbci_gui_helpers.examples;
2+
3+
import java.util.Map;
4+
5+
import openbci_gui_helpers.GUIHelper;
6+
import openbci_gui_helpers.GanglionError;
7+
8+
public class TestNativeDiscovery
9+
{
10+
11+
public static void main (String[] args) throws GanglionError
12+
{
13+
Map<String, String> map = GUIHelper.scan_for_ganglions (3);
14+
for (Map.Entry<String, String> entry : map.entrySet ())
15+
{
16+
System.out.println ("Key = " + entry.getKey () + ", Value = " + entry.getValue ());
17+
}
18+
System.out.println ("Completed");
19+
}
20+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#ifdef _WIN32
4+
#define SHARED_EXPORT __declspec(dllexport)
5+
#define CALLING_CONVENTION __cdecl
6+
#else
7+
#define SHARED_EXPORT __attribute__ ((visibility ("default")))
8+
#define CALLING_CONVENTION
9+
#endif
10+
11+
typedef enum
12+
{
13+
STATUS_OK = 0,
14+
PORT_OPEN_ERROR,
15+
GENERAL_ERROR,
16+
SYNC_ERROR
17+
} GanglionScanExitCodes;
18+
19+
#ifdef __cplusplus
20+
extern "C"
21+
{
22+
#endif
23+
24+
SHARED_EXPORT int CALLING_CONVENTION scan_for_ganglions (
25+
int timeout_sec, char *output, int *output_len);
26+
27+
#ifdef __cplusplus
28+
}
29+
#endif

src/openbci_gui_helpers.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ using json = nlohmann::json;
2222
namespace GanglionDetails
2323
{
2424
int exit_code = (int)GanglionScanExitCodes::STATUS_OK;
25-
std::map<std::string, std::string> devices; // mac_addr, name
25+
std::map<std::string, std::string> devices;
2626

2727
void output (uint8 len1, uint8 *data1, uint16 len2, uint8 *data2)
2828
{

src/openbci_gui_native_helpers.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <chrono>
2+
#include <ctype.h>
3+
#include <map>
4+
#include <stdlib.h>
5+
#include <string.h>
6+
#include <string>
7+
8+
#include "SimpleBLE.h"
9+
#include "openbci_gui_native_helpers.h"
10+
11+
#include "json.hpp"
12+
13+
using json = nlohmann::json;
14+
15+
16+
int scan_for_ganglions (int timeout_sec, char *output_json, int *output_len)
17+
{
18+
std::map<std::string, std::string> devices;
19+
auto adapter_list = SimpleBLE::Adapter::get_adapters ();
20+
if (adapter_list.empty ())
21+
{
22+
return (int)GanglionScanExitCodes::PORT_OPEN_ERROR;
23+
}
24+
25+
adapter_list[0].set_callback_on_scan_found (
26+
[&devices] (SimpleBLE::Peripheral peripheral)
27+
{
28+
std::string identifier = peripheral.identifier ();
29+
std::string mac_address = peripheral.address ();
30+
if (strncmp (identifier.c_str (), "Ganglion", 8) == 0)
31+
{
32+
devices[identifier] = mac_address;
33+
}
34+
else if (strncmp (identifier.c_str (), "Simblee", 7) == 0)
35+
{
36+
devices[identifier] = mac_address;
37+
}
38+
});
39+
40+
adapter_list[0].scan_for (timeout_sec * 1000);
41+
42+
json result (devices);
43+
std::string s = result.dump ();
44+
strcpy (output_json, s.c_str ());
45+
*output_len = s.length ();
46+
47+
return (int)GanglionScanExitCodes::STATUS_OK;
48+
}

0 commit comments

Comments
 (0)