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
13#include <yarp/dev/DeviceDriver.h>
14#include <yarp/dev/IEncodersTimed.h>
15
16#include "ICanBusSharer.hpp"
17#include "StateObserver.hpp"
18#include "CuiAbsolute_ParamsParser.h"
19
20#define CHECK_JOINT(j) do { int ax; if (getAxes(&ax), (j) != ax - 1) return false; } while (0)
21
33class CuiAbsolute : public yarp::dev::DeviceDriver,
34 public yarp::dev::IEncodersTimedRaw,
37{
38public:
39
40 // --------- DeviceDriver declarations. Implementation in DeviceDriverImpl.cpp ---------
41
42 bool open(yarp::os::Searchable & config) override;
43 bool close() override;
44
45 // --------- ICanBusSharer declarations. Implementation in ICanBusSharerImpl.cpp ---------
46
47 unsigned int getId() override;
48 bool notifyMessage(const roboticslab::can_message & message) override;
49 bool initialize() override;
50 bool finalize() override;
51 bool registerSender(roboticslab::ICanSenderDelegate * sender) override;
52 bool synchronize(double timestamp) override;
53
54 // ---------- IEncodersRaw declarations. Implementation in IEncodersRawImpl.cpp ----------
55
56 bool getAxes(int * ax) override;
57 bool resetEncoderRaw(int j) override;
58 bool resetEncodersRaw() override;
59 bool setEncoderRaw(int j, double val) override;
60 bool setEncodersRaw(const double * vals) override;
61 bool getEncoderRaw(int j, double * v) override;
62 bool getEncodersRaw(double * encs) override;
63 bool getEncoderSpeedRaw(int j, double * sp) override;
64 bool getEncoderSpeedsRaw(double * spds) override;
65 bool getEncoderAccelerationRaw(int j, double * spds) override;
66 bool getEncoderAccelerationsRaw(double * accs) override;
67
68 // ---------- IEncodersTimedRaw declarations. Implementation in IEncodersRawImpl.cpp ----------
69
70 bool getEncodersTimedRaw(double * encs, double * time) override;
71 bool getEncoderTimedRaw(int j, double * encs, double * time) override;
72
73private:
74
75 using encoder_t = yarp::conf::float32_t;
76
77 enum class CuiMode { PUSH, PULL, OFF };
78 enum class CuiCommand : std::uint8_t { PUSH_START = 1, PUSH_STOP = 2, POLL = 3 };
79
80 bool performRequest(const std::string & name, unsigned int len, const std::uint8_t * msgData, encoder_t * resp = nullptr);
81 bool startPushMode();
82 bool stopPushMode();
83 bool pollEncoderRead(encoder_t * enc);
84 void normalize(encoder_t * v);
85
86 CuiMode cuiMode {CuiMode::OFF};
87
88 encoder_t encoder {};
89 double encoderTimestamp {0.0};
90
91 roboticslab::ICanSenderDelegate * sender {nullptr};
92 roboticslab::StateObserver * pushStateObserver {nullptr};
93 roboticslab::TypedStateObserver<encoder_t> * pollStateObserver {nullptr};
94
95 mutable std::mutex mutex;
96};
97
98#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:37
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