function op_terminator,event,og_table,num
;+
; NAME:
;   op_terminator
; PURPOSE:
;   Try to put the command sequences for the terminator
;   images into the op command.
; CALLING SEQUENCE:
;   event2 = op_terminator(event,num)
; INPUTS:
;   event	= the op_first_guess /get_event data structure
; RETURNED:
;   The event structure is modified with all possible terminators
;   inserted.
; OUTPUTS:
;   num		= the number of terminators inserted.
; Terminator Rules:
;   1. Do not insert if in SAA
;   2. Do not insert if in Medium rate
;   3. Do not insert if a DSN or KSC contact occurs during or before 
;      the next DAY OG + 6*32 sec		[Changed 9-dec-94]
;   4. If terminator will occur at less than 10s prior to D/N 
;      terminator, do not select.    		[Added 15-jun-94]
;   5. If 2 D/N's occur between AOS's, take the first one.
; Command Sequence:
;         Time		Command
;         D/N - 3*32s	CNT MAN			(3=Term_rule0 below)
;         D/N - 2*32s	Campaign Obs On
;	  D/N - 1*32s   CNT AT
;         DAY + 6*32s   Campaign Obs Off	(4=Term_rule1 below)
; MODIFICATION HISTORY:
;  14-oct-93, J. R. Lemen, Written
;  15-jun-94, JRL, Added logic for New rule 4 (less than 10s prior to D/N)
;                  This based on a good suggestion by Barry Labonte.
;  30-jun-94, JRL, Added a debug statment for local diagnostics
;   9-dec-94, JRL, Changed value of Term_rule1 to 6 units.
;-

debug = 0		; This turns off the diagnostics

; --------- Timing Rules -----------------

Term_rule0 = 3		; Units of 32 sec	(when CTL Man occurs before D/N)
Term_rule1 = 6		; Units of 32 sec	(When Campgn Off occurs after DAY OG)
						; changed 9-dec-94

; ---------  Find the Time of the first KSC LOS ---------
;            (this assumes time ording already done)

event2 = event
num = 0

; --------  Set the rate from the first KSC LOS ---------

i=0
while (event2(i).og ne og_table(15).og) and 	$
      (event2(i).og ne og_table(16).og) do begin
  i=i+1
  if i gt n_elements(event2)-1 then return,event2	; In case this is a strange case
endwhile


; Set the first rate (0=High, 1=Medium)
if event2(i).og eq og_table(15).og then first_rate = 0 else first_rate = 1

; --------- Find all the D/N cases and insert a CTL Man at D/N - Term_rule0*32

ij = where(event2.og eq og_table(5).og,num)
npts = n_elements(event2)
for i=0,num-1 do begin
   timarr = addtime(event2(ij(i)).timarr,del = (-Term_rule0*32.d0/60.))
   save_event,npts,og_table,timarr,64,		$	; Add Ctl Man
		event2(ij(i)).station,' ',-1,event2(ij(i)).pass_num,event2
endfor

; --------- Time sort -------------

ex2int,event2.timarr,msod,DS79
Day = DS79-min(DS79)
T_sec = msod/1000L+Day*24L*3600
event2 = event2(sort(T_sec))

; --------- Determine SAA and Telemetry Rate at all event times ------------

npts = n_elements(event2)
SAA = bytarr(npts)	; 1=SAA, 0=No SAA
Rate= bytarr(npts)	; 1=Med, 0=High telemetry rate

Rate(0) = first_rate
SAA(0)  = 0		; Assume that we aren't in an SAA at the time of KSC

for i=1,npts-1 do begin
  og = event2(i).og

  SAA(i) = SAA(i-1)		; Assume no changes
  Rate(i)= Rate(i-1)

; Check for LOS and Rate Change

; These are QT/H cases
  if (og eq og_table(15).og) or (og eq og_table(28).og) then Rate(i) = 0
  if (og eq og_table(22).og) then Rate(i) = 0			; DSN QT H
; These are the QT/M cases
  if (og eq og_table(16).og) or (og eq og_table(23).og) then Rate(i) = 1

; Check for RB HV RDCT ON/OFF 

  if og eq og_table(26).og then SAA(i) = 1 	; RB HV RDCT ON
  if og eq og_table(27).og then SAA(i) = 0	; RB HV RDCT OFF

endfor


; ------ *** Rule 1 and 2 *** -----------------------------------------
; ------ Do not insert if in SAA --------------------------------------
; ------ Do not insert if in Medium rate ------------------------------

ij = where(event2.og eq og_table(64).og,num)		; Find all ctl Man
if debug then print,'Number of terminators before rule 1,2 =',num	;***

;  Check if either CTL MAN or D/N times are in SAA or MED Rate
for i=0,num-1 do begin
  k = ij(i) & j = k
  while event2(k).og ne og_table(5).og do k=k+1	; Find corresponding D/N
  if Rate(j) or Rate(k) or SAA(j) or SAA(k) then event2(j).og = -event2(j).og
endfor

