DreamTeam/parser.py
Jump to navigation
Jump to search
import struct
from time import time
from numpy import mean
import serial
"""
work in progress - refactoring data acquisition routines - df 15 May 2013
original code from https://github.com/akloster/python-mindwave
"""
class MindWavePacketCodeVals:
def __init__(self):
self.standby = 0xd4
self.connected = 0xd0
self.raw_value = 0x80
self.poor_signal = 0x02
self.esense_attention = 0x04
self.esense_meditation = 0x05
self.sensor_data = 0x83
class MindWaveSerialPort:
def __init__(self):
self.port = '/dev/ttyUSB0'
self.baudrate = 115200
self.timeout = 0.0001
self.dongle = serial.Serial(port=self.port, baudrate=self.baudrate, timeout=self.timeout)
class Parser:
def __init__(self):
self.parser = self.run()
self.parser.next() # wtf ? mmmkay ... df 15 May 2013
self.current_vector = []
self.raw_values = []
self.current_meditation = 0
self.current_attention= 0
self.current_spectrum = []
self.sending_data = False
self.state ="initializing"
self.raw_file = None
self.esense_file = None
self.packet_code = MindWavePacketCodeVals()
self.serial = MindWaveSerialPort()
self.dongle = self.serial.dongle
def update(self):
bytes = self.dongle.read(1000)
for b in bytes:
self.parser.send(ord(b)) # Send each byte to the generator
def write_serial(self, string):
self.dongle.write(string)
def start_raw_recording(self, file_name):
self.raw_file = file(file_name, "wt")
self.raw_start_time = time()
def start_esense_recording(self, file_name):
self.esense_file = file(file_name, "wt")
self.esense_start_time = time()
def stop_raw_recording(self):
if self.raw_file:
self.raw_file.close()
self.raw_file = None
def stop_esense_recording(self):
if self.esense_file:
self.esense_file.close()
self.esense_file = None
def run(self):
"""
This generator is a convoluted mess - df May 2013
"""
self.buffer_len = 512*3 # hmmm ... - df May 2013
while 1:
# first, check packet sync
# packet synced by 0xaa 0xaa
byte = yield
if byte == 0xaa:
byte = yield
if byte != 0xaa:
continue # sync failed
else:
continue # sync failed
# packet sync confirmed
# read length and code
packet_length = yield
packet_code = yield
if packet_code == 0xd4:
# standing by
self.dongle_state= "standby"
continue
elif packet_code == 0xd0:
self.dongle_state = "connected"
continue
self.sending_data = True
left = packet_length - 2
while left > 0:
if packet_code == 0x80: # raw value
row_length = yield
a = yield
b = yield
value = struct.unpack("<h",chr(a)+chr(b))[0]
self.raw_values.append( value )
if len(self.raw_values) > self.buffer_len:
self.raw_values = self.raw_values[ -self.buffer_len: ]
left -= 2
if self.raw_file:
t = time() - self.raw_start_time
self.raw_file.write("%.4f,%i\n" %(t, value))
elif packet_code == 0x02: # Poor signal
a = yield
self.poor_signal = a
if a > 0:
pass
left -= 1
elif packet_code == 0x04: # Attention (eSense)
a = yield
if a > 0 :
v = struct.unpack("b",chr(a))[0]
if v > 0:
self.current_attention = v
if self.esense_file:
self.esense_file.write("%.2f,,%i\n" % (time()-self.esense_start_time, v))
left -= 1
elif packet_code == 0x05: # Meditation (eSense)
a = yield
if a > 0:
v = struct.unpack("b",chr(a))[0]
if v > 0:
self.current_meditation = v
if self.esense_file:
self.esense_file.write("%.2f,%i,\n" % (time()-self.esense_start_time, v))
left -= 1
elif packet_code == 0x83:
vlength = yield
self.current_vector = []
for row in range(8):
a = yield
b = yield
c = yield
value = a*255*255+b*255+c
self.current_vector.append(value)
left -= vlength
packet_code = yield