From 7666c81cf6fcca58a4010f74b661097fe63aca5a Mon Sep 17 00:00:00 2001
From: ntruchsess <>
Date: Wed, 26 Feb 2014 22:22:42 +0000
Subject: [PATCH] FRM_LCD: add writeXY as implemented by Wzut
git-svn-id: https://svn.fhem.de/fhem/trunk@5061 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/20_FRM_LCD.pm | 68 +++++++++++++++++++++++++++++++++++++----
1 file changed, 62 insertions(+), 6 deletions(-)
diff --git a/fhem/FHEM/20_FRM_LCD.pm b/fhem/FHEM/20_FRM_LCD.pm
index ade1c6a6c..f8688db13 100755
--- a/fhem/FHEM/20_FRM_LCD.pm
+++ b/fhem/FHEM/20_FRM_LCD.pm
@@ -19,12 +19,15 @@ use Device::Firmata::Constants qw/ :all /;
my %sets = (
"text" => "",
- "home" => "",
- "clear" => "",
+ "home" => "noArg",
+ "clear" => "noArg",
"display" => "on,off",
"cursor" => "",
"scroll" => "left,right",
-);
+ "backlight" => "on,off",
+ "reset" => "noArg",
+ "writeXY" => ""
+ );
my %gets = (
);
@@ -151,12 +154,20 @@ sub FRM_LCD_Set(@) {
return "Need at least one parameters" if(@a < 2);
my $command = $a[1];
my $value = $a[2];
- return "Unknown argument $a[1], choose one of " . join(" ", sort keys %sets)
- if(!defined($sets{$command}));
+ if(!defined($sets{$command})) {
+ my @commands = ();
+ foreach my $key (sort keys %sets) {
+ push @commands, $sets{$key} ? $key.":".join(",",$sets{$key}) : $key;
+ }
+ return "Unknown argument $a[1], choose one of " . join(" ", @commands);
+ }
my $lcd = $hash->{lcd};
return unless defined $lcd;
COMMAND_HANDLER: {
$command eq "text" and do {
+ shift @a;
+ shift @a;
+ $value = join(" ", @a);
if (AttrVal($hash->{NAME},"autoClear","on") eq "on") {
$lcd->clear();
}
@@ -184,6 +195,11 @@ sub FRM_LCD_Set(@) {
$lcd->home();
last;
};
+ $command eq "reset" and do {
+ $lcd->init();
+# $hash->{lcd} = $lcd;
+ last;
+ };
$command eq "clear" and do {
$lcd->clear();
main::readingsSingleUpdate($hash,"text","",1);
@@ -210,6 +226,37 @@ sub FRM_LCD_Set(@) {
}
last;
};
+ $command eq "backlight" and do {
+ if ($value eq "on") {
+ $lcd->backlight();
+ } else {
+ $lcd->noBacklight();
+ }
+ last;
+ };
+ $command eq "writeXY" and do {
+ my ($x,$y,$l,$al) = split(",",$value);
+ $lcd->setCursor($x,$y);
+ shift @a; shift @a; shift @a;
+ my $t = join(" ", @a);
+ my %umlaute = ("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss" ," - " => " " ,"©"=>"@");
+ my $umlautkeys = join ("|", keys(%umlaute));
+ $t =~ s/($umlautkeys)/$umlaute{$1}/g;
+ my $sl = length $t;
+ if ($sl > $l) {
+ $t = substr($t,0,$l);
+ }
+ if ($sl < $l) {
+ my $dif = "";
+ for (my $i=$sl; $i<$l; $i++) {
+ $dif .= " ";
+ }
+ $t = ($al eq "l") ? $t.$dif : $dif.$t;
+ }
+ $lcd->print($t);
+ readingsSingleUpdate($hash,"state",$t,1);
+ last; #"X=$x|Y=$y|L=$l|Text=$t";
+ };
}
}
@@ -259,8 +306,17 @@ STATEHANDLER: {
Set
set <name> text <text to be displayed>
set <name> text <text to be displayed>
set <name> home
set <name> clear
set <name> display on|off
set <name> cursor <...>
set <name> scroll left|right
set <name> backlight on|off
set <name> reset
set <name> writeXY x-pos,y-pos,len[,l] <text to be displayed>