diff --git a/srsue/hdr/stack/rrc/rrc_procedures.h b/srsue/hdr/stack/rrc/rrc_procedures.h index b6cdeb7cf..819cf90e3 100644 --- a/srsue/hdr/stack/rrc/rrc_procedures.h +++ b/srsue/hdr/stack/rrc/rrc_procedures.h @@ -36,12 +36,13 @@ public: phy_interface_rrc_lte::cell_search_ret_t cs_ret; phy_interface_rrc_lte::phy_cell_t found_cell; }; - enum class state_t { phy_cell_search, si_acquire }; + enum class state_t { phy_cell_search, si_acquire, wait_measurement }; explicit cell_search_proc(rrc* parent_); srslte::proc_outcome_t init(); srslte::proc_outcome_t step(); srslte::proc_outcome_t react(const cell_search_event_t& event); + srslte::proc_outcome_t check_sib(); phy_interface_rrc_lte::cell_search_ret_t get_result() const { return search_result.cs_ret; } static const char* name() { return "Cell Search"; } diff --git a/srsue/src/stack/rrc/rrc_procedures.cc b/srsue/src/stack/rrc/rrc_procedures.cc index 941579f8c..9473a0c37 100644 --- a/srsue/src/stack/rrc/rrc_procedures.cc +++ b/srsue/src/stack/rrc/rrc_procedures.cc @@ -63,6 +63,8 @@ proc_outcome_t rrc::cell_search_proc::step() } Info("Completed successfully\n"); return proc_outcome_t::success; + } else if (state == state_t::wait_measurement && std::isnormal(rrc_ptr->serving_cell->get_rsrp())) { + return check_sib(); } return proc_outcome_t::yield; } @@ -90,6 +92,17 @@ proc_outcome_t rrc::cell_search_proc::handle_cell_found(const phy_interface_rrc_ return proc_outcome_t::error; } + if (not std::isnormal(rrc_ptr->serving_cell->get_rsrp())) { + Info("No valid measurement found for the serving cell. Wait for valid measurement...\n"); + state = state_t::wait_measurement; + return proc_outcome_t::yield; + } + + return check_sib(); +} + +proc_outcome_t rrc::cell_search_proc::check_sib() +{ if (rrc_ptr->serving_cell->has_sib1()) { Info("Cell has SIB1\n"); // What do we do????