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