mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
light clock (#260)
* extend image effects add a basic light clock * add alpha values to rainbow * some effect tuning * make seconds hand optional and change color to yellow make blue hours hand always visible
This commit is contained in:
parent
5aa9edc1cd
commit
89afedf3d5
8
effects/light-clock.json
Normal file
8
effects/light-clock.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name" : "Light clock",
|
||||||
|
"script" : "light-clock.py",
|
||||||
|
"args" :
|
||||||
|
{
|
||||||
|
"show_seconds" : true
|
||||||
|
}
|
||||||
|
}
|
54
effects/light-clock.py
Normal file
54
effects/light-clock.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
import hyperion, time, datetime
|
||||||
|
|
||||||
|
# Get the parameters
|
||||||
|
showSeconds = bool(hyperion.args.get('show_seconds', True))
|
||||||
|
centerX = int(round(hyperion.imageWidth)/2)
|
||||||
|
centerY = int(round(float(hyperion.imageHeight)/2))
|
||||||
|
|
||||||
|
colorsSecond = bytearray([
|
||||||
|
0, 255,255,0,255,
|
||||||
|
5, 255,255,0,255,
|
||||||
|
30, 0,0,0,0,
|
||||||
|
])
|
||||||
|
|
||||||
|
colorsMinute = bytearray([
|
||||||
|
0, 0,255,0,255,
|
||||||
|
5, 0,255,0,250,
|
||||||
|
90, 0,0,0,0,
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
colorsHour = bytearray([
|
||||||
|
0, 0,0,255,255,
|
||||||
|
10, 0,0,255,255,
|
||||||
|
127, 0,0,196,127,
|
||||||
|
255, 0,0,196,5,
|
||||||
|
])
|
||||||
|
|
||||||
|
colorsHourTop = bytearray([
|
||||||
|
0, 0,0,255,250,
|
||||||
|
10, 0,0,255,128,
|
||||||
|
20, 0,0,0,0,
|
||||||
|
])
|
||||||
|
|
||||||
|
# effect loop
|
||||||
|
while not hyperion.abort():
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
|
||||||
|
angleH = 449 - 30*(now.hour if now.hour<12 else now.hour-12)
|
||||||
|
angleM = 449 - 6*now.minute
|
||||||
|
angleS = 449 - 6*now.second
|
||||||
|
|
||||||
|
angleH -= 0 if angleH<360 else 360
|
||||||
|
angleM -= 0 if angleM<360 else 360
|
||||||
|
angleS -= 0 if angleS<360 else 360
|
||||||
|
|
||||||
|
hyperion.imageSolidFill(127,127,127);
|
||||||
|
hyperion.imageCanonicalGradient(centerX, centerY, angleH, colorsHour)
|
||||||
|
hyperion.imageCanonicalGradient(centerX, centerY, angleM, colorsMinute)
|
||||||
|
hyperion.imageCanonicalGradient(centerX, centerY, angleH, colorsHourTop)
|
||||||
|
if showSeconds:
|
||||||
|
hyperion.imageCanonicalGradient(centerX, centerY, angleS, colorsSecond)
|
||||||
|
|
||||||
|
hyperion.imageShow()
|
||||||
|
time.sleep(0.01 )
|
@ -14,15 +14,22 @@ increment = -1 if reverse else 1
|
|||||||
|
|
||||||
# table of stop colors for rainbow gradient, first is the position, next rgb, all values 0-255
|
# table of stop colors for rainbow gradient, first is the position, next rgb, all values 0-255
|
||||||
rainbowColors = bytearray([
|
rainbowColors = bytearray([
|
||||||
0 ,255,0 ,0,
|
0 ,255,0 ,0, 255,
|
||||||
25 ,255,230,0,
|
25 ,255,230,0, 255,
|
||||||
63 ,255,255,0,
|
63 ,255,255,0, 255,
|
||||||
100,0 ,255,0,
|
100,0 ,255,0, 255,
|
||||||
127,0 ,255,200,
|
127,0 ,255,200, 255,
|
||||||
159,0 ,255,255,
|
159,0 ,255,255, 255,
|
||||||
191,0 ,0 ,255,
|
191,0 ,0 ,255, 255,
|
||||||
224,255,0 ,255,
|
224,255,0 ,255, 255,
|
||||||
255,255,0 ,127,
|
255,255,0 ,127, 255,
|
||||||
|
#0, 255, 0, 0, 255,
|
||||||
|
#42, 255, 255, 0, 255,
|
||||||
|
#85, 0, 255, 0, 255,
|
||||||
|
#128, 0, 255, 255, 255,
|
||||||
|
#170, 0, 0, 255, 255,
|
||||||
|
#212, 255, 0, 255, 255,
|
||||||
|
#255, 255, 0, 0, 255,
|
||||||
])
|
])
|
||||||
|
|
||||||
# effect loop
|
# effect loop
|
||||||
|
@ -27,6 +27,7 @@ PyMethodDef Effect::effectMethods[] = {
|
|||||||
{"imageShow", Effect::wrapImageShow, METH_NOARGS, "set current effect image to hyperion core."},
|
{"imageShow", Effect::wrapImageShow, METH_NOARGS, "set current effect image to hyperion core."},
|
||||||
{"imageCanonicalGradient", Effect::wrapImageCanonicalGradient, METH_VARARGS, ""},
|
{"imageCanonicalGradient", Effect::wrapImageCanonicalGradient, METH_VARARGS, ""},
|
||||||
{"imageRadialGradient" , Effect::wrapImageRadialGradient, METH_VARARGS, ""},
|
{"imageRadialGradient" , Effect::wrapImageRadialGradient, METH_VARARGS, ""},
|
||||||
|
{"imageSolidFill" , Effect::wrapImageSolidFill, METH_VARARGS, ""},
|
||||||
// {"imageSetPixel",Effect::wrapImageShow, METH_VARARGS, "set pixel color of image"},
|
// {"imageSetPixel",Effect::wrapImageShow, METH_VARARGS, "set pixel color of image"},
|
||||||
// {"imageGetPixel",Effect::wrapImageShow, METH_VARARGS, "get pixel color of image"},
|
// {"imageGetPixel",Effect::wrapImageShow, METH_VARARGS, "get pixel color of image"},
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
@ -454,8 +455,9 @@ PyObject* Effect::wrapImageCanonicalGradient(PyObject *self, PyObject *args)
|
|||||||
{
|
{
|
||||||
if (PyByteArray_Check(bytearray))
|
if (PyByteArray_Check(bytearray))
|
||||||
{
|
{
|
||||||
int length = PyByteArray_Size(bytearray);
|
const int length = PyByteArray_Size(bytearray);
|
||||||
if (length % 4 == 0)
|
const unsigned arrayItemLength = 5;
|
||||||
|
if (length % arrayItemLength == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
QPainter * painter = effect->_painter;
|
QPainter * painter = effect->_painter;
|
||||||
@ -463,25 +465,25 @@ PyObject* Effect::wrapImageCanonicalGradient(PyObject *self, PyObject *args)
|
|||||||
QConicalGradient gradient(QPoint(centerX,centerY), angle );
|
QConicalGradient gradient(QPoint(centerX,centerY), angle );
|
||||||
char * data = PyByteArray_AS_STRING(bytearray);
|
char * data = PyByteArray_AS_STRING(bytearray);
|
||||||
|
|
||||||
for (int idx=0; idx<length; idx+=4)
|
for (int idx=0; idx<length; idx+=arrayItemLength)
|
||||||
{
|
{
|
||||||
gradient.setColorAt(
|
gradient.setColorAt(
|
||||||
((uint8_t)data[idx])/255.0,
|
((uint8_t)data[idx])/255.0,
|
||||||
QColor(
|
QColor(
|
||||||
(uint8_t)(data[idx+1]),
|
(uint8_t)(data[idx+1]),
|
||||||
(uint8_t)(data[idx+2]),
|
(uint8_t)(data[idx+2]),
|
||||||
(uint8_t)(data[idx+3])
|
(uint8_t)(data[idx+3]),
|
||||||
|
(uint8_t)(data[idx+4])
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
gradient.setSpread(QGradient::RepeatSpread);
|
|
||||||
painter->fillRect(myQRect, gradient);
|
painter->fillRect(myQRect, gradient);
|
||||||
|
|
||||||
return Py_BuildValue("");
|
return Py_BuildValue("");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PyErr_SetString(PyExc_RuntimeError, "Length of bytearray argument should multiple of 4");
|
PyErr_SetString(PyExc_RuntimeError, "Length of bytearray argument should multiple of 5");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -582,6 +584,49 @@ PyObject* Effect::wrapImageRadialGradient(PyObject *self, PyObject *args)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyObject* Effect::wrapImageSolidFill(PyObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
Effect * effect = getEffect();
|
||||||
|
|
||||||
|
int argCount = PyTuple_Size(args);
|
||||||
|
int r, g, b;
|
||||||
|
int a = 255;
|
||||||
|
int startX = 0;
|
||||||
|
int startY = 0;
|
||||||
|
int width = effect->_imageSize.width();
|
||||||
|
int height = effect->_imageSize.height();
|
||||||
|
|
||||||
|
bool argsOK = false;
|
||||||
|
|
||||||
|
if ( argCount == 8 && PyArg_ParseTuple(args, "iiiiiiii", &startX, &startY, &width, &height, &r, &g, &b, &a) )
|
||||||
|
{
|
||||||
|
argsOK = true;
|
||||||
|
}
|
||||||
|
if ( argCount == 7 && PyArg_ParseTuple(args, "iiiiiii", &startX, &startY, &width, &height, &r, &g, &b) )
|
||||||
|
{
|
||||||
|
argsOK = true;
|
||||||
|
}
|
||||||
|
if ( argCount == 4 && PyArg_ParseTuple(args, "iiii",&r, &g, &b, &a) )
|
||||||
|
{
|
||||||
|
argsOK = true;
|
||||||
|
}
|
||||||
|
if ( argCount == 3 && PyArg_ParseTuple(args, "iii",&r, &g, &b) )
|
||||||
|
{
|
||||||
|
argsOK = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argsOK)
|
||||||
|
{
|
||||||
|
QRect myQRect(startX,startY,width,height);
|
||||||
|
effect->_painter->fillRect(myQRect, QColor(r,g,b,a));
|
||||||
|
return Py_BuildValue("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Effect * Effect::getEffect()
|
Effect * Effect::getEffect()
|
||||||
{
|
{
|
||||||
|
@ -58,6 +58,7 @@ private:
|
|||||||
static PyObject* wrapImageShow(PyObject *self, PyObject *args);
|
static PyObject* wrapImageShow(PyObject *self, PyObject *args);
|
||||||
static PyObject* wrapImageCanonicalGradient(PyObject *self, PyObject *args);
|
static PyObject* wrapImageCanonicalGradient(PyObject *self, PyObject *args);
|
||||||
static PyObject* wrapImageRadialGradient(PyObject *self, PyObject *args);
|
static PyObject* wrapImageRadialGradient(PyObject *self, PyObject *args);
|
||||||
|
static PyObject* wrapImageSolidFill(PyObject *self, PyObject *args);
|
||||||
|
|
||||||
static Effect * getEffect();
|
static Effect * getEffect();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user