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

Last change on this file since 389 was 389, checked in by sc, 8 years ago
  • work underway to shift session data management from Synapse:ThinkGear:Protocol to Synapse:Session
File size: 10.5 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.synapseServer != None:
155                        session_time = time.time() - \
156                                        self.synapseServer.session_start_timestamp
157                        session_time = int(session_time)
158                else:
159                        #session_time = int( self.session_start_timestamp )
160                        session_time = int( self.parent.session_start_timestamp )
161               
162                session_time = self.convert_seconds_to_datetime(session_time)
163               
164                return(session_time)
165       
166       
167        ##################################################################
168       
169        def collectData(self, source=None, target=None):
170               
171                if source == None:
172                        if self.parent == None:
173                                source = self
174                        else:
175                                source = self.parent
176               
177                if target == None:
178                        if self.parent == None:
179                                target = self
180                        else:
181                                target = self.parent
182               
183                data = {}
184               
185                data['rawEeg'] = source.packets['rawEeg']
186                data['signals'] = source.packets['signals']
187               
188                data['sessionTime'] = self.calculateSessionTime()
189               
190                data['profileName'] = str(target.lineEditSessionProfile.text())
191               
192                return(data)
193       
194       
195        ##################################################################
196       
197        def parseTimeStamp(self, timestamp, local_version=False, truncate_time_zone=False):
198               
199                try:
200                        decimal = '%f' % timestamp
201                        decimal = decimal.split('.')[1]
202                except:
203                        decimal = '0'
204               
205                localtime = time.localtime(timestamp)
206               
207                if local_version:
208                        date = time.strftime('%x', localtime)
209                        localtime = time.strftime('%X', localtime)
210               
211                elif truncate_time_zone:
212                        date = time.strftime('%Y-%m-%d', localtime)
213                        localtime = time.strftime('%H:%M:%S', localtime)
214                        localtime = '%s.%s' % (localtime, decimal[:3])
215               
216                else:
217                        date = time.strftime('%Y-%m-%d', localtime)
218                        localtime = time.strftime('%H:%M:%S', localtime)
219                        localtime = '%s.%s %s' % (localtime, decimal, \
220                                       time.strftime('%Z', time.localtime(timestamp)))
221               
222               
223                return(date, localtime)
224       
225       
226        ##################################################################
227       
228        def saveData(self, source=None, target=None, output_file=None, use_default=False):
229               
230                if source == None:
231                        if self.parent == None:
232                                source = self
233                        else:
234                                source = self.parent
235               
236                if target == None:
237                        if self.parent == None:
238                                target = self
239                        else:
240                                target = self.parent
241               
242                data = self.collectData(source=source, target=target)
243               
244                (date, localtime) = self.parseTimeStamp(time.time())
245               
246                default_filename = '%s %s.synapse' % (date, \
247                                      target.lineEditSessionProfile.text())
248                                     
249                default_filename = os.path.join(self.homepath, default_filename)
250               
251                if output_file == None:
252                       
253                        # use_default controls whether or not a file is automatically saves using the
254                        # default name and path (as opposed to raising a GUI file selection menu)
255                        # whenever an explicit filepath is not defined
256                        if use_default:
257                                       
258                                        output_file = default_filename
259                       
260                        else:
261                       
262                                output_file = QtGui.QFileDialog.getSaveFileName(parent=target, \
263                                                 caption="Save Session Data to File", \
264                                                 dir=default_filename, \
265                                                 filter="Puzzlebox Synapse Data File (*.synapse)")
266                               
267                                try:
268                                        output_file = output_file[0]
269                                except:
270                                        output_file = ''
271               
272               
273                if output_file == '':
274                        return
275               
276                file = open(str(output_file), 'w')
277                pickle.dump(data, file)
278                file.close()
279       
280       
281        ##################################################################
282       
283        def exportData(self, parent=None, source=None, target=None, output_file=None, use_default=False):
284               
285                if parent == None:
286                        if self.parent == None:
287                                parent = self
288                        else:
289                                parent = self.parent
290               
291                if source == None:
292                        if self.parent == None:
293                                source = self
294                        else:
295                                source = self.parent
296               
297                if target == None:
298                        if self.parent == None:
299                                target = self
300                        else:
301                                target = self.parent
302               
303               
304                (date, localtime) = self.parseTimeStamp(time.time())
305               
306                default_filename = '%s %s.csv' % (date, \
307                                      target.lineEditSessionProfile.text())
308               
309                default_filename = os.path.join(target.homepath, default_filename)
310               
311               
312                if output_file == None:
313                       
314                        # use_default controls whether or not a file is automatically saves using the
315                        # default name and path (as opposed to raising a GUI file selection menu)
316                        # whenever an explicit filepath is not defined
317                        if use_default:
318                                       
319                                        output_file = default_filename
320                       
321                        else:
322                                output_file = QtGui.QFileDialog.getSaveFileName(parent=target, \
323                                                 caption="Export Session Data to File", \
324                                                 dir=default_filename, \
325                                                 filter="CSV File (*.csv);;Text File (*.txt)")
326                               
327                                try:
328                                        output_file = output_file[0]
329                                except:
330                                        output_file = ''
331               
332               
333                if output_file == '':
334                        return
335               
336               
337                if str(output_file).endswith('.csv'):
338                       
339                        outputData = self.exportDataToCSV(parent=parent, source=source, target=target)
340               
341               
342                else:
343                       
344                        try:
345                                outputData = self.textEditDebugConsole.toPlainText()
346                        except:
347                                outputData = self.exportDataToCSV()
348               
349               
350                file = open(str(output_file), 'w')
351                file.write(outputData)
352                file.close()
353       
354       
355        ##################################################################
356       
357        def exportDataToCSV(self, parent=None, source=None, target=None):
358               
359                output = ''
360               
361                if self.synapseServer != None:
362                        #output = self.synapseServer.exportDataToCSV(parent=self.parent, source=self)
363                        output = self.synapseServer.exportDataToCSV(parent=parent, source=source, target=target)
364               
365                else:
366                       
367                        if self.DEBUG:
368                                print "ERROR: exportDataToCSV exists in synapseServer object which is not in use"
369               
370                return(output)
371       
372       
373        ##################################################################
374       
375        def resetData(self, source=None):
376               
377                if source == None:
378                        if self.parent == None:
379                                source = self
380                        else:
381                                source = self.parent
382               
383                source.packets['rawEeg'] = []
384                source.packets['signals'] = []
385               
386                if self.synapseServer != None:
387                        self.synapseServer.protocol.resetSessionStartTime()
388                else:
389                        self.resetSessionStartTime()
390               
391                if self.synapseServer != None:
392                        source.synapseServer.protocol.packet_count = 0
393                        source.synapseServer.protocol.bad_packets = 0
394                else:
395                        source.packet_count = 0
396                        source.bad_packets = 0
397               
398                self.updateProfileSessionStatus()
399               
400                try:
401                        source.textEditDebugConsole.setText("")
402                except:
403                        pass
404       
405       
406        #####################################################################
407       
408        def resetSessionStartTime(self, source=None):
409               
410                self.session_start_timestamp = time.time()
411               
412               
413        #####################################################################
414       
415        def convert_seconds_to_datetime(self, duration):
416               
417                duration_hours = duration / (60 * 60)
418                duration_minutes = (duration - (duration_hours * (60 * 60))) / 60
419                duration_seconds = (duration - (duration_hours * (60 * 60)) - (duration_minutes * 60))
420               
421                duration_hours = '%i' % duration_hours
422                if (len(duration_hours) == 1):
423                        duration_hours = "0%s" % duration_hours
424               
425                duration_minutes = '%i' % duration_minutes
426                if (len(duration_minutes) == 1):
427                        duration_minutes = "0%s" % duration_minutes
428               
429                duration_seconds = '%i' % duration_seconds
430                if (len(duration_seconds) == 1):
431                        duration_seconds = "0%s" % duration_seconds
432               
433                datetime = '%s:%s:%s' % (duration_hours, duration_minutes, duration_seconds)
434               
435                return(datetime)
436
Note: See TracBrowser for help on using the repository browser.