void RadioInterface::driveReceiveRadio() { if (!mOn) return; if (mReceiveFIFO.size() > 8) return; pullBuffer(); GSM::Time rcvClock = mClock.get(); rcvClock.decTN(receiveOffset); unsigned tN = rcvClock.TN(); int rcvSz = rcvCursor; int readSz = 0; const int symbolsPerSlot = gSlotLen + 8; // while there's enough data in receive buffer, form received // GSM bursts and pass up to Transceiver // Using the 157-156-156-156 symbols per timeslot format. while (rcvSz > (symbolsPerSlot + (tN % 4 == 0))*samplesPerSymbol) { signalVector rxVector((symbolsPerSlot + (tN % 4 == 0))*samplesPerSymbol); unRadioifyVector(rcvBuffer+readSz*2,rxVector); GSM::Time tmpTime = rcvClock; if (rcvClock.FN() >= 0) { //LOG(DEBUG) << "FN: " << rcvClock.FN(); radioVector *rxBurst = NULL; if (!loadTest) rxBurst = new radioVector(rxVector,tmpTime); else { if (tN % 4 == 0) rxBurst = new radioVector(*finalVec9,tmpTime); else rxBurst = new radioVector(*finalVec,tmpTime); } mReceiveFIFO.put(rxBurst); } mClock.incTN(); rcvClock.incTN(); //if (mReceiveFIFO.size() >= 16) mReceiveFIFO.wait(8); //LOG(DEBUG) << "receiveFIFO: wrote radio vector at time: " << mClock.get() << ", new size: " << mReceiveFIFO.size() ; readSz += (symbolsPerSlot+(tN % 4 == 0))*samplesPerSymbol; rcvSz -= (symbolsPerSlot+(tN % 4 == 0))*samplesPerSymbol; tN = rcvClock.TN(); } if (readSz > 0) { rcvCursor -= readSz; memmove(rcvBuffer,rcvBuffer+2*readSz,sizeof(float) * 2 * rcvCursor); } }
void RadioInterface::driveReceiveRadio() { pullBuffer(); if (!rcvBuffer) { return;} GSM::Time rcvClock = mClock.get(); rcvClock.decTN(receiveOffset); unsigned tN = rcvClock.TN(); int rcvSz = rcvBuffer->size(); int readSz = 0; const int symbolsPerSlot = gSlotLen + 8; // while there's enough data in receive buffer, form received // GSM bursts and pass up to Transceiver // Using the 157-156-156-156 symbols per timeslot format. while (rcvSz > (symbolsPerSlot + (tN % 4 == 0))*samplesPerSymbol) { signalVector rxVector(rcvBuffer->begin(), readSz, (symbolsPerSlot + (tN % 4 == 0))*samplesPerSymbol); GSM::Time tmpTime = rcvClock; if (rcvClock.FN() >= 0) { LOG(DEEPDEBUG) << "FN: " << rcvClock.FN(); radioVector* rxBurst = new radioVector(rxVector,tmpTime); mReceiveFIFO.write(rxBurst); } mClock.incTN(); rcvClock.incTN(); if (mReceiveFIFO.size() >= 16) mReceiveFIFO.wait(8); LOG(DEEPDEBUG) << "receiveFIFO: wrote radio vector at time: " << mClock.get() << ", new size: " << mReceiveFIFO.size() ; readSz += (symbolsPerSlot+(tN % 4 == 0))*samplesPerSymbol; rcvSz -= (symbolsPerSlot+(tN % 4 == 0))*samplesPerSymbol; tN = rcvClock.TN(); } signalVector *tmp = new signalVector(rcvBuffer->size()-readSz); rcvBuffer->segmentCopyTo(*tmp,readSz,tmp->size()); delete rcvBuffer; rcvBuffer = tmp; }