rewrite cell handling in TTCN3 PHY and SS

This commit is contained in:
Andre Puschmann 2020-01-30 22:02:10 +01:00
parent 2a46413121
commit 3d7598a4cb
4 changed files with 86 additions and 67 deletions

View File

@ -65,7 +65,6 @@ public:
void set_cell_map(const cell_list_t& cells_); void set_cell_map(const cell_list_t& cells_);
// phy_interface_rrc_lte // phy_interface_rrc_lte
void get_current_cell(srslte_cell_t* cell_, uint32_t* earfcn_ = NULL);
uint32_t get_current_earfcn(); uint32_t get_current_earfcn();
uint32_t get_current_pci(); uint32_t get_current_pci();
void set_config_scell(asn1::rrc::scell_to_add_mod_r10_s* scell_config); void set_config_scell(asn1::rrc::scell_to_add_mod_r10_s* scell_config);
@ -126,9 +125,13 @@ private:
srslte::logger* logger = nullptr; srslte::logger* logger = nullptr;
srslte::log_filter log; srslte::log_filter log;
// The current cell // All available cells
cell_list_t cells; cell_list_t cells;
uint32_t cell_idx = 0;
// The current PCell
cell_t pcell = {}; cell_t pcell = {};
bool pcell_set = false;
phy_cfg_t phy_cfg = {}; phy_cfg_t phy_cfg = {};

View File

@ -70,6 +70,7 @@ public:
virtual void prach_indication(uint32_t preamble_index, const uint32_t& cell_id) = 0; virtual void prach_indication(uint32_t preamble_index, const uint32_t& cell_id) = 0;
virtual void sr_req(uint32_t tti_tx) = 0; virtual void sr_req(uint32_t tti_tx) = 0;
virtual void tx_pdu(const uint8_t* payload, const int len, const uint32_t tx_tti) = 0; virtual void tx_pdu(const uint8_t* payload, const int len, const uint32_t tx_tti) = 0;
virtual void select_cell(srslte_cell_t cell) = 0;
}; };
class phy_interface_syssim class phy_interface_syssim

View File

@ -508,8 +508,13 @@ public:
} }
} }
dl_rnti = ue->get_dl_sched_rnti(tti); if (pcell_idx == -1) {
log.debug("Skipping TTI. Pcell not yet selected.\n");
continue;
}
// DL/UL processing if UE has selected cell
dl_rnti = ue->get_dl_sched_rnti(tti);
if (SRSLTE_RNTI_ISSI(dl_rnti)) { if (SRSLTE_RNTI_ISSI(dl_rnti)) {
// deliver SIBs one after another // deliver SIBs one after another
mac_interface_phy_lte::mac_grant_dl_t dl_grant = {}; mac_interface_phy_lte::mac_grant_dl_t dl_grant = {};
@ -702,17 +707,6 @@ public:
// SYSSIM defines what cells the UE can connect to // SYSSIM defines what cells the UE can connect to
ue->set_cell_map(phy_cells); ue->set_cell_map(phy_cells);
} }
// reselect SS Pcell
float max_power = -145;
for (uint32_t i = 0; i < cells.size(); ++i) {
float actual_power = cells[i]->initial_power - cells[i]->attenuation;
if (actual_power > max_power) {
max_power = actual_power;
pcell_idx = i;
log.info("Selecting PCI=%d with TxPower=%.2f as Pcell\n", cells[pcell_idx]->cell.id, max_power);
}
}
} }
bool have_valid_pcell() { return (pcell_idx >= 0 && pcell_idx < static_cast<int>(cells.size())); } bool have_valid_pcell() { return (pcell_idx >= 0 && pcell_idx < static_cast<int>(cells.size())); }
@ -871,6 +865,18 @@ public:
return 0; return 0;
} }
void select_cell(srslte_cell_t phy_cell)
{
// find matching cell in SS cell list
for (uint32_t i = 0; i < cells.size(); ++i) {
if (cells[i]->cell.id == phy_cell.id) {
pcell_idx = i;
log.info("New PCell: PCI=%d\n", cells[pcell_idx]->cell.id);
return;
}
}
}
private: private:
// SYS interface // SYS interface
ttcn3_ut_interface ut; ttcn3_ut_interface ut;

View File

