import time from threading import Thread from blinkenfoo import DMX, WARP_SIGN, SPHERES, PANEL, CUBES class Animation(Thread): """ An animation describes transition of pixels on various blinkenfoos. The blinkenfoo can not be changed after the animation has been initialized. It is possible to start an animation with a different blinkenroom everytime. """ required_args = {} def __init__(self): Thread.__init__(self) self.name = None self.args = None self.blinkenroom = None self._frame = None self._fps = 0 self._time_should = 0 self._currently_adjusted_for = None self._running = False self._paused = False self._last_cycle = time.time() self.set_fps(30) def set_args(self, p_args): self.args = p_args def calc_devices_adjusted_fps(self, p_fps): for device in self.blinkenroom.device_list: device.calc_fps(p_fps) def adjust_fps_for_device(self, p_device): adjusted_fps = p_device.current_fps if not self._currently_adjusted_for == p_device: self.set_fps(adjusted_fps) self._currently_adjusted_for = p_device def adjust_fps_for_index(self, p_index): device = self.blinkenroom.get_device_by_index(p_index) self.adjust_fps_for_device(device) def cycle(self): pass def set_fps(self, p_fps): self._fps = p_fps self._time_should = 1 / float(self._fps) def run(self): """ Code stolen from olel """ self._running = True while self._running: if self._paused: continue self.cycle() if self._fps: time_spend = time.time() - self._last_cycle sleep_time = self._time_should - time_spend if sleep_time > 0: time.sleep(sleep_time) self._last_cycle = time.time() def stop(self): self._running = False def pause(self): self._paused = True def resume(self): self._paused = False