mirror of https://github.com/pvnis/srsRAN_4G.git
filerf: add tx, multi-channel, open via device string and test
This commits extends the file-based RF device as follows: * open device via device string * add tx to file * add multi-channel support (multiple files) * add rf_file_test.c to for testingmaster
parent
57f84d4ca4
commit
f3d144dd59
@ -0,0 +1,189 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rf_file_imp_trx.h"
|
||||||
|
#include <errno.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <srsran/config.h>
|
||||||
|
#include <srsran/phy/utils/vector.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int rf_file_tx_open(rf_file_tx_t* q, rf_file_opts_t opts)
|
||||||
|
{
|
||||||
|
int ret = SRSRAN_ERROR;
|
||||||
|
|
||||||
|
if (q) {
|
||||||
|
// Zero object
|
||||||
|
memset(q, 0, sizeof(rf_file_tx_t));
|
||||||
|
|
||||||
|
// Copy id
|
||||||
|
strncpy(q->id, opts.id, FILE_ID_STRLEN - 1);
|
||||||
|
q->id[FILE_ID_STRLEN - 1] = '\0';
|
||||||
|
|
||||||
|
// Assign file
|
||||||
|
q->file = opts.file;
|
||||||
|
|
||||||
|
// Configure formats
|
||||||
|
q->sample_format = opts.sample_format;
|
||||||
|
q->frequency_mhz = opts.frequency_mhz;
|
||||||
|
|
||||||
|
q->temp_buffer_convert = srsran_vec_malloc(FILE_MAX_BUFFER_SIZE);
|
||||||
|
if (!q->temp_buffer_convert) {
|
||||||
|
fprintf(stderr, "Error: allocating tx buffer\n");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_mutex_init(&q->mutex, NULL)) {
|
||||||
|
fprintf(stderr, "Error: creating mutex\n");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
q->zeros = srsran_vec_malloc(FILE_MAX_BUFFER_SIZE);
|
||||||
|
if (!q->zeros) {
|
||||||
|
fprintf(stderr, "Error: allocating zeros\n");
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
memset(q->zeros, 0, FILE_MAX_BUFFER_SIZE);
|
||||||
|
|
||||||
|
q->running = true;
|
||||||
|
|
||||||
|
ret = SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_exit:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _rf_file_tx_baseband(rf_file_tx_t* q, cf_t* buffer, uint32_t nsamples)
|
||||||
|
{
|
||||||
|
int n = SRSRAN_ERROR;
|
||||||
|
|
||||||
|
// convert samples if necessary
|
||||||
|
void* buf = (buffer) ? buffer : q->zeros;
|
||||||
|
uint32_t sample_sz = sizeof(cf_t);
|
||||||
|
|
||||||
|
if (q->sample_format == FILERF_TYPE_SC16) {
|
||||||
|
buf = q->temp_buffer_convert;
|
||||||
|
sample_sz = 2 * sizeof(short);
|
||||||
|
srsran_vec_convert_fi((float*)buffer, INT16_MAX, (short*)q->temp_buffer_convert, 2 * nsamples);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ret = fwrite(buf, (size_t)sample_sz, (size_t)nsamples, q->file);
|
||||||
|
if (ret < (size_t)nsamples) {
|
||||||
|
rf_file_error(q->id,
|
||||||
|
"[file] Error: transmitter expected %d bytes and sent %d. %s.\n",
|
||||||
|
NSAMPLES2NBYTES(nsamples),
|
||||||
|
ret,
|
||||||
|
strerror(errno));
|
||||||
|
n = SRSRAN_ERROR;
|
||||||
|
goto clean_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment sample counter
|
||||||
|
q->nsamples += nsamples;
|
||||||
|
n = nsamples;
|
||||||
|
|
||||||
|
clean_exit:
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rf_file_tx_align(rf_file_tx_t* q, uint64_t ts)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&q->mutex);
|
||||||
|
|
||||||
|
int64_t nsamples = (int64_t)ts - (int64_t)q->nsamples;
|
||||||
|
|
||||||
|
if (nsamples > 0) {
|
||||||
|
rf_file_info(q->id, " - Detected Tx gap of %d samples.\n", nsamples);
|
||||||
|
_rf_file_tx_baseband(q, q->zeros, (uint32_t)nsamples);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&q->mutex);
|
||||||
|
|
||||||
|
return (int)nsamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rf_file_tx_baseband(rf_file_tx_t* q, cf_t* buffer, uint32_t nsamples)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&q->mutex);
|
||||||
|
|
||||||
|
if (q->sample_offset > 0) {
|
||||||
|
_rf_file_tx_baseband(q, q->zeros, (uint32_t)q->sample_offset);
|
||||||
|
q->sample_offset = 0;
|
||||||
|
} else if (q->sample_offset < 0) {
|
||||||
|
n = SRSRAN_MIN(-q->sample_offset, nsamples);
|
||||||
|
buffer += n;
|
||||||
|
nsamples -= n;
|
||||||
|
q->sample_offset += n;
|
||||||
|
if (nsamples == 0) {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
n = _rf_file_tx_baseband(q, buffer, nsamples);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&q->mutex);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rf_file_tx_get_nsamples(rf_file_tx_t* q)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&q->mutex);
|
||||||
|
int ret = q->nsamples;
|
||||||
|
pthread_mutex_unlock(&q->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rf_file_tx_zeros(rf_file_tx_t* q, uint32_t nsamples)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&q->mutex);
|
||||||
|
|
||||||
|
rf_file_info(q->id, " - Tx %d Zeros.\n", nsamples);
|
||||||
|
_rf_file_tx_baseband(q, q->zeros, (uint32_t)nsamples);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&q->mutex);
|
||||||
|
|
||||||
|
return (int)nsamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool rf_file_tx_match_freq(rf_file_tx_t* q, uint32_t freq_hz)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
if (q) {
|
||||||
|
ret = (q->frequency_mhz == 0 || q->frequency_mhz == freq_hz);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void rf_file_tx_close(rf_file_tx_t* q)
|
||||||
|
{
|
||||||
|
rf_file_info(q->id, "Closing ...\n");
|
||||||
|
pthread_mutex_lock(&q->mutex);
|
||||||
|
q->running = false;
|
||||||
|
pthread_mutex_unlock(&q->mutex);
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&q->mutex);
|
||||||
|
|
||||||
|
if (q->zeros) {
|
||||||
|
free(q->zeros);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (q->temp_buffer_convert) {
|
||||||
|
free(q->temp_buffer_convert);
|
||||||
|
}
|
||||||
|
|
||||||
|
q->file = NULL;
|
||||||
|
}
|
@ -0,0 +1,312 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* \section COPYRIGHT
|
||||||
|
*
|
||||||
|
* Copyright 2013-2021 Software Radio Systems Limited
|
||||||
|
*
|
||||||
|
* By using this file, you agree to the terms and conditions set
|
||||||
|
* forth in the LICENSE file which can be found at the top level of
|
||||||
|
* the distribution.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "rf_file_imp.h"
|
||||||
|
#include "srsran/common/tsan_options.h"
|
||||||
|
#include "srsran/phy/common/timestamp.h"
|
||||||
|
#include "srsran/phy/utils/debug.h"
|
||||||
|
#include <complex.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <srsran/phy/common/phy_common.h>
|
||||||
|
#include <srsran/phy/utils/vector.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define PRINT_SAMPLES 0
|
||||||
|
#define COMPARE_BITS 0
|
||||||
|
#define COMPARE_EPSILON (1e-6f)
|
||||||
|
#define NOF_RX_ANT 4
|
||||||
|
#define NUM_SF (500)
|
||||||
|
#define SF_LEN (1920)
|
||||||
|
#define RF_BUFFER_SIZE (SF_LEN * NUM_SF)
|
||||||
|
#define TX_OFFSET_MS (4)
|
||||||
|
|
||||||
|
static cf_t ue_rx_buffer[NOF_RX_ANT][RF_BUFFER_SIZE];
|
||||||
|
static cf_t enb_tx_buffer[NOF_RX_ANT][RF_BUFFER_SIZE];
|
||||||
|
static cf_t enb_rx_buffer[NOF_RX_ANT][RF_BUFFER_SIZE];
|
||||||
|
|
||||||
|
static srsran_rf_t ue_radio, enb_radio;
|
||||||
|
pthread_t rx_thread;
|
||||||
|
|
||||||
|
void* ue_rx_thread_function(void* args)
|
||||||
|
{
|
||||||
|
char rf_args[RF_PARAM_LEN];
|
||||||
|
strncpy(rf_args, (char*)args, RF_PARAM_LEN - 1);
|
||||||
|
rf_args[RF_PARAM_LEN - 1] = 0;
|
||||||
|
|
||||||
|
// sleep(1);
|
||||||
|
|
||||||
|
printf("opening rx device with args=%s\n", rf_args);
|
||||||
|
if (srsran_rf_open_devname(&ue_radio, "file", rf_args, NOF_RX_ANT)) {
|
||||||
|
fprintf(stderr, "Error opening rf\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// receive 5 subframes at once (i.e. mimic initial rx that receives one slot)
|
||||||
|
uint32_t num_slots = NUM_SF / 5;
|
||||||
|
uint32_t num_samps_per_slot = SF_LEN * 5;
|
||||||
|
uint32_t num_rxed_samps = 0;
|
||||||
|
for (uint32_t i = 0; i < num_slots; ++i) {
|
||||||
|
void* data_ptr[SRSRAN_MAX_PORTS] = {NULL};
|
||||||
|
for (uint32_t c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
data_ptr[c] = &ue_rx_buffer[c][i * num_samps_per_slot];
|
||||||
|
}
|
||||||
|
num_rxed_samps += srsran_rf_recv_with_time_multi(&ue_radio, data_ptr, num_samps_per_slot, true, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("received %d samples.\n", num_rxed_samps);
|
||||||
|
|
||||||
|
printf("closing ue rx device\n");
|
||||||
|
srsran_rf_close(&ue_radio);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void enb_tx_function(const char* tx_args, bool timed_tx)
|
||||||
|
{
|
||||||
|
char rf_args[RF_PARAM_LEN];
|
||||||
|
strncpy(rf_args, tx_args, RF_PARAM_LEN - 1);
|
||||||
|
rf_args[RF_PARAM_LEN - 1] = 0;
|
||||||
|
|
||||||
|
printf("opening tx device with args=%s\n", rf_args);
|
||||||
|
if (srsran_rf_open_devname(&enb_radio, "file", rf_args, NOF_RX_ANT)) {
|
||||||
|
fprintf(stderr, "Error opening rf\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate random tx data
|
||||||
|
for (int c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
for (int i = 0; i < RF_BUFFER_SIZE; i++) {
|
||||||
|
enb_tx_buffer[c][i] = ((float)rand() / (float)RAND_MAX) + _Complex_I * ((float)rand() / (float)RAND_MAX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// send data subframe per subframe
|
||||||
|
uint32_t num_txed_samples = 0;
|
||||||
|
|
||||||
|
// initial transmission without ts
|
||||||
|
void* data_ptr[SRSRAN_MAX_PORTS] = {NULL};
|
||||||
|
for (int c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
data_ptr[c] = &enb_tx_buffer[c][num_txed_samples];
|
||||||
|
}
|
||||||
|
int ret = srsran_rf_send_multi(&enb_radio, (void**)data_ptr, SF_LEN, true, true, false);
|
||||||
|
num_txed_samples += SF_LEN;
|
||||||
|
|
||||||
|
// from here on, all transmissions are timed relative to the last rx time
|
||||||
|
srsran_timestamp_t rx_time, tx_time;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < NUM_SF - ((timed_tx) ? TX_OFFSET_MS : 1); ++i) {
|
||||||
|
// first recv samples
|
||||||
|
for (int c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
data_ptr[c] = enb_rx_buffer[c];
|
||||||
|
}
|
||||||
|
srsran_rf_recv_with_time_multi(&enb_radio, data_ptr, SF_LEN, true, &rx_time.full_secs, &rx_time.frac_secs);
|
||||||
|
|
||||||
|
// prepare data buffer
|
||||||
|
for (int c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
data_ptr[c] = &enb_tx_buffer[c][num_txed_samples];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timed_tx) {
|
||||||
|
// timed tx relative to receive time (this will cause a cap in the rx'ed samples at the UE resulting in 3 zero
|
||||||
|
// subframes)
|
||||||
|
srsran_timestamp_copy(&tx_time, &rx_time);
|
||||||
|
srsran_timestamp_add(&tx_time, 0, TX_OFFSET_MS * 1e-3);
|
||||||
|
ret = srsran_rf_send_timed_multi(
|
||||||
|
&enb_radio, (void**)data_ptr, SF_LEN, tx_time.full_secs, tx_time.frac_secs, true, true, false);
|
||||||
|
} else {
|
||||||
|
// normal tx
|
||||||
|
ret = srsran_rf_send_multi(&enb_radio, (void**)data_ptr, SF_LEN, true, true, false);
|
||||||
|
}
|
||||||
|
if (ret != SRSRAN_SUCCESS) {
|
||||||
|
fprintf(stderr, "Error sending data\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
num_txed_samples += SF_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("transmitted %d samples in %d subframes\n", num_txed_samples, NUM_SF);
|
||||||
|
|
||||||
|
printf("closing tx device\n");
|
||||||
|
srsran_rf_close(&enb_radio);
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_test(const char* rx_args, const char* tx_args, bool timed_tx)
|
||||||
|
{
|
||||||
|
int ret = SRSRAN_ERROR;
|
||||||
|
|
||||||
|
// make sure we can receive in slots
|
||||||
|
if (NUM_SF % 5 != 0) {
|
||||||
|
fprintf(stderr, "number of subframes must be multiple of 5\n");
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// write to file(s)
|
||||||
|
enb_tx_function(tx_args, timed_tx);
|
||||||
|
|
||||||
|
// read from file(s)
|
||||||
|
ue_rx_thread_function((void*)rx_args);
|
||||||
|
|
||||||
|
// channel-wise comparison
|
||||||
|
for (int c = 0; c < NOF_RX_ANT; c++) {
|
||||||
|
// subframe-wise compare tx'ed and rx'ed data (stop 3 subframes earlier for timed tx)
|
||||||
|
for (uint32_t i = 0; i < NUM_SF - (timed_tx ? 3 : 0); ++i) {
|
||||||
|
uint32_t sf_offet = 0;
|
||||||
|
if (timed_tx && i >= 1) {
|
||||||
|
// for timed transmission, the enb inserts 3 zero subframes after the first untimed tx
|
||||||
|
sf_offet = (TX_OFFSET_MS - 1) * SF_LEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if PRINT_SAMPLES
|
||||||
|
// print first 10 samples for each SF
|
||||||
|
printf("enb_tx_buffer sf%d:\n", i);
|
||||||
|
srsran_vec_fprint_c(stdout, &enb_tx_buffer[c][i * SF_LEN], 10);
|
||||||
|
printf("ue_rx_buffer sf%d:\n", i);
|
||||||
|
srsran_vec_fprint_c(stdout, &ue_rx_buffer[c][sf_offet + i * SF_LEN], 10);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if COMPARE_BITS
|
||||||
|
int d = memcmp(&ue_rx_buffer[sf_offet + i * SF_LEN], &enb_tx_buffer[i * SF_LEN], SF_LEN);
|
||||||
|
if (d) {
|
||||||
|
d = d > 0 ? d : -d;
|
||||||
|
fprintf(stderr, "data mismatch in subframe %d, sample %d\n", i, d);
|
||||||
|
printf("enb_tx_buffer sf%d:\n", i);
|
||||||
|
srsran_vec_fprint_c(stdout, &enb_tx_buffer[i * SF_LEN + d], 10);
|
||||||
|
printf("ue_rx_buffer sf%d:\n", i);
|
||||||
|
srsran_vec_fprint_c(stdout, &ue_rx_buffer[sf_offet + i * SF_LEN + d], 10);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
srsran_vec_sub_ccc(&ue_rx_buffer[c][sf_offet + i * SF_LEN],
|
||||||
|
&enb_tx_buffer[c][i * SF_LEN],
|
||||||
|
&ue_rx_buffer[c][sf_offet + i * SF_LEN],
|
||||||
|
SF_LEN);
|
||||||
|
uint32_t max_ix = srsran_vec_max_abs_ci(&ue_rx_buffer[c][sf_offet + i * SF_LEN], SF_LEN);
|
||||||
|
if (cabsf(ue_rx_buffer[c][sf_offet + i * SF_LEN + max_ix]) > COMPARE_EPSILON) {
|
||||||
|
fprintf(stderr, "data mismatch in subframe %d\n", i);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = SRSRAN_SUCCESS;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int param_test(const char* args_param, const int num_channels)
|
||||||
|
{
|
||||||
|
char rf_args[RF_PARAM_LEN] = {};
|
||||||
|
strncpy(rf_args, (char*)args_param, RF_PARAM_LEN - 1);
|
||||||
|
rf_args[RF_PARAM_LEN - 1] = 0;
|
||||||
|
|
||||||
|
printf("opening tx device with args=%s\n", rf_args);
|
||||||
|
if (srsran_rf_open_devname(&enb_radio, "file", rf_args, num_channels)) {
|
||||||
|
fprintf(stderr, "Error opening rf\n");
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
srsran_rf_close(&enb_radio);
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void create_file(const char* filename)
|
||||||
|
{
|
||||||
|
FILE* f = fopen(filename, "w");
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// create files for testing
|
||||||
|
create_file("rx_file0");
|
||||||
|
create_file("rx_file1");
|
||||||
|
create_file("rx_file2");
|
||||||
|
create_file("rx_file3");
|
||||||
|
|
||||||
|
// two RX files
|
||||||
|
if (param_test("rx_file=rx_file0,"
|
||||||
|
"rx_file1=rx_file1",
|
||||||
|
2)) {
|
||||||
|
fprintf(stderr, "Param test failed!\n");
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// multiple RX files, no channel index provided
|
||||||
|
if (param_test("rx_file=rx_file0,"
|
||||||
|
"rx_file=rx_file1,"
|
||||||
|
"rx_file=rx_file2,"
|
||||||
|
"rx_file=rx_file3,"
|
||||||
|
"base_srate=1.92e6",
|
||||||
|
4)) {
|
||||||
|
fprintf(stderr, "Param test failed!\n");
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// one RX, one TX and all generic options
|
||||||
|
if (param_test("rx_file0=rx_file0,"
|
||||||
|
"tx_file0=tx_file0,"
|
||||||
|
"base_srate=1.92e6",
|
||||||
|
1)) {
|
||||||
|
fprintf(stderr, "Param test failed!\n");
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
// two RX, two TX
|
||||||
|
if (param_test("rx_file0=rx_file0,"
|
||||||
|
"rx_file1=rx_file1,"
|
||||||
|
"tx_file0=tx_file0,"
|
||||||
|
"tx_file1=tx_file1",
|
||||||
|
2)) {
|
||||||
|
fprintf(stderr, "Param test failed!\n");
|
||||||
|
return SRSRAN_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if NOF_RX_ANT == 1
|
||||||
|
// single tx, single rx with continuous transmissions (no decimation, no timed tx)
|
||||||
|
if (run_test("rx_file=tx_file0,base_srate=1.92e6", "tx_file=tx_file0,base_srate=1.92e6", false) != SRSRAN_SUCCESS) {
|
||||||
|
fprintf(stderr, "Single tx, single rx test failed (no decimation, no timed tx)!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// up to 4 trx radios with continous tx (no decimation, no timed tx)
|
||||||
|
if (run_test("rx_file=tx_file0,rx_file=tx_file1,rx_file=tx_file2,rx_file=tx_file3,base_srate=1.92e6",
|
||||||
|
"tx_file=tx_file0,tx_file=tx_file1,tx_file=tx_file2,tx_file=tx_file3,base_srate=1.92e6",
|
||||||
|
false) != SRSRAN_SUCCESS) {
|
||||||
|
fprintf(stderr, "Multi TRx radio test failed (no decimation, no timed tx)!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// up to 4 trx radios with continous tx (with decimation, no timed tx)
|
||||||
|
if (run_test("rx_file=tx_file0,rx_file=tx_file1,rx_file=tx_file2,rx_file=tx_file3",
|
||||||
|
"tx_file=tx_file0,tx_file=tx_file1,tx_file=tx_file2,tx_file=tx_file3",
|
||||||
|
false) != SRSRAN_SUCCESS) {
|
||||||
|
fprintf(stderr, "Multi TRx radio test failed (with decimation, no timed tx)!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// up to 4 trx radios with continous tx (with decimation, timed tx)
|
||||||
|
if (run_test("rx_file=tx_file0,rx_file=tx_file1,rx_file=tx_file2,rx_file=tx_file3",
|
||||||
|
"tx_file=tx_file0,tx_file=tx_file1,tx_file=tx_file2,tx_file=tx_file3",
|
||||||
|
true) != SRSRAN_SUCCESS) {
|
||||||
|
fprintf(stderr, "Two TRx radio test failed (with decimation, timed tx)!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stdout, "Test passed!\n");
|
||||||
|
|
||||||
|
return SRSRAN_SUCCESS;
|
||||||
|
}
|
Loading…
Reference in New Issue