1 | function [rawData] = warplab_readSMRO_fast(udpSock, SMRO_id, numSamples) |
---|
2 | |
---|
3 | pktNoTx = 1; |
---|
4 | |
---|
5 | % rxCmd = eval(sprintf('RADIO%d_RXDATA', radio)); |
---|
6 | % rssiCmd = eval(sprintf('RADIO%d_RSSIDATA', radio)); |
---|
7 | |
---|
8 | %Read the raw samples from the selected SMRO |
---|
9 | rawData = zeros(1,2^12); %2^14 / 4 return values |
---|
10 | |
---|
11 | % pktDataTx = [pktNoTx SMRO_id n]; |
---|
12 | % datarec = warplab_pktSend(udpSock, pktDataTx); |
---|
13 | |
---|
14 | |
---|
15 | %Set the bulk transfer request |
---|
16 | %This will return an integral number of UDP packets, each containing 256 samples |
---|
17 | %Argument 3 defines the first "block" of 256 samples to return (indexed from 0) |
---|
18 | %Argument 4 defines the number of blocks to return |
---|
19 | %Argument 5 defines the inter-packet delay imposed by the FPGA |
---|
20 | pktDataTx = [pktNoTx SMRO_id 0 ceil(numSamples/256) 0]; |
---|
21 | |
---|
22 | %Use the new pnet command to receive all the packets in one call, returning a single vector with all 2^14 samples |
---|
23 | rawData = pnet(udpSock, 'bulkRxBuff', int32(pktDataTx)); |
---|
24 | |
---|
25 | %Each packet contains 256 samples, preceded by 4 control values: |
---|
26 | %[pktNum ACK command sampOffset] |
---|
27 | %sampOffset is the sample number (zero indexed) of the first sample in that packet |
---|
28 | pktStarts = 1:260:length(rawData); |
---|
29 | |
---|
30 | %Extract the sampOffset values from every received packet |
---|
31 | receivedOffsets = rawData(pktStarts + 3); |
---|
32 | if(sum(receivedOffsets) ~= sum(0:256:numSamples-1)) %does this handle all cases of numSamples?! |
---|
33 | %if(~isempty(setdiff(receivedOffsets, [1:256:length(rawData)]))) |
---|
34 | %Error! At least one sampOffset is missing |
---|
35 | %Start an old-fashioned 1-by-1 download and return that |
---|
36 | %Assumes non-bulk CMD ID is 100 less (in warplab_defines.m) |
---|
37 | rawData = warplab_readSMRO(udpSock, (SMRO_id-100), numSamples); |
---|
38 | return; |
---|
39 | end |
---|
40 | |
---|
41 | valsToIngore = [pktStarts pktStarts+1 pktStarts+2 pktStarts+3]; |
---|
42 | rawData = rawData(setdiff([1:length(rawData)], valsToIngore)); |
---|
43 | |
---|
44 | if(numSamples < length(rawData)) |
---|
45 | rawData = rawData(1:numSamples); |
---|
46 | end |
---|