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

Last change on this file since 304 was 304, checked in by sc, 10 years ago

Interface:

  • Fixed Bluetooth scanning for devices under recent distributions of Linux
  • added hcitoolScanForRemoteDevices
  • added hcitoolGetActiveConnections

Various:

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