------------------------------------------------------------------ -- -- NAME: TEK_TASKS- BODY -- DISCREPANCY REPORTS: ------------------------------------------------------------------ -- FILE: TEK_TASKS_B.ADA -- LEVEL: MC, 0C, 1C, 2C with TEXT_IO; use TEXT_IO; package body TEK_TASKS is -- The following function makes the equality operator visible for -- TEK.INPUT_STATUS. This precludes the need for the "use TEK;" clause... function "=" (LEFT, RIGHT: TEK.INPUT_STATUS) return BOOLEAN renames TEK."="; function "&" (LEFT, RIGHT: TEK.TEK_POINTS) return TEK.TEK_POINTS renames TEK."&"; task body QUEUE_IO_TASK is MAX_QUEUE_SIZE : constant INTEGER := 1000; QUEUE : TEK.TEK_POINTS (1..MAX_QUEUE_SIZE); OUTPUT_QUEUE : TEK.TEK_POINTS (1..MAX_QUEUE_SIZE); QUEUE_SIZE : INTEGER := 0; HEAD_PTR, TAIL_PTR : INTEGER := 0; NUMBER_REQUESTED, NUMBER_AVAILABLE : INTEGER; begin loop select accept GET_POINT (SAMPLE_POINT : out TEK.TEK_POINT) do if QUEUE_SIZE = 0 then SAMPLE_POINT := (0,0); else SAMPLE_POINT := QUEUE (HEAD_PTR); end if; end GET_POINT; or accept GET_POINTS (NUMBER_OF_POINTS : in out INTEGER; SAMPLE_POINTS : out TEK.TEK_POINTS) do NUMBER_REQUESTED := NUMBER_OF_POINTS; NUMBER_AVAILABLE := QUEUE_SIZE; if QUEUE_SIZE < MAX_QUEUE_SIZE then if QUEUE_SIZE = 0 then NUMBER_AVAILABLE := 1; OUTPUT_QUEUE (1) := (0,0); else NUMBER_AVAILABLE := QUEUE_SIZE; OUTPUT_QUEUE (1..QUEUE_SIZE) := QUEUE (1..QUEUE_SIZE); end if; else NUMBER_AVAILABLE := MAX_QUEUE_SIZE; OUTPUT_QUEUE (1..NUMBER_AVAILABLE) := QUEUE (HEAD_PTR..MAX_QUEUE_SIZE) & QUEUE (1..HEAD_PTR-1); end if; if NUMBER_REQUESTED <= NUMBER_AVAILABLE then SAMPLE_POINTS (1..NUMBER_REQUESTED) := OUTPUT_QUEUE(1..NUMBER_REQUESTED); else NUMBER_OF_POINTS := NUMBER_AVAILABLE; SAMPLE_POINTS (1..NUMBER_OF_POINTS) := OUTPUT_QUEUE(1..NUMBER_OF_POINTS); end if; end GET_POINTS; or accept SAVE_POINT (SAMPLE_POINT : in TEK.TEK_POINT) do if HEAD_PTR = MAX_QUEUE_SIZE then HEAD_PTR := 1; else HEAD_PTR := HEAD_PTR + 1; end if; QUEUE (HEAD_PTR) := SAMPLE_POINT; QUEUE_SIZE := QUEUE_SIZE + 1; if QUEUE_SIZE > MAX_QUEUE_SIZE then QUEUE_SIZE := MAX_QUEUE_SIZE; end if; end SAVE_POINT; or accept SAVE_POINTS (NUMBER_OF_POINTS : in INTEGER; SAMPLE_POINTS : in TEK.TEK_POINTS) do if HEAD_PTR + NUMBER_OF_POINTS < MAX_QUEUE_SIZE + 1 then QUEUE (HEAD_PTR..HEAD_PTR+NUMBER_OF_POINTS-1) := SAMPLE_POINTS(1..NUMBER_OF_POINTS); HEAD_PTR := HEAD_PTR+NUMBER_OF_POINTS-1; else QUEUE (HEAD_PTR..MAX_QUEUE_SIZE) := SAMPLE_POINTS(1..MAX_QUEUE_SIZE-HEAD_PTR+1); QUEUE (1..NUMBER_OF_POINTS-(MAX_QUEUE_SIZE-HEAD_PTR+1) ) := SAMPLE_POINTS(MAX_QUEUE_SIZE-HEAD_PTR+2..NUMBER_OF_POINTS); HEAD_PTR := NUMBER_OF_POINTS-(MAX_QUEUE_SIZE-HEAD_PTR+1); end if; QUEUE_SIZE := QUEUE_SIZE + NUMBER_OF_POINTS; if QUEUE_SIZE > MAX_QUEUE_SIZE then QUEUE_SIZE := MAX_QUEUE_SIZE; end if; end SAVE_POINTS; or accept STOP; exit; end select; end loop; end QUEUE_IO_TASK; task body DRIVER_SERVER_TASK is begin loop select accept SEIZE; or accept STOP; exit; end select; accept RELEASE; end loop; end DRIVER_SERVER_TASK; task body SAMPLER_TASK is SAMPLED_POINT : TEK.TEK_POINT; begin MAIN: loop select accept START_SAMPLING; or accept STOP; exit MAIN; end select; loop DRIVER_SERVER.SEIZE; TEK.SAMPLE_LOCATOR(SAMPLED_POINT); DRIVER_SERVER.RELEASE; QUEUE_IO.SAVE_POINT(SAMPLED_POINT); select accept STOP_SAMPLING; exit; or accept STOP; exit MAIN; else null; end select; end loop; end loop MAIN; end SAMPLER_TASK; procedure START_TASKS is begin SAMPLER := new SAMPLER_TASK; QUEUE_IO := new QUEUE_IO_TASK; DRIVER_SERVER := new DRIVER_SERVER_TASK; end; procedure STOP_TASKS (WS_SL : in out WS_STATE_LIST_TYPES. WS_STATE_LIST_PTR) is begin SAMPLER.STOP; QUEUE_IO.STOP; DRIVER_SERVER.STOP; end; end TEK_TASKS;