###############################################################
######################################################################
# (c) Michael Schilli 1999
######################################################################
# Stopwatch
###############################################################

package Stopwatch;

use Tk;                        # 'after()' - in Tk.pm definiert
###############################################################
# $sw=Stopwatch->new(\&update_func, $update_time);  Konstruktor
###############################################################
sub new {
    my $self = bless({}, shift);     

    $self->{'usrproc'}     = shift;  # User-definierter Callback
    $self->{'interval'}    = shift;  # Update-Intervall in 
                                     # Sekunden

    $self->{'running'}     = 0;

    $self->{'starttime'}   = 
    $self->{'stoptime'}    = time;

    # Update-Intervall von 1 Sekunde nicht unterschreiten
    if($self->{'interval'} < 1000) {  
        print "Stopwatch: No update intervals < 1000" .
              " accepted. Not started.\n";
        return undef;
    }

    $self->looper();                 # Loop-Prozess starten

    $self;                           # Objekt-Referenz
}

###############################################################
# $sw->looper(); - Interne(!) Schleifenfunktion
###############################################################
sub looper {
    my $self = shift;
                                   # User-Funktion aufrufen
    &{$self->{'usrproc'}}($self) if $self->{'running'};

                                   # Schleife (Keine Rekursion)
    after($self->{'interval'}, sub { $self->looper() });      
}

###############################################################
# $sw->start(); - Stoppuhr starten
###############################################################
sub start {
    my $self = shift;

    # Startzeit setzen: Zeit zwischen letztem Stopp und 
    # jetzt eliminieren
    unless($self->{'running'}) { 
        $self->{'starttime'} += time - $self->{'stoptime'};
    }

    $self->{'running'}   = 1;
}

###############################################################
# $sw->stop(); - Stoppuhr anhalten
###############################################################
sub stop {
    my $self = shift;

    $self->{'stoptime'} = time if $self->{'running'};

    $self->{'running'} = 0;
}

###############################################################
# $seccount=$sw->gettime(); - Zeit auf der Stoppuhr abfragen
###############################################################
sub gettime {
    my $self = shift;

    time - $self->{'starttime'};
}

###############################################################
# $sw->reset(); - Stoppuhr zurücksetzen
###############################################################
sub reset {
    my $self = shift;

    $self->{'starttime'} =
    $self->{'stoptime'}  = time;
}

1;
