13class PhoenixSignalManager {
17 constexpr std::vector<ctre::phoenix6::BaseStatusSignal*>& GetSignals() {
return _signals; }
20 static PhoenixSignalManager& GetInstance();
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...);
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...);
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);
48 void RefreshSignals(std::string bucket);
49 void WaitForSignals(std::string bucket, units::second_t timeout);
51 void RefreshSignals();
53 void AutoRefreshSignals(
bool refresh);
55 void RemoveSignals(std::string bucketName);
58 PhoenixSignalManager();
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;