yarp-devices
Loading...
Searching...
No Matches
CanBusHico.hpp
1// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
2
3#ifndef __CAN_BUS_HICO_HPP__
4#define __CAN_BUS_HICO_HPP__
5
6#include <set>
7#include <mutex>
8#include <string>
9#include <utility>
10#include <vector>
11
12#include <yarp/os/Bottle.h>
13
14#include <yarp/dev/DeviceDriver.h>
15#include <yarp/dev/CanBusInterface.h>
16
17#include "hico_api.h"
18#include "HicoCanMessage.hpp"
19#include "CanBusHico_ParamsParser.h"
20
31class CanBusHico : public yarp::dev::DeviceDriver,
32 public yarp::dev::ICanBus,
33 public yarp::dev::ICanBusErrors,
34 public yarp::dev::ImplementCanBufferFactory<roboticslab::HicoCanMessage, struct can_msg>,
36{
37public:
38
39 // --------- DeviceDriver declarations. Implementation in DeviceDriverImpl.cpp ---------
40
41 bool open(yarp::os::Searchable& config) override;
42 bool close() override;
43
44 // --------- ICanBus declarations. Implementation in ICanBusImpl.cpp ---------
45
46 bool canSetBaudRate(unsigned int rate) override;
47 bool canGetBaudRate(unsigned int * rate) override;
48 bool canIdAdd(unsigned int id) override;
49 bool canIdDelete(unsigned int id) override;
50 bool canRead(yarp::dev::CanBuffer & msgs, unsigned int size, unsigned int * read, bool wait = false) override;
51 bool canWrite(const yarp::dev::CanBuffer & msgs, unsigned int size, unsigned int * sent, bool wait = false) override;
52
53 // --------- ICanBusErrors declarations. Implementation in ICanBusErrorsImpl.cpp ---------
54
55 bool canGetErrors(yarp::dev::CanErrors & err) override;
56
57private:
58
60 {
61 public:
62 enum filter_config { DISABLED, NO_RANGE, MASK_AND_RANGE };
63
64 explicit FilterManager(const CanBusHico & owner, int fileDescriptor, bool enableRanges);
65
66 bool parseIds(const std::vector<int> & ids);
67 bool hasId(unsigned int id) const;
68 bool isValid() const;
69 bool insertId(unsigned int id);
70 bool eraseId(unsigned int id);
71 bool clearFilters(bool clearStage = true);
72
73 static constexpr int MAX_FILTERS = 4;
74
75 private:
76 bool setMaskedFilter(unsigned int id);
77 bool setRangedFilter(unsigned int lower, unsigned int upper);
78 bool bulkUpdate();
79
80 const CanBusHico & owner;
81 int fd {0};
82 bool valid {false};
83 bool enableRanges {false};
84 std::set<unsigned int> stage, currentlyActive;
85 };
86
87 FilterManager::filter_config parseFilterConfiguration(const std::string & str);
88
89 enum io_operation { READ, WRITE };
90
91 bool waitUntilTimeout(io_operation op, bool * bufferReady);
92 bool bitrateToId(unsigned int bitrate, unsigned int * id);
93 bool idToBitrate(unsigned int id, unsigned int * bitrate);
94
95 int fileDescriptor {0};
96
97 mutable std::mutex canBusReady;
98
99 std::pair<bool, unsigned int> bitrateState;
100
101 FilterManager * filterManager {nullptr};
102
103 FilterManager::filter_config filterConfig;
104};
105
106#endif // __CAN_BUS_HICO_HPP__
Definition CanBusHico.hpp:60
Definition CanBusHico_ParamsParser.h:50
Specifies the HicoCan (hcanpci) behaviour and specifications.
Definition CanBusHico.hpp:36