Total Complexity | 10 |
Total Lines | 59 |
Duplicated Lines | 0 % |
Changes | 0 |
1 | """ |
||
2 | * PyDMXControl: A Python 3 module to control DMX via Python. Featuring fixture profiles and working with uDMX. |
||
3 | * <https://github.com/MattIPv4/PyDMXControl/> |
||
4 | * Copyright (C) 2018 Matt Cowley (MattIPv4) ([email protected]) |
||
5 | """ |
||
6 | |||
7 | from time import time |
||
8 | from typing import Dict |
||
9 | |||
10 | |||
11 | class TimedEvent: |
||
12 | |||
13 | def __init__(self, run_time: int, callback: callable, args: tuple = (), name: str = ""): |
||
14 | self.__time = run_time |
||
15 | self.__cb = callback |
||
16 | self.__args = args |
||
17 | self.__name = name |
||
18 | self.__fired = None |
||
19 | |||
20 | @property |
||
21 | def time(self) -> str: |
||
22 | return "{}ms".format("{:.4f}".format(self.__time).rstrip("0").rstrip(".")) |
||
23 | |||
24 | @property |
||
25 | def name(self) -> str: |
||
26 | return "{}".format(self.__name) |
||
27 | |||
28 | @property |
||
29 | def func(self) -> str: |
||
30 | return "<func {}>".format(self.__cb.__name__) |
||
31 | |||
32 | @property |
||
33 | def args(self) -> str: |
||
34 | return "[{}]".format(", ".join(["{}".format(f) for f in self.__args])) |
||
35 | |||
36 | @property |
||
37 | def fired(self) -> str: |
||
38 | if self.__fired is None: |
||
39 | return "" |
||
40 | return "{:.4f}ms ({:.4f}ms late)".format(self.__fired, self.__fired - self.__time) |
||
41 | |||
42 | @property |
||
43 | def data(self) -> Dict[str, str]: |
||
44 | return { |
||
45 | "time": self.time, |
||
46 | "name": self.name, |
||
47 | "func": self.func, |
||
48 | "args": self.args, |
||
49 | "fired": self.fired |
||
50 | } |
||
51 | |||
52 | def __str__(self) -> str: |
||
53 | return "Event {} (\"{}\") {}".format(self.__time, self.name, self.func) |
||
54 | |||
55 | def run(self, start_time) -> str: |
||
56 | self.__cb(*self.__args) |
||
57 | self.__fired = (time() * 1000.0) - start_time |
||
58 | return "{} fired at {}".format(str(self), self.fired) |
||
59 |