2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-03 04:36:36 +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)
- 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->{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;

View File

@ -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);
}
}

View File

@ -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 <name> 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 {