mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-22 02:10:32 +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:
parent
ca47564cdc
commit
a9acfe7129
@ -282,18 +282,19 @@ sub I2C_MCP23008_SetRegPair { #set register pair for Por
|
|||||||
$port{A} = $regval & 0xff;
|
$port{A} = $regval & 0xff;
|
||||||
#$port{B} = ( $regval >> 8 ) & 0xff;
|
#$port{B} = ( $regval >> 8 ) & 0xff;
|
||||||
|
|
||||||
if (defined (my $iodev = $hash->{IODev})) {
|
if (defined (my $iodev = $hash->{IODev})) {
|
||||||
foreach my $reg (keys %port) {
|
foreach my $reg (keys %port) {
|
||||||
#Log3 $hash, 1, "schreibe raus: i2cwrite|$hash->{I2C_Address}|$Registers{$regtype . $reg}|$port{$reg}|";
|
#Log3 $hash, 1, "schreibe raus: i2cwrite|$hash->{I2C_Address}|$Registers{$regtype . $reg}|$port{$reg}|";
|
||||||
CallFn($iodev->{NAME}, "I2CWrtFn", $iodev, {
|
CallFn($iodev->{NAME}, "I2CWrtFn", $iodev, {
|
||||||
direction => "i2cwrite",
|
direction => "i2cwrite",
|
||||||
i2caddress => $hash->{I2C_Address},
|
i2caddress => $hash->{I2C_Address},
|
||||||
reg => $Registers{$regtype . $reg},
|
reg => $Registers{$regtype . $reg},
|
||||||
data => $port{$reg},
|
data => $port{$reg},
|
||||||
}) if (defined $hash->{I2C_Address});
|
}) if (defined $hash->{I2C_Address});
|
||||||
}
|
}
|
||||||
|
I2C_MCP23008_Get($hash,$hash->{NAME}) if ( ($iodev->{TYPE} ne "RPII2C") && ($regtype eq "GPIO") );
|
||||||
} else {
|
} 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 $name =$a[0];
|
||||||
my $cmd = $a[1];
|
my $cmd = $a[1];
|
||||||
my $val = $a[2];
|
my $val = $a[2];
|
||||||
my @outports = sort(split(/,/,AttrVal($name, "OutputPorts", "")));
|
#my @outports = sort(split(/,/,AttrVal($name, "OutputPorts", "")));
|
||||||
unless (@a == 3) {
|
unless (@a == 3) {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -325,7 +326,8 @@ sub I2C_MCP23008_Set($@) {
|
|||||||
my @scmd = split(",", $cmd);
|
my @scmd = split(",", $cmd);
|
||||||
foreach (@scmd) {
|
foreach (@scmd) {
|
||||||
$_ =~ tr/P(ort|)//d; #Nummer aus String extrahieren
|
$_ =~ 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;
|
return "$name error: $msg is defined as input" if $msg;
|
||||||
#Log3 $hash, 1, "$name: multitest gereinigt: @scmd";
|
#Log3 $hash, 1, "$name: multitest gereinigt: @scmd";
|
||||||
@ -335,7 +337,8 @@ sub I2C_MCP23008_Set($@) {
|
|||||||
#foreach my $po ("A","B") {
|
#foreach my $po ("A","B") {
|
||||||
foreach my $po ("A") {
|
foreach my $po ("A") {
|
||||||
my $bank = ($po eq "A") ? 0 : 8; # A oder B
|
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 + $_);
|
$regval += $setsP{$val} << ($bank + $_);
|
||||||
} else { #->sonst aus dem Reading holen
|
} else { #->sonst aus dem Reading holen
|
||||||
$regval += $setsP{ReadingsVal($name,"Port".$po.$_,"off")} << ($bank + $_);
|
$regval += $setsP{ReadingsVal($name,"Port".$po.$_,"off")} << ($bank + $_);
|
||||||
@ -347,7 +350,8 @@ sub I2C_MCP23008_Set($@) {
|
|||||||
} else {
|
} else {
|
||||||
my $list = "";
|
my $list = "";
|
||||||
foreach (0..7) {
|
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) ) . " ";
|
$list .= "PortA" . $_ . ":" . join(',', (sort { $setsP{ $a } <=> $setsP{ $b } } keys %setsP) ) . " ";
|
||||||
}
|
}
|
||||||
#foreach (0..7) {
|
#foreach (0..7) {
|
||||||
@ -425,7 +429,7 @@ sub I2C_MCP23008_I2CRec($@) { #ueber CallFn vom physical
|
|||||||
}
|
}
|
||||||
#hier noch ueberpruefen, ob Register und Daten ok
|
#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} && 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 = @{$clientmsg->{received}}; #bei uebergabe im hash als array
|
||||||
my @rec = split(" ",$clientmsg->{received}); #bei uebergabe im als skalar
|
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});
|
Log3 $hash, 3, "$name: wrong amount of registers transmitted from $pname" unless (@rec == $clientmsg->{nbyte});
|
||||||
@ -440,11 +444,11 @@ sub I2C_MCP23008_I2CRec($@) { #ueber CallFn vom physical
|
|||||||
} else {
|
} else {
|
||||||
readingsSingleUpdate($hash,"state", "transmission error", 1);
|
readingsSingleUpdate($hash,"state", "transmission error", 1);
|
||||||
Log3 $hash, 3, "$name: failurei in message from $pname";
|
Log3 $hash, 3, "$name: failurei in message from $pname";
|
||||||
Log3 $hash, 3,(defined($clientmsg->{direction}) ? "Direction: " . $clientmsg->{direction} : "Direction: undef").
|
Log3 $hash, 3, (defined($clientmsg->{direction}) ? "Direction: " . $clientmsg->{direction} : "Direction: undef").
|
||||||
(defined($clientmsg->{i2caddress}) ? " I2Caddress: " . sprintf("0x%.2X", $clientmsg->{i2caddress}) : " I2Caddress: undef").
|
(defined($clientmsg->{i2caddress}) ? " I2Caddress: " . sprintf("0x%.2X", $clientmsg->{i2caddress}) : " I2Caddress: undef").
|
||||||
(defined($clientmsg->{reg}) ? " Register: " . sprintf("0x%.2X", $clientmsg->{reg}) : " Register: undef").
|
(defined($clientmsg->{reg}) ? " Register: " . sprintf("0x%.2X", $clientmsg->{reg}) : " Register: undef").
|
||||||
(defined($clientmsg->{data}) ? " Data: " . sprintf("0x%.2X", $clientmsg->{data}) : " Data: undef").
|
(defined($clientmsg->{data}) ? " Data: " . sprintf("0x%.2X", $clientmsg->{data}) : " Data: undef").
|
||||||
(defined($clientmsg->{received}) ? " received: " . sprintf("0x%.2X", $clientmsg->{received}) : " received: undef");
|
(defined($clientmsg->{received}) ? " received: " . sprintf("0x%.2X", $clientmsg->{received}) : " received: undef");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
readingsSingleUpdate($hash,"state", "transmission error", 1);
|
readingsSingleUpdate($hash,"state", "transmission error", 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user