void BinaryDataHandler::get(void *dst, UInt32 size) { MemoryHandle data = static_cast<MemoryHandle>(dst); if(_zeroCopyThreshold && size >= _zeroCopyThreshold) { if(_zeroCopyThreshold > 1) { UInt8 tag; // we have to read the tag, to force reading of data blocks // if the first data field was zero copied get(&tag, sizeof(tag)); } // read direct into destination read(data, size); } else { UInt32 copySize; while(size != 0) { // read new data if nothing left if(_currentReadBuffer == readBufEnd()) { pullBuffer(); } // num bytes to copy copySize = osgMin((_currentReadBuffer->getDataSize() - _currentReadBufferPos), size); // no data in buffer ? if(copySize != 0) { memcpy( data, _currentReadBuffer->getMem() + _currentReadBufferPos, copySize); size -= copySize; _currentReadBufferPos += copySize; data += copySize; } // skip to next buffer if current buffer is full if(_currentReadBufferPos == _currentReadBuffer->getDataSize()) { _currentReadBuffer++; _currentReadBufferPos = 0; } } } }
bool RadioInterface::driveReceiveRadio() { radioVector *burst = NULL; if (!mOn) return false; pullBuffer(); GSM::Time rcvClock = mClock.get(); rcvClock.decTN(receiveOffset); unsigned tN = rcvClock.TN(); int recvSz = recvBuffer[0]->getAvailSamples(); const int symbolsPerSlot = gSlotLen + 8; int burstSize; if (mSPSRx == 4) burstSize = 625; else burstSize = symbolsPerSlot + (tN % 4 == 0); /* * Pre-allocate head room for the largest correlation size * so we can later avoid a re-allocation and copy * */ size_t head = GSM::gRACHSynchSequence.size(); /* * Form receive bursts and pass up to transceiver. Use repeating * pattern of 157-156-156-156 symbols per timeslot */ while (recvSz > burstSize) { for (size_t i = 0; i < mChans; i++) { burst = new radioVector(rcvClock, burstSize, head, mMIMO); for (size_t n = 0; n < mMIMO; n++) unRadioifyVector(burst->getVector(n), i); if (mReceiveFIFO[i].size() < 32) mReceiveFIFO[i].write(burst); else delete burst; } mClock.incTN(); rcvClock.incTN(); recvSz -= burstSize; tN = rcvClock.TN(); if (mSPSRx != 4) burstSize = (symbolsPerSlot + (tN % 4 == 0)) * mSPSRx; } return true; }
QGst::FlowReturn OdometrySink::newBuffer() { QGst::BufferPtr buffer = pullBuffer(); if (buffer) { } return QGst::FlowOk; }
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; }
bool RadioInterface::driveReceiveRadio() { radioVector *burst = NULL; if (!mOn) return false; pullBuffer(); GSM::Time rcvClock = mClock.get(); rcvClock.decTN(receiveOffset); unsigned tN = rcvClock.TN(); int recvSz = recvCursor; int readSz = 0; const int symbolsPerSlot = gSlotLen + 8; int burstSize = (symbolsPerSlot + (tN % 4 == 0)) * mSPSRx; /* * Pre-allocate head room for the largest correlation size * so we can later avoid a re-allocation and copy * */ size_t head = GSM::gRACHSynchSequence.size(); /* * Form receive bursts and pass up to transceiver. Use repeating * pattern of 157-156-156-156 symbols per timeslot */ while (recvSz > burstSize) { for (size_t i = 0; i < mChans; i++) { burst = new radioVector(rcvClock, burstSize, head, mMIMO); for (size_t n = 0; n < mMIMO; n++) { unRadioifyVector((float *) (recvBuffer[mMIMO * i + n]->begin() + readSz), *burst->getVector(n)); } if (mReceiveFIFO[i].size() < 32) mReceiveFIFO[i].write(burst); else delete burst; } mClock.incTN(); rcvClock.incTN(); readSz += burstSize; recvSz -= burstSize; tN = rcvClock.TN(); burstSize = (symbolsPerSlot + (tN % 4 == 0)) * mSPSRx; } if (readSz > 0) { for (size_t i = 0; i < recvBuffer.size(); i++) { memmove(recvBuffer[i]->begin(), recvBuffer[i]->begin() + readSz, (recvCursor - readSz) * 2 * sizeof(float)); } recvCursor -= readSz; } return true; }