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