I am trying to queue some output data during a session. I am using s.startBackround() to collect data in real time and an event listener to queue some output data if a certain condition is met. The delay between when the queueOutputData() is called and the actual time when it outputs the data is about 40ms. I am trying to reduce this delay as much as possible. How can I do this? Is there a way to queue the output data before the function handle, and if it is in the function handle, immediately output this data?
Below is my code:
% initialize session
s = daq.createSession('ni');% analog inputs
addAnalogInputChannel(s,'Dev1', 'ai1', 'Voltage');addAnalogInputChannel(s,'Dev1', 'ai2', 'Voltage');addAnalogInputChannel(s,'Dev1', 'ai3', 'Voltage');% analog outputs
addAnalogOutputChannel(s,'Dev1', 'ao0', 'Voltage');s.Rate = 80000;% not sure how to not start background session without this
data0 = zeros(1,40001)';data0(end) = [];queueOutputData(s,repmat(data0, 5, 1));s.IsContinuous = true;% event listener where output data can be queued
lh = addlistener(s,'DataAvailable', @kick);s.startBackground();s.wait(1000);stop(s);
handle function:
function kick(src, event) % collects all data in single file
fp = fopen('DATA.bin', 'a'); X = event.Data; T = event.TimeStamps; fwrite(fp, [T, X]', 'double'); if (X(end,1) > 0 && X(end,1)<2.5) % row of zeros to determine when queueOutputData() was called
fwrite(fp,[0 0 0 0]','double'); % create and queue output data
outputSingleValue1 = 9; outputSignal = [outputSingleValue1*[0:0.01:1 1:-0.01:0] zeros(1,38000)]; outputSignal(end) = []; queueOutputData(src,outputSignal'); end fclose(fp); end
Best Answer