Skip to content

Commit def8c03

Browse files
authored
Update Galea board using production specifications (#782)
* Remove unused Galea BoardIds and related files
1 parent cda4358 commit def8c03

File tree

28 files changed

+191
-2944
lines changed

28 files changed

+191
-2944
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
x64/
2121
x86/
2222
bld/
23+
build/
2324
[Bb]in/
2425
[Oo]bj/
2526
[Ll]og/

csharp_package/brainflow/brainflow/board_controller_library.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public enum BoardIds
8080
FREEEEG32_BOARD = 17,
8181
BRAINBIT_BLED_BOARD = 18,
8282
GFORCE_DUAL_BOARD = 19,
83-
GALEA_SERIAL_BOARD = 20,
8483
MUSE_S_BLED_BOARD = 21,
8584
MUSE_2_BLED_BOARD = 22,
8685
CROWN_BOARD = 23,
@@ -107,8 +106,6 @@ public enum BoardIds
107106
EXPLORE_8_CHAN_BOARD = 45,
108107
GANGLION_NATIVE_BOARD = 46,
109108
EMOTIBIT_BOARD = 47,
110-
GALEA_BOARD_V4 = 48,
111-
GALEA_SERIAL_BOARD_V4 = 49,
112109
NTL_WIFI_BOARD = 50,
113110
ANT_NEURO_EE_511_BOARD = 51,
114111
FREEEEG128_BOARD = 52,

emulator/brainflow_emulator/galea_manual.py

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class State(enum.Enum):
1414
class Message(enum.Enum):
1515
start_stream = b'b'
1616
stop_stream = b's'
17-
ack_values = (b'd', b'~6', b'~5', b'o', b'F0')
17+
ack_values = (b'd', b'~6', b'~5', b'~4', b'o', b'F0')
1818
ack_from_device = b'A'
1919
time_calc_command = b'F4444444'
2020

@@ -25,14 +25,19 @@ def __init__(self):
2525
self.local_ip = '127.0.0.1'
2626
self.local_port = 2390
2727
self.server_socket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
28-
self.server_socket.settimeout(
29-
0.1) # decreases sampling rate significantly because it will wait for recv 0.1 sec but it's just a test
3028
self.server_socket.bind((self.local_ip, self.local_port))
3129
self.state = State.wait.value
3230
self.addr = None
3331
self.package_num = 0
34-
self.transaction_size = 19
35-
self.package_size = 72
32+
self.transaction_size = 12
33+
self.package_size = 114
34+
self.server_socket.settimeout(.0001)
35+
self.channel_on_off = [1] * 24
36+
self.channel_identifiers = [
37+
'1', '2', '3', '4', '5', '6', '7', '8',
38+
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I',
39+
'A', 'S', 'D', 'G', 'H', 'J', 'K', 'L'
40+
]
3641

3742
def run(self):
3843
start_time = time.time()
@@ -43,8 +48,14 @@ def run(self):
4348
self.state = State.stream.value
4449
elif msg == Message.stop_stream.value:
4550
self.state = State.wait.value
51+
elif msg.decode('utf-8').startswith('~'):
52+
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
53+
self.process_sampling_rate(msg.decode('utf-8'))
4654
elif msg in Message.ack_values.value or msg.decode('utf-8').startswith('x'):
4755
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
56+
self.process_channel_on_off(msg.decode('utf-8'))
57+
elif msg in Message.ack_values.value or msg.decode('utf-8').startswith('z'):
58+
self.server_socket.sendto(Message.ack_from_device.value, self.addr)
4859
elif msg == Message.time_calc_command.value:
4960
cur_time = time.time()
5061
resp = bytearray(struct.pack('d', (cur_time - start_time) * 1000))
@@ -58,27 +69,40 @@ def run(self):
5869

5970
if self.state == State.stream.value:
6071
transaction = list()
61-
for _ in range(self.transaction_size):
72+
for t in range(self.transaction_size):
6273
single_package = list()
74+
channel = 0
6375
for i in range(self.package_size):
64-
single_package.append(random.randint(0, 255))
76+
if (i > 4 and i < 77):
77+
sample = i - 4
78+
if (sample % 3 == 1):
79+
channel += 1
80+
if (self.channel_on_off[channel - 1] == 1):
81+
if (sample % 3 == 2):
82+
single_package.append(random.randint(0, 8 + (channel * 2)))
83+
else:
84+
single_package.append(0)
85+
else:
86+
single_package.append(0)
87+
else:
88+
single_package.append(random.randint(0, 255))
6589
single_package[0] = self.package_num
6690

6791
cur_time = time.time()
6892
timestamp = bytearray(struct.pack('d', (cur_time - start_time) * 1000))
69-
eda = bytearray(struct.pack('f', random.random()))
93+
eda = bytearray(struct.pack('f', .5))
7094
ppg_red = bytearray(struct.pack('i', int(random.random() * 5000)))
7195
ppg_ir = bytearray(struct.pack('i', int(random.random() * 5000)))
7296

73-
for i in range(64, 72):
74-
single_package[i] = timestamp[i - 64]
97+
for i in range(88, 96):
98+
single_package[i] = timestamp[i - 88]
7599
for i in range(1, 5):
76100
single_package[i] = eda[i - 1]
77-
for i in range(60, 64):
78-
single_package[i] = ppg_ir[i - 60]
79-
for i in range(56, 60):
80-
single_package[i] = ppg_red[i - 56]
81-
single_package[53] = random.randint(0, 100)
101+
for i in range(84, 88):
102+
single_package[i] = ppg_ir[i - 84]
103+
for i in range(80, 84):
104+
single_package[i] = ppg_red[i - 80]
105+
single_package[77] = random.randint(0, 100)
82106

83107
self.package_num = self.package_num + 1
84108
if self.package_num % 256 == 0:
@@ -91,7 +115,30 @@ def run(self):
91115
self.server_socket.sendto(bytes(package), self.addr)
92116
except socket.timeout:
93117
logging.info('timeout for send')
94-
118+
time.sleep(0.001)
119+
120+
121+
def process_channel_on_off(self, msg):
122+
if msg.startswith('x'):
123+
for channel_id in self.channel_identifiers:
124+
channel_num = self.channel_identifiers.index(channel_id)
125+
if (msg[1] == channel_id):
126+
if (msg[2] == '0'): # 0 is off (or Power Down), 1 is on
127+
self.channel_on_off[channel_num] = 1
128+
logging.info('channel '+ str(channel_num + 1) + ' is on')
129+
else:
130+
self.channel_on_off[channel_num] = 0
131+
logging.info('channel ' + str(channel_num + 1) + ' is off')
132+
133+
def process_sampling_rate(self, msg):
134+
if (msg[1] == '6'):
135+
logging.info('sampling rate is 250Hz')
136+
elif (msg[1] == '5'):
137+
logging.info('sampling rate is 500Hz')
138+
elif (msg[1] == '4'):
139+
logging.info('sampling rate is 1000Hz')
140+
else:
141+
logging.warning(f'did not recognize sampling rate command: {msg}')
95142

96143
def main():
97144
emulator = GaleaEmulator()

emulator/brainflow_emulator/galea_manual_v4.py

Lines changed: 0 additions & 150 deletions
This file was deleted.

0 commit comments

Comments
 (0)