2
0
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:
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
$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}};

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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 {

View File

@ -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);

View File

@ -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;
});
}

View File

@ -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) = @_;