#ifndef TIMER_H
#define TIMER_H
# include "sanity.h"
enum TIMER_TYPE
{
TIMER_NONE,
TIMER_ONCE_AUTODEL,
TIMER_INTERVAL,
};
/// This is needed to produce a signed result when 2 ticks are subtracted
# define DIFF_TICK(a,b) ((int32_t)((a)-(b)))
// TODO replace with signed 64-bit to make code more clear and protect from the future
typedef uint32_t tick_t;
typedef uint32_t interval_t;
typedef uint32_t timer_id;
// BUG: pointers are stored in here
typedef int32_t custom_id_t;
typedef int32_t custom_data_t;
typedef void (*timer_func) (timer_id, tick_t, custom_id_t, custom_data_t);
struct TimerData
{
/// When it will be triggered
tick_t tick;
/// What will be done
timer_func func;
/// Arbitrary data. WARNING, callers are stupid and put pointers in here
// Should we change to void* or intptr_t ?
custom_id_t id;
custom_data_t data;
/// Type of timer - 0 initially
enum TIMER_TYPE type;
/// Repeat rate
interval_t interval;
};
/// Server time, in milliseconds, since the epoch,
/// but use of 32-bit integers means it wraps every 49 days.
// The only external caller of this function is the core.c main loop, but that makes sense
// in fact, it might make more sense if gettick() ALWAYS returned that cached value
tick_t gettick_nocache (void);
/// This function is called enough that it's worth caching the result for
/// the next 255 times
tick_t gettick (void);
timer_id add_timer (tick_t, timer_func, custom_id_t, custom_data_t);
timer_id add_timer_interval (tick_t, timer_func, custom_id_t, custom_data_t, interval_t);
void delete_timer (timer_id, timer_func);
tick_t addtick_timer (timer_id, interval_t);
struct TimerData *get_timer (timer_id tid);
/// Do all timers scheduled before tick, and return the number of milliseconds until the next timer happens
interval_t do_timer (tick_t tick);
#endif // TIMER_H