[wpilibc] Remove ErrorBase (#3306)

Replace with new exception-based error reporting, consistent with Java.
This also builds stacktraces into the reporting/exceptions.
This commit is contained in:
Peter Johnson
2021-04-18 20:35:29 -07:00
committed by GitHub
parent 0abf6c9045
commit 8d961dfd25
113 changed files with 993 additions and 2200 deletions

View File

@@ -21,10 +21,9 @@ Command::~Command() {
CommandScheduler::GetInstance().Cancel(this);
}
Command::Command(const Command& rhs) : ErrorBase(rhs) {}
Command::Command(const Command& rhs) = default;
Command& Command::operator=(const Command& rhs) {
ErrorBase::operator=(rhs);
m_isGrouped = false;
return *this;
}

View File

@@ -4,19 +4,15 @@
#include "frc2/command/CommandGroupBase.h"
#include <frc/WPIErrors.h>
using namespace frc2;
bool CommandGroupBase::RequireUngrouped(Command& command) {
if (command.IsGrouped()) {
wpi_setGlobalWPIErrorWithContext(
CommandIllegalUse,
throw FRC_MakeError(
frc::err::CommandIllegalUse,
"Commands cannot be added to more than one CommandGroup");
return false;
} else {
return true;
}
return true;
}
bool CommandGroupBase::RequireUngrouped(
@@ -26,8 +22,8 @@ bool CommandGroupBase::RequireUngrouped(
allUngrouped &= !command.get()->IsGrouped();
}
if (!allUngrouped) {
wpi_setGlobalWPIErrorWithContext(
CommandIllegalUse,
throw FRC_MakeError(
frc::err::CommandIllegalUse,
"Commands cannot be added to more than one CommandGroup");
}
return allUngrouped;
@@ -40,8 +36,8 @@ bool CommandGroupBase::RequireUngrouped(
allUngrouped &= !command->IsGrouped();
}
if (!allUngrouped) {
wpi_setGlobalWPIErrorWithContext(
CommandIllegalUse,
throw FRC_MakeError(
frc::err::CommandIllegalUse,
"Commands cannot be added to more than one CommandGroup");
}
return allUngrouped;

View File

@@ -7,7 +7,6 @@
#include <frc/RobotBase.h>
#include <frc/RobotState.h>
#include <frc/TimedRobot.h>
#include <frc/WPIErrors.h>
#include <frc/livewindow/LiveWindow.h>
#include <frc/smartdashboard/SendableBuilder.h>
#include <frc/smartdashboard/SendableRegistry.h>
@@ -112,9 +111,9 @@ void CommandScheduler::Schedule(bool interruptible, Command* command) {
}
if (command->IsGrouped()) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"A command that is part of a command group "
"cannot be independently scheduled");
throw FRC_MakeError(frc::err::CommandIllegalUse,
"A command that is part of a command group "
"cannot be independently scheduled");
return;
}
if (m_impl->disabled ||

View File

@@ -65,9 +65,9 @@ void ParallelCommandGroup::AddCommands(
}
if (isRunning) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
}
for (auto&& command : commands) {
@@ -77,10 +77,9 @@ void ParallelCommandGroup::AddCommands(
m_runWhenDisabled &= command->RunsWhenDisabled();
m_commands.emplace_back(std::move(command), false);
} else {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
return;
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
}
}
}

View File

@@ -60,9 +60,9 @@ void ParallelDeadlineGroup::AddCommands(
}
if (!m_finished) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
}
for (auto&& command : commands) {
@@ -72,10 +72,9 @@ void ParallelDeadlineGroup::AddCommands(
m_runWhenDisabled &= command->RunsWhenDisabled();
m_commands.emplace_back(std::move(command), false);
} else {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
return;
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
}
}
}

View File

@@ -50,9 +50,9 @@ void ParallelRaceGroup::AddCommands(
}
if (isRunning) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
}
for (auto&& command : commands) {
@@ -62,10 +62,9 @@ void ParallelRaceGroup::AddCommands(
m_runWhenDisabled &= command->RunsWhenDisabled();
m_commands.emplace_back(std::move(command));
} else {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
return;
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Multiple commands in a parallel group cannot "
"require the same subsystems");
}
}
}

View File

