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
25 static constexpr bool isMirrored = true;
26
33 static constexpr units::meter_t FlipX(units::meter_t x) {
34 return fieldLength - x;
35 }
36
43 static constexpr units::meter_t FlipY(units::meter_t y) { return y; }
44
51 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
52 return units::radian_t{std::numbers::pi} - heading;
53 }
54};
55
62 static constexpr bool isMirrored = false;
63
70 static constexpr units::meter_t FlipX(units::meter_t x) {
71 return fieldLength - x;
72 }
73
80 static constexpr units::meter_t FlipY(units::meter_t y) {
81 return fieldWidth - y;
82 }
83
90 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
91 return units::radian_t{std::numbers::pi} + heading;
92 }
93};
94
95inline constexpr Map flipperMap{
96 std::array{std::pair{2022, FlipperType::RotateAround},
97 std::pair{2023, FlipperType::Mirrored},
98 std::pair{2024, FlipperType::Mirrored},
99 std::pair{2025, FlipperType::RotateAround}}};
100
101inline constexpr int kDefaultYear = 2025;
102
112template <int Year = kDefaultYear>
113constexpr auto GetFlipperForYear() {
114 constexpr bool yearInMap = [] {
115 try {
116 [[maybe_unused]]
117 auto checked = flipperMap.at(Year);
118 return true;
119 } catch (...) {
120 return false;
121 }
122 }();
123
124 if constexpr (!yearInMap) {
125 static_assert(yearInMap, "Year not found in flipperMap");
126 } else {
127 constexpr auto flipperType = flipperMap.at(Year);
128 if constexpr (flipperType == FlipperType::RotateAround) {
129 return RotateAroundFlipper{};
130 } else if constexpr (flipperType == FlipperType::Mirrored) {
131 return MirroredFlipper{};
132 } else {
133 static_assert(flipperType == FlipperType::RotateAround ||
134 flipperType == FlipperType::Mirrored,
135 "Invalid FlipperType in flipperMap");
136 }
137 }
138}
139
140} // namespace choreo::util
constexpr const Value & at(const Key &key) const
Definition Map.h:38
Definition AllianceFlipperUtil.h:23
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:51
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:33
static constexpr bool isMirrored
Whether pose should be mirrored.
Definition AllianceFlipperUtil.h:25
static constexpr units::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:43
Definition AllianceFlipperUtil.h:60
static constexpr bool isMirrored
Whether pose should be mirrored.
Definition AllianceFlipperUtil.h:62
static constexpr units::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:80
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:90
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:70