F4MP/f4mp_originalcode/thirdparty/zpl/code/source/timer.c
Jous99 37b16f1547 code upload
codigo original de f4mp y tilted para referencias
2026-01-06 18:45:00 +01:00

71 lines
1.6 KiB
C

// file: source/timer.c
////////////////////////////////////////////////////////////////
//
// Timer
//
//
#ifdef ZPL_EDITOR
#include <zpl.h>
#endif
ZPL_BEGIN_C_DECLS
zpl_timer *zpl_timer_add(zpl_timer_pool pool) {
ZPL_ASSERT(pool);
zpl_timer t = { 0 };
zpl_array_append(pool, t);
return pool + (zpl_array_count(pool) - 1);
}
void zpl_timer_set(zpl_timer *t, zpl_f64 duration, zpl_i32 count, zpl_timer_cb cb) {
ZPL_ASSERT(t);
t->duration = duration;
t->remaining_calls = t->initial_calls = count;
t->callback = cb;
t->enabled = false;
}
void zpl_timer_start(zpl_timer *t, zpl_f64 delay_start) {
ZPL_ASSERT(t && !t->enabled);
t->enabled = true;
t->remaining_calls = t->initial_calls;
t->next_call_ts = zpl_time_now( ) + delay_start;
}
void zpl_timer_stop(zpl_timer *t) {
ZPL_ASSERT(t && t->enabled);
t->enabled = false;
}
void zpl_timer_update(zpl_timer_pool pool) {
ZPL_ASSERT(pool);
zpl_f64 now = zpl_time_now( );
for (zpl_isize i = 0; i < zpl_array_count(pool); ++i) {
zpl_timer *t = pool + i;
if (t->enabled) {
if (t->remaining_calls > 0 || t->initial_calls == -1) {
if (t->next_call_ts <= now) {
if (t->initial_calls != -1) { --t->remaining_calls; }
if (t->remaining_calls == 0) {
t->enabled = false;
} else {
t->next_call_ts = now + t->duration;
}
t->callback(t->user_data);
}
}
}
}
}
ZPL_END_C_DECLS