From 44e27372b6c3093f88c28c60923554de90a52dee Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Sat, 8 Jun 2013 06:39:24 +0000 Subject: [PATCH] FBAHA reconnect works now / get dect200 devInfo detects 546E absence git-svn-id: https://svn.fhem.de/fhem/trunk@3260 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_FBAHA.pm | 16 ++++++++-------- fhem/FHEM/DevIo.pm | 7 ++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/fhem/FHEM/00_FBAHA.pm b/fhem/FHEM/00_FBAHA.pm index 404e28f9a..91a99675c 100755 --- a/fhem/FHEM/00_FBAHA.pm +++ b/fhem/FHEM/00_FBAHA.pm @@ -209,7 +209,9 @@ FBAHA_DoInit($) { my $hash = shift; my $name = $hash->{NAME}; - return FBAHA_Set($hash, ($name, "reregister")); + delete $hash->{HANDLE}; # else reregister fails / RELEASE is deadly + my $ret = FBAHA_Set($hash, ($name, "reregister")); + return $ret; } ##################################### @@ -293,22 +295,20 @@ FBAHA_ReadAnswer($$$) my ($hash, $arg, $regexp) = @_; return ("No FD (dummy device?)", undef) if(!$hash || ($^O !~ /Win/ && !defined($hash->{FD}))); - my $to = ($hash->{RA_Timeout} ? $hash->{RA_Timeout} : 3); for(;;) { return ("Device lost when reading answer for get $arg", undef) if(!$hash->{FD}); my $rin = ''; vec($rin, $hash->{FD}, 1) = 1; - my $nfound = select($rin, undef, undef, $to); - if($nfound < 0) { - next if ($! == EAGAIN() || $! == EINTR() || $! == 0); - my $err = $!; + my $nfound = select($rin, undef, undef, 3); + if($nfound <= 0) { + next if ($! == EAGAIN() || $! == EINTR()); + my $err = ($! ? $! : "Timeout"); + $hash->{TIMEOUT} = 1; DevIo_Disconnected($hash); return("FBAHA_ReadAnswer $arg: $err", undef); } - return ("Timeout reading answer for get $arg", undef) - if($nfound == 0); my $buf = DevIo_SimpleRead($hash); return ("No data", undef) if(!defined($buf)); diff --git a/fhem/FHEM/DevIo.pm b/fhem/FHEM/DevIo.pm index d65c427b9..a990dfa39 100644 --- a/fhem/FHEM/DevIo.pm +++ b/fhem/FHEM/DevIo.pm @@ -26,7 +26,7 @@ DevIo_DoSimpleRead($) } elsif($hash->{TCPDev}) { $res = sysread($hash->{TCPDev}, $buf, 256); - $buf = undef if(!defined($res)); + $buf = "" if(!defined($res)); } return $buf; @@ -142,7 +142,8 @@ DevIo_OpenDev($$$) return; } - my $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => 3); + my $timeout = $hash->{TIMEOUT} ? $hash->{TIMEOUT} : 3; + my $conn = IO::Socket::INET->new(PeerAddr => $dev, Timeout => $timeout); if($conn) { delete($hash->{NEXT_OPEN}) @@ -323,7 +324,7 @@ DevIo_Disconnected($) # Without the following sleep the open of the device causes a SIGSEGV, # and following opens block infinitely. Only a reboot helps. - sleep(5); + sleep(5) if($hash->{USBDEV}); DoTrigger($name, "DISCONNECTED"); }