ChoreoLib
Choreo support library.
Loading...
Searching...
No Matches
AllianceFlipperUtil.h
1// Copyright (c) Choreo contributors
2
3#pragma once
4
5#include <array>
6#include <numbers>
7#include <utility>
8
9#include <units/angle.h>
10#include <units/length.h>
11
12#include "choreo/util/FieldDimensions.h"
13#include "choreo/util/Map.h"
14
15namespace choreo::util {
16
17enum class FlipperType { Mirrored, RotateAround };
18
23 static constexpr bool isMirrored = true;
24
29 static constexpr units::meter_t FlipX(units::meter_t x) {
30 return fieldLength - x;
31 }
32
37 static constexpr units::meter_t FlipY(units::meter_t y) { return y; }
38
43 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
44 return units::radian_t{std::numbers::pi} - heading;
45 }
46};
47
52 static constexpr bool isMirrored = true;
53
58 static constexpr units::meter_t FlipX(units::meter_t x) { return x; }
59
64 static constexpr units::meter_t FlipY(units::meter_t y) {
65 return fieldWidth - y;
66 }
67
72 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
73 return -heading;
74 }
75};
76
81 static constexpr bool isMirrored = false;
82
87 static constexpr units::meter_t FlipX(units::meter_t x) {
88 return fieldLength - x;
89 }
90
95 static constexpr units::meter_t FlipY(units::meter_t y) {
96 return fieldWidth - y;
97 }
98
103 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
104 return units::radian_t{std::numbers::pi} + heading;
105 }
106};
107
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}}};
114
115inline constexpr int kDefaultYear = 2026;
116
124template <int Year = kDefaultYear>
125constexpr auto GetFlipperForYear() {
126 constexpr bool yearInMap = [] {
127 try {
128 [[maybe_unused]]
129 auto checked = flipperMap.at(Year);
130 return true;
131 } catch (...) {
132 return false;
133 }
134 }();
135
136 if constexpr (!yearInMap) {
137 static_assert(yearInMap, "Year not found in flipperMap");
138 } else {
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{};
144 } else {
145 static_assert(flipperType == FlipperType::RotateAround ||
146 flipperType == FlipperType::Mirrored,
147 "Invalid FlipperType in flipperMap");
148 }
149 }
150}
151
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{};
158 } else {
159 return MirroredYFlipper{};
160 }
161}
162
163} // namespace choreo::util
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