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