28 static constexpr frc::Color8Bit VALOR_GOLD{0xEE, 0xA8, 0x00};
29 static constexpr frc::Color8Bit VALOR_PURPLE{0xFF, 0x00, 0xFF};
30 static constexpr frc::Color8Bit RED{0xFF, 0x00, 0x00};
31 static constexpr frc::Color8Bit ORANGE{0xFF, 0x30, 0x00};
32 static constexpr frc::Color8Bit GREEN{0x00, 0xFF, 0x00};
33 static constexpr frc::Color8Bit BLUE{0x00, 0x00, 0xFF};
34 static constexpr frc::Color8Bit LIGHT_BLUE{0xFF, 0x00, 0xF9};
35 static constexpr frc::Color8Bit WHITE{0xFF, 0xFF, 0xFF};
36 static constexpr frc::Color8Bit OFF{0x00, 0x00, 0x00};
38 enum class Priority { LOW, MEDIUM, HIGH };
48 static frc::Color8Bit CANrangeHealthGetter(ctre::phoenix6::hardware::core::CoreCANrange& canrange);
59 CANdleSensor(
int ledCount,
int numSegments,
int canID, std::string canbus =
"baseCAN");
60 CANdleSensor(std::vector<int> segmentSizes,
int canID, std::string canbus =
"baseCAN");
65 void SetBrightness(
double brightness,
bool saveImmediately =
true);
66 void SetStripType(ctre::phoenix6::signals::StripTypeValue stripType,
bool saveImmediately =
true);
68 inline void ApplyConfig() { GetConfigurator().Apply(config); }
76 void SetLED(
int led, frc::Color8Bit color);
85 void SetColor(
int segment, frc::Color8Bit color, Priority priority = Priority::LOW);
93 void SetColor(frc::Color8Bit color, Priority priority = Priority::LOW);
103 template <
typename T>
104 void SetAnimation(
int segment, frc::Color8Bit color, Priority priority = Priority::LOW) {
105 if (priority < currentPriority)
107 currentPriority = priority;
108 if (!segments[segment].animationSlot) {
109 for (
size_t i = 0; i < slots.size(); i++) {
110 if (!slots.test(i)) {
111 segments[segment].animationSlot = i;
117 auto controlRequest = std::make_unique<T>(segments[segment].startLed, segments[segment].endLed);
118 if constexpr (
requires(T& t) { t.Color; })
119 controlRequest->Color = color;
120 controlRequest->Slot = segments[segment].animationSlot.value();
121 segments[segment].controlRequest = std::move(controlRequest);
131 template <
typename T>
132 void SetAnimation(frc::Color8Bit color, Priority priority = Priority::LOW) {
133 if (priority < currentPriority)
135 currentPriority = priority;
138 segments[0].animationSlot = 0;
139 for (
size_t i = 1; i < segments.size(); i++) {
140 segments[i].animationSlot.reset();
141 segments[i].controlRequest.reset();
143 auto controlRequest = std::make_unique<T>(segments[1].startLed, segments.back().endLed);
144 controlRequest->Slot = 0;
145 if constexpr (
requires(T& t) { t.Color; })
146 controlRequest->Color = color;
147 segments[0].controlRequest = std::move(controlRequest);
168 std::unique_ptr<ctre::phoenix6::controls::ControlRequest> controlRequest;
169 std::optional<int> animationSlot;
174 std::vector<int> GenerateSegmentSizes(
int ledCount,
int numSegments);
176 Priority currentPriority = Priority::LOW;
177 std::vector<Segment> segments;
182 void Calculate()
override;
184 std::bitset<8> slots;
186 ctre::phoenix6::configs::CANdleConfiguration config;
void SetAnimation(frc::Color8Bit color, Priority priority=Priority::LOW)
Set an animation for all segments.
Definition CANdleSensor.h:132
void SetAnimation(int segment, frc::Color8Bit color, Priority priority=Priority::LOW)
Set an animation for a specific segment.
Definition CANdleSensor.h:104