Skip to content

Commit bee49d3

Browse files
authored
Support Ganglion v3 detection on MacOS native BLE (#675)
1 parent 5b3a118 commit bee49d3

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

src/board_controller/ble_lib_board.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,29 @@ simpleble_err_t BLELibBoard::simpleble_peripheral_manufacturer_data_get (
610610
return func (handle, index, manufacturer_data);
611611
}
612612

613+
simpleble_err_t BLELibBoard::simpleble_peripheral_read (simpleble_peripheral_t handle,
614+
simpleble_uuid_t service, simpleble_uuid_t characteristic, uint8_t **data, size_t *data_length)
615+
{
616+
std::lock_guard<std::mutex> lock (BLELibBoard::mutex);
617+
if (BLELibBoard::dll_loader == NULL)
618+
{
619+
safe_logger (spdlog::level::err, "BLELibBoard::dll_loader is not initialized");
620+
return SIMPLEBLE_FAILURE;
621+
}
622+
simpleble_err_t (*func) (simpleble_peripheral_t, simpleble_uuid_t, simpleble_uuid_t, uint8_t **,
623+
size_t *) = (simpleble_err_t (*) (simpleble_peripheral_t, simpleble_uuid_t,
624+
simpleble_uuid_t, uint8_t **,
625+
size_t *))BLELibBoard::dll_loader->get_address ("simpleble_peripheral_read");
626+
if (func == NULL)
627+
{
628+
safe_logger (
629+
spdlog::level::err, "failed to get function address for simpleble_peripheral_read");
630+
return SIMPLEBLE_FAILURE;
631+
}
632+
633+
return func (handle, service, characteristic, data, data_length);
634+
}
635+
613636
simpleble_err_t BLELibBoard::simpleble_peripheral_is_connected (
614637
simpleble_peripheral_t handle, bool *connected)
615638
{

src/board_controller/inc/ble_lib_board.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class BLELibBoard : public Board
5858
size_t simpleble_peripheral_manufacturer_data_count (simpleble_peripheral_t handle);
5959
simpleble_err_t simpleble_peripheral_manufacturer_data_get (simpleble_peripheral_t handle,
6060
size_t index, simpleble_manufacturer_data_t *manufacturer_data);
61+
simpleble_err_t simpleble_peripheral_read (simpleble_peripheral_t handle,
62+
simpleble_uuid_t service, simpleble_uuid_t characteristic, uint8_t **data,
63+
size_t *data_length);
6164
simpleble_err_t simpleble_peripheral_is_connected (
6265
simpleble_peripheral_t handle, bool *connected);
6366

src/board_controller/openbci/ganglion_native.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#define GANGLION_WRITE_CHAR "2d30c083-f39f-4ce6-923f-3484ea480596"
1010
#define GANGLION_NOTIFY_CHAR "2d30c082-f39f-4ce6-923f-3484ea480596"
11+
#define GANGLION_SOFTWARE_REVISION "00002a28-0000-1000-8000-00805f9b34fb"
1112

1213

1314
static void ganglion_adapter_1_on_scan_start (simpleble_adapter_t adapter, void *board)
@@ -108,7 +109,6 @@ int GanglionNative::prepare_session ()
108109
lk, params.timeout * sec, [this] { return this->ganglion_peripheral != NULL; }))
109110
{
110111
safe_logger (spdlog::level::info, "Found GanglionNative device");
111-
safe_logger (spdlog::level::info, "Detected firmware version {}", firmware);
112112
}
113113
else
114114
{
@@ -162,11 +162,21 @@ int GanglionNative::prepare_session ()
162162
res = (int)BrainFlowExitCodes::BOARD_NOT_READY_ERROR;
163163
}
164164

165-
safe_logger (spdlog::level::trace, "found servce {}", service.uuid.value);
165+
safe_logger (spdlog::level::trace, "found service {}", service.uuid.value);
166166
for (size_t j = 0; j < service.characteristic_count; j++)
167167
{
168-
safe_logger (spdlog::level::trace, "found characteristic {}",
169-
service.characteristics[j].uuid.value);
168+
// Read the software revision characteristic to get the firmware version
169+
if (strcmp (service.characteristics[j].uuid.value, GANGLION_SOFTWARE_REVISION) == 0)
170+
{
171+
uint8_t *data;
172+
size_t data_length;
173+
simpleble_peripheral_read (ganglion_peripheral, service.uuid,
174+
service.characteristics[j].uuid, &data, &data_length);
175+
176+
// Data should be in the form x.x.x stored as ASCII values in the data buffer
177+
firmware = (data[0] == '3') ? 3 : 2;
178+
safe_logger (spdlog::level::info, "Detected firmware version {}", firmware);
179+
}
170180

171181
if (strcmp (service.characteristics[j].uuid.value,
172182
GANGLION_WRITE_CHAR) == 0) // Write Characteristics
@@ -444,7 +454,6 @@ void GanglionNative::adapter_1_on_scan_found (
444454

445455
if (found)
446456
{
447-
firmware = strncmp (peripheral_identified, "Ganglion 1.3", 12) == 0 ? 3 : 2;
448457
{
449458
std::lock_guard<std::mutex> lk (m);
450459
ganglion_peripheral = peripheral;

0 commit comments

Comments
 (0)