/*******************************************************************************
* Da8150.cpp Da8150 output classes
* T.Barnaby, BEAM Ltd, 2007-01-23
*******************************************************************************
*/
#include <Da8150.h>
#include <math.h>
#ifdef HAVE_DA8150
#include <da8150_lib.h>
#endif
Da8150::Da8150(){
osampleRate = 150000000;
onumChannels = 8;
ocardNum = 1;
}
Da8150::~Da8150(){
close();
}
BError Da8150::config(double sampleRate, int numChannels){
BError err;
osampleRate = sampleRate;
onumChannels = numChannels;
if(osampleRate != 150000000)
return err.set(1, "Error can only handle a sample rate of 150000000Hz\n");
#ifdef HAVE_DA8150
if(da8150_Open(ocardNum)){
return err.set(1, "Error unable to open DA8150\n");
}
da8150_SetClock(ocardNum, 150000000);
#else
err.set(1, "No DA8150 support");
#endif
return err;
}
void Da8150::close(){
#ifdef HAVE_DA8150
da8150_Close(ocardNum);
#endif
}
BError Da8150::expand(BSignalList& sigs, BSignalList& newSigs){
BError err;
BIter i;
uint32_t nr;
uint32_t n;
BSignal sig;
uint32_t id = 0;
uint32_t nextId = 0;
newSigs.clear();
for(sigs.start(i); !sigs.isEnd(i); sigs.next(i)){
sig = sigs[i];
nr = sig.numRepeat;
if(nr){
nextId = sig.nextId;
while(nr){
n = nr;
if(n > 16383)
n = 16383;
nr -= n;
sig.numRepeat = n;
sig.id = id++;
if((nextId == 0) && (nr == 0))
sig.nextId = nextId;
else
sig.nextId = id;
newSigs.append(sig);
}
}
else {
sig.id = id++;
if(sig.nextId)
sig.nextId = id;;
newSigs.append(sig);
}
}
return err;
}
BError Da8150::output(BSignalList& sigs){
BError err;
BSignalList newSigs;
if(err = expand(sigs, newSigs))
return err;
return rawOutput(newSigs);
}
BError Da8150::rawOutput(BSignalList& sigs){
BError err;
#ifdef HAVE_DA8150
BIter i;
int s;
int c;
Da8150Segment segs[sigs.number()];
unsigned int n;
uint16_t* data[sigs.number()];
// printf("Da8150::rawOutput: %d\n", sigs.number());
for(c = 0; c < 8; c++){
for(sigs.start(i), n = 0; !sigs.isEnd(i); sigs.next(i), n++){
#ifndef ZAP
if(c == 0)
printf("Add DataSegment: %d NumSamples: %d Repeat: %d Next: %d\n", n, sigs[i].numSamples, sigs[i].numRepeat, sigs[i].nextId);
#endif
data[n] = new uint16_t[sigs[i].numSamples];
segs[n].segmentNum = sigs[i].id;
segs[n].data = data[n];
segs[n].numPoints = sigs[i].numSamples;
if(n == (sigs.number() - 1))
segs[n].numLoops = sigs[0].numRepeat;
else
segs[n].numLoops = sigs[n+1].numRepeat;
segs[n].beginPadValue = 2047;
segs[n].endPadValue = 2047;
segs[n].trigEnable = 0;
segs[n].nextSegNum = sigs[i].nextId;
for(s = 0; s < sigs[i].numSamples; s++){
data[n][s] = 2047 - short(sigs[i].data[c][s] * 2047.0);
}
}
da8150_CreateSegments(ocardNum, 1 << c, sigs.number(), segs);
for(n = 0; n < sigs.number(); n++){
delete [] data[n];
}
}
da8150_SetTriggerMode(ocardNum, D8150_MODE_RUN, D8150_TRIG_POS);
#else
err.set(1, "No DA8150 support");
#endif
return err;
}
BError Da8150::output(BSignal& sig){
BSignalList sigList;
sigList.append(sig);
return output(sigList);
}