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:
parent
0715222ce2
commit
34d5869ec0
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user