Skip to content

Commit

Permalink
🔀 Merge branch 'yann/feature/sm/update-state-from-file-exchange-state…
Browse files Browse the repository at this point in the history
…' into develop
  • Loading branch information
ladislas committed Nov 25, 2022
2 parents 546d5dd + 5176e8e commit f4605ce
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 5 deletions.
11 changes: 6 additions & 5 deletions libs/RobotKit/include/StateMachine.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,11 +234,12 @@ struct StateMachine {
, sm::state::file_exchange + boost::sml::on_entry<_> / sm::action::on_file_exchange_start {}
, sm::state::file_exchange + boost::sml::on_exit<_> / sm::action::on_file_exchange_end {}

, sm::state::file_exchange + event<sm::event::file_exchange_stop_requested> [sm::guard::is_not_charging {}] = sm::state::working
, sm::state::file_exchange + event<sm::event::file_exchange_stop_requested> [sm::guard::is_charging {}] = sm::state::charging
, sm::state::file_exchange + event<sm::event::ble_disconnection> [sm::guard::is_not_charging {}] = sm::state::idle
, sm::state::file_exchange + event<sm::event::ble_disconnection> [sm::guard::is_charging {}] = sm::state::charging
, sm::state::file_exchange + event<sm::event::emergency_stop> = sm::state::emergency_stopped
, sm::state::file_exchange + event<sm::event::file_exchange_stop_requested> [sm::guard::is_not_charging {}] = sm::state::working
, sm::state::file_exchange + event<sm::event::file_exchange_stop_requested> [sm::guard::is_charging {}] = sm::state::charging
, sm::state::file_exchange + event<sm::event::ble_disconnection> [sm::guard::is_not_charging {}] = sm::state::idle
, sm::state::file_exchange + event<sm::event::ble_disconnection> [sm::guard::is_charging {}] = sm::state::charging
, sm::state::file_exchange + event<sm::event::emergency_stop> = sm::state::emergency_stopped
, sm::state::file_exchange + event<sm::event::update_requested> [sm::guard::is_ready_to_update {}] = sm::state::updating

, sm::state::updating + boost::sml::on_entry<_> / sm::action::apply_update {}

Expand Down
84 changes: 84 additions & 0 deletions libs/RobotKit/tests/RobotController_test_stateFileExchange.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,3 +136,87 @@ TEST_F(RobotControllerTest, stateFileExchangeEventEmergencyStop)

EXPECT_TRUE(rc.state_machine.is(lksm::state::emergency_stopped));
}

TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateTrue)
{
rc.state_machine.set_current_states(lksm::state::file_exchange);

auto returned_is_charging = true;
auto returned_level = uint8_t {100};

MockFunction<void()> mock_on_update_loaded_callback;
rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction());

Sequence on_file_exchange_end;
// TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event
EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end);

Sequence is_ready_to_update_sequence;
EXPECT_CALL(battery, isCharging)
.InSequence(is_ready_to_update_sequence)
.WillRepeatedly(Return(returned_is_charging));
EXPECT_CALL(battery, level).InSequence(is_ready_to_update_sequence).WillRepeatedly(Return(returned_level));

EXPECT_CALL(firmware_update, loadUpdate).WillOnce(Return(true));
EXPECT_CALL(mock_on_update_loaded_callback, Call);

rc.state_machine.process_event(lksm::event::update_requested {});

EXPECT_TRUE(rc.state_machine.is(lksm::state::updating));
}

TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateFalseIsNotCharging)
{
rc.state_machine.set_current_states(lksm::state::file_exchange);

auto returned_is_charging = false;
auto returned_level = uint8_t {100};

MockFunction<void()> mock_on_update_loaded_callback;
rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction());

Sequence on_file_exchange_end;
// TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event
EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end);

Sequence is_ready_to_update_sequence;
EXPECT_CALL(battery, isCharging)
.InSequence(is_ready_to_update_sequence)
.WillRepeatedly(Return(returned_is_charging));
EXPECT_CALL(battery, level).Times(0).InSequence(is_ready_to_update_sequence);

EXPECT_CALL(firmware_update, loadUpdate).Times(0);
EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0);

rc.state_machine.process_event(lksm::event::update_requested {});

EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange));
}

TEST_F(RobotControllerTest, stateFileExchangeEventUpdateRequestedGuardIsReadyToUpdateFalseBelowMinimalBatteryLevel)
{
rc.state_machine.set_current_states(lksm::state::file_exchange);

auto returned_is_charging = true;
auto returned_level = uint8_t {0};

MockFunction<void()> mock_on_update_loaded_callback;
rc.registerOnUpdateLoadedCallback(mock_on_update_loaded_callback.AsStdFunction());

Sequence on_file_exchange_end;
// TODO (@yann): Trigger file_exchange_start_requested in StateMachine from BLE and do not use process_event
EXPECT_CALL(mbed_mock_gatt, write(_, _, _, _)).Times(AnyNumber()).InSequence(on_file_exchange_end);

Sequence is_ready_to_update_sequence;
EXPECT_CALL(battery, isCharging)
.InSequence(is_ready_to_update_sequence)
.WillRepeatedly(Return(returned_is_charging));
EXPECT_CALL(battery, level).InSequence(is_ready_to_update_sequence).WillRepeatedly(Return(returned_level));

EXPECT_CALL(firmware_update, loadUpdate).Times(0);
EXPECT_CALL(mock_on_update_loaded_callback, Call).Times(0);

rc.state_machine.process_event(lksm::event::update_requested {});

EXPECT_TRUE(rc.state_machine.is(lksm::state::file_exchange));
}
26 changes: 26 additions & 0 deletions libs/RobotKit/tests/StateMachine_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -728,3 +728,29 @@ TEST_F(StateMachineTest, stateFileExhangeEventEmergencyStop)

EXPECT_TRUE(sm.is(lksm::state::emergency_stopped));
}

TEST_F(StateMachineTest, stateFileExhangeEventUpdateRequestedGuardTrue)
{
sm.set_current_states(lksm::state::file_exchange);

EXPECT_CALL(mock_rc, onFileExchangeEnd);

EXPECT_CALL(mock_rc, isReadyToUpdate).WillOnce(Return(true));
EXPECT_CALL(mock_rc, applyUpdate);

sm.process_event(lksm::event::update_requested {});

EXPECT_TRUE(sm.is(lksm::state::updating));
}

TEST_F(StateMachineTest, stateFileExhangeEventUpdateRequestedGuardFalse)
{
sm.set_current_states(lksm::state::file_exchange);

EXPECT_CALL(mock_rc, isReadyToUpdate).WillOnce(Return(false));
EXPECT_CALL(mock_rc, applyUpdate).Times(0);

sm.process_event(lksm::event::update_requested {});

EXPECT_TRUE(sm.is(lksm::state::file_exchange));
}

0 comments on commit f4605ce

Please sign in to comment.