示例#1
0
    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))
示例#2
0
 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)
示例#3
0
 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
示例#4
0
 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.')
示例#5
0
    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)
示例#6
0
    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()
示例#7
0
 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)