OWX_ASYNC: handle Exceptions in ProtoThreads, lower loglevel of Alarms-logging

git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@5902 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ntruchsess
2014-05-19 15:11:06 +00:00
parent 202fb38be2
commit 9306dd5ddc
9 changed files with 84 additions and 49 deletions

View File

@@ -128,7 +128,7 @@ my %attrs = (
);
#-- some globals needed for the 1-Wire module
$owx_async_version=5.2;
$owx_async_version=5.3;
#-- Debugging 0,1,2,3
$owx_async_debug=0;
@@ -1133,11 +1133,16 @@ sub OWX_ASYNC_RunTasks($) {
while ( ( $owx_dev, $queue ) = each %{$master->{tasks}} ) {
if (@$queue) {
my $task = $queue->[0];
unless ($task->PT_SCHEDULE(@{$task->{ExecuteArgs}})) {
my $ret;
eval {
$ret = $task->PT_SCHEDULE(@{$task->{ExecuteArgs}});
};
if (!$ret or $@) {
shift @$queue;
delete $master->{tasks}->{$owx_dev} unless @$queue;
if ($task->PT_RETVAL()) {
Log3 ($master->{NAME},2,"OWX_ASYNC: Error running task for $owx_dev: ".$task->PT_RETVAL());
my $msg = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
if (defined $msg) {
Log3 ($master->{NAME},2,"OWX_ASYNC: Error running task for $owx_dev: $msg");
}
}
OWX_ASYNC_Poll( $master );

View File

@@ -90,7 +90,7 @@ use ProtoThreads;
no warnings 'deprecated';
sub Log($$);
my $owx_version="5.14";
my $owx_version="5.15";
#-- fixed raw channel name, flexible channel name
my @owg_fixed = ("A","B","C","D");
my @owg_channel = ("A","B","C","D");
@@ -597,8 +597,10 @@ sub OWAD_Get($@) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXAD_PT_GetPage);
while ($task->PT_SCHEDULE($hash,"reading",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"reading",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSAD_GetPage($hash,"reading",1);
@@ -626,8 +628,10 @@ sub OWAD_Get($@) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXAD_PT_GetPage);
while ($task->PT_SCHEDULE($hash,"alarm",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"alarm",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSAD_GetPage($hash,"alarm",1);
@@ -663,8 +667,10 @@ sub OWAD_Get($@) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXAD_PT_GetPage);
while ($task->PT_SCHEDULE($hash,"status",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"status",1)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- 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.21";
my $owx_version="5.22";
#-- fixed raw channel name, flexible channel name
my @owg_fixed = ("A","B");
my @owg_channel = ("A","B");
@@ -817,8 +817,10 @@ sub OWCOUNT_GetPage ($$$@) {
if ($sync) {
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXCOUNT_PT_GetPage);
while ($task->PT_SCHEDULE($hash,$page,$final)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,$page,$final)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
} else {
eval {
OWX_ASYNC_Schedule( $hash, PT_THREAD(\&OWXCOUNT_PT_GetPage),$hash,$page,$final );
@@ -1123,8 +1125,10 @@ sub OWCOUNT_InitializeDevice($) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXCOUNT_PT_InitializeDevicePage);
while ($task->PT_SCHEDULE($hash,14,$newdata)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,14,$newdata)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSCOUNT_GetPage($hash,14,0);
@@ -1148,8 +1152,10 @@ sub OWCOUNT_InitializeDevice($) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXCOUNT_PT_InitializeDevicePage);
while ($task->PT_SCHEDULE($hash,0,$newdata)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,0,$newdata)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSCOUNT_GetPage($hash,0,0);

View File

@@ -76,7 +76,7 @@ no warnings 'deprecated';
sub Log3($$$);
my $owx_version="3.36";
my $owx_version="3.37";
#-- controller may be HD44780 or KS0073
# these values have to be changed for different display
# geometries or memory maps
@@ -320,8 +320,10 @@ sub OWLCD_Get($@) {
if($a[1] eq "gpio") {
if ($hash->{ASYNC}) {
my $task = PT_THREAD(\&OWXLCD_PT_Get);
while ($task->PT_SCHEDULE($hash,"gpio")) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"gpio")) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
return $ret if $ret;
return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"gpio","");
} else {
@@ -334,8 +336,10 @@ sub OWLCD_Get($@) {
if($a[1] eq "counter") {
if ($hash->{ASYNC}) {
my $task = PT_THREAD(\&OWXLCD_PT_Get);
while ($task->PT_SCHEDULE($hash,"counter")) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"counter")) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
return $ret if $ret;
return "$name.counter => ".main::ReadingsVal($hash->{NAME},"counter","");
} else {
@@ -348,8 +352,10 @@ sub OWLCD_Get($@) {
if($a[1] eq "version") {
if ($hash->{ASYNC}) {
my $task = PT_THREAD(\&OWXLCD_PT_Get);
while ($task->PT_SCHEDULE($hash,"version")) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,"version")) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
return $ret if $ret;
return "$name.gpio => ".main::ReadingsVal($hash->{NAME},"version","");
} else {
@@ -364,8 +370,10 @@ sub OWLCD_Get($@) {
Log3 $name,1,"Calling GetMemory with page $page";
if ($hash->{ASYNC}) {
my $task = PT_THREAD(\&OWXLCD_PT_GetMemory);
while ($task->PT_SCHEDULE($hash,$page)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,$page)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
return $ret if $ret;
return "$name $reading $page => ".main::ReadingsVal($hash->{NAME},"memory$page","");
} else {

View File

@@ -486,8 +486,10 @@ sub OWMULTI_Get($@) {
}elsif( $interface eq "OWX_ASYNC"){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXMULTI_PT_GetValues);
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- 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.15";
my $owx_version="5.16";
#-- 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");
@@ -508,8 +508,10 @@ sub OWSWITCH_Get($@) {
}elsif( $interface eq "OWX_ASYNC") {
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXSWITCH_PT_GetState);
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWFS" ){
$ret = OWFSSWITCH_GetState($hash);
@@ -530,8 +532,10 @@ sub OWSWITCH_Get($@) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXSWITCH_PT_GetState);
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
}elsif( $interface eq "OWServer" ){
$ret = OWFSSWITCH_GetState($hash);
}else{

View File

@@ -86,7 +86,7 @@ no warnings 'deprecated';
sub Log3($$$);
sub AttrVal($$$);
my $owx_version="5.18";
my $owx_version="5.19";
my %gets = (
"id" => "",
@@ -465,8 +465,10 @@ sub OWTHERM_Get($@) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXTHERM_PT_GetValues);
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSTHERM_GetValues($hash);
@@ -633,8 +635,10 @@ sub OWTHERM_InitializeDevice($) {
}elsif( $interface eq "OWX_ASYNC" ){
#TODO use OWX_ASYNC_Schedule instead
my $task = PT_THREAD(\&OWXTHERM_PT_SetValues);
while ($task->PT_SCHEDULE($hash,$args)) { OWX_ASYNC_Poll($hash->{IODev}); };
$ret = $task->PT_RETVAL();
eval {
while ($task->PT_SCHEDULE($hash,$args)) { OWX_ASYNC_Poll($hash->{IODev}); };
};
$ret = ($@) ? GP_Catch($@) : $task->PT_RETVAL();
#-- OWFS interface
}elsif( $interface eq "OWServer" ){
$ret = OWFSTHERM_SetValues($hash,$args);

View File

@@ -58,7 +58,7 @@ sub new() {
$self->{LastFamilyDiscrepancy} = 0;
$self->{LastDeviceFlag} = 0;
#-- module version
$self->{version} = 4.0;
$self->{version} = 4.1;
$self->{alarmdevs} = [];
$self->{devs} = [];
$self->{pt_alarms} = PT_THREAD(\&pt_alarms);
@@ -128,7 +128,7 @@ sub pt_alarms () {
PT_WAIT_UNTIL($self->response_ready());
PT_EXIT unless $self->next_response("alarm");
} while( $self->{LastDeviceFlag}==0 );
main::Log3($self->{name},1, " Alarms = ".join(' ',@{$self->{alarmdevs}}));
main::Log3($self->{name},5, " Alarms = ".join(' ',@{$self->{alarmdevs}}));
PT_EXIT($self->{alarmdevs});
PT_END;
}
@@ -196,7 +196,7 @@ sub pt_execute($$$$$$$) {
#-- for debugging
if( $main::owx_async_debug > 1){
main::Log3($self->{name},3,"OWX_SER::Execute: Sending out ".unpack ("H*",$select));
main::Log3($self->{name},5,"OWX_SER::Execute: Sending out ".unpack ("H*",$select));
}
$self->block($select);
}
@@ -208,7 +208,7 @@ sub pt_execute($$$$$$$) {
my $res = $self->{string_in};
#-- for debugging
if( $main::owx_async_debug > 1){
main::Log3($self->{name},3,"OWX_SER::Execute: Receiving ".unpack ("H*",$res));
main::Log3($self->{name},5,"OWX_SER::Execute: Receiving ".unpack ("H*",$res));
}
PT_EXIT($res);
@@ -260,7 +260,7 @@ sub initialize($) {
if(!defined($hwdevice)){
die $msg." not defined: $!";
} else {
main::Log3($hash->{NAME},1,$msg." defined");
main::Log3($hash->{NAME},2,$msg." defined");
}
$hwdevice->reset_error();
@@ -338,7 +338,7 @@ sub initialize($) {
$k=ord(substr($res,$i,1))%16;
$ress.=sprintf "0x%1x%1x ",$j,$k;
}
main::Log3($hash->{NAME},1, $ress);
main::Log3($hash->{NAME},4, $ress);
$ress = $ress0;
#-- sleeping for some time
select(undef,undef,undef,0.5);
@@ -353,7 +353,7 @@ sub initialize($) {
}
}
$self->{interface} = $interface;
main::Log3($hash->{NAME},1, $ress);
main::Log3($hash->{NAME},3, $ress);
if ($interface eq "DS2480") {
return $ds2480;
} elsif ($interface eq "DS9097") {

View File

@@ -1,4 +1,4 @@
# Perl Protothreads
# Perl Protothreads Version 1.01
#
# a lightwight pseudo-threading framework for perl that is
# heavily inspired by Adam Dunkels protothreads for the c-language
@@ -128,7 +128,7 @@ FILTER_ONLY
($success,$before,$arg,$after) = PT_NEXTCOMMAND($code,"PT_BEGIN");
if ($success) {
$thread = $arg;
$code=$before."{ my \$PT_YIELD_FLAG = 1; goto ".$thread."->{PT_THREAD_STATE} if ".$thread."->{PT_THREAD_STATE};".$after;
$code=$before."my \$PT_THREAD_STATE = eval { my \$PT_YIELD_FLAG = 1; goto ".$thread."->{PT_THREAD_STATE} if ".$thread."->{PT_THREAD_STATE};".$after;
while (1) {
($success,$before,$arg,$after) = PT_NEXTCOMMAND($code,"PT_YIELD_UNTIL");
if ($success) {
@@ -177,7 +177,7 @@ FILTER_ONLY
next;
}
if ($code =~ /PT_END\s*;/s) {
$code = $`."} ".$thread."->{PT_THREAD_STATE} = 0; delete ".$thread."->{PT_THREAD_RETURN}; return PT_ENDED;".$';
$code = $`.$thread."->{PT_THREAD_STATE} = 0; delete ".$thread."->{PT_THREAD_RETURN}; return PT_ENDED; }; die \$\@ if \$\@; return \$PT_THREAD_STATE;".$';
}
last;
}