Общение с устройствами NeuroPlay по протоколу Bluetooth 4 (BLE)
Режим работы устройств
Устройства NeuroPlay работают в режимах с частотой опроса кратной 125 Гц.
Выбор режима работы заключается в задании частоты.
Любое устройство NeuroPlay в независимости от реального числа каналов получает по 8 сэмплов.
- 1000 Гц – соответствует 1 каналу
- 500 Гц – соответствует 2 каналам
- 125 Гц – соответствует 8, 6 и 4 каналам (в этом случае часть данных лишняя).
Распределение каналов в сэмпле:
- 1 канал (1000 Гц) - "O1"
- 2 канала (500 Гц) - "O1", "O2"
- 4 канала (125 Гц) - "O1", "Fp1", "Fp2", "O2"
- 6 каналов (125 Гц) - "O1", "T3", "Fp1", "Fp2", "T4", "O2"
- 8 каналов (125 Гц) - "O1", "P3", "C3", "F3", "F4", "C4", "P4", "O2"
Особый Bluetooth-сервис устройств NeuroPlay:
- BLUETOOTH_UUID_EEG = {f0001298-0451-4000-b000-000000000000}
По этому сервису можно искать NeuroPlay среди остальных Bluetooth-устройств и необходимо включить приём нотификаций от него.
Характеристики этого сервиса:
- BLUETOOTH_UUID_EEG_DATA = {f0001299-0451-4000-b000-000000000000}
Необходимо записать в дескриптор (ClientCharacteristicConfiguration = 0x2902) значение [0x01, 0x00] для начала передачи данных или [0x00, 0x00] для остановки передачи.
И подписаться на нотификации сервиса
- BLUETOOTH_UUID_EEG_CONTROL = {f000129a-0451-4000-b000-000000000000}
Необходимо послать [0x01, 0xNN] для выставления количества каналов и [0x00, 0x00] для остановки. NN = 0x01 (8, 6 и 4 канала 125 Гц), NN = 0x08 (1 канал 1000 Гц).
Разбор пакетов и получение семплов
Каждая нотификация от сервиса
BLUETOOTH_UUID_EEG занимает 20 байт.
Необходимо накопить 4 таких посылки и разобрать на семплы
[FN1,??,A3,A2,A1,B3,B2,B1,C3,C2,C1,D3,D2,D1,E3,E2,E1,F3,F2,F1]
[FN2,??,G3,G2,G1,H3,H2,H1,I3,I2,I1,J3,J2,J1,K3,K2,K1,L3,L2,L1]
[FN3,??,M3,M2,M1,N3,N2,N1,O3,O2,O1,P3,P2,P1,Q3,Q2,Q1,R3,R2,R1]
[FN3,??,S3,S2,S1,T3,T2,T1,U3,U2,U1,V3,V2,V1,W3,W2,W1,X3,X2,X1]
Здесь
FNi - номер посылки (frame number), причём
FNi+1 = FNi + 1
Из посылки надо взять последние 18 байт (3 байта * 6 значений).
Каждые три байта надо сложить в int32 (состоящий из 4 байт) в таком порядке:
INT32 SampleA = [0x00, A1, A2, A3];
Умножить на коэффициент приведения к микровольтам
MAGIC_MICROVOLTS_BIT =
0.000186265
double SA = MAGIC_MICROVOLTS_BIT * SampleA;
Таким образом получится массив
[SA,SB,SC,SD,SE,SF,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SP,SQ,SR,SS,ST,SU,SV,SW,SX]
Иначе говоря, масcив из 24 значений.
Он представляет собой channel-wise пачки по 3 сэмпла.
SAMPLES = [[S1_01...S1_08], [S2_01...S2_08], [S3_01...S3_08]]
Распределение сэмплов по реальным каналам
- Для 8 каналов сэмплы остаются как есть
("O1", "P3", "C3", "F3", "F4", "C4", "P4", "O2")
- Для 6 каналов не используются индексы 2 и 7
("O1",
"XX", "T3", "Fp1", "Fp2", "C4", "XX", "O2")
- Для 4 каналов не используются индексы 2, 3, 6 и 7
("O1",
"XX", "XX", "Fp1", "Fp2", "XX", "XX", "O2")
- Для 2 каналов данные идут последовательно в таком порядке
("O1_1", "O1_2", "O1_3", "O1_4", "O2_1", "O2_2", "O2_3", "O2_4")
- Для 1 канала данные идут последовательно
("O1_1", "O1_2", "O1_3", "O1_4", "O1_5", "O2_6", "O1_7", "O1_8")
Резюме
Поиск и запуск- Поиск устройств по наличию сервиса BLUETOOTH_UUID_EEG
- Выставить начало опроса BLUETOOTH_UUID_EEG_DATA –> [0x01, 0x00]
- Записать в характеристику количество каналов BLUETOOTH_UUID_EEG_CONTROL –> [0x01, 0xNN]
- Выставить чтение нотификаций от сервиса BLUETOOTH_UUID_EEG из характеристики BLUETOOTH_UUID_EEG_DATA<>
Чтение данных
- Получать от BLUETOOTH_UUID_EEG из характеристики BLUETOOTH_UUID_EEG_DATA по 20 байт за каждую нотификацию и копить массив посылок
- Как только в массиве будет 4 посылки (80 байт) – разбирать пакет и получать сэмплы
Завершение
- Для окончания опроса отключить нотификации от BLUETOOTH_UUID_EEG и послать BLUETOOTH_UUID_EEG_DATA –> [0x00, 0x00]