startmacro/setup/quiet/nmq=512 u:card[pic1iia] u:aflag[]

local iact iset igo item itemdef drate dfreq flg ptl tolength afn time
local savehome afname skip deci mode frame scale ramfile ramfile2
local ports formats rates lengths clocks decs freqs gains nffts psdrs psdas waves
local port format rate length clock dec freq gain nfft psdr psda wave
local aux0 aux1 aux2 switches
local /M/

res ports   "Enter,Module1,Module2,Module3,Module1&2,Tuner1,Tuner2,Core11,Core12,Stream1,Stream2"
res formats "SB,SI,SL,CB,CI,CL"
res rates   "Enter,1,2,3.125,5,6.25,10,12.5,20,25,30,40,50,60,64,70,80,90,100,105,125,150,200,250,500,750,1000,1250,1500"
res lengths "Enter,0.1,0.25,0.5,1,2,5,10,20"
res clocks  "I,P,PX,X,A,B,C,D,N"
res decs    "Enter,1,2,4,8,16,32,64,128,256,512"
res freqs   "Enter,1,2"
res gains   "Enter,-12,-9,-6,-3,0,3,6,9,12,18"
res nffts   "Enter,256,512,1k,2k,4k,8k,16k,32k,64k,128k"
res psdrs   "1,5,10,25,50"
res psdas   "1,2,5,10,25,50"
res waves   "None,Ramp,TRamp,White,Sine,File"

if /nm gt 0 then
  nm snapper ^card (^aflag)
  stop
endif

if snapset nrexists then
  res snapset "MODULE1,SB,10,N,1,512,1,0,1k,10,1,512,archive,none"
  picd get ^card "MTYPE1" item
  if item eq -1 sedit snapset snapset subs "N" "I" 
endif

env get "WAUX" aux0
if /aaux gt 0 res aux0 /aaux
res aux1 aux0
if /aaux1 gt 0 res aux1 /aaux1
res aux2 aux0
if /aaux2 gt 0 res aux2 /aaux2

sedit snapset a:port parse 1
sedit snapset a:format parse 2
sedit snapset d:rate parse 3
sedit snapset a:clock parse 4
sedit snapset d:length parse 5
sedit snapset l:dec parse 6
sedit snapset d:freq parse 7
sedit snapset d:gain parse 8
sedit snapset l:nfft parse 9
sedit snapset l:psdr parse 10
sedit snapset l:psda parse 11
sedit snapset l:frame parse 12
sedit snapset a:afname parse 13
sedit snapset a:wave parse 14

res ps 256k
if /ps gt 0 res ps /ps

res l:nchan /tb
calc tbdfreq rate*1e6/dec/2
if nchan gt 0 then
  res ports   "TBank1,TBank2,TBank3"
  sedit snapset d:tbdfreq parse 15
else
  res l:nchan 1
endif

label again
res mode "SETUP"
xcntrl on
xcntrl off
if mode eqs "NM"
  nm snapper ^card (^aflag)
  goto again
elseif mode eqs "RUN"
  label rerun
  res mode "RUN"
  res flg "MUXCLK=^clock"
  if port eqss "TUN" or port eqss "CORE" or port eqss "TBANK"
    if format eqs "SB"
      xcall message "Tuner Format must be SI or CI"
      return
    endif
    if /ratio gt 0 then
      calc drate rate 1e6 * dec / /ratio *
    else
      calc drate rate 1e6 * dec /
    endif
    if format eqss "C" calc drate drate/2
    calc l:deci dec
    if "POVSR" subs aflag then
      calc l:deci dec /ovsr *
    endif
  else
    calc drate rate 1e6 *
    calc l:deci drate nfft / psdr / round 1 max
    calc l:deci 1
  endif
  res flg "^flg|^aflag"
  calc l:skip drate nfft / psdr / round 1 max
  if /speed gt 0 and /nox gt 0 calc l:skip 1
  calc dfreq freq 1e6 *
  calc scale 32768
  if "B" subs format calc scale 128
  if "L" subs format calc scale 2e9
  calc bps 2
  if "B" subs format calc bps 1
  if "L" subs format calc bps 4
  if "C" subs format calc bps bps*2
  calc l:tolength length 2 + round
  erase/nowarn ramfile ramfile2
  if /atl gt 0
    res l:ptl /atl
  else
    picd/port=^port/flags=^flg get card "CBUFSZ" ptl
  endif
  if /tsp gt 0 calc ptl nfft*4*skip
  if port eqs "MODULE1&2" then
    res ramfile "^{card}_MODULE1"
    pic/round=ptl*bps/multi=nchan create ramfile ^format drate*length drate ^wave ^gain
    res ramfile2 "^{card}_MODULE2"
    pic/round=ptl*bps/multi=nchan create ramfile2 ^format drate*length drate ^wave ^gain
  else
    res ramfile "^{card}_^{port}"
    pic/round=ptl*bps/multi=nchan create ramfile ^format drate*length drate ^wave ^gain
    remove ramfile2 
  endif
  res afn " "
  if /noreset le 0 picd/flags=^flg reset ^card 
  if /ovsr ge 0 picd/flags=^flg ovsr ^card ,, /ovsr
  if iact eq 2
   if port eqs "MODULE1&2" then
     picd/port=MODULE2/flags=^flg|to=^tolength|sgo/bg &
	 acquire ^card ramfile ,,, deci dfreq gain
     picd/port=MODULE1/flags=^flg|to=^tolength &
	 acquire ^card ramfile2 ,,, deci dfreq gain
   else
     picd/port=^port/flags=^flg|to=^tolength &
	 acquire ^card ramfile ,,, deci dfreq gain
   endif
  else
   xpipe/controls on
   if iact eq 6 and  port eqs "MODULE1&2" then
     sinkpic/id=11/wrap/port=MODULE1/flags=^flg|xsoe/wb=1/master=2002/mon=cb1/skip=skip &
	ramfile ramfile(fs=^nfft) card
     sinkpic/id=12/wrap/port=MODULE2/flags=^flg|xsoe/wb=2/slave/mon=cb2/skip=skip &
	ramfile2 ramfile2(fs=^nfft) card
   elseif iact eq 6 
     if wave neqs "FILE" res afname ramfile
     if /rtpb gt 0 then
       waveform/tl=4k/rt _cbwave(ps=1m) format 1e9 ^wave scale .1e6 ,,, 1/drate
       sinkpic/id=11/port=^port/flags=^flg/wb=1 _cbwave ramfile card
     else
       sinkpic/id=11/wrap/port=^port/flags=^flg/wb=1/mon=_cb/skip=skip ^afname ramfile(fs=^nfft) card
     endif
   elseif port eqs "MODULE1&2" then
     res switches "flags=^flg"
     if /pkt gt 0 res switches "^switches/packet=^{afname}_1_pkt" 
     if iact eq 5 res switches "^switches/arch=^{afname}_1(AUX=^AUX1)" 
     if iact eq 5 erase/nowar ^{afname}_1 
     sourcepic/id=11/tl=1/port=MODULE1/skip=skip/wb=1/master=2002/archtl=ptl/^switches &
	ramfile(fs=^nfft) _cb1(ps=^ps) card deci dfreq gain
     res switches "flags=^flg"
     if /pkt gt 0 res switches "^switches/packet=^{afname}_2_pkt" 
     if iact eq 5 res switches "^switches/arch=^{afname}_2(AUX=^AUX2)"
     if iact eq 5 erase/nowar ^{afname}_2 
     sourcepic/id=12/tl=1/port=MODULE2/skip=skip/wb=2/slave/archtl=ptl/^switches &
	ramfile2(fs=^nfft) _cb2(ps=^ps) card deci dfreq gain
     mux/tl=nfft _cb1 _cb2 _cb
   else
     res switches "flags=^flg"
     if /pkt gt 0 res switches "^switches/packet=^{afname}_pkt" 
     if iact eq 5 res switches "^switches/arch=^{afname}(AUX=^AUX0)" 
     if iact eq 5 erase/nowarn ^{afname} 
     sourcepic/id=11/tl=1/port=^port/skip=skip/wb=1/archtl=ptl/^switches/nchn=nchan/dfreq=tbdfreq &
	ramfile(fs=^nfft) _cb(ps=^ps) card deci dfreq gain
   endif
   if /testcore gt 0 then
     icecore/core=icex/coredev=^card:^port/wb=9 ,,, "User" decimation=deci
   endif
   if /speed gt 0 then
     speedometer _cb
   endif
   if /nox gt 0 
   else if /tsp gt 0
     xrtplot/xs=3/xn="Time Domain" _cb(cl=psda*nfft) -scale scale re
     xrtraster/xs=2/xn="Time vs Time" _cb ,,, re
   else
     ubiq/wb=3 _cb(fs=0) _cbf(ps=1m) nfft HANN 0 ,, psda
     xrtplot/xs=4/xn="Time Domain" _cb(cl=psda*nfft) -scale scale re
     xrtraster/xs=2/dbrange=100/xn="PSD vs Time" _cbf ,,,d1,, 32
     xrtplot/xs=3/dbrange=100/xn="PSD"/grid _cbf ,,,d1
   endif
   if /delayline gt 0
     sinkpic/port=MODULE2/flags=^flg/pause=(/delayline) ramfile ramfile card
   endif
   xpipe off
  endif
  if mode eqs "RERUN" goto rerun
  goto again
endif

erase/nowarn ramfile ramfile2
callp setsnapset

endmacro

startcontrols

label initialentry
xcontrol/lab=lset menu iset  0 "Settings;"
if mode eqs "SETUP"
 xcontrol/lab=lact menu iact  0 &
	"Go;RTSpectra,Snapshot,Plot,Archive,RTArchive,PlayBack,nmSnapper,Exit"
elseif /addtest gt 0 then
 xcontrol/lab=lgo menu igo  0 "Go;Once,Cont,Stop,ReStart,Snapshot,Archive,Exit,Test"
else
 xcontrol/lab=lgo menu igo  0 "Go;Once,Cont,Stop,ReStart,Snapshot,Archive,Exit"
endif
xcontrol/lab=msg msmon 1
callp dosets
return

label lset
if mode eqs "RUN" and iset eq 7
  xcall/name="TFreq: " dval dfreq dfreq 0 rate*1e6/2 rate*1e6/20 1005 
  calc freq dfreq round 1e6 /
  callp dosets
  return
elseif mode eqs "RUN" and iset eq 8
  xcall/name="TGain: " lval gain gain -100 100 1 1006 
  callp dosets
  return
elseif iset eq 1
  xcall menu item 0 "Port;^ports"
  if item eq 1 xcall prompt port port "Port: " 20
  if item gt 1 sedit ports port parse item
  if port eqs "MODULE3" and "S" subs format
    res format "CB"
  elseif port eqs "MODULE1&2" and "C" subs format
    res format "SB"
  elseif port eqss "TUN" and "B" subs format
    res format "CI"
  elseif port eqs "MODULE1" and "C" subs format
    res format "SB"
  elseif port eqs "MODULE2" and "C" subs format
    res format "SB"
  endif
elseif iset eq 2
  xcall menu item 0 "Format;^formats"
  if item gt 0 sedit formats format parse item
elseif iset eq 3
  xcall menu item 0 "Rate;^rates"
  if item eq 1 xcall dprompt rate rate "Rate: "
  if item gt 1 sedit rates d:rate parse item
elseif iset eq 4
  xcall menu item 0 "Clock;^clocks"
  if item gt 0 sedit clocks clock parse item
elseif iset eq 5
  xcall menu item 0 "Length;^lengths"
  if item eq 1 xcall dprompt length length "Length: "
  if item gt 1 sedit lengths d:length parse item
elseif iset eq 6
  xcall menu item 0 "TunerDec;^decs"
  if item eq 1 xcall lprompt dec dec "Dec: "
  if item gt 1 sedit decs l:dec parse item
elseif iset eq 7
  xcall menu item 0 "TunerFreq;^freqs"
  if item eq 1 xcall dprompt freq freq "Freq: "
  if item gt 1 sedit freqs d:freq parse item
elseif iset eq 8
  xcall menu item 0 "TunerGain;^gains"
  if item eq 1 xcall dprompt gain gain "Gain: "
  if item gt 1 sedit gains l:gain parse item
elseif iset eq 9
  xcall menu item 0 "FFT Size;^nffts"
  if item eq 1 xcall lprompt nfft nfft "FFT Size: "
  if item gt 1 sedit nffts l:nfft parse item
elseif iset eq 10
  xcall menu item 0 "PSD Rate;^psdrs"
  if item gt 0 sedit psdrs l:psdr parse item
elseif iset eq 11
  xcall menu item 0 "PSD Avg;^psdas"
  if item gt 0 sedit psdas l:psda parse item
  if mode eqs "RUN" 
    res w_3002 psda
    callp dosets
    return
  endif
elseif iset eq 12 and /tb gt 0
  xcall dprompt tbdfreq tbdfreq "dFreq: "
elseif iset eq 12
  xcall menu item 0 "Waveform;^waves"
  if item gt 0 sedit waves wave parse item
endif
if mode eqs "RUN" 
  res mode "RERUN"
  stop
else
  callp dosets
endif
return

label lact
if iact eq 1 or iact eq 2
  res mode "RUN"
  stop
