1*11692Smckusick #ifndef lint 2*11692Smckusick static char sccsid[] = "@(#)schedule.c 4.1 (Berkeley) 03/23/83"; 3*11692Smckusick #endif not lint 4*11692Smckusick 5*11692Smckusick # include "trek.h" 6*11692Smckusick 7*11692Smckusick /* 8*11692Smckusick ** SCHEDULE AN EVENT 9*11692Smckusick ** 10*11692Smckusick ** An event of type 'type' is scheduled for time NOW + 'offset' 11*11692Smckusick ** into the first available slot. 'x', 'y', and 'z' are 12*11692Smckusick ** considered the attributes for this event. 13*11692Smckusick ** 14*11692Smckusick ** The address of the slot is returned. 15*11692Smckusick */ 16*11692Smckusick 17*11692Smckusick struct event *schedule(type, offset, x, y, z) 18*11692Smckusick int type; 19*11692Smckusick float offset; 20*11692Smckusick char x, y; 21*11692Smckusick char z; 22*11692Smckusick { 23*11692Smckusick register struct event *e; 24*11692Smckusick register int i; 25*11692Smckusick float date; 26*11692Smckusick 27*11692Smckusick date = Now.date + offset; 28*11692Smckusick for (i = 0; i < MAXEVENTS; i++) 29*11692Smckusick { 30*11692Smckusick e = &Event[i]; 31*11692Smckusick if (e->evcode) 32*11692Smckusick continue; 33*11692Smckusick /* got a slot */ 34*11692Smckusick # ifdef xTRACE 35*11692Smckusick if (Trace) 36*11692Smckusick printf("schedule: type %d @ %.2f slot %d parm %d %d %d\n", 37*11692Smckusick type, date, i, x, y, z); 38*11692Smckusick # endif 39*11692Smckusick e->evcode = type; 40*11692Smckusick e->date = date; 41*11692Smckusick e->x = x; 42*11692Smckusick e->y = y; 43*11692Smckusick e->systemname = z; 44*11692Smckusick Now.eventptr[type] = e; 45*11692Smckusick return (e); 46*11692Smckusick } 47*11692Smckusick syserr("Cannot schedule event %d parm %d %d %d", type, x, y, z); 48*11692Smckusick } 49*11692Smckusick 50*11692Smckusick 51*11692Smckusick /* 52*11692Smckusick ** RESCHEDULE AN EVENT 53*11692Smckusick ** 54*11692Smckusick ** The event pointed to by 'e' is rescheduled to the current 55*11692Smckusick ** time plus 'offset'. 56*11692Smckusick */ 57*11692Smckusick 58*11692Smckusick reschedule(e1, offset) 59*11692Smckusick struct event *e1; 60*11692Smckusick float offset; 61*11692Smckusick { 62*11692Smckusick float date; 63*11692Smckusick register struct event *e; 64*11692Smckusick 65*11692Smckusick e = e1; 66*11692Smckusick 67*11692Smckusick date = Now.date + offset; 68*11692Smckusick e->date = date; 69*11692Smckusick # ifdef xTRACE 70*11692Smckusick if (Trace) 71*11692Smckusick printf("reschedule: type %d parm %d %d %d @ %.2f\n", 72*11692Smckusick e->evcode, e->x, e->y, e->systemname, date); 73*11692Smckusick # endif 74*11692Smckusick return; 75*11692Smckusick } 76*11692Smckusick 77*11692Smckusick 78*11692Smckusick /* 79*11692Smckusick ** UNSCHEDULE AN EVENT 80*11692Smckusick ** 81*11692Smckusick ** The event at slot 'e' is deleted. 82*11692Smckusick */ 83*11692Smckusick 84*11692Smckusick unschedule(e1) 85*11692Smckusick struct event *e1; 86*11692Smckusick { 87*11692Smckusick register struct event *e; 88*11692Smckusick 89*11692Smckusick e = e1; 90*11692Smckusick 91*11692Smckusick # ifdef xTRACE 92*11692Smckusick if (Trace) 93*11692Smckusick printf("unschedule: type %d @ %.2f parm %d %d %d\n", 94*11692Smckusick e->evcode, e->date, e->x, e->y, e->systemname); 95*11692Smckusick # endif 96*11692Smckusick Now.eventptr[e->evcode & E_EVENT] = 0; 97*11692Smckusick e->date = 1e50; 98*11692Smckusick e->evcode = 0; 99*11692Smckusick return; 100*11692Smckusick } 101*11692Smckusick 102*11692Smckusick 103*11692Smckusick /* 104*11692Smckusick ** Abreviated schedule routine 105*11692Smckusick ** 106*11692Smckusick ** Parameters are the event index and a factor for the time 107*11692Smckusick ** figure. 108*11692Smckusick */ 109*11692Smckusick 110*11692Smckusick struct event *xsched(ev1, factor, x, y, z) 111*11692Smckusick int ev1; 112*11692Smckusick int factor; 113*11692Smckusick int x, y, z; 114*11692Smckusick { 115*11692Smckusick register int ev; 116*11692Smckusick 117*11692Smckusick ev = ev1; 118*11692Smckusick return (schedule(ev, -Param.eventdly[ev] * Param.time * log(franf()) / factor, x, y, z)); 119*11692Smckusick } 120*11692Smckusick 121*11692Smckusick 122*11692Smckusick /* 123*11692Smckusick ** Simplified reschedule routine 124*11692Smckusick ** 125*11692Smckusick ** Parameters are the event index, the initial date, and the 126*11692Smckusick ** division factor. Look at the code to see what really happens. 127*11692Smckusick */ 128*11692Smckusick 129*11692Smckusick xresched(e1, ev1, factor) 130*11692Smckusick struct event *e1; 131*11692Smckusick int ev1; 132*11692Smckusick int factor; 133*11692Smckusick { 134*11692Smckusick register int ev; 135*11692Smckusick register struct event *e; 136*11692Smckusick 137*11692Smckusick ev = ev1; 138*11692Smckusick e = e1; 139*11692Smckusick reschedule(e, -Param.eventdly[ev] * Param.time * log(franf()) / factor); 140*11692Smckusick } 141