diff --git a/PYME/Acquire/HDFSpooler.py b/PYME/Acquire/HDFSpooler.py index d16dc8542..ff01e9fbd 100755 --- a/PYME/Acquire/HDFSpooler.py +++ b/PYME/Acquire/HDFSpooler.py @@ -110,9 +110,8 @@ def __init__(self, filename, frameSource, frameShape, complevel=6, complib='zlib sp.Spooler.__init__(self, filename, frameSource, **kwargs) - def StopSpool(self): - """Stop spooling and close file""" - sp.Spooler.StopSpool(self) + def finalise(self): + """ close files""" self.h5File.flush() self.h5File.close() diff --git a/PYME/Acquire/HTTPSpooler.py b/PYME/Acquire/HTTPSpooler.py index be8a76db1..cd2135740 100644 --- a/PYME/Acquire/HTTPSpooler.py +++ b/PYME/Acquire/HTTPSpooler.py @@ -236,9 +236,7 @@ def StartSpool(self): else: clusterIO.put_file(self.seriesName + '/metadata.json', self.md.to_JSON().encode(), serverfilter=self.clusterFilter) - def StopSpool(self): - sp.Spooler.StopSpool(self) - + def finalise(self): # wait until our input queue is empty rather than immediately stopping saving. self._stopping=True logger.debug('Stopping spooling %s' % self.seriesName) diff --git a/PYME/Acquire/SpoolController.py b/PYME/Acquire/SpoolController.py index ad053e08c..cde07e6eb 100644 --- a/PYME/Acquire/SpoolController.py +++ b/PYME/Acquire/SpoolController.py @@ -470,7 +470,7 @@ def StartSpooling(self, fn=None, stack=None, compLevel=None, self.onSpoolStart.send(self) #return a function which can be called to indicate if we are done - return lambda : not self.spooler.spoolOn + return lambda : self.spooler.spool_complete @property def display_dirname(self): diff --git a/PYME/Acquire/Spooler.py b/PYME/Acquire/Spooler.py index 6d46e2696..39006ec69 100755 --- a/PYME/Acquire/Spooler.py +++ b/PYME/Acquire/Spooler.py @@ -114,6 +114,8 @@ def __init__(self, filename, frameSource, protocol = p.NullProtocol, self.spoolOn = False self.imNum = 0 + self.spool_complete = False + self._spooler_uuid = uuid.uuid4() if not fakeCamCycleTime is None: @@ -136,7 +138,7 @@ def StartSpool(self): self.protocol.Init(self) - self.doStartLog() + self._collect_start_metadata() self.frameSource.connect(self.OnFrame, dispatch_uid=self._spooler_uuid) self.spoolOn = True @@ -156,7 +158,7 @@ def StopSpool(self): try: self.protocol.OnFinish()#this may still cause events self.FlushBuffer() - self.doStopLog() + self._collect_stop_metadata() except: import traceback traceback.print_exc() @@ -172,6 +174,16 @@ def StopSpool(self): self.onSpoolStop.send(self) + self.finalise() #TODO - should this be before we send the onStopSpool signal? + self.spool_complete = True + + def finalise(self): + """ + Over-ride in derived classes to do any spooler specific tidy up - e.g. sending events to server + + """ + pass + def abort(self): """ Tidy up if something goes horribly wrong. Disconnects frame source and event logger and then calls cleanup() @@ -225,7 +237,7 @@ def OnFrame(self, **kwargs): self.StopSpool() - def doStartLog(self): + def _collect_start_metadata(self): """Record pertinant information to metadata at start of acquisition. Loops through all registered sources of start metadata and adds their entries. @@ -253,7 +265,7 @@ def doStartLog(self): self.md.copyEntriesFrom(mdt) - def doStopLog(self): + def _collect_stop_metadata(self): """Record information to metadata at end of acquisition""" self.md.setEntry('EndTime', time.time())