def _main(): i = inotify.adapters.Inotify() i.add_watch(TARGET_DIR) global running_ti, files, cre ti = ResettableTimer(TIMER_TO, expired) cre = re.compile(REGEX) # watch directory for new file creation while 1 > 0 : for event in i.event_gen(yield_nones=False, timeout_s=1): (_, type_names, path, filename) = event for type_name in type_names: if (type_name == "IN_CREATE") : # start a new timer if ( running_ti ) : ti.reset() files.append(filename) if ( not running_ti ) : running_ti = True ti = ResettableTimer(TIMER_TO, expired) ti.start() files = [] files.append(filename)
class WDEventHandler(FileSystemEventHandler): def __init__(self, gus): self.timer = None self.gus = gus def timer_callback(self): self.gus.render_site() self.timer = None def do_something(self, event): if re.match('.*~$', event.src_path): return if re.match("^.*%s\..*\.sw.$" % os.path.sep, event.src_path): return if self.timer is None: self.timer = ResettableTimer(0.5, self.timer_callback) else: self.timer.reset() print("mod or create %s" % event.src_path) def on_created(self, event): self.do_something(event) def on_modified(self, event): self.do_something(event)
def test_timer_can_be_started_with_reset(self): m = Mock(return_value=None) t = ResettableTimer(3, m) t._timer.pass_time(3) m.assert_not_called() t.reset(start=True) t._timer.pass_time(3) m.assert_called_once_with()
class ServoControl(object): def __init__(self, pan_pin=12, tilt_pin=18, pan_limits=(500, 2500), tilt_limits=(500, 2500), initial_position=(90, 90), auto_off=1.5): self.__pi = pigpio.pi() self.__pan = ServoDetails(pan_pin, *pan_limits) self.__tilt = ServoDetails(tilt_pin, *tilt_limits) if auto_off: self.__auto_off_timer = ResettableTimer(auto_off, self.off) self.__auto_off_timer.start() else: self.__auto_off_timer = None # Move to initial position to have servos in known position self.move_to(*initial_position) def __set_pw(self, servo, pw=None): # TODO: check input pw validity if pw is None: pw = servo.pulsewidth return self.__pi.set_servo_pulsewidth(servo.pin, pw) @property def position(self): return {"pan": self.__pan.pos, "tilt": self.__tilt.pos} def move_to(self, pan=None, tilt=None): if pan is not None: self.__pan.pos = pan self.__set_pw(self.__pan) if tilt is not None: self.__tilt.pos = tilt self.__set_pw(self.__tilt) if self.__auto_off_timer is not None: self.__auto_off_timer.reset() def off(self): for servo in [self.__pan, self.__tilt]: self.__set_pw(servo, 0) def min(self): self.move_to(0, 0) def max(self): self.move_to(180, 180)
def test_timer_can_be_reset_after_cancel(self): m = Mock(return_value=None) t = ResettableTimer(5, m) t.start() t._timer.pass_time(3) m.assert_not_called() t.cancel() t.reset() t.start() t._timer.pass_time(6) m.assert_called_once_with()
class PiScreenOnOff(object): def __init__(self, timeout=15 * 60, pin=17): self.__sensor = HcSr501(pin) self.__timer = ResettableTimer(timeout, screen, [False]) self.__timer.start() def __run(self): while True: if self.__sensor.active: screen(True) self.__timer.reset(start=True) sleep(0.5) def run(self): try: self.__run() except KeyboardInterrupt: self.__timer.cancel()