[wpilibc] Change DriverStationSim to use a C++ enum for alliance station (#8991)

This commit is contained in:
PJ Reiniger
2026-06-21 22:29:19 -04:00
committed by GitHub
parent af91ba39f2
commit 45d4ed5bca
8 changed files with 97 additions and 61 deletions

View File

@@ -9,6 +9,26 @@
namespace wpi::hal {
/**
* The alliance station ID.
*/
enum class AllianceStationID {
/// Unknown.
UNKNOWN = HAL_ALLIANCE_STATION_UNKNOWN,
/// Red Alliance Station 1.
RED_1 = HAL_ALLIANCE_STATION_RED_1,
/// Red Alliance Station 2.
RED_2 = HAL_ALLIANCE_STATION_RED_2,
/// Red Alliance Station 3.
RED_3 = HAL_ALLIANCE_STATION_RED_3,
/// Blue Alliance Station 1.
BLUE_1 = HAL_ALLIANCE_STATION_BLUE_1,
/// Blue Alliance Station 2.
BLUE_2 = HAL_ALLIANCE_STATION_BLUE_2,
/// Blue Alliance Station 3.
BLUE_3 = HAL_ALLIANCE_STATION_BLUE_3,
};
/**
* The overall robot mode (not including enabled state).
*/

View File

@@ -5,6 +5,7 @@ extra_includes:
- src/ds_types_fmt.h
enums:
AllianceStationID:
RobotMode:
classes:
wpi::hal::ControlWord:

View File

@@ -6,6 +6,7 @@ extra_includes:
enums:
HAL_AllianceStationID:
rename: _AllianceStationID
value_prefix: HAL_ALLIANCE_STATION
HAL_JoystickPOV:
value_prefix: HAL_JOYSTICK_POV

View File

@@ -111,13 +111,15 @@ DriverStationSim::RegisterAllianceStationIdCallback(NotifyCallback callback,
return store;
}
HAL_AllianceStationID DriverStationSim::GetAllianceStationId() {
return HALSIM_GetDriverStationAllianceStationId();
wpi::hal::AllianceStationID DriverStationSim::GetAllianceStationId() {
return static_cast<wpi::hal::AllianceStationID>(
HALSIM_GetDriverStationAllianceStationId());
}
void DriverStationSim::SetAllianceStationId(
HAL_AllianceStationID allianceStationId) {
HALSIM_SetDriverStationAllianceStationId(allianceStationId);
wpi::hal::AllianceStationID allianceStationId) {
HALSIM_SetDriverStationAllianceStationId(
static_cast<HAL_AllianceStationID>(allianceStationId));
}
std::unique_ptr<CallbackStore> DriverStationSim::RegisterMatchTimeCallback(

View File

@@ -195,14 +195,15 @@ class DriverStationSim {
*
* @return the alliance station color and number
*/
static HAL_AllianceStationID GetAllianceStationId();
static wpi::hal::AllianceStationID GetAllianceStationId();
/**
* Change the alliance station.
*
* @param allianceStationId the new alliance station
*/
static void SetAllianceStationId(HAL_AllianceStationID allianceStationId);
static void SetAllianceStationId(
wpi::hal::AllianceStationID allianceStationId);
/**
* Register a callback on match time.

View File

@@ -127,81 +127,88 @@ TEST(DriverStationTest, AllianceStationId) {
EnumCallback callback;
HAL_AllianceStationID allianceStation = HAL_ALLIANCE_STATION_BLUE_2;
hal::AllianceStationID allianceStation = hal::AllianceStationID::BLUE_2;
DriverStationSim::SetAllianceStationId(allianceStation);
auto cb = DriverStationSim::RegisterAllianceStationIdCallback(
callback.GetCallback(), false);
// Unknown
allianceStation = HAL_ALLIANCE_STATION_UNKNOWN;
allianceStation = hal::AllianceStationID::UNKNOWN;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_FALSE(MatchState::GetAlliance().has_value());
EXPECT_FALSE(MatchState::GetLocation().has_value());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// B1
allianceStation = HAL_ALLIANCE_STATION_BLUE_1;
allianceStation = hal::AllianceStationID::BLUE_1;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::BLUE, MatchState::GetAlliance());
EXPECT_EQ(1, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// B2
allianceStation = HAL_ALLIANCE_STATION_BLUE_2;
allianceStation = hal::AllianceStationID::BLUE_2;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::BLUE, MatchState::GetAlliance());
EXPECT_EQ(2, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// B3
allianceStation = HAL_ALLIANCE_STATION_BLUE_3;
allianceStation = hal::AllianceStationID::BLUE_3;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::BLUE, MatchState::GetAlliance());
EXPECT_EQ(3, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// R1
allianceStation = HAL_ALLIANCE_STATION_RED_1;
allianceStation = hal::AllianceStationID::RED_1;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::RED, MatchState::GetAlliance());
EXPECT_EQ(1, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// R2
allianceStation = HAL_ALLIANCE_STATION_RED_2;
allianceStation = hal::AllianceStationID::RED_2;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::RED, MatchState::GetAlliance());
EXPECT_EQ(2, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
// R3
allianceStation = HAL_ALLIANCE_STATION_RED_3;
allianceStation = hal::AllianceStationID::RED_3;
DriverStationSim::SetAllianceStationId(allianceStation);
wpi::sim::DriverStationSim::NotifyNewData();
EXPECT_EQ(allianceStation, DriverStationSim::GetAllianceStationId());
EXPECT_EQ(Alliance::RED, MatchState::GetAlliance());
EXPECT_EQ(3, MatchState::GetLocation());
EXPECT_TRUE(callback.WasTriggered());
EXPECT_EQ(allianceStation, callback.GetLastValue());
EXPECT_EQ(static_cast<HAL_AllianceStationID>(allianceStation),
callback.GetLastValue());
}
TEST(DriverStationTest, ReplayNumber) {

View File

@@ -43,7 +43,8 @@ class DigitalCommunicationTest : public testing::TestWithParam<T> {
}
};
class AllianceTest : public DigitalCommunicationTest<HAL_AllianceStationID> {};
class AllianceTest
: public DigitalCommunicationTest<wpi::hal::AllianceStationID> {};
TEST_P(AllianceTest, Alliance) {
auto alliance = GetParam();
@@ -57,15 +58,15 @@ TEST_P(AllianceTest, Alliance) {
bool isRed = false;
switch (alliance) {
case HAL_ALLIANCE_STATION_BLUE_1:
case HAL_ALLIANCE_STATION_BLUE_2:
case HAL_ALLIANCE_STATION_BLUE_3:
case HAL_ALLIANCE_STATION_UNKNOWN:
case wpi::hal::AllianceStationID::BLUE_1:
case wpi::hal::AllianceStationID::BLUE_2:
case wpi::hal::AllianceStationID::BLUE_3:
case wpi::hal::AllianceStationID::UNKNOWN:
isRed = false;
break;
case HAL_ALLIANCE_STATION_RED_1:
case HAL_ALLIANCE_STATION_RED_2:
case HAL_ALLIANCE_STATION_RED_3:
case wpi::hal::AllianceStationID::RED_1:
case wpi::hal::AllianceStationID::RED_2:
case wpi::hal::AllianceStationID::RED_3:
isRed = true;
break;
}
@@ -74,26 +75,27 @@ TEST_P(AllianceTest, Alliance) {
INSTANTIATE_TEST_SUITE_P(
DigitalCommunicationTests, AllianceTest,
testing::Values<HAL_AllianceStationID>(
HAL_ALLIANCE_STATION_RED_1, HAL_ALLIANCE_STATION_RED_2,
HAL_ALLIANCE_STATION_RED_3, HAL_ALLIANCE_STATION_BLUE_1,
HAL_ALLIANCE_STATION_BLUE_2, HAL_ALLIANCE_STATION_BLUE_3,
HAL_ALLIANCE_STATION_UNKNOWN),
testing::Values<wpi::hal::AllianceStationID>(
wpi::hal::AllianceStationID::RED_1, wpi::hal::AllianceStationID::RED_2,
wpi::hal::AllianceStationID::RED_3, wpi::hal::AllianceStationID::BLUE_1,
wpi::hal::AllianceStationID::BLUE_2,
wpi::hal::AllianceStationID::BLUE_3,
wpi::hal::AllianceStationID::UNKNOWN),
[](const testing::TestParamInfo<AllianceTest::ParamType>& info) {
switch (info.param) {
case HAL_ALLIANCE_STATION_BLUE_1:
case wpi::hal::AllianceStationID::BLUE_1:
return std::string{"Blue1"};
case HAL_ALLIANCE_STATION_BLUE_2:
case wpi::hal::AllianceStationID::BLUE_2:
return std::string{"Blue2"};
case HAL_ALLIANCE_STATION_BLUE_3:
case wpi::hal::AllianceStationID::BLUE_3:
return std::string{"Blue3"};
case HAL_ALLIANCE_STATION_RED_1:
case wpi::hal::AllianceStationID::RED_1:
return std::string{"Red1"};
case HAL_ALLIANCE_STATION_RED_2:
case wpi::hal::AllianceStationID::RED_2:
return std::string{"Red2"};
case HAL_ALLIANCE_STATION_RED_3:
case wpi::hal::AllianceStationID::RED_3:
return std::string{"Red3"};
case HAL_ALLIANCE_STATION_UNKNOWN:
case wpi::hal::AllianceStationID::UNKNOWN:
return std::string{"Unknown"};
}
return std::string{"Error"};

View File

@@ -52,7 +52,8 @@ class I2CCommunicationTest : public testing::TestWithParam<T> {
}
};
class AllianceTest : public I2CCommunicationTest<HAL_AllianceStationID> {};
class AllianceTest : public I2CCommunicationTest<wpi::hal::AllianceStationID> {
};
TEST_P(AllianceTest, Alliance) {
auto alliance = GetParam();
@@ -65,17 +66,17 @@ TEST_P(AllianceTest, Alliance) {
char expected = 'U';
switch (alliance) {
case HAL_ALLIANCE_STATION_BLUE_1:
case HAL_ALLIANCE_STATION_BLUE_2:
case HAL_ALLIANCE_STATION_BLUE_3:
case wpi::hal::AllianceStationID::BLUE_1:
case wpi::hal::AllianceStationID::BLUE_2:
case wpi::hal::AllianceStationID::BLUE_3:
expected = 'B';
break;
case HAL_ALLIANCE_STATION_RED_1:
case HAL_ALLIANCE_STATION_RED_2:
case HAL_ALLIANCE_STATION_RED_3:
case wpi::hal::AllianceStationID::RED_1:
case wpi::hal::AllianceStationID::RED_2:
case wpi::hal::AllianceStationID::RED_3:
expected = 'R';
break;
case HAL_ALLIANCE_STATION_UNKNOWN:
case wpi::hal::AllianceStationID::UNKNOWN:
expected = 'U';
break;
}
@@ -84,26 +85,27 @@ TEST_P(AllianceTest, Alliance) {
INSTANTIATE_TEST_SUITE_P(
I2CCommunicationTests, AllianceTest,
testing::Values<HAL_AllianceStationID>(
HAL_ALLIANCE_STATION_RED_1, HAL_ALLIANCE_STATION_RED_2,
HAL_ALLIANCE_STATION_RED_3, HAL_ALLIANCE_STATION_BLUE_1,
HAL_ALLIANCE_STATION_BLUE_2, HAL_ALLIANCE_STATION_BLUE_3,
HAL_ALLIANCE_STATION_UNKNOWN),
testing::Values<wpi::hal::AllianceStationID>(
wpi::hal::AllianceStationID::RED_1, wpi::hal::AllianceStationID::RED_2,
wpi::hal::AllianceStationID::RED_3, wpi::hal::AllianceStationID::BLUE_1,
wpi::hal::AllianceStationID::BLUE_2,
wpi::hal::AllianceStationID::BLUE_3,
wpi::hal::AllianceStationID::UNKNOWN),
[](const testing::TestParamInfo<AllianceTest::ParamType>& info) {
switch (info.param) {
case HAL_ALLIANCE_STATION_BLUE_1:
case wpi::hal::AllianceStationID::BLUE_1:
return std::string{"Blue1"};
case HAL_ALLIANCE_STATION_BLUE_2:
case wpi::hal::AllianceStationID::BLUE_2:
return std::string{"Blue2"};
case HAL_ALLIANCE_STATION_BLUE_3:
case wpi::hal::AllianceStationID::BLUE_3:
return std::string{"Blue3"};
case HAL_ALLIANCE_STATION_RED_1:
case wpi::hal::AllianceStationID::RED_1:
return std::string{"Red1"};
case HAL_ALLIANCE_STATION_RED_2:
case wpi::hal::AllianceStationID::RED_2:
return std::string{"Red2"};
case HAL_ALLIANCE_STATION_RED_3:
case wpi::hal::AllianceStationID::RED_3:
return std::string{"Red3"};
case HAL_ALLIANCE_STATION_UNKNOWN:
case wpi::hal::AllianceStationID::UNKNOWN:
return std::string{"Unknown"};
}
return std::string{"Error"};