diff --git a/FHEM/98_DOIF.pm b/FHEM/98_DOIF.pm index 641d7b877..14d42a5f4 100644 --- a/FHEM/98_DOIF.pm +++ b/FHEM/98_DOIF.pm @@ -4478,6 +4478,7 @@ sub widget { sub m_n { my ($x1,$y1,$x2,$y2) =@_; + return(0,0) if ($x2==$x1); my $m=($y2-$y1)/($x2-$x1); my $y=$y1-$m*$x1; return($m,$y); @@ -4940,17 +4941,17 @@ sub card my $unitColor=(split(",",${$unit_a}[$i]))[1]; $decfont="" if (!defined $decfont); ## $out.= ui_Table::ring(${$col}[$i]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? "$decfont,,fill:".color($unitColor,$ln):$unit ,"70,1",$func,defined $unitColor ? "$decfont,,fill:".color($unitColor,$ln):$decfont,$model,$lightness,undef,undef); - $out.= ui_Table::ring(${$col}[$i]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? (split(",",${$unit_a}[$i]))[0]:$unit ,"70,1",$func,defined $unitColor ? $decfont.",,fill:".$unitColor:$decfont,$model,$lightness,undef,undef); + $out.= ui_Table::ring(${$col}[$i]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? (split(",",${$unit_a}[$i]))[0]:$unit ,"70,1",$func,defined $unitColor ? $decfont.",,fill:".$unitColor:$decfont,$model,$lightness); $out.=''; } } else { $out.=sprintf('',defined $collect2 ? $bwidth-78:$bwidth-35); - $out.= ui_Table::ring(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,"70,1",$func,$decfont,$model,$lightness,undef,undef); + $out.= ui_Table::ring(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,"70,1",$func,$decfont,$model,$lightness); $out.=''; } if (defined $collect2) { $out.=sprintf('',$bwidth-35); - $out.= ui_Table::ring(${$collect2}{value},$min2,$max2,$minColor2,$maxColor2,$unit2,"70,1",$func2,$decfont2,$model,$lightness,undef, undef); + $out.= ui_Table::ring(${$collect2}{value},$min2,$max2,$minColor2,$maxColor2,$unit2,"70,1",$func2,$decfont2,$model,$lightness); } $out.=''; } @@ -5066,12 +5067,12 @@ sub card $decfont="" if (!defined $decfont); ##$decfont2="" if (!defined $decfont2); $out.= ui_Table::ring2(${$col}[0]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? (split(",",${$unit_a}[0]))[0]:$unit,92,$func,defined $unitColor ? $decfont.",,fill:".$unitColor:$decfont, - ${$col}[1]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? (split(",",${$unit_a}[1]))[0]:$unit,$func,defined $unitColor2 ? $decfont.",,fill:".$unitColor2:$decfont,$lightness,undef,(defined $header or !defined $icon) ? undef: $icon); + ${$col}[1]{value},$min,$max,$minColor,$maxColor,ref ($unit_a) eq "ARRAY" ? (split(",",${$unit_a}[1]))[0]:$unit,$func,defined $unitColor2 ? $decfont.",,fill:".$unitColor2:$decfont,$lightness,(defined $header or !defined $icon) ? undef: $icon,$model); } else { - $out.= ui_Table::ring(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,92,$func,$decfont,$model,$lightness,undef,(defined $header or !defined $icon) ? undef: $icon); + $out.= ui_Table::ring(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,92,$func,$decfont,$model,$lightness,(defined $header or !defined $icon) ? undef: $icon); } } else { - $out.= ui_Table::ring2(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,92,$func,$decfont,${$collect2}{value},$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$decfont2,$lightness,undef,(defined $header or !defined $icon) ? undef: $icon); + $out.= ui_Table::ring2(${$collect}{value},$min,$max,$minColor,$maxColor,$unit,92,$func,$decfont,${$collect2}{value},$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$decfont2,$lightness,((defined $header or !defined $icon) ? undef: $icon),$model); } $out.=''; $out.=sprintf('%s',$bwidth-21,::strftime("%H:%M:%S",localtime($time))); @@ -5344,8 +5345,49 @@ sub polarToCartesian { return($x,$y); } +sub tangens { + my ($arcBegin,$arcEnd)=@_; + my $deg=($arcBegin + $arcEnd)/2; + my $neg=$arcBegin > $arcEnd; + my $x; + my $y; + my $tan; + my $realDeg=$deg-230+90; + $realDeg%=360; + my $quadrant=int((($realDeg + 45) / 90)); + my $tanDeg=($quadrant==1 or $quadrant==3 ? $realDeg-90: $realDeg); + my $angleInRadians = $tanDeg* ::pi() / 180.0; + $tan=int(::tan($angleInRadians)*10)/10; + my $maxDefl=35; + my $maxVal=50+$maxDefl; + my $null=100-$maxVal; + if ($quadrant == 4 or $quadrant == 0) { + $y=100-(50+$tan*$maxDefl); + $x=$maxVal; + } elsif ($quadrant == 2) { + $y=50+$tan*$maxDefl; + $x=$null; + } elsif ($quadrant == 3 ) { + $x=50+$tan*$maxDefl; + $y=$maxVal; + } elsif ($quadrant == 1) { + $x=100-(50+$tan*$maxDefl); + $y=$null; + } + if (!$neg) { + return(int(100-$x),int($y),int($x),int(100-$y)); + } else { + return(int($x),int(100-$y),int(100-$x),int($y)); + } +} + sub describeArc { - my ($x, $y, $radius, $startAngle, $endAngle)=@_; + my ($x, $y, $radius,$startAngle, $endAngle)=@_; + if ($startAngle > $endAngle) { + my $end=$startAngle; + $startAngle=$endAngle; + $endAngle=$end; + } my ($start_x,$start_y) = polarToCartesian($x, $y, $radius, $endAngle); my ($end_x,$end_y) = polarToCartesian($x, $y, $radius, $startAngle); my $largeArcFlag = $endAngle - $startAngle <= 180 ? "0" : "1"; @@ -5380,7 +5422,11 @@ sub temp_uring { $max=60 if (!defined $max); $size=85 if (!defined $size); $decfont=1 if (!defined $decfont); - return(ring($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont,$type,$lightring,$lightnumber,$icon)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont,$type,$lightring,$icon)); } sub temp_ring{ @@ -5408,7 +5454,11 @@ sub hum_uring { my ($value,$size,$type,$lightring,$lightnumber,$icon,$decfont) = @_; $size=85 if (!defined $size); $decfont=0 if (!defined $decfont); - return(ring($value,0,100,undef,undef,"%",$size,\&hum_hue,$decfont,$type,$lightring,$lightnumber,$icon)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring($value,0,100,undef,undef,"%",$size,\&hum_hue,$decfont,$type,$lightring,$icon)); } sub hum_ring{ @@ -5440,7 +5490,11 @@ sub temp_hum_ring { $size=90 if (!defined $size); $decfont1=1 if (!defined $decfont1); $decfont2=0 if (!defined $decfont2); - return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,0,100,0,0,"%",\&hum_hue,$decfont2,$lightring,$lightnumber)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,0,100,0,0,"%",\&hum_hue,$decfont2,$lightring)); } sub temp_temp_ring { @@ -5450,39 +5504,43 @@ sub temp_temp_ring { $size=90 if (!defined $size); $decfont1=1 if (!defined $decfont1); $decfont2=1 if (!defined $decfont2); - return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,$min,$max,undef,undef,"°C",\&temp_hue,$decfont2,$lightring,$lightnumber)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,$min,$max,undef,undef,"°C",\&temp_hue,$decfont2,$lightring)); } sub icon_ring { - my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$lr,$ln,$mode) = @_; - return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$lr,$ln,$icon)); + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$l,$mode) = @_; + return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$l,$icon)); } sub icon_mring { - my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$lr,$ln) = @_; - return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,1,$lr,$ln,$icon,$icon)); + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$l) = @_; + return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,1,$l,$icon,$icon)); } sub icon_uring { - my ($mode,$icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$lr,$ln) = @_; - return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$lr,$ln,$icon)); + my ($mode,$icon,$val,$min,$max,$minColor,$maxColor,$unit,$decfont,$size,$func,$l) = @_; + return(ring ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$l,$icon)); } sub mring { - my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$lr,$ln) = @_; - return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,1,$lr,$ln)); + my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$l) = @_; + return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,1,$l)); } sub uring { - my ($mode,$val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$lr,$ln) = @_; - return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$lr,$ln)); + my ($mode,$val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$l) = @_; + return(ring($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$mode,$l)); } sub icon_ring2 { - my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$dec2,$lr,$ln) = @_; - return (ring2($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$dec2,$lr,$ln,$icon)); + my ($icon,$val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$dec2,$l) = @_; + return (ring2($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$dec,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$dec2,$l,$icon)); } @@ -5493,7 +5551,11 @@ sub icon_temp_hum_ring { $size=100 if (!defined $size); $decfont1=1 if (!defined $decfont1); $decfont2=0 if (!defined $decfont2); - return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,0,100,0,0,"%",\&hum_hue,$decfont2,$lightring,$lightnumber,$icon)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,0,100,0,0,"%",\&hum_hue,$decfont2,$lightring,$icon)); } sub icon_temp_temp_ring { @@ -5503,32 +5565,32 @@ sub icon_temp_temp_ring { $size=100 if (!defined $size); $decfont1=1 if (!defined $decfont1); $decfont2=1 if (!defined $decfont2); - return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,$min,$max,undef,undef,"°C",\&temp_hue,$decfont2,$lightring,$lightnumber,$icon)); + if (defined($lightnumber)) { + $lightring="" if (!defined ($lightring)); + $lightring="$lightring,,,,$lightnumber"; + } + return(ring2($value,$min,$max,undef,undef,"°C",$size,\&temp_hue,$decfont1,$value2,$min,$max,undef,undef,"°C",\&temp_hue,$decfont2,$lightring,$icon)); } -sub ring -{ - my ($val_a,$min,$max,$minColor,$maxColor,$unit,$sizeHalf,$func,$decfont,$mode,$lightness,$lnum,$icon) = @_; - my $out; - my $val; - my $val_color; +sub ring_param { - if (ref ($val_a) eq "ARRAY") { - $val=${$val_a}[0]; - $val_color=${$val_a}[1]; - } else { - $val=$val_a; - } + my ($val,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$model,$sizeHalf) = @_; + my $out; + my $val_color; + my $nullColor; my ($size,$half); ($size,$half)=split (/,/,$sizeHalf) if (defined $sizeHalf); $size=100 if (!defined $size or $size eq ""); $half="" if (!defined $half); - - - - my ($monochrom,$minMax,$innerRing,$pointer); - ($monochrom,$minMax,$innerRing,$pointer)=split (/,/,$mode) if (defined $mode); + + my ($monochrom,$minMax,$innerRing,$pointer,$mode); + ($monochrom,$minMax,$innerRing,$pointer,$mode)=split (/,/,$model) if (defined $model); + $monochrom="" if (!defined $monochrom); + $minMax="" if (!defined $minMax); + $innerRing="" if (!defined $innerRing); + $pointer="" if (!defined $pointer); + $mode="" if (!defined $mode); my ($dec,$fontformat,$unitformat); ($dec,$fontformat,$unitformat)=split (/,/,$decfont,3) if (defined $decfont); @@ -5536,9 +5598,149 @@ sub ring $fontformat="" if (!defined $fontformat); $unitformat="" if (!defined $unitformat); + $min=0 if (!defined $min); + $max=100 if (!defined $max); + $dec=1 if ($dec eq ""); + + my ($format,$value); + ($format,$value,$val)=format_value($val,$min,$dec); + + $value=$max if ($value>$max); + $value=$min if ($value<$min); + + my ($m,$n); + + my $currColor; + + if (ref($func) eq "CODE") { + $minColor=&{$func}($min); + $maxColor=&{$func}($max); + $nullColor=&{$func}(0); + $currColor=&{$func}($value); + } elsif (ref($func) eq "ARRAY") { + $minColor=${$func}[1]; + $maxColor=${$func}[-1]; + for (my $i=0;$i<@{$func};$i+=2) { + if ($value <= ${$func}[$i]) { + $currColor=${$func}[$i+1]; + last; + } + } + for (my $i=0;$i<@{$func};$i+=2) { + if (${$func}[$i]>=0) { + $nullColor=${$func}[$i+1]; + last; + } + } + } else { + $minColor=120 if (!defined $minColor); + $maxColor=0 if (!defined $maxColor); + ($m,$n)=m_n($min,$minColor,$max,$maxColor); + $currColor=$value*$m+$n; + $nullColor=$n; + } + + my $minCol=$minColor; + my $maxCol=$maxColor; + + my ($minArc,$maxArc); + if ($half eq "1") { + $maxArc=230; + $minArc=50; + } else { + $maxArc=280; + $minArc=0; + } + + if ($mode eq "2") { + my $maximum=$max; + if ($value < 0) { + $maximum=abs($min); + } + ($m,$n)=m_n(0,$minArc,$maximum,$maxArc); + } else { + ($m,$n)=m_n($min,$minArc,$max,$maxArc); + } + my ($arcBegin,$arcEnd); + + my $beginColor=$minColor; + my $endColor=$currColor; + + if ($pointer) { + $arcBegin = int(($value*$m+$n-$pointer/2)*10)/10; + $arcEnd = int(($value*$m+$n+$pointer/2)*10)/10; + } else { + if ($mode eq "") { + $arcBegin = $minArc; + $arcEnd = int(($value*$m+$n)*10)/10; + } elsif ($mode eq "1") { + $arcBegin = int($n*10)/10; + $arcEnd = int(($value*$m+$n)*10)/10; + $beginColor = $nullColor; + if ($arcBegin< $minArc) { + $arcBegin=$minArc ; + $beginColor=$minColor; + } + $arcEnd=$minArc if ($arcEnd < $minArc); + } elsif ($mode eq "2") { + $arcBegin = $minArc; + $arcEnd = $value < 0 ? int(-$value*$m*10)/10:int($value*$m*10)/10; + $beginColor = $nullColor; + if ($value < 0) { + $maxCol=$minCol; + $max=$min; + } + $min=0; + $minCol=$nullColor; + } + } + + +return ($min,$max,$beginColor,$endColor,$minCol, + $maxCol,$nullColor,$minArc, $maxArc,$arcBegin,$arcEnd,$currColor, + $dec,$fontformat,$unitformat,$format,$val, + $monochrom,$minMax,$innerRing,$pointer,$mode,$half,$size + ); +} + +sub ring +{ + my ($val_a,$minVal,$maxVal,$minColor,$maxColor,$unit,$sizeHalf,$func,$decfont,$model,$lightness,$icon) = @_; + + my ($min,$max,$beginColor,$endColor,$minCol, + $maxCol,$nullColor,$minArc, $maxArc,$arcBegin,$arcEnd,$currColor, + $dec,$fontformat,$unitformat,$format,$val, + $monochrom,$minMax,$innerRing,$pointer,$mode,$half,$size + )=ring_param($val_a,$minVal,$maxVal,$minColor,$maxColor,$unit,$func,$decfont,$model,$sizeHalf); + my $out; + + my ($lr,$lir,$lmm,$lu,$ln,$li); + ($lr,$lir,$lmm,$lu,$ln,$li)=split (/,/,$lightness) if (defined $lightness); + $lr=50 if (!defined $lr or $lr eq ""); + $lir=50 if (!defined $lir or $lir eq ""); + $lmm=40 if (!defined $lmm or $lmm eq ""); + $lu=40 if (!defined $lu or $lu eq ""); + $ln=50 if (!defined $ln or $ln eq ""); + $li=40 if (!defined $li or $li eq ""); + + + my ($div,$yNum,$yUnit,$high); + if ($half eq "1") { + $div=2; + $yNum=27; + $yUnit=14; + $high=29; + } else { + $div=1; + $yNum=34; + $yUnit=47; + $high=58; + } + my $width=int($size/100*63); + my $height=int($size/100*58); + my ($ic,$iscale,$ix,$iy,$rotate)=(); - if (defined ($icon)) { ($ic,$iscale,$ix,$iy,$rotate)=split(/,/,$icon); if (defined ($ix)) { @@ -5555,125 +5757,43 @@ sub ring $iscale=1 if (!defined $iscale); $ic="" if (!defined($ic)); } - - my ($format,$value); - my ($lr,$lir,$lmm,$lu,$ln,$li); - - ($lr,$lir,$lmm,$lu,$ln,$li)=split (/,/,$lightness) if (defined $lightness); - - $lr=50 if (!defined $lr or $lr eq ""); - $lir=40 if (!defined $lir or $lir eq ""); - $lmm=40 if (!defined $lmm or $lmm eq ""); - $lu=40 if (!defined $lu or $lu eq ""); - $ln=50 if (!defined $ln or $ln eq ""); - $li=40 if (!defined $li or $li eq ""); - - $ln=$lnum if (defined $lnum); - - $min=0 if (!defined $min); - $max=100 if (!defined $max); - - $dec=1 if ($dec eq ""); - - ($format,$value,$val)=format_value($val,$min,$dec); - - - $value=$max if ($value>$max); - $value=$min if ($value<$min); - - - my $prop=0; - $prop=($value-$min)/($max-$min) if ($max-$min); - - my ($x1,$y1,$x2,$y2); - ($x1,$y1,$x2,$y2)=(int($prop*100),0,0,int((1-$prop)*100)); - my $currColor; - - if (ref($func) eq "CODE") { - $minColor=&{$func}($min); - $maxColor=&{$func}($max); - $currColor=&{$func}($value); - } elsif (ref($func) eq "ARRAY") { - $minColor=${$func}[1]; - $maxColor=${$func}[-1]; - for (my $i=0;$i<@{$func};$i+=2) { - if ($value <= ${$func}[$i]) { - $currColor=${$func}[$i+1]; - last; - } - } - } else { - $minColor=120 if (!defined $minColor); - $maxColor=0 if (!defined $maxColor); - if ($minColor < $maxColor) { - $currColor=$prop*($maxColor-$minColor)+$minColor; - } else { - $currColor=(1-$prop)*($minColor-$maxColor)+$maxColor; - } - } - my $minCol=$minColor; - if (defined $monochrom and $monochrom eq "1") { - $minColor=$currColor; - } if (defined $icon and $icon ne "") { $ic="$ic\@".color($currColor,$li) if ($ic !~ /@/); } - my ($div,$maxArc,$minArc,$yNum,$yUnit,$high); - - if ($half eq "1") { - $div=2; - $maxArc=230; - $minArc=50; - $yNum=27; - $yUnit=14; - $high=29; - } else { - $div=1; - $maxArc=280; - $minArc=0; - $yNum=34; - $yUnit=47; - $high=58; + + if ($monochrom eq "1") { + $beginColor=$currColor; } - my $width=int($size/100*63); - my $height=int($size/100*58); + $out.= sprintf('',$high,$width,$height/$div,$width,$height/$div); $out.= ''; $out.= ''; - if (!defined $pointer) { - $out.= sprintf('\ - ',$currColor,$minColor,(defined $lr ? $lr:0),$x1,$y1,$x2,$y2,color($currColor,$lr),color($minColor,$lr)); + if (!$pointer) { + $out.= sprintf('\ + ',$beginColor,$endColor,$arcBegin,$arcEnd,(defined $lr ? $lr:0),$mode,tangens($arcBegin,$arcEnd),color($beginColor,$lr),color($endColor,$lr)); } - if (defined $innerRing and $innerRing and ref($func) ne "ARRAY") { - $out.= sprintf('\ - ',$minCol,$maxColor,(defined $lir ? $lir:0),100,0,0,0,color($maxColor,$lir),color($minCol,$lir)); + if ($innerRing and ref($func) ne "ARRAY") { + $out.= sprintf('\ + ',$minCol,$maxCol,(defined $lir ? $lir:0),tangens($minArc, $maxArc),color($minCol,$lir),color($maxCol,$lir),); } $out.= '\ '; $out.=''; $out.=''; - - $out.=''; $out.=describeArc(41, 30, 28, $minArc, $maxArc); $out.=''; - if (defined $val_color) { - $out.=sprintf('',color($val_color,$ln)); - $out.=describeArc(41, 30, 29.5, $minArc, $maxArc); - $out.=''; - } - if (defined $pointer) { + if ($pointer) { $out.=''; - $out.=describeArc(41, 30, 28, int(($prop*($maxArc-$minArc)+$minArc-$pointer/2)*10)/10, int(($prop*($maxArc-$minArc)+$minArc+$pointer/2)*10)/10); } else { - $out.=sprintf('',$currColor,$minColor,(defined $lr ? $lr:0)); - $out.=describeArc(41, 30, 28, $minArc, int(($prop*($maxArc-$minArc)+$minArc)*10)/10); + $out.=sprintf('',$beginColor,$endColor,$arcBegin,$arcEnd,(defined $lr ? $lr:0),$mode); } + $out.=describeArc(41, 30, 28, $arcBegin, $arcEnd); $out.=''; - if (defined $innerRing and $innerRing) { + if ($innerRing) { if (ref($func) eq "ARRAY"){ my $from=$minArc; my $diff=$max-$min; @@ -5681,14 +5801,14 @@ sub ring my $curr=${$func}[$i]; my $color=${$func}[$i+1]; my $to=int((($curr-$min)/$diff*($maxArc-$minArc)+$minArc)*10)/10; - $out.=sprintf('',color($color,$lir),($innerRing eq "1" ? "":$innerRing)); + $to-=1 if ($to > $minArc+1 and not($to == $maxArc)); + $out.=sprintf('',color($color,$lir),($innerRing eq "1" ? "":$innerRing)); $out.=describeArc(41, 30, 25.5, $from, $to); $out.=''; $from=$to+2; } } else { - ##$out.=''; - $out.=sprintf('',$minCol,$maxColor,(defined $lir ? $lir:0),($innerRing eq "1" ? "":$innerRing)); + $out.=sprintf('',$minCol,$maxCol,(defined $lir ? $lir:0),($innerRing eq "1" ? "":$innerRing)); $out.=describeArc(41, 30, 25.5, $minArc, $maxArc); $out.=''; } @@ -5706,8 +5826,8 @@ sub ring } my $icflag = (defined ($icon) and $icon ne "") ? 1:0; - my ($valInt,$valDec)=split(/\./,sprintf($format,$val)); + if (defined $valDec) { $out.= sprintf('%s.%s', ($icflag ? 41:$yNum),color($currColor,$ln),(defined $icon or $half eq "1") ? 15:18,$fontformat,$valInt,$valDec); @@ -5718,9 +5838,9 @@ sub ring $out.= sprintf('%s', ($icflag ? 50.5:$yUnit),color($currColor,$lu),($icflag or $half eq "1") ? 8:10,$unitformat,$unit) if (defined $unit); - if (defined $minMax and $minMax) { + if ($minMax) { $out.= sprintf('%s',color($minCol,$lmm),($minMax eq "1" ? "":$minMax),$min); - $out.= sprintf('%s',color($maxColor,$lmm),($minMax eq "1" ? "":$minMax),$max); + $out.= sprintf('%s',color($maxCol,$lmm),($minMax eq "1" ? "":$minMax),$max); } $out.= ''; @@ -5729,26 +5849,47 @@ sub ring sub ring2 { - ## my ($mode,$icon,$size,$valA,$minMaxA,$minMaxColorA,$unitA,$decfontA,$lightness) = @_; - my ($val,$min,$max,$minColor,$maxColor,$unit,$size,$func,$decfont,$val2,$min2,$max2,$minColor2,$maxColor2,$unit2,$func2,$decfont2,$lightness,$lnum,$icon) = @_; + my ($val_a,$minVal,$maxVal,$minColor,$maxColor,$unit,$size,$func,$decfont,$val_a2,$minVal2,$maxVal2,$minColor2,$maxColor2,$unit2,$func2,$decfont2,$lightness,$icon,$model) = @_; + + my ($min,$max,$beginColor,$endColor,$minCol, + $maxCol,$nullColor,$minArc, $maxArc,$arcBegin,$arcEnd,$currColor, + $dec,$fontformat,$unitformat,$format,$val, + $monochrom,$minMax,$innerRing,$pointer,$mode + ) = ring_param($val_a,$minVal,$maxVal,$minColor,$maxColor,$unit,$func,$decfont,$model); + + my ($min2,$max2,$beginColor2,$endColor2,$minCol2, + $maxCol2,$nullColor2,$minArc2,$maxArc2,$arcBegin2,$arcEnd2,$currColor2, + $dec2,$fontformat2,$unitformat2,$format2,$val2 + ) = ring_param($val_a2,$minVal2,$maxVal2,$minColor2,$maxColor2,$unit2,$func2,$decfont2,$model); + + if ($monochrom eq "" or $monochrom eq "1") { + $beginColor=$currColor; + $beginColor2=$currColor2; + } + my $out; - my ($format,$value); - my ($format2,$value2); + +## my ($lr,$lir,$lmm,$lu,$ln,$li); +## ($lr,$lu,$ln,$li)=split (/,/,$lightness) if (defined $lightness); +## $lr=50 if (!defined $lr or $lr eq ""); +## $lu=40 if (!defined $lu or $lu eq ""); +## $ln=50 if (!defined $ln or $ln eq ""); +## $li=40 if (!defined $li or $li eq ""); - my ($dec,$fontformat,$unitformat); - ($dec,$fontformat,$unitformat)=split (/,/,$decfont) if (defined $decfont); - $dec="" if (!defined $dec); - $fontformat="" if (!defined $fontformat); - $unitformat="" if (!defined $unitformat); - - my ($dec2,$fontformat2,$unitformat2); - ($dec2,$fontformat2,$unitformat2)=split (/,/,$decfont2) if (defined $decfont2); - $dec2="" if (!defined $dec2); - $fontformat2="" if (!defined $fontformat2); - $unitformat2="" if (!defined $unitformat2); - - my ($ic,$iscale,$ix,$iy,$rotate)=(); + my ($lr,$lir,$lmm,$lu,$ln,$li); + ($lr,$lir,$lmm,$lu,$ln,$li)=split (/,/,$lightness) if (defined $lightness); + $lr=50 if (!defined $lr or $lr eq ""); + $lir=50 if (!defined $lir or $lir eq ""); + $lmm=40 if (!defined $lmm or $lmm eq ""); + $lu=40 if (!defined $lu or $lu eq ""); + $ln=50 if (!defined $ln or $ln eq ""); + $li=40 if (!defined $li or $li eq ""); + $size=100 if (!defined $size or $size eq ""); + my $width=int($size/100*63); + my $height=int($size/100*58); + + my ($ic,$iscale,$ix,$iy,$rotate)=(); if (defined ($icon)) { ($ic,$iscale,$ix,$iy,$rotate)=split(",",$icon); if (defined ($ix)) { @@ -5766,114 +5907,67 @@ sub ring2 $ic="" if (!defined($ic)); } - my ($lr,$lir,$lmm,$lu,$ln,$li); - - ($lr,$lu,$ln,$li)=split (/,/,$lightness) if (defined $lightness); - - $lr=50 if (!defined $lr or $lr eq ""); - $lu=40 if (!defined $lu or $lu eq ""); - $ln=50 if (!defined $ln or $ln eq ""); - $li=40 if (!defined $li or $li eq ""); - - $ln=$lnum if (defined $lnum); - - $min=0 if (!defined $min); - $max=100 if (!defined $max); - $dec=1 if ($dec eq ""); - - ($format,$value,$val)=format_value($val,$min,$dec); - - if (defined $func) { - $minColor=&{$func}($min); - $maxColor=&{$func}($max); - } else { - $minColor=120 if (!defined $minColor); - $maxColor=0 if (!defined $maxColor); - } - $value=$max if($value>$max); - $value=$min if ($value<$min); - $size=100 if (!defined $size); - - my $prop=0; - $prop=($value-$min)/($max-$min) if ($max-$min); - - my ($x1,$y1,$x2,$y2)=($prop*100,0,0,(1-$prop)*100); - - my $currColor; - if (defined $func) { - $currColor=&{$func}($value); - } else { - if ($minColor < $maxColor) { - $currColor=$prop*($maxColor-$minColor)+$minColor; - } else { - $currColor=(1-$prop)*($minColor-$maxColor)+$maxColor; - } - } - - $min2=0 if (!defined $min2); - $max2=100 if (!defined $max2); - $dec2=1 if ($dec2 eq ""); - - ($format2,$value2,$val2)=format_value($val2,$min2,$dec2); - - if (defined $func2) { - $minColor2=&{$func2}($min2); - $maxColor2=&{$func2}($max2); - } else { - $minColor2=120 if (!defined $minColor2); - $maxColor2=0 if (!defined $maxColor2); - } - $value2=$max2 if($value2>$max2); - $value2=$min2 if ($value2<$min2); - my $prop2=0; - $prop2=($value2-$min2)/($max2-$min2) if ($max2-$min2); - - my ($x12,$y12,$x22,$y22); - ($x12,$y12,$x22,$y22)=($prop2*100,0,0,(1-$prop2)*100); - - my $currColor2; - if (defined $func2) { - $currColor2=&{$func2}($value2); - } else { - if ($minColor2 < $maxColor2) { - $currColor2=$prop2*($maxColor2-$minColor2)+$minColor2; - } else { - $currColor2=(1-$prop2)*($minColor2-$maxColor2)+$maxColor2; - } - } - - if (defined $icon and $icon ne "") { - if ($ic !~ /@/) { - $ic="$ic\@".color($currColor,$li); - } elsif ($ic =~ /^(.*\@)colorVal1/) { - $ic="$1".color($currColor,$li); - } elsif ($ic =~ /^(.*\@)colorVal2/) { - $ic="$1".color($currColor2,$li); - } - } - my $width=int($size/100*63); - my $height=int($size/100*58); $out.= sprintf('',$width,$height,$width,$height); $out.= ''; $out.= ''; - $out.= sprintf('\ - ',$currColor,$minColor,(defined $lr ? $lr:0),$x1,$y1,$x2,$y2,color($currColor,$lr),color($currColor,$lr)); + + if ($innerRing and ref($func) ne "ARRAY") { + $out.= sprintf('\ + ',$minCol,$maxCol,(defined $lir ? $lir:0),tangens($minArc, $maxArc),color($minCol,$lir),color($maxCol,$lir),); + } - $out.= sprintf('\ - ',$currColor2,$minColor2,(defined $lr ? $lr:0),$x12,$y12,$x22,$y22,color($currColor2,$lr),color($currColor2,$lr)); - + $out.= sprintf('\ + ',$beginColor,$endColor,$arcBegin,$arcEnd,(defined $lr ? $lr:0),$mode,tangens($arcBegin,$arcEnd),color($beginColor,$lr),color($endColor,$lr)); + $out.= sprintf('\ + ',$beginColor2,$endColor2,$arcBegin2,$arcEnd2,(defined $lr ? $lr:0),$mode,tangens($arcBegin2,$arcEnd2),color($beginColor2,$lr),color($endColor2,$lr)); $out.= '\ '; $out.=''; - $out.=''; $out.=''; - $out.=describeArc(41, 30, 28, 0, 280); + $out.=describeArc(41, 30, 28, $minArc, $maxArc); $out.=''; + + my ($stroke1,$radius1,$stroke2,$radius2); + if ($innerRing) { + ($stroke1,$radius1,$stroke2,$radius2)=(2,28.5,2,24.9); + if (ref($func) eq "ARRAY"){ + my $from=$minArc; + my $diff=$max-$min; + for (my $i=0;$i<@{$func};$i+=2) { + my $curr=${$func}[$i]; + my $color=${$func}[$i+1]; + my $to=int((($curr-$min)/$diff*($maxArc-$minArc)+$minArc)*10)/10; + $to-=1 if ($to > $minArc+1 and not($to == $maxArc)); + $out.=sprintf('',color($color,$lir),($innerRing eq "1" ? "":$innerRing)); + $out.=describeArc(41, 30, 26.7, $from, $to); + $out.=''; + $from=$to+2; + } + } else { + $out.=sprintf('',$minCol,$maxCol,(defined $lir ? $lir:0),($innerRing eq "1" ? "":$innerRing)); + $out.=describeArc(41, 30, 26.7, $minArc, $maxArc); + $out.=''; + } + } else { + ($stroke1,$radius1,$stroke2,$radius2)=(2.3,28.2,2,25.2); + } + if ($pointer) { + $out.=''; + } else { + $out.=sprintf('',$beginColor,$endColor,$arcBegin,$arcEnd,(defined $lr ? $lr:0),$mode,$stroke1); + } - $out.=sprintf('',$currColor,$minColor,(defined $lr ? $lr:0)); - $out.=describeArc(41, 30, 28.2, 0,int($prop*280)); + $out.=describeArc(41, 30, $radius1, $arcBegin, $arcEnd); + $out.=''; + + if ($pointer) { + $out.=''; + } else { + $out.=sprintf('',$beginColor2,$endColor2,$arcBegin2,$arcEnd2,(defined $lr ? $lr:0),$mode,$stroke2); + } + $out.=describeArc(41, 30, $radius2, $arcBegin2, $arcEnd2); $out.=''; if (defined $icon and $icon ne "" and $icon ne " ") { @@ -5887,14 +5981,8 @@ sub ring2 $out.=''; } - - $out.=sprintf('',$currColor2,$minColor2,(defined $lr ? $lr:0)); - $out.=describeArc(41, 30, 25.5, 0, int($prop2*280)); - $out.=''; - - my ($valInt,$valDec)=split(/\./,sprintf($format,$val)); - my $icflag = (defined ($icon) and $icon ne "") ? 1:0; + my ($valInt,$valDec)=split(/\./,sprintf($format,$val)); if (defined $valDec) { $out.= sprintf('%s.%s', @@ -5916,6 +6004,12 @@ sub ring2 } $out.= sprintf('%s',($icflag ? 50:52),color($currColor2,$lu),$unitformat2,$unit2) if (defined $unit2); + if ($minMax) { + $out.= sprintf('%s',color($minCol,$lmm),($minMax eq "1" ? "":$minMax),$min); + $out.= sprintf('%s',color($maxCol,$lmm),($minMax eq "1" ? "":$minMax),$max); + } + + $out.= ''; return ($out); }