pro sonyloop, f0, f1, sec_per_frame=sec_per_frame, reps=reps, $
    reverse=reverse, w1=w1, w2=w2, device=device, beep=beep 
;+
; Name:
;   sonyloop
;
; Purpose:
;   Play a range of frames on the Sony LVR-5000A laser videodisk
;   recorder/player an arbitrary number of times
;
; Calling sequence:
;   sonyloop, f0
;   sonyloop, f0, f1, sec_per_frame=sec_per_frame, reps=reps,
;	      reverse=reverse, w1=w1, device=device
;
; Examples:
;   sonyloop, 5000		; Position to frame 5000
;   sonyloop, 5000, 5200	; Play from 5000 to 5200 at normal speed
;   sonyloop, 5000, 5200, sec=2	; Play a factor of 2 slower
;   sonyloop, 5200, 5000	; Play backwards
;   sonyloop, 5000, 5200, /rev	; Play forward and backwards
;   sonyloop, 5000, 5200, w1=4	; Position to 5000 and pause 4sec, then play
;   sonyloop, 5000, 5200, w2=4	; Pause 4sec after playing
;				; If /rev switch is set, w2 wait is applied
;				;- before the reverse play starts.
;
; Input:
;   f0, f1 = start and end frames of sequence to play
;
; Optional Input Keywords:
;   sec_per_frame = dwell at each frame in units of 1/30 sec
;		    1:255 are acceptable.
;		    -1 corresponds to 1/5 speed  (slow forward/reverse)
;		    -2 corresponds to 3x normal  (fast forward/reverse)
;		    -3 corresponds to normal
;   reps = number of playback repeats at each playback speed
;   reverse = 0 to jump from last to first frame
;           = 1 to reverse play from last frame to first frame
;   w1 = wait interval after initial display before sequence begins
;   w2 = wait after the sequence ends
;   device = 0 for sony 3000		(/dev/tty08)
;   device = 1 for sony 5000 (default)	(/dev/tty09)
;
; Restrictions:
;   1. Must be used on isass3 only (physical port is on isass3)
;   2. Assumes lun=1 for I/O.
;   3. Reverse step (4d) and reverse slow (4c) gives normal play speeds.
;		Timing calculation, therefore, is sometimes off.
;
; Method:
;
; Modification History:
;   Written,  24-feb-92 - gls
;   Modified, 27-aug-92, JRL:  Fixed the delay times, some of the logic.
;	18-Jun-93 (MDM) - Removed print statments
;			- Made default W1 wait 0 seconds
;   GLS - 26-apr-94 - Replaced 'printf' with calls to command_tty2
;		      which calls a modified version of call_tty
;		      - this was necessary after Ultrix upgrade
;   28-jan-95, JRL, Added beep keyword.  Changed to call get_sony_cmd
;    2-Feb-95, JRL, Modified to be consistent with new get_sony_cmd
;    2-Mar-95, LS,  modified the ports for the DEC alpha and terminal server
;   30-May-96, GAL, Found the working version of this routine in Greg's 
;		personal area, without documentation for the changes.
;		It looks like Greg's newer version uses command_laser 
;		instead of command_tty2 in most of the commands to the
;		sony.
;-

if n_params() eq 0 then begin
  print,'sonyloop, f0, f1, device=device'
  print,'      f0 = start frame'
  print,'      f0 = stop frame'
  print,'      sec_per_frame = dwell at each frame in units of 1/30 sec
  print,'      reps = number of repeats at each speed            [def=1]'
  print,'      reverse = 0,1 for jump or play from last to first frame
  print,'      w1 = wait count (sec) after initial positioning   [def=1]'
  print,'      device = 0 or 1                                   [def=1]'
  return
endif

repsx = 1
if n_elements(sec_per_frame) eq 0 then sec_per_frame = 1
if n_elements(reps) eq 0 then reps = 1
if n_elements(w1) eq 0 then w1 = 0	;MDM changed from 1 to 0
if n_elements(w2) eq 0 then w2 = 0 
if keyword_set(beep) and w2 ge 4 then begin
   qbeep = 1
   w3 = 3
   w2 = w2 - w3 - 0.2	; tbeep command takes about 0.2 on a DECstation 5000
endif else qbeep = 0
if n_elements(device) eq 0 then device = 1		; Set up for isass1
if n_elements(f1) eq 0 then f1 = f0
device_str = ['/dev/tty08','/dev/tty09']
sec_per_frame = fix(sec_per_frame)
if ((sec_per_frame lt -3) or (sec_per_frame eq 0) or $
    (sec_per_frame gt 255)) then begin
  print,' Illegal speed requested'
  stop
endif
if sec_per_frame lt 0 then begin
  if sec_per_frame eq -3 then speed = 30./1 else $
  if sec_per_frame eq -2 then speed = 30.*3  else $
  if sec_per_frame eq -1 then speed = 30 /5.
endif else speed = 30./sec_per_frame
if sec_per_frame lt 0 then begin
  if sec_per_frame eq -3 then speed_cmd = 1. else $
  if sec_per_frame eq -2 then speed_cmd = 10.  else $
  if sec_per_frame eq -1 then speed_cmd = 1./5
endif else speed_cmd = 1./sec_per_frame
nf = abs(f1-f0)+1	; Number of frames to display
wait_for = nf/speed


; Construct forward play command:
cmf = get_sony_cmd('PLAY',f1>f0,sec_per_frame)

; Construct reverse play command:
cmr = get_sony_cmd('PLAY',f1<f0,sec_per_frame)

; Swap forward and reverse commands if f0 < f1
if f1 lt f0 then begin	; Swap the strings around
  buf = cmr
  cmr = cmf
  cmf = buf
endif

for i=0,reps-1 do begin

; Position to first frame:
  command_laser,'search',value=[f0],dev=device
  if n_params() gt 1 then begin
    ;print,'Waiting (1) ... '
    ;wait,w1
    wait,w1>0.3		;at least wait 0.3 second or commands collide
print,'speed_cmd = ',speed_cmd
print,'sec_per_per_frame = ',sec_per_frame
    if f1 ge f0 then $
      command_laser,'play',value=[speed_cmd,f1>f0],dev=device else $
      command_laser,'play',value=[speed_cmd,f1<f0],dev=device
    ;print,'Waiting (2) ... ('+strtrim(wait_for + w2,2)+')'
    wait,wait_for + w2
    if qbeep then begin
	tbeep & wait,3
    endif
    ;print,'Finished waiting ...'	;***
  endif

  if keyword_set(reverse) then begin
     command_tty2,cmr,dev=device
print,'speed_cmd = ',speed_cmd
print,'sec_per_per_frame = ',sec_per_frame
     if f1 ge f0 then $
       command_laser,'play',value=[speed_cmd,f1<f0],dev=device else $
       command_laser,'play',value=[speed_cmd,f1>f0],dev=device
     wait,wait_for + w2
     if qbeep then begin
	tbeep & wait,3
     endif
  endif

endfor

end
