00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00040 #include <timers.h>
00041 #ifndef __CEXTRACT__
00042 #include <sproto.h>
00043 #endif
00044
00045
00046 cftimer timers_table[MAX_TIMERS];
00047
00048 static void cftimer_process_event(tag_t ob_tag);
00049
00053 void cftimer_process_timers(void) {
00054 int i;
00055
00056 for (i = 0; i < MAX_TIMERS; i++) {
00057 if (timers_table[i].mode == TIMER_MODE_CYCLES) {
00058 timers_table[i].delay--;
00059 if (timers_table[i].delay == 0) {
00060
00061 timers_table[i].mode = TIMER_MODE_DEAD;
00062 cftimer_process_event(timers_table[i].ob_tag);
00063 }
00064 } else if (timers_table[i].mode == TIMER_MODE_SECONDS) {
00065 if (timers_table[i].delay <= seconds()) {
00066
00067 timers_table[i].mode = TIMER_MODE_DEAD;
00068 cftimer_process_event(timers_table[i].ob_tag);
00069 }
00070 }
00071 }
00072 }
00073
00080 static void cftimer_process_event(tag_t ob_tag) {
00081 object *ob = find_object(ob_tag);
00082
00083 if (ob)
00084 execute_event(ob, EVENT_TIMER, NULL, NULL, NULL, SCRIPT_FIX_ALL);
00085 }
00086
00106 int cftimer_create(int id, long delay, object *ob, int mode) {
00107 if (id >= MAX_TIMERS)
00108 return TIMER_ERR_ID;
00109 if (id < 0)
00110 return TIMER_ERR_ID;
00111 if (timers_table[id].mode != TIMER_MODE_DEAD)
00112 return TIMER_ERR_ID;
00113 if ((mode != TIMER_MODE_SECONDS) && (mode != TIMER_MODE_CYCLES))
00114 return TIMER_ERR_MODE;
00115 if (ob == NULL)
00116 return TIMER_ERR_OBJ;
00117 if (find_obj_by_type_subtype(ob, EVENT_CONNECTOR, EVENT_TIMER) == NULL)
00118 return TIMER_ERR_OBJ;
00119 timers_table[id].mode = mode;
00120 timers_table[id].ob_tag = ob->count;
00121 if (mode == TIMER_MODE_CYCLES)
00122 timers_table[id].delay = delay;
00123 else
00124 timers_table[id].delay = seconds()+delay;
00125 return TIMER_ERR_NONE;
00126 }
00127
00137 int cftimer_destroy(int id) {
00138 if (id >= MAX_TIMERS)
00139 return TIMER_ERR_ID;
00140 if (id < 0)
00141 return TIMER_ERR_ID;
00142 timers_table[id].mode = TIMER_MODE_DEAD;
00143 return TIMER_ERR_NONE;
00144 }
00145
00153 int cftimer_find_free_id(void) {
00154 int i;
00155
00156 for (i = 0; i < MAX_TIMERS; i++) {
00157 if (timers_table[i].mode == TIMER_MODE_DEAD)
00158 return i;
00159 }
00160 return TIMER_ERR_ID;
00161 }
00162
00166 void cftimer_init(void) {
00167 memset(&timers_table[0], 0, sizeof(cftimer)*MAX_TIMERS);
00168 }