2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-22 08:11:44 +00:00
git-svn-id: https://svn.fhem.de/fhem/trunk@5943 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klauswitt 2014-05-23 16:35:08 +00:00
parent 0f98135912
commit 93a3d345a0

View File

@ -1,5 +1,5 @@
############################################################################## ##############################################################################
# $Id: # $Id$
############################################################################## ##############################################################################
# Modul for I2C PWM Driver MCP23017 # Modul for I2C PWM Driver MCP23017
# #
@ -341,11 +341,11 @@ sub I2C_MCP23017_Set($@) {
} else { } else {
my $list = ""; my $list = "";
foreach (0..7) { foreach (0..7) {
next unless ( ("A" . $_) ~~ @outports ); #Inputs überspringen next unless ( ("A" . $_) ~~ @outports ); #Inputs überspringen
$list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " "; $list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
} }
foreach (0..7) { foreach (0..7) {
next unless ( ("B" . $_) ~~ @outports ); #Inputs überspringen next unless ( ("B" . $_) ~~ @outports ); #Inputs überspringen
$list .= "PortB" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " "; $list .= "PortB" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
} }
$msg = "Unknown argument $a[1], choose one of " . $list; $msg = "Unknown argument $a[1], choose one of " . $list;
@ -360,9 +360,9 @@ sub I2C_MCP23017_Set($@) {
# join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) # join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) )
# unless(exists($setsP{$val})); # unless(exists($setsP{$val}));
# my $po = substr $cmd, 4, 1; # A oder B # my $po = substr $cmd, 4, 1; # A oder B
# my $regaddr = $po eq "A" ? $Registers{GPIOA} : $Registers{GPIOB}; #Adresse für GPIO Register # my $regaddr = $po eq "A" ? $Registers{GPIOA} : $Registers{GPIOB}; #Adresse für GPIO Register
# substr($cmd,0,5,""); # substr($cmd,0,5,"");
# return "$name error: Port$po$cmd is defined as input" unless ( ($po . $cmd) ~~ @outports ); #Prüfen ob entsprechender Port Input ist # return "$name error: Port$po$cmd is defined as input" unless ( ($po . $cmd) ~~ @outports ); #Prüfen ob entsprechender Port Input ist
# #
# my $sbyte = 0; # my $sbyte = 0;
# foreach (reverse 0..7) { # foreach (reverse 0..7) {
@ -379,11 +379,11 @@ sub I2C_MCP23017_Set($@) {
# } else { # } else {
# my $list = ""; # my $list = "";
# foreach (0..7) { # foreach (0..7) {
# next unless ( ("A" . $_) ~~ @outports ); #Inputs überspringen # next unless ( ("A" . $_) ~~ @outports ); #Inputs überspringen
# $list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " "; # $list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
# } # }
# foreach (0..7) { # foreach (0..7) {
# next unless ( ("B" . $_) ~~ @outports ); #Inputs überspringen # next unless ( ("B" . $_) ~~ @outports ); #Inputs überspringen
# $list .= "PortB" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " "; # $list .= "PortB" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
# } # }
# return "Unknown argument $a[1], choose one of " . $list; # return "Unknown argument $a[1], choose one of " . $list;
@ -414,20 +414,20 @@ sub I2C_MCP23017_I2CRec($@) { #ueber CallFn vom physical
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $phash = $hash->{IODev}; my $phash = $hash->{IODev};
my $pname = $phash->{NAME}; my $pname = $phash->{NAME};
while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals für alle Keys in $clientmsg die mit dem physical Namen beginnen while ( my ( $k, $v ) = each %$clientmsg ) { #erzeugen von Internals für alle Keys in $clientmsg die mit dem physical Namen beginnen
$hash->{$k} = $v if $k =~ /^$pname/ ; $hash->{$k} = $v if $k =~ /^$pname/ ;
} }
#hier noch überprüfen, ob Register und Daten ok #hier noch überprüfen, ob Register und Daten ok
if ($clientmsg->{direction} && defined $clientmsg->{reg} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok" ) { if ($clientmsg->{direction} && defined $clientmsg->{reg} && $clientmsg->{$pname . "_SENDSTAT"} && $clientmsg->{$pname . "_SENDSTAT"} eq "Ok" ) {
if ($clientmsg->{direction} eq "i2cread" && $clientmsg->{received}) { # =~ m/^[a-f0-9]{2}$/i) { if ($clientmsg->{direction} eq "i2cread" && $clientmsg->{received}) { # =~ m/^[a-f0-9]{2}$/i) {
#my @rec = @{$clientmsg->{received}}; #bei übergabe im hash als array #my @rec = @{$clientmsg->{received}}; #bei übergabe im hash als array
my @rec = split(" ",$clientmsg->{received}); #bei übergabe im als skalar my @rec = split(" ",$clientmsg->{received}); #bei übergabe im als skalar
Log3 $hash, 3, "$name: wrong amount of registers transmitted from $pname" unless (@rec == $clientmsg->{nbyte}); Log3 $hash, 3, "$name: wrong amount of registers transmitted from $pname" unless (@rec == $clientmsg->{nbyte});
foreach (reverse 0..$#rec) { #reverse, damit Inputs (Register 0 und 1 als letztes geschrieben werden) foreach (reverse 0..$#rec) { #reverse, damit Inputs (Register 0 und 1 als letztes geschrieben werden)
I2C_MCP23017_UpdReadings($hash, $_ + $clientmsg->{reg} , $rec[$_]); I2C_MCP23017_UpdReadings($hash, $_ + $clientmsg->{reg} , $rec[$_]);
} }
readingsSingleUpdate($hash,"state", "Ok", 1); readingsSingleUpdate($hash,"state", "Ok", 1);
} elsif ($clientmsg->{direction} eq "i2cwrite" && defined $clientmsg->{data}) { # =~ m/^[a-f0-9]{2}$/i) {#readings aktualisieren wenn Übertragung ok } elsif ($clientmsg->{direction} eq "i2cwrite" && defined $clientmsg->{data}) { # =~ m/^[a-f0-9]{2}$/i) {#readings aktualisieren wenn Übertragung ok
I2C_MCP23017_UpdReadings($hash, $clientmsg->{reg} , $clientmsg->{data}) if ( ($clientmsg->{reg} == $Registers{GPIOA}) || ($clientmsg->{reg} == $Registers{GPIOB}) ); I2C_MCP23017_UpdReadings($hash, $clientmsg->{reg} , $clientmsg->{data}) if ( ($clientmsg->{reg} == $Registers{GPIOA}) || ($clientmsg->{reg} == $Registers{GPIOB}) );
readingsSingleUpdate($hash,"state", "Ok", 1); readingsSingleUpdate($hash,"state", "Ok", 1);
@ -466,14 +466,14 @@ sub I2C_MCP23017_UpdReadings($$$) { #nach Rueckmeldung read
foreach (0..7) { foreach (0..7) {
my $pval = 1 & ( $inh >> $_ ); my $pval = 1 & ( $inh >> $_ );
readingsBulkUpdate($hash, 'PortA'.$_ , $rsetsP{$pval}) readingsBulkUpdate($hash, 'PortA'.$_ , $rsetsP{$pval})
if (ReadingsVal($name, 'PortA'.$_,"nix") ne $rsetsP{$pval}); #nur wenn Wert geändert if (ReadingsVal($name, 'PortA'.$_,"nix") ne $rsetsP{$pval}); #nur wenn Wert geändert
} }
} elsif ($reg == $Registers{GPIOB}) { } elsif ($reg == $Registers{GPIOB}) {
my %rsetsP = reverse %setsP; my %rsetsP = reverse %setsP;
foreach (0..7) { foreach (0..7) {
my $pval = 1 & ( $inh >> $_ ); my $pval = 1 & ( $inh >> $_ );
readingsBulkUpdate($hash, 'PortB'.$_ , $rsetsP{$pval}) readingsBulkUpdate($hash, 'PortB'.$_ , $rsetsP{$pval})
if (ReadingsVal($name, 'PortB'.$_,"nix") ne $rsetsP{$pval}); #nur wenn Wert geändert if (ReadingsVal($name, 'PortB'.$_,"nix") ne $rsetsP{$pval}); #nur wenn Wert geändert
} }
} }
@ -660,7 +660,7 @@ sub I2C_MCP23017_UpdReadings($$$) { #nach Rueckmeldung read
Standard: -, g&uuml;ltige Werte: A0-A7, B0-B7<br><br> Standard: -, g&uuml;ltige Werte: A0-A7, B0-B7<br><br>
</li> </li>
<li>Interrupt<br> <li>Interrupt<br>
Durch Komma getrennte Input Ports, die einen Interrupt auf IntA/B auslösen.<br> Durch Komma getrennte Input Ports, die einen Interrupt auf IntA/B auslösen.<br>
Standard: -, g&uuml;ltige Werte: A0-A7, B0-B7<br><br> Standard: -, g&uuml;ltige Werte: A0-A7, B0-B7<br><br>
</li> </li>
<li>invert_input<br> <li>invert_input<br>