9#include <units/angle.h>
10#include <units/length.h>
12#include "choreo/util/FieldDimensions.h"
13#include "choreo/util/Map.h"
15namespace choreo::util {
17enum class FlipperType { Mirrored, RotateAround };
29 static constexpr units::meter_t
FlipX(units::meter_t x) {
30 return fieldLength - x;
37 static constexpr units::meter_t
FlipY(units::meter_t y) {
return y; }
43 static constexpr units::radian_t
FlipHeading(units::radian_t heading) {
44 return units::radian_t{std::numbers::pi} - heading;
58 static constexpr units::meter_t
FlipX(units::meter_t x) {
return x; }
64 static constexpr units::meter_t
FlipY(units::meter_t y) {
65 return fieldWidth - y;
72 static constexpr units::radian_t
FlipHeading(units::radian_t heading) {
87 static constexpr units::meter_t
FlipX(units::meter_t x) {
88 return fieldLength - x;
95 static constexpr units::meter_t
FlipY(units::meter_t y) {
96 return fieldWidth - y;
103 static constexpr units::radian_t
FlipHeading(units::radian_t heading) {
104 return units::radian_t{std::numbers::pi} + heading;
108inline constexpr Map flipperMap{
109 std::array{std::pair{2022, FlipperType::RotateAround},
110 std::pair{2023, FlipperType::Mirrored},
111 std::pair{2024, FlipperType::Mirrored},
112 std::pair{2025, FlipperType::RotateAround},
113 std::pair{2026, FlipperType::RotateAround}}};
115inline constexpr int kDefaultYear = 2026;
124template <
int Year = kDefaultYear>
125constexpr auto GetFlipperForYear() {
126 constexpr bool yearInMap = [] {
129 auto checked = flipperMap.
at(Year);
136 if constexpr (!yearInMap) {
137 static_assert(yearInMap,
"Year not found in flipperMap");
139 constexpr auto flipperType = flipperMap.
at(Year);
140 if constexpr (flipperType == FlipperType::RotateAround) {
141 return RotateAroundFlipper{};
142 }
else if constexpr (flipperType == FlipperType::Mirrored) {
143 return MirroredFlipper{};
145 static_assert(flipperType == FlipperType::RotateAround ||
146 flipperType == FlipperType::Mirrored,
147 "Invalid FlipperType in flipperMap");
152template <FlipperType flipperType>
153constexpr auto GetFlipper() {
154 if constexpr (flipperType == FlipperType::RotateAround) {
155 return RotateAroundFlipper{};
156 }
else if constexpr (flipperType == FlipperType::Mirrored) {
157 return MirroredFlipper{};
159 return MirroredYFlipper{};
constexpr const Value & at(const Key &key) const
Definition Map.h:32
Definition AllianceFlipperUtil.h:21
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:43
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:29
static constexpr bool isMirrored
Whether pose should be mirrored.
Definition AllianceFlipperUtil.h:23
static constexpr units::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:37
Definition AllianceFlipperUtil.h:50
static constexpr bool isMirrored
Whether pose should be mirrored.
Definition AllianceFlipperUtil.h:52
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:72
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:58
static constexpr units::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:64
Definition AllianceFlipperUtil.h:79
static constexpr bool isMirrored
Whether pose should be mirrored.
Definition AllianceFlipperUtil.h:81
static constexpr units::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:95
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:103
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:87