2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-16 04:36:02 +00:00

DevIo.pm: New mode: DEVIO, Forum #46276

git-svn-id: https://svn.fhem.de/fhem/trunk@10958 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2016-02-28 16:12:02 +00:00
parent 0715222ce2
commit 34d5869ec0

View File

@ -38,6 +38,11 @@ DevIo_DoSimpleRead($)
$res = sysread($hash->{TCPDev}, $buf, 4096);
$buf = "" if(!defined($res));
} elsif($hash->{IODev}) {
$buf = $hash->{IODevRxBuffer};
$hash->{IODevRxBuffer} = "";
$buf = "" if(!defined($buf));
}
return $buf;
}
@ -113,9 +118,19 @@ DevIo_SimpleWrite($$$)
Log3 ($name, 5, $ishex ? "SW: $msg" : "SW: ".unpack("H*",$msg));
$msg = pack('H*', $msg) if($ishex);
$hash->{USBDev}->write($msg) if($hash->{USBDev});
syswrite($hash->{TCPDev}, $msg) if($hash->{TCPDev});
syswrite($hash->{DIODev}, $msg) if($hash->{DIODev});
if($hash->{USBDev}){
$hash->{USBDev}->write($msg);
} elsif($hash->{TCPDev}) {
syswrite($hash->{TCPDev}, $msg);
} elsif($hash->{DIODev}) {
syswrite($hash->{DIODev}, $msg);
} elsif($hash->{IODev}) {
CallFn($hash->{IODev}{NAME},"IOWriteFn",$hash,$msg);
}
select(undef, undef, undef, 0.001);
}
@ -225,6 +240,22 @@ DevIo_OpenDev($$$)
delete($readyfnlist{"$name.$dev"});
$selectlist{"$name.$dev"} = $hash;
} elsif($dev =~ m/^FHEM:DEVIO:(.*)(:(.*))/) { # Forum #46276
my ($devName, $devPort) = ($1, $3);
AssignIoPort($hash, $devName);
if (defined($hash->{IODev})) {
($dev, $baudrate) = split("@", $hash->{DeviceName});
$hash->{IODevPort} = $devPort if (defined($devPort));
$hash->{IODevParameters} = $baudrate if (defined($baudrate));
if (!CallFn($devName, "IOOpenFn", $hash)) {
Log3 $name, 3, "Can't open $dev!";
DevIo_setStates($hash, "disconnected");
return "";
}
} else {
DevIo_setStates($hash, "disconnected");
return "";
}
} elsif($dev =~ m/^(.+):([0-9]+)$/) { # host:port
# This part is called every time the timeout (5sec) is expired _OR_
@ -397,6 +428,15 @@ DevIo_CloseDev($@)
close($hash->{DIODev});
delete($hash->{DIODev});
} elsif($hash->{IODev}) {
eval {
CallFn($hash->{IODev}{NAME}, "IOCloseFn", $hash);
}; # ignore closing errors (e.g. caused by fork)
delete($hash->{IODevParameters});
delete($hash->{IODevPort});
delete($hash->{IODevRxBuffer});
delete($hash->{IODev});
}
($dev, undef) = split("@", $dev); # Remove the baudrate
delete($selectlist{"$name.$dev"});
@ -409,7 +449,10 @@ sub
DevIo_IsOpen($)
{
my ($hash) = @_;
return ($hash->{TCPDev} || $hash->{USBDev} || $hash->{DIODev});
return ($hash->{TCPDev} ||
$hash->{USBDev} ||
$hash->{DIODev} ||
$hash->{IODevPort});
}
sub