source: trunk/Puzzlebox/Synapse/Session.py @ 387

Last change on this file since 387 was 387, checked in by sc, 8 years ago
  • Adjustments to support Emotiv session recording to CSV
File size: 10.7 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2012)
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: 2012.04.09
10"""
11
12__todo__ = """
13"""
14
15### IMPORTS ###
16import os, sys, time
17
18import Puzzlebox.Synapse.Configuration as configuration
19
20if configuration.ENABLE_PYSIDE:
21        try:
22                import PySide as PyQt4
23                from PySide import QtCore, QtGui
24        except Exception, e:
25                print "ERROR: [Synapse:Session] Exception importing PySide:",
26                print e
27                configuration.ENABLE_PYSIDE = False
28        else:
29                print "INFO: [Synapse:Session] Using PySide module"
30
31if not configuration.ENABLE_PYSIDE:
32        print "INFO: [Synapse:Session] Using PyQt4 module"
33        from PyQt4 import QtCore, QtGui
34
35
36try:
37        import cPickle as pickle
38except:
39        import pickle
40
41
42#####################################################################
43# Globals
44#####################################################################
45
46DEBUG = configuration.DEBUG
47
48#####################################################################
49# Classes
50#####################################################################
51
52class puzzlebox_synapse_session(QtGui.QWidget):
53       
54        def __init__(self, log, \
55                     DEBUG=DEBUG, \
56                     parent=None, \
57                     ):
58               
59                self.log = log
60                self.DEBUG = DEBUG
61                self.parent=parent
62               
63                if self.parent == None:
64                        QtGui.QWidget.__init__(self, parent)
65                        #self.setupUi(self)
66               
67                        self.configureSettings()
68                        self.connectWidgets()
69               
70                self.name = "Synapse:Session"
71               
72               
73                if (sys.platform == 'win32'):
74                        self.homepath = os.path.join( \
75                           os.environ['HOMEDRIVE'], \
76                           os.environ['HOMEPATH'], \
77                           'Desktop')
78                elif (sys.platform == 'darwin'):
79                        desktop = os.path.join(os.environ['HOME'], 'Documents')
80                        if os.path.exists(desktop):
81                                self.homepath = desktop
82                        else:
83                                self.homepath = os.environ['HOME']
84                else:
85                        desktop = os.path.join(os.environ['HOME'], 'Desktop')
86                        if os.path.exists(desktop):
87                                self.homepath = desktop
88                        else:
89                                self.homepath = os.environ['HOME']
90               
91               
92                if not os.path.exists(self.homepath):
93                        if self.DEBUG:
94                                print "WARNING: [Synapse:Session] User default path not found"
95                        self.homepath = os.getcwd()
96       
97       
98        ##################################################################
99       
100        def configureSettings(self):
101               
102                pass
103       
104       
105        ##################################################################
106       
107        def connectWidgets(self):
108               
109                pass
110       
111       
112        ##################################################################
113       
114        def updateProfileSessionStatus(self, source=None, target=None):
115               
116                session_time = self.calculateSessionTime()
117               
118                #if source == None:
119                        #if self.parent == None:
120                                #source = self
121                        #else:
122                                #source = self.parent
123               
124                #if target == None:
125                        #if self.parent == None:
126                                #target = self
127                        #else:
128                                #target = self.parent
129               
130                #target.textLabelSessionTime.setText(session_time)
131                self.textLabelSessionTime.setText(session_time)
132               
133                try:
134                        #target.textLabelPacketsReceived.setText( "%i" % \
135                                #source.synapseServer.protocol.packet_count)
136                        self.textLabelPacketsReceived.setText( "%i" % \
137                                self.synapseServer.protocol.packet_count)
138                except:
139                        pass
140               
141                try:
142                        #target.textLabelPacketsDropped.setText( "%i" % \
143                                #source.synapseServer.protocol.bad_packets)
144                        self.textLabelPacketsDropped.setText( "%i" % \
145                                self.synapseServer.protocol.bad_packets)
146                except:
147                        pass
148       
149       
150        ##################################################################
151       
152        def calculateSessionTime(self):
153               
154                #if self.parent == None:
155                        #server = self.synapseServer
156                #else:
157                        #server = self.parent.synapseServer
158               
159                session_time = time.time() - \
160                        self.synapseServer.session_start_timestamp
161                        #server.session_start_timestamp
162                        #server.protocol.session_start_timestamp
163               
164                session_time = int(session_time)
165               
166                session_time = self.convert_seconds_to_datetime(session_time)
167               
168                return(session_time)
169       
170       
171        ##################################################################
172       
173        def collectData(self, source=None, target=None):
174               
175                if source == None:
176                        if self.parent == None:
177                                source = self
178                        else:
179                                source = self.parent
180               
181                if target == None:
182                        if self.parent == None:
183                                target = self
184                        else:
185                                target = self.parent
186               
187                data = {}
188               
189                data['rawEeg'] = source.packets['rawEeg']
190                data['signals'] = source.packets['signals']
191               
192                data['sessionTime'] = self.calculateSessionTime()
193               
194                data['profileName'] = str(target.lineEditSessionProfile.text())
195               
196                return(data)
197       
198       
199        ##################################################################
200       
201        def parseTimeStamp(self, timestamp, local_version=False, truncate_time_zone=False):
202               
203                try:
204                        decimal = '%f' % timestamp
205                        decimal = decimal.split('.')[1]
206                except:
207                        decimal = '0'
208               
209                localtime = time.localtime(timestamp)
210               
211                if local_version:
212                        date = time.strftime('%x', localtime)
213                        localtime = time.strftime('%X', localtime)
214               
215                elif truncate_time_zone:
216                        date = time.strftime('%Y-%m-%d', localtime)
217                        localtime = time.strftime('%H:%M:%S', localtime)
218                        localtime = '%s.%s' % (localtime, decimal[:3])
219               
220                else:
221                        date = time.strftime('%Y-%m-%d', localtime)
222                        localtime = time.strftime('%H:%M:%S', localtime)
223                        localtime = '%s.%s %s' % (localtime, decimal, \
224                                       time.strftime('%Z', time.localtime(timestamp)))
225               
226               
227                return(date, localtime)
228       
229       
230        ##################################################################
231       
232        def saveData(self, source=None, target=None, output_file=None, use_default=False):
233               
234                if source == None:
235                        if self.parent == None:
236                                source = self
237                        else:
238                                source = self.parent
239               
240                if target == None:
241                        if self.parent == None:
242                                target = self
243                        else:
244                                target = self.parent
245               
246                data = self.collectData(source=source, target=target)
247               
248                (date, localtime) = self.parseTimeStamp(time.time())
249               
250                default_filename = '%s %s.synapse' % (date, \
251                                      target.lineEditSessionProfile.text())
252                                     
253                default_filename = os.path.join(self.homepath, default_filename)
254               
255                if output_file == None:
256                       
257                        # use_default controls whether or not a file is automatically saves using the
258                        # default name and path (as opposed to raising a GUI file selection menu)
259                        # whenever an explicit filepath is not defined
260                        if use_default:
261                                       
262                                        output_file = default_filename
263                       
264                        else:
265                       
266                                output_file = QtGui.QFileDialog.getSaveFileName(parent=target, \
267                                                 caption="Save Session Data to File", \
268                                                 dir=default_filename, \
269                                                 filter="Puzzlebox Synapse Data File (*.synapse)")
270                               
271                                try:
272                                        output_file = output_file[0]
273                                except:
274                                        output_file = ''
275               
276               
277                if output_file == '':
278                        return
279               
280                file = open(str(output_file), 'w')
281                pickle.dump(data, file)
282                file.close()
283       
284       
285        ##################################################################
286       
287        def exportData(self, parent=None, source=None, target=None, output_file=None, use_default=False):
288               
289                if parent == None:
290                        if self.parent == None:
291                                parent = self
292                        else:
293                                parent = self.parent
294               
295                if source == None:
296                        if self.parent == None:
297                                source = self
298                        else:
299                                source = self.parent
300               
301                if target == None:
302                        if self.parent == None:
303                                target = self
304                        else:
305                                target = self.parent
306               
307               
308                (date, localtime) = self.parseTimeStamp(time.time())
309               
310                default_filename = '%s %s.csv' % (date, \
311                                      target.lineEditSessionProfile.text())
312               
313                default_filename = os.path.join(target.homepath, default_filename)
314               
315               
316                if output_file == None:
317                       
318                        # use_default controls whether or not a file is automatically saves using the
319                        # default name and path (as opposed to raising a GUI file selection menu)
320                        # whenever an explicit filepath is not defined
321                        if use_default:
322                                       
323                                        output_file = default_filename
324                       
325                        else:
326                                output_file = QtGui.QFileDialog.getSaveFileName(parent=target, \
327                                                 caption="Export Session Data to File", \
328                                                 dir=default_filename, \
329                                                 filter="CSV File (*.csv);;Text File (*.txt)")
330                               
331                                try:
332                                        output_file = output_file[0]
333                                except:
334                                        output_file = ''
335               
336               
337                if output_file == '':
338                        return
339               
340               
341                if str(output_file).endswith('.csv'):
342                       
343                        outputData = self.exportDataToCSV(parent=parent, source=source, target=target)
344               
345               
346                else:
347                       
348                        try:
349                                outputData = self.textEditDebugConsole.toPlainText()
350                        except:
351                                outputData = self.exportDataToCSV()
352               
353               
354                file = open(str(output_file), 'w')
355                file.write(outputData)
356                file.close()
357       
358       
359        ##################################################################
360       
361        def exportDataToCSV(self, parent=None, source=None, target=None):
362               
363                #if parent == None:
364                        #if self.parent == None:
365                                #parent = self
366                        #else:
367                                #parent = self.parent
368               
369                #if source == None:
370                        #if self.parent == None:
371                                #source = self
372                        #else:
373                                #source = self.parent
374               
375                #if target == None:
376                        #if self.parent == None:
377                                #target = self
378                        #else:
379                                #target = self.parent
380               
381                #try:
382                        #truncate_csv_timezone = target.configuration.EXPORT_CSV_TRUNCATE_TIMEZONE
383                #except:
384                        #truncate_csv_timezone = False
385               
386                #try:
387                        #scrub_data = target.configuration.EXPORT_CSV_SCRUB_DATA
388                #except:
389                        #scrub_data = False
390               
391                output = ''
392               
393                if self.synapseServer != None:
394                        #output = self.synapseServer.exportDataToCSV(parent=self.parent, source=self)
395                        output = self.synapseServer.exportDataToCSV(parent=parent, source=source, target=target)
396               
397               
398                return(output)
399       
400       
401        ##################################################################
402       
403        def resetData(self, source=None):
404               
405                if source == None:
406                        if self.parent == None:
407                                source = self
408                        else:
409                                source = self.parent
410               
411                source.packets['rawEeg'] = []
412                source.packets['signals'] = []
413               
414                #source.synapseServer.protocol.session_start_timestamp = \
415                        #time.time()
416                self.synapseServer.protocol.resetSessionStartTime()
417               
418                source.synapseServer.protocol.packet_count = 0
419                source.synapseServer.protocol.bad_packets = 0
420               
421                self.updateProfileSessionStatus()
422               
423                try:
424                        source.textEditDebugConsole.setText("")
425                except:
426                        pass
427       
428       
429        #####################################################################
430       
431        def convert_seconds_to_datetime(self, duration):
432               
433                duration_hours = duration / (60 * 60)
434                duration_minutes = (duration - (duration_hours * (60 * 60))) / 60
435                duration_seconds = (duration - (duration_hours * (60 * 60)) - (duration_minutes * 60))
436               
437                duration_hours = '%i' % duration_hours
438                if (len(duration_hours) == 1):
439                        duration_hours = "0%s" % duration_hours
440               
441                duration_minutes = '%i' % duration_minutes
442                if (len(duration_minutes) == 1):
443                        duration_minutes = "0%s" % duration_minutes
444               
445                duration_seconds = '%i' % duration_seconds
446                if (len(duration_seconds) == 1):
447                        duration_seconds = "0%s" % duration_seconds
448               
449                datetime = '%s:%s:%s' % (duration_hours, duration_minutes, duration_seconds)
450               
451                return(datetime)
452
Note: See TracBrowser for help on using the repository browser.