From 0e24dc21f0a95ea3b368528fcdfcf134ea15577e Mon Sep 17 00:00:00 2001 From: sidey79 Date: Sun, 28 Jun 2020 20:31:30 +0000 Subject: [PATCH] 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 --- fhem/MAINTAINER.txt | 2 + fhem/lib/FHEM/Core/Timer/Helper.pm | 70 ++++++++++++++++++++++++++++ fhem/t/FHEM/Core/Timer/00_func.t | 74 ++++++++++++++++++++++++++++++ fhem/t/FHEM/Core/Timer/fhem.cfg | 0 4 files changed, 146 insertions(+) create mode 100644 fhem/lib/FHEM/Core/Timer/Helper.pm create mode 100644 fhem/t/FHEM/Core/Timer/00_func.t create mode 100644 fhem/t/FHEM/Core/Timer/fhem.cfg diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index 28d1c2ebd..22f053964 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -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 diff --git a/fhem/lib/FHEM/Core/Timer/Helper.pm b/fhem/lib/FHEM/Core/Timer/Helper.pm new file mode 100644 index 000000000..19d6fdcbf --- /dev/null +++ b/fhem/lib/FHEM/Core/Timer/Helper.pm @@ -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; \ No newline at end of file diff --git a/fhem/t/FHEM/Core/Timer/00_func.t b/fhem/t/FHEM/Core/Timer/00_func.t new file mode 100644 index 000000000..8fb07b0b2 --- /dev/null +++ b/fhem/t/FHEM/Core/Timer/00_func.t @@ -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; \ No newline at end of file diff --git a/fhem/t/FHEM/Core/Timer/fhem.cfg b/fhem/t/FHEM/Core/Timer/fhem.cfg new file mode 100644 index 000000000..e69de29bb