src/Timer.cc
author nireco
Sat, 31 Jan 2009 12:33:08 +0200
changeset 443 5d1119729f58
parent 423 947ab54de4b7
permissions -rw-r--r--
worm02 two pics to comment
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
     1
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
     2
#include "Timer.hh"
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
     3
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
     4
Timer::Timer (TimeMS interval) :
282
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 205
diff changeset
     5
    interval(interval), 
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 205
diff changeset
     6
    ticks(0), 
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 205
diff changeset
     7
    enabled(false),
e0e4dfc3e528 compiles cleanly with -Wall -Wextra -Wconversion, not tested, but that shouldn't break anything :)
terom
parents: 205
diff changeset
     8
    last_tick(0)
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
     9
{
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    10
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    11
}
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    12
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    13
TickCount Timer::get_ticks (void) {
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    14
    return ticks;
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    15
}
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    16
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    17
void Timer::start (void) {
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    18
    last_tick = CL_System::get_time();
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    19
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    20
    enabled = true;
300
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    21
    single_shot = false;
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    22
}
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    23
        
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    24
void Timer::fire_once (void) {
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    25
    last_tick = CL_System::get_time();
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    26
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    27
    enabled = true;
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    28
    single_shot = true;
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    29
}
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    30
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    31
void Timer::keep_alive (void) {
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    32
    // ignore if disabled
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    33
    if (!enabled)
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    34
        return;
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    35
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    36
    // get current time
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    37
    TimeMS now = CL_System::get_time();
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    38
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    39
    // handle overflows
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    40
    if (last_tick > now)
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    41
        last_tick = now;
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    42
    
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    43
    // is the tick over?
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    44
    if (last_tick + interval < now) {
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    45
        // the length of this tick
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    46
        TimeMS tick_length = now - last_tick;
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    47
        
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    48
        // trigger our signal
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    49
        _sig_tick(tick_length);
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    50
        
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    51
        // update state
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    52
        last_tick = now;
423
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 300
diff changeset
    53
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 300
diff changeset
    54
        // XXX: handle overflow
947ab54de4b7 fix worst compilation errors when using the debian lenny gcc/libc...
Tero Marttila <terom@fixme.fi>
parents: 300
diff changeset
    55
        ticks += (TickCount) tick_length / interval;
300
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    56
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    57
        // if it was single-shot, disable
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    58
        if (single_shot)
417183866f35 suicide key and respawning
terom
parents: 282
diff changeset
    59
            enabled = false;
205
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    60
    }
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    61
}
905028e58ed1 implement a new tick-timer that doesn't suck
terom
parents:
diff changeset
    62