2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-14 05:46:35 +00:00

DevIo.pm: set state reading if changing STATE (Forum #29764), increase read buffer size (Forum #29557)

git-svn-id: https://svn.fhem.de/fhem/trunk@7099 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-11-30 08:51:47 +00:00
parent 29163f5fb7
commit ea27b8db5f

View File

@ -12,6 +12,14 @@ sub DevIo_SimpleReadWithTimeout($$);
sub DevIo_SimpleWrite($$$);
sub DevIo_TimeoutRead($$);
sub
DevIo_setStates($$)
{
my ($hash, $val) = @_;
$hash->{STATE} = $val;
setReadingsVal($hash, "state", $val, TimeNow());
}
########################
sub
DevIo_DoSimpleRead($)
@ -23,11 +31,11 @@ DevIo_DoSimpleRead($)
$buf = $hash->{USBDev}->input();
} elsif($hash->{DIODev}) {
$res = sysread($hash->{DIODev}, $buf, 256);
$res = sysread($hash->{DIODev}, $buf, 4096);
$buf = undef if(!defined($res));
} elsif($hash->{TCPDev}) {
$res = sysread($hash->{TCPDev}, $buf, 256);
$res = sysread($hash->{TCPDev}, $buf, 4096);
$buf = "" if(!defined($res));
}
@ -35,6 +43,7 @@ DevIo_DoSimpleRead($)
}
########################
# If called directly after a select, it should not block.
sub
DevIo_SimpleRead($)
{
@ -44,7 +53,7 @@ DevIo_SimpleRead($)
###########
# Lets' try again: Some drivers return len(0) on the first read...
if(defined($buf) && length($buf) == 0) {
$buf = DevIo_DoSimpleRead($hash);
$buf = DevIo_SimpleReadWithTimeout($hash, 1);
}
if(!defined($buf) || length($buf) == 0) {
@ -130,7 +139,7 @@ DevIo_Expect($$$)
my $answer= DevIo_SimpleReadWithTimeout($hash, $timeout);
return $answer unless($answer eq "");
# the device has failed to deliver a result
$hash->{STATE}= "failed";
DevIo_setStates($hash, "failed");
DoTrigger($name, "FAILED");
# reopen device
# unclear how to know whether the following succeeded
@ -145,7 +154,7 @@ DevIo_Expect($$$)
$answer= DevIo_SimpleReadWithTimeout($hash, $timeout);
# success
if($answer ne "") {
$hash->{STATE}= "opened";
DevIo_setStates($hash, "opened");
DoTrigger($name, "CONNECTED");
return $answer;
}
@ -186,7 +195,7 @@ DevIo_OpenDev($$$)
if(!$conn) {
Log3 $name, 3, "Can't connect to $dev: $!" if(!$reopen);
$readyfnlist{"$name.$dev"} = $hash;
$hash->{STATE} = "disconnected";
DevIo_setStates($hash, "disconnected");
return "";
}
$hash->{TCPDev} = $conn;
@ -213,7 +222,7 @@ DevIo_OpenDev($$$)
} else {
Log3 $name, 3, "Can't connect to $dev: $!" if(!$reopen);
$readyfnlist{"$name.$dev"} = $hash;
$hash->{STATE} = "disconnected";
DevIo_setStates($hash, "disconnected");
$hash->{NEXT_OPEN} = time()+60;
return "";
}
@ -229,7 +238,7 @@ DevIo_OpenDev($$$)
return undef if($reopen);
Log3 $name, 3, "Can't open $dev: $!";
$readyfnlist{"$name.$dev"} = $hash;
$hash->{STATE} = "disconnected";
DevIo_setStates($hash, "disconnected");
return "";
}
@ -266,7 +275,7 @@ DevIo_OpenDev($$$)
return undef if($reopen);
Log3 $name, 3, "Can't open $dev: $!";
$readyfnlist{"$name.$dev"} = $hash;
$hash->{STATE} = "disconnected";
DevIo_setStates($hash, "disconnected");
return "";
}
$hash->{USBDev} = $po;
@ -316,7 +325,7 @@ DevIo_OpenDev($$$)
Log3 $name, 3, "$name device opened" if(!$hash->{DevioText});
}
$hash->{STATE}="opened";
DevIo_setStates($hash, "opened");
my $ret;
if($initfn) {
@ -387,8 +396,7 @@ DevIo_Disconnected($)
Log3 $name, 1, "$dev disconnected, waiting to reappear ($name)";
DevIo_CloseDev($hash);
$readyfnlist{"$name.$dev"} = $hash; # Start polling
$hash->{STATE} = "disconnected";
setReadingsVal($hash, "state", "disconnected", TimeNow());
DevIo_setStates($hash, "disconnected");
DoTrigger($name, "DISCONNECTED");
}