19 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
20 void AddSignals(ctre::phoenix6::CANBus bus, Signals&... signals) {
21 wpi::array<ctre::phoenix6::BaseStatusSignal*,
sizeof...(Signals)> newSignals{(&signals)...};
22 auto& bucket = defaultSignals[std::string{bus.GetName()}];
23 bucket.insert(bucket.begin(), newSignals.begin(), newSignals.end());
26 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
27 void AddSignals(std::string bucketName, ctre::phoenix6::CANBus bus, Signals&... signals) {
28 wpi::array<ctre::phoenix6::BaseStatusSignal*,
sizeof...(Signals)> newSignals{(&signals)...};
29 auto& bucket = buckets[bucketName][std::string{bus.GetName()}];
30 bucket.insert(bucket.begin(), newSignals.begin(), newSignals.end());
33 template <std::derived_from<ctre::phoenix6::BaseStatusSignal>... Signals>
34 void AddSignals(std::string bucketName, Signals&... signals) {
35 wpi::array<ctre::phoenix6::BaseStatusSignal*,
sizeof...(Signals)> newSignals{(&signals)...};
36 auto& bucket = buckets[bucketName];
37 for (
auto& sig : newSignals) {
38 for (
auto& [busName, signals] : defaultSignals) {
39 auto it = std::find(signals.begin(), signals.end(), sig);
40 if (it != signals.end()) {
42 bucket[busName].push_back(sig);
49 void RefreshSignals(std::string bucket);
50 void WaitForSignals(std::string bucket, units::second_t timeout);
52 void RefreshSignals();
54 void AutoRefreshSignals(
bool refresh);
59 frc2::CommandPtr refreshSignalsCommand{frc2::cmd::Run([
this] { RefreshSignals(); }).IgnoringDisable(
true)};
60 std::unordered_map<std::string, std::unordered_map<std::string, std::vector<ctre::phoenix6::BaseStatusSignal*>>> buckets;
61 std::unordered_map<std::string, std::vector<ctre::phoenix6::BaseStatusSignal*>> defaultSignals;