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