animation_handler.py 3.96 KiB
from blinkenbase.animation import Animation
from blinkenbase.blinkenroom import Blinkenroom
import blinkenbase.blinkenroom
import blinkenbase.animation
import time
from blinkenbase.blinkenroom import BLINKENROOM_LOUNGE
import _thread
#from darken import darken
class AnimationHandler(object):
ERROR_ANIMATION_RUNNING = 100
ERROR_ANIMATION_NOT_FOUND = 101
ERROR_OVERLAPPING = 102
def __init__(self):
self.running_animations = {}
self.known_animations = {}
self.last_frame = None
#######################
###Animation control###
######################
def stop_animation(self, p_name):
if p_name in self.running_animations:
animation = self.running_animations[p_name]
print("Stopping %s" % p_name)
animation.stop()
del self.running_animations[p_name]
def stop_all_animations(self, p_args=None):
for running in self.running_animations.values():
running.stop()
self.running_animations = {}
self.last_frame = BLINKENROOM_LOUNGE.get_last_frame()
def pause_animation(self, p_animation_name):
if p_animation_name in self.running_animations:
animation = self.running_animations[p_animation_name]
animation.pause()
def pause_all_animations(self):
for animation in self.running_animations.values():
animation.pause()
def resume_animation(self, p_animation_name):
if p_animation_name in self.running_animations:
animation = self.running_animations[p_animation_name]
animation.resume()
def resume_all_animations(self):
for animation in self.running_animations.values():
animation.resume()
def start_animation(self, p_name, p_animation_args):
p_name = p_name.lower()
animation_class = None
try:
exec("from animations.%s import %s" % (p_name, p_name))
animation_class = eval(p_name)
except ImportError:
print("Animation not found '%s'" % p_name)
return self.ERROR_ANIMATION_NOT_FOUND
animation = animation_class()
required_args = animation.required_args
for arg in required_args:
required = required_args[arg]
if arg not in p_animation_args:
p_animation_args[arg] = required[1]
else:
casting_method = required[0]
current_arg = p_animation_args[arg]
p_animation_args[arg] = casting_method(current_arg)
animation.set_args(p_animation_args)
animation.init_animation()
to_stop = []
for running in self.running_animations.values():
if animation.blinkenroom.is_overlapping(running.blinkenroom):
to_stop.append(running.name)
for running in to_stop:
self.stop_animation(running)
self.running_animations[p_name] = animation
animation.start()
#################
###Light-Level###
#################
def _thread_handler_darken(self, a, b):
f = 100
while f > 0:
BLINKENROOM_LOUNGE.set_brightness(f)
time.sleep(0.05)
f -= 1
self.pause_all_animations()
def _thread_handler_lighten(self, a, b):
f = 1
self.resume_all_animations()
while f <= 100:
BLINKENROOM_LOUNGE.set_brightness(f)
time.sleep(0.05)
f += 1
def darken(self, p_args):
_thread.start_new_thread(self._thread_handler_darken, (None, None))
def lighten(self, p_args):
_thread.start_new_thread(self._thread_handler_lighten, (None, None))
# def darken(self, p_args):
# self.stop_all_animations()
# darken_dicts = {
# "frame": self.last_frame,
# "rate": 30,
# "steps": 100
# }
# animation = darken()
# animation.set_args(darken_dicts)
# animation.init_animation()
# animation.start()