% test / example MATLAB program for DirectDSP® software
% shows hardware selector, opens Hypersignal program as DSP engine, initializes
% selected board, creates figure window, and displays analog input buffers in the window
% jhb, 29 FEB 96
load windows.con -mat % misc. constants used by DirectDSP test and example programs
load enmgr.con -mat % Engine Manager DLL constants
load hwlib.con -mat % Hardware Library DLL constants
% initialize flags
fCanceled = FALSE; % result of hardware selector dialog
hEngine = NULL; % engine handle
hBoard = NULL; % board handle
fBoardInitialized = FALSE; % board status
ShowStat; % turn on debug status window in Engine Manager
% show hardware selector dialog box ("Hardware Manager"); returns board designator
% string selected by user
% note: if hardware choice is fixed, then skip this call and use correct board designator
% string in AssignBoard call below
[fSelect, BoardStr] = ShowHwSelector(NULL);
if (fSelect == IDCANCEL) % user canceled?
return;
end
% open dsp engine
hEngine = EngineOpen(DS_EO_HSM, NULL, NULL); % first try to open Hypersignal-Macro
(or Macro EX) as engine
if (hEngine == NULL)
hEngine = EngineOpen(DS_EO_HSA, NULL, NULL); % if that doesn't work, try
Hypersignal-Acoustic
if (hEngine == NULL)
errstr = ['EngineOpen failed; error code = ' num2str(GetHwLibErrStat)];
disp(errstr);
return; % abort
end
end
% assign a board handle: engine handle, board designator string, instruction set,
IO base addr, Mem base addr
hBoard = AssignBoard(hEngine, BoardStr, NULL, NULL, NULL); % NULL == use defaults where
possible
% initialize the board; make sure it's installed and responding
fBoardInitialized = InitBoard(hBoard);
if (fBoardInitialized == FALSE)
errstr = ['InitBoard failed; error code = ' num2str(GetEngErrStat(hEngine))];
disp(errstr);
if (hBoard ~= NULL)
FreeBoard(hBoard);
end
if (hEngine ~= NULL)
EngineClose(hEngine);
end
return; % abort
end
% load executable DSP code file (usually a COFF file produced by DSP manufacturer's
linker)
if (LoadProcessor(hBoard, NULL, 1) == NULL) % load default file for the board type
(processor 0 only)
errstr = ['LoadProcessor failed; error code = ' num2str(GetEngErrStat(hEngine))];
disp(errstr);
if (hBoard ~= NULL)
FreeBoard(hBoard);
end
if (hEngine ~= NULL)
EngineClose(hEngine);
end
return; % abort
end
% prepare hardware and data transfer values, allocate memory to receive buffers
BufNum = 0; % start with buffer 0
BufSize = 1024; % default buffer size
NumChan = 1;
BoardClass = GetClass(hBoard); % board classification
MemArch = GetMemArch(hBoard); % board memory architecture
TimBaseAddr = GetDSPPropert(hBoard, DSP_TIMDATAADDR); % base address of board mem.
% calculate actual samping frequency, because most hardware allows only certain
% possibilities; return values include a "mode" suitable for programming the hardware
% and the actual value allowed, in Hz
[FsMode, FsActual] = CalcSampFreq(hBoard, 22050, NumChan, NULL); % default is 1 channel,
Fs = 22.05 kHz
buf = zeros(1, BufSize); % allocate buffer memory
% write values to DSP code on board
ResetBoard(hBoard); % reset board (should already be in reset state)
PutDSPProperty(hBoard, DSP_BOARDCLASS, rem(BoardClass, 256)); % main type in low byte
PutDSPProperty(hBoard, DSP_BOARDSUBCLASS, fix(BoardClass/256)); % subtype in high byte
PutDSPProperty(hBoard, DSP_OPMODE, 2); % use Digital Scope (frame) mode (mode
value == 2)
PutDSPProperty(hBoard, DSP_FILTTYPE1, 0); % disable trace 1 real-time filter
PutDSPProperty(hBoard, DSP_FILTTYPE2, 0); % disable trace 2 real-time filter
PutDSPProperty(hBoard, DSP_TRIGLEVEL, 0); % free-run triggering
PutDSPProperty(hBoard, DSP_TRIGCHANLIST, 0);
PutDSPProperty(hBoard, DSP_BUFLEN, BufSize); % buffer size
PutDSPProperty(hBoard, DSP_HOSTBUFNUM, 0);
PutDSPProperty(hBoard, DSP_BUFNUM, 0);
PutDSPProperty(hBoard, DSP_CHANLIST, 0); % channel list
PutDSPProperty(hBoard, DSP_NUMCHAN, NumChan); % number of channels
PutDSPProperty(hBoard, DSP_GAINLIST, 0); % gain list
PutDSPProperty(hBoard, DSP_FSMODE, FsMode); % sampling rate control register (mode
value)
PutDSPProperty(hBoard, DSP_FSVALUE, FsActual); % actual sampling rate (in Hz)
% create figure window, axis
hFig = figure;
axis([0, BufSize-1, -32767, 32767]);
% Start board and wait for analog input buffer. Note SYNC flag, which causes
% program to wait until buffer is complete; async. processing (the preferred
% method), requires a callback window handle to process buffers as they become
% ready (see RegMsgWnd function).
RunProcessor(hBoard, 1); % run; processor #1 only
WaitForBuffer(hBoard, BufNum, NULL, DS_WFB_POLLED | DS_WFB_SYNC);
if (GetMemArch(hBoard) == DS_GMA_VECTOR) % board has vector memory architecture
if (BufNum == 0)
Status = GetMem(hBoard, DS_GM_VECTOR_DATA_X, TimBaseAddr, DS_GM_SIZE16_CVT,
buf, BufSize);
else
Status = GetMem(hBoard, DS_GM_VECTOR_DATA_Y, TimBaseAddr, DS_GM_SIZE16_CVT,
buf, BufSize);
end
else % board has linear or Harvard memory architecture
Status = GetMem(hBoard, DS_GM_LINEAR_DATA_RT, TimBaseAddr+BufNum*BufSize,
DS_GM_SIZE16_CVT, buf, BufSize);
end
if (Status == NULL)
errstr = ['problem with GetMem; error code = ' num2str(GetEngErrStat(hEngine))];
disp(errstr);
end
% draw buffer data
plot(buf);
% done; leave board in disabled state, clean up handles, engines
if (fBoardInitialized == TRUE)
DisableBoard(hBoard);
end
if (hBoard ~= NULL)
FreeBoard(hBoard);
end
if (hEngine ~= NULL)
EngineClose(hEngine);
end