Skip to content

Commit a0b554d

Browse files
Brainflow BA_v4 integration (#730)
* BrainAlive v4 --------- Co-authored-by: sarveshdhar <sarvesh@braina.live>
1 parent 3c11430 commit a0b554d

3 files changed

Lines changed: 126 additions & 29 deletions

File tree

src/board_controller/brainalive/brainalive.cpp

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
#include <string>
2-
31
#include "brainalive.h"
42
#include "custom_cast.h"
53
#include "get_dll_dir.h"
64
#include "timestamp.h"
7-
8-
// common constants
9-
#define BRAINALIVE_PACKET_SIZE 224
5+
#include <string.h>
106

117
// info about services and chars
128
#define START_BYTE 0x0A
@@ -15,10 +11,6 @@
1511
#define BRAINALIVE_WRITE_CHAR "0000fe41-8e22-4541-9d4c-21edae82ed19"
1612
#define BRAINALIVE_NOTIFY_CHAR "0000fe42-8e22-4541-9d4c-21edae82ed19"
1713

18-
// info for equations
19-
#define BRAINALIVE_EEG_SCALE_FACTOR 0.0476837158203125
20-
#define BRAINALIVE_EEG_GAIN_VALUE 12
21-
2214

2315
static void brainalive_adapter_1_on_scan_found (
2416
simpleble_adapter_t adapter, simpleble_peripheral_t peripheral, void *board)
@@ -29,7 +21,16 @@ static void brainalive_adapter_1_on_scan_found (
2921
static void brainalive_read_notifications (simpleble_uuid_t service,
3022
simpleble_uuid_t characteristic, uint8_t *data, size_t size, void *board)
3123
{
32-
((BrainAlive *)(board))->read_data (service, characteristic, data, size, 0);
24+
if (size == BrainAlive::brainalive_handshaking_packet_size)
25+
{
26+
((BrainAlive *)(board))->setSoftwareGain (data[1]);
27+
((BrainAlive *)(board))->setHardwareGain (data[2]);
28+
((BrainAlive *)(board))->setReferenceVoltage (((data[3] << 8) | data[4]));
29+
}
30+
else
31+
{
32+
((BrainAlive *)(board))->read_data (service, characteristic, data, size, 0);
33+
}
3334
}
3435

3536
BrainAlive::BrainAlive (struct BrainFlowInputParams params)
@@ -302,7 +303,6 @@ int BrainAlive::config_board (std::string config)
302303
return (int)BrainFlowExitCodes::BOARD_NOT_CREATED_ERROR;
303304
}
304305
uint8_t command[5];
305-
size_t len = config.size ();
306306
command[0] = 0x0a;
307307
command[1] = 0x81; // it is hardcoded for now only
308308
command[2] = 0x00;
@@ -342,7 +342,7 @@ void BrainAlive::adapter_1_on_scan_found (
342342
}
343343
else
344344
{
345-
if (strncmp (peripheral_identified, "ORION_1", 7) == 0)
345+
if (strncmp (peripheral_identified, "BA_FLEX", 7) == 0)
346346
{
347347
found = true;
348348
}
@@ -371,21 +371,57 @@ void BrainAlive::adapter_1_on_scan_found (
371371
void BrainAlive::read_data (simpleble_uuid_t service, simpleble_uuid_t characteristic,
372372
uint8_t *data, size_t size, int channel_num)
373373
{
374-
if (size != BRAINALIVE_PACKET_SIZE)
374+
if (size == brainalive_packet_size)
375375
{
376-
safe_logger (spdlog::level::warn, "unknown size of BrainAlive Data {}", size);
377-
return;
378-
}
379-
380-
for (int i = 0; i < (int)size; i += 32)
381-
{
382-
double eeg_data[9] = {0};
383-
for (int j = i + 4, k = 0; j < i + 28; j += 3, k++)
376+
for (int i = 0; i < (int)size; i += brainalive_single_packet_size)
384377
{
385-
eeg_data[k] = (((data[j] << 16 | data[j + 1] << 8 | data[j + 2]) << 8) >> 8) *
386-
BRAINALIVE_EEG_SCALE_FACTOR / BRAINALIVE_EEG_GAIN_VALUE;
378+
379+
int num_rows = board_descr["default"]["num_rows"];
380+
double *package = new double[num_rows];
381+
for (int i = 0; i < num_rows; i++)
382+
{
383+
package[i] = 0.0;
384+
}
385+
std::vector<int> eeg_channels = board_descr["default"]["eeg_channels"];
386+
std::vector<int> accel_channels = board_descr["default"]["accel_channels"];
387+
std::vector<int> gyro_channels = board_descr["default"]["gyro_channels"];
388+
389+
package[board_descr["default"]["package_num_channel"].get<int> ()] =
390+
data[brainalive_packet_index + i];
391+
392+
for (int j = i + brainalive_eeg_Start_index, k = 0; j < i + brainalive_eeg_end_index;
393+
j += 3, k++)
394+
{
395+
package[eeg_channels[k]] =
396+
(float)(((data[j] << 16 | data[j + 1] << 8 | data[j + 2]) << 8) >> 8) *
397+
((((float)getReferenceVoltage () * 1000) /
398+
(float)(getSoftwareGain () * getHardwareGain () * FSR_Value)));
399+
}
400+
401+
for (int j = i + brainalive_axl_start_index, k = 0; j < i + brainalive_axl_end_index;
402+
j += 2, k++)
403+
{
404+
package[accel_channels[k]] = (data[j] << 8) | data[j + 1];
405+
if (package[accel_channels[k]] > 32767)
406+
package[accel_channels[k]] = package[accel_channels[k]] - 65535;
407+
}
408+
for (int j = i + brainalive_gyro_start_index, k = 0; j < i + brainalive_gyro_end_index;
409+
j += 2, k++)
410+
{
411+
package[gyro_channels[k]] = (data[j] << 8) | data[j + 1];
412+
if (package[gyro_channels[k]] > 32767)
413+
package[gyro_channels[k]] = package[gyro_channels[k]] - 65535;
414+
}
415+
package[board_descr["default"]["marker_channel"].get<int> ()] =
416+
data[(brainalive_packet_index + 1) + i];
417+
package[board_descr["default"]["timestamp_channel"].get<int> ()] = get_timestamp ();
418+
419+
push_package (&package[0]);
387420
}
388-
eeg_data[8] = data[i + 29];
389-
push_package (&eeg_data[0]);
421+
}
422+
else
423+
{
424+
safe_logger (spdlog::level::warn, "unknown size of BrainAlive Data {}", size);
425+
return;
390426
}
391427
}

src/board_controller/brainalive/inc/brainalive.h

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99
class BrainAlive : public BLELibBoard
1010
{
11+
12+
private:
13+
int software_gain = 0;
14+
int hardware_gain = 0;
15+
int reference_voltage = 0;
16+
1117
public:
1218
BrainAlive (struct BrainFlowInputParams params);
1319
~BrainAlive ();
@@ -22,6 +28,61 @@ class BrainAlive : public BLELibBoard
2228
void adapter_1_on_scan_found (simpleble_adapter_t adapter, simpleble_peripheral_t peripheral);
2329
void read_data (simpleble_uuid_t service, simpleble_uuid_t characteristic, uint8_t *data,
2430
size_t size, int channel_num);
31+
void setSoftwareGain (int gain)
32+
{
33+
software_gain = gain;
34+
}
35+
36+
void setHardwareGain (int gain)
37+
{
38+
hardware_gain = gain;
39+
}
40+
41+
void setReferenceVoltage (int voltage)
42+
{
43+
reference_voltage = voltage;
44+
}
45+
46+
int getSoftwareGain () const
47+
{
48+
return software_gain;
49+
}
50+
51+
int getHardwareGain () const
52+
{
53+
return hardware_gain;
54+
}
55+
56+
int getReferenceVoltage () const
57+
{
58+
return reference_voltage;
59+
}
60+
61+
// common constants
62+
static constexpr int brainalive_packet_size = 220;
63+
static constexpr int brainalive_single_packet_size = 44;
64+
static constexpr int num_of_packets = brainalive_packet_size / brainalive_single_packet_size;
65+
66+
static constexpr int brainalive_packet_index = (brainalive_single_packet_size - 3);
67+
68+
static constexpr int brainalive_eeg_data_szie = 24;
69+
static constexpr int brainalive_eeg_Start_index = 4;
70+
static constexpr int brainalive_eeg_end_index =
71+
(brainalive_eeg_Start_index + brainalive_eeg_data_szie);
72+
73+
static constexpr int brainalive_axl_data_size = 6;
74+
static constexpr int brainalive_gyro_data_size = 6;
75+
static constexpr int brainalive_axl_start_index = brainalive_eeg_end_index;
76+
static constexpr int brainalive_axl_end_index =
77+
brainalive_axl_start_index + brainalive_axl_data_size;
78+
static constexpr int brainalive_gyro_start_index = brainalive_axl_end_index;
79+
static constexpr int brainalive_gyro_end_index =
80+
brainalive_gyro_start_index + brainalive_gyro_data_size;
81+
static constexpr int FSR_Value = 8388607;
82+
static constexpr int ba_brainflow_package_size = 17;
83+
84+
static constexpr int brainalive_handshaking_packet_size = 6;
85+
2586

2687
protected:
2788
volatile simpleble_adapter_t brainalive_adapter;

src/board_controller/brainflow_boards.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -710,14 +710,14 @@ BrainFlowBoards::BrainFlowBoards()
710710
{
711711
{"name", "BrainAlive"},
712712
{"sampling_rate", 250},
713-
{"timestamp_channel", 15},
714-
{"marker_channel", 16},
715-
{"package_num_channel", 0},
713+
{"marker_channel", 15},
714+
{"timestamp_channel", 16},
716715
{"num_rows", 17},
716+
{"package_num_channel", 0},
717717
{"eeg_channels", {1, 2, 3, 4, 5, 6, 7, 8}},
718718
{"eeg_names", "F7,FT7,T7,CP5,CZ,C6,FC6,F4"},
719719
{"accel_channels", {9, 10, 11}},
720-
{"ppg_channels", {12, 13, 14}}
720+
{"gyro_channels", {12, 13, 14}}
721721
};
722722
brainflow_boards_json["boards"]["41"]["default"] =
723723
{

0 commit comments

Comments
 (0)