def __init__( self, verbose: bool = False, tmpdir: Path = None, callbacks: List[Callback] = (), camera_rotation: int = 180, preview: bool = False, # picamera settings *args, **kwargs, ): self._callbacks = {} for cb in callbacks: self._callbacks.setdefault(cb.exec_at, []).append(cb) for k, v in self._callbacks.items(): self._callbacks[k] = sorted(self._callbacks[k], key=lambda x: x.priority, reverse=True) self._execute_callbacks(ExecPoint.BEFORE_INIT) self._preview = preview self.cam = PiCamera(*args, **kwargs) self.cam.rotation = camera_rotation if self._preview: self.cam.start_preview() sleep(2) self._logger = get_logger(self.__class__.__name__, verb=verbose) if tmpdir is None: self._tmpdir_holder = TemporaryDirectory(prefix=self.TMPDIR_PREFIX) self._tmpdir = Path(str(self._tmpdir_holder.name)) else: self._tmpdir = Path(str(tmpdir))
def __init__(self, exec_at: ExecPoint, timeout: float = 0.5, verbose: bool = False): super().__init__(exec_at=exec_at, priority=1000) self.timeout = timeout self.blocked = False self._logger = get_logger(self.__class__.__name__, verb=verbose)
def __init__(self, lock: Lock = None): tmpdir = os.getenv('TMPDIR', '/tmp') self.sfp = Path(tmpdir) / self.STATE_FILE_NAME self._logger = get_logger(self.__class__.__name__, verb=True) if not self.sfp.is_file(): with open(self.sfp, 'w') as fout: json.dump({}, fout) self.sfp.touch(exist_ok=True) self.lock = lock
def __init__(self, api_token: str = None, chat_id: str = None): if api_token is not None and chat_id is not None: self.api_token = api_token self.chat_id = chat_id else: self.api_token = os.getenv(self.API_TOKEN_ENV_VAR, None) self.chat_id = os.getenv(self.CHAT_ID_ENV_VAR, None) self._logger = get_logger(self.__class__.__name__, verb=True) if self.api_token is None or self.chat_id is None: raise RuntimeError( 'Could not find Telegram credentials in environment.')
def __init__( self, storage_dir: Path, file_prefix: str = 'file', file_ext: str = '.mp4', rotate_fill_perc: int = 90, ): self.storage_dir = Path(str(storage_dir)) self._file_prefix = file_prefix self._file_ext = file_ext self._rotate_fill_perc = rotate_fill_perc self._logger = get_logger(self.__class__.__name__, verb=True) if self.storage_dir.is_file(): raise RuntimeError(f'Storage dir is a file: {storage_dir}') self.storage_dir.mkdir(exist_ok=True)
def __init__( self, cam: Cam, servos: Dict[Tuple[str, str], Servo] = None, verbose: bool = False ): self.cam = cam self.servos = servos if servos is not None else {} self._logger = get_logger(self.__class__.__name__, verb=verbose) self._cam_in_q = Queue() self._cam_out_q = Queue() self._servo_in_qs = {k: Queue() for k in self.servos.keys()} self._cam_thread = Thread(target=self._cam_worker, name='cam_worker', daemon=False) self._servo_threads = [ Thread(target=self._servo_worker, kwargs=dict(servo_name=sn), daemon=True) for sn in self.servos.keys() ] self._cam_thread.start() sleep(Platform.CAM_RES_POLL_TIMEOUT) # initial sleep for cam setup before servos start for st in self._servo_threads: st.start()
def __init__( self, board_pin: int, freq: float = 50, verbose: bool = False, servo_name: str = 'A/D', hacked: bool = False, on_invalid_angle: str = 'raise', init_angle: Union[int, str] = 0, ): self.pin = board_pin self.angle = None self.hacked = hacked self._on_invalid_angle = on_invalid_angle self._servo_name = f'({servo_name})' if servo_name is not None else '' self._logger = get_logger( f'{self.__class__.__name__}{self._servo_name}', verb=verbose) GPIO.setup(self.pin, GPIO.OUT) self._pwm = GPIO.PWM(self.pin, freq) self._initialize_servo_pos() if init_angle == 'guess': init_angle = self.MOCK_INIT_ASSUMED_ANGLE elif init_angle == 'load': state = State() init_angle = state['servo', self._servo_name, 'angle'] if init_angle is None: init_angle = self.MOCK_INIT_ASSUMED_ANGLE elif isinstance(init_angle, str) and init_angle.isnumeric(): init_angle = int(init_angle) elif isinstance(init_angle, int): pass else: raise NotImplementedError( f'Invalid selection for init_angle: {init_angle}') init_angle = int(init_angle) if init_angle != 0: self._run_servo_op(angle=init_angle)