- Cleaned up style in the PRACH class:

* Removed magic numbers.
* Reduced indentation of statements with early exists.
* Removed elses after a return statement.
* Trimmed unnecessary include files.
* Default initialized members in the class.
master
faluco 4 years ago committed by faluco
parent b892da0294
commit 5acc1c9a73

@ -22,41 +22,29 @@
#ifndef SRSUE_PRACH_H #ifndef SRSUE_PRACH_H
#define SRSUE_PRACH_H #define SRSUE_PRACH_H
#include <bitset>
#include <string.h>
#include "srslte/common/log.h" #include "srslte/common/log.h"
#include "srslte/interfaces/ue_interfaces.h" #include "srslte/interfaces/ue_interfaces.h"
#include "srslte/radio/radio.h" #include "srslte/radio/radio.h"
#include "srslte/srslte.h" #include "srslte/srslte.h"
#include <bitset>
namespace srsue { namespace srsue {
class prach class prach
{ {
public: public:
prach() prach() = default;
{ ~prach() { stop(); }
bzero(&prach_obj, sizeof(srslte_prach_t));
bzero(&cell, sizeof(srslte_cell_t));
bzero(&cfo_h, sizeof(srslte_cfo_t));
transmitted_tti = 0;
target_power_dbm = 0;
mem_initiated = false;
cell_initiated = false;
signal_buffer = NULL;
}
~prach();
void init(uint32_t max_prb, srslte::log* log_h); void init(uint32_t max_prb, srslte::log* log_h);
void stop(); void stop();
bool set_cell(srslte_cell_t cell, srslte_prach_cfg_t prach_cfg); bool set_cell(srslte_cell_t cell, srslte_prach_cfg_t prach_cfg);
bool prepare_to_send(uint32_t preamble_idx, int allowed_subframe = -1, float target_power_dbm = -1); bool prepare_to_send(uint32_t preamble_idx, int allowed_subframe = -1, float target_power_dbm = -1);
bool is_ready_to_send(uint32_t current_tti); bool is_ready_to_send(uint32_t current_tti);
bool is_pending(); bool is_pending() const;
cf_t* generate(float cfo, uint32_t* nof_sf, float* target_power = NULL); cf_t* generate(float cfo, uint32_t* nof_sf, float* target_power = NULL);
phy_interface_mac_lte::prach_info_t get_info(); phy_interface_mac_lte::prach_info_t get_info() const;
private: private:
bool generate_buffer(uint32_t f_idx); bool generate_buffer(uint32_t f_idx);
@ -72,23 +60,25 @@ private:
} }
private: private:
const static int MAX_LEN_SF = 3; static constexpr unsigned MAX_LEN_SF = 3;
static constexpr unsigned max_fs = 12;
static constexpr unsigned max_preambles = 64;
srslte::log* log_h; srslte::log* log_h = nullptr;
int preamble_idx; srslte_prach_t prach_obj = {};
int allowed_subframe; srslte_cell_t cell = {};
bool mem_initiated; srslte_cfo_t cfo_h = {};
bool cell_initiated;
uint32_t len;
cf_t* buffer[12][64];
std::bitset<12 * 64> buffer_bitmask;
srslte_prach_t prach_obj;
int transmitted_tti;
srslte_cell_t cell;
cf_t* signal_buffer;
srslte_cfo_t cfo_h;
float target_power_dbm;
srslte_prach_cfg_t cfg = {}; srslte_prach_cfg_t cfg = {};
std::array<std::array<cf_t*, max_preambles>, max_fs> buffer = {};
cf_t* signal_buffer = nullptr;
int preamble_idx = 0;
uint32_t len = 0;
int allowed_subframe = 0;
int transmitted_tti = 0;
float target_power_dbm = 0;
bool mem_initiated = false;
bool cell_initiated = false;
std::bitset<max_fs * max_preambles> buffer_bitmask;
}; };
} // namespace srsue } // namespace srsue

