!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! 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