Transceiver52M: Add vectorized radio burst capability

This patch allows multiple signalVectors to be stored within
a single radioVector object. The motivation is to provide
a facility for diversity and/or MIMO burst handling. When
no channel value is specified, single channel bevhaviour
is maintained.

Signed-off-by: Thomas Tsou <tom@tsou.cc>
This commit is contained in:
Thomas Tsou 2013-11-13 22:48:11 -05:00
parent e1ce92599a
commit a2fe91a688
5 changed files with 62 additions and 26 deletions

View File

@ -165,23 +165,23 @@ bool Transceiver::init()
return true;
}
void Transceiver::addRadioVector(size_t chan, BitVector &burst,
void Transceiver::addRadioVector(size_t chan, BitVector &bits,
int RSSI, GSM::Time &wTime)
{
signalVector *burst;
radioVector *radio_burst;
if (chan >= mTxPriorityQueues.size()) {
LOG(ALERT) << "Invalid channel " << chan;
return;
}
// modulate and stick into queue
signalVector* modBurst = modulateBurst(burst,
8 + (wTime.TN() % 4 == 0),
mSPSTx);
scaleVector(*modBurst,txFullScale * pow(10,-RSSI/10));
radioVector *newVec = new radioVector(*modBurst,wTime);
mTxPriorityQueues[chan].write(newVec);
burst = modulateBurst(bits, 8 + (wTime.TN() % 4 == 0), mSPSTx);
scaleVector(*burst, txFullScale * pow(10, -RSSI / 10));
delete modBurst;
radio_burst = new radioVector(wTime, burst);
mTxPriorityQueues[chan].write(radio_burst);
}
void Transceiver::pushRadioVector(GSM::Time &nowTime)
@ -202,7 +202,9 @@ void Transceiver::pushRadioVector(GSM::Time &nowTime)
modFN = burst->getTime().FN() % state->fillerModulus[TN];
delete state->fillerTable[modFN][TN];
state->fillerTable[modFN][TN] = burst;
state->fillerTable[modFN][TN] = burst->getVector();
burst->setVector(NULL);
delete burst;
}
TN = nowTime.TN();
@ -213,8 +215,10 @@ void Transceiver::pushRadioVector(GSM::Time &nowTime)
if ((burst = mTxPriorityQueues[i].getCurrentBurst(nowTime))) {
delete state->fillerTable[modFN][TN];
state->fillerTable[modFN][TN] = burst;
bursts[i] = burst;
state->fillerTable[modFN][TN] = burst->getVector();
bursts[i] = burst->getVector();
burst->setVector(NULL);
delete burst;
}
}
@ -346,7 +350,7 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime, int &RSSI,
return NULL;
}
signalVector *vectorBurst = rxBurst;
signalVector *vectorBurst = rxBurst->getVector();
energyDetect(*vectorBurst, 20 * mSPSRx, 0.0, &avg);

View File

@ -118,7 +118,7 @@ private:
noiseVector mNoises; ///< Vector holding running noise measurements
/** modulate and add a burst to the transmit queue */
void addRadioVector(size_t chan, BitVector &burst,
void addRadioVector(size_t chan, BitVector &bits,
int RSSI, GSM::Time &wTime);
/** Push modulated burst into transmit FIFO corresponding to a particular timestamp */

View File

@ -251,9 +251,11 @@ bool RadioInterface::driveReceiveRadio()
*/
while (recvSz > burstSize) {
for (size_t i = 0; i < mChans; i++) {
burst = new radioVector(burstSize, head, rcvClock);
burst = new radioVector(rcvClock, burstSize, head);
unRadioifyVector((float *) (recvBuffer[i]->begin() + readSz),
*burst->getVector());
unRadioifyVector((float *) (recvBuffer[i]->begin() + readSz), *burst);
if (mReceiveFIFO[i].size() < 32)
mReceiveFIFO[i].write(burst);
else

View File

@ -21,19 +21,24 @@
#include "radioVector.h"
radioVector::radioVector(const signalVector& wVector, GSM::Time& wTime)
: signalVector(wVector), mTime(wTime)
radioVector::radioVector(GSM::Time &time, size_t size,
size_t start, size_t chans)
: vectors(chans), mTime(time)
{
for (size_t i = 0; i < vectors.size(); i++)
vectors[i] = new signalVector(size, start);
}
radioVector::radioVector(size_t size, GSM::Time& wTime)
: signalVector(size), mTime(wTime)
radioVector::radioVector(GSM::Time& wTime, signalVector *vector)
: vectors(1), mTime(wTime)
{
vectors[0] = vector;
}
radioVector::radioVector(size_t size, size_t start, GSM::Time& wTime)
: signalVector(size, start), mTime(wTime)
radioVector::~radioVector()
{
for (size_t i = 0; i < vectors.size(); i++)
delete vectors[i];
}
GSM::Time radioVector::getTime() const
@ -51,6 +56,24 @@ bool radioVector::operator>(const radioVector& other) const
return mTime > other.mTime;
}
signalVector *radioVector::getVector(size_t chan)
{
if (chan >= vectors.size())
return NULL;
return vectors[chan];
}
bool radioVector::setVector(signalVector *vector, size_t chan)
{
if (chan >= vectors.size())
return false;
vectors[chan] = vector;
return true;
}
noiseVector::noiseVector(size_t n)
{
this->resize(n);

View File

@ -26,16 +26,23 @@
#include "GSMCommon.h"
#include "Interthread.h"
class radioVector : public signalVector {
class radioVector {
public:
radioVector(const signalVector& wVector, GSM::Time& wTime);
radioVector(size_t size, GSM::Time& wTime);
radioVector(size_t size, size_t start, GSM::Time& wTime);
radioVector(GSM::Time& wTime, size_t size = 0,
size_t start = 0, size_t chans = 1);
radioVector(GSM::Time& wTime, signalVector *vector);
~radioVector();
GSM::Time getTime() const;
void setTime(const GSM::Time& wTime);
bool operator>(const radioVector& other) const;
signalVector *getVector(size_t chan = 0);
bool setVector(signalVector *vector, size_t chan = 0);
size_t chans() const { return vectors.size(); }
private:
std::vector<signalVector *> vectors;
GSM::Time mTime;
};