2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 10:46:53 +00:00

Better CUN disconnect handling

fhtsoftbuffer CUL attribute


git-svn-id: https://svn.fhem.de/fhem/trunk@458 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2009-11-08 14:18:06 +00:00
parent 7265019b46
commit 4c434fc447
4 changed files with 44 additions and 31 deletions

View File

@ -534,3 +534,5 @@
- ==DATE== (4.8) - ==DATE== (4.8)
- bugfix: loosing data when sending FS20 messages in a group - bugfix: loosing data when sending FS20 messages in a group
- bugfix: better handling of disconnected CUN
- feature: softfhtbuffer added to CUL

View File

@ -75,7 +75,7 @@ CUL_Initialize($)
$hash->{StateFn} = "CUL_SetState"; $hash->{StateFn} = "CUL_SetState";
$hash->{AttrList}= "do_not_notify:1,0 dummy:1,0 filtertimeout " . $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 " . "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"; $hash->{ShutdownFn} = "CUL_Shutdown";
} }
@ -387,7 +387,10 @@ READEND:
CUL_SimpleWrite($hash, $gets{$a[1]} . $arg); CUL_SimpleWrite($hash, $gets{$a[1]} . $arg);
($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0); ($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; $msg =~ s/[\r\n]//g;
} }
@ -505,11 +508,15 @@ CUL_ReadAnswer($$$)
my $nfound = select($rin, undef, undef, $to); my $nfound = select($rin, undef, undef, $to);
if($nfound < 0) { if($nfound < 0) {
next if ($! == EAGAIN() || $! == EINTR() || $! == 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) return ("Timeout reading answer for get $arg", undef)
if($nfound == 0); if($nfound == 0);
$buf = CUL_SimpleRead($hash); $buf = CUL_SimpleRead($hash);
return ("No data", undef) if(!defined($buf));
} }
if($buf) { if($buf) {
@ -642,6 +649,7 @@ CUL_HandleWriteQueue($)
} }
##################################### #####################################
# called from the global loop, when the select for hash->{FD} reports data
sub sub
CUL_Read($) CUL_Read($)
{ {
@ -657,18 +665,7 @@ CUL_Read($)
} }
if(!defined($buf) || length($buf) == 0) { if(!defined($buf) || length($buf) == 0) {
CUL_Disconnected($hash);
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");
return ""; return "";
} }
@ -702,7 +699,7 @@ CUL_Read($)
if($fn eq "F" && $len >= 9) { # Reformat for 10_FS20.pm 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})) { if(defined($attr{$name}) && defined($attr{$name}{CUR_id_list})) {
my $id= substr($dmsg,1,4); my $id= substr($dmsg,1,4);
@ -869,11 +866,7 @@ CUL_SimpleRead($)
if($hash->{TCPDev}) { if($hash->{TCPDev}) {
my $buf; my $buf;
if(!defined(sysread($hash->{TCPDev}, $buf, 256))) { if(!defined(sysread($hash->{TCPDev}, $buf, 256))) {
CUL_CloseDev($hash); CUL_Disconnected();
my $name = $hash->{NAME};
my $dev = $hash->{DeviceName};
$readyfnlist{"$name.$dev"} = $hash; # Start polling
$hash->{STATE} = "disconnected";
return undef; return undef;
} }
@ -991,4 +984,25 @@ CUL_OpenDev($$)
return $ret; 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; 1;

View File

@ -144,8 +144,8 @@ FHT_Initialize($)
$hash->{UndefFn} = "FHT_Undef"; $hash->{UndefFn} = "FHT_Undef";
$hash->{ParseFn} = "FHT_Parse"; $hash->{ParseFn} = "FHT_Parse";
$hash->{AttrList} = "IODev do_not_notify:0,1 model;fht80b dummy:0,1 " . $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 ". "showtime:0,1 loglevel:0,1,2,3,4,5,6 retrycount " .
"lazy tmpcorr"; "minfhtbuffer lazy tmpcorr";
} }
@ -404,7 +404,7 @@ FHT_Parse($$)
elsif($sval =~ m/.6/) { $val = "$fv" } elsif($sval =~ m/.6/) { $val = "$fv" }
elsif($sval =~ m/.8/) { $val = "offset: $fv" } elsif($sval =~ m/.8/) { $val = "offset: $fv" }
elsif($sval =~ m/.a/) { $val = "lime-protection" } 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/.e/) { $val = "test" }
elsif($sval =~ m/.f/) { $val = "pair" } elsif($sval =~ m/.f/) { $val = "pair" }
@ -554,12 +554,9 @@ getFhtBuffer($)
return getFhtMin($io) if(IsDummy($io->{NAME})); return getFhtMin($io) if(IsDummy($io->{NAME}));
for(;;) { for(;;) {
FHZ_Write($io, "04", "c90185"); my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "fhtbuf"));
my $msg = FHZ_ReadAnswer($io, "fhtbuf", 1.0);
if(!defined($msg)) { $msg= ""; }
Log 5, "getFhtBuffer: $count $msg"; Log 5, "getFhtBuffer: $count $msg";
return hex($1) if($msg && $msg =~ m/=> ([0-9A-F]+)$/i);
return hex(substr($msg, 16, 2)) if($msg && $msg =~ m/^[0-9A-F]+$/i);
return 0 if($count++ >= 5); return 0 if($count++ >= 5);
} }
} }

View File

@ -151,7 +151,7 @@ my %defaultattr; # Default attributes
my %intAt; # Internal at timer hash. my %intAt; # Internal at timer hash.
my $nextat; # Time when next timer will be triggered. my $nextat; # Time when next timer will be triggered.
my $intAtCnt=0; 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 = my $namedef =
"where <name> is either:\n" . "where <name> is either:\n" .
"- a single device name\n" . "- a single device name\n" .
@ -1274,7 +1274,7 @@ CommandReload($$)
my $m = $param; my $m = $param;
$m =~ s,^([0-9][0-9])_,,; $m =~ s,^([0-9][0-9])_,,;
my $order = (defined($1) ? $1 : "00"); my $order = (defined($1) ? $1 : "00");
Log 5, "Loading $file, order $order"; Log 5, "Loading $file";
no strict "refs"; no strict "refs";
eval { eval {