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:
parent
7265019b46
commit
4c434fc447
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user