@ -19,15 +19,10 @@
* *
*/ */
#include <pthread.h> #include "srsue/hdr/phy/prach.h"
#include <string.h>
#include <strings.h>
#include "srslte/common/log.h" #include "srslte/common/log.h"
#include "srslte/interfaces/ue_interfaces.h" #include "srslte/interfaces/ue_interfaces.h"
#include "srslte/srslte.h" #include "srslte/srslte.h"
#include "srsue/hdr/phy/phy.h"
#include "srsue/hdr/phy/prach.h"
#define Error(fmt, ...) \ #define Error(fmt, ...) \
if (SRSLTE_DEBUG_ENABLED) \ if (SRSLTE_DEBUG_ENABLED) \
@ -42,76 +37,80 @@
if (SRSLTE_DEBUG_ENABLED) \ if (SRSLTE_DEBUG_ENABLED) \
log_h->debug(fmt, ##__VA_ARGS__) log_h->debug(fmt, ##__VA_ARGS__)
namespace srsue { using namespace srsue;
prach::~prach()
{
stop();
}
void prach::init(uint32_t max_prb, srslte::log* log_h_) void prach::init(uint32_t max_prb, srslte::log* log_h_)
{ {
log_h = log_h_; log_h = log_h_;
for (int i = 0; i < 64; i++) { for (auto& i : buffer) {
for (int f = 0; f < 12; f++) { for (auto& j : i) {
buffer[f][i] = srslte_vec_cf_malloc(SRSLTE_PRACH_MAX_LEN); j = srslte_vec_cf_malloc(SRSLTE_PRACH_MAX_LEN);
if (!buffer[f][i]) { if (!j) {
perror("malloc"); perror("malloc");
return; return;
} }
} }
} }
if (srslte_cfo_init(&cfo_h, SRSLTE_PRACH_MAX_LEN)) { if (srslte_cfo_init(&cfo_h, SRSLTE_PRACH_MAX_LEN)) {
ERROR("PRACH: Error initiating CFO\n"); ERROR("PRACH: Error initiating CFO\n");
return; return;
} }
srslte_cfo_set_tol(&cfo_h, 0); srslte_cfo_set_tol(&cfo_h, 0);
signal_buffer = srslte_vec_cf_malloc(MAX_LEN_SF * 30720U); signal_buffer = srslte_vec_cf_malloc(MAX_LEN_SF * 30720U);
if (!signal_buffer) { if (!signal_buffer) {
perror("malloc"); perror("malloc");
return; return;
} }
if (srslte_prach_init(&prach_obj, srslte_symbol_sz(max_prb))) { if (srslte_prach_init(&prach_obj, srslte_symbol_sz(max_prb))) {
Error("Initiating PRACH library\n"); Error("Initiating PRACH library\n");
return; return;
} }
mem_initiated = true; mem_initiated = true;
} }
void prach::stop() void prach::stop()
{ {
if (mem_initiated) { if (!mem_initiated) {
for (int i = 0; i < 64; i++) { return;
for (int f = 0; f < 12; f++) {
if (buffer[f][i]) {
free(buffer[f][i]);
} }
for (auto& i : buffer) {
for (auto& j : i) {
free(j);
} }
} }
if (signal_buffer) {
free(signal_buffer); free(signal_buffer);
}
srslte_cfo_free(&cfo_h); srslte_cfo_free(&cfo_h);
srslte_prach_free(&prach_obj); srslte_prach_free(&prach_obj);
mem_initiated = false; mem_initiated = false;
}
} }
bool prach::set_cell(srslte_cell_t cell_, srslte_prach_cfg_t prach_cfg) bool prach::set_cell(srslte_cell_t cell_, srslte_prach_cfg_t prach_cfg)
{ {
if (mem_initiated) { if (!mem_initiated) {
ERROR("PRACH: Error must call init() first\n");
return false;
}
// TODO: Check if other PRACH parameters changed // TODO: Check if other PRACH parameters changed
if (cell.id != cell_.id || !cell_initiated) { if (cell.id == cell_.id && cell_initiated) {
return true;
}
cell = cell_; cell = cell_;
cfg = prach_cfg; cfg = prach_cfg;
preamble_idx = -1; preamble_idx = -1;
if (6 + prach_cfg.freq_offset > cell.nof_prb) { if (6 + prach_cfg.freq_offset > cell.nof_prb) {
log_h->console( log_h->console("Error no space for PRACH: frequency offset=%d, N_rb_ul=%d\n", prach_cfg.freq_offset, cell.nof_prb);
"Error no space for PRACH: frequency offset=%d, N_rb_ul=%d\n", prach_cfg.freq_offset, cell.nof_prb); log_h->error("Error no space for PRACH: frequency offset=%d, N_rb_ul=%d\n", prach_cfg.freq_offset, cell.nof_prb);
log_h->error(
"Error no space for PRACH: frequency offset=%d, N_rb_ul=%d\n", prach_cfg.freq_offset, cell.nof_prb);
return false; return false;
} }
@ -130,12 +129,8 @@ bool prach::set_cell(srslte_cell_t cell_, srslte_prach_cfg_t prach_cfg)
len = prach_obj.N_seq + prach_obj.N_cp; len = prach_obj.N_seq + prach_obj.N_cp;
transmitted_tti = -1; transmitted_tti = -1;
cell_initiated = true; cell_initiated = true;
}
return true; return true;
} else {
ERROR("PRACH: Error must call init() first\n");
return false;
}
} }
bool prach::generate_buffer(uint32_t f_idx) bool prach::generate_buffer(uint32_t f_idx)
@ -161,26 +156,26 @@ bool prach::generate_buffer(uint32_t f_idx)
bool prach::prepare_to_send(uint32_t preamble_idx_, int allowed_subframe_, float target_power_dbm_) bool prach::prepare_to_send(uint32_t preamble_idx_, int allowed_subframe_, float target_power_dbm_)
{ {
if (cell_initiated && preamble_idx_ < 64) { if (cell_initiated && preamble_idx_ < max_preambles) {
preamble_idx = preamble_idx_; preamble_idx = preamble_idx_;
target_power_dbm = target_power_dbm_; target_power_dbm = target_power_dbm_;
allowed_subframe = allowed_subframe_; allowed_subframe = allowed_subframe_;
transmitted_tti = -1; transmitted_tti = -1;
Debug("PRACH: prepare to send preamble %d\n", preamble_idx); Debug("PRACH: prepare to send preamble %d\n", preamble_idx);
return true; return true;
} else { }
if (!cell_initiated) { if (!cell_initiated) {
Error("PRACH: Cell not configured\n"); Error("PRACH: Cell not configured\n");
} else { } else {
Error("PRACH: Invalid preamble %d\n", preamble_idx_); Error("PRACH: Invalid preamble %d\n", preamble_idx_);
} }
return false; return false;
}
} }
bool prach::is_pending() bool prach::is_pending() const
{ {
return cell_initiated && preamble_idx >= 0 && preamble_idx < 64; return cell_initiated && preamble_idx >= 0 && unsigned(preamble_idx) < max_preambles;
} }
bool prach::is_ready_to_send(uint32_t current_tti_) bool prach::is_ready_to_send(uint32_t current_tti_)
@ -197,7 +192,7 @@ bool prach::is_ready_to_send(uint32_t current_tti_)
return false; return false;
} }
phy_interface_mac_lte::prach_info_t prach::get_info() phy_interface_mac_lte::prach_info_t prach::get_info() const
{ {
phy_interface_mac_lte::prach_info_t info = {}; phy_interface_mac_lte::prach_info_t info = {};
@ -217,8 +212,15 @@ phy_interface_mac_lte::prach_info_t prach::get_info()
cf_t* prach::generate(float cfo, uint32_t* nof_sf, float* target_power) cf_t* prach::generate(float cfo, uint32_t* nof_sf, float* target_power)
{ {
if (cell_initiated && preamble_idx >= 0 && nof_sf && preamble_idx < 64 && srslte_cell_isvalid(&cell) && if (!cell_initiated || preamble_idx < 0 || !nof_sf || unsigned(preamble_idx) >= max_preambles ||
len < MAX_LEN_SF * 30720 && len > 0) { !srslte_cell_isvalid(&cell) || len >= MAX_LEN_SF * 30720 || len == 0) {
Error("PRACH: Invalid parameters: cell_initiated=%d, preamble_idx=%d, cell.nof_prb=%d, len=%d\n",
cell_initiated,
preamble_idx,
cell.nof_prb,
len);
return nullptr;
}
uint32_t f_idx = 0; uint32_t f_idx = 0;
if (cell.frame_type == SRSLTE_TDD) { if (cell.frame_type == SRSLTE_TDD) {
@ -227,19 +229,19 @@ cf_t* prach::generate(float cfo, uint32_t* nof_sf, float* target_power)
if (prach_obj.config_idx >= 48) { if (prach_obj.config_idx >= 48) {
f_idx += 6; f_idx += 6;
} }
if (f_idx >= 12) { if (f_idx >= max_fs) {
Error("PRACH Buffer: Invalid f_idx=%d\n", f_idx); Error("PRACH Buffer: Invalid f_idx=%d\n", f_idx);
f_idx = 0; f_idx = 0;
} }
} }
if (!generate_buffer(f_idx)) { if (!generate_buffer(f_idx)) {
return NULL; return nullptr;
} }
if (!is_buffer_generated(f_idx, preamble_idx)) { if (!is_buffer_generated(f_idx, preamble_idx)) {
Error("PRACH Buffer not generated: f_idx=%d preamble_idx=%d\n", f_idx, preamble_idx); Error("PRACH Buffer not generated: f_idx=%d preamble_idx=%d\n", f_idx, preamble_idx);
return NULL; return nullptr;
} }
// Correct CFO before transmission // Correct CFO before transmission
@ -264,14 +266,4 @@ cf_t* prach::generate(float cfo, uint32_t* nof_sf, float* target_power)
preamble_idx = -1; preamble_idx = -1;
return signal_buffer; return signal_buffer;
} else {
Error("PRACH: Invalid parameters: cell_initiated=%d, preamble_idx=%d, cell.nof_prb=%d, len=%d\n",
cell_initiated,
preamble_idx,
cell.nof_prb,
len);
return NULL;
}
} }
} // namespace srsue

Loading…
Cancel
Save