diff options
Diffstat (limited to 'Transceiver52M/radioInterface.cpp')
-rw-r--r-- | Transceiver52M/radioInterface.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 8ad72b0..93d2ff3 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -27,6 +27,28 @@ bool started = false; +/* Device side buffers */ +static short rx_buf[OUTCHUNK * 2 * 2]; +static short tx_buf[INCHUNK * 2 * 2]; + +/* Complex float to short conversion */ +static void floatToShort(short *out, float *in, int num) +{ + for (int i = 0; i < num; i++) { + out[2 * i + 0] = (short) in[2 * i + 0]; + out[2 * i + 1] = (short) in[2 * i + 1]; + } +} + +/* Complex short to float conversion */ +static void shortToFloat(float *out, short *in, int num) +{ + for (int i = 0; i < num; i++) { + out[2 * i + 0] = (float) in[2 * i + 0]; + out[2 * i + 1] = (float) in[2 * i + 1]; + } +} + RadioInterface::RadioInterface(RadioDevice *wRadio, int wReceiveOffset, int wSPS, @@ -236,3 +258,41 @@ double RadioInterface::getRxGain() else return -1; } + +/* Receive a timestamped chunk from the device */ +void RadioInterface::pullBuffer() +{ + bool local_underrun; + + /* Read samples. Fail if we don't get what we want. */ + int num_rd = mRadio->readSamples(rx_buf, OUTCHUNK, &overrun, + readTimestamp, &local_underrun); + + LOG(DEBUG) << "Rx read " << num_rd << " samples from device"; + assert(num_rd == OUTCHUNK); + + underrun |= local_underrun; + readTimestamp += (TIMESTAMP) num_rd; + + shortToFloat(rcvBuffer + 2 * rcvCursor, rx_buf, num_rd); + rcvCursor += num_rd; +} + +/* Send timestamped chunk to the device with arbitrary size */ +void RadioInterface::pushBuffer() +{ + if (sendCursor < INCHUNK) + return; + + floatToShort(tx_buf, sendBuffer, sendCursor); + + /* Write samples. Fail if we don't get what we want. */ + int num_smpls = mRadio->writeSamples(tx_buf, + sendCursor, + &underrun, + writeTimestamp); + assert(num_smpls == sendCursor); + + writeTimestamp += (TIMESTAMP) num_smpls; + sendCursor = 0; +} |