From 7c484891762ff8ef9c07ad6e06bcff39ba87e669 Mon Sep 17 00:00:00 2001 From: mfr69bs Date: Thu, 17 Jan 2013 11:02:16 +0000 Subject: [PATCH] added attribut nonblocking git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@2524 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- FHEM/10_OWServer.pm | 119 ++++++++++++++++++++++++++++++++++++++------ FHEM/11_OWDevice.pm | 3 +- 2 files changed, 104 insertions(+), 18 deletions(-) diff --git a/FHEM/10_OWServer.pm b/FHEM/10_OWServer.pm index 00b84040c..eed5055b7 100644 --- a/FHEM/10_OWServer.pm +++ b/FHEM/10_OWServer.pm @@ -24,9 +24,6 @@ # ################################################################################ -# TODO: -# - doku für get / set nachziehen - package main; use strict; @@ -114,7 +111,7 @@ OWServer_Initialize($) $hash->{GetFn} = "OWServer_Get"; $hash->{SetFn} = "OWServer_Set"; # $hash->{AttrFn} = "OWServer_Attr"; - $hash->{AttrList}= "loglevel:0,1,2,3,4,5"; + $hash->{AttrList}= "nonblocking loglevel:0,1,2,3,4,5"; } ##################################### @@ -243,10 +240,51 @@ OWServer_DoInit($) sub OWServer_Read($@) { - my ($hash,$dev,$path)= @_; + my ($hash,$path)= @_; return undef unless(defined($hash->{fhem}{owserver})); - return $hash->{fhem}{owserver}->read($path); + + if(AttrVal($hash->{NAME},"nonblocking",undef)) { + $hash->{".path"}= $path; + pipe(READER,WRITER); + WRITER->autoflush(1); + + my $pid= fork; + if(!defined($pid)) { + Log 1, "OWServer: Cannot fork: $!"; + return undef; + } + + InternalTimer(gettimeofday()+20, "OWServer_TimeoutChild", $pid, 0); + if($pid == 0) { + close READER; + my $ret= OWNet::read($hash->{DEF},$path); + $ret =~ s/^\s+//g; + Log 5, "OWServer child read $path: $ret"; + delete $hash->{".path"}; + print WRITER $ret; + close WRITER; + exit 0; + } + + Log 5, "OWServer child ID for reading '$path' is $pid"; + close WRITER; + chomp(my $ret= ); + close READER; + return $ret; + } else { + my $ret= $hash->{fhem}{owserver}->read($path); + $ret =~ s/^\s+//g; + return $hash->{fhem}{owserver}->read($path); + } +} + +##################################### +sub +OWServer_TimeoutChild($) +{ + my $pid= shift; + Log 1, "OWServer: Terminated child $pid" if($pid && kill(9, $pid)); } ##################################### @@ -489,10 +527,32 @@ OWServer_Set($@) Set

@@ -500,11 +560,35 @@ OWServer_Set($@) Get

@@ -512,6 +596,12 @@ OWServer_Set($@) Attributes

- - - =end html =cut diff --git a/FHEM/11_OWDevice.pm b/FHEM/11_OWDevice.pm index 050254eca..10a0e5211 100644 --- a/FHEM/11_OWDevice.pm +++ b/FHEM/11_OWDevice.pm @@ -401,7 +401,6 @@ OWDevice_ReadFromServer($$@) no strict "refs"; my $ret; if($cmd eq "read") { - unshift(@a,$dev); $ret = &{$modules{$iohash->{TYPE}}{ReadFn}}($iohash, @a); } if($cmd eq "dir") { @@ -497,7 +496,7 @@ OWDevice_UpdateValues($) { readingsBulkUpdate($hash,"state",$state); readingsEndUpdate($hash,1); } - InternalTimer(gettimeofday()+$hash->{fhem}{interval}, "OWDevice_UpdateValues", $hash, 0) + InternalTimer(int(gettimeofday())+$hash->{fhem}{interval}, "OWDevice_UpdateValues", $hash, 0) if(defined($hash->{fhem}{interval})); }