yarp-devices
Loading...
Searching...
No Matches
CuiAbsolute.hpp
1// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
2
3#ifndef __CUI_ABSOLUTE_HPP__
4#define __CUI_ABSOLUTE_HPP__
5
6#include <cstdint>
7
8#include <mutex>
9#include <string>
10
11#include <yarp/conf/numeric.h>
12#include <yarp/conf/version.h>
13
14#include <yarp/dev/DeviceDriver.h>
15#include <yarp/dev/IEncodersTimed.h>
16
17#include "ICanBusSharer.hpp"
18#include "StateObserver.hpp"
19#include "CuiAbsolute_ParamsParser.h"
20
21#if YARP_VERSION_COMPARE(>=, 4, 0, 0)
22#define CHECK_JOINT(j) do { std::size_t ax; if (getAxes(ax), (j) != static_cast<int>(ax) - 1) return yarp::dev::ReturnValue_error_input_out_of_bounds; } while (0)
23#else
24#define CHECK_JOINT(j) do { int ax; if (getAxes(&ax), (j) != ax - 1) return false; } while (0)
25#endif
26
38class CuiAbsolute : public yarp::dev::DeviceDriver,
39 public yarp::dev::IEncodersTimedRaw,
42{
43public:
44
45 // --------- DeviceDriver declarations. Implementation in DeviceDriverImpl.cpp ---------
46
47 bool open(yarp::os::Searchable & config) override;
48 bool close() override;
49
50 // --------- ICanBusSharer declarations. Implementation in ICanBusSharerImpl.cpp ---------
51
52 unsigned int getId() override;
53 bool notifyMessage(const roboticslab::can_message & message) override;
54 bool initialize() override;
55 bool finalize() override;
56 bool registerSender(roboticslab::ICanSenderDelegate * sender) override;
57 bool synchronize(double timestamp) override;
58
59 // ---------- IEncodersRaw declarations. Implementation in IEncodersRawImpl.cpp ----------
60
61#if YARP_VERSION_COMPARE(>=, 4, 0, 0)
62 yarp::dev::ReturnValue getAxes(std::size_t & ax) override;
63 yarp::dev::ReturnValue resetEncoderRaw(int j) override;
64 yarp::dev::ReturnValue resetEncodersRaw() override;
65 yarp::dev::ReturnValue setEncoderRaw(int j, double val) override;
66 yarp::dev::ReturnValue setEncodersRaw(const double * vals) override;
67 yarp::dev::ReturnValue getEncoderRaw(int j, double * v) override;
68 yarp::dev::ReturnValue getEncodersRaw(double * encs) override;
69 yarp::dev::ReturnValue getEncoderSpeedRaw(int j, double * sp) override;
70 yarp::dev::ReturnValue getEncoderSpeedsRaw(double * spds) override;
71 yarp::dev::ReturnValue getEncoderAccelerationRaw(int j, double * spds) override;
72 yarp::dev::ReturnValue getEncoderAccelerationsRaw(double * accs) override;
73 yarp::dev::ReturnValue getEncodersTimedRaw(double * encs, double * time) override;
74 yarp::dev::ReturnValue getEncoderTimedRaw(int j, double * encs, double * time) override;
75#else
76 bool getAxes(int * ax) override;
77 bool resetEncoderRaw(int j) override;
78 bool resetEncodersRaw() override;
79 bool setEncoderRaw(int j, double val) override;
80 bool setEncodersRaw(const double * vals) override;
81 bool getEncoderRaw(int j, double * v) override;
82 bool getEncodersRaw(double * encs) override;
83 bool getEncoderSpeedRaw(int j, double * sp) override;
84 bool getEncoderSpeedsRaw(double * spds) override;
85 bool getEncoderAccelerationRaw(int j, double * spds) override;
86 bool getEncoderAccelerationsRaw(double * accs) override;
87 bool getEncodersTimedRaw(double * encs, double * time) override;
88 bool getEncoderTimedRaw(int j, double * encs, double * time) override;
89#endif
90
91private:
92
93 using encoder_t = yarp::conf::float32_t;
94
95 enum class CuiMode { PUSH, PULL, OFF };
96 enum class CuiCommand : std::uint8_t { PUSH_START = 1, PUSH_STOP = 2, POLL = 3 };
97
98 bool performRequest(const std::string & name, unsigned int len, const std::uint8_t * msgData, encoder_t * resp = nullptr);
99 bool startPushMode();
100 bool stopPushMode();
101 bool pollEncoderRead(encoder_t * enc);
102 void normalize(encoder_t * v);
103
104 CuiMode cuiMode {CuiMode::OFF};
105
106 encoder_t encoder {};
107 double encoderTimestamp {0.0};
108
109 roboticslab::ICanSenderDelegate * sender {nullptr};
110 roboticslab::StateObserver * pushStateObserver {nullptr};
111 roboticslab::TypedStateObserver<encoder_t> * pollStateObserver {nullptr};
112
113 mutable std::mutex mutex;
114};
115
116#endif // __CUI_ABSOLUTE_HPP__
Definition CuiAbsolute_ParamsParser.h:47
Implementation for the Cui Absolute Encoder custom UC3M circuit as a single CAN bus joint (control bo...
Definition CuiAbsolute.hpp:42
bool finalize() override
Finalize CAN node communications.
Definition ICanBusSharerImpl.cpp:36
bool notifyMessage(const roboticslab::can_message &message) override
Notify observers that a new CAN message has arrived.
Definition ICanBusSharerImpl.cpp:49
bool initialize() override
Perform CAN node initialization.
Definition ICanBusSharerImpl.cpp:24
bool synchronize(double timestamp) override
Perform synchronized action on CAN master's request.
Definition ICanBusSharerImpl.cpp:92
unsigned int getId() override
Retrieve CAN node ID.
Definition ICanBusSharerImpl.cpp:17
bool registerSender(roboticslab::ICanSenderDelegate *sender) override
Pass a handle to a CAN sender delegate instance.
Definition ICanBusSharerImpl.cpp:84
Abstract base for a CAN bus sharer.
Definition ICanBusSharer.hpp:25
Implementation-agnostic consumer for TX CAN transfers.
Definition ICanSenderDelegate.hpp:22
Data-free state observer.
Definition StateObserver.hpp:75
Type state observer for non-arithmetic types.
Definition StateObserver.hpp:95
Proxy CAN message structure.
Definition CanMessage.hpp:20