Provide a lowest permissible interval time to effects and limit the update rate of selected effects

This commit is contained in:
Lord-Grey 2024-11-30 22:08:41 +01:00
parent ee48f0c9b3
commit fb434dc492
16 changed files with 58 additions and 4 deletions

View File

@ -20,6 +20,9 @@ brightness = float(hyperion.args.get('brightness', 100))/100.0
sleepTime = float(hyperion.args.get('sleepTime', 0.14)) sleepTime = float(hyperion.args.get('sleepTime', 0.14))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
candles = hyperion.args.get('candles', "all") candles = hyperion.args.get('candles', "all")
ledlist = hyperion.args.get('ledlist', "1") ledlist = hyperion.args.get('ledlist', "1")

View File

@ -11,6 +11,10 @@ cropBottom = int(hyperion.args.get('cropBottom', 0))
grayscale = bool(hyperion.args.get('grayscale', False)) grayscale = bool(hyperion.args.get('grayscale', False))
sleepTime = 1./framesPerSecond sleepTime = 1./framesPerSecond
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
imageFrameList = [] imageFrameList = []
if imageData: if imageData:

View File

@ -4,6 +4,9 @@ import time
# Get parameters # Get parameters
sleepTime = float(hyperion.args.get('sleepTime', 0.5)) sleepTime = float(hyperion.args.get('sleepTime', 0.5))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
def TestRgb( iteration ): def TestRgb( iteration ):
switcher = { switcher = {

View File

@ -11,6 +11,9 @@ sleepTime = float(hyperion.args.get('sleepTime', 0.5))
testleds = hyperion.args.get('testleds', "all") testleds = hyperion.args.get('testleds', "all")
ledlist = hyperion.args.get('ledlist', "1") ledlist = hyperion.args.get('ledlist', "1")
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
testlist = () testlist = ()
if (testleds == "list") and (type(ledlist) is str): if (testleds == "list") and (type(ledlist) is str):
for s in ledlist.split(','): for s in ledlist.split(','):

View File

@ -6,6 +6,9 @@ width = hyperion.imageWidth()
height = hyperion.imageHeight() height = hyperion.imageHeight()
sleepTime = float(hyperion.args.get('sleepTime', 0.2)) sleepTime = float(hyperion.args.get('sleepTime', 0.2))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
def mapto(x, in_min, in_max, out_min, out_max): def mapto(x, in_min, in_max, out_min, out_max):
return float((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) return float((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)

View File

@ -4,8 +4,11 @@ import hyperion, time
sleepTime = float(hyperion.args.get('speed', 1.5)) * 0.005 sleepTime = float(hyperion.args.get('speed', 1.5)) * 0.005
whiteLevel = int(hyperion.args.get('whiteLevel', 0)) whiteLevel = int(hyperion.args.get('whiteLevel', 0))
lvl = int(hyperion.args.get('colorLevel', 220)) lvl = int(hyperion.args.get('colorLevel', 220))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
# check value # check value
whiteLevel = min( whiteLevel, 254 ) whiteLevel = min( whiteLevel, 254 )
lvl = min( lvl, 255 ) lvl = min( lvl, 255 )

View File

@ -21,6 +21,9 @@ height = 10
imageData = bytearray(height * width * (0,0,0)) imageData = bytearray(height * width * (0,0,0))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
# Start the write data loop # Start the write data loop
if initialBlink: if initialBlink:
for i in range(6): for i in range(6):

View File

@ -8,6 +8,9 @@ saturation = float(hyperion.args.get('saturation', 100))/100.0
color = list(hyperion.args.get('color', (255,255,255))) color = list(hyperion.args.get('color', (255,255,255)))
randomColor = bool(hyperion.args.get('random-color', False)) randomColor = bool(hyperion.args.get('random-color', False))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
# Check parameters # Check parameters
rotationTime = max(0.1, rotationTime) rotationTime = max(0.1, rotationTime)

View File

@ -22,7 +22,10 @@ def getPoint(rand = True ,x = 0.5, y = 0.5):
def getSTime(rt, steps = 360): def getSTime(rt, steps = 360):
rt = float(rt) rt = float(rt)
sleepTime = max(0.1, rt) / steps sleepTime = max(0.1, rt) / steps
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
# adapt sleeptime to hardware # adapt sleeptime to hardware
minStepTime= float(hyperion.latchTime)/1000.0 minStepTime= float(hyperion.latchTime)/1000.0
if minStepTime == 0: minStepTime = 0.001 if minStepTime == 0: minStepTime = 0.001

View File

@ -10,6 +10,9 @@ minStepTime = float(hyperion.latchTime)/1000.0
if minStepTime == 0: minStepTime = 0.001 if minStepTime == 0: minStepTime = 0.001
factor = 1 if sleepTime > minStepTime else int(math.ceil(minStepTime/sleepTime)) factor = 1 if sleepTime > minStepTime else int(math.ceil(minStepTime/sleepTime))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
runners = [ runners = [
{ "i":0, "pos":0, "c":0, "step":9, "lvl":255}, { "i":0, "pos":0, "c":0, "step":9, "lvl":255},
{ "i":1, "pos":0, "c":0, "step":8, "lvl":255}, { "i":1, "pos":0, "c":0, "step":8, "lvl":255},

View File

@ -11,7 +11,10 @@ sleepTime = float(hyperion.args.get('speed', 1)) / 1000.0
color = list(hyperion.args.get('color', (255,255,255))) color = list(hyperion.args.get('color', (255,255,255)))
randomise = bool(hyperion.args.get('random', False)) randomise = bool(hyperion.args.get('random', False))
iWidth = hyperion.imageWidth() iWidth = hyperion.imageWidth()
iHeight = hyperion.imageHeight() iHeight = hyperion.imageHeight()
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
class trail: class trail:
def __init__(self): def __init__(self):

View File

@ -4,7 +4,10 @@ import hyperion, time
sleepTime = float(hyperion.args.get('sleepTime', 1000))/1000.0 sleepTime = float(hyperion.args.get('sleepTime', 1000))/1000.0
length = hyperion.args.get('length', 1) length = hyperion.args.get('length', 1)
color1 = hyperion.args.get('color1', (255,255,255)) color1 = hyperion.args.get('color1', (255,255,255))
color2 = hyperion.args.get('color2', (255,0,0)) color2 = hyperion.args.get('color2', (255,0,0))
# Limit update rate
sleepTime = max(hyperion.lowestUpdateInterval(), sleepTime)
# Initialize the led data # Initialize the led data
i = 0 i = 0

View File

@ -103,4 +103,6 @@ private:
QImage _image; QImage _image;
QPainter *_painter; QPainter *_painter;
QVector<QImage> _imageStack; QVector<QImage> _imageStack;
double _lowestUpdateIntervalInSeconds;
}; };

View File

@ -51,4 +51,5 @@ public:
static PyObject* wrapImageCOffset (PyObject *self, PyObject *args); static PyObject* wrapImageCOffset (PyObject *self, PyObject *args);
static PyObject* wrapImageCShear (PyObject *self, PyObject *args); static PyObject* wrapImageCShear (PyObject *self, PyObject *args);
static PyObject* wrapImageResetT (PyObject *self, PyObject *args); static PyObject* wrapImageResetT (PyObject *self, PyObject *args);
static PyObject* wrapLowestUpdateInterval (PyObject* self, PyObject* args);
}; };

View File

@ -13,6 +13,11 @@
// python utils // python utils
#include <python/PythonProgram.h> #include <python/PythonProgram.h>
// Constants
namespace {
int DEFAULT_MAX_UPDATE_RATE_HZ { 200 };
} //End of constants
Effect::Effect(Hyperion *hyperion, int priority, int timeout, const QString &script, const QString &name, const QJsonObject &args, const QString &imageData) Effect::Effect(Hyperion *hyperion, int priority, int timeout, const QString &script, const QString &name, const QJsonObject &args, const QString &imageData)
: QThread() : QThread()
, _hyperion(hyperion) , _hyperion(hyperion)
@ -27,6 +32,7 @@ Effect::Effect(Hyperion *hyperion, int priority, int timeout, const QString &scr
, _interupt(false) , _interupt(false)
, _imageSize(hyperion->getLedGridSize()) , _imageSize(hyperion->getLedGridSize())
, _image(_imageSize,QImage::Format_ARGB32_Premultiplied) , _image(_imageSize,QImage::Format_ARGB32_Premultiplied)
, _lowestUpdateIntervalInSeconds(1/static_cast<double>(DEFAULT_MAX_UPDATE_RATE_HZ))
{ {
_colors.resize(_hyperion->getLedCount()); _colors.resize(_hyperion->getLedCount());
_colors.fill(ColorRgb::BLACK); _colors.fill(ColorRgb::BLACK);

View File

@ -123,6 +123,7 @@ PyMethodDef EffectModule::effectMethods[] = {
{"imageCOffset" , EffectModule::wrapImageCOffset , METH_VARARGS, "Add offset to the coordinate system"}, {"imageCOffset" , EffectModule::wrapImageCOffset , METH_VARARGS, "Add offset to the coordinate system"},
{"imageCShear" , EffectModule::wrapImageCShear , METH_VARARGS, "Shear of coordinate system by the given horizontal/vertical axis"}, {"imageCShear" , EffectModule::wrapImageCShear , METH_VARARGS, "Shear of coordinate system by the given horizontal/vertical axis"},
{"imageResetT" , EffectModule::wrapImageResetT , METH_NOARGS, "Resets all coords modifications (rotate,offset,shear)"}, {"imageResetT" , EffectModule::wrapImageResetT , METH_NOARGS, "Resets all coords modifications (rotate,offset,shear)"},
{"lowestUpdateInterval" , EffectModule::wrapLowestUpdateInterval , METH_NOARGS, "Gets the lowest permissible interval time in seconds"},
{NULL, NULL, 0, NULL} {NULL, NULL, 0, NULL}
}; };
@ -1045,3 +1046,10 @@ PyObject* EffectModule::wrapImageResetT(PyObject *self, PyObject *args)
getEffect()->_painter->resetTransform(); getEffect()->_painter->resetTransform();
Py_RETURN_NONE; Py_RETURN_NONE;
} }
PyObject* EffectModule::wrapLowestUpdateInterval(PyObject* self, PyObject* args)
{
qDebug() << "_lowestUpdateIntervalInSeconds: " << getEffect()->_lowestUpdateIntervalInSeconds;
return Py_BuildValue("d", getEffect()->_lowestUpdateIntervalInSeconds);
}