void RadioInterface::driveTransmitRadio(signalVector &radioBurst) { if (!mOn) return; USRPifyVector(radioBurst, sendBuffer+sendCursor, powerScaling); sendCursor += (radioBurst.size()*2); pushBuffer(); }
void RadioInterface::pushBuffer(void) { if (sendBuffer->size() < INCHUNK) { return; } int numChunks = sendBuffer->size()/INCHUNK; signalVector* truncatedBuffer = new signalVector(numChunks*INCHUNK); sendBuffer->segmentCopyTo(*truncatedBuffer,0,numChunks*INCHUNK); if (!sendLPF) { int P = OUTRATE; int Q = INRATE; float cutoffFreq = (P < Q) ? (1.0/(float) Q) : (1.0/(float) P); sendLPF = createLPF(cutoffFreq,651,P); } // resample data to USRP sample rate signalVector *inputVector = new signalVector(*sendHistory,*truncatedBuffer); signalVector *resampledVector = polyphaseResampleVector(*inputVector, OUTRATE, INRATE,sendLPF); delete inputVector; // Set transmit gain and power here. scaleVector(*resampledVector, usrp->fullScaleInputValue()); short *resampledVectorShort = USRPifyVector(*resampledVector); // start the USRP when we actually have data to send to the USRP. if (!started) { started = true; LOG(INFO) << "Starting USRP"; usrp->start(); LOG(DEBUG) << "USRP started"; usrp->updateAlignment(10000); usrp->updateAlignment(10000); } // send resampleVector writingRadioLock.lock(); int samplesWritten = usrp->writeSamples(resampledVectorShort+OUTHISTORY*2, (resampledVector->size()-OUTHISTORY), &underrun, writeTimestamp); //LOG(DEEPDEBUG) << "writeTimestamp: " << writeTimestamp << ", samplesWritten: " << samplesWritten; writeTimestamp += (TIMESTAMP) samplesWritten; wroteRadioSignal.signal(); writingRadioLock.unlock(); LOG(DEEPDEBUG) << "converted " << truncatedBuffer->size() << " transceiver samples into " << samplesWritten << " radio samples "; delete resampledVector; delete []resampledVectorShort; // update the history of sent data truncatedBuffer->segmentCopyTo(*sendHistory,truncatedBuffer->size()-INHISTORY, INHISTORY); // update the buffer, i.e. keep the samples we didn't send signalVector *tmp = sendBuffer; sendBuffer = new signalVector(sendBuffer->size()-truncatedBuffer->size()); tmp->segmentCopyTo(*sendBuffer,truncatedBuffer->size(), sendBuffer->size()); delete tmp; delete truncatedBuffer; }