mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-07 22:29:19 +00:00
89_ESPEInk: Several small modifications to avoid freezes (Forum https://forum.fhem.de/index.php/topic,104171.msg1050446.html#msg1050446)
git-svn-id: https://svn.fhem.de/fhem/trunk@23397 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
5ab3b90824
commit
33fe5028eb
@ -1,5 +1,10 @@
|
|||||||
# $Id$
|
# $Id$
|
||||||
|
|
||||||
|
# Änderungen Viegener - 2020-05-04
|
||||||
|
# Umstellung verzögerte berechnung der Pixel erst beim upload
|
||||||
|
# blocktext (ESPEInk_FormatBlockText) korrigiert für Behandlung von \\n
|
||||||
|
# text height ($th) is potentially wrong if text is wrapped to multiple lines so text height shoul dbe calced from one char only (addobjects)
|
||||||
|
|
||||||
package main;
|
package main;
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
@ -45,7 +50,8 @@ my %ESPEInk_devices = (
|
|||||||
# "7.8inch_e-Paper_HAT" => {width => 200, height => 200, pindex => 10, id => 23},
|
# "7.8inch_e-Paper_HAT" => {width => 200, height => 200, pindex => 10, id => 23},
|
||||||
# "6inch_e-Paper_HAT" => {width => 200, height => 200, pindex => 10, id => 22},
|
# "6inch_e-Paper_HAT" => {width => 200, height => 200, pindex => 10, id => 22},
|
||||||
# "2.9inch_e-Paper_HAT_(D)" => {width => 200, height => 200, pindex => 10, id => 21},
|
# "2.9inch_e-Paper_HAT_(D)" => {width => 200, height => 200, pindex => 10, id => 21},
|
||||||
"7.5inch_e-Paper_HAT_V2_(B)" => {width => 800, height => 480, pindex => 5, id => 23},
|
"7.5inch_e-Paper_HAT_(B)_HD" => {width => 880, height => 528, pindex => 1, id => 24},
|
||||||
|
"7.5inch_e-Paper_HAT_V2_(B)" => {width => 800, height => 480, pindex => 1, id => 23},
|
||||||
"7.5inch_e-Paper_HAT_V2" => {width => 800, height => 480, pindex => 0, id => 22},
|
"7.5inch_e-Paper_HAT_V2" => {width => 800, height => 480, pindex => 0, id => 22},
|
||||||
"7.5inch_e-Paper_HAT_(C)" => {width => 640, height => 384, pindex => 5, id => 21},
|
"7.5inch_e-Paper_HAT_(C)" => {width => 640, height => 384, pindex => 5, id => 21},
|
||||||
"7.5inch_e-Paper_HAT_(B)" => {width => 640, height => 384, pindex => 1, id => 20},
|
"7.5inch_e-Paper_HAT_(B)" => {width => 640, height => 384, pindex => 1, id => 20},
|
||||||
@ -86,6 +92,7 @@ my %ESPEInk_sets = (
|
|||||||
"upload" => "noArg", # perform upload of converted picture to EInk Display via WLAN
|
"upload" => "noArg", # perform upload of converted picture to EInk Display via WLAN
|
||||||
"addtext" => "textFieldNL", # add text to picture at given position (see set for details)
|
"addtext" => "textFieldNL", # add text to picture at given position (see set for details)
|
||||||
"addicon" => "textFieldNL", # add icon to picture at given position (see set for details)
|
"addicon" => "textFieldNL", # add icon to picture at given position (see set for details)
|
||||||
|
"addsymbol" => "textFieldNL", # add symbol (line, rectangle, ellipse) to picture at given position (see set for details)
|
||||||
"iconreading" => "textFieldNL", # add text to picture at given position (see set for details)
|
"iconreading" => "textFieldNL", # add text to picture at given position (see set for details)
|
||||||
"textreading" => "textFieldNL" # add text to picture at given position (see set for details)
|
"textreading" => "textFieldNL" # add text to picture at given position (see set for details)
|
||||||
);
|
);
|
||||||
@ -260,12 +267,13 @@ sub ESPEInk_Set($@) {
|
|||||||
return "Unknown argument $opt, choose one of " . join(" ", map{ "$_:".$ESPEInk_sets{$_}} keys %ESPEInk_sets);
|
return "Unknown argument $opt, choose one of " . join(" ", map{ "$_:".$ESPEInk_sets{$_}} keys %ESPEInk_sets);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($opt eq 'addtext' || $opt eq 'textreading' || $opt eq 'addicon' || $opt eq 'iconreading') {
|
if ($opt eq 'addtext' || $opt eq 'textreading' || $opt eq 'addicon' || $opt eq 'iconreading' || $opt eq 'addsymbol') {
|
||||||
my ($text, $x, $y, $size, $angle, $color, $font, $linegap, $blockwidth) = split("#",$value);
|
my ($text, $x, $y, $size, $angle, $color, $font, $linegap, $blockwidth) = split("#",$value);
|
||||||
return "No text defined, use format: 'addtext text#x#y#size#angle#color#font'" if (!$text && ($opt eq 'addtext'));
|
return "No text defined, use format: 'addtext text#x#y#size#angle#color#font'" if (!$text && ($opt eq 'addtext'));
|
||||||
return "No reading defined, use format: 'textreading device:reading#x#y#size#angle#color#font'" if (!$text && ($opt eq 'textreading'));
|
return "No reading defined, use format: 'textreading device:reading#x#y#size#angle#color#font'" if (!$text && ($opt eq 'textreading'));
|
||||||
return "No icon defined, use format: 'addicon icon#x#y#size#angle#color'" if (!$text && ($opt eq 'addicon'));
|
return "No icon defined, use format: 'addicon icon#x#y#size#angle#color'" if (!$text && ($opt eq 'addicon'));
|
||||||
return "No reading defined, use format: 'iconreading device:reading#x#y#size#angle#color'" if (!$text && ($opt eq 'iconreading'));
|
return "No reading defined, use format: 'iconreading device:reading#x#y#size#angle#color'" if (!$text && ($opt eq 'iconreading'));
|
||||||
|
return "No symbol defined, use format: 'addsymbol symbol#x#y#size#angle#color#width#height#arc'" if (!$text && ($opt eq 'addsymbol'));
|
||||||
my($texts,$eval) = split("{",$text);
|
my($texts,$eval) = split("{",$text);
|
||||||
my ($device,$reading) = split(':',$texts);
|
my ($device,$reading) = split(':',$texts);
|
||||||
$reading = "state" if (!$reading);
|
$reading = "state" if (!$reading);
|
||||||
@ -288,8 +296,14 @@ sub ESPEInk_Set($@) {
|
|||||||
if ($opt eq 'iconreading' || $opt eq 'addicon') {
|
if ($opt eq 'iconreading' || $opt eq 'addicon') {
|
||||||
readingsBulkUpdate($hash,$itext."-icon",$text) if ($opt eq 'iconreading');
|
readingsBulkUpdate($hash,$itext."-icon",$text) if ($opt eq 'iconreading');
|
||||||
readingsBulkUpdate($hash,$itext."-isIcon",1);
|
readingsBulkUpdate($hash,$itext."-isIcon",1);
|
||||||
} elsif ($opt eq 'textreading' || $opt eq 'addtext') {
|
readingsBulkUpdate($hash,$itext."-isSymbol",0);
|
||||||
readingsBulkUpdate($hash,$itext."-isIcon",0)
|
} elsif ($opt eq 'textreading' || $opt eq 'addtext' || $opt eq 'addsymbol') {
|
||||||
|
readingsBulkUpdate($hash,$itext."-isIcon",0);
|
||||||
|
if ($opt eq 'addsymbol') {
|
||||||
|
readingsBulkUpdate($hash,$itext."-isSymbol",1);
|
||||||
|
} else {
|
||||||
|
readingsBulkUpdate($hash,$itext."-isSymbol",0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$x = 0 if (!$x || (($x !~ '-?\d+')&&($x !~ '(left|mid|right)')));
|
$x = 0 if (!$x || (($x !~ '-?\d+')&&($x !~ '(left|mid|right)')));
|
||||||
@ -299,21 +313,25 @@ sub ESPEInk_Set($@) {
|
|||||||
|
|
||||||
$color = "000000" if (!$color || !ESPEInk_CheckColorString($color));
|
$color = "000000" if (!$color || !ESPEInk_CheckColorString($color));
|
||||||
|
|
||||||
$font = "medium" if (!ESPEInk_CheckFontString($font));
|
$font = "medium" if (!ESPEInk_CheckFontString($font) and ($opt ne 'addsymbol'));
|
||||||
$linegap = 0 if (!$linegap || ($linegap !~ '\d+'));
|
$linegap = 0 if (!$linegap || ($linegap !~ '\d+'));
|
||||||
$blockwidth = 0 if (!$blockwidth || ($blockwidth !~ '\d+'));
|
$blockwidth = 0 if (!$blockwidth || ($blockwidth !~ '\d+'));
|
||||||
|
|
||||||
readingsBulkUpdate($hash,$itext."-def",$opt."#".$value);
|
readingsBulkUpdate($hash,$itext."-def",$opt."#".$value);
|
||||||
readingsBulkUpdate($hash,$itext."-text",$text) if ($opt eq 'addtext');
|
readingsBulkUpdate($hash,$itext."-text",$text) if ($opt eq 'addtext');
|
||||||
|
readingsBulkUpdate($hash,$itext."-symbol",$text) if ($opt eq 'addsymbol');
|
||||||
readingsBulkUpdate($hash,$itext."-icon",$text) if ($opt eq 'addicon');
|
readingsBulkUpdate($hash,$itext."-icon",$text) if ($opt eq 'addicon');
|
||||||
readingsBulkUpdate($hash,$itext."-x",$x);
|
readingsBulkUpdate($hash,$itext."-x",$x);
|
||||||
readingsBulkUpdate($hash,$itext."-y",$y);
|
readingsBulkUpdate($hash,$itext."-y",$y);
|
||||||
readingsBulkUpdate($hash,$itext."-size",$size);
|
readingsBulkUpdate($hash,$itext."-size",$size);
|
||||||
readingsBulkUpdate($hash,$itext."-angle",$angle);
|
readingsBulkUpdate($hash,$itext."-angle",$angle);
|
||||||
readingsBulkUpdate($hash,$itext."-color",$color);
|
readingsBulkUpdate($hash,$itext."-color",$color);
|
||||||
readingsBulkUpdate($hash,$itext."-font",$font) if ($opt eq 'addtext' || $opt eq 'textreading');
|
readingsBulkUpdate($hash,$itext."-font",$font) if (($opt eq 'addtext' || $opt eq 'textreading') and $opt ne 'addsymbol');
|
||||||
readingsBulkUpdate($hash,$itext."-linegap",$linegap);
|
readingsBulkUpdate($hash,$itext."-linegap",$linegap) if ($opt ne 'addsymbol');;
|
||||||
readingsBulkUpdate($hash,$itext."-blockwidth",$blockwidth);
|
readingsBulkUpdate($hash,$itext."-blockwidth",$blockwidth) if ($opt ne 'addsymbol');;
|
||||||
|
readingsBulkUpdate($hash,$itext."-width",$font) if ($opt eq 'addsymbol'); # parameter number 7 is width instead of font for symbols
|
||||||
|
readingsBulkUpdate($hash,$itext."-height",$linegap) if ($opt eq 'addsymbol'); # parameter number 8 is height instead of linegap for symbols
|
||||||
|
readingsBulkUpdate($hash,$itext."-arc",$blockwidth) if ($opt eq 'addsymbol'); # parameter number 9 is height instead of linegap for symbols
|
||||||
|
|
||||||
ESPEInk_AddTextAttributes($name,$itext);
|
ESPEInk_AddTextAttributes($name,$itext);
|
||||||
|
|
||||||
@ -455,9 +473,10 @@ sub ESPEInk_Attr(@) {
|
|||||||
} elsif($attr_name =~ '.*-trigger') {
|
} elsif($attr_name =~ '.*-trigger') {
|
||||||
my ($ind,$cmd) = split("-",$attr_name);
|
my ($ind,$cmd) = split("-",$attr_name);
|
||||||
my ($type,$trigger) = split("#",ReadingsVal($name,$ind."-def",""));
|
my ($type,$trigger) = split("#",ReadingsVal($name,$ind."-def",""));
|
||||||
readingsDelete($hash,"$ind-trigger") if ($type eq 'addtext' || $type eq 'addicon');
|
readingsDelete($hash,"$ind-trigger") if ($type eq 'addtext' || $type eq 'addicon' || $type eq 'addsymbol');
|
||||||
readingsSingleUpdate( $hash, "$ind-icon", $trigger, 1 ) if ($trigger && ReadingsVal($name,"$ind-isIcon",0));
|
readingsSingleUpdate( $hash, "$ind-icon", $trigger, 1 ) if ($trigger && ReadingsVal($name,"$ind-isIcon",0));
|
||||||
readingsSingleUpdate( $hash, "$ind-text", $trigger, 1 ) if ($trigger && !ReadingsVal($name,"$ind-isIcon",0));
|
readingsSingleUpdate( $hash, "$ind-text", $trigger, 1 ) if ($trigger && !ReadingsVal($name,"$ind-isIcon",0) && $type eq 'addtext');
|
||||||
|
readingsSingleUpdate( $hash, "$ind-sybmol", $trigger, 1 ) if ($trigger && !ReadingsVal($name,"$ind-isIcon",0) && $type eq 'addsymbol');
|
||||||
Log3 $hash, 5, "$name: deleted attribute $attr_name for triggering reset to initial definition";
|
Log3 $hash, 5, "$name: deleted attribute $attr_name for triggering reset to initial definition";
|
||||||
} elsif($attr_name =~ '^\d+-.*') {
|
} elsif($attr_name =~ '^\d+-.*') {
|
||||||
my ($ind,$cmd) = split("-",$attr_name);
|
my ($ind,$cmd) = split("-",$attr_name);
|
||||||
@ -467,6 +486,8 @@ sub ESPEInk_Attr(@) {
|
|||||||
|
|
||||||
if ($cmd =~ "text") {
|
if ($cmd =~ "text") {
|
||||||
readingsSingleUpdate( $hash, "$ind-text", $text, 1 ) if ($text);
|
readingsSingleUpdate( $hash, "$ind-text", $text, 1 ) if ($text);
|
||||||
|
} elsif ($cmd =~ "sybmol") {
|
||||||
|
readingsSingleUpdate( $hash, "$ind-symbol", $text, 1 ) if ($text);
|
||||||
} elsif ($cmd =~ "icon") {
|
} elsif ($cmd =~ "icon") {
|
||||||
readingsSingleUpdate( $hash, "$ind-icon", $text, 1 ) if ($text);
|
readingsSingleUpdate( $hash, "$ind-icon", $text, 1 ) if ($text);
|
||||||
} elsif ($cmd =~ "x") {
|
} elsif ($cmd =~ "x") {
|
||||||
@ -493,6 +514,15 @@ sub ESPEInk_Attr(@) {
|
|||||||
} elsif ($cmd =~ "blockwidth" && !ReadingsVal($name,"$ind-isIcon",0)) {
|
} elsif ($cmd =~ "blockwidth" && !ReadingsVal($name,"$ind-isIcon",0)) {
|
||||||
readingsSingleUpdate( $hash, "$ind-blockwidth", $blockwidth, 1 ) if ($blockwidth);
|
readingsSingleUpdate( $hash, "$ind-blockwidth", $blockwidth, 1 ) if ($blockwidth);
|
||||||
readingsSingleUpdate( $hash, "$ind-blockwidth", 0, 1 ) if (!$blockwidth);
|
readingsSingleUpdate( $hash, "$ind-blockwidth", 0, 1 ) if (!$blockwidth);
|
||||||
|
} elsif ($cmd =~ "width" && !ReadingsVal($name,"$ind-isIcon",0)) {
|
||||||
|
readingsSingleUpdate( $hash, "$ind-width", $font, 1 ) if ($font);
|
||||||
|
readingsSingleUpdate( $hash, "$ind-width", 0, 1 ) if (!$font);
|
||||||
|
} elsif ($cmd =~ "height" && !ReadingsVal($name,"$ind-isIcon",0)) {
|
||||||
|
readingsSingleUpdate( $hash, "$ind-height", $linegap, 1 ) if ($linegap);
|
||||||
|
readingsSingleUpdate( $hash, "$ind-height", 0, 1 ) if (!$linegap);
|
||||||
|
} elsif ($cmd =~ "arc" && !ReadingsVal($name,"$ind-isIcon",0)) {
|
||||||
|
readingsSingleUpdate( $hash, "$ind-arc", $blockwidth, 1 ) if ($blockwidth);
|
||||||
|
readingsSingleUpdate( $hash, "$ind-arc", 0, 1 ) if (!$blockwidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log3 $hash, 5, "$name: deleted attribute $attr_name reset to default if in initial definition (set ".$name." ".$type.")";
|
Log3 $hash, 5, "$name: deleted attribute $attr_name reset to default if in initial definition (set ".$name." ".$type.")";
|
||||||
@ -807,7 +837,8 @@ sub ESPEInk_CheckIconString($) {
|
|||||||
# Add all new attributes (text, position, size, angle, color, font) for a text object
|
# Add all new attributes (text, position, size, angle, color, font) for a text object
|
||||||
sub ESPEInk_AddTextAttributes($$) {
|
sub ESPEInk_AddTextAttributes($$) {
|
||||||
my ($name,$itext) = @_;
|
my ($name,$itext) = @_;
|
||||||
addToDevAttrList($name, "$itext-text") if (!ReadingsVal($name,"$itext-isIcon",0));
|
addToDevAttrList($name, "$itext-text") if (!ReadingsVal($name,"$itext-isIcon",0) and !ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$itext-symbol") if (!ReadingsVal($name,"$itext-isIcon",0) and ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
addToDevAttrList($name, "$itext-icon") if (ReadingsVal($name,"$itext-isIcon",0));
|
addToDevAttrList($name, "$itext-icon") if (ReadingsVal($name,"$itext-isIcon",0));
|
||||||
addToDevAttrList($name, "$itext-trigger");
|
addToDevAttrList($name, "$itext-trigger");
|
||||||
addToDevAttrList($name, "$itext-x");
|
addToDevAttrList($name, "$itext-x");
|
||||||
@ -815,9 +846,12 @@ sub ESPEInk_AddTextAttributes($$) {
|
|||||||
addToDevAttrList($name, "$itext-size");
|
addToDevAttrList($name, "$itext-size");
|
||||||
addToDevAttrList($name, "$itext-angle");
|
addToDevAttrList($name, "$itext-angle");
|
||||||
addToDevAttrList($name, "$itext-color:colorpicker,RGB");
|
addToDevAttrList($name, "$itext-color:colorpicker,RGB");
|
||||||
addToDevAttrList($name, "$itext-font") if (!ReadingsVal($name,"$itext-isIcon",0));
|
addToDevAttrList($name, "$itext-font") if (!ReadingsVal($name,"$itext-isIcon",0) && !ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
addToDevAttrList($name, "$itext-linegap") if (!ReadingsVal($name,"$itext-isIcon",0));
|
addToDevAttrList($name, "$itext-linegap") if (!ReadingsVal($name,"$itext-isIcon",0) && !ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
addToDevAttrList($name, "$itext-blockwidth") if (!ReadingsVal($name,"$itext-isIcon",0));
|
addToDevAttrList($name, "$itext-blockwidth") if (!ReadingsVal($name,"$itext-isIcon",0) && !ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$itext-width") if (!ReadingsVal($name,"$itext-isIcon",0) && ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$itext-height") if (!ReadingsVal($name,"$itext-isIcon",0) && ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$itext-arc") if (!ReadingsVal($name,"$itext-isIcon",0) && ReadingsVal($name,"$itext-isSymbol",0));
|
||||||
}
|
}
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
@ -883,9 +917,11 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
if ($itext <= $deftexts) {
|
if ($itext <= $deftexts) {
|
||||||
|
|
||||||
my $isicon = ReadingsVal($name,"$itext-isIcon",0);
|
my $isicon = ReadingsVal($name,"$itext-isIcon",0);
|
||||||
|
my $issymbol = ReadingsVal($name,"$itext-isSymbol",0);
|
||||||
|
|
||||||
readingsDelete($hash,$itext."-def");
|
readingsDelete($hash,$itext."-def");
|
||||||
readingsDelete($hash,$itext."-text");
|
readingsDelete($hash,$itext."-text");
|
||||||
|
readingsDelete($hash,$itext."-symbol");
|
||||||
readingsDelete($hash,$itext."-icon");
|
readingsDelete($hash,$itext."-icon");
|
||||||
readingsDelete($hash,$itext."-trigger");
|
readingsDelete($hash,$itext."-trigger");
|
||||||
readingsDelete($hash,$itext."-x");
|
readingsDelete($hash,$itext."-x");
|
||||||
@ -897,13 +933,19 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
readingsDelete($hash,$itext."-linegap");
|
readingsDelete($hash,$itext."-linegap");
|
||||||
readingsDelete($hash,$itext."-blockwidth");
|
readingsDelete($hash,$itext."-blockwidth");
|
||||||
readingsDelete($hash,$itext."-isIcon");
|
readingsDelete($hash,$itext."-isIcon");
|
||||||
|
readingsDelete($hash,$itext."-isSymbol");
|
||||||
|
readingsDelete($hash,$itext."-width");
|
||||||
|
readingsDelete($hash,$itext."-height");
|
||||||
|
readingsDelete($hash,$itext."-arc");
|
||||||
readingsBeginUpdate($hash);
|
readingsBeginUpdate($hash);
|
||||||
|
|
||||||
for (my $i=$itext; $i<$deftexts; $i++) {
|
for (my $i=$itext; $i<$deftexts; $i++) {
|
||||||
$isicon = ReadingsVal($name,"$i-isIcon",0) if ($i > $itext);
|
$isicon = ReadingsVal($name,"$i-isIcon",0) if ($i > $itext);
|
||||||
|
$issymbol = ReadingsVal($name,"$i-isSymbol",0) if ($i > $itext);
|
||||||
|
|
||||||
readingsBulkUpdate($hash,$i."-def",ReadingsVal($name,($i+1)."-def",""));
|
readingsBulkUpdate($hash,$i."-def",ReadingsVal($name,($i+1)."-def",""));
|
||||||
readingsBulkUpdate($hash,$i."-text",ReadingsVal($name,($i+1)."-text","")) if (!ReadingsVal($name,($i+1)."-isIcon",0));
|
readingsBulkUpdate($hash,$i."-text",ReadingsVal($name,($i+1)."-text","")) if (!ReadingsVal($name,($i+1)."-isIcon",0) and !ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
readingsBulkUpdate($hash,$i."-sybmol",ReadingsVal($name,($i+1)."-symbol","")) if (!ReadingsVal($name,($i+1)."-isIcon",0) and ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
readingsBulkUpdate($hash,$i."-icon",ReadingsVal($name,($i+1)."-icon","")) if (ReadingsVal($name,($i+1)."-isIcon",0));
|
readingsBulkUpdate($hash,$i."-icon",ReadingsVal($name,($i+1)."-icon","")) if (ReadingsVal($name,($i+1)."-isIcon",0));
|
||||||
readingsBulkUpdate($hash,$i."-trigger",ReadingsVal($name,($i+1)."-trigger","")) if (ReadingsVal($name,($i+1)."-trigger",undef));
|
readingsBulkUpdate($hash,$i."-trigger",ReadingsVal($name,($i+1)."-trigger","")) if (ReadingsVal($name,($i+1)."-trigger",undef));
|
||||||
readingsBulkUpdate($hash,$i."-x",ReadingsVal($name,($i+1)."-x",""));
|
readingsBulkUpdate($hash,$i."-x",ReadingsVal($name,($i+1)."-x",""));
|
||||||
@ -914,13 +956,25 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
readingsBulkUpdate($hash,$i."-font",ReadingsVal($name,($i+1)."-font","")) if (ReadingsVal($name,($i+1)."-font",undef));
|
readingsBulkUpdate($hash,$i."-font",ReadingsVal($name,($i+1)."-font","")) if (ReadingsVal($name,($i+1)."-font",undef));
|
||||||
readingsBulkUpdate($hash,$i."-linegap",ReadingsVal($name,($i+1)."-linegap","")) if (ReadingsVal($name,($i+1)."-linegap",undef));
|
readingsBulkUpdate($hash,$i."-linegap",ReadingsVal($name,($i+1)."-linegap","")) if (ReadingsVal($name,($i+1)."-linegap",undef));
|
||||||
readingsBulkUpdate($hash,$i."-blockwidth",ReadingsVal($name,($i+1)."-blockwidth","")) if (ReadingsVal($name,($i+1)."-blockwidth",undef));
|
readingsBulkUpdate($hash,$i."-blockwidth",ReadingsVal($name,($i+1)."-blockwidth","")) if (ReadingsVal($name,($i+1)."-blockwidth",undef));
|
||||||
|
readingsBulkUpdate($hash,$i."-width",ReadingsVal($name,($i+1)."-width","")) if (ReadingsVal($name,($i+1)."-width",undef));
|
||||||
|
readingsBulkUpdate($hash,$i."-height",ReadingsVal($name,($i+1)."-height","")) if (ReadingsVal($name,($i+1)."-height",undef));
|
||||||
|
readingsBulkUpdate($hash,$i."-arc",ReadingsVal($name,($i+1)."-arc","")) if (ReadingsVal($name,($i+1)."-arc",undef));
|
||||||
|
|
||||||
addToDevAttrList($name, "$i-font") if ($isicon && !ReadingsVal($name,($i+1)."-isIcon",0));
|
addToDevAttrList($name, "$i-font") if ($isicon && !ReadingsVal($name,($i+1)."-isIcon",0) && !ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
delFromDevAttrList($name, "$i-font") if (ReadingsVal($name,($i+1)."-isIcon",0));
|
delFromDevAttrList($name, "$i-font") if (ReadingsVal($name,($i+1)."-isIcon",0) && !ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
|
||||||
|
addToDevAttrList($name, "$i-width") if ($isicon && !ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
delFromDevAttrList($name, "$i-width") if (ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$i-height") if ($isicon && !ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
delFromDevAttrList($name, "$i-height") if (ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
addToDevAttrList($name, "$i-arc") if ($isicon && !ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
delFromDevAttrList($name, "$i-arc") if (ReadingsVal($name,($i+1)."-isIcon",0) && ReadingsVal($name,($i+1)."-isSymbol",0));
|
||||||
|
|
||||||
readingsBulkUpdate($hash,$i."-isIcon",ReadingsVal($name,($i+1)."-isIcon",""));
|
readingsBulkUpdate($hash,$i."-isIcon",ReadingsVal($name,($i+1)."-isIcon",""));
|
||||||
|
readingsBulkUpdate($hash,$i."-isSymbol",ReadingsVal($name,($i+1)."-isSymbol",""));
|
||||||
|
|
||||||
if (defined(AttrVal($name,($i+1).'-text',undef))) {fhem("attr $name $i-text ".AttrVal($name,($i+1)."-text",""))} else {delFromDevAttrList($name, "$i-text")};
|
if (defined(AttrVal($name,($i+1).'-text',undef))) {fhem("attr $name $i-text ".AttrVal($name,($i+1)."-text",""))} else {delFromDevAttrList($name, "$i-text")};
|
||||||
|
if (defined(AttrVal($name,($i+1).'-sybmol',undef))) {fhem("attr $name $i-sybmol ".AttrVal($name,($i+1)."-sybmol",""))} else {delFromDevAttrList($name, "$i-sybmol")};
|
||||||
if (defined(AttrVal($name,($i+1).'-icon',undef))) {fhem("attr $name $i-icon ".AttrVal($name,($i+1)."-icon",""))} else {delFromDevAttrList($name, "$i-icon")};
|
if (defined(AttrVal($name,($i+1).'-icon',undef))) {fhem("attr $name $i-icon ".AttrVal($name,($i+1)."-icon",""))} else {delFromDevAttrList($name, "$i-icon")};
|
||||||
if (defined(AttrVal($name,($i+1).'-trigger',undef))) {fhem("attr $name $i-trigger ".AttrVal($name,($i+1)."-trigger",""))} else {delFromDevAttrList($name, "$i-trigger")};
|
if (defined(AttrVal($name,($i+1).'-trigger',undef))) {fhem("attr $name $i-trigger ".AttrVal($name,($i+1)."-trigger",""))} else {delFromDevAttrList($name, "$i-trigger")};
|
||||||
if (defined(AttrVal($name,($i+1).'-x',undef))) {fhem("attr $name $i-x ".AttrVal($name,($i+1)."-x",0))} else {delFromDevAttrList($name, "$i-x")};
|
if (defined(AttrVal($name,($i+1).'-x',undef))) {fhem("attr $name $i-x ".AttrVal($name,($i+1)."-x",0))} else {delFromDevAttrList($name, "$i-x")};
|
||||||
@ -931,6 +985,9 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
if (defined(AttrVal($name,($i+1).'-font',undef))) {fhem("attr $name $i-font ".AttrVal($name,($i+1)."-font","medium"))} else {delFromDevAttrList($name, "$i-font")};
|
if (defined(AttrVal($name,($i+1).'-font',undef))) {fhem("attr $name $i-font ".AttrVal($name,($i+1)."-font","medium"))} else {delFromDevAttrList($name, "$i-font")};
|
||||||
if (defined(AttrVal($name,($i+1).'-linegap',undef))) {fhem("attr $name $i-linegap ".AttrVal($name,($i+1)."-linegap",0))} else {delFromDevAttrList($name, "$i-linegap")};
|
if (defined(AttrVal($name,($i+1).'-linegap',undef))) {fhem("attr $name $i-linegap ".AttrVal($name,($i+1)."-linegap",0))} else {delFromDevAttrList($name, "$i-linegap")};
|
||||||
if (defined(AttrVal($name,($i+1).'-blockwidth',undef))) {fhem("attr $name $i-blockwidth ".AttrVal($name,($i+1)."-blockwidth",0))} else {delFromDevAttrList($name, "$i-blockwidth")};
|
if (defined(AttrVal($name,($i+1).'-blockwidth',undef))) {fhem("attr $name $i-blockwidth ".AttrVal($name,($i+1)."-blockwidth",0))} else {delFromDevAttrList($name, "$i-blockwidth")};
|
||||||
|
if (defined(AttrVal($name,($i+1).'-width',undef))) {fhem("attr $name $i-width ".AttrVal($name,($i+1)."-width",0))} else {delFromDevAttrList($name, "$i-width")};
|
||||||
|
if (defined(AttrVal($name,($i+1).'-height',undef))) {fhem("attr $name $i-height ".AttrVal($name,($i+1)."-height",0))} else {delFromDevAttrList($name, "$i-height")};
|
||||||
|
if (defined(AttrVal($name,($i+1).'-arc',undef))) {fhem("attr $name $i-arc ".AttrVal($name,($i+1)."-arc",0))} else {delFromDevAttrList($name, "$i-arc")};
|
||||||
}
|
}
|
||||||
|
|
||||||
readingsBulkUpdate($hash,"deftexts",($deftexts-1));
|
readingsBulkUpdate($hash,"deftexts",($deftexts-1));
|
||||||
@ -938,6 +995,7 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
|
|
||||||
readingsDelete($hash,"$deftexts-def");
|
readingsDelete($hash,"$deftexts-def");
|
||||||
readingsDelete($hash,"$deftexts-text");
|
readingsDelete($hash,"$deftexts-text");
|
||||||
|
readingsDelete($hash,"$deftexts-symbol");
|
||||||
readingsDelete($hash,"$deftexts-icon");
|
readingsDelete($hash,"$deftexts-icon");
|
||||||
readingsDelete($hash,"$deftexts-trigger");
|
readingsDelete($hash,"$deftexts-trigger");
|
||||||
readingsDelete($hash,"$deftexts-x");
|
readingsDelete($hash,"$deftexts-x");
|
||||||
@ -949,8 +1007,13 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
readingsDelete($hash,"$deftexts-linegap");
|
readingsDelete($hash,"$deftexts-linegap");
|
||||||
readingsDelete($hash,"$deftexts-blockwidth");
|
readingsDelete($hash,"$deftexts-blockwidth");
|
||||||
readingsDelete($hash,"$deftexts-isIcon");
|
readingsDelete($hash,"$deftexts-isIcon");
|
||||||
|
readingsDelete($hash,"$deftexts-isSymbol");
|
||||||
|
readingsDelete($hash,"$deftexts-width");
|
||||||
|
readingsDelete($hash,"$deftexts-height");
|
||||||
|
readingsDelete($hash,"$deftexts-arc");
|
||||||
|
|
||||||
delFromDevAttrList($name, "$deftexts-text");
|
delFromDevAttrList($name, "$deftexts-text");
|
||||||
|
delFromDevAttrList($name, "$deftexts-symbol");
|
||||||
delFromDevAttrList($name, "$deftexts-icon");
|
delFromDevAttrList($name, "$deftexts-icon");
|
||||||
delFromDevAttrList($name, "$deftexts-trigger");
|
delFromDevAttrList($name, "$deftexts-trigger");
|
||||||
delFromDevAttrList($name, "$deftexts-x");
|
delFromDevAttrList($name, "$deftexts-x");
|
||||||
@ -961,8 +1024,11 @@ sub ESPEInk_RemoveTextReadings($$){
|
|||||||
delFromDevAttrList($name, "$deftexts-font");
|
delFromDevAttrList($name, "$deftexts-font");
|
||||||
delFromDevAttrList($name, "$deftexts-linegap");
|
delFromDevAttrList($name, "$deftexts-linegap");
|
||||||
delFromDevAttrList($name, "$deftexts-blockwidth");
|
delFromDevAttrList($name, "$deftexts-blockwidth");
|
||||||
|
delFromDevAttrList($name, "$deftexts-width");
|
||||||
|
delFromDevAttrList($name, "$deftexts-height");
|
||||||
|
delFromDevAttrList($name, "$deftexts-arc");
|
||||||
|
|
||||||
Log3 $hash, 5, "$name: Removed readings for ".(ReadingsVal($name,"$deftexts-isIcon",0)?"icon":"text");
|
Log3 $hash, 5, "$name: Removed readings for ".(ReadingsVal($name,"$deftexts-isIcon",0)?"icon":(ReadingsVal($name,"$deftexts-isSymbol",0)?"symbol":"text"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1084,50 +1150,51 @@ sub ESPEInk_FormatBlockText($$$$$$$) {
|
|||||||
my $text = $txt;
|
my $text = $txt;
|
||||||
|
|
||||||
if ($blockwidth) { # insert additional \n if width of text reaches maximum width
|
if ($blockwidth) { # insert additional \n if width of text reaches maximum width
|
||||||
|
|
||||||
my @words;
|
my @words;
|
||||||
my $xoffset = 0;
|
my $xoffset = 0;
|
||||||
my ($wspc, $ww, $wh);
|
my ($wspc, $ww, $wh);
|
||||||
my $newline = 1;
|
my $newline = 1;
|
||||||
($wspc, $wh) = ESPEInk_GetStringPixelWidth($name," ",$fnt,$angle,$size);
|
($wspc, $wh) = ESPEInk_GetStringPixelWidth($name," ",$fnt,$angle,$size);
|
||||||
|
|
||||||
|
$text =~ s/\n/\\n/gm;
|
||||||
|
# Debug "text :$text:";
|
||||||
|
|
||||||
|
|
||||||
@words = split(/[ ]/,$text);
|
@words = split(/[ ]/,$text);
|
||||||
$text = "";
|
$text = "";
|
||||||
foreach my $word (@words) {
|
foreach my $word (@words) {
|
||||||
|
my $ww2;
|
||||||
|
my $wd;
|
||||||
|
while ( $word =~ /(.*)\\n(.*)/ ) {
|
||||||
|
$wd = $1;
|
||||||
|
$word = $2;
|
||||||
|
my ($ww2, $wh) = ESPEInk_GetStringPixelWidth($name,$wd,$fnt,$angle,$size);
|
||||||
|
# Debug " offset :$xoffset: width :$ww2: spacew :$wspc: text :$wd: ";
|
||||||
|
if (($xoffset+$ww2) <= $blockwidth) {
|
||||||
|
$wd = (($newline)?"":" ") . $wd;
|
||||||
|
} else {
|
||||||
|
$wd = "\\n" . $wd;
|
||||||
|
}
|
||||||
|
$xoffset = 0;
|
||||||
|
$newline = 1;
|
||||||
|
$text = $text . $wd . "\\n";
|
||||||
|
}
|
||||||
|
|
||||||
($ww, $wh) = ESPEInk_GetStringPixelWidth($name,$word,$fnt,$angle,$size);
|
($ww, $wh) = ESPEInk_GetStringPixelWidth($name,$word,$fnt,$angle,$size);
|
||||||
|
# Debug " offset :$xoffset: width :$ww: spacew :$wspc: text :$word: ";
|
||||||
Log3 $defs{$name}, 5, "--->> Width (outer) of $word (lengt ".length($word).") is: $ww, Width of Space is: $wspc, Text offset is: $xoffset";
|
Log3 $defs{$name}, 5, "--->> Width (outer) of $word (lengt ".length($word).") is: $ww, Width of Space is: $wspc, Text offset is: $xoffset";
|
||||||
if ($word =~ /.*\\n.*/) {
|
if (($xoffset+$ww) <= $blockwidth) {
|
||||||
my $ww2;
|
$word = (($newline)?"":" ") . $word;
|
||||||
foreach my $wd (split(/[\\n]/,$word)) {
|
$xoffset = $xoffset + $ww + $wspc;
|
||||||
($ww2, $wh) = ESPEInk_GetStringPixelWidth($name,$wd,$fnt,$angle,$size);
|
$newline = 0;
|
||||||
Log3 $defs{$name}, 5, "--->> Width (inner) of $wd (lengt ".length($wd).") is: $ww2, Width of Space is: $wspc, Text offset is: $xoffset";
|
} else {
|
||||||
if (length($wd) > 0) {
|
$word = "\\n" . $word . " ";
|
||||||
if (($xoffset+$ww2) <= $blockwidth) {
|
# $word = $word . "\\n" if ($newline);
|
||||||
$wd = (($xoffset==0)?"":" ") . $wd;
|
$xoffset = $ww + $wspc;
|
||||||
$xoffset = $xoffset + $ww2 + $wspc;
|
$newline = 1;
|
||||||
$newline = 0;
|
}
|
||||||
} else {
|
$text = $text . $word;
|
||||||
$wd = "\\n" . $wd . " " if (!$newline);
|
|
||||||
$wd = $wd . "\\n" if ($newline);
|
|
||||||
$xoffset = $ww2 + $wspc;
|
|
||||||
$newline = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$xoffset = 0 if (length($wd) == 0);
|
|
||||||
$wd = $wd . "\\n" if (length($wd) == 0);
|
|
||||||
$text = $text . $wd;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (($xoffset+$ww) <= $blockwidth) {
|
|
||||||
$word = (($newline)?"":" ") . $word;
|
|
||||||
$xoffset = $xoffset + $ww + $wspc;
|
|
||||||
$newline = 0;
|
|
||||||
} else {
|
|
||||||
$word = "\\n" . $word . " ";
|
|
||||||
# $word = $word . "\\n" if ($newline);
|
|
||||||
$xoffset = $ww + $wspc;
|
|
||||||
$newline = 1;
|
|
||||||
}
|
|
||||||
$text = $text . $word;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Log3 $defs{$name}, 5, "--->> Text is: $text";
|
Log3 $defs{$name}, 5, "--->> Text is: $text";
|
||||||
}
|
}
|
||||||
@ -1173,19 +1240,19 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
$linegap = int($linegap) if ($linegap);
|
$linegap = int($linegap) if ($linegap);
|
||||||
$blockwidth = int($blockwidth) if ($blockwidth);
|
$blockwidth = int($blockwidth) if ($blockwidth);
|
||||||
|
|
||||||
|
next if (!defined $type);
|
||||||
|
next if (!defined $text);
|
||||||
|
|
||||||
$x = 0 if (!$x || (($x !~ '-?\d+')&&($x !~ '(left|mid|right)')));
|
$x = 0 if (!$x || (($x !~ '-?\d+')&&($x !~ '(left|mid|right)')));
|
||||||
$y = 0 if (!$y || (($y !~ '-?\d+')&&($y !~ '(top|mid|bottom)')));
|
$y = 0 if (!$y || (($y !~ '-?\d+')&&($y !~ '(top|mid|bottom)')));
|
||||||
$size = 10 if (!$size || ($size !~ '-?\d+'));
|
$size = 10 if (!$size || ($size !~ '-?\d+'));
|
||||||
$ang = 0 if (!$ang || ($ang !~ '-?\d+'));
|
$ang = 0 if (!$ang || ($ang !~ '-?\d+'));
|
||||||
$docolor = $col?1:0;
|
$docolor = $col?1:0;
|
||||||
$col = "000000" if (!$col || !ESPEInk_CheckColorString($col));
|
$col = "000000" if (!$col || !ESPEInk_CheckColorString($col));
|
||||||
$fnt = "medium" if (!ESPEInk_CheckFontString($fnt));
|
$fnt = "medium" if (!ESPEInk_CheckFontString($fnt) && $type ne "addsymbol");
|
||||||
$angle = $ang/180*(4*atan2(1,1));
|
$angle = $ang/180*(4*atan2(1,1));
|
||||||
$color = $col;
|
$color = $col;
|
||||||
|
|
||||||
next if (!defined $type);
|
|
||||||
next if (!defined $text);
|
|
||||||
|
|
||||||
if ($type eq "iconreading" || $type eq "textreading") {
|
if ($type eq "iconreading" || $type eq "textreading") {
|
||||||
my $eval=0;
|
my $eval=0;
|
||||||
($text,$eval) = split("{",$text);
|
($text,$eval) = split("{",$text);
|
||||||
@ -1284,15 +1351,20 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
($x,$y) = ESPEInk_CorrectXY($name,$type,"$dw#$dh",$fnt,$ang,$size,$iw,$ih,$x,$y);
|
($x,$y) = ESPEInk_CorrectXY($name,$type,"$dw#$dh",$fnt,$ang,$size,$iw,$ih,$x,$y);
|
||||||
$image->copyResized($icon_img_rot,$x,$y,0,0,$dw,$dh,$srw,$srh);
|
$image->copyResized($icon_img_rot,$x,$y,0,0,$dw,$dh,$srw,$srh);
|
||||||
}
|
}
|
||||||
} else {
|
} elsif ($type ne "addsymbol") {
|
||||||
$font = gdGiantFont if ($fnt eq "giant");
|
$font = gdGiantFont if ($fnt eq "giant");
|
||||||
$font = gdLargeFont if ($fnt eq "large");
|
$font = gdLargeFont if ($fnt eq "large");
|
||||||
$font = gdMediumBoldFont if ($fnt eq "medium");
|
$font = gdMediumBoldFont if ($fnt eq "medium");
|
||||||
$font = gdSmallFont if ($fnt eq "small");
|
$font = gdSmallFont if ($fnt eq "small");
|
||||||
my ($dw,$dh) = $image->getBounds;
|
my ($dw,$dh) = $image->getBounds;
|
||||||
my $ly = $y;
|
my $ly = $y;
|
||||||
my ($tw, $th) = ESPEInk_GetStringPixelWidth($name,$text,$fnt,$ang,$size);
|
|
||||||
|
# Do not use full text here, since only height is relevant here and this can be calced from one char
|
||||||
|
#
|
||||||
|
my ($tw, $th) = ESPEInk_GetStringPixelWidth($name,"A",$fnt,$ang,$size);
|
||||||
|
# Debug "line height : $th :";
|
||||||
$th += $linegap if ($linegap);
|
$th += $linegap if ($linegap);
|
||||||
|
# Debug "line height after : $th :";
|
||||||
|
|
||||||
$text = ESPEInk_FormatBlockText($name,$text,$fnt,$ang,$size,$blockwidth,$th);
|
$text = ESPEInk_FormatBlockText($name,$text,$fnt,$ang,$size,$blockwidth,$th);
|
||||||
|
|
||||||
@ -1310,6 +1382,49 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
}
|
}
|
||||||
$ly += $th;
|
$ly += $th;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
my ($sym,$s1,$s2) = ("","","");
|
||||||
|
($sym,$s1,$s2) = split("-",$text);
|
||||||
|
my $width = $fnt;
|
||||||
|
my $height = $linegap;
|
||||||
|
$image->setStyle($color);
|
||||||
|
if ($sym eq "line") {
|
||||||
|
my $angle = atan2($height,$width);
|
||||||
|
for (my $i=0;$i<$size;$i++) {
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
$image->line($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
$x+=sin($angle);
|
||||||
|
$y-=cos($angle);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "rectangle") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledRectangle($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
} else {
|
||||||
|
$image->rectangle($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "ellipse") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledEllipse($x+$width/2,$y+$height/2,$width,$height,gdStyled);
|
||||||
|
} else {
|
||||||
|
$image->ellipse($x+$width/2,$y+$height/2,$width,$height,gdStyled);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "arc") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledArc($x+$width/2,$y+$height/2,$width,$height,$ang,$ang+$blockwidth,gdStyled,gdEdged);
|
||||||
|
} else {
|
||||||
|
$image->arc($x+$width/2,$y+$height/2,$width,$height,$ang,$ang+$blockwidth,gdStyled);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1397,7 +1512,7 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
my ($x,$y) = ESPEInk_CorrectXY($name,"icon","$dw#$dh",ReadingsVal($name,"$itext-font",""),ReadingsVal($name,"$itext-angle",""),ReadingsVal($name,"$itext-size",""),$iw,$ih,ReadingsVal($name,"$itext-x",0),ReadingsVal($name,"$itext-y",0));
|
my ($x,$y) = ESPEInk_CorrectXY($name,"icon","$dw#$dh",ReadingsVal($name,"$itext-font",""),ReadingsVal($name,"$itext-angle",""),ReadingsVal($name,"$itext-size",""),$iw,$ih,ReadingsVal($name,"$itext-x",0),ReadingsVal($name,"$itext-y",0));
|
||||||
$image->copyResized($icon_img_rot,$x,$y,0,0,$dw,$dh,$srw,$srh);
|
$image->copyResized($icon_img_rot,$x,$y,0,0,$dw,$dh,$srw,$srh);
|
||||||
}
|
}
|
||||||
} else {
|
} elsif (!ReadingsVal($name,"$itext-isSymbol",0)) {
|
||||||
$font = undef;
|
$font = undef;
|
||||||
$font = gdGiantFont if (ReadingsVal($name,"$itext-font","") eq "giant");
|
$font = gdGiantFont if (ReadingsVal($name,"$itext-font","") eq "giant");
|
||||||
$font = gdLargeFont if (ReadingsVal($name,"$itext-font","") eq "large");
|
$font = gdLargeFont if (ReadingsVal($name,"$itext-font","") eq "large");
|
||||||
@ -1405,7 +1520,9 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
$font = gdSmallFont if (ReadingsVal($name,"$itext-font","") eq "small");
|
$font = gdSmallFont if (ReadingsVal($name,"$itext-font","") eq "small");
|
||||||
my ($dw,$dh) = $image->getBounds;
|
my ($dw,$dh) = $image->getBounds;
|
||||||
my $ly = ReadingsVal($name,"$itext-y",0);
|
my $ly = ReadingsVal($name,"$itext-y",0);
|
||||||
my ($tw, $th) = ESPEInk_GetStringPixelWidth($name,ReadingsVal($name,"$itext-text",""),ReadingsVal($name,"$itext-font","small"),ReadingsVal($name,"$itext-angle",0),ReadingsVal($name,"$itext-size",10));
|
# Do not use full text here, since only height is relevant here and this can be calced from one char
|
||||||
|
#
|
||||||
|
my ($tw, $th) = ESPEInk_GetStringPixelWidth($name,"A",ReadingsVal($name,"$itext-font","small"),ReadingsVal($name,"$itext-angle",0),ReadingsVal($name,"$itext-size",10));
|
||||||
$th += int(ReadingsVal($name,"$itext-linegap",0));
|
$th += int(ReadingsVal($name,"$itext-linegap",0));
|
||||||
|
|
||||||
my $text = ESPEInk_FormatBlockText($name,ReadingsVal($name,"$itext-text",""),ReadingsVal($name,"$itext-font","small"),ReadingsVal($name,"$itext-angle",0),ReadingsVal($name,"$itext-size",10),int(ReadingsVal($name,"$itext-blockwidth",0)),$th);
|
my $text = ESPEInk_FormatBlockText($name,ReadingsVal($name,"$itext-text",""),ReadingsVal($name,"$itext-font","small"),ReadingsVal($name,"$itext-angle",0),ReadingsVal($name,"$itext-size",10),int(ReadingsVal($name,"$itext-blockwidth",0)),$th);
|
||||||
@ -1424,6 +1541,54 @@ sub ESPEInk_AddObjects($$) {
|
|||||||
}
|
}
|
||||||
$ly += $th;
|
$ly += $th;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
my ($sym,$s1,$s2) = ("","","");
|
||||||
|
($sym,$s1,$s2) = split("-",ReadingsVal($name,"$itext-symbol",""));
|
||||||
|
my $size = ReadingsVal($name,"$itext-size","");
|
||||||
|
my $width = ReadingsVal($name,"$itext-width",0);
|
||||||
|
my $height = ReadingsVal($name,"$itext-height",0);
|
||||||
|
my $ang = ReadingsVal($name,"$itext-angle",0);
|
||||||
|
my $arc = ReadingsVal($name,"$itext-arc",0);
|
||||||
|
my $x = ReadingsVal($name,"$itext-x",0);
|
||||||
|
my $y = ReadingsVal($name,"$itext-y",0);
|
||||||
|
$image->setStyle($color);
|
||||||
|
if ($sym eq "line") {
|
||||||
|
my $angle = atan2($height,$width);
|
||||||
|
for (my $i=0;$i<$size;$i++) {
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
$image->line($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
$x+=sin($angle);
|
||||||
|
$y-=cos($angle);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "rectangle") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledRectangle($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
} else {
|
||||||
|
$image->rectangle($x,$y,$x+$width,$y+$height,gdStyled);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "ellipse") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledEllipse($x+$width/2,$y+$height/2,$width,$height,gdStyled);
|
||||||
|
} else {
|
||||||
|
$image->ellipse($x+$width/2,$y+$height/2,$width,$height,gdStyled);
|
||||||
|
}
|
||||||
|
} elsif ($sym eq "arc") {
|
||||||
|
$image->setThickness($size);
|
||||||
|
$image->setStyle($color,$color,$color,$color,gdTransparent,gdTransparent,gdTransparent,gdTransparent) if ($s1 eq "dashed" or $s2 eq "dashed");
|
||||||
|
$image->setStyle($color,$color,gdTransparent,gdTransparent) if ($s1 eq "dotted" or $s2 eq "dotted");
|
||||||
|
if ($s1 eq "filled" or $s2 eq "filled") {
|
||||||
|
$image->filledArc($x+$width/2,$y+$height/2,$width,$height,$ang,$ang+$arc,gdStyled,gdEdged);
|
||||||
|
} else {
|
||||||
|
$image->arc($x+$width/2,$y+$height/2,$width,$height,$ang,$ang+$arc,gdStyled);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1634,10 +1799,22 @@ sub ESPEInk_DoConvert(@) {
|
|||||||
return "$name|$upload";
|
return "$name|$upload";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------------------
|
||||||
|
# get pixel from image
|
||||||
|
sub ESPEInk_getPixel($$$$) {
|
||||||
|
my ($image, $w, $h, $indx ) = @_;
|
||||||
|
|
||||||
|
my $iy = int( $indx / $w );
|
||||||
|
my $ix = $indx % $w;
|
||||||
|
my ($r,$g,$b) = $image->rgb($image->getPixel($ix,$iy));
|
||||||
|
|
||||||
|
return ($r==0&&$g==0)?0:(($r==255&&$g==255)?1:(($r==127&&$g==127)?2:3)); #convert color values to values between 0 and 3
|
||||||
|
}
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# helper function for coding picture pixels to EInk bit settings
|
# helper function for coding picture pixels to EInk bit settings
|
||||||
sub ESPEInk_CodePixel2Bits($$$$$) {
|
sub ESPEInk_CodePixel2BitsImage($$$$$$$$) {
|
||||||
my ($indx,$bits,$comp,$imax,$array) = @_;
|
my ($indx,$bits,$comp,$imax,$image,$w,$h,$isize) = @_;
|
||||||
my $v;
|
my $v;
|
||||||
my $x;
|
my $x;
|
||||||
my $str;
|
my $str;
|
||||||
@ -1650,7 +1827,7 @@ sub ESPEInk_CodePixel2Bits($$$$$) {
|
|||||||
while ($x < 122) {
|
while ($x < 122) {
|
||||||
$v = 0;
|
$v = 0;
|
||||||
for (my $i=0; $i<$bits&&$x<122; $i++,$x++) {
|
for (my $i=0; $i<$bits&&$x<122; $i++,$x++) {
|
||||||
if ((${$array}[$indx]!=0)) {
|
if ((ESPEInk_getPixel($image,$w,$h,$indx)!=0)) {
|
||||||
$v|=(128>>$i);
|
$v|=(128>>$i);
|
||||||
}
|
}
|
||||||
$indx++;
|
$indx++;
|
||||||
@ -1662,7 +1839,7 @@ sub ESPEInk_CodePixel2Bits($$$$$) {
|
|||||||
} else {
|
} else {
|
||||||
$v = 0;
|
$v = 0;
|
||||||
for (my $i=0; $i<$bits; $i++) {
|
for (my $i=0; $i<$bits; $i++) {
|
||||||
if (($indx<@{$array})&&(${$array}[$indx]!=$comp)) {
|
if (($indx<$isize)&&(ESPEInk_getPixel($image,$w,$h,$indx)!=$comp)) {
|
||||||
$v|=(128>>$i);
|
$v|=(128>>$i);
|
||||||
}
|
}
|
||||||
$indx++;
|
$indx++;
|
||||||
@ -1672,8 +1849,8 @@ sub ESPEInk_CodePixel2Bits($$$$$) {
|
|||||||
} elsif ($bits == 16) {
|
} elsif ($bits == 16) {
|
||||||
$v = 0;
|
$v = 0;
|
||||||
for (my $i=0; $i<$bits; $i+=2) {
|
for (my $i=0; $i<$bits; $i+=2) {
|
||||||
if ($indx<@{$array}) {
|
if ($indx<$isize) {
|
||||||
$v|=(${$array}[$indx]<<$i);
|
$v|=(ESPEInk_getPixel($image,$w,$h,$indx)<<$i);
|
||||||
}
|
}
|
||||||
$indx++;
|
$indx++;
|
||||||
}
|
}
|
||||||
@ -1681,6 +1858,53 @@ sub ESPEInk_CodePixel2Bits($$$$$) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# #---------------------------------------------------------------------------------------------------
|
||||||
|
# # helper function for coding picture pixels to EInk bit settings
|
||||||
|
# sub ESPEInk_CodePixel2Bits($$$$$) {
|
||||||
|
# my ($indx,$bits,$comp,$imax,$array) = @_;
|
||||||
|
# my $v;
|
||||||
|
# my $x;
|
||||||
|
# my $str;
|
||||||
|
|
||||||
|
# if ($bits == 8) {
|
||||||
|
# if ($comp == -1) {
|
||||||
|
# $str = "";
|
||||||
|
# while (($indx < $imax)) {
|
||||||
|
# $x = 0;
|
||||||
|
# while ($x < 122) {
|
||||||
|
# $v = 0;
|
||||||
|
# for (my $i=0; $i<$bits&&$x<122; $i++,$x++) {
|
||||||
|
# if ((${$array}[$indx]!=0)) {
|
||||||
|
# $v|=(128>>$i);
|
||||||
|
# }
|
||||||
|
# $indx++;
|
||||||
|
# }
|
||||||
|
# $str .= ESPEInk_Byte2String($v);
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# return ($indx, $str);
|
||||||
|
# } else {
|
||||||
|
# $v = 0;
|
||||||
|
# for (my $i=0; $i<$bits; $i++) {
|
||||||
|
# if (($indx<@{$array})&&(${$array}[$indx]!=$comp)) {
|
||||||
|
# $v|=(128>>$i);
|
||||||
|
# }
|
||||||
|
# $indx++;
|
||||||
|
# }
|
||||||
|
# return ($indx, ESPEInk_Byte2String($v));
|
||||||
|
# }
|
||||||
|
# } elsif ($bits == 16) {
|
||||||
|
# $v = 0;
|
||||||
|
# for (my $i=0; $i<$bits; $i+=2) {
|
||||||
|
# if ($indx<@{$array}) {
|
||||||
|
# $v|=(${$array}[$indx]<<$i);
|
||||||
|
# }
|
||||||
|
# $indx++;
|
||||||
|
# }
|
||||||
|
# return ($indx, ESPEInk_Word2String($v));
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# helper function for converting a byte value to a string readable by EInk display
|
# helper function for converting a byte value to a string readable by EInk display
|
||||||
sub ESPEInk_Byte2String($) {
|
sub ESPEInk_Byte2String($) {
|
||||||
@ -1697,14 +1921,19 @@ sub ESPEInk_Word2String($) {
|
|||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# helper function to encode the picture pixels to the right values for the EIknk display
|
# helper function to encode the picture pixels to the right values for the EIknk display
|
||||||
sub ESPEInk_Encode4Upload($$$$) {
|
sub ESPEInk_Encode4UploadImage($$$) {
|
||||||
my($param,$bits,$comp,$data) = @_;
|
my($param,$bits,$comp) = @_;
|
||||||
my $i = int($param->{control}{srcindex});
|
my $i = int($param->{control}{srcindex});
|
||||||
my $ret = "";
|
my $ret = "";
|
||||||
my $imax;
|
my $imax;
|
||||||
|
|
||||||
|
my $image = $param->{image};
|
||||||
|
my $w = $param->{imagew};
|
||||||
|
my $h = $param->{imageh};
|
||||||
|
my $isize = $param->{imagesize};
|
||||||
|
|
||||||
if (($i+int($param->{maxulsize})*($bits==8?4:2)) > (@{$data}-1)) {
|
if (($i+int($param->{maxulsize})*($bits==8?4:2)) > ($isize-1)) {
|
||||||
$imax = @{$data}-1;
|
$imax = $isize-1;
|
||||||
} else {
|
} else {
|
||||||
$imax = $i+int($param->{maxulsize})*($bits==8?4:2);
|
$imax = $i+int($param->{maxulsize})*($bits==8?4:2);
|
||||||
}
|
}
|
||||||
@ -1715,12 +1944,38 @@ sub ESPEInk_Encode4Upload($$$$) {
|
|||||||
|
|
||||||
my $postdata = "";
|
my $postdata = "";
|
||||||
while ($i < $imax) {
|
while ($i < $imax) {
|
||||||
($i, $ret) = ESPEInk_CodePixel2Bits($i,$bits,$comp,$imax,\@{$data});
|
($i, $ret) = ESPEInk_CodePixel2BitsImage($i,$bits,$comp,$imax,$image, $w, $h, $isize);
|
||||||
$postdata .= $ret;
|
$postdata .= $ret;
|
||||||
}
|
}
|
||||||
return ($i,$postdata.ESPEInk_Word2String(length($postdata))."LOAD");
|
return ($i,$postdata.ESPEInk_Word2String(length($postdata))."LOAD");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# #---------------------------------------------------------------------------------------------------
|
||||||
|
# # helper function to encode the picture pixels to the right values for the EIknk display
|
||||||
|
# sub ESPEInk_Encode4Upload($$$$) {
|
||||||
|
# my($param,$bits,$comp,$data) = @_;
|
||||||
|
# my $i = int($param->{control}{srcindex});
|
||||||
|
# my $ret = "";
|
||||||
|
# my $imax;
|
||||||
|
|
||||||
|
# if (($i+int($param->{maxulsize})*($bits==8?4:2)) > (@{$data}-1)) {
|
||||||
|
# $imax = @{$data}-1;
|
||||||
|
# } else {
|
||||||
|
# $imax = $i+int($param->{maxulsize})*($bits==8?4:2);
|
||||||
|
# }
|
||||||
|
|
||||||
|
# if ($param->{device} == 3) {
|
||||||
|
# $imax = $i+int($param->{maxulsize})*($bits==8?4:2)-(($param->{board} eq "ESP8266")?366:122);
|
||||||
|
# }
|
||||||
|
|
||||||
|
# my $postdata = "";
|
||||||
|
# while ($i < $imax) {
|
||||||
|
# ($i, $ret) = ESPEInk_CodePixel2Bits($i,$bits,$comp,$imax,\@{$data});
|
||||||
|
# $postdata .= $ret;
|
||||||
|
# }
|
||||||
|
# return ($i,$postdata.ESPEInk_Word2String(length($postdata))."LOAD");
|
||||||
|
# }
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# callback function for the http calls. Here all upload logic is happening
|
# callback function for the http calls. Here all upload logic is happening
|
||||||
sub ESPEInk_HTTPCallbackA(@) {
|
sub ESPEInk_HTTPCallbackA(@) {
|
||||||
@ -1763,10 +2018,10 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
$bits = 8;
|
$bits = 8;
|
||||||
$param->{command} = "LOAD"; # start uploading black channel
|
$param->{command} = "LOAD"; # start uploading black channel
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
||||||
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4Upload($param,$bits,$comp,\@{$param->{outarray}});
|
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4UploadImage($param,$bits,$comp);
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
||||||
$param->{data} = '' if ($param->{board} eq "ESP32");
|
$param->{data} = '' if ($param->{board} eq "ESP32");
|
||||||
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= @{$param->{outarray}}); # complete array has been coded and sent, go to next step
|
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= $param->{imagesize}); # complete array has been coded and sent, go to next step
|
||||||
$cparams->{$name} = $param;
|
$cparams->{$name} = $param;
|
||||||
$cparams->{data} = $param->{data};
|
$cparams->{data} = $param->{data};
|
||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
@ -1797,10 +2052,10 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
$bits = 8;
|
$bits = 8;
|
||||||
$param->{command} = "LOAD"; # start uploading black channel
|
$param->{command} = "LOAD"; # start uploading black channel
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
||||||
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4Upload($param,$bits,$comp,\@{$param->{outarray}});
|
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4UploadImage($param,$bits,$comp);
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
||||||
$param->{data} = '' if ($param->{board} eq "ESP32");
|
$param->{data} = '' if ($param->{board} eq "ESP32");
|
||||||
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= @{$param->{outarray}}); # complete array has been coded and sent, go to next step
|
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= $param->{imagesize}); # complete array has been coded and sent, go to next step
|
||||||
$cparams->{$name} = $param;
|
$cparams->{$name} = $param;
|
||||||
$cparams->{data} = $param->{data};
|
$cparams->{data} = $param->{data};
|
||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
@ -1823,10 +2078,10 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
$bits = 16;
|
$bits = 16;
|
||||||
$param->{command} = "LOAD"; # start uploading black channel
|
$param->{command} = "LOAD"; # start uploading black channel
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
||||||
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4Upload($param,$bits,$comp,\@{$param->{outarray}});
|
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4UploadImage($param,$bits,$comp);
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
||||||
$param->{data} = '' if ($param->{board} eq "ESP32");
|
$param->{data} = '' if ($param->{board} eq "ESP32");
|
||||||
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= @{$param->{outarray}}); # complete array has been coded and sent, go to next step
|
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= $param->{imagesize}); # complete array has been coded and sent, go to next step
|
||||||
$cparams->{$name} = $param;
|
$cparams->{$name} = $param;
|
||||||
$cparams->{data} = $param->{data};
|
$cparams->{data} = $param->{data};
|
||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
@ -1857,10 +2112,10 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
}
|
}
|
||||||
$param->{command} = "LOAD"; # start uploading black channel
|
$param->{command} = "LOAD"; # start uploading black channel
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
||||||
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4Upload($param,$bits,$comp,\@{$param->{outarray}});
|
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4UploadImage($param,$bits,$comp);
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
||||||
$param->{data} = '' if ($param->{board} eq "ESP32");
|
$param->{data} = '' if ($param->{board} eq "ESP32");
|
||||||
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= @{$param->{outarray}}); # complete array has been coded and sent, go to next step
|
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= $param->{imagesize}); # complete array has been coded and sent, go to next step
|
||||||
$cparams->{$name} = $param;
|
$cparams->{$name} = $param;
|
||||||
$cparams->{data} = $param->{data};
|
$cparams->{data} = $param->{data};
|
||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
@ -1881,10 +2136,10 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
$bits = 8;
|
$bits = 8;
|
||||||
$param->{command} = "LOAD"; # start uploading black channel
|
$param->{command} = "LOAD"; # start uploading black channel
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{command};
|
||||||
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4Upload($param,$bits,$comp,\@{$param->{outarray}});
|
($param->{control}{srcindex},$param->{data}) = ESPEInk_Encode4UploadImage($param,$bits,$comp);
|
||||||
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
$cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$param->{data}.'_' if ($param->{board} eq "ESP32");
|
||||||
$param->{data} = '' if ($param->{board} eq "ESP32");
|
$param->{data} = '' if ($param->{board} eq "ESP32");
|
||||||
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= @{$param->{outarray}}); # complete array has been coded and sent, go to next step
|
$param->{control}{stepindex}++ if ($param->{control}{srcindex} >= $param->{imagesize}); # complete array has been coded and sent, go to next step
|
||||||
$cparams->{$name} = $param;
|
$cparams->{$name} = $param;
|
||||||
$cparams->{data} = $param->{data};
|
$cparams->{data} = $param->{data};
|
||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
@ -1907,14 +2162,22 @@ sub ESPEInk_HTTPCallbackA(@) {
|
|||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# initialization of upload and first http call (rest is cared for in the callback function)
|
# initialization of upload and first http call (rest is cared for in the callback function)
|
||||||
sub ESPEInk_PostToDevice($$$$$) {
|
sub ESPEInk_PostToDeviceImage($$$$$) {
|
||||||
my ($hash,$command,$devind,$control,@outarray) = @_;
|
my ($hash,$command,$devind,$control,$image) = @_;
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
|
||||||
|
my ($w,$h) = $image->getBounds if ( defined( $image ) ); # JV
|
||||||
|
|
||||||
|
|
||||||
my $params = {
|
my $params = {
|
||||||
command => $command,
|
command => $command,
|
||||||
device => $devind,
|
device => $devind,
|
||||||
outarray => @outarray,
|
# outarray => @outarray,
|
||||||
|
image => $image, # JV
|
||||||
|
imagew => $w, # JV
|
||||||
|
imageh => $h, # JV
|
||||||
|
imagesize => $w*$h, # JV
|
||||||
board => ($command eq "EPDx_")?"ESP32":"ESP8266",
|
board => ($command eq "EPDx_")?"ESP32":"ESP8266",
|
||||||
hash => $hash,
|
hash => $hash,
|
||||||
control => $control,
|
control => $control,
|
||||||
@ -1945,6 +2208,46 @@ sub ESPEInk_PostToDevice($$$$$) {
|
|||||||
HttpUtils_NonblockingGet($cparams);
|
HttpUtils_NonblockingGet($cparams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# #---------------------------------------------------------------------------------------------------
|
||||||
|
# # initialization of upload and first http call (rest is cared for in the callback function)
|
||||||
|
# sub ESPEInk_PostToDevice($$$$$) {
|
||||||
|
# my ($hash,$command,$devind,$control,@outarray) = @_;
|
||||||
|
# my $name = $hash->{NAME};
|
||||||
|
|
||||||
|
# my $params = {
|
||||||
|
# command => $command,
|
||||||
|
# device => $devind,
|
||||||
|
# outarray => @outarray,
|
||||||
|
# board => ($command eq "EPDx_")?"ESP32":"ESP8266",
|
||||||
|
# hash => $hash,
|
||||||
|
# control => $control,
|
||||||
|
# maxulsize => ($command eq "EPDx_")?1000:1500
|
||||||
|
# };
|
||||||
|
|
||||||
|
# my $cparams = {
|
||||||
|
# method => "POST",
|
||||||
|
# header => "Content-Type: text/plain\r\nUser-Agent: fhem\r\nAccept: */*",
|
||||||
|
# data => ESPEInk_Byte2String($devind),
|
||||||
|
# callback => \&ESPEInk_HTTPCallbackA,
|
||||||
|
# devname => $name
|
||||||
|
# };
|
||||||
|
|
||||||
|
# if ($params->{board} eq "ESP32") {
|
||||||
|
# if ($params->{device} == 3) { # special treatment for this device
|
||||||
|
# $params->{command} =~ s/x_/d_/g;
|
||||||
|
# } else { # treatment for all smaller color capable displays
|
||||||
|
# my $subst = chr($params->{device}+97)."_";
|
||||||
|
# $params->{command} =~ s/x_/$subst/g;
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
# $cparams->{url} = 'http://'.ESPEInk_GetSetting($name,"url").'/'.$params->{command};
|
||||||
|
# $cparams->{data} = '' if ($params->{board} eq "ESP32");
|
||||||
|
# $cparams->{$name} = $params;
|
||||||
|
# Log3 ($hash, 3, "$name: sending HTTP request to $cparams->{url} with data: $cparams->{data}");
|
||||||
|
# HttpUtils_NonblockingGet($cparams);
|
||||||
|
# }
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------
|
||||||
# code converted picture and send it to eInk driver board (and thus to the connected eInk display)
|
# code converted picture and send it to eInk driver board (and thus to the connected eInk display)
|
||||||
sub ESPEInk_Upload(@) {
|
sub ESPEInk_Upload(@) {
|
||||||
@ -1971,31 +2274,33 @@ sub ESPEInk_Upload(@) {
|
|||||||
|
|
||||||
my $rootname = $FW_dir; #File::Spec->rel2abs($FW_dir); # get Filename of FHEMWEB root
|
my $rootname = $FW_dir; #File::Spec->rel2abs($FW_dir); # get Filename of FHEMWEB root
|
||||||
my $filename = catfile($rootname,$hash->{SUBFOLDER},$name,"result.png");
|
my $filename = catfile($rootname,$hash->{SUBFOLDER},$name,"result.png");
|
||||||
|
my $image; # JV
|
||||||
if (!open(RESULT,$filename)) {
|
if (!open(RESULT,$filename)) {
|
||||||
Log3 $hash, 1, "File $filename cannot be opened";
|
Log3 $hash, 1, "File $filename cannot be opened";
|
||||||
return "Error opening image file $filename for upload";
|
return "Error opening image file $filename for upload";
|
||||||
} else {
|
} # else {
|
||||||
close RESULT;
|
close RESULT;
|
||||||
my $image = GD::Image->newFromPng($filename);
|
# my $image = GD::Image->newFromPng($filename); # JV
|
||||||
my ($w,$h) = $image->getBounds;
|
$image = GD::Image->newFromPng($filename); # JV
|
||||||
my ($r,$g,$b);
|
# my ($w,$h) = $image->getBounds;
|
||||||
my $i = 0;
|
# my ($r,$g,$b);
|
||||||
|
# my $i = 0;
|
||||||
|
|
||||||
for (my $iy=0; $iy<$h; $iy++) {
|
# for (my $iy=0; $iy<$h; $iy++) {
|
||||||
for (my $ix=0; $ix<$w; $ix++) {
|
# for (my $ix=0; $ix<$w; $ix++) {
|
||||||
($r,$g,$b) = $image->rgb($image->getPixel($ix,$iy));
|
# ($r,$g,$b) = $image->rgb($image->getPixel($ix,$iy));
|
||||||
$outarray[$i] = ($r==0&&$g==0)?0:(($r==255&&$g==255)?1:(($r==127&&$g==127)?2:3)); #convert color values to values between 0 and 3
|
# $outarray[$i] = ($r==0&&$g==0)?0:(($r==255&&$g==255)?1:(($r==127&&$g==127)?2:3)); #convert color values to values between 0 and 3
|
||||||
$i++;
|
# $i++;
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
|
|
||||||
$ESPEInk_uploadcontrol{"retries"} = 0; # actual number of retries
|
$ESPEInk_uploadcontrol{"retries"} = 0; # actual number of retries
|
||||||
$ESPEInk_uploadcontrol{"maxretries"} = AttrVal($name,"maxretries",3); # maximum number of retries
|
$ESPEInk_uploadcontrol{"maxretries"} = AttrVal($name,"maxretries",3); # maximum number of retries
|
||||||
$ESPEInk_uploadcontrol{"timeout"} = AttrVal($name,"timeout",10); # timout for HTTP calls
|
$ESPEInk_uploadcontrol{"timeout"} = AttrVal($name,"timeout",10); # timout for HTTP calls
|
||||||
$ESPEInk_uploadcontrol{"stepindex"} = 0; # step currently performed (for multi color displays each color is transferred separately)
|
$ESPEInk_uploadcontrol{"stepindex"} = 0; # step currently performed (for multi color displays each color is transferred separately)
|
||||||
$ESPEInk_uploadcontrol{"srcindex"} = 0; # index of source array currently transferred (we might need to split due to the limit on arduino code in data transfer length via HTTP)
|
$ESPEInk_uploadcontrol{"srcindex"} = 0; # index of source array currently transferred (we might need to split due to the limit on arduino code in data transfer length via HTTP)
|
||||||
ESPEInk_PostToDevice($hash,($boardtype eq "ESP32")?'EPDx_':'EPD',$devind,\%ESPEInk_uploadcontrol,\@outarray); # convert data from conversion result in appropriate format and send it to the device via HTTP
|
ESPEInk_PostToDeviceImage($hash,($boardtype eq "ESP32")?'EPDx_':'EPD',$devind,\%ESPEInk_uploadcontrol,$image); # convert data from conversion result in appropriate format and send it to the device via HTTP
|
||||||
return $hash->{STATE};
|
return $hash->{STATE};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2087,6 +2392,24 @@ sub ESPEInk_Upload(@) {
|
|||||||
The attributes allow an easy change of the readings (see details in the description below). Once at least one icon is specified, the set option <code>removeobject</code> is added.
|
The attributes allow an easy change of the readings (see details in the description below). Once at least one icon is specified, the set option <code>removeobject</code> is added.
|
||||||
<br>
|
<br>
|
||||||
</li>
|
</li>
|
||||||
|
<li><i>addsymbol</i><br>
|
||||||
|
This option allows to specify an symbols (lines, ellipses, rectangles, arcs) that should be added to the template picture at any position.
|
||||||
|
<br>The value must be given in the form: <code>symbol#x#y#thickness#angle#color#width#height#segment</code>
|
||||||
|
<br>where:
|
||||||
|
<br><code>symbol</code> is specifying which symbol should be drawn. Possible values are line or rectangle or ellipse or arc. If -filled is added, the symbol is filled, if -dotted or -dashed is added, the line is drawn dotted or dashed.
|
||||||
|
For example a symbol value given as 'line-dotted' will draw a dotted line, 'rectangle-filled' will draw a filled rectangle.
|
||||||
|
<br><code>x</code> is the x-position of the lower left corner of the symbol relative to the lower left corner of the display area
|
||||||
|
<br><code>y</code> is the y-position of the lower left corner of the symbol relative to the lower left corner of the display area
|
||||||
|
<br><code>thickness</code> is the thickness of lines or outlines of the symbols drawn.
|
||||||
|
<br><code>angle</code> is the rotation angle (counterclockwise) that should be used when drawing the symbol.
|
||||||
|
<br><code>color</code> is an RGB hex string that specifies the RGB values of the color respectively (e.g. 00FF00 for green)
|
||||||
|
<br><code>width</code> is the width of the symbol (in case of lines, the line is drawn width pixels in x direction and height pixels in y direction).
|
||||||
|
<br><code>height</code> is the width of the symbol (in case of lines, the line is drawn width pixels in x direction and height pixels in y direction).
|
||||||
|
<br><code>segment</code> is only used for arc type symbols. In this case angle (see above) specifies the start of the arc and segment specifices the width of the arc.
|
||||||
|
<br>For each of the specified symbols a list of readings and attributes is added to the device. The readings are holding the parameters finally taken for the generation of the output picture.
|
||||||
|
The attributes allow an easy change of the readings (see details in the description below). Once at least one symbol is specified, the set option <code>removeobject</code> is added.
|
||||||
|
<br>
|
||||||
|
</li>
|
||||||
<li><i>textreading</i><br>
|
<li><i>textreading</i><br>
|
||||||
This option allows to specify a device:reading as trigger for adding texts to the template picture at any position.
|
This option allows to specify a device:reading as trigger for adding texts to the template picture at any position.
|
||||||
<br>The value must be given in the form: <code>device:reading#x#y#size#angle#color#font#linegap#blockwidth</code>
|
<br>The value must be given in the form: <code>device:reading#x#y#size#angle#color#font#linegap#blockwidth</code>
|
||||||
@ -2219,13 +2542,13 @@ sub ESPEInk_Upload(@) {
|
|||||||
The url of the WLAN driver board the eInk display is connected to (typically an IP address but could also be a Web-URL)
|
The url of the WLAN driver board the eInk display is connected to (typically an IP address but could also be a Web-URL)
|
||||||
</li>
|
</li>
|
||||||
<li><i>definition</i><br>
|
<li><i>definition</i><br>
|
||||||
This is an alternative to using the set addtext/addicon/textreadin/iconreading command. The attribute contains a list of defintions separated by newline.
|
This is an alternative to using the set addtext/addicon/addsymbol/textreadin/iconreading command. The attribute contains a list of defintions separated by newline.
|
||||||
The syntax of the defintion is the same as in the reading <i>[0-n]-def</i>. It contains the command (addtext or addicon or textreading or iconreading) followed by '#' and then the same defintion values as statet in set (addtext ...) above.
|
The syntax of the defintion is the same as in the reading <i>[0-n]-def</i>. It contains the command (addtext or addicon or addsymbol or textreading or iconreading) followed by '#' and then the same defintion values as statet in set (addtext ...) above.
|
||||||
Lines starting with a <code>#</code> are ignored and treated as comment lines. Example: <code>addtext#Hello#10#10#12#0#000000#giant</code>
|
Lines starting with a <code>#</code> are ignored and treated as comment lines. Example: <code>addtext#Hello#10#10#12#0#000000#giant</code>
|
||||||
</li>
|
</li>
|
||||||
<li><i>definitionFile</i><br>
|
<li><i>definitionFile</i><br>
|
||||||
This is another alternative to using the set addtext/addicon/textreadin/iconreading command. The attribute holdes the name of a text file containing a list of defintions separated by newline.
|
This is another alternative to using the set addtext/addicon/addsymbol/textreadin/iconreading command. The attribute holdes the name of a text file containing a list of defintions separated by newline.
|
||||||
The syntax of the defintion is the same as in the reading <i>[0-n]-def</i>. It contains the command (addtext or addicon or textreading or iconreading) followed by '#' and then the same defintion values as statet in set (addtext ...) above.
|
The syntax of the defintion is the same as in the reading <i>[0-n]-def</i>. It contains the command (addtext or addicon or addsymbol or textreading or iconreading) followed by '#' and then the same defintion values as statet in set (addtext ...) above.
|
||||||
Lines starting with a <code>#</code> are ignored and treated as comment lines. Example: <code>addtext#Hello#10#10#12#0#000000#giant</code>
|
Lines starting with a <code>#</code> are ignored and treated as comment lines. Example: <code>addtext#Hello#10#10#12#0#000000#giant</code>
|
||||||
</li>
|
</li>
|
||||||
<li><i>interval</i><br>
|
<li><i>interval</i><br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user