Skip to content
Snippets Groups Projects
Commit 4900771c authored by Andreas Rauschert's avatar Andreas Rauschert
Browse files

Merge branch 'fix_delay' into 'main'

Fix delay if not divisable by simulation step time

See merge request eclipse/simopenpass/openscenario1_engine!104
parents a50f4868 f6809801
No related branches found
No related tags found
No related merge requests found
......@@ -56,18 +56,22 @@ bool Condition::IsSatisfied()
evaluator_->UpdateStatus(is_satisfied);
results_[env_->GetSimulationTime()] = evaluator_->GetStatus();
if (env_->GetSimulationTime() - start_time_ < delay_)
auto previous_result_time = env_->GetSimulationTime() - delay_;
if (previous_result_time < start_time_) // Earlier than first recorded result
{
return false;
}
// Erase all results with "key < env_->GetSimulationTime() - delay_" to avoid memory leak
auto it = results_.find(env_->GetSimulationTime() - delay_);
if (it != results_.end() && it != results_.begin())
auto it = results_.find(previous_result_time);
// If there is no result for the exact previous time, then take the result of one step before
if (it == results_.end())
{
results_.erase(results_.begin(), --it);
it = results_.lower_bound(previous_result_time);
it--;
}
return results_[env_->GetSimulationTime() - delay_];
// Erase all results from before to avoid memory leak
results_.erase(results_.begin(), it);
return results_.begin()->second;
}
} // namespace OPENSCENARIO
......@@ -77,4 +77,32 @@ TEST_F(ConditionTestFixture,
EXPECT_TRUE(condition.IsSatisfied());
}
TEST_F(
ConditionTestFixture,
GivenFulfilledSimulationTimeConditionWithDelayNotDivisableByStepTime_WhenCallingIsSatisfied_ThenReturnTrueAfterDelay)
{
auto scenario_simulation_time_condition =
std::make_shared<NET_ASAM_OPENSCENARIO::v1_1::SimulationTimeConditionImpl>();
scenario_simulation_time_condition->SetRule(NET_ASAM_OPENSCENARIO::v1_1::Rule::GREATER_OR_EQUAL);
scenario_simulation_time_condition->SetValue(0.0);
auto scenario_by_value_condition = std::make_shared<NET_ASAM_OPENSCENARIO::v1_1::ByValueConditionImpl>();
scenario_by_value_condition->SetSimulationTimeCondition(scenario_simulation_time_condition);
auto scenario_condition = std::make_shared<NET_ASAM_OPENSCENARIO::v1_1::ConditionImpl>();
scenario_condition->SetConditionEdge(NET_ASAM_OPENSCENARIO::v1_1::ConditionEdge::NONE);
scenario_condition->SetDelay(0.0123);
scenario_condition->SetByValueCondition(scenario_by_value_condition);
Condition condition(scenario_condition, env_);
EXPECT_FALSE(condition.IsSatisfied());
step_count_++;
EXPECT_FALSE(condition.IsSatisfied());
step_count_++;
EXPECT_TRUE(condition.IsSatisfied());
step_count_++;
EXPECT_TRUE(condition.IsSatisfied());
}
} // namespace OPENSCENARIO
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment