2
0
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:
sidey79 2020-06-28 20:31:30 +00:00
parent 5d282020dd
commit 0e24dc21f0
4 changed files with 146 additions and 0 deletions

View File

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

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

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

View File