From 3a4be428b5b06f9882de07985431ad1eaeb1951a Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Fri, 5 Jan 2024 14:13:11 +0100 Subject: [PATCH] sdr: stop reading packets if the TX buffer is too full --- impl/src/layer1/rx.c | 1 - impl/src/main.c | 12 ++++++++++++ impl/src/sdr/sdr.c | 20 ++++++++++++++++++++ impl/src/sdr/sdr.h | 1 + 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/impl/src/layer1/rx.c b/impl/src/layer1/rx.c index b8c01a9..293546b 100644 --- a/impl/src/layer1/rx.c +++ b/impl/src/layer1/rx.c @@ -1,5 +1,4 @@ #include -#include #include diff --git a/impl/src/main.c b/impl/src/main.c index 18a0445..5fc5c33 100644 --- a/impl/src/main.c +++ b/impl/src/main.c @@ -262,6 +262,18 @@ int main(void) break; } else if(ret > 0) { // there is a packet to be read. + + // check free buffer space (50 ms required corresponding to 5000 baseband symbols) + size_t buffer_free_space_samples = sdr_get_tx_buffer_free_space(&sdr); + + fprintf(stderr, "TX buffer free: %zu\n", buffer_free_space_samples); + + if(buffer_free_space_samples < 100000) { // sample count for 50 ms at 2 MHz + // try again after a short delay + fsleep(10e-3); + continue; + } + uint8_t packetbuf[2048]; ret = read(m_tunfd, packetbuf, sizeof(packetbuf)); if(ret < 0) { diff --git a/impl/src/sdr/sdr.c b/impl/src/sdr/sdr.c index e6d497b..99a5823 100644 --- a/impl/src/sdr/sdr.c +++ b/impl/src/sdr/sdr.c @@ -366,6 +366,26 @@ result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx) } +size_t sdr_get_tx_buffer_free_space(sdr_ctx_t *ctx) +{ + size_t free_samples = 0; + + if(sem_wait(&ctx->buf_sem) < 0) { + perror("sem_wait"); + return 0; + } + + free_samples = cbuffercf_space_available(ctx->tx_buf); + + if(sem_post(&ctx->buf_sem) < 0) { + perror("sem_post"); + return 0; + } + + return free_samples; +} + + result_t sdr_rf_to_baseband(sdr_ctx_t *ctx, const float complex *rf_samples, size_t nrf, float complex *bb_samples, size_t *nbb) diff --git a/impl/src/sdr/sdr.h b/impl/src/sdr/sdr.h index b6debc2..ae9ba80 100644 --- a/impl/src/sdr/sdr.h +++ b/impl/src/sdr/sdr.h @@ -49,6 +49,7 @@ result_t sdr_transmit(sdr_ctx_t *ctx, const float complex *samples, size_t nsamp result_t sdr_receive(sdr_ctx_t *ctx, float complex *samples, size_t *nsamples, long timeout_us); result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx); +size_t sdr_get_tx_buffer_free_space(sdr_ctx_t *ctx); /*! * \brief Convert and resample a received signal to baseband.