source: trunk/Puzzlebox/Synapse/Interface_Plot.py @ 413

Last change on this file since 413 was 308, checked in by sc, 9 years ago
  • whitespace cleanup
File size: 9.3 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2011)
4#
5# This code is released under the GNU Pulic License (GPL) version 2
6# For more information please refer to http://www.gnu.org/copyleft/gpl.html
7
8__changelog__ = """\
9Last Update: 2011.12.05
10"""
11
12import os
13
14#import Puzzlebox.Synapse.Configuration as configuration
15import Configuration as configuration
16
17if configuration.ENABLE_PYSIDE:
18        try:
19                import PySide as PyQt4
20                from PySide import QtCore, QtGui
21        except:
22                print "ERROR: Exception importing PySide:",
23                print e
24                configuration.ENABLE_PYSIDE = False
25        else:
26                print "INFO: [Synapse:Interface_Plot] Using PySide module"
27                os.environ["QT_API"] = "pyside"
28                import matplotlib
29                matplotlib.use("Qt4Agg")
30
31if not configuration.ENABLE_PYSIDE:
32        print "INFO: [Synapse:Interface_Plot] Using PyQt4 module"
33        from PyQt4 import QtCore, QtGui
34
35
36### IMPORTS ###
37from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
38from matplotlib.figure import Figure
39from numpy import arange, sin, pi
40
41
42### GLOBALS ###
43
44DEBUG = configuration.DEBUG
45INTERFACE_RAW_EEG_UPDATE_FREQUENCY = 512
46
47
48#####################################################################
49
50class matplotlibCanvas(FigureCanvas):
51       
52        """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.)."""
53       
54        def __init__(self, parent=None, width=8, height=4, dpi=100, title=None):
55               
56                fig = Figure(figsize=(width, height), dpi=dpi)
57                self.axes_top = fig.add_subplot(211)
58                self.axes_bottom = fig.add_subplot(212)
59                # We want the axes cleared every time plot() is called
60                self.axes_top.hold(False)
61                self.axes_bottom.hold(False)
62               
63                if title != None:
64                        fig.suptitle(title, fontsize=12)
65               
66                FigureCanvas.__init__(self, fig)
67                self.setParent(parent)
68               
69                FigureCanvas.setSizePolicy(self,
70                                                                                        QtGui.QSizePolicy.Expanding,
71                                                                                        QtGui.QSizePolicy.Expanding)
72                FigureCanvas.updateGeometry(self)
73
74
75#####################################################################
76#####################################################################
77
78class rawEEGMatplotlibCanvas(matplotlibCanvas):
79       
80        def __init__(self,  *args, **kwargs):
81               
82                matplotlibCanvas.__init__(self, *args, **kwargs)
83               
84                self.DEBUG=DEBUG
85               
86                #timer = QtCore.QTimer(self)
87                #QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self.update_figure)
88                #timer.start(256)
89               
90                self.update_top_frequency = \
91                   INTERFACE_RAW_EEG_UPDATE_FREQUENCY
92                self.update_bottom_frequency = \
93                   INTERFACE_RAW_EEG_UPDATE_FREQUENCY / 2
94               
95                self.values_top = []
96                self.values_bottom = []
97               
98                self.axes_top.set_xbound(0, self.update_top_frequency)
99                self.axes_top.set_ybound(-2048, 2047)
100               
101                self.axes_bottom.set_xbound(0, self.update_bottom_frequency)
102                self.axes_bottom.set_ybound(-512, 512)
103               
104                self.axes_top.grid(True)
105                self.axes_bottom.grid(True)
106               
107                self.axes_top.text(self.update_top_frequency + 24, \
108                                   0, \
109                                   '1.0 seconds', \
110                                   rotation='vertical', \
111                                   verticalalignment='center')
112               
113                self.axes_bottom.text(self.update_bottom_frequency + 12, \
114                                   0, \
115                                   '0.5 seconds', \
116                                   rotation='vertical', \
117                                   verticalalignment='center')
118               
119                self.axes_top.set_autoscale_on(False)
120                self.axes_bottom.set_autoscale_on(False)
121       
122       
123        ##################################################################
124       
125        def update_figure(self, value):
126               
127                self.values_top.append(value)
128                self.values_bottom.append(value)
129               
130                if len(self.values_top) == self.update_top_frequency:
131                       
132                        self.axes_top.plot(range(self.update_top_frequency), \
133                                       self.values_top, \
134                                       'b-', \
135                                       scalex=False, \
136                                       scaley=False)
137                       
138                        #self.axes_top.set_ylabel('%i Hz' % self.update_top_frequency)
139                        self.axes_top.grid(True)
140                       
141                        self.axes_top.text(self.update_top_frequency + 24, \
142                                           0, \
143                                           '1.0 seconds', \
144                                           rotation='vertical', \
145                                           verticalalignment='center')
146                       
147                        self.draw()
148                       
149                        self.values_top = []
150               
151               
152                if len(self.values_bottom) == self.update_bottom_frequency:
153                       
154                        self.axes_bottom.plot(range(self.update_bottom_frequency), \
155                                       self.values_bottom, \
156                                       'r-', \
157                                       scalex=False, \
158                                       scaley=False)
159                       
160                        #self.axes_bottom.set_ylabel('%i Hz' % self.update_bottom_frequency)
161                        self.axes_bottom.grid(True)
162                       
163                        self.axes_bottom.text(self.update_bottom_frequency + 12, \
164                                           0, \
165                                           '0.5 seconds', \
166                                           rotation='vertical', \
167                                           verticalalignment='center')
168                       
169                        self.draw()
170                       
171                        self.values_bottom = []
172
173
174#####################################################################
175#####################################################################
176
177class chartEEGMatplotlibCanvas(matplotlibCanvas):
178       
179        def __init__(self,  *args, **kwargs):
180               
181                matplotlibCanvas.__init__(self, *args, **kwargs)
182               
183                self.DEBUG=DEBUG
184               
185                self.graph_length = 30
186               
187                self.values_eeg_bands = {}
188               
189                for key in configuration.THINKGEAR_EEG_POWER_BAND_ORDER:
190                        self.values_eeg_bands[key] = []
191                        for x in range(self.graph_length):
192                                self.values_eeg_bands[key].append(0)
193               
194               
195                self.values_esense = {'attention': [], \
196                                      'meditation': []}
197               
198                for key in self.values_esense.keys():
199                        for x in range(self.graph_length):
200                                self.values_esense[key].append(0)
201               
202               
203                self.axes_top.set_xbound(self.graph_length, 0)
204                self.axes_top.set_ybound(0, 100)
205               
206                self.axes_bottom.set_xbound(self.graph_length, 0)
207                self.axes_bottom.set_ybound(0, 100)
208               
209                self.axes_top.grid(True)
210                self.axes_bottom.grid(True)
211               
212                self.axes_top.text(self.graph_length + 1, \
213                                   50, \
214                                   'Frequency Bands', \
215                                   rotation='vertical', \
216                                   verticalalignment='center')
217               
218                self.axes_bottom.text(self.graph_length + 1, \
219                                   50, \
220                                   'eSense Values', \
221                                   rotation='vertical', \
222                                   verticalalignment='center')
223               
224                self.axes_top.set_autoscale_on(False)
225                self.axes_bottom.set_autoscale_on(False)
226       
227       
228        ##################################################################
229       
230        def update_values(self, index, values):
231               
232                if (index == 'eegPower'):
233                       
234                        for key in values.keys():
235                                self.values_eeg_bands[key].append(values[key])
236                                self.values_eeg_bands[key] = \
237                                        self.values_eeg_bands[key][1:]         
238               
239               
240                elif (index == 'eSense'):
241                       
242                        for key in values.keys():
243                               
244                                self.values_esense[key].append(values[key])
245                                self.values_esense[key] = \
246                                        self.values_esense[key][1:]
247       
248       
249        ##################################################################
250       
251        def update_figure(self, index, values):
252               
253                if (index == 'eegPower'):
254                       
255                        label_values = self.axes_top.plot(range(self.graph_length), \
256                                           #self.values_eeg_bands['delta'], \
257                                           #configuration.INTERFACE_CHART_STYLES['delta'], \
258                                           #self.values_eeg_bands['theta'], \
259                                           #configuration.INTERFACE_CHART_STYLES['theta'], \
260                                           self.values_eeg_bands['lowAlpha'], \
261                                           configuration.INTERFACE_CHART_STYLES['lowAlpha'], \
262                                           self.values_eeg_bands['highAlpha'], \
263                                           configuration.INTERFACE_CHART_STYLES['highAlpha'], \
264                                           self.values_eeg_bands['lowBeta'], \
265                                           configuration.INTERFACE_CHART_STYLES['lowBeta'], \
266                                           self.values_eeg_bands['highBeta'], \
267                                           configuration.INTERFACE_CHART_STYLES['highBeta'], \
268                                           #self.values_eeg_bands['lowGamma'], \
269                                           #configuration.INTERFACE_CHART_STYLES['lowGamma'], \
270                                           #self.values_eeg_bands['highGamma'], \
271                                           #configuration.INTERFACE_CHART_STYLES['highGamma'], \
272                                           scalex=False, \
273                                           scaley=True)
274                       
275                        self.axes_top.grid(True)
276                       
277                        self.axes_top.text(self.graph_length + 1, \
278                                           50, \
279                                           '                            Frequency Bands', \
280                                           rotation='vertical', \
281                                           verticalalignment='center')
282                       
283                        self.axes_top.legend( \
284                           (label_values[0], label_values[1], label_values[2], label_values[3]), \
285                           ('LowAlpha', 'HighAlpha', 'LowBeta', 'HighBeta'), \
286                           loc='center left')
287                       
288                        self.draw()
289               
290               
291                elif (index == 'eSense'):
292                       
293                        label_values = self.axes_bottom.plot(range(self.graph_length), \
294                                              self.values_esense['attention'], \
295                                              configuration.INTERFACE_CHART_STYLES['attention'], \
296                                              self.values_esense['meditation'], \
297                                              configuration.INTERFACE_CHART_STYLES['meditation'], \
298                                              scalex=False, \
299                                              scaley=False)
300                       
301                       
302                        self.axes_bottom.grid(True)
303                       
304                        self.axes_bottom.text(self.graph_length + 1, \
305                                              50, \
306                                              'eSense Values', \
307                                              rotation='vertical', \
308                                              verticalalignment='center')
309                       
310                        self.axes_bottom.legend( \
311                           (label_values[0], label_values[1]), \
312                           ('Attention', 'Meditation'), \
313                           loc='lower left')
314                       
315                        self.draw()
316
Note: See TracBrowser for help on using the repository browser.