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

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