[sim] Change StepTiming to wait for notifiers (#2603)

Old behavior is available via StepTimingAsync.

This makes it significantly easier to use simulation timing with notifiers.

Also update tests to use simulation framework.  This also speeds up the
timing-dependent tests by using simulation timing.  ResourceLock is used
in the Java tests to prevent parallel execution.

While we're here, tweak HAL Notifier implementation:
- Use wait_for instead of wait_until in WaitForNotifierAlarm
- Check for triggerTime = UINT64_MAX in UpdateNotifierAlarm
This commit is contained in:
Peter Johnson
2020-09-27 13:27:53 -07:00
committed by GitHub
parent 62731bea20
commit c3b3fb8b74
23 changed files with 278 additions and 185 deletions

View File

@@ -1,10 +1,12 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include <frc/simulation/SimHooks.h>
#include "CommandTestBase.h"
#include "frc2/command/InstantCommand.h"
#include "frc2/command/ParallelRaceGroup.h"
@@ -18,6 +20,8 @@ class CommandDecoratorTest : public CommandTestBase {};
TEST_F(CommandDecoratorTest, WithTimeoutTest) {
CommandScheduler scheduler = GetScheduler();
frc::sim::PauseTiming();
auto command = RunCommand([] {}, {}).WithTimeout(100_ms);
scheduler.Schedule(&command);
@@ -25,10 +29,12 @@ TEST_F(CommandDecoratorTest, WithTimeoutTest) {
scheduler.Run();
EXPECT_TRUE(scheduler.IsScheduled(&command));
std::this_thread::sleep_for(std::chrono::milliseconds(150));
frc::sim::StepTiming(150_ms);
scheduler.Run();
EXPECT_FALSE(scheduler.IsScheduled(&command));
frc::sim::ResumeTiming();
}
TEST_F(CommandDecoratorTest, WithInterruptTest) {

View File

@@ -18,12 +18,7 @@ CommandTestBase::CommandTestBase() {
CommandScheduler CommandTestBase::GetScheduler() { return CommandScheduler(); }
void CommandTestBase::SetUp() {
frc::sim::DriverStationSim::SetEnabled(true);
while (!frc::sim::DriverStationSim::GetEnabled()) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
void CommandTestBase::SetUp() { frc::sim::DriverStationSim::SetEnabled(true); }
void CommandTestBase::TearDown() {
CommandScheduler::GetInstance().ClearButtons();
@@ -31,7 +26,4 @@ void CommandTestBase::TearDown() {
void CommandTestBase::SetDSEnabled(bool enabled) {
frc::sim::DriverStationSim::SetEnabled(enabled);
while (frc::sim::DriverStationSim::GetEnabled() != enabled) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
}

View File

@@ -1,31 +1,35 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include <frc/simulation/SimHooks.h>
#include "CommandTestBase.h"
#include "frc2/command/NotifierCommand.h"
using namespace frc2;
using namespace std::chrono_literals;
class NotifierCommandTest : public CommandTestBase {};
#ifdef __APPLE__
TEST_F(NotifierCommandTest, DISABLED_NotifierCommandScheduleTest) {
#else
TEST_F(NotifierCommandTest, NotifierCommandScheduleTest) {
#endif
CommandScheduler scheduler = GetScheduler();
int counter = 0;
frc::sim::PauseTiming();
NotifierCommand command([&counter] { counter++; }, 0.01_s, {});
int counter = 0;
NotifierCommand command([&] { counter++; }, 0.01_s, {});
scheduler.Schedule(&command);
std::this_thread::sleep_for(std::chrono::milliseconds(250));
for (int i = 0; i < 5; ++i) {
frc::sim::StepTiming(0.005_s);
}
scheduler.Cancel(&command);
EXPECT_GT(counter, 10);
EXPECT_LT(counter, 100);
frc::sim::ResumeTiming();
EXPECT_EQ(counter, 2);
}

View File

@@ -1,10 +1,12 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include <frc/simulation/SimHooks.h>
#include "CommandTestBase.h"
#include "frc2/command/WaitCommand.h"
#include "frc2/command/WaitUntilCommand.h"
@@ -13,6 +15,8 @@ using namespace frc2;
class WaitCommandTest : public CommandTestBase {};
TEST_F(WaitCommandTest, WaitCommandScheduleTest) {
frc::sim::PauseTiming();
CommandScheduler scheduler = GetScheduler();
WaitCommand command(100_ms);
@@ -20,7 +24,9 @@ TEST_F(WaitCommandTest, WaitCommandScheduleTest) {
scheduler.Schedule(&command);
scheduler.Run();
EXPECT_TRUE(scheduler.IsScheduled(&command));
std::this_thread::sleep_for(std::chrono::milliseconds(110));
frc::sim::StepTiming(110_ms);
scheduler.Run();
EXPECT_FALSE(scheduler.IsScheduled(&command));
frc::sim::ResumeTiming();
}