!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! SD360 - Spectral Dynamics NeXtMidas Macro
!
! @author Jeff Schoen
! @version $Id: sd360.mm,v 1.23 2002/08/13 05:00:20 schoenj Exp $
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
startmacro/msgid=main d:samples l:port s:remote

timer set
pipe init /panel

set gc reg.panel.controls
set sr 1e5
gc label macro "SD360"
set l:pktsize 3
set over 0

if /server gt 0

  waveform _wave sf samples sin freq=sr/10 amp=1e4 delta=1/sr
  fft/mag/log _wave _waveb nfft=1k over=over
  rmif port sfreq|_waveb /ppt={RETRY=2,TIMEPING=3} 
  gc choice state "State   " "Stop"

elseif /client gt 0

  rmif/http port 
  plot/id=plot1/nice _waveb cnt=motion type=line y1=-100 y2=80 
  plot/id=plot2/nice _waveb cnt=click z1=-100 z2=80 
  gc button state "" "Open,Close,Exit" 2
  gc dvalue sfreq "SineFreq" 0 -sr sr sr/20 /msg=F
  gc dvalue cfreq "CentFreq" 0 -sr sr sr/20 /msg=F
  gc choice test  "Test    " "Get,Set,Reset,Ping,Keys,Send,Recv,PktSize"
  gc choice comp  "Compress" "Off,Data,Plot" 1
  gc dvalue linkbw  "Link BW " 0 0 128e3 1 /edit=0 /fmt="###.### ?by/s"
  gc lvalue linklat "Link Lat" 0 0 100000 1 /edit=0 /fmt="##### msec"

else	! local version

  waveform _wave sf samples sin freq=sr/10 amp=1e4 delta=1/sr
  fft/mag/dbf _wave _waveb nfft=1k navg=1 over=over
  plot/id=plot1/nice _waveb{cl=8} cnt=motion type=line y1=-100 y2=80 
  plot/id=plot2/nice _waveb cnt=click z1=-100 z2=80 /lpb=16
  gc button state "" "Run,Pause,Exit" 1
  gc choice shape "Shape   " reg.waveform.shapeList 1
  gc choice wind  "Window  " reg.fft.windowList 2
  gc dvalue sfreq "SineFreq" sfreq -sr sr sr/20 /mon=reg.waveform.freq /msg=F
  gc dvalue cfreq "CentFreq" cfreq -sr sr sr/20 /mon=reg.waveform.freq /msg=F
  gc choice fftsz "FFT Size" "250,512,768,1K,2000,2K,4000,4K,8K," "1K"
  gc dvalue over  "Overlap " over 0 1 .1 /mon=reg.fft.over /msg=F
  gc choice form  "Format  " "SF,CF,SI,CI" "SF"

endif

if reg.plot1 rexists	 !  Add marker to psd plot
  new "nxm.sys.libg.Feature" mark1 &
	{TYPE=0x18000,NAME=MARK,COLOR=YELLOW,ENABLE=1,X=SR/10}
  set reg.plot1.addfeature mark1
endif

gc label  debug "Debug" 0
gc choice tests "Test    " "PopUp,Active,Procedure,Subroutine"
gc pipemon pmon _waveb

set reg.panel.timer1 2
if /server le 0 and /client le 0 pipe waitfor waveform
pipe off

timer elapse

endmacro


procedure processMessage

!say "Msg ^msg.name = ^msg.data"

if msg.name eqs "TIMER1"
  if reg.rmif rexists  ! /server or /client
    set gc.LINKBW.value reg.rmif.linkBW
    set gc.LINKLAT.value reg.rmif.linkLatency
  endif

elseif msg.name eqs "STATE"
 if msg.data eqs "EXIT"
  pipe stop
 elseif msg.data eqs "PAUSE"
  pipe pause
 elseif msg.data eqs "RUN"
  pipe wait
 elseif msg.data eqs "OPEN"
  message send RMIF ,, "OPEN" ,, {ID=XM,HP=^remote} 
  message sync RMIF
  message send XM ,, "ADDC" 1 {_WAVEB=_WAVEB}
  message send XM ,, "ADDC" 2 SFREQ
  message send XM ,, "ADDC" 3 CFREQ
  message send XM ,, "GET" ,, {SFREQ=?,CFREQ=?}
 elseif msg.data eqs "CLOSE"
  message send XM ,, "DELC" 1
  message send XM ,, "CLOSE"  
 endif

