diff --git a/impl/src/main.c b/impl/src/main.c index c2156b4..030ade1 100644 --- a/impl/src/main.c +++ b/impl/src/main.c @@ -264,16 +264,13 @@ int main(void) if(!on_air) { RESULT_CHECK(sdr_stop_rx(&sdr)); RESULT_CHECK(sdr_start_tx(&sdr, burst_len * SDR_OVERSAMPLING)); - - // hopefully no longer needed with latest libhackrf - //RESULT_CHECK(sdr_flush_tx_buffer(&sdr)); } RESULT_CHECK(transmit_in_chunks(&sdr, whole_burst, burst_len)); on_air = true; } else if(on_air) { // ret == 0 - //RESULT_CHECK(sdr_flush_tx_buffer(&sdr)); + RESULT_CHECK(sdr_flush_tx_buffer(&sdr)); RESULT_CHECK(sdr_stop_tx(&sdr)); RESULT_CHECK(sdr_start_rx(&sdr)); diff --git a/impl/src/sdr/sdr.c b/impl/src/sdr/sdr.c index 50220b6..ef1db6c 100644 --- a/impl/src/sdr/sdr.c +++ b/impl/src/sdr/sdr.c @@ -67,6 +67,7 @@ static inline int8_t clamp_float2int8(float s) static int tx_callback(hackrf_transfer *transfer) { int result; + int retcode = 0; sdr_ctx_t *sdr_ctx = (sdr_ctx_t*)transfer->tx_ctx; @@ -86,9 +87,15 @@ static int tx_callback(hackrf_transfer *transfer) result = cbuffercf_read(sdr_ctx->tx_buf, samples_requested, &samples, &samples_read); if(result != LIQUID_OK) { fprintf(stderr, "cbuffercf_read failed: %d. Samples are lost.\n", result); + sem_post(&sdr_ctx->buf_sem); return HACKRF_ERROR_OTHER; } + if(samples_read == 0) { + // buffer has run empty, so this is the end of the transmission + sdr_ctx->tx_done = true; + } + for(size_t i = 0; i < samples_read; i++) { transfer->buffer[2*i + 0] = clamp_float2int8(creal(samples[i])); transfer->buffer[2*i + 1] = clamp_float2int8(cimag(samples[i])); @@ -111,7 +118,7 @@ static int tx_callback(hackrf_transfer *transfer) return HACKRF_ERROR_OTHER; } - return 0; + return retcode; } static result_t stop_streaming(sdr_ctx_t *ctx) @@ -282,12 +289,13 @@ result_t sdr_transmit(sdr_ctx_t *ctx, const float complex *samples, size_t nsamp return ERR_LIQUID; } + ctx->tx_done = false; + if(sem_post(&ctx->buf_sem) < 0) { perror("sem_post"); return ERR_SDR; } - return OK; } @@ -334,8 +342,10 @@ result_t sdr_receive(sdr_ctx_t *ctx, float complex *samples, size_t *nsamples, l result_t sdr_flush_tx_buffer(sdr_ctx_t *ctx) { - // currently not implemented - (void)ctx; + while(!ctx->tx_done) { + struct timespec ts_1ms = {0, 1000000}; + nanosleep(&ts_1ms, NULL); + } return OK; } diff --git a/impl/src/sdr/sdr.h b/impl/src/sdr/sdr.h index 8be4255..6a29228 100644 --- a/impl/src/sdr/sdr.h +++ b/impl/src/sdr/sdr.h @@ -3,6 +3,7 @@ #include #include +#include #include @@ -30,6 +31,7 @@ typedef struct { sem_t buf_sem; sdr_status_t status; + bool tx_done; } sdr_ctx_t; result_t sdr_init(sdr_ctx_t *ctx);