Move on
- validation of methods, possibly using schema; - cleanup
This commit is contained in:
parent
ba50af7c5e
commit
eac3e8c3da
|
@ -1,3 +1,5 @@
|
||||||
|
import math
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Predefined methods
|
Predefined methods
|
||||||
"""
|
"""
|
||||||
|
@ -45,10 +47,11 @@ def value_linear(obj, step):
|
||||||
Saw patterned value, 0-1-0
|
Saw patterned value, 0-1-0
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
delta = obj.max - obj.min
|
||||||
if step < 50:
|
if step < 50:
|
||||||
return obj.delta*step/50 + obj.min
|
return delta*step/50 + obj.min
|
||||||
else:
|
else:
|
||||||
return obj.delta * (100-step)/50 + obj.min
|
return delta * (100-step)/50 + obj.min
|
||||||
|
|
||||||
|
|
||||||
def value_sin(obj, step):
|
def value_sin(obj, step):
|
||||||
|
@ -56,13 +59,16 @@ def value_sin(obj, step):
|
||||||
Sinusoidal values, 0-1-0 /\
|
Sinusoidal values, 0-1-0 /\
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
delta = obj.max - obj.min
|
||||||
radians = math.radians(1.8 * step)
|
radians = math.radians(1.8 * step)
|
||||||
return obj.delta * math.sin(radians) + obj.min
|
return delta * math.sin(radians) + obj.min
|
||||||
|
|
||||||
|
|
||||||
def value_cos(obj, step):
|
def value_cos(obj, step):
|
||||||
"""
|
"""
|
||||||
Absolute Cosinusoidal values, 1-0-1 \\//
|
Absolute Cosinusoidal values, 1-0-1 \\//
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
delta = obj.max - obj.min
|
||||||
radians = math.radians(1.8 * step)
|
radians = math.radians(1.8 * step)
|
||||||
return obj.delta * abs(math.cos(radians)) + obj.min
|
return delta * abs(math.cos(radians)) + obj.min
|
||||||
|
|
|
@ -2,6 +2,10 @@ import logging
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
|
||||||
|
from queue import Queue
|
||||||
from .worker import ledWorker
|
from .worker import ledWorker
|
||||||
from .methods import * # NOQA
|
from .methods import * # NOQA
|
||||||
|
|
||||||
|
@ -68,7 +72,8 @@ class ledPulse:
|
||||||
self.register_value_method(vm, eval(f"value_{vm}"))
|
self.register_value_method(vm, eval(f"value_{vm}"))
|
||||||
|
|
||||||
# Add thread placeholder
|
# Add thread placeholder
|
||||||
self.worker = None
|
self.worker = ledWorker(self)
|
||||||
|
self.queue = Queue()
|
||||||
|
|
||||||
# Set default values
|
# Set default values
|
||||||
for key, value in self.defaultSet.items():
|
for key, value in self.defaultSet.items():
|
||||||
|
@ -104,11 +109,13 @@ class ledPulse:
|
||||||
|
|
||||||
if not (self.delayMethod in self.methods['delay']
|
if not (self.delayMethod in self.methods['delay']
|
||||||
and self.valueMethod in self.methods['value']):
|
and self.valueMethod in self.methods['value']):
|
||||||
self.log.error(f"Invalid parameters, delayMethod:{self.delayMethod}, "
|
self.log.error(f"Invalid parameters, "
|
||||||
|
f"delayMethod:{self.delayMethod}, "
|
||||||
f"valueMethod:{self.valueMethod}")
|
f"valueMethod:{self.valueMethod}")
|
||||||
return
|
return
|
||||||
|
|
||||||
self.log.debug(f"fill cycle values table, valueMethod:{self.valueMethod}, "
|
self.log.debug(f"fill cycle values table, "
|
||||||
|
f"valueMethod:{self.valueMethod}, "
|
||||||
f"delayMethod:{self.delayMethod}, min:{self.min}, "
|
f"delayMethod:{self.delayMethod}, min:{self.min}, "
|
||||||
f"max:{self.max}, delay:{self.delay}")
|
f"max:{self.max}, delay:{self.delay}")
|
||||||
|
|
||||||
|
@ -117,13 +124,12 @@ class ledPulse:
|
||||||
try:
|
try:
|
||||||
delay = self.methods['delay'][self.delayMethod](self, step)
|
delay = self.methods['delay'][self.delayMethod](self, step)
|
||||||
except NameError:
|
except NameError:
|
||||||
self.log.error(f"delay function for '{self.delayMethod}' "
|
self.log.error(f"delay method '{self.delayMethod}' not found")
|
||||||
"not found")
|
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
value = self.methods['value'][self.valueMethod](self, step)
|
value = self.methods['value'][self.valueMethod](self, step)
|
||||||
except NameError:
|
except NameError:
|
||||||
self.log.error(f"value function for '{self.valueMethod}' not found")
|
self.log.error(f"value method '{self.valueMethod}' not found")
|
||||||
return
|
return
|
||||||
values.append((value, delay))
|
values.append((value, delay))
|
||||||
return values
|
return values
|
||||||
|
@ -215,3 +221,54 @@ class ledPulse:
|
||||||
self.log.info(f"registered {kind} method '{name}'")
|
self.log.info(f"registered {kind} method '{name}'")
|
||||||
else:
|
else:
|
||||||
self.log.warning(f"{kind} method '{name}' already defined")
|
self.log.warning(f"{kind} method '{name}' already defined")
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Item:
|
||||||
|
parent: ledPulse
|
||||||
|
initialMethod: str = None
|
||||||
|
loopMethod: str = 'linear'
|
||||||
|
finalMethod: str = None
|
||||||
|
delayMethod: str = 'constant'
|
||||||
|
min: int = 2
|
||||||
|
max: int = 50
|
||||||
|
delay: float = 0.01
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
|
||||||
|
self.log = logging.getLogger(self.__class__.__name__)
|
||||||
|
|
||||||
|
for method in ["initial", "loop", "final"]:
|
||||||
|
methodName = f"{method}Method"
|
||||||
|
methodValue = getattr(self, methodName)
|
||||||
|
if methodValue and methodValue not in self.parent.methods['value']:
|
||||||
|
self.log.error(f"Invalid method, "
|
||||||
|
f"{methodName}: '{methodValue}'")
|
||||||
|
return None
|
||||||
|
|
||||||
|
if self.delayMethod not in self.parent.methods['delay']:
|
||||||
|
self.log.error(f"Invalid method, delayMethod:'{self.delayMethod}'")
|
||||||
|
return None
|
||||||
|
|
||||||
|
self.initial = self.calcValues(0, 50, self.initialMethod)
|
||||||
|
self.loop = self.calcValues(0, 100, self.loopMethod)
|
||||||
|
self.final = self.calcValues(50, 100, self.finalMethod)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def timings(self):
|
||||||
|
initialTime = sum(map(lambda x: x[1], self.initial))
|
||||||
|
loopTime = sum(map(lambda x: x[1], self.loop))
|
||||||
|
finalTime = sum(map(lambda x: x[1], self.final))
|
||||||
|
total = initialTime + loopTime + finalTime
|
||||||
|
return (initialTime, loopTime, finalTime, total)
|
||||||
|
|
||||||
|
def calcValues(self, initialStep, finalStep, valueMethod):
|
||||||
|
values = []
|
||||||
|
if valueMethod:
|
||||||
|
valueMethodFn = self.parent.methods['value'][valueMethod]
|
||||||
|
delayMethodFn = self.parent.methods['delay'][self.delayMethod]
|
||||||
|
for step in range(initialStep, finalStep):
|
||||||
|
delay = delayMethodFn(self, step)
|
||||||
|
value = valueMethodFn(self, step)
|
||||||
|
values.append((value, delay))
|
||||||
|
return values
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import logging
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,11 +13,51 @@ class ledWorker(threading.Thread):
|
||||||
self.log = logging.getLogger(self.__class__.__name__)
|
self.log = logging.getLogger(self.__class__.__name__)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
|
||||||
self.changed = self.parent.changed
|
# self.changed = self.parent.changed
|
||||||
|
|
||||||
self.stop_event = threading.Event()
|
self.stop_event = threading.Event()
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
while True:
|
||||||
|
item = self.parent.queue.get()
|
||||||
|
|
||||||
|
# Initial
|
||||||
|
if self.initialMode:
|
||||||
|
self.log.debug('running initial step')
|
||||||
|
vals = self.initialValues()
|
||||||
|
for value, delay in vals:
|
||||||
|
self.setValue(value)
|
||||||
|
time.sleep(delay)
|
||||||
|
print('end initial step')
|
||||||
|
self.log.debug('end initial step')
|
||||||
|
|
||||||
|
vals = self.cycleValues()
|
||||||
|
while True:
|
||||||
|
if self.worker.stop_event.is_set():
|
||||||
|
# self.worker._started.clear()
|
||||||
|
self.worker.stop_event.clear()
|
||||||
|
self.log.debug("bailing out from infinite loop")
|
||||||
|
return
|
||||||
|
|
||||||
|
if self.worker.changed.is_set():
|
||||||
|
self.changed.clear()
|
||||||
|
self.log.debug("parameters changed, recalculate values...")
|
||||||
|
break
|
||||||
|
for step in range(len(vals)):
|
||||||
|
value, delay = vals[step]
|
||||||
|
self.setValue(value)
|
||||||
|
time.sleep(delay)
|
||||||
|
|
||||||
|
# Final
|
||||||
|
if self.finalMode:
|
||||||
|
print('running final step')
|
||||||
|
self.log.debug('running final step')
|
||||||
|
vals = self.finalValues()
|
||||||
|
for value, delay in vals:
|
||||||
|
self.setValue(value)
|
||||||
|
time.sleep(delay)
|
||||||
|
print('end final step')
|
||||||
|
self.log.debug('end final step')
|
||||||
self.log.debug(f"running {self.name} main loop...")
|
self.log.debug(f"running {self.name} main loop...")
|
||||||
self.parent.loop()
|
self.parent.loop()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue