From 4c434fc447567fe89487d6610068736560c27f05 Mon Sep 17 00:00:00 2001 From: rudolfkoenig <> Date: Sun, 8 Nov 2009 14:18:06 +0000 Subject: [PATCH] Better CUN disconnect handling fhtsoftbuffer CUL attribute git-svn-id: https://svn.fhem.de/fhem/trunk@458 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 ++ fhem/FHEM/00_CUL.pm | 56 ++++++++++++++++++++++++++++----------------- fhem/FHEM/11_FHT.pm | 13 ++++------- fhem/fhem.pl | 4 ++-- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index ed5197bdd..4438068d6 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -534,3 +534,5 @@ - ==DATE== (4.8) - bugfix: loosing data when sending FS20 messages in a group + - bugfix: better handling of disconnected CUN + - feature: softfhtbuffer added to CUL diff --git a/fhem/FHEM/00_CUL.pm b/fhem/FHEM/00_CUL.pm index fad742104..f3a96aeae 100755 --- a/fhem/FHEM/00_CUL.pm +++ b/fhem/FHEM/00_CUL.pm @@ -75,7 +75,7 @@ CUL_Initialize($) $hash->{StateFn} = "CUL_SetState"; $hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 filtertimeout " . "showtime:1,0 model:CUL,CUR loglevel:0,1,2,3,4,5,6 " . - "CUR_id_list"; + "CUR_id_list fhtsoftbuffer:1,0"; $hash->{ShutdownFn} = "CUL_Shutdown"; } @@ -387,7 +387,10 @@ READEND: CUL_SimpleWrite($hash, $gets{$a[1]} . $arg); ($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0); - $msg = "No answer" if(!defined($msg)); + if(!defined($msg)) { + CUL_Disconnected($hash); + $msg = "No answer"; + }; $msg =~ s/[\r\n]//g; } @@ -505,11 +508,15 @@ CUL_ReadAnswer($$$) my $nfound = select($rin, undef, undef, $to); if($nfound < 0) { next if ($! == EAGAIN() || $! == EINTR() || $! == 0); - die("Select error $nfound / $!", undef); + my $err = $!; + close($hash->{FD}); + undef($hash->{FD}); + return("CUL_ReadAnswer $arg: $err", undef); } return ("Timeout reading answer for get $arg", undef) if($nfound == 0); $buf = CUL_SimpleRead($hash); + return ("No data", undef) if(!defined($buf)); } if($buf) { @@ -642,6 +649,7 @@ CUL_HandleWriteQueue($) } ##################################### +# called from the global loop, when the select for hash->{FD} reports data sub CUL_Read($) { @@ -657,18 +665,7 @@ CUL_Read($) } if(!defined($buf) || length($buf) == 0) { - - my $dev = $hash->{DeviceName}; - Log 1, "$dev disconnected, waiting to reappear"; - CUL_CloseDev($hash); - $readyfnlist{"$name.$dev"} = $hash; # Start polling - $hash->{STATE} = "disconnected"; - - # Without the following sleep the open of the device causes a SIGSEGV, - # and following opens block infinitely. Only a reboot helps. - sleep(5); - - DoTrigger($name, "DISCONNECTED"); + CUL_Disconnected($hash); return ""; } @@ -702,7 +699,7 @@ CUL_Read($) if($fn eq "F" && $len >= 9) { # Reformat for 10_FS20.pm - CUL_AddFS20Queue($hash, "-"); # Avoid sending response too early + CUL_AddFS20Queue($hash, "-"); # Block immediate replies if(defined($attr{$name}) && defined($attr{$name}{CUR_id_list})) { my $id= substr($dmsg,1,4); @@ -869,11 +866,7 @@ CUL_SimpleRead($) if($hash->{TCPDev}) { my $buf; if(!defined(sysread($hash->{TCPDev}, $buf, 256))) { - CUL_CloseDev($hash); - my $name = $hash->{NAME}; - my $dev = $hash->{DeviceName}; - $readyfnlist{"$name.$dev"} = $hash; # Start polling - $hash->{STATE} = "disconnected"; + CUL_Disconnected(); return undef; } @@ -991,4 +984,25 @@ CUL_OpenDev($$) return $ret; } +sub +CUL_Disconnected($) +{ + my $hash = shift; + my $dev = $hash->{DeviceName}; + my $name = $hash->{NAME}; + + return if(!defined($hash->{FD})); # Already deleted. + + Log 1, "$dev disconnected, waiting to reappear"; + CUL_CloseDev($hash); + $readyfnlist{"$name.$dev"} = $hash; # Start polling + $hash->{STATE} = "disconnected"; + + # Without the following sleep the open of the device causes a SIGSEGV, + # and following opens block infinitely. Only a reboot helps. + sleep(5); + + DoTrigger($name, "DISCONNECTED"); +} + 1; diff --git a/fhem/FHEM/11_FHT.pm b/fhem/FHEM/11_FHT.pm index a6f997985..0b42c85e4 100755 --- a/fhem/FHEM/11_FHT.pm +++ b/fhem/FHEM/11_FHT.pm @@ -144,8 +144,8 @@ FHT_Initialize($) $hash->{UndefFn} = "FHT_Undef"; $hash->{ParseFn} = "FHT_Parse"; $hash->{AttrList} = "IODev do_not_notify:0,1 model;fht80b dummy:0,1 " . - "showtime:0,1 loglevel:0,1,2,3,4,5,6 retrycount minfhtbuffer ". - "lazy tmpcorr"; + "showtime:0,1 loglevel:0,1,2,3,4,5,6 retrycount " . + "minfhtbuffer lazy tmpcorr"; } @@ -404,7 +404,7 @@ FHT_Parse($$) elsif($sval =~ m/.6/) { $val = "$fv" } elsif($sval =~ m/.8/) { $val = "offset: $fv" } elsif($sval =~ m/.a/) { $val = "lime-protection" } - elsif($sval =~ m/.c/) { $val = sprintf("synctime: %d", int($val>>1)); } + elsif($sval =~ m/.c/) { $val = sprintf("synctime: %d", int($val/2)-1); } elsif($sval =~ m/.e/) { $val = "test" } elsif($sval =~ m/.f/) { $val = "pair" } @@ -554,12 +554,9 @@ getFhtBuffer($) return getFhtMin($io) if(IsDummy($io->{NAME})); for(;;) { - FHZ_Write($io, "04", "c90185"); - my $msg = FHZ_ReadAnswer($io, "fhtbuf", 1.0); - if(!defined($msg)) { $msg= ""; } + my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "fhtbuf")); Log 5, "getFhtBuffer: $count $msg"; - - return hex(substr($msg, 16, 2)) if($msg && $msg =~ m/^[0-9A-F]+$/i); + return hex($1) if($msg && $msg =~ m/=> ([0-9A-F]+)$/i); return 0 if($count++ >= 5); } } diff --git a/fhem/fhem.pl b/fhem/fhem.pl index cb1ea7b1e..8c45888ea 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -151,7 +151,7 @@ my %defaultattr; # Default attributes my %intAt; # Internal at timer hash. my $nextat; # Time when next timer will be triggered. my $intAtCnt=0; -my $cvsid = '$Id: fhem.pl,v 1.80 2009-09-11 07:34:12 rudolfkoenig Exp $'; +my $cvsid = '$Id: fhem.pl,v 1.81 2009-11-08 14:18:06 rudolfkoenig Exp $'; my $namedef = "where is either:\n" . "- a single device name\n" . @@ -1274,7 +1274,7 @@ CommandReload($$) my $m = $param; $m =~ s,^([0-9][0-9])_,,; my $order = (defined($1) ? $1 : "00"); - Log 5, "Loading $file, order $order"; + Log 5, "Loading $file"; no strict "refs"; eval {