def __init__(self, config): self.config = config # Clean directory where pictures are saved self.savedir = osp.expanduser(config.get('GENERAL', 'directory')) if not osp.isdir(self.savedir): os.makedirs(self.savedir) if osp.isdir(self.savedir) and config.getboolean( 'GENERAL', 'clear_on_startup'): shutil.rmtree(self.savedir) os.makedirs(self.savedir) # Prepare GPIO, physical pins mode GPIO.setmode(GPIO.BOARD) # Prepare the pygame module for use os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() # Dont catch mouse motion to avoid filling the queue during long actions pygame.event.set_blocked(pygame.MOUSEMOTION) # Create window of (width, height) self.window = PtbWindow('Pibooth', config.gettyped('WINDOW', 'size'), config.getboolean('WINDOW', 'buffer')) self.state_machine = StateMachine(self) self.state_machine.add_state(StateWait()) self.state_machine.add_state( StateChoose(30)) # 30s before going back to the start self.state_machine.add_state(StateChosen(4)) self.state_machine.add_state(StateCapture()) self.state_machine.add_state(StateProcessing()) self.state_machine.add_state(StatePrint()) self.state_machine.add_state(StateFinish()) # Initialize the camera if camera.rpi_camera_connected(): cam_class = camera.RpiCamera elif camera.gp_camera_connected(): cam_class = camera.GpCamera else: raise EnvironmentError( "Neither PiCamera nor GPhoto2 camera detected") self.camera = cam_class(config.getint('CAMERA', 'iso'), config.gettyped('CAMERA', 'resolution'), config.getint('CAMERA', 'rotation'), config.getboolean('CAMERA', 'flip')) self.led_picture = PtbLed(7) self.button_picture = PtbButton( 11, config.getfloat('GENERAL', 'debounce_delay')) self.led_print = PtbLed(15) self.button_print = PtbButton( 13, config.getfloat('GENERAL', 'debounce_delay')) self.printer = PtbPrinter(config.get('PRINTER', 'printer_name')) # Variables shared between states self.dirname = None self.captures = [] self.max_captures = None self.previous_picture = None self.previous_picture_file = None
def __init__(self, config): self.config = config # Clean directory where pictures are saved self.savedir = config.getpath('GENERAL', 'directory') if not osp.isdir(self.savedir): os.makedirs(self.savedir) if osp.isdir(self.savedir) and config.getboolean('GENERAL', 'clear_on_startup'): shutil.rmtree(self.savedir) os.makedirs(self.savedir) # Prepare GPIO, physical pins mode GPIO.setmode(GPIO.BOARD) # Prepare the pygame module for use os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() # Dont catch mouse motion to avoid filling the queue during long actions pygame.event.set_blocked(pygame.MOUSEMOTION) # Create window of (width, height) self.window = PtbWindow('Pibooth', config.gettyped('WINDOW', 'size')) self.state_machine = StateMachine(self) self.state_machine.add_state(StateWait()) self.state_machine.add_state(StateChoose(30)) # 30s before going back to the start self.state_machine.add_state(StateChosen(4)) self.state_machine.add_state(StateCapture()) self.state_machine.add_state(StateProcessing()) self.state_machine.add_state(StatePrint()) self.state_machine.add_state(StateFinish(0.5)) if config.getboolean('GENERAL', 'failsafe'): self.state_machine.add_failsafe_state(StateFailSafe(2)) # Initialize the camera if camera.gp_camera_connected() and camera.rpi_camera_connected(): cam_class = camera.HybridCamera elif camera.gp_camera_connected(): cam_class = camera.GpCamera elif camera.rpi_camera_connected(): cam_class = camera.RpiCamera else: raise EnvironmentError("Neither PiCamera nor GPhoto2 camera detected") self.camera = cam_class(config.getint('CAMERA', 'iso'), config.gettyped('CAMERA', 'resolution'), config.getint('CAMERA', 'rotation'), config.getboolean('CAMERA', 'flip')) self.led_picture = PtbLed(config.getint('CONTROLS', 'picture_led_pin')) self.button_picture = PtbButton(config.getint('CONTROLS', 'picture_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_print = PtbLed(config.getint('CONTROLS', 'print_led_pin')) self.button_print = PtbButton(config.getint('CONTROLS', 'print_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_startup = PtbLed(config.getint('CONTROLS', 'startup_led_pin')) self.led_preview = PtbLed(config.getint('CONTROLS', 'preview_led_pin')) self.printer = PtbPrinter(config.get('PRINTER', 'printer_name')) # Variables shared between states self.dirname = None self.nbr_captures = None self.nbr_printed = 0 self.previous_picture = None self.previous_picture_file = None self.capture_choices = config.gettyped('PICTURE', 'captures') if isinstance(self.capture_choices, int): self.capture_choices = (self.capture_choices,) for chx in self.capture_choices: if chx not in [1, 2, 3, 4]: raise ValueError("Invalid captures number '{}'".format(chx))
def __init__(self, config): self.config = config # Clean directory where pictures are saved self.savedir = config.getpath('GENERAL', 'directory') if not osp.isdir(self.savedir): os.makedirs(self.savedir) if osp.isdir(self.savedir) and config.getboolean( 'GENERAL', 'clear_on_startup'): shutil.rmtree(self.savedir) os.makedirs(self.savedir) # Prepare GPIO, physical pins mode GPIO.setmode(GPIO.BOARD) # Prepare the pygame module for use os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() # Dont catch mouse motion to avoid filling the queue during long actions pygame.event.set_blocked(pygame.MOUSEMOTION) # Create window of (width, height) init_size = self.config.gettyped('WINDOW', 'size') if not isinstance(init_size, str): self.window = PtbWindow('Pibooth', init_size) else: self.window = PtbWindow('Pibooth') self.state_machine = StateMachine(self) self.state_machine.add_state(StateWait()) self.state_machine.add_state( StateChoose(30)) # 30s before going back to the start self.state_machine.add_state(StateChosen(4)) self.state_machine.add_state(StateCapture()) self.state_machine.add_state(StateProcessing()) self.state_machine.add_state(StatePrint()) self.state_machine.add_state(StateFinish(0.5)) # Initialize the camera. If gPhoto2 camera is used, try to kill # any process using gPhoto2 as it may block camera access if camera.gp_camera_connected() and camera.rpi_camera_connected(): cam_class = camera.HybridCamera pkill('*gphoto2*') elif camera.gp_camera_connected(): cam_class = camera.GpCamera pkill('*gphoto2*') elif camera.rpi_camera_connected(): cam_class = camera.RpiCamera elif camera.cv_camera_connected(): cam_class = camera.CvCamera else: raise EnvironmentError( "Neither Raspberry Pi nor GPhoto2 nor OpenCV camera detected") self.camera = cam_class(config.getint('CAMERA', 'iso'), config.gettyped('CAMERA', 'resolution'), config.getint('CAMERA', 'rotation'), config.getboolean('CAMERA', 'flip')) # Initialize the hardware buttons self.led_capture = PtbLed(config.getint('CONTROLS', 'picture_led_pin')) self.button_capture = PtbButton( config.getint('CONTROLS', 'picture_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_print = PtbLed(config.getint('CONTROLS', 'print_led_pin')) self.button_print = PtbButton( config.getint('CONTROLS', 'print_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_startup = PtbLed(config.getint('CONTROLS', 'startup_led_pin')) self.led_preview = PtbLed(config.getint('CONTROLS', 'preview_led_pin')) # Initialize the printer self.printer = PtbPrinter(config.get('PRINTER', 'printer_name')) # Variables shared between states self.dirname = None self.makers_pool = PicturesMakersPool() self.capture_nbr = None self.capture_choices = (4, 1) self.nbr_duplicates = 0 self.previous_picture = None self.previous_animated = [] self.previous_picture_file = None