<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.extremist.software/index.php?action=history&amp;feed=atom&amp;title=DreamTeam%2Fparser.py</id>
	<title>DreamTeam/parser.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.extremist.software/index.php?action=history&amp;feed=atom&amp;title=DreamTeam%2Fparser.py"/>
	<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=DreamTeam/parser.py&amp;action=history"/>
	<updated>2026-04-07T08:21:18Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.13</generator>
	<entry>
		<id>https://wiki.extremist.software/index.php?title=DreamTeam/parser.py&amp;diff=31379&amp;oldid=prev</id>
		<title>Danf: work in progress</title>
		<link rel="alternate" type="text/html" href="https://wiki.extremist.software/index.php?title=DreamTeam/parser.py&amp;diff=31379&amp;oldid=prev"/>
		<updated>2013-05-16T02:46:41Z</updated>

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