@@ -60,9 +60,9 @@ void SequentialCommandGroup::AddCommands(
}
if (m_currentCommandIndex != invalid_index) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Commands cannot be added to a CommandGroup "
"while the group is running");
}
for (auto&& command : commands) {

View File

@@ -9,7 +9,6 @@
#include <memory>
#include <string>
#include <frc/ErrorBase.h>
#include <units/time.h>
#include <wpi/ArrayRef.h>
#include <wpi/Demangle.h>
@@ -46,10 +45,10 @@ class ProxyScheduleCommand;
* @see CommandScheduler
* @see CommandHelper
*/
class Command : public frc::ErrorBase {
class Command {
public:
Command() = default;
~Command() override;
virtual ~Command();
Command(const Command&);
Command& operator=(const Command&);

View File

@@ -8,8 +8,7 @@
#include <memory>
#include <utility>
#include <frc/ErrorBase.h>
#include <frc/WPIErrors.h>
#include <frc/Errors.h>
#include <frc/Watchdog.h>
#include <frc/smartdashboard/Sendable.h>
#include <frc/smartdashboard/SendableHelper.h>
@@ -29,7 +28,6 @@ class Subsystem;
* methods to be called and for their default commands to be scheduled.
*/
class CommandScheduler final : public frc::Sendable,
public frc::ErrorBase,
public frc::SendableHelper<CommandScheduler> {
public:
/**
@@ -182,14 +180,12 @@ class CommandScheduler final : public frc::Sendable,
Command, std::remove_reference_t<T>>>>
void SetDefaultCommand(Subsystem* subsystem, T&& defaultCommand) {
if (!defaultCommand.HasRequirement(subsystem)) {
wpi_setWPIErrorWithContext(
CommandIllegalUse, "Default commands must require their subsystem!");
return;
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Default commands must require their subsystem!");
}
if (defaultCommand.IsFinished()) {
wpi_setWPIErrorWithContext(CommandIllegalUse,
"Default commands should not end!");
return;
throw FRC_MakeError(frc::err::CommandIllegalUse,
"Default commands should not end!");
}
SetDefaultCommandImpl(subsystem,
std::make_unique<std::remove_reference_t<T>>(

View File

@@ -15,8 +15,6 @@
#include <utility>
#include <vector>
#include <frc/ErrorBase.h>
#include <frc/WPIErrors.h>
#include <wpi/ArrayRef.h>
#include "frc2/command/CommandGroupBase.h"

View File

@@ -2,6 +2,8 @@
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#include <frc/Errors.h>
#include "CommandTestBase.h"
#include "frc2/command/CommandScheduler.h"
#include "frc2/command/ConditionalCommand.h"
@@ -71,11 +73,9 @@ TEST_F(CommandRequirementsTest, RequirementUninterruptibleTest) {
TEST_F(CommandRequirementsTest, DefaultCommandRequirementErrorTest) {
TestSubsystem requirement1;
ErrorConfirmer confirmer("require");
MockCommand command1;
requirement1.SetDefaultCommand(std::move(command1));
EXPECT_TRUE(requirement1.GetDefaultCommand() == nullptr);
ASSERT_THROW(requirement1.SetDefaultCommand(std::move(command1)),
frc::RuntimeError);
}

View File

@@ -9,7 +9,6 @@
#include <frc/simulation/DriverStationSim.h>
#include "ErrorConfirmer.h"
#include "frc2/command/CommandGroupBase.h"
#include "frc2/command/CommandScheduler.h"
#include "frc2/command/SetUtilities.h"

View File

@@ -1,19 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#include "ErrorConfirmer.h"
#include <regex>
ErrorConfirmer* ErrorConfirmer::instance;
int32_t ErrorConfirmer::HandleError(HAL_Bool isError, int32_t errorCode,
HAL_Bool isLVCode, const char* details,
const char* location, const char* callStack,
HAL_Bool printMsg) {
if (std::regex_search(details, std::regex(instance->m_msg))) {
instance->ConfirmError();
}
return 1;
}

View File

@@ -1,38 +0,0 @@
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.
#pragma once
#include <hal/simulation/MockHooks.h>
#include "gmock/gmock.h"
class ErrorConfirmer {
public:
explicit ErrorConfirmer(const char* msg) : m_msg(msg) {
if (instance != nullptr) {
return;
}
HALSIM_SetSendError(HandleError);
EXPECT_CALL(*this, ConfirmError());
instance = this;
}
~ErrorConfirmer() {
HALSIM_SetSendError(nullptr);
instance = nullptr;
}
MOCK_METHOD0(ConfirmError, void());
const char* m_msg;
static int32_t HandleError(HAL_Bool isError, int32_t errorCode,
HAL_Bool isLVCode, const char* details,
const char* location, const char* callStack,
HAL_Bool printMsg);
private:
static ErrorConfirmer* instance;
};