@@ -453,48 +453,47 @@ void MrmHandler::updateMrmState()
453
453
// Check emergency
454
454
const bool is_emergency = isEmergency ();
455
455
456
+ // Send recovery events if is not an emergency
457
+ if (!is_emergency) {
458
+ if (mrm_state_.state != MrmState::NORMAL) transitionTo (MrmState::NORMAL);
459
+ return ;
460
+ }
461
+
456
462
// Get mode
457
463
const bool is_auto_mode = control_mode_->mode == ControlModeReport::AUTONOMOUS;
458
464
459
465
// State Machine
460
- if (mrm_state_.state == MrmState::NORMAL) {
461
- // NORMAL
462
- if (is_auto_mode && is_emergency) {
463
- transitionTo (MrmState::MRM_OPERATING);
464
- return ;
465
- }
466
- } else {
467
- // Emergency
468
- // Send recovery events if "not emergency"
469
- if (!is_emergency) {
470
- transitionTo (MrmState::NORMAL);
471
- return ;
472
- }
466
+ switch (mrm_state_.state ) {
467
+ case MrmState::NORMAL:
468
+ if (is_auto_mode) {
469
+ transitionTo (MrmState::MRM_OPERATING);
470
+ return ;
471
+ }
473
472
474
- if (mrm_state_.state == MrmState::MRM_OPERATING) {
475
- // TODO(TetsuKawa): Check MRC is accomplished
476
- if (mrm_state_.behavior == MrmState::PULL_OVER) {
477
- if (isStopped () && isArrivedAtGoal ()) {
478
- transitionTo (MrmState::MRM_SUCCEEDED);
479
- return ;
480
- }
481
- } else {
482
- if (isStopped ()) {
483
- transitionTo (MrmState::MRM_SUCCEEDED);
484
- return ;
485
- }
473
+ case MrmState::MRM_OPERATING:
474
+ if (!isStopped ()) return ;
475
+ if (mrm_state_.behavior != MrmState::PULL_OVER) {
476
+ transitionTo (MrmState::MRM_SUCCEEDED);
477
+ return ;
486
478
}
487
- } else if (mrm_state_.state == MrmState::MRM_SUCCEEDED) {
488
- const auto current_mrm_behavior = getCurrentMrmBehavior ();
489
- if (current_mrm_behavior != mrm_state_.behavior ) {
479
+ if (isArrivedAtGoal ()) {
480
+ transitionTo (MrmState::MRM_SUCCEEDED);
481
+ }
482
+ return ;
483
+
484
+ case MrmState::MRM_SUCCEEDED:
485
+ if (mrm_state_.behavior != getCurrentMrmBehavior ()) {
490
486
transitionTo (MrmState::MRM_OPERATING);
491
487
}
492
- } else if (mrm_state_.state == MrmState::MRM_FAILED) {
488
+ return ;
489
+ case MrmState::MRM_FAILED:
493
490
// Do nothing(only checking common recovery events)
494
- } else {
491
+ return ;
492
+
493
+ default : {
495
494
const auto msg = " invalid state: " + std::to_string (mrm_state_.state );
496
495
throw std::runtime_error (msg);
497
- }
496
+ } break ;
498
497
}
499
498
}
500
499
0 commit comments