; ------ *** Rule 3 *** -----------------------------------------------
;-- Do not insert if a (KSC or DSN) contact occurs during or before  --
;      the next DAY OG + 6*32 sec (term_rule1)

ij = where(event2.og eq og_table(64).og,num)	; Find all ctl Man
print,'Number of terminators before rule 3 =',num,' ***'	;***
num1 = num
for i=0,num-1 do begin
  k = ij(i) & j = k

; Look for the next DAY OG (that follows the CTL MAN)
  found = 0
  while not found do begin
    if event2(k).og ne og_table(55).og then begin
      k = k + 1
      if k ge npts then begin
	k = -1 & found = 1
      endif
    endif else found = 1
  endwhile
				
; Now keep going until we find an event that is at least Term_rule1 later
  if k ne -1 then begin		; if k=-1, we didn't find the next DAY OG
    k0 = k
    found = 0
    while not found do begin
         if addtime(event2(k).timarr,diff=event2(k0).timarr)*60.d0/32. 	$
				gt Term_rule1 then found = 1 		$
	 else begin
           k = k + 1
           if k ge npts then begin
             k = -1 & found = 1
           endif
         endelse
    endwhile
  endif				; k ne -1

; if k eq -1, we didn't find the DAY OG or a time Term_rule1 after the Day OG
  if k eq -1 then event2(j).og = -event2(j).og else begin

      for ii=j,k-1 do 					$
        if ((event2(ii).og ge og_table(17).og) and 	$	; DSN
	    (event2(ii).og le og_table(25).og)) or	$	; DSN
	   ((event2(ii).og ge og_table(8).og) and	$	; KSC
	    (event2(ii).og le og_table(16).og)) then 	$	; KSC
		event2(j).og = -abs(event2(j).og)
  endelse
endfor

; ------ *** Rule 4 *** -----------------------------------------------
; ------ Don't include if less than 10s prior to D/N terminator -------

ij = where(event2.og eq og_table(64).og,num)	; Find all ctl Man
count = 0
if num1 gt 0 then print,'Number of terminators before rule 4 =',num,' ***'	;***
num1 = num


if num gt 0 then begin
  for i=0,num-1 do begin
    tim2orbit,event2(ij(i)).timarr,tim2night=tim2night
    if debug then print,'Term',i,fmt_tim(event2(ij(i)).timarr),'  tim2night=',tim2night,format='(a,i3,x,2a,f100.1)'		;***
    if tim2night*60. lt (10.+64.) then event2(ij(i)).og = - event2(ij(i)).og
  endfor
endif


; ------ *** Rule 5 *** -----------------------------------------------
; ------ If 2 D/N's occur between AOS's, take the first one. ----------

ij = where(event2.og eq og_table(64).og,num)	; Find all ctl Man
count = 0
if num1 gt 0 then print,'Number of terminators before rule 5 =',num,' ***'	;***
num1 = num

if num gt 0 then begin
  for i=ij(0),n_elements(event2)-1 do begin
    if event2(i).og eq og_table(64).og then begin
      count = count + 1					; # of terms. btwn AOS's
      if count gt 1 then event2(i).og = - event2(i).og	; Keep the first terminator
    endif else if (event2(i).og eq og_table(17).og) or 	$ ; DSN AOS-A
	        (event2(i).og eq og_table(18).og) or	$ ; DSN AOS-B
	        (event2(i).og eq og_table( 8).og) or	$ ; KSC AOS-A-DAY
	        (event2(i).og eq og_table( 9).og) or	$ ; KSC AOS-B-DAY
	        (event2(i).og eq og_table(10).og) or	$ ; KSC AOS-A-NT
	        (event2(i).og eq og_table(11).og) then	$ ; KSC AOS-B-NT
		count = 0
  endfor
endif

; ------- Now Insert the Terminator Commands --------------------------

ij = where(event2.og eq og_table(64).og,num)	; Find all ctl Man
for i=0,num-1 do begin
  k = ij(i) & j = k

  tim_man = event2(j).timarr
  tim_on  = addtime(tim_man,del=1.d0*32./60)	; Campaign Obs On
  tim_Aut = addtime(tim_man,del=2.d0*32./60)	; CNT MODE AT

; Find the Next DAY OG
  while event2(k).og ne og_table(55).og do k=k+1
  tim_off = addtime(event2(k).timarr,del=Term_rule1*32.d0/60)

; Put in the events
  save_event,npts,og_table,tim_on, 30,' ',' ',-1,-1,event2	; Camp Obs On
  save_event,npts,og_table,tim_Aut,63,' ',' ',-1,-1,event2	; CNT MODE AT
  save_event,npts,og_table,tim_off,31,' ',' ',-1,-1,event2	; Camp Obs off
endfor    


; --------- Time sort -------------

ex2int,event2.timarr,msod,DS79
Day = DS79-min(DS79)
T_sec = msod/1000L+Day*24L*3600
event2 = event2(sort(T_sec))

; ------------- Count the number of Terminators -------

prstr,op_term_sum(event2,og_table,num)

return,event2
end