@ -23,7 +23,7 @@
namespace srsue { namespace srsue {
#define MIN_IN_SYNC_POWER (-100) #define MIN_IN_SYNC_POWER (-120.0)
#define DEFAULT_RSRQ (-3.0) #define DEFAULT_RSRQ (-3.0)
lte_ttcn3_phy::lte_ttcn3_phy(srslte::logger* logger_) : logger(logger_) {} lte_ttcn3_phy::lte_ttcn3_phy(srslte::logger* logger_) : logger(logger_) {}
@ -72,19 +72,6 @@ void lte_ttcn3_phy::set_cell_map(const cell_list_t& cells_)
cells = cells_; cells = cells_;
} }
// The interface for RRC
void lte_ttcn3_phy::get_current_cell(srslte_cell_t* cell_, uint32_t* earfcn_)
{
std::lock_guard<std::mutex> lock(mutex);
if (cell_) {
memcpy(cell_, &pcell.info, sizeof(srslte_cell_t));
}
if (earfcn_) {
*earfcn_ = pcell.earfcn;
}
}
uint32_t lte_ttcn3_phy::get_current_earfcn() uint32_t lte_ttcn3_phy::get_current_earfcn()
{ {
return pcell.earfcn; return pcell.earfcn;
@ -130,43 +117,39 @@ int lte_ttcn3_phy::meas_stop(uint32_t earfcn, int pci)
return 0; return 0;
}; };
void lte_ttcn3_phy::select_pcell()
{
// select strongest cell as PCell
float max_power = -145;
int max_index = 0;
for (uint32_t i = 0; i < cells.size(); ++i) {
if (cells[i].power > max_power) {
max_power = cells[i].power;
max_index = i;
}
}
pcell = cells[max_index];
log.info("Setting PCell to EARFCN=%d CellId=%d with RS power=%.2f\n", pcell.earfcn, pcell.info.id, pcell.power);
}
/* Cell search and selection procedures */ /* Cell search and selection procedures */
phy_interface_rrc_lte::cell_search_ret_t lte_ttcn3_phy::cell_search(phy_cell_t* found_cell) phy_interface_rrc_lte::cell_search_ret_t lte_ttcn3_phy::cell_search(phy_cell_t* found_cell)
{ {
std::lock_guard<std::mutex> lock(mutex); std::lock_guard<std::mutex> lock(mutex);
select_pcell();
log.info("Running cell search in PHY\n"); log.info("Running cell search in PHY\n");
cell_search_ret_t ret = {};
// Consider cell found if Pcell power >= -100dBm cell_search_ret_t ret = {};
if (pcell.power >= MIN_IN_SYNC_POWER) { ret.found = cell_search_ret_t::CELL_NOT_FOUND;
if (not cells.empty() && cell_idx < cells.size()) {
log.info("Found Cell: EARFCN=%d CellId=%d\n", cells[cell_idx].earfcn, cells[cell_idx].info.id);
if (found_cell) { if (found_cell) {
found_cell->earfcn = pcell.earfcn; found_cell->earfcn = cells[cell_idx].earfcn;
found_cell->pci = pcell.info.id; found_cell->pci = cells[cell_idx].info.id;
}
ret.found = cell_search_ret_t::CELL_FOUND;
// advance index
cell_idx++;
if (cell_idx < cells.size()) {
// more cells will be reported
ret.last_freq = cell_search_ret_t::MORE_FREQS;
} else {
// all available cells have been reported, reset cell index
ret.last_freq = cell_search_ret_t::NO_MORE_FREQS;
cell_idx = 0;
} }
ret.found = cell_search_ret_t::CELL_FOUND;
ret.last_freq = cell_search_ret_t::NO_MORE_FREQS;
} else { } else {
// no suitable cell found log.warning("No cells configured yet.\n");
ret.found = cell_search_ret_t::CELL_NOT_FOUND;
} }
return ret; return ret;
}; };
@ -175,17 +158,31 @@ bool lte_ttcn3_phy::cell_select(phy_cell_t* rrc_cell)
// try to find RRC cell in current cell map // try to find RRC cell in current cell map
for (auto& cell : cells) { for (auto& cell : cells) {
if (cell.info.id == rrc_cell->pci) { if (cell.info.id == rrc_cell->pci) {
pcell = cell; if (cell.power >= MIN_IN_SYNC_POWER) {
return true; pcell = cell;
pcell_set = true;
syssim->select_cell(pcell.info);
log.info("Select PCell with %.2f on PCI=%d on EARFCN=%d.\n", cell.power, rrc_cell->pci, rrc_cell->earfcn);
} else {
pcell_set = false;
log.error("Power of selected cell too low (%.2f < %.2f)\n", cell.power, MIN_IN_SYNC_POWER);
}
return pcell_set;
} }
} }
log.error("Couldn't fine RRC cell with PCI=%d on EARFCN=%d in cell map.\n", rrc_cell->pci, rrc_cell->earfcn);
return false; return false;
}; };
bool lte_ttcn3_phy::cell_is_camping() bool lte_ttcn3_phy::cell_is_camping()
{ {
return (pcell.power >= MIN_IN_SYNC_POWER); if (pcell_set) {
log.info("pcell.power=%2.f\n", pcell.power);
return (pcell.power >= MIN_IN_SYNC_POWER);
}
return false;
}; };
void lte_ttcn3_phy::reset() void lte_ttcn3_phy::reset()
@ -369,21 +366,33 @@ void lte_ttcn3_phy::run_tti()
m.earfcn = cell.earfcn; m.earfcn = cell.earfcn;
m.rsrp = cell.power; m.rsrp = cell.power;
m.rsrq = DEFAULT_RSRQ; m.rsrq = DEFAULT_RSRQ;
// Measurement for PCell needs to have EARFCN set to 0
if (pcell_set && m.earfcn == pcell.earfcn) {
m.earfcn = 0;
}
log.debug("Create cell measurement for PCI=%d, EARFCN=%d with RSRP=%.2f\n", m.pci, m.earfcn, m.rsrp);
phy_meas.push_back(m); phy_meas.push_back(m);
} }
stack->new_cell_meas(phy_meas);
if (not phy_meas.empty()) {
stack->new_cell_meas(phy_meas);
}
// check if Pcell is in sync // check if Pcell is in sync
for (auto& cell : cells) { if (pcell_set) {
if (cell.info.id == pcell.info.id) { for (auto& cell : cells) {
if (cell.power >= MIN_IN_SYNC_POWER) { if (cell.info.id == pcell.info.id) {
log.debug("PCell id=%d power=%.2f -> sync\n", pcell.info.id, cell.power); if (cell.power >= MIN_IN_SYNC_POWER) {
stack->in_sync(); log.debug("PCell id=%d power=%.2f -> sync\n", pcell.info.id, cell.power);
} else { stack->in_sync();
log.debug("PCell id=%d power=%.2f -> out of sync\n", pcell.info.id, cell.power); } else {
stack->out_of_sync(); log.debug("PCell id=%d power=%.2f -> out of sync\n", pcell.info.id, cell.power);
stack->out_of_sync();
}
break; // make sure to call stack only once
} }
break; // make sure to call stack only once
} }
} }