2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-28 11:01:59 +00:00

OWX_ASYNC: fix kick, OWSWITCH: fix missing TimeoutTime setting outputs

Merge branch 'owx_protothreads'

git-svn-id: https://svn.fhem.de/fhem/trunk@6263 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ntruchsess 2014-07-16 12:42:19 +00:00
parent b1ef3eb088
commit 661774db6a
8 changed files with 111 additions and 198 deletions

View File

@ -128,7 +128,7 @@ my %attrs = (
); );
#-- some globals needed for the 1-Wire module #-- some globals needed for the 1-Wire module
$owx_async_version=5.5; $owx_async_version=5.6;
#-- Debugging 0,1,2,3 #-- Debugging 0,1,2,3
$owx_async_debug=0; $owx_async_debug=0;
@ -673,24 +673,19 @@ sub OWX_ASYNC_Get($@) {
if( $a[1] eq "alarms") { if( $a[1] eq "alarms") {
eval { eval {
$task = OWX_ASYNC_PT_Alarms($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Alarms($hash));
OWX_ASYNC_ScheduleMaster($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($hash,$task);
}; };
return $@ if $@; return $@ if $@;
return $task->PT_CAUSE() if ($task_state == PT_ERROR or $task_state == PT_CANCELED);
unless ( defined $hash->{ALARMDEVS} and @{$hash->{ALARMDEVS}}) { unless ( defined $hash->{ALARMDEVS} and @{$hash->{ALARMDEVS}}) {
return "OWX: No alarmed 1-Wire devices found on bus $name"; 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}}).")"; return "OWX: ".scalar(@{$hash->{ALARMDEVS}})." alarmed 1-Wire devices found on bus $name (".join(",",@{$hash->{ALARMDEVS}}).")";
} elsif( $a[1] eq "devices") { } elsif( $a[1] eq "devices") {
eval { eval {
$task = OWX_ASYNC_PT_Discover($hash); $task_state = OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Discover($hash));
OWX_ASYNC_ScheduleMaster($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($hash,$task);
}; };
return $@ if $@; 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") { } elsif( $a[1] eq "version") {
return $owx_async_version; return $owx_async_version;
@ -748,7 +743,7 @@ sub OWX_ASYNC_Init ($) {
my $pt_discover = OWX_ASYNC_PT_Discover($hash); my $pt_discover = OWX_ASYNC_PT_Discover($hash);
$pt_discover->{ExecuteTime} = gettimeofday()+10; $pt_discover->{ExecuteTime} = gettimeofday()+10;
eval { eval {
OWX_ASYNC_ScheduleMaster($hash,$pt_discover); OWX_ASYNC_Schedule($hash,$pt_discover);
}; };
return GP_Catch($@) if $@; return GP_Catch($@) if $@;
@ -797,7 +792,7 @@ sub OWX_ASYNC_Kick($) {
unless ($hash->{".kickrunning"}) { unless ($hash->{".kickrunning"}) {
$hash->{".kickrunning"} = 1; $hash->{".kickrunning"} = 1;
eval { eval {
OWX_ASYNC_ScheduleMaster( $hash, PT_THREAD(sub { OWX_ASYNC_Schedule( $hash, PT_THREAD(sub {
my ($thread) = @_; my ($thread) = @_;
PT_BEGIN($thread); PT_BEGIN($thread);
#-- Only if we have the dokick attribute set to 1 #-- Only if we have the dokick attribute set to 1
@ -818,7 +813,7 @@ sub OWX_ASYNC_Kick($) {
my ($client) = @_; my ($client) = @_;
if ($client->{TYPE} eq "OWTHERM" and AttrVal($client->{NAME},"tempConv","") eq "onkick" ) { 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}"; 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); },undef);
} }
@ -995,12 +990,11 @@ sub OWX_ASYNC_PT_Execute($$$$$) {
} }
} }
sub OWX_ASYNC_Schedule($$@) { sub OWX_ASYNC_Schedule($$) {
my ( $hash, $task, @args ) = @_; my ( $hash, $task ) = @_;
my $master = $hash->{IODev}; my $master = $hash->{TYPE} eq "OWX_ASYNC" ? $hash : $hash->{IODev};
die "OWX_ASYNC_Schedule: Master not Active" unless $master->{STATE} eq "Active"; die "OWX_ASYNC_Schedule: Master not Active" unless $master->{STATE} eq "Active";
my $name = $hash->{NAME}; my $name = $hash->{NAME};
$task->{ExecuteArgs} = \@args;
$task->{ExecuteTime} = gettimeofday() unless (defined $task->{ExecuteTime}); $task->{ExecuteTime} = gettimeofday() unless (defined $task->{ExecuteTime});
if (defined $master->{tasks}->{$name}) { if (defined $master->{tasks}->{$name}) {
push @{$master->{tasks}->{$name}}, $task; push @{$master->{tasks}->{$name}}, $task;
@ -1013,32 +1007,22 @@ sub OWX_ASYNC_Schedule($$@) {
InternalTimer($task->{ExecuteTime}, "OWX_ASYNC_RunTasks", $master,0); 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($$) { sub OWX_ASYNC_RunToCompletion($$) {
my ($master,$task) = @_; my ($hash,$task) = @_;
my $task_state; my $task_state;
do { eval {
OWX_ASYNC_Poll($master); OWX_ASYNC_Schedule($hash,$task);
OWX_ASYNC_RunTasks($master); my $master = $hash->{TYPE} eq "OWX_ASYNC" ? $hash : $hash->{IODev};
$task_state = $task->PT_STATE(); do {
} while ($task_state == PT_INITIAL or $task_state == PT_WAITING or $task_state == PT_YIELDED); OWX_ASYNC_Poll($master);
return $task_state; 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($) { 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)) { 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 $task = $current->{queue}->[0];
my $timeout = $task->{TimeoutTime}; my $timeout = $task->{TimeoutTime};
if ($task->PT_SCHEDULE(@{$task->{ExecuteArgs}})) { if ($task->PT_SCHEDULE()) {
my $state = $task->PT_STATE(); my $state = $task->PT_STATE();
# waiting for ExecuteResponse: # waiting for ExecuteResponse:
if ($state == PT_WAITING) { if ($state == PT_WAITING) {
die "$current->{device} unexpected thread state PT_WAITING without TimeoutTime" unless (defined $task->{TimeoutTime}); if (defined $task->{TimeoutTime}) {
#task timed out: #task timed out:
if ($now >= $task->{TimeoutTime}) { if ($now >= $task->{TimeoutTime}) {
Log3 ($master->{NAME},4,"OWX_ASYNC_RunTasks: $current->{device} task timed out"); 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); Log3 ($master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: TimeoutTime: %.6f, now: %.6f",$task->{TimeoutTime},$now)) if ($owx_async_debug>1);
$task->PT_CANCEL("Timeout"); $task->PT_CANCEL("Timeout");
shift @{$current->{queue}}; shift @{$current->{queue}};
$main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}};
next; next;
} else { } else {
Log3 $master->{NAME},5,"OWX_ASYNC_RunTasks: $current->{device} waiting for data or timeout" if ($owx_async_debug>2); 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: #new timeout or timeout did change:
if (!defined $timeout or $timeout != $task->{TimeoutTime}) { if (!defined $timeout or $timeout != $task->{TimeoutTime}) {
Log3 $master->{NAME},5,sprintf("OWX_ASYNC_RunTasks: $current->{device} schedule for timeout at %.6f",$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); 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: # sleeping:
} elsif ($state == PT_YIELDED) { } elsif ($state == PT_YIELDED) {
next; next;
} else { } else {
die "$current->{device} unexpected thread state while running: $state"; Log3 ($master->{NAME},4,"$current->{device} unexpected thread state while running: $state");
} }
} else { } else {
my $state = $task->PT_STATE(); my $state = $task->PT_STATE();
if ($state == PT_ENDED) { 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) { } 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) { } 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; $main::defs{$current->{device}}->{PRESENT} = 0;
} else { } 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}}; shift @{$current->{queue}};
$main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}}; $main::defs{$current->{device}}->{NUMTASKS} = @{$current->{queue}};

View File

@ -90,7 +90,7 @@ use ProtoThreads;
no warnings 'deprecated'; no warnings 'deprecated';
sub Log($$); sub Log($$);
my $owx_version="5.16"; my $owx_version="5.17";
#-- fixed raw channel name, flexible channel name #-- fixed raw channel name, flexible channel name
my @owg_fixed = ("A","B","C","D"); my @owg_fixed = ("A","B","C","D");
my @owg_channel = ("A","B","C","D"); my @owg_channel = ("A","B","C","D");
@ -589,12 +589,9 @@ sub OWAD_Get($@) {
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state); my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -621,13 +618,10 @@ sub OWAD_Get($@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXAD_GetPage($hash,"reading",1); $ret = OWXAD_GetPage($hash,"reading",1);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXAD_PT_GetPage($hash,"reading",1); $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"reading",1));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSAD_GetPage($hash,"reading",1); $ret = OWFSAD_GetPage($hash,"reading",1);
@ -653,13 +647,10 @@ sub OWAD_Get($@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXAD_GetPage($hash,"alarm",1); $ret = OWXAD_GetPage($hash,"alarm",1);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXAD_PT_GetPage($hash,"alarm",1); $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"alarm",1));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSAD_GetPage($hash,"alarm",1); $ret = OWFSAD_GetPage($hash,"alarm",1);
@ -693,13 +684,10 @@ sub OWAD_Get($@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXAD_GetPage($hash,"status",1); $ret = OWXAD_GetPage($hash,"status",1);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXAD_PT_GetPage($hash,"status",1); $ret = OWX_ASYNC_RunToCompletion($hash,OWXAD_PT_GetPage($hash,"status",1));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSAD_GetPage($hash,"status",1); $ret = OWFSAD_GetPage($hash,"status",1);

View File

@ -99,7 +99,7 @@ no warnings 'deprecated';
sub Log3($$$); sub Log3($$$);
my $owx_version="5.23"; my $owx_version="5.24";
#-- fixed raw channel name, flexible channel name #-- fixed raw channel name, flexible channel name
my @owg_fixed = ("A","B"); my @owg_fixed = ("A","B");
my @owg_channel = ("A","B"); my @owg_channel = ("A","B");
@ -651,14 +651,10 @@ sub OWCOUNT_Get($@) {
my $master = $hash->{IODev}; my $master = $hash->{IODev};
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -848,20 +844,14 @@ sub OWCOUNT_GetPage ($$$@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXCOUNT_GetPage($hash,$page,$final); $ret = OWXCOUNT_GetPage($hash,$page,$final);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
if ($sync) { eval {
my ($task,$task_state); if ($sync) {
eval { $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_GetPage($hash,$page,$final));
$task = OWXCOUNT_PT_GetPage($hash,$page,$final); } else {
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 {
OWX_ASYNC_Schedule( $hash, OWXCOUNT_PT_GetPage($hash,$page,$final) ); OWX_ASYNC_Schedule( $hash, OWXCOUNT_PT_GetPage($hash,$page,$final) );
}; }
$ret = GP_Catch($@) if $@; };
} $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSCOUNT_GetPage($hash,$page,$final); $ret = OWFSCOUNT_GetPage($hash,$page,$final);
@ -1159,13 +1149,10 @@ sub OWCOUNT_InitializeDevice($) {
$ret = OWXCOUNT_GetPage($hash,14,0); $ret = OWXCOUNT_GetPage($hash,14,0);
$ret = OWXCOUNT_SetPage($hash,14,$olddata); $ret = OWXCOUNT_SetPage($hash,14,$olddata);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXCOUNT_PT_InitializeDevicePage($hash,14,$newdata); $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_InitializeDevicePage($hash,14,$newdata));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSCOUNT_GetPage($hash,14,0); $ret = OWFSCOUNT_GetPage($hash,14,0);
@ -1187,13 +1174,10 @@ sub OWCOUNT_InitializeDevice($) {
$ret = OWXCOUNT_GetPage($hash,0,0); $ret = OWXCOUNT_GetPage($hash,0,0);
$ret = OWXCOUNT_SetPage($hash,0,$olddata); $ret = OWXCOUNT_SetPage($hash,0,$olddata);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXCOUNT_PT_InitializeDevicePage($hash,0,$newdata); $ret = OWX_ASYNC_RunToCompletion($hash,OWXCOUNT_PT_InitializeDevicePage($hash,0,$newdata));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSCOUNT_GetPage($hash,0,0); $ret = OWFSCOUNT_GetPage($hash,0,0);

View File

@ -68,7 +68,7 @@ use ProtoThreads;
no warnings 'deprecated'; no warnings 'deprecated';
sub Log($$); sub Log($$);
my $owx_version="5.13"; my $owx_version="5.14";
#-- declare variables #-- declare variables
my %gets = ( my %gets = (
"present" => "", "present" => "",
@ -334,14 +334,10 @@ sub OWID_Get($@) {
my $master = $hash->{IODev}; my $master = $hash->{IODev};
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -386,10 +382,8 @@ sub OWID_GetValues($) {
my $master = $hash->{IODev}; my $master = $hash->{IODev};
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
#TODO use OWX_ASYNC_Schedule instead
my $task = OWX_ASYNC_PT_Verify($hash);
eval { eval {
OWX_ASYNC_Schedule($hash,$task); OWX_ASYNC_Schedule($hash,OWX_ASYNC_PT_Verify($hash));
}; };
return GP_Catch($@) if $@; return GP_Catch($@) if $@;
return undef; return undef;

View File

@ -77,7 +77,7 @@ no warnings 'deprecated';
sub Log3($$$); sub Log3($$$);
my $owx_version="3.38"; my $owx_version="5.1";
#-- controller may be HD44780 or KS0073 #-- controller may be HD44780 or KS0073
# these values have to be changed for different display # these values have to be changed for different display
# geometries or memory maps # geometries or memory maps
@ -324,14 +324,10 @@ sub OWLCD_Get($@) {
if($a[1] eq "present") { if($a[1] eq "present") {
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -343,13 +339,10 @@ sub OWLCD_Get($@) {
#-- get gpio states #-- get gpio states
if($a[1] eq "gpio") { if($a[1] eq "gpio") {
if ($hash->{ASYNC}) { if ($hash->{ASYNC}) {
my ($task,$task_state);
eval { eval {
$task = OWXLCD_PT_Get($hash,"gpio"); $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"gpio"));
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(); $ret = GP_Catch($@) if $@;
return $ret if $ret; return $ret if $ret;
return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"gpio",""); return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"gpio","");
} else { } else {
@ -361,13 +354,10 @@ sub OWLCD_Get($@) {
#-- get gpio counters #-- get gpio counters
if($a[1] eq "counter") { if($a[1] eq "counter") {
if ($hash->{ASYNC}) { if ($hash->{ASYNC}) {
my ($task,$task_state);
eval { eval {
$task = OWXLCD_PT_Get($hash,"counter"); $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"counter"));
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(); $ret = GP_Catch($@) if $@;
return $ret if $ret; return $ret if $ret;
return "$name.counter => ".main::ReadingsVal($hash->{NAME},"counter",""); return "$name.counter => ".main::ReadingsVal($hash->{NAME},"counter","");
} else { } else {
@ -379,13 +369,10 @@ sub OWLCD_Get($@) {
#-- get version #-- get version
if($a[1] eq "version") { if($a[1] eq "version") {
if ($hash->{ASYNC}) { if ($hash->{ASYNC}) {
my ($task,$task_state);
eval { eval {
$task = OWXLCD_PT_Get($hash,"version"); $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_Get($hash,"version"));
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(); $ret = GP_Catch($@) if $@;
return $ret if $ret; return $ret if $ret;
return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"version",""); return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"version","");
} else { } else {
@ -399,13 +386,10 @@ sub OWLCD_Get($@) {
my $page = (defined $a[2] and $a[2] =~ m/\d/) ? int($a[2]) : 0; my $page = (defined $a[2] and $a[2] =~ m/\d/) ? int($a[2]) : 0;
Log3 $name,1,"Calling GetMemory with page $page"; Log3 $name,1,"Calling GetMemory with page $page";
if ($hash->{ASYNC}) { if ($hash->{ASYNC}) {
my ($task,$task_state);
eval { eval {
$task = OWXLCD_PT_GetMemory($hash,$page); $ret = OWX_ASYNC_RunToCompletion($hash,OWXLCD_PT_GetMemory($hash,$page));
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(); $ret = GP_Catch($@) if $@;
return $ret if $ret; return $ret if $ret;
return "$name $reading $page => ".main::ReadingsVal($hash->{NAME},"memory$page",""); return "$name $reading $page => ".main::ReadingsVal($hash->{NAME},"memory$page","");
} else { } else {

View File

@ -82,7 +82,7 @@ no warnings 'deprecated';
sub Log($$); sub Log($$);
my $owx_version="5.16"; my $owx_version="5.17";
#-- flexible channel name #-- flexible channel name
my $owg_channel; my $owg_channel;
@ -481,14 +481,10 @@ sub OWMULTI_Get($@) {
if( $interface =~ /^OWX/ ){ if( $interface =~ /^OWX/ ){
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -517,13 +513,10 @@ sub OWMULTI_Get($@) {
#-- not different from getting all values .. #-- not different from getting all values ..
$ret = OWXMULTI_GetValues($hash); $ret = OWXMULTI_GetValues($hash);
}elsif( $interface eq "OWX_ASYNC"){ }elsif( $interface eq "OWX_ASYNC"){
my ($task,$task_state);
eval { eval {
$task = OWXMULTI_PT_GetValues($hash); $ret = OWX_ASYNC_RunToCompletion($hash,OWXMULTI_PT_GetValues($hash));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface not yet implemented #-- OWFS interface not yet implemented
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSMULTI_GetValues($hash); $ret = OWFSMULTI_GetValues($hash);

View File

@ -89,7 +89,7 @@ no warnings 'deprecated';
sub Log($$); sub Log($$);
my $owx_version="5.17"; my $owx_version="5.18";
#-- fixed raw channel name, flexible channel name #-- fixed raw channel name, flexible channel name
my @owg_fixed = ("A","B","C","D","E","F","G","H"); my @owg_fixed = ("A","B","C","D","E","F","G","H");
my @owg_channel = ("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") { if($a[1] eq "present") {
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -540,13 +536,10 @@ sub OWSWITCH_Get($@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXSWITCH_GetState($hash); $ret = OWXSWITCH_GetState($hash);
}elsif( $interface eq "OWX_ASYNC") { }elsif( $interface eq "OWX_ASYNC") {
my ($task,$task_state);
eval { eval {
$task = OWXSWITCH_PT_GetState($hash); $ret = OWX_ASYNC_RunToCompletion($hash,OWXSWITCH_PT_GetState($hash));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWFS" ){ }elsif( $interface eq "OWFS" ){
$ret = OWFSSWITCH_GetState($hash); $ret = OWFSSWITCH_GetState($hash);
@ -565,13 +558,10 @@ sub OWSWITCH_Get($@) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXSWITCH_GetState($hash); $ret = OWXSWITCH_GetState($hash);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXSWITCH_PT_GetState($hash); $ret = OWX_ASYNC_RunToCompletion($hash,OWXSWITCH_PT_GetState($hash));
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(); $ret = GP_Catch($@) if $@;
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSSWITCH_GetState($hash); $ret = OWFSSWITCH_GetState($hash);
}else{ }else{
@ -836,7 +826,7 @@ sub OWSWITCH_Set($@) {
return "OWSWITCH: GetValues with wrong IODev type $interface"; return "OWSWITCH: GetValues with wrong IODev type $interface";
} }
#-- process results #-- process results
if( defined($ret) ){ if($ret){
return "OWSWITCH: Could not set device $name, reason: ".$ret; return "OWSWITCH: Could not set device $name, reason: ".$ret;
} }
} }
@ -1502,11 +1492,12 @@ sub OWXSWITCH_PT_SetOutput($$$) {
PT_BEGIN($thread); PT_BEGIN($thread);
$thread->{task} = OWXSWITCH_PT_GetState($hash); $thread->{task} = OWXSWITCH_PT_GetState($hash);
$thread->{TimeoutTime} = gettimeofday()+2; #TODO: implement attribute-based timeout
PT_WAIT_THREAD($thread->{task}); 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(); $ret = $thread->{task}->PT_RETVAL();
if ($ret) { die $ret if $ret;
PT_EXIT($ret);
}
$value = 0; $value = 0;
#-- vax or val ? #-- vax or val ?
for (my $i=0;$i<$cnumber{$attr{$hash->{NAME}}{"model"}};$i++){ for (my $i=0;$i<$cnumber{$attr{$hash->{NAME}}{"model"}};$i++){
@ -1517,11 +1508,12 @@ sub OWXSWITCH_PT_SetOutput($$$) {
} }
$thread->{value} = $value; $thread->{value} = $value;
$thread->{task} = OWXSWITCH_PT_SetState($hash,$thread->{value}); $thread->{task} = OWXSWITCH_PT_SetState($hash,$thread->{value});
$thread->{TimeoutTime} = gettimeofday()+2; #TODO: implement attribute-based timeout
PT_WAIT_THREAD($thread->{task}); 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(); $ret = $thread->{task}->PT_RETVAL();
if ($ret) { die $ret if $ret;
PT_EXIT($ret);
}
PT_END; PT_END;
}); });
} }

View File

@ -86,7 +86,7 @@ no warnings 'deprecated';
sub Log3($$$); sub Log3($$$);
sub AttrVal($$$); sub AttrVal($$$);
my $owx_version="5.21"; my $owx_version="5.22";
my %gets = ( my %gets = (
"id" => "", "id" => "",
@ -461,14 +461,10 @@ sub OWTHERM_Get($@) {
if( $interface =~ /^OWX/ ){ if( $interface =~ /^OWX/ ){
#-- asynchronous mode #-- asynchronous mode
if( $hash->{ASYNC} ){ if( $hash->{ASYNC} ){
my ($task,$task_state);
eval { eval {
$task = OWX_ASYNC_PT_Verify($hash); OWX_ASYNC_RunToCompletion($hash,OWX_ASYNC_PT_Verify($hash));
OWX_ASYNC_Schedule($hash,$task);
$task_state = OWX_ASYNC_RunToCompletion($master,$task);
}; };
return GP_Catch($@) if $@; 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"); return "$name.present => ".ReadingsVal($name,"present","unknown");
} else { } else {
$value = OWX_Verify($master,$hash->{ROM_ID}); $value = OWX_Verify($master,$hash->{ROM_ID});
@ -496,13 +492,10 @@ sub OWTHERM_Get($@) {
#-- not different from getting all values .. #-- not different from getting all values ..
$ret = OWXTHERM_GetValues($hash); $ret = OWXTHERM_GetValues($hash);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXTHERM_PT_GetValues($hash); $ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_GetValues($hash));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSTHERM_GetValues($hash); $ret = OWFSTHERM_GetValues($hash);
@ -668,13 +661,10 @@ sub OWTHERM_InitializeDevice($) {
if( $interface eq "OWX" ){ if( $interface eq "OWX" ){
$ret = OWXTHERM_SetValues($hash,$args); $ret = OWXTHERM_SetValues($hash,$args);
}elsif( $interface eq "OWX_ASYNC" ){ }elsif( $interface eq "OWX_ASYNC" ){
my ($task,$task_state);
eval { eval {
$task = OWXTHERM_PT_SetValues($hash,$args); $ret = OWX_ASYNC_RunToCompletion($hash,OWXTHERM_PT_SetValues($hash,$args));
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(); $ret = GP_Catch($@) if $@;
#-- OWFS interface #-- OWFS interface
}elsif( $interface eq "OWServer" ){ }elsif( $interface eq "OWServer" ){
$ret = OWFSTHERM_SetValues($hash,$args); $ret = OWFSTHERM_SetValues($hash,$args);
@ -1108,7 +1098,7 @@ sub OWXTHERM_SetValues($$) {
# #
######################################################################################## ########################################################################################
sub OWXTHERM_PT_GetValues($@) { sub OWXTHERM_PT_GetValues($) {
my ($hash) = @_; my ($hash) = @_;