fix phy ctrl call to cell selection observers

master
Francisco Paisana 4 years ago
parent 834c0b3929
commit 75b204bc52

@ -96,10 +96,7 @@ void phy_controller::selecting_cell::exit(phy_controller* f)
// Signal result back to FSM that called cell selection // Signal result back to FSM that called cell selection
bool result = csel_res.result; bool result = csel_res.result;
f->task_sched.defer_task([f, result]() { f->task_sched.defer_task([f, result]() { f->cell_selection_observer(result); });
f->cell_selection_observer(result);
f->cell_selection_observer.reset();
});
} }
void phy_controller::selecting_cell::wait_in_sync::enter(selecting_cell* f) void phy_controller::selecting_cell::wait_in_sync::enter(selecting_cell* f)

@ -56,9 +56,17 @@ struct cell_select_result_test {
"When caller is signalled with cell select result, cell select state cannot be active\n"); "When caller is signalled with cell select result, cell select state cannot be active\n");
exit(1); exit(1);
} }
// start a new cell selection right away
if (counter++ < 1) {
phy_interface_rrc_lte::phy_cell_t new_cell;
new_cell.pci = 3;
new_cell.earfcn = 3400;
phy_ctrl->start_cell_select(new_cell, *this);
}
} }
int result = -1; int result = -1, counter = 0;
phy_controller* phy_ctrl = nullptr; phy_controller* phy_ctrl = nullptr;
}; };
@ -115,7 +123,9 @@ int test_phy_ctrl_fsm()
TESTASSERT(not phy_ctrl.is_in_sync()); TESTASSERT(not phy_ctrl.is_in_sync());
TESTASSERT(phy_ctrl.current_state_name() == "selecting_cell"); TESTASSERT(phy_ctrl.current_state_name() == "selecting_cell");
// TEST: Cell Selection state ignores events other than the cell selection result, and callback is called // TEST: Cell Selection state ignores events other than the cell selection result
// Cell selection observer is called
// New cell selection is started right away without affecting normal operation (e.g. observer should be called)
phy_ctrl.in_sync(); phy_ctrl.in_sync();
TESTASSERT(not phy_ctrl.is_in_sync()); TESTASSERT(not phy_ctrl.is_in_sync());
phy_ctrl.cell_selection_completed(true); phy_ctrl.cell_selection_completed(true);
@ -124,11 +134,18 @@ int test_phy_ctrl_fsm()
TESTASSERT(not phy_ctrl.is_in_sync()); TESTASSERT(not phy_ctrl.is_in_sync());
TESTASSERT(csel_tester.result < 0); TESTASSERT(csel_tester.result < 0);
phy_ctrl.in_sync(); phy_ctrl.in_sync();
task_sched.run_pending_tasks();
// observer is called that starts new cell selection
TESTASSERT(not phy_ctrl.is_in_sync());
TESTASSERT(phy_ctrl.current_state_name() == "selecting_cell");
TESTASSERT(csel_tester.result == 1);
csel_tester.result = 0;
phy_ctrl.cell_selection_completed(true);
TESTASSERT(phy_ctrl.current_state_name() == "selecting_cell");
phy_ctrl.in_sync();
task_sched.run_pending_tasks();
TESTASSERT(phy_ctrl.is_in_sync()); TESTASSERT(phy_ctrl.is_in_sync());
TESTASSERT(phy_ctrl.current_state_name() != "selecting_cell"); TESTASSERT(phy_ctrl.current_state_name() != "selecting_cell");
// TEST: Propagation of cell selection result to caller
task_sched.run_pending_tasks();
TESTASSERT(csel_tester.result == 1); TESTASSERT(csel_tester.result == 1);
// TEST: Cell Selection with timeout being reached // TEST: Cell Selection with timeout being reached

Loading…
Cancel
Save