mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-02-07 16:59:18 +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:
parent
b1ef3eb088
commit
661774db6a
@ -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}};
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
@ -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) = @_;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user