Valor 6800 1.0
Loading...
Searching...
No Matches
PhoenixSignalManager.h
1
2#pragma once
3#include <vector>
4#include <string>
5#include <unordered_set>
6#include <unordered_map>
7#include <ctre/phoenix6/StatusSignal.hpp>
8#include <frc2/command/CommandPtr.h>
9#include <frc2/command/Commands.h>
10
11namespace valor {
12
13namespace util {
14
16 public:
17 static PhoenixSignalManager& GetInstance();
18
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());
24 }
25
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());
31 }
32
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()) {
41 signals.erase(it);
42 bucket[busName].push_back(sig);
43 break;
44 }
45 }
46 }
47 }
48
49 void RefreshSignals(std::string bucket);
50 void WaitForSignals(std::string bucket, units::second_t timeout);
51
52 void RefreshSignals();
53
54 void AutoRefreshSignals(bool refresh);
55
56 private:
58
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;
62};
63
64} // namespace util
65
66} // namespace valor
Definition PhoenixSignalManager.h:15