Skip to content

Commit b8e098f

Browse files
committed
Script to run NPG-LITE wirelessly
1 parent 71eba6a commit b8e098f

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

npg.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import time
2+
import sys
3+
import datetime
4+
import math
5+
import websocket
6+
import socket
7+
from scipy.signal import butter, filtfilt
8+
from pylsl import StreamInfo, StreamOutlet
9+
10+
stream_name = 'ORIC'
11+
data = StreamInfo(stream_name, 'EXG', 3, 250, 'float32', 'uid007')
12+
outlet = StreamOutlet(data)
13+
ws = websocket.WebSocket()
14+
ws.connect("ws://" + socket.gethostbyname("multi-emg.local") + ":81")
15+
print(stream_name, "WebSocket connected!")
16+
sys.stderr.write("ORIC WebSocket connected!\n")
17+
18+
block_size = 13
19+
packet_size = 0
20+
data_size = 0
21+
sample_size = 0
22+
previousSampleNumber = -1
23+
previousData = []
24+
start_time = time.time()
25+
26+
def calculate_rate(data_size, elapsed_time):
27+
rate = data_size / elapsed_time
28+
return rate
29+
30+
while (1):
31+
data = ws.recv()
32+
data_size += len(data)
33+
34+
current_time = time.time()
35+
elapsed_time = current_time - start_time
36+
37+
if elapsed_time >= 1.0:
38+
samples_per_second = calculate_rate(sample_size, elapsed_time)
39+
refresh_rate = calculate_rate(packet_size, elapsed_time)
40+
bytes_per_second = calculate_rate(data_size, elapsed_time)
41+
# Get the current local time
42+
local_time = datetime.datetime.now()
43+
44+
hours = local_time.hour
45+
minutes = local_time.minute
46+
seconds = local_time.second
47+
print(f"{math.ceil(refresh_rate)} FPS : {math.ceil(samples_per_second)} SPS : {math.ceil(bytes_per_second)} BPS")
48+
packet_size = 0
49+
sample_size = 0
50+
data_size = 0
51+
start_time = current_time
52+
53+
if data and (type(data) is list or type(data) is bytes):
54+
packet_size += 1
55+
print("Packet size: ", len(data), "Bytes")
56+
for blockLocation in range(0, len(data), block_size):
57+
sample_size += 1
58+
block = data[blockLocation:blockLocation + block_size]
59+
sample_number = block[0]
60+
channel_data = []
61+
for channel in range(0, 3):
62+
channel_offset = 1 + (channel * 2)
63+
sample = int.from_bytes(block[channel_offset:channel_offset + 2], byteorder='big', signed=True)
64+
channel_data.append(sample)
65+
66+
if previousSampleNumber == -1:
67+
previousSampleNumber = sample_number
68+
previousData = channel_data
69+
else:
70+
if sample_number - previousSampleNumber > 1:
71+
print("Error: Sample Lost")
72+
exit()
73+
elif sample_number == previousSampleNumber:
74+
print("Error: Duplicate sample")
75+
exit()
76+
else:
77+
previousSampleNumber = sample_number
78+
previousData = channel_data
79+
80+
print("EEG Data: ", sample_number, channel_data[0], channel_data[1], channel_data[2])
81+
outlet.push_sample(channel_data)

0 commit comments

Comments
 (0)