121292Sdist /* 221292Sdist * Copyright (c) 1980 Regents of the University of California. 334205Sbostic * All rights reserved. 434205Sbostic * 5*42606Sbostic * %sccs.include.redist.c% 621292Sdist */ 721292Sdist 811692Smckusick #ifndef lint 9*42606Sbostic static char sccsid[] = "@(#)schedule.c 5.4 (Berkeley) 06/01/90"; 1034205Sbostic #endif /* not lint */ 1111692Smckusick 1211692Smckusick # include "trek.h" 1311692Smckusick 1411692Smckusick /* 1511692Smckusick ** SCHEDULE AN EVENT 1611692Smckusick ** 1711692Smckusick ** An event of type 'type' is scheduled for time NOW + 'offset' 1811692Smckusick ** into the first available slot. 'x', 'y', and 'z' are 1911692Smckusick ** considered the attributes for this event. 2011692Smckusick ** 2111692Smckusick ** The address of the slot is returned. 2211692Smckusick */ 2311692Smckusick 2411692Smckusick struct event *schedule(type, offset, x, y, z) 2511692Smckusick int type; 2612738Slayer double offset; 2711692Smckusick char x, y; 2811692Smckusick char z; 2911692Smckusick { 3011692Smckusick register struct event *e; 3111692Smckusick register int i; 3212738Slayer double date; 3311692Smckusick 3411692Smckusick date = Now.date + offset; 3511692Smckusick for (i = 0; i < MAXEVENTS; i++) 3611692Smckusick { 3711692Smckusick e = &Event[i]; 3811692Smckusick if (e->evcode) 3911692Smckusick continue; 4011692Smckusick /* got a slot */ 4111692Smckusick # ifdef xTRACE 4211692Smckusick if (Trace) 4311692Smckusick printf("schedule: type %d @ %.2f slot %d parm %d %d %d\n", 4411692Smckusick type, date, i, x, y, z); 4511692Smckusick # endif 4611692Smckusick e->evcode = type; 4711692Smckusick e->date = date; 4811692Smckusick e->x = x; 4911692Smckusick e->y = y; 5011692Smckusick e->systemname = z; 5111692Smckusick Now.eventptr[type] = e; 5211692Smckusick return (e); 5311692Smckusick } 5411692Smckusick syserr("Cannot schedule event %d parm %d %d %d", type, x, y, z); 5511692Smckusick } 5611692Smckusick 5711692Smckusick 5811692Smckusick /* 5911692Smckusick ** RESCHEDULE AN EVENT 6011692Smckusick ** 6111692Smckusick ** The event pointed to by 'e' is rescheduled to the current 6211692Smckusick ** time plus 'offset'. 6311692Smckusick */ 6411692Smckusick 6511692Smckusick reschedule(e1, offset) 6611692Smckusick struct event *e1; 6712738Slayer double offset; 6811692Smckusick { 6912738Slayer double date; 7011692Smckusick register struct event *e; 7111692Smckusick 7211692Smckusick e = e1; 7311692Smckusick 7411692Smckusick date = Now.date + offset; 7511692Smckusick e->date = date; 7611692Smckusick # ifdef xTRACE 7711692Smckusick if (Trace) 7811692Smckusick printf("reschedule: type %d parm %d %d %d @ %.2f\n", 7911692Smckusick e->evcode, e->x, e->y, e->systemname, date); 8011692Smckusick # endif 8111692Smckusick return; 8211692Smckusick } 8311692Smckusick 8411692Smckusick 8511692Smckusick /* 8611692Smckusick ** UNSCHEDULE AN EVENT 8711692Smckusick ** 8811692Smckusick ** The event at slot 'e' is deleted. 8911692Smckusick */ 9011692Smckusick 9111692Smckusick unschedule(e1) 9211692Smckusick struct event *e1; 9311692Smckusick { 9411692Smckusick register struct event *e; 9511692Smckusick 9611692Smckusick e = e1; 9711692Smckusick 9811692Smckusick # ifdef xTRACE 9911692Smckusick if (Trace) 10011692Smckusick printf("unschedule: type %d @ %.2f parm %d %d %d\n", 10111692Smckusick e->evcode, e->date, e->x, e->y, e->systemname); 10211692Smckusick # endif 10311692Smckusick Now.eventptr[e->evcode & E_EVENT] = 0; 10411692Smckusick e->date = 1e50; 10511692Smckusick e->evcode = 0; 10611692Smckusick return; 10711692Smckusick } 10811692Smckusick 10911692Smckusick 11011692Smckusick /* 11111692Smckusick ** Abreviated schedule routine 11211692Smckusick ** 11311692Smckusick ** Parameters are the event index and a factor for the time 11411692Smckusick ** figure. 11511692Smckusick */ 11611692Smckusick 11711692Smckusick struct event *xsched(ev1, factor, x, y, z) 11811692Smckusick int ev1; 11911692Smckusick int factor; 12011692Smckusick int x, y, z; 12111692Smckusick { 12211692Smckusick register int ev; 12311692Smckusick 12411692Smckusick ev = ev1; 12511692Smckusick return (schedule(ev, -Param.eventdly[ev] * Param.time * log(franf()) / factor, x, y, z)); 12611692Smckusick } 12711692Smckusick 12811692Smckusick 12911692Smckusick /* 13011692Smckusick ** Simplified reschedule routine 13111692Smckusick ** 13211692Smckusick ** Parameters are the event index, the initial date, and the 13311692Smckusick ** division factor. Look at the code to see what really happens. 13411692Smckusick */ 13511692Smckusick 13611692Smckusick xresched(e1, ev1, factor) 13711692Smckusick struct event *e1; 13811692Smckusick int ev1; 13911692Smckusick int factor; 14011692Smckusick { 14111692Smckusick register int ev; 14211692Smckusick register struct event *e; 14311692Smckusick 14411692Smckusick ev = ev1; 14511692Smckusick e = e1; 14611692Smckusick reschedule(e, -Param.eventdly[ev] * Param.time * log(franf()) / factor); 14711692Smckusick } 148