29 static constexpr frc::Color8Bit VALOR_GOLD{0xEE, 0xA8, 0x00};
30 static constexpr frc::Color8Bit VALOR_PURPLE{0xFF, 0x00, 0xFF};
31 static constexpr frc::Color8Bit RED{0xFF, 0x00, 0x00};
32 static constexpr frc::Color8Bit ORANGE{0xFF, 0x30, 0x00};
33 static constexpr frc::Color8Bit GREEN{0x00, 0xFF, 0x00};
34 static constexpr frc::Color8Bit BLUE{0x00, 0x00, 0xFF};
35 static constexpr frc::Color8Bit LIGHT_BLUE{0xFF, 0x00, 0xF9};
36 static constexpr frc::Color8Bit WHITE{0xFF, 0xFF, 0xFF};
37 static constexpr frc::Color8Bit OFF{0x00, 0x00, 0x00};
39 enum class Priority { LOW, MEDIUM, HIGH };
49 static frc::Color8Bit CANrangeHealthGetter(ctre::phoenix6::hardware::core::CoreCANrange& canrange);
60 CANdleSensor(
int ledCount,
int numSegments,
int canID, std::string canbus =
"baseCAN");
61 CANdleSensor(std::vector<int> segmentSizes,
int canID, std::string canbus =
"baseCAN");
66 void SetBrightness(
double brightness,
bool saveImmediately =
true);
67 void SetStripType(ctre::phoenix6::signals::StripTypeValue stripType,
bool saveImmediately =
true);
69 inline void ApplyConfig() { GetConfigurator().Apply(config); }
77 void SetLED(
int led, frc::Color8Bit color);
86 void SetColor(
int segment, frc::Color8Bit color, Priority priority = Priority::LOW);
94 void SetColor(frc::Color8Bit color, Priority priority = Priority::LOW);
104 template <
typename T>
105 void SetAnimation(
int segment, frc::Color8Bit color, Priority priority = Priority::LOW) {
106 if (priority < currentPriority)
108 currentPriority = priority;
109 if (!segments[segment].animationSlot) {
110 for (
size_t i = 0; i < slots.size(); i++) {
111 if (!slots.test(i)) {
112 segments[segment].animationSlot = i;
118 auto controlRequest = std::make_unique<T>(segments[segment].startLed, segments[segment].endLed);
119 if constexpr (
requires(T& t) { t.Color; })
120 controlRequest->Color = color;
121 controlRequest->Slot = segments[segment].animationSlot.value();
122 segments[segment].controlRequest = std::move(controlRequest);
132 template <
typename T>
133 void SetAnimation(frc::Color8Bit color, Priority priority = Priority::LOW) {
134 if (priority < currentPriority)
136 currentPriority = priority;
139 segments[0].animationSlot = 0;
140 for (
size_t i = 1; i < segments.size(); i++) {
141 segments[i].animationSlot.reset();
142 segments[i].controlRequest.reset();
144 auto controlRequest = std::make_unique<T>(segments[1].startLed, segments.back().endLed);
145 controlRequest->Slot = 0;
146 if constexpr (
requires(T& t) { t.Color; })
147 controlRequest->Color = color;
148 segments[0].controlRequest = std::move(controlRequest);
169 std::unique_ptr<ctre::phoenix6::controls::ControlRequest> controlRequest;
170 std::optional<int> animationSlot;
175 std::vector<int> GenerateSegmentSizes(
int ledCount,
int numSegments);
177 Priority currentPriority = Priority::LOW;
178 std::vector<Segment> segments;
183 void Calculate()
override;
185 std::bitset<8> slots;
187 ctre::phoenix6::configs::CANdleConfiguration config;
void SetAnimation(frc::Color8Bit color, Priority priority=Priority::LOW)
Set an animation for all segments.
Definition CANdleSensor.h:133
void SetAnimation(int segment, frc::Color8Bit color, Priority priority=Priority::LOW)
Set an animation for a specific segment.
Definition CANdleSensor.h:105