mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-04-15 22:26:04 +00:00
Helper.pm: lib FHEM::Core::Timer::Helper.pm inital version
git-svn-id: https://svn.fhem.de/fhem/trunk@22299 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
5d282020dd
commit
0e24dc21f0
@ -597,6 +597,8 @@ FHEM/lib/SHC_packet_layout.xml rr2000 Sonstige Systeme
|
||||
FHEM/lib/SWAP/* justme1968 Sonstige Systeme
|
||||
FHEM/lib/UPnP/* Reinerlein Multimedia
|
||||
|
||||
lib/FHEM/Core/Timer/Helper.pm sidey79 FHEM Development
|
||||
|
||||
contrib/sacha_gloor/* jeschkec Sonstiges
|
||||
contrib/70_ONKYO_AVR_PULL.pm loredo (deprecated)
|
||||
contrib/DS_Starter/* DS_Starter Sonstiges
|
||||
|
70
fhem/lib/FHEM/Core/Timer/Helper.pm
Normal file
70
fhem/lib/FHEM/Core/Timer/Helper.pm
Normal file
@ -0,0 +1,70 @@
|
||||
# $Id$
|
||||
package FHEM::Core::Timer::Helper;
|
||||
use strict;
|
||||
use warnings;
|
||||
use utf8;
|
||||
use Carp qw(croak carp);
|
||||
use Time::HiRes;
|
||||
|
||||
use version; our $VERSION = qv('1.0.0');
|
||||
my %LOT; # Hash for ListOfTimers
|
||||
|
||||
use Exporter qw(import);
|
||||
|
||||
our @EXPORT_OK = qw(addTimer removeTimer optimizeLOT);
|
||||
|
||||
sub addTimer {
|
||||
my $defName = shift // carp 'No definition name' && return;
|
||||
my $time = shift // carp q[No time specified] && return;
|
||||
my $func = shift // carp q[No function specified] && return;
|
||||
my $arg = shift // q{};
|
||||
my $initFlag = shift // 0;
|
||||
|
||||
|
||||
my %h = (
|
||||
arg => $arg,
|
||||
func => $func,
|
||||
calltime => $time,
|
||||
);
|
||||
|
||||
|
||||
::InternalTimer($time, $func, $arg , $initFlag);
|
||||
|
||||
return push @{$LOT{$defName}} , \%h;
|
||||
}
|
||||
|
||||
|
||||
sub removeTimer {
|
||||
my $defName = shift // carp q[No definition name];
|
||||
my $func = shift // undef;
|
||||
my $arg = shift // q{};
|
||||
|
||||
return 0 if ( !exists $LOT{$defName} );
|
||||
|
||||
my $numRemoved = 0;
|
||||
for my $index (0 .. scalar @{$LOT{$defName}}-1 ) {
|
||||
if ( ref $LOT{$defName}[$index] eq 'HASH' && exists $LOT{$defName}[$index]->{func}
|
||||
&& (!defined $func || $LOT{$defName}[$index]->{func} == $func )
|
||||
&& ( $arg eq q{} || $LOT{$defName}[$index]->{arg} eq $arg)
|
||||
) {
|
||||
::RemoveInternalTimer($LOT{$defName}[$index]->{arg},$LOT{$defName}[$index]->{func});
|
||||
delete($LOT{$defName}[$index]);
|
||||
$numRemoved++;
|
||||
}
|
||||
}
|
||||
return $numRemoved;
|
||||
}
|
||||
|
||||
|
||||
sub optimizeLOT
|
||||
{
|
||||
my $defName = shift // carp q[No definition name];
|
||||
return 0 if ( !exists $LOT{$defName} );
|
||||
|
||||
my $now= ::gettimeofday();
|
||||
@{$LOT{$defName}} = grep { $_->{calltime} >= $now } @{$LOT{$defName}};
|
||||
|
||||
return scalar @{$LOT{$defName}};
|
||||
}
|
||||
|
||||
1;
|
74
fhem/t/FHEM/Core/Timer/00_func.t
Normal file
74
fhem/t/FHEM/Core/Timer/00_func.t
Normal file
@ -0,0 +1,74 @@
|
||||
#!/usr/bin/env perl
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Test2::V0;
|
||||
use Test2::Tools::Compare qw{is};
|
||||
|
||||
|
||||
use FHEM::Core::Timer::Helper qw(addTimer removeTimer);
|
||||
use Time::HiRes;
|
||||
|
||||
|
||||
sub timerCallback
|
||||
{
|
||||
my $arg = shift;
|
||||
|
||||
is ($arg,'timer called test',"Check argument");
|
||||
done_testing();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
sub timerCallback2
|
||||
{
|
||||
fail('this timerCallback2 should never be called');
|
||||
}
|
||||
my $count;
|
||||
|
||||
subtest 'Add two timers ' => sub {
|
||||
$count = addTimer('myName',gettimeofday+2,\&timerCallback,'addTimer test',0);
|
||||
is ($count,1,'addtimer returned one');
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback2,'remove timer test',0);
|
||||
is ($count,2,'addtimer returned two');
|
||||
};
|
||||
|
||||
|
||||
subtest 'Remove all timers for myName' => sub {
|
||||
is(removeTimer('myName'),2,'check number of removed timers');
|
||||
};
|
||||
|
||||
subtest 'add Timer for myName to end test in 2 secs' => sub {
|
||||
is(addTimer('myName',gettimeofday+2,\&timerCallback,'timer called test',0),1,'one timer in list');
|
||||
};
|
||||
|
||||
|
||||
subtest 'add and remove timer by callback func' => sub {
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback2,'addTimer test',0);
|
||||
is ($count,2,'addtimer returned two');
|
||||
is(removeTimer('myName',\&timerCallback2),1,'check number of removed timers');
|
||||
};
|
||||
|
||||
|
||||
subtest 'add and remove timer by arg' => sub {
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback2,'addTimer test',0);
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback,'addTimer test',0);
|
||||
is ($count,3,'addtimer returned three');
|
||||
is(removeTimer('myName',undef,'addTimer test'),2,'check both added timers with arg are removed');
|
||||
};
|
||||
|
||||
subtest 'add and remove timer by callback func and arg' => sub {
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback2,'addTimer test',0);
|
||||
$count = addTimer('myName',gettimeofday+1,\&timerCallback2,'other arg',0);
|
||||
is ($count,3,'addtimer returned three');
|
||||
is(removeTimer('myName',\&timerCallback2,'addTimer test'),1,'check only one timer removed');
|
||||
is(removeTimer('myName',\&timerCallback2,'other arg'),1,'check only one timer removed');
|
||||
};
|
||||
|
||||
|
||||
subtest 'optimize ListOFTimers' => sub {
|
||||
is(FHEM::Core::Timer::Helper::optimizeLOT(),0,'no elements if no name specified');
|
||||
is(FHEM::Core::Timer::Helper::optimizeLOT('myName'),1,'one element left after optimize');
|
||||
};
|
||||
|
||||
1;
|
0
fhem/t/FHEM/Core/Timer/fhem.cfg
Normal file
0
fhem/t/FHEM/Core/Timer/fhem.cfg
Normal file
Loading…
x
Reference in New Issue
Block a user