Skip to content
Snippets Groups Projects
animation.py 2.10 KiB
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