31#include <rev/driver/FRCCanSpec.h>
40#include <unordered_map>
47static const char* frc_deviceType_text[16] = {
48 "Broadcast",
"Robot Controller",
49 "Motor Controller",
"Relay Controller",
50 "Gyro Sensor",
"Accelerometer",
51 "Ultrasonic Sensor",
"Gear Tooth Sensor",
52 "Power Distribution",
"Pneumatics Controller",
53 "Misc CAN Device",
"IO Breakout",
54 "Servo Controller",
"Reserved",
55 "Firmware Update",
"Unknown",
58static inline const char* GetFRCDeviceTypeText(uint32_t index) {
59 if (index > 12 && index < 31) {
61 }
else if (index > 31) {
63 }
else if (index == 31) {
68 return frc_deviceType_text[index];
71static const char* frc_manufacturer_text[18] = {
"Broadcast",
82 "Playing with Fusion",
90static inline const char* GetFRCManufacturerText(uint32_t index) {
91 index = (index > 17) ? 17 : index;
92 return frc_manufacturer_text[index];
102#define PACKED __attribute__((__packed__))
140 return std::string(GetFRCManufacturerText(
manufacturerId)) +
" " +
176 explicit CANBusScanner(
int buffersize = 256,
int threadIntervalMs = 10);
184 void RegisterDevice(std::string name, std::vector<uint32_t> validIds,
185 int32_t maxFramePeriodMs = 100);
188 class CANScanElement {
193 explicit CANScanElement(uint64_t timeoutMs = 1000);
194 void UpdateLastSeen();
195 bool IsActive()
const;
198 class CANScanCollection {
200 CANScanCollection(std::string name, uint32_t arbId, uint64_t timeoutMs)
201 : name(name), timeout(timeoutMs), arbId(arbId) {}
203 std::vector<int> ActiveDevices()
const {
204 std::vector<int> result;
205 for (
const auto& [devKey, devValue] : devices) {
206 if (devValue.IsActive()) {
207 result.push_back(devKey);
213 void AddOrUpdateDevice(
int id) {
214 if (devices.find(
id) != devices.end()) {
215 devices[id] = CANScanElement(timeout);
217 devices[id].UpdateLastSeen();
220 std::string Name()
const {
return name; }
221 uint32_t ArbId()
const {
return arbId; }
227 std::unordered_map<int, CANScanElement> devices;
234 std::unordered_map<uint32_t, std::shared_ptr<CANScanCollection> >
236 std::vector<std::shared_ptr<CANScanCollection> > m_registeredList;
238 int m_streamBufferSize;
239 uint32_t m_streamHandle;
240 int m_threadInterval;
242 std::thread m_thread;
243 std::atomic_bool m_stopThread;
244 std::atomic_bool m_running;
245 std::string m_lastError;
#define PACKED
Definition: CANDeviceScanner.h:102
Definition: CANDeviceScanner.h:172
~CANBusScanner()
Definition: CANDeviceScanner.cpp:55
bool Start()
Definition: CANDeviceScanner.cpp:64
std::vector< CANScanIdentifier > CANBusScan()
Definition: CANDeviceScanner.cpp:149
bool Running()
Definition: CANDeviceScanner.cpp:92
void Stop()
Definition: CANDeviceScanner.cpp:84
void RegisterDevice(std::string name, std::vector< uint32_t > validIds, int32_t maxFramePeriodMs=100)
Definition: CANDeviceScanner.cpp:133
std::string LastError()
Definition: CANDeviceScanner.cpp:94
CANBusScanner(int buffersize=256, int threadIntervalMs=10)
Definition: CANDeviceScanner.cpp:48
bool operator<(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:148
bool operator==(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:164
bool operator>(const CANScanIdentifier &lhs, const CANScanIdentifier &rhs)
Definition: CANDeviceScanner.h:156
Definition: AbsoluteEncoder.h:33
Definition: CANDeviceScanner.h:122
rev::FRCManufacturer manufacturerId
Definition: CANDeviceScanner.h:124
uint16_t canId
Definition: CANDeviceScanner.h:125
std::string Name() const
Definition: CANDeviceScanner.h:138
uint32_t uniqueId
Definition: CANDeviceScanner.h:126
rev::FRCDeviceType deviceTypeId
Definition: CANDeviceScanner.h:123
CANScanIdentifier(uint32_t arbid, std::string name, uint32_t uniqueId=0)
Definition: CANDeviceScanner.h:128
std::string name
Definition: CANDeviceScanner.h:127
Definition: CANDeviceScanner.h:105
uint16_t api
Definition: CANDeviceScanner.h:107
uint16_t deviceNumber
Definition: CANDeviceScanner.h:106
rev::FRCManufacturer manufacturer
Definition: CANDeviceScanner.h:108
uint8_t rsvd
Definition: CANDeviceScanner.h:110
rev::FRCDeviceType deviceType
Definition: CANDeviceScanner.h:109
Definition: CANDeviceScanner.h:117
frc_frameIDFields_t fields
Definition: CANDeviceScanner.h:118
uint32_t raw
Definition: CANDeviceScanner.h:119