@@ -14,7 +14,7 @@ class State(enum.Enum):
1414class 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
96143def main ():
97144 emulator = GaleaEmulator ()
0 commit comments