elseif iact eq 3
  xcall menu item 0 "Type;TD Line,TD Raster,FD Line,FD Raster,Histogram"
  if item eq 1
    xplot/bg ramfile ,,, abre
    if ramfile2 fexists xplot/bg ramfile2 ,,, abre
  elseif item eq 2
    xcall/prompt="FrameLength: " lval frame frame 0 128k 1
    xraster/bg ramfile ,,,, frame
  elseif item eq 3
    spectra ramfile ramspec nfft
    xplot/bg/all ramspec ,,, ablo
  elseif item eq 4
    ubiq ramfile ramspec nfft
    xraster/bg/all ramspec ,,, lo
  elseif item eq 5
    if "B" subs format
      histogram ramfile -128 127 256 real ramhist
      xplot/all ramhist
    else
!      histogram ramfile -32768 32767 64k real ramhist
      histogram ramfile -32768 32767-15 4k real ramhist
!      histogram ramfile -32768 32767-255 256 real ramhist
      xplot/all ramhist
    endif
  endif
elseif iact eq 4
  xcall prompt afname afname "Filename: "
  if afname eqs " " then
  elseif port eqs "MODULE1&2" then
    noop ramfile  ^{afname}_1
    noop ramfile2 ^{afname}_2
  else
    noop ramfile afname
  endif
  res afname " "
elseif iact eq 5
  xcall prompt afname afname "Filename: "
  if afname eqs " " return
  res mode "RUN"
  stop
elseif iact eq 6
  if wave eqs "FILE"
    xcall prompt afname afname "Filename: "
    if afname eqs " " return
  endif
  res mode "RUN"
  stop
elseif iact eq 7
  res mode "NM"
  stop
elseif iact eq 8
  stop
endif
return

label lgo
if igo ge 1 and igo le 3
  res w_1001 igo
!  message send "MGO" 11 igo 
elseif igo eq 4
  res w_1001 7
elseif igo eq 5 and iact eq 5
  xcall message "Cannot snapshot while archiving"
elseif igo eq 5 
  xcall prompt afname afname "Filename: "
  if afname eqs " " return
  message send "ARCHIVE" 11 0 3 s[80]dd afname 0 length
  message getwn "=ARCHIVE" ,, info
elseif igo eq 6 
  res itemdef 2
  if iact eq 5 res itemdef 1
  xcall menu item itemdef "Archiving;On,Off,OnIn5"
  if item eq itemdef return
  if item eq 2
    message send "ARCHSTOP" 11 0 0
    res l:iact 1
  else
    xcall prompt afname afname "Filename: "
    if afname eqs " " return
    if item eq 1
      message send "ARCHIVE" 11 0 3 s[80]dd afname 0 -1
    else
      timex now time
      message send "ARCHIVE" 11 0 3 s[80]dd afname time+5 0.8
    endif
    message getwn "=ARCHIVE" ,, info
    res l:iact 5
  endif
elseif igo eq 7
  stop
elseif igo eq 8
  switch "CHAN" l:ichan get
 loop 10
  calc sfreq ichan-1 tbdfreq * dfreq +
  message send "NFREQ" 11 ichan 1 d sfreq
  message getwn "=NFREQ" ,, info ,,, cfreq
  say "Actual freq of chan ^ichan is ^cfreq"
  res l:ichan ichan+1
 endloop
endif
return

label msg
message get /M/
return

procedure dosets
if /tb gt 0
xcontrol/over=1/lab=lset menu iset 0 "Cfg;&
  Port = ^port,Format = ^format,Rate = ^rate MHz,&
  Clock = ^clock,Length = ^length sec,Dec = ^dec,&
  Freq = ^freq MHz,Gain = ^gain,FFT Size = ^nfft,&
  PSD Rate = ^psdr Hz,PSD Avg = ^psda,DFreq = ^tbdfreq"
elseif /tsp gt 0
xcontrol/over=1/lab=lset menu iset 0 "Cfg;&
  Port = ^port,Format = ^format,Rate = ^rate MHz,&
  Clock = ^clock,Length = ^length sec,Dec = ^dec,&
  Freq = ^freq MHz,Gain = ^gain,Frame Size = ^nfft,&
  Frame Rate = ^psdr Hz,Frame Avg = ^psda,Wave = ^wave"
else
xcontrol/over=1/lab=lset menu iset 0 "Cfg;&
  Port = ^port,Format = ^format,Rate = ^rate MHz,&
  Clock = ^clock,Length = ^length sec,Dec = ^dec,&
  Freq = ^freq MHz,Gain = ^gain,FFT Size = ^nfft,&
  PSD Rate = ^psdr Hz,PSD Avg = ^psda,Wave = ^wave"
endif
callp setsnapset
return

procedure setsnapset
res snapset "^port,^format,^rate,^clock,^length,^dec,&
		^freq,^gain,^nfft,^psdr,^psda,^frame,^afname,^wave"
if nchan gt 1 then res snapset "^snapset,^tbdfreq"
return
endcontrols
