diff --git a/lib/include/srslte/interfaces/ue_interfaces.h b/lib/include/srslte/interfaces/ue_interfaces.h index e69419983..bea0cb05c 100644 --- a/lib/include/srslte/interfaces/ue_interfaces.h +++ b/lib/include/srslte/interfaces/ue_interfaces.h @@ -494,6 +494,8 @@ typedef struct { bool sic_pss_enabled; float rx_gain_offset; bool pdsch_csi_enabled; + uint32_t intra_freq_meas_len_ms; + uint32_t intra_freq_meas_period_ms; } phy_args_t; diff --git a/lib/include/srslte/phy/utils/ringbuffer.h b/lib/include/srslte/phy/utils/ringbuffer.h index b8d0cd5c9..a93ebf181 100644 --- a/lib/include/srslte/phy/utils/ringbuffer.h +++ b/lib/include/srslte/phy/utils/ringbuffer.h @@ -28,6 +28,8 @@ SRSLTE_API void srslte_ringbuffer_reset(srslte_ringbuffer_t *q); SRSLTE_API int srslte_ringbuffer_status(srslte_ringbuffer_t *q); +SRSLTE_API int srslte_ringbuffer_space(srslte_ringbuffer_t *q); + SRSLTE_API int srslte_ringbuffer_write(srslte_ringbuffer_t *q, void *ptr, int nof_bytes); diff --git a/lib/src/phy/utils/ringbuffer.c b/lib/src/phy/utils/ringbuffer.c index 8f0c3edf2..02b98a4d8 100644 --- a/lib/src/phy/utils/ringbuffer.c +++ b/lib/src/phy/utils/ringbuffer.c @@ -13,11 +13,10 @@ int srslte_ringbuffer_init(srslte_ringbuffer_t *q, int capacity) } q->active = true; q->capacity = capacity; - srslte_ringbuffer_reset(q); - pthread_mutex_init(&q->mutex, NULL); pthread_cond_init(&q->cvar, NULL); - + srslte_ringbuffer_reset(q); + return 0; } @@ -48,6 +47,11 @@ int srslte_ringbuffer_status(srslte_ringbuffer_t *q) return q->count; } +int srslte_ringbuffer_space(srslte_ringbuffer_t *q) +{ + return q->capacity - q->count; +} + int srslte_ringbuffer_write(srslte_ringbuffer_t *q, void *p, int nof_bytes) { uint8_t *ptr = (uint8_t*) p; diff --git a/lib/src/radio/radio.cc b/lib/src/radio/radio.cc index fc21b73be..7008790a3 100644 --- a/lib/src/radio/radio.cc +++ b/lib/src/radio/radio.cc @@ -301,9 +301,7 @@ void radio::set_master_clock_rate(double rate) void radio::set_rx_srate(double srate) { - srslte_rf_stop_rx_stream(&rf_device); srslte_rf_set_rx_srate(&rf_device, srate); - srslte_rf_start_rx_stream(&rf_device, false); } void radio::set_tx_freq(double freq) diff --git a/srsue/hdr/phy/phch_recv.h b/srsue/hdr/phy/phch_recv.h index f955b30ce..378dfb8f9 100644 --- a/srsue/hdr/phy/phch_recv.h +++ b/srsue/hdr/phy/phch_recv.h @@ -233,8 +233,6 @@ private: void write(uint32_t tti, cf_t *data, uint32_t nsamples); private: void run_thread(); - const static int INTRA_FREQ_MEAS_LEN_MS = 20; - const static int INTRA_FREQ_MEAS_PERIOD_MS = 200; const static int INTRA_FREQ_MEAS_PRIO = DEFAULT_PRIORITY + 5; scell_recv scell; diff --git a/srsue/hdr/phy/phch_worker.h b/srsue/hdr/phy/phch_worker.h index e87603e5d..28c4715ad 100644 --- a/srsue/hdr/phy/phch_worker.h +++ b/srsue/hdr/phy/phch_worker.h @@ -63,8 +63,16 @@ public: void write_trace(std::string filename); int read_ce_abs(float *ce_abs, uint32_t tx_antenna, uint32_t rx_antenna); - uint32_t get_cell_nof_ports() {return cell.nof_ports;}; - uint32_t get_rx_nof_antennas() {return ue_dl.nof_rx_antennas;}; + uint32_t get_cell_nof_ports() { + if (cell_initiated) { + return cell.nof_ports; + } else { + return 1; + } + }; + uint32_t get_rx_nof_antennas() { + return ue_dl.nof_rx_antennas; + }; int read_pdsch_d(cf_t *pdsch_d); void start_plot(); diff --git a/srsue/src/main.cc b/srsue/src/main.cc index 00fd23cf8..8753e7630 100644 --- a/srsue/src/main.cc +++ b/srsue/src/main.cc @@ -203,6 +203,14 @@ void parse_args(all_args_t *args, int argc, char *argv[]) { bpo::value(&args->expert.phy.equalizer_mode)->default_value("mmse"), "Equalizer mode") + ("expert.intra_freq_meas_len_ms", + bpo::value(&args->expert.phy.intra_freq_meas_len_ms)->default_value(20), + "Duration of the intra-frequency neighbour cell measurement in ms.") + + ("expert.intra_freq_meas_period_ms", + bpo::value(&args->expert.phy.intra_freq_meas_period_ms)->default_value(200), + "Period of intra-frequency neighbour cell measurement in ms. Maximum as per 3GPP is 200 ms.") + ("expert.cfo_is_doppler", bpo::value(&args->expert.phy.cfo_is_doppler)->default_value(false), "Assume detected CFO is doppler and correct the UL in the same direction. If disabled, the CFO is assumed" diff --git a/srsue/src/phy/phch_recv.cc b/srsue/src/phy/phch_recv.cc index 5821a1bf3..8227a2882 100644 --- a/srsue/src/phy/phch_recv.cc +++ b/srsue/src/phy/phch_recv.cc @@ -1436,11 +1436,11 @@ void phch_recv::intra_measure::init(phch_common *common, rrc_interface_phy *rrc, receive_enabled = false; // Start scell - scell.init(log_h, common->args->sic_pss_enabled, INTRA_FREQ_MEAS_LEN_MS); + scell.init(log_h, common->args->sic_pss_enabled, common->args->intra_freq_meas_len_ms); - search_buffer = (cf_t*) srslte_vec_malloc(INTRA_FREQ_MEAS_LEN_MS*SRSLTE_SF_LEN_PRB(SRSLTE_MAX_PRB)*sizeof(cf_t)); + search_buffer = (cf_t*) srslte_vec_malloc(common->args->intra_freq_meas_len_ms*SRSLTE_SF_LEN_PRB(SRSLTE_MAX_PRB)*sizeof(cf_t)); - if (srslte_ringbuffer_init(&ring_buffer, sizeof(cf_t)*INTRA_FREQ_MEAS_LEN_MS*2*SRSLTE_SF_LEN_PRB(SRSLTE_MAX_PRB))) { + if (srslte_ringbuffer_init(&ring_buffer, sizeof(cf_t)*common->args->intra_freq_meas_len_ms*2*SRSLTE_SF_LEN_PRB(SRSLTE_MAX_PRB))) { return; } @@ -1510,7 +1510,7 @@ void phch_recv::intra_measure::rem_cell(int pci) { void phch_recv::intra_measure::write(uint32_t tti, cf_t *data, uint32_t nsamples) { if (receive_enabled) { - if ((tti%INTRA_FREQ_MEAS_PERIOD_MS) == 0) { + if ((tti%common->args->intra_freq_meas_period_ms) == 0) { receiving = true; receive_cnt = 0; measure_tti = tti; @@ -1522,7 +1522,7 @@ void phch_recv::intra_measure::write(uint32_t tti, cf_t *data, uint32_t nsamples receiving = false; } else { receive_cnt++; - if (receive_cnt == INTRA_FREQ_MEAS_LEN_MS) { + if (receive_cnt == common->args->intra_freq_meas_len_ms) { tti_sync.increase(); receiving = false; } @@ -1541,8 +1541,8 @@ void phch_recv::intra_measure::run_thread() if (running) { // Read data from buffer and find cells in it - srslte_ringbuffer_read(&ring_buffer, search_buffer, INTRA_FREQ_MEAS_LEN_MS*current_sflen*sizeof(cf_t)); - int found_cells = scell.find_cells(search_buffer, common->rx_gain_offset, primary_cell, INTRA_FREQ_MEAS_LEN_MS, info); + srslte_ringbuffer_read(&ring_buffer, search_buffer, common->args->intra_freq_meas_len_ms*current_sflen*sizeof(cf_t)); + int found_cells = scell.find_cells(search_buffer, common->rx_gain_offset, primary_cell, common->args->intra_freq_meas_len_ms, info); receiving = false; for (int i=0;i= state && state < RRC_STATE_LEAVE_CONNECTED); + return (state >= RRC_STATE_CONNECTED && state < RRC_STATE_LEAVE_CONNECTED); } bool rrc::have_drb() {