2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 07:56:03 +00:00

52_I2C_MCP23008: replaced Smartmatch, bugfix for transmission error if all ports turned off, enhanced compatibility for FRM

git-svn-id: https://svn.fhem.de/fhem/trunk@13602 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
klausw 2017-03-05 01:39:01 +00:00
parent ca47564cdc
commit a9acfe7129

View File

@ -292,8 +292,9 @@ sub I2C_MCP23008_SetRegPair { #set register pair for Por
data => $port{$reg},
}) if (defined $hash->{I2C_Address});
}
I2C_MCP23008_Get($hash,$hash->{NAME}) if ( ($iodev->{TYPE} ne "RPII2C") && ($regtype eq "GPIO") );
} else {
return "no IODev assigned to '$hash->{NAME}'";
return "no IODev assigned to $hash->{NAME}";
}
}
###############################################################################
@ -313,7 +314,7 @@ sub I2C_MCP23008_Set($@) {
my $name =$a[0];
my $cmd = $a[1];
my $val = $a[2];
my @outports = sort(split(/,/,AttrVal($name, "OutputPorts", "")));
#my @outports = sort(split(/,/,AttrVal($name, "OutputPorts", "")));
unless (@a == 3) {
}
@ -325,7 +326,8 @@ sub I2C_MCP23008_Set($@) {
my @scmd = split(",", $cmd);
foreach (@scmd) {
$_ =~ tr/P(ort|)//d; #Nummer aus String extrahieren
$msg .= (defined $msg ? "," : "") . "Port" . $_ unless ( ($_) ~~ @outports ); #Pruefen ob entsprechender Port Input ist
#$msg .= (defined $msg ? "," : "") . "Port" . $_ unless ( ($_) ~~ @outports ); #Pruefen ob entsprechender Port Input ist
$msg .= (defined $msg ? "," : "") . "Port" . $_ unless ( AttrVal($name, "OutputPorts", "") =~ /$_/ ); #Pruefen ob entsprechender Port Input ist
}
return "$name error: $msg is defined as input" if $msg;
#Log3 $hash, 1, "$name: multitest gereinigt: @scmd";
@ -335,7 +337,8 @@ sub I2C_MCP23008_Set($@) {
#foreach my $po ("A","B") {
foreach my $po ("A") {
my $bank = ($po eq "A") ? 0 : 8; # A oder B
if ( ($po.$_) ~~ @scmd ) { #->wenn aktueller Port in Liste dann neuer Wert
#if ( ($po.$_) ~~ @scmd ) { #->wenn aktueller Port in Liste dann neuer Wert
if ( $cmd =~ /$po$_/ ) { #->wenn aktueller Port in Liste dann neuer Wert
$regval += $setsP{$val} << ($bank + $_);
} else { #->sonst aus dem Reading holen
$regval += $setsP{ReadingsVal($name,"Port".$po.$_,"off")} << ($bank + $_);
@ -347,7 +350,8 @@ sub I2C_MCP23008_Set($@) {
} else {
my $list = "";
foreach (0..7) {
next unless ( ("A" . $_) ~~ @outports ); #Inputs ueberspringen
#next unless ( ("A" . $_) ~~ @outports ); #Inputs ueberspringen
next unless ( AttrVal($name, "OutputPorts", "") =~ /A$_/ ); #Inputs ueberspringen
$list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
}
#foreach (0..7) {
@ -425,7 +429,7 @@ sub I2C_MCP23008_I2CRec($@) { #ueber CallFn vom physical
}
#hier noch ueberpruefen, ob Register und Daten 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" && defined $clientmsg->{received}) { # =~ m/^[a-f0-9]{2}$/i) {
#my @rec = @{$clientmsg->{received}}; #bei uebergabe im hash als array
my @rec = split(" ",$clientmsg->{received}); #bei uebergabe im als skalar
Log3 $hash, 3, "$name: wrong amount of registers transmitted from $pname" unless (@rec == $clientmsg->{nbyte});