31#include <rev/driver/FRCCanSpec.h>
40#include <unordered_map>
47static const char* frc_deviceType_text[16] = {
57 "Pneumatics Controller",
66static inline const char* GetFRCDeviceTypeText(uint32_t index) {
67 if (index > 12 && index < 31) {
69 }
else if (index > 31) {
71 }
else if (index == 31) {
76 return frc_deviceType_text[index];
79static const char* frc_manufacturer_text[18] = {
"Broadcast",
90 "Playing with Fusion",
98static inline const char* GetFRCManufacturerText(uint32_t index) {
99 index = (index > 17) ? 17 : index;
100 return frc_manufacturer_text[index];
110#define PACKED __attribute__((__packed__))
144 return std::string(GetFRCManufacturerText(
manufacturerId)) +
" " +
180 explicit CANBusScanner(
int buffersize = 256,
int threadIntervalMs = 10);
188 void RegisterDevice(std::string name, std::vector<uint32_t> validIds,
189 int32_t maxFramePeriodMs = 100);
192 class CANScanElement {
197 explicit CANScanElement(uint64_t timeoutMs = 1000);
198 void UpdateLastSeen();
199 bool IsActive()
const;
202 class CANScanCollection {
204 CANScanCollection(std::string name, uint32_t arbId, uint64_t timeoutMs)
205 : name(name), timeout(timeoutMs), arbId(arbId) {}
207 std::vector<int> ActiveDevices()
const {
208 std::vector<int> result;
209 for (
const auto& [devKey, devValue] : devices) {
210 if (devValue.IsActive()) {
211 result.push_back(devKey);
217 void AddOrUpdateDevice(
int id) {
218 if (devices.find(
id) != devices.end()) {
219 devices[id] = CANScanElement(timeout);
221 devices[id].UpdateLastSeen();
224 std::string Name()
const {
return name; }
225 uint32_t ArbId()
const {
return arbId; }
231 std::unordered_map<int, CANScanElement> devices;
238 std::unordered_map<uint32_t, std::shared_ptr<CANScanCollection> >
240 std::vector<std::shared_ptr<CANScanCollection> > m_registeredList;
242 int m_streamBufferSize;
243 uint32_t m_streamHandle;
244 int m_threadInterval;
246 std::thread m_thread;
247 std::atomic_bool m_stopThread;
248 std::atomic_bool m_running;
249 std::string m_lastError;
#define PACKED
Definition: CANDeviceScanner.h:110
Definition: CANDeviceScanner.h:176
~CANBusScanner()
Definition: CANDeviceScanner.cpp:55
bool Start()
Definition: CANDeviceScanner.cpp:61
std::vector< CANScanIdentifier > CANBusScan()
Definition: CANDeviceScanner.cpp:146
bool Running()
Definition: CANDeviceScanner.cpp:89
void Stop()
Definition: CANDeviceScanner.cpp:81
void RegisterDevice(std::string name, std::vector< uint32_t > validIds, int32_t maxFramePeriodMs=100)
Definition: CANDeviceScanner.cpp:130
std::string LastError()
Definition: CANDeviceScanner.cpp:91
CANBusScanner(int buffersize=256, int threadIntervalMs=10)
Definition: CANDeviceScanner.cpp:48
bool operator<(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:152
bool operator==(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:168
bool operator>(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:160
Definition: SparkLowLevel.cpp:40
Definition: CANDeviceScanner.h:126
rev::FRCManufacturer manufacturerId
Definition: CANDeviceScanner.h:128
uint16_t canId
Definition: CANDeviceScanner.h:129
std::string Name() const
Definition: CANDeviceScanner.h:142
uint32_t uniqueId
Definition: CANDeviceScanner.h:130
rev::FRCDeviceType deviceTypeId
Definition: CANDeviceScanner.h:127
CANScanIdentifier(uint32_t arbid, std::string name, uint32_t uniqueId=0)
Definition: CANDeviceScanner.h:132
std::string name
Definition: CANDeviceScanner.h:131
Definition: CANDeviceScanner.h:113
uint16_t api
Definition: CANDeviceScanner.h:115
uint16_t deviceNumber
Definition: CANDeviceScanner.h:114
rev::FRCManufacturer manufacturer
Definition: CANDeviceScanner.h:116
uint8_t rsvd
Definition: CANDeviceScanner.h:118
rev::FRCDeviceType deviceType
Definition: CANDeviceScanner.h:117
Definition: CANDeviceScanner.h:121
frc_frameIDFields_t fields
Definition: CANDeviceScanner.h:122
uint32_t raw
Definition: CANDeviceScanner.h:123