@@ -28,7 +28,7 @@ def handle_sample(sample):
28
28
import requests
29
29
import xmltodict
30
30
31
- from openbci .utils import k , ParseRaw , ssdp
31
+ from openbci .utils import k , ParseRaw , OpenBCISample , ssdp
32
32
33
33
SAMPLE_RATE = 0 # Hz
34
34
@@ -56,14 +56,17 @@ class OpenBCIWiFi(object):
56
56
"""
57
57
58
58
def __init__ (self , ip_address = None , shield_name = None , sample_rate = None , log = True , timeout = 3 ,
59
- max_packets_to_skip = 20 , latency = 10000 , high_speed = True , ssdp_attempts = 5 ):
59
+ max_packets_to_skip = 20 , latency = 10000 , high_speed = True , ssdp_attempts = 5 ,
60
+ num_channels = 8 ):
60
61
# these one are used
62
+ self .daisy = False
61
63
self .high_speed = high_speed
62
64
self .impedance = False
63
65
self .ip_address = ip_address
64
66
self .latency = latency
65
67
self .log = log # print_incoming_text needs log
66
68
self .max_packets_to_skip = max_packets_to_skip
69
+ self .num_channles = num_channels
67
70
self .sample_rate = sample_rate
68
71
self .shield_name = shield_name
69
72
self .ssdp_attempts = ssdp_attempts
@@ -157,8 +160,14 @@ def connect(self):
157
160
gains = None
158
161
if self .board_type == k .BOARD_CYTON :
159
162
gains = [24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 ]
163
+ self .daisy = False
164
+ elif self .board_type == k .BOARD_DAISY :
165
+ gains = [24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 ]
166
+ self .daisy = True
160
167
elif self .board_type == k .BOARD_GANGLION :
161
168
gains = [51 , 51 , 51 , 51 ]
169
+ self .daisy = False
170
+ self .local_wifi_server .set_daisy (daisy = self .daisy )
162
171
self .local_wifi_server .set_parser (ParseRaw (gains = gains , board_type = self .board_type ))
163
172
164
173
if self .high_speed :
@@ -444,7 +453,7 @@ def warn(self, text):
444
453
# log how many packets where sent succesfully in between warnings
445
454
if self .log_packet_count :
446
455
logging .info ('Data packets received:' + str (self .log_packet_count ))
447
- self .log_packet_count = 0 ;
456
+ self .log_packet_count = 0
448
457
logging .warning (text )
449
458
print ("Warning: %s" % text )
450
459
@@ -472,11 +481,14 @@ def reconnect(self):
472
481
473
482
474
483
class WiFiShieldHandler (asyncore .dispatcher_with_send ):
475
- def __init__ (self , sock , callback = None , high_speed = True , parser = None ):
484
+ def __init__ (self , sock , callback = None , high_speed = True ,
485
+ parser = None , daisy = False ):
476
486
asyncore .dispatcher_with_send .__init__ (self , sock )
477
487
478
- self .high_speed = high_speed
479
488
self .callback = callback
489
+ self .daisy = daisy
490
+ self .high_speed = high_speed
491
+ self .last_odd_sample = OpenBCISample ()
480
492
self .parser = parser if parser is not None else ParseRaw (gains = [24 , 24 , 24 , 24 , 24 , 24 , 24 , 24 ])
481
493
482
494
def handle_read (self ):
@@ -490,8 +502,22 @@ def handle_read(self):
490
502
samples = self .parser .transform_raw_data_packets_to_sample (raw_data_packets = raw_data_packets )
491
503
492
504
for sample in samples :
493
- if self .callback is not None :
494
- self .callback (sample )
505
+ # if a daisy module is attached, wait to concatenate two samples (main board + daisy)
506
+ # before passing it to callback
507
+ if self .daisy :
508
+ # odd sample: daisy sample, save for later
509
+ if ~ sample .sample_number % 2 :
510
+ self .last_odd_sample = sample
511
+ # even sample: concatenate and send if last sample was the fist part, otherwise drop the packet
512
+ elif sample .sample_number - 1 == self .last_odd_sample .sample_number :
513
+ # the aux data will be the average between the two samples, as the channel
514
+ # samples themselves have been averaged by the board
515
+ daisy_sample = self .parser .make_daisy_sample_object_wifi (self .last_odd_sample , sample )
516
+ if self .callback is not None :
517
+ self .callback (daisy_sample )
518
+ else :
519
+ if self .callback is not None :
520
+ self .callback (sample )
495
521
496
522
else :
497
523
try :
@@ -516,11 +542,12 @@ def handle_read(self):
516
542
517
543
class WiFiShieldServer (asyncore .dispatcher ):
518
544
519
- def __init__ (self , host , port , callback = None , gains = None , high_speed = True ):
545
+ def __init__ (self , host , port , callback = None , gains = None , high_speed = True , daisy = False ):
520
546
asyncore .dispatcher .__init__ (self )
521
547
self .create_socket (socket .AF_INET , socket .SOCK_STREAM )
522
548
self .set_reuse_addr ()
523
549
self .bind ((host , port ))
550
+ self .daisy = daisy
524
551
self .listen (5 )
525
552
self .callback = None
526
553
self .handler = None
@@ -532,13 +559,19 @@ def handle_accept(self):
532
559
if pair is not None :
533
560
sock , addr = pair
534
561
print 'Incoming connection from %s' % repr (addr )
535
- self .handler = WiFiShieldHandler (sock , self .callback , high_speed = self .high_speed , parser = self .parser )
562
+ self .handler = WiFiShieldHandler (sock , self .callback , high_speed = self .high_speed ,
563
+ parser = self .parser , daisy = self .daisy )
536
564
537
565
def set_callback (self , callback ):
538
566
self .callback = callback
539
567
if self .handler is not None :
540
568
self .handler .callback = callback
541
569
570
+ def set_daisy (self , daisy ):
571
+ self .daisy = daisy
572
+ if self .handler is not None :
573
+ self .handler .daisy = daisy
574
+
542
575
def set_gains (self , gains ):
543
576
self .parser .set_ads1299_scale_factors (gains )
544
577
0 commit comments