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