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
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
2315static 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 (
2921static 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
3536BrainAlive::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 (
371371void 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}
0 commit comments