diff --git a/fhem/FHEM/00_OWX_ASYNC.pm b/fhem/FHEM/00_OWX_ASYNC.pm index d883e80d7..012e8b043 100644 --- a/fhem/FHEM/00_OWX_ASYNC.pm +++ b/fhem/FHEM/00_OWX_ASYNC.pm @@ -128,7 +128,7 @@ my %attrs = ( ); #-- some globals needed for the 1-Wire module -$owx_async_version=5.5; +$owx_async_version=5.6; #-- Debugging 0,1,2,3 $owx_async_debug=0; @@ -673,24 +673,19 @@ sub OWX_ASYNC_Get($@) { if( $a[1] eq "alarms") { eval { - $task = OWX_ASYNC_PT_Alarms($hash); - OWX_ASYNC_ScheduleMaster($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($hash,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Alarms($hash)); }; return $@ if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); unless ( defined $hash->{ALARMDEVS} and @{$hash->{ALARMDEVS}}) { return "OWX: No alarmed 1-Wire devices found on bus $name"; } return "OWX: ".scalar(@{$hash->{ALARMDEVS}})." alarmed 1-Wire devices found on bus $name (".join(",",@{$hash->{ALARMDEVS}}).")"; } elsif( $a[1] eq "devices") { eval { - $task = OWX_ASYNC_PT_Discover($hash); - OWX_ASYNC_ScheduleMaster($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($hash,$task); + $task_state = OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Discover($hash)); }; return $@ if $@; - return ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + return $task_state; } elsif( $a[1] eq "version") { return $owx_async_version; @@ -748,7 +743,7 @@ sub OWX_ASYNC_Init ($) { my $pt_discover = OWX_ASYNC_PT_Discover($hash); $pt_discover->{ExecuteTime} = gettimeofday()+10; eval { - OWX_ASYNC_ScheduleMaster($hash,$pt_discover); + OWX_ASYNC_Schedule($hash,$pt_discover); }; return GP_Catch($@) if $@; @@ -797,7 +792,7 @@ sub OWX_ASYNC_Kick($) { unless ($hash->{".kickrunning"}) { $hash->{".kickrunning"} = 1; eval { - OWX_ASYNC_ScheduleMaster( $hash, PT_THREAD(sub { + OWX_ASYNC_Schedule( $hash, PT_THREAD(sub { my ($thread) = @_; PT_BEGIN($thread); #-- Only if we have the dokick attribute set to 1 @@ -818,7 +813,7 @@ sub OWX_ASYNC_Kick($) { my ($client) = @_; if ($client->{TYPE} eq "OWTHERM" and AttrVal($client->{NAME},"tempConv","") eq "onkick" ) { Log3 $client->{NAME},5,"OWX_ASYNC_PT_Kick: doing tempConv for $client->{NAME}"; - OWX_ASYNC_Schedule($client, PT_THREAD(\&OWXTHERM_PT_GetValues), $client ); + OWX_ASYNC_Schedule($client, OWXTHERM_PT_GetValues($client) ); } },undef); } @@ -995,12 +990,11 @@ sub OWX_ASYNC_PT_Execute($$$$$) { } } -sub OWX_ASYNC_Schedule($$@) { - my ( $hash, $task, @args ) = @_; - my $master = $hash->{IODev}; +sub OWX_ASYNC_Schedule($$) { + my ( $hash, $task ) = @_; + my $master = $hash->{TYPE} eq "OWX_ASYNC" ? $hash : $hash->{IODev}; die "OWX_ASYNC_Schedule: Master not Active" unless $master->{STATE} eq "Active"; my $name = $hash->{NAME}; - $task->{ExecuteArgs} = \@args; $task->{ExecuteTime} = gettimeofday() unless (defined $task->{ExecuteTime}); if (defined $master->{tasks}->{$name}) { push @{$master->{tasks}->{$name}}, $task; @@ -1013,32 +1007,22 @@ sub OWX_ASYNC_Schedule($$@) { InternalTimer($task->{ExecuteTime}, "OWX_ASYNC_RunTasks", $master,0); }; -sub OWX_ASYNC_ScheduleMaster($$@) { - my ( $master, $task, @args ) = @_; - die "OWX_ASYNC_Schedule: Master not Active" unless $master->{STATE} eq "Active"; - my $name = $master->{NAME}; - $task->{ExecuteArgs} = \@args; - $task->{ExecuteTime} = gettimeofday() unless (defined $task->{ExecuteTime}); - if (defined $master->{tasks}->{$name}) { - push @{$master->{tasks}->{$name}}, $task; - $master->{NUMTASKS} = @{$master->{tasks}->{$name}}; - } else { - $master->{tasks}->{$name} = [$task]; - $master->{NUMTASKS} = 1; - } - #TODO make use of $master->{".nexttasktime"} - InternalTimer($task->{ExecuteTime}, "OWX_ASYNC_RunTasks", $master,0); -}; - sub OWX_ASYNC_RunToCompletion($$) { - my ($master,$task) = @_; - my $task_state; - do { - OWX_ASYNC_Poll($master); - OWX_ASYNC_RunTasks($master); - $task_state = $task->PT_STATE(); - } while ($task_state == PT_INITIAL or $task_state == PT_WAITING or $task_state == PT_YIELDED); - return $task_state; + my ($hash,$task) = @_; + + my $task_state; + eval { + OWX_ASYNC_Schedule($hash,$task); + my $master = $hash->{TYPE} eq "OWX_ASYNC" ? $hash : $hash->{IODev}; + do { + OWX_ASYNC_Poll($master); + OWX_ASYNC_RunTasks($master); + $task_state = $task->PT_STATE(); + } while ($task_state == PT_INITIAL or $task_state == PT_WAITING or $task_state == PT_YIELDED); + }; + die $@ if $@; + die $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); + return $task->PT_RETVAL(); } sub OWX_ASYNC_RunTasks($) { @@ -1078,45 +1062,49 @@ sub OWX_ASYNC_RunTasks($) { if (defined (my $current = @queue_waiting ? shift @queue_waiting : @queue_ready ? shift @queue_ready : @queue_initial ? shift @queue_initial : undef)) { my $task = $current->{queue}->[0]; my $timeout = $task->{TimeoutTime}; - if ($task->PT_SCHEDULE(@{$task->{ExecuteArgs}})) { + if ($task->PT_SCHEDULE()) { my $state = $task->PT_STATE(); # waiting for ExecuteResponse: if ($state == PT_WAITING) { - die "$current->{device} unexpected thread state PT_WAITING without TimeoutTime" unless (defined $task->{TimeoutTime}); - #task timed out: - if ($now >= $task->{TimeoutTime}) { - Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task timed out"); - Log3 ($master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: $current->{device} TimeoutTime: %.6f, now: %.6f",$task->{TimeoutTime},$now)) if ($owx_async_debug>1); - $task->PT_CANCEL("Timeout"); - shift @{$current->{queue}}; - $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; - next; - } else { - Log3 $master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} waiting for data or timeout" if ($owx_async_debug>2); - #new timeout or timeout did change: - if (!defined $timeout or $timeout != $task->{TimeoutTime}) { - Log3 $master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: $current->{device} schedule for timeout at %.6f",$task->{TimeoutTime}); - InternalTimer($task->{TimeoutTime}, "OWX_ASYNC_RunTasks", $master,0); + if (defined $task->{TimeoutTime}) { + #task timed out: + if ($now >= $task->{TimeoutTime}) { + Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task timed out"); + Log3 ($master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: TimeoutTime: %.6f, now: %.6f",$task->{TimeoutTime},$now)) if ($owx_async_debug>1); + $task->PT_CANCEL("Timeout"); + shift @{$current->{queue}}; + $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; + next; + } else { + Log3 $master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} task waiting for data or timeout" if ($owx_async_debug>2); + #new timeout or timeout did change: + if (!defined $timeout or $timeout != $task->{TimeoutTime}) { + Log3 $master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: $current->{device} task schedule for timeout at %.6f",$task->{TimeoutTime}); + InternalTimer($task->{TimeoutTime}, "OWX_ASYNC_RunTasks", $master,0); + } + last; } - last; + } else { + Log3 ($master->{NAME},4,"$current->{device} unexpected thread state PT_WAITING without TimeoutTime"); + $task->{TimeoutTime} = $now + 2; #TODO implement attribute based timeout } # sleeping: } elsif ($state == PT_YIELDED) { next; } else { - die "$current->{device} unexpected thread state while running: $state"; + Log3 ($master->{NAME},4,"$current->{device} unexpected thread state while running: $state"); } } else { my $state = $task->PT_STATE(); if ($state == PT_ENDED) { - Log3 ($master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} finished task"); + Log3 ($master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} task finished"); } elsif ($state == PT_EXITED) { - Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} exited task: ".(defined $task->PT_RETVAL() ? $task->PT_RETVAL : "- no retval -")); + Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task exited: ".(defined $task->PT_RETVAL() ? $task->PT_RETVAL : "- no retval -")); } elsif ($state == PT_ERROR) { - Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} Error task: ".$task->PT_CAUSE()); + Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task Error: ".$task->PT_CAUSE()); $main::defs{$current->{device}}->{PRESENT} = 0; } else { - die "$current->{device} unexpected thread state after termination: $state"; + Log3 ($master->{NAME},4,"$current->{device} unexpected thread state after termination: $state"); } shift @{$current->{queue}}; $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; diff --git a/fhem/FHEM/21_OWAD.pm b/fhem/FHEM/21_OWAD.pm index 907fd66db..17c7dd0d4 100644 --- a/fhem/FHEM/21_OWAD.pm +++ b/fhem/FHEM/21_OWAD.pm @@ -90,7 +90,7 @@ use ProtoThreads; no warnings 'deprecated'; sub Log($$); -my $owx_version="5.16"; +my $owx_version="5.17"; #-- fixed raw channel name, flexible channel name my @owg_fixed = ("A","B","C","D"); my @owg_channel = ("A","B","C","D"); @@ -589,12 +589,9 @@ sub OWAD_Get($@) { if( $hash->{ASYNC} ){ my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -621,13 +618,10 @@ sub OWAD_Get($@) { if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"reading",1); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXAD_PT_GetPage($hash,"reading",1); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"reading",1)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSAD_GetPage($hash,"reading",1); @@ -653,13 +647,10 @@ sub OWAD_Get($@) { if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"alarm",1); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXAD_PT_GetPage($hash,"alarm",1); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"alarm",1)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSAD_GetPage($hash,"alarm",1); @@ -693,13 +684,10 @@ sub OWAD_Get($@) { if( $interface eq "OWX" ){ $ret = OWXAD_GetPage($hash,"status",1); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXAD_PT_GetPage($hash,"status",1); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"status",1)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSAD_GetPage($hash,"status",1); diff --git a/fhem/FHEM/21_OWCOUNT.pm b/fhem/FHEM/21_OWCOUNT.pm index d3575757e..92b532c97 100644 --- a/fhem/FHEM/21_OWCOUNT.pm +++ b/fhem/FHEM/21_OWCOUNT.pm @@ -99,7 +99,7 @@ no warnings 'deprecated'; sub Log3($$$); -my $owx_version="5.23"; +my $owx_version="5.24"; #-- fixed raw channel name, flexible channel name my @owg_fixed = ("A","B"); my @owg_channel = ("A","B"); @@ -651,14 +651,10 @@ sub OWCOUNT_Get($@) { my $master = $hash->{IODev}; #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -848,20 +844,14 @@ sub OWCOUNT_GetPage ($$$@) { if( $interface eq "OWX" ){ $ret = OWXCOUNT_GetPage($hash,$page,$final); }elsif( $interface eq "OWX_ASYNC" ){ - if ($sync) { - my ($task,$task_state); - eval { - $task = OWXCOUNT_PT_GetPage($hash,$page,$final); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); - }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); - } else { - eval { + eval { + if ($sync) { + $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_GetPage($hash,$page,$final)); + } else { OWX_ASYNC_Schedule( $hash, OWXCOUNT_PT_GetPage($hash,$page,$final) ); - }; - $ret = GP_Catch($@) if $@; - } + } + }; + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSCOUNT_GetPage($hash,$page,$final); @@ -1159,13 +1149,10 @@ sub OWCOUNT_InitializeDevice($) { $ret = OWXCOUNT_GetPage($hash,14,0); $ret = OWXCOUNT_SetPage($hash,14,$olddata); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXCOUNT_PT_InitializeDevicePage($hash,14,$newdata); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_InitializeDevicePage($hash,14,$newdata)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSCOUNT_GetPage($hash,14,0); @@ -1187,13 +1174,10 @@ sub OWCOUNT_InitializeDevice($) { $ret = OWXCOUNT_GetPage($hash,0,0); $ret = OWXCOUNT_SetPage($hash,0,$olddata); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXCOUNT_PT_InitializeDevicePage($hash,0,$newdata); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_InitializeDevicePage($hash,0,$newdata)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSCOUNT_GetPage($hash,0,0); diff --git a/fhem/FHEM/21_OWID.pm b/fhem/FHEM/21_OWID.pm index fb415708f..aaae6cca2 100644 --- a/fhem/FHEM/21_OWID.pm +++ b/fhem/FHEM/21_OWID.pm @@ -68,7 +68,7 @@ use ProtoThreads; no warnings 'deprecated'; sub Log($$); -my $owx_version="5.13"; +my $owx_version="5.14"; #-- declare variables my %gets = ( "present" => "", @@ -334,14 +334,10 @@ sub OWID_Get($@) { my $master = $hash->{IODev}; #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -386,10 +382,8 @@ sub OWID_GetValues($) { my $master = $hash->{IODev}; if( $hash->{ASYNC} ){ - #TODO use OWX_ASYNC_Schedule instead - my $task = OWX_ASYNC_PT_Verify($hash); eval { - OWX_ASYNC_Schedule($hash,$task); + OWX_ASYNC_Schedule($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; return undef; diff --git a/fhem/FHEM/21_OWLCD.pm b/fhem/FHEM/21_OWLCD.pm index b2b2a0194..998d843f7 100644 --- a/fhem/FHEM/21_OWLCD.pm +++ b/fhem/FHEM/21_OWLCD.pm @@ -77,7 +77,7 @@ no warnings 'deprecated'; sub Log3($$$); -my $owx_version="3.38"; +my $owx_version="5.1"; #-- controller may be HD44780 or KS0073 # these values have to be changed for different display # geometries or memory maps @@ -324,14 +324,10 @@ sub OWLCD_Get($@) { if($a[1] eq "present") { #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -343,13 +339,10 @@ sub OWLCD_Get($@) { #-- get gpio states if($a[1] eq "gpio") { if ($hash->{ASYNC}) { - my ($task,$task_state); eval { - $task = OWXLCD_PT_Get($hash,"gpio"); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"gpio")); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; return $ret if $ret; return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"gpio",""); } else { @@ -361,13 +354,10 @@ sub OWLCD_Get($@) { #-- get gpio counters if($a[1] eq "counter") { if ($hash->{ASYNC}) { - my ($task,$task_state); eval { - $task = OWXLCD_PT_Get($hash,"counter"); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"counter")); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; return $ret if $ret; return "$name.counter => ".main::ReadingsVal($hash->{NAME},"counter",""); } else { @@ -379,13 +369,10 @@ sub OWLCD_Get($@) { #-- get version if($a[1] eq "version") { if ($hash->{ASYNC}) { - my ($task,$task_state); eval { - $task = OWXLCD_PT_Get($hash,"version"); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"version")); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; return $ret if $ret; return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"version",""); } else { @@ -399,13 +386,10 @@ sub OWLCD_Get($@) { my $page = (defined $a[2] and $a[2] =~ m/\d/) ? int($a[2]) : 0; Log3 $name,1,"Calling GetMemory with page $page"; if ($hash->{ASYNC}) { - my ($task,$task_state); eval { - $task = OWXLCD_PT_GetMemory($hash,$page); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_GetMemory($hash,$page)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; return $ret if $ret; return "$name $reading $page => ".main::ReadingsVal($hash->{NAME},"memory$page",""); } else { diff --git a/fhem/FHEM/21_OWMULTI.pm b/fhem/FHEM/21_OWMULTI.pm index 787c42804..209ffe45b 100644 --- a/fhem/FHEM/21_OWMULTI.pm +++ b/fhem/FHEM/21_OWMULTI.pm @@ -82,7 +82,7 @@ no warnings 'deprecated'; sub Log($$); -my $owx_version="5.16"; +my $owx_version="5.17"; #-- flexible channel name my $owg_channel; @@ -481,14 +481,10 @@ sub OWMULTI_Get($@) { if( $interface =~ /^OWX/ ){ #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -517,13 +513,10 @@ sub OWMULTI_Get($@) { #-- not different from getting all values .. $ret = OWXMULTI_GetValues($hash); }elsif( $interface eq "OWX_ASYNC"){ - my ($task,$task_state); eval { - $task = OWXMULTI_PT_GetValues($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXMULTI_PT_GetValues($hash)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface not yet implemented }elsif( $interface eq "OWServer" ){ $ret = OWFSMULTI_GetValues($hash); diff --git a/fhem/FHEM/21_OWSWITCH.pm b/fhem/FHEM/21_OWSWITCH.pm index 7ca7a2070..849de1aee 100644 --- a/fhem/FHEM/21_OWSWITCH.pm +++ b/fhem/FHEM/21_OWSWITCH.pm @@ -89,7 +89,7 @@ no warnings 'deprecated'; sub Log($$); -my $owx_version="5.17"; +my $owx_version="5.18"; #-- fixed raw channel name, flexible channel name my @owg_fixed = ("A","B","C","D","E","F","G","H"); my @owg_channel = ("A","B","C","D","E","F","G","H"); @@ -489,14 +489,10 @@ sub OWSWITCH_Get($@) { if($a[1] eq "present") { #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -540,13 +536,10 @@ sub OWSWITCH_Get($@) { if( $interface eq "OWX" ){ $ret = OWXSWITCH_GetState($hash); }elsif( $interface eq "OWX_ASYNC") { - my ($task,$task_state); eval { - $task = OWXSWITCH_PT_GetState($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXSWITCH_PT_GetState($hash)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWFS" ){ $ret = OWFSSWITCH_GetState($hash); @@ -565,13 +558,10 @@ sub OWSWITCH_Get($@) { if( $interface eq "OWX" ){ $ret = OWXSWITCH_GetState($hash); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXSWITCH_PT_GetState($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXSWITCH_PT_GetState($hash)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; }elsif( $interface eq "OWServer" ){ $ret = OWFSSWITCH_GetState($hash); }else{ @@ -836,7 +826,7 @@ sub OWSWITCH_Set($@) { return "OWSWITCH: GetValues with wrong IODev type $interface"; } #-- process results - if( defined($ret) ){ + if($ret){ return "OWSWITCH: Could not set device $name, reason: ".$ret; } } @@ -1502,11 +1492,12 @@ sub OWXSWITCH_PT_SetOutput($$$) { PT_BEGIN($thread); $thread->{task} = OWXSWITCH_PT_GetState($hash); + $thread->{TimeoutTime} = gettimeofday()+2; #TODO: implement attribute-based timeout PT_WAIT_THREAD($thread->{task}); + delete $thread->{TimeoutTime}; + die $thread->{task}->PT_CAUSE() if ($thread->{task}->PT_STATE() == PT_ERROR); $ret = $thread->{task}->PT_RETVAL(); - if ($ret) { - PT_EXIT($ret); - } + die $ret if $ret; $value = 0; #-- vax or val ? for (my $i=0;$i<$cnumber{$attr{$hash->{NAME}}{"model"}};$i++){ @@ -1517,11 +1508,12 @@ sub OWXSWITCH_PT_SetOutput($$$) { } $thread->{value} = $value; $thread->{task} = OWXSWITCH_PT_SetState($hash,$thread->{value}); + $thread->{TimeoutTime} = gettimeofday()+2; #TODO: implement attribute-based timeout PT_WAIT_THREAD($thread->{task}); + delete $thread->{TimeoutTime}; + die $thread->{task}->PT_CAUSE() if ($thread->{task}->PT_STATE() == PT_ERROR); $ret = $thread->{task}->PT_RETVAL(); - if ($ret) { - PT_EXIT($ret); - } + die $ret if $ret; PT_END; }); } diff --git a/fhem/FHEM/21_OWTHERM.pm b/fhem/FHEM/21_OWTHERM.pm index 4c4be35e8..08ac4838c 100644 --- a/fhem/FHEM/21_OWTHERM.pm +++ b/fhem/FHEM/21_OWTHERM.pm @@ -86,7 +86,7 @@ no warnings 'deprecated'; sub Log3($$$); sub AttrVal($$$); -my $owx_version="5.21"; +my $owx_version="5.22"; my %gets = ( "id" => "", @@ -461,14 +461,10 @@ sub OWTHERM_Get($@) { if( $interface =~ /^OWX/ ){ #-- asynchronous mode if( $hash->{ASYNC} ){ - my ($task,$task_state); eval { - $task = OWX_ASYNC_PT_Verify($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash)); }; return GP_Catch($@) if $@; - return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED); return "$name.present => ".ReadingsVal($name,"present","unknown"); } else { $value = OWX_Verify($master,$hash->{ROM_ID}); @@ -496,13 +492,10 @@ sub OWTHERM_Get($@) { #-- not different from getting all values .. $ret = OWXTHERM_GetValues($hash); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXTHERM_PT_GetValues($hash); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_GetValues($hash)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSTHERM_GetValues($hash); @@ -668,13 +661,10 @@ sub OWTHERM_InitializeDevice($) { if( $interface eq "OWX" ){ $ret = OWXTHERM_SetValues($hash,$args); }elsif( $interface eq "OWX_ASYNC" ){ - my ($task,$task_state); eval { - $task = OWXTHERM_PT_SetValues($hash,$args); - OWX_ASYNC_Schedule($hash,$task); - $task_state = OWX_ASYNC_RunToCompletion($master,$task); + $ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_SetValues($hash,$args)); }; - $ret = ($@) ? GP_Catch($@) : ($task_state == PT_ERROR or $task_state == PT_CANCELED) ? $task->PT_CAUSE() : $task->PT_RETVAL(); + $ret = GP_Catch($@) if $@; #-- OWFS interface }elsif( $interface eq "OWServer" ){ $ret = OWFSTHERM_SetValues($hash,$args); @@ -1108,7 +1098,7 @@ sub OWXTHERM_SetValues($$) { # ######################################################################################## -sub OWXTHERM_PT_GetValues($@) { +sub OWXTHERM_PT_GetValues($) { my ($hash) = @_;