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 = false;
53
58 static constexpr units::meter_t FlipX(units::meter_t x) {
59 return fieldLength - x;
60 }
61
66 static constexpr units::meter_t FlipY(units::meter_t y) {
67 return fieldWidth - y;
68 }
69
74 static constexpr units::radian_t FlipHeading(units::radian_t heading) {
75 return units::radian_t{std::numbers::pi} + heading;
76 }
77};
78
79inline constexpr Map flipperMap{
80 std::array{std::pair{2022, FlipperType::RotateAround},
81 std::pair{2023, FlipperType::Mirrored},
82 std::pair{2024, FlipperType::Mirrored},
83 std::pair{2025, FlipperType::RotateAround}}};
84
85inline constexpr int kDefaultYear = 2025;
86
94template <int Year = kDefaultYear>
95constexpr auto GetFlipperForYear() {
96 constexpr bool yearInMap = [] {
97 try {
98 [[maybe_unused]]
99 auto checked = flipperMap.at(Year);
100 return true;
101 } catch (...) {
102 return false;
103 }
104 }();
105
106 if constexpr (!yearInMap) {
107 static_assert(yearInMap, "Year not found in flipperMap");
108 } else {
109 constexpr auto flipperType = flipperMap.at(Year);
110 if constexpr (flipperType == FlipperType::RotateAround) {
111 return RotateAroundFlipper{};
112 } else if constexpr (flipperType == FlipperType::Mirrored) {
113 return MirroredFlipper{};
114 } else {
115 static_assert(flipperType == FlipperType::RotateAround ||
116 flipperType == FlipperType::Mirrored,
117 "Invalid FlipperType in flipperMap");
118 }
119 }
120}
121
122} // 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::meter_t FlipY(units::meter_t y)
Definition AllianceFlipperUtil.h:66
static constexpr units::radian_t FlipHeading(units::radian_t heading)
Definition AllianceFlipperUtil.h:74
static constexpr units::meter_t FlipX(units::meter_t x)
Definition AllianceFlipperUtil.h:58