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