elseif msg.name eqs "TEST"
 if msg.data eqs "PING"
  message send XM ,, PING
 elseif msg.data eqs "GET"
  message send XM ,, GET ,, {SFREQ=,CFREQ=,FWIDTH=}
 elseif msg.data eqs "SET"
  message send XM ,, SET ,, {SFREQ=0.251,CFREQ=0.25,FWIDTH=0.2}
 elseif msg.data eqs "RESET"
  message send XM ,, SET ,, {SFREQ=0.01,CFREQ=0,FWIDTH=1}
 elseif msg.data eqs "KEYS"
  message send XM ,, KEYS
 elseif msg.data eqs "SEND"
  message send XM ,, "TESTLINK" pktsize
 elseif msg.data eqs "RECV"
  message send XM ,, "TESTLINK" -pktsize
 elseif msg.data eqs "PKTSIZE"
  gc/temp menu pktsize "PktSize" "2,4,8,16,32,64,128,256,512,1K,2K,4K,8K,16K,32K" pktsize
 endif
elseif msg.name eqs "TESTS"
 if msg.data eqs "POPUP"
  gc/win=panel.win/wait prompt timeup "Time Up: " 
  gc/win=panel.win/wait prompt duration "Duration: " 
 elseif msg.data eqs "ACTIVE"
  set gc.DEBUG.active 0
 elseif msg.data eqs "PROCEDURE"
  call testproc 1 2 3
 elseif msg.data eqs "SUBROUTINE"
  call testsub 1 2 3 msg
 endif

elseif msg.name eqs "PKTSIZE"
  set l:pktsize ^msg.info

elseif msg.name eqs "WIND"
  set reg.fft.window msg.data

elseif msg.name eqs "SHAPE"
  set reg.waveform.shape msg.data

elseif msg.name eqs "FFTSZ"
  set reg.fft.nfft ^msg.data

elseif msg.name eqs "FORM"
  set reg.waveform.format msg.data

elseif msg.fid eqss "PLOT" then
  res fid msg.fid
  if fid eqs "PLOT1"
    res toid "PLOT2"
  else
    res toid "PLOT1"
  endif
  if msg.name eqs "POINTER"
    message prune ,, msg
    res msg.name "MARK"
  endif
  if msg.name eqs "MARK" then
    set mark1.x ^msg.data.x	 ! Update plot marker
    if /client le 0
      res reg.waveform.freq msg.data.x
    elseif reg.xm.status neqs "OPENED"
    elseif msg.fid eqs "PLOT1"
      message send xm ,, SET ,, {SFREQ=^msg.data.x}
    elseif msg.fid eqs "PLOT2"
      message send xm ,, SET ,, {SFREQ=^msg.data.x,CFREQ=^msg.data.x,FWIDTH=0.2}
    endif
  elseif msg.name eqs "ZOOM" then
    res msg.name "ZOOMX"
    message pass ^toid msg
  elseif msg.name eqs "UNZOOM" then
    message pass ^toid msg
  elseif "PANX" subs msg.name then
    res msg.name "PANX"
    message pass ^toid msg
  endif
  if msg.name neqs "MARK" and /client gt 0 and reg.xm.status eq "OPENED"
    set tmp reg.^fid
    message send XM ,, "MODIFY" ,, &
        {PROPERTY=_WAVEB,TRIM1=^tmp.x1i,TRIM2=^tmp.x2i}
    say "Trimming to ^tmp.x1i ^tmp.x2i"
  endif

elseif msg.name eqs "COMP"
  set l:tmp1 gc.COMP.item-1
  set l:tmp2 reg.PLOT1.ix21
  info "Setting compression = ^tmp1 with plotwidth = ^tmp2"
  message send XM ,, "MODIFY" ,, {PROPERTY=_WAVEB,COMP=^tmp1,PLOTWIDTH=^tmp2}

elseif msg.fid eqss "RMI" then
  if msg.name eqs "GET" then
    message send rmif ,, RET msg.info msg.data
  elseif msg.name eqs "RET" then
    foreach key intable msg.data
      say "Key ^key = ^msg.data.^key"
    endfor
  elseif msg.name eqs "LINKERR" then
    say "LinkErr = ^msg.data"
  else
    say "Unhandled RMIF message ^msg.name"
  endif

elseif msg.fid eqss "XM" then
  foreach key intable msg.data
    set gc.^{key}.value msg.data.^key
  endfor

else
  say "Unhandled message ^msg.name = ^msg.data from ^msg.fid"
endif
return

procedure testproc pa1 pa2 pa3
say "Called TESTPROC ^pa1 ^pa2 ^pa3
res
return

subroutine testsub l:pa1 l:pa2 l:pa3 o:pa4
say "Called TESTSUB ^pa1 ^pa2 ^pa3
res
return