Loading openflexure_microscope/camera/base.py +18 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import time import io import threading from PIL import Image import datetime import logging try: Loading Loading @@ -33,6 +34,11 @@ def entry_by_id(id: str, object_list: list): return found def generate_basename(): """Return a default filename based on the capture datetime""" return datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") class CameraEvent(object): """ A frame-signaller object used by any instances or subclasses of BaseCamera. Loading Loading @@ -222,6 +228,18 @@ class BaseCamera(object): self.videos, shunt_others=shunt_others) # INTELLIGENTLY GENERATE FILENAMES def generate_basename(self, obj_list: list) -> str: initial_basename = generate_basename() basename = initial_basename # Handle clashing iterator = 1 while basename in [obj.basename for obj in obj_list]: basename = initial_basename + "_{}".format(iterator) iterator += 1 return basename # WORKER THREAD def _thread(self): Loading openflexure_microscope/camera/capture.py +10 −26 Original line number Diff line number Diff line Loading @@ -29,20 +29,10 @@ class StreamObject(object): # Store file format self.format = fmt # Create file name iterator = 0 f_path, f_name = self.build_file_path(filename, folder, fmt) while os.path.isfile(f_name): # While file already exists iterator += 1 # Add a file name iterator f_path, f_name = self.build_file_path( filename, folder, fmt, iterator=iterator) # Rebuild file name self.file = f_path self.filename = f_name # Create file name. Default to UUID if not filename: filename = self.id self.build_file_path(filename, folder, fmt) # Byte stream properties self.stream = io.BytesIO() # Byte stream that data will be written to Loading Loading @@ -85,21 +75,13 @@ class StreamObject(object): self, filename: str, folder: str, fmt: str, iterator: int=0) -> str: fmt: str): """ Construct a full file path, based on filename, folder, and file format. Defaults to datestamp. Iterator adds a numeric increment to the file name. """ if filename: file_name = "{}.{}".format(filename, fmt) else: file_name_base = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") if iterator: file_name_base = "{}_{}".format(file_name_base, iterator) file_name = "{}.{}".format(file_name_base, fmt) # Create folder and file if folder: Loading @@ -110,7 +92,9 @@ class StreamObject(object): else: file_path = file_name return (file_path, file_name) self.basename = filename self.file = file_path self.filename = file_name def lock(self): """Set locked flag to True.""" Loading openflexure_microscope/camera/pi.py +22 −12 Original line number Diff line number Diff line Loading @@ -238,11 +238,13 @@ class StreamingCamera(BaseCamera): # If no target is specified, store to StreamingCamera if not target: # Create a new video and add to the video list target_obj = self.new_video(StreamObject( target_obj = self.new_video( StreamObject( write_to_file=write_to_file, filename=filename, folder=folder, fmt=fmt)) fmt=fmt) ) # Lock the StreamObject while recording target_obj.lock() Loading Loading @@ -355,15 +357,23 @@ class StreamingCamera(BaseCamera): fmt (str): Format of the capture. resize ((int, int)): Resize the captured image. """ # If no filename is specified, build a non-clashing one if not filename: filename = self.generate_basename(self.images) logging.debug(filename) # If no target is specified, store to StreamingCamera if not target: # TODO: Handle clashing file names here instead of in capture method. # Create a new image and add to the image list target_obj = self.new_image(StreamObject( target_obj = self.new_image( StreamObject( write_to_file=write_to_file, keep_on_disk=keep_on_disk, filename=filename, folder=folder, fmt=fmt)) fmt=fmt) ) target = target_obj.target # Store to the StreamObject BytesIO else: Loading Loading
openflexure_microscope/camera/base.py +18 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ import time import io import threading from PIL import Image import datetime import logging try: Loading Loading @@ -33,6 +34,11 @@ def entry_by_id(id: str, object_list: list): return found def generate_basename(): """Return a default filename based on the capture datetime""" return datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") class CameraEvent(object): """ A frame-signaller object used by any instances or subclasses of BaseCamera. Loading Loading @@ -222,6 +228,18 @@ class BaseCamera(object): self.videos, shunt_others=shunt_others) # INTELLIGENTLY GENERATE FILENAMES def generate_basename(self, obj_list: list) -> str: initial_basename = generate_basename() basename = initial_basename # Handle clashing iterator = 1 while basename in [obj.basename for obj in obj_list]: basename = initial_basename + "_{}".format(iterator) iterator += 1 return basename # WORKER THREAD def _thread(self): Loading
openflexure_microscope/camera/capture.py +10 −26 Original line number Diff line number Diff line Loading @@ -29,20 +29,10 @@ class StreamObject(object): # Store file format self.format = fmt # Create file name iterator = 0 f_path, f_name = self.build_file_path(filename, folder, fmt) while os.path.isfile(f_name): # While file already exists iterator += 1 # Add a file name iterator f_path, f_name = self.build_file_path( filename, folder, fmt, iterator=iterator) # Rebuild file name self.file = f_path self.filename = f_name # Create file name. Default to UUID if not filename: filename = self.id self.build_file_path(filename, folder, fmt) # Byte stream properties self.stream = io.BytesIO() # Byte stream that data will be written to Loading Loading @@ -85,21 +75,13 @@ class StreamObject(object): self, filename: str, folder: str, fmt: str, iterator: int=0) -> str: fmt: str): """ Construct a full file path, based on filename, folder, and file format. Defaults to datestamp. Iterator adds a numeric increment to the file name. """ if filename: file_name = "{}.{}".format(filename, fmt) else: file_name_base = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S") if iterator: file_name_base = "{}_{}".format(file_name_base, iterator) file_name = "{}.{}".format(file_name_base, fmt) # Create folder and file if folder: Loading @@ -110,7 +92,9 @@ class StreamObject(object): else: file_path = file_name return (file_path, file_name) self.basename = filename self.file = file_path self.filename = file_name def lock(self): """Set locked flag to True.""" Loading
openflexure_microscope/camera/pi.py +22 −12 Original line number Diff line number Diff line Loading @@ -238,11 +238,13 @@ class StreamingCamera(BaseCamera): # If no target is specified, store to StreamingCamera if not target: # Create a new video and add to the video list target_obj = self.new_video(StreamObject( target_obj = self.new_video( StreamObject( write_to_file=write_to_file, filename=filename, folder=folder, fmt=fmt)) fmt=fmt) ) # Lock the StreamObject while recording target_obj.lock() Loading Loading @@ -355,15 +357,23 @@ class StreamingCamera(BaseCamera): fmt (str): Format of the capture. resize ((int, int)): Resize the captured image. """ # If no filename is specified, build a non-clashing one if not filename: filename = self.generate_basename(self.images) logging.debug(filename) # If no target is specified, store to StreamingCamera if not target: # TODO: Handle clashing file names here instead of in capture method. # Create a new image and add to the image list target_obj = self.new_image(StreamObject( target_obj = self.new_image( StreamObject( write_to_file=write_to_file, keep_on_disk=keep_on_disk, filename=filename, folder=folder, fmt=fmt)) fmt=fmt) ) target = target_obj.target # Store to the StreamObject BytesIO else: Loading