Valkyrie 2026
Loading...
Searching...
No Matches
PhoenixSignalManager.h
1#pragma once
2#include <string>
3#include <unordered_map>
4
5#include <ctre/phoenix6/StatusSignalCollection.hpp>
6#include <frc2/command/CommandPtr.h>
7#include <frc2/command/Commands.h>
8
9namespace valor {
10
11namespace util {
12
13class PhoenixSignalManager {
14 public:
15 class StatusSignalCollection : public ctre::phoenix6::StatusSignalCollection {
16 public:
17 constexpr std::vector<ctre::phoenix6::BaseStatusSignal*>& GetSignals() { return _signals; }
18 };
19
20 static PhoenixSignalManager& GetInstance();
21
22 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
23 inline void AddSignals(ctre::phoenix6::CANBus bus, Signals&... signals) {
24 defaultSignals[std::string{bus.GetName()}].AddSignals(signals...);
25 }
26
27 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
28 inline void AddSignals(std::string bucketName, ctre::phoenix6::CANBus bus, Signals&... signals) {
29 buckets[bucketName][std::string{bus.GetName()}].AddSignals(signals...);
30 }
31
32 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
33 void AddSignals(std::string bucketName, Signals&... signals) {
34 wpi::array<ctre::phoenix6::BaseStatusSignal*, sizeof...(Signals)> newSignals{(&signals)...};
35 auto& bucket = buckets[bucketName];
36 for (auto& sig : newSignals) {
37 for (auto& [busName, signals] : defaultSignals) {
38 auto it = std::find(signals.GetSignals().begin(), signals.GetSignals().end(), sig);
39 if (it != signals.GetSignals().end()) {
40 signals.GetSignals().erase(it);
41 bucket[busName].AddSignals(*sig);
42 break;
43 }
44 }
45 }
46 }
47
48 void RefreshSignals(std::string bucket);
49 void WaitForSignals(std::string bucket, units::second_t timeout);
50
51 void RefreshSignals();
52
53 void AutoRefreshSignals(bool refresh);
54
55 void RemoveSignals(std::string bucketName);
56
57 private:
58 PhoenixSignalManager();
59
60 frc2::CommandPtr refreshSignalsCommand{frc2::cmd::Run([this] { RefreshSignals(); }).IgnoringDisable(true)};
61 std::unordered_map<std::string, std::unordered_map<std::string, StatusSignalCollection>> buckets;
62 std::unordered_map<std::string, StatusSignalCollection> defaultSignals;
63};
64
65} // namespace util
66
67} // namespace valor