Skip to content

Commit f90cf0c

Browse files
committed
Move ActuatorData validators into class
1 parent a93442c commit f90cf0c

File tree

2 files changed

+45
-29
lines changed

2 files changed

+45
-29
lines changed

transmission_interface/include/transmission_interface/actuator_data.h

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <vector>
4+
#include <algorithm>
45

56
namespace transmission_interface
67
{
@@ -20,21 +21,52 @@ struct EffortActuatorData
2021
std::vector<double*> effort;
2122
};
2223

23-
class ActuatorBase {};
24+
class ActuatorDataBase
25+
{
26+
public:
27+
virtual bool empty() const = 0;
28+
virtual bool hasSize(std::size_t size) const = 0;
29+
virtual bool valid() const = 0;
30+
31+
inline bool hasValidPointers(const std::vector<double*>& data) const
32+
{
33+
return std::all_of(data.cbegin(), data.cend(), [](const double* ptr){ return ptr;});
34+
}
35+
};
2436

2537
template<typename... Interfaces>
26-
struct ActuatorDataContainer : public ActuatorBase, public Interfaces...
38+
struct ActuatorDataContainer : public ActuatorDataBase, public Interfaces...
2739
{
2840
public:
2941
ActuatorDataContainer(){}
3042
ActuatorDataContainer(Interfaces... ifaces) : Interfaces(ifaces)... {}
43+
virtual bool empty() const = 0;
44+
virtual bool hasSize(std::size_t size) const = 0;
45+
virtual bool valid() const = 0;
3146
};
3247

3348

3449
/**
3550
* \brief Contains pointers to raw data representing the position, velocity and acceleration of a transmission's
3651
* actuators.
3752
*/
38-
using ActuatorData = ActuatorDataContainer<PositionActuatorData, VelocityActuatorData, EffortActuatorData>;
53+
class ActuatorData : public ActuatorDataContainer<PositionActuatorData, VelocityActuatorData, EffortActuatorData>
54+
{
55+
public:
56+
bool empty() const override
57+
{
58+
return position.empty() && velocity.empty() && effort.empty();
59+
}
60+
61+
bool hasSize(std::size_t size) const override
62+
{
63+
return ((not empty()) and (position.size() == size) and (velocity.size() == size) and (effort.size() == size));
64+
}
65+
66+
bool valid() const override
67+
{
68+
return hasValidPointers(position) and hasValidPointers(velocity) and hasValidPointers(effort);
69+
}
70+
};
3971

4072
} // namespace transmission_interface

transmission_interface/include/transmission_interface/transmission_interface.h

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ namespace transmission_interface
4646
* \brief Handle for propagating a single map (position, velocity, or effort) on a single transmission
4747
* (eg. actuator to joint effort for a simple reducer).
4848
*/
49-
template <class ActuatorDataType = ActuatorData> // extends ActuatorBase
49+
template <class ActuatorDataType = ActuatorData> // extends ActuatorDataBase
5050
class TransmissionHandle
5151
{
5252
public:
@@ -69,10 +69,10 @@ class TransmissionHandle
6969
* data and their size should be consistent with the number of transmission actuators and joints.
7070
* Data vectors not used by this handle can remain empty.
7171
*/
72-
TransmissionHandle(const std::string& name,
73-
Transmission* transmission,
74-
const ActuatorData& actuator_data,
75-
const JointData& joint_data)
72+
TransmissionHandle(const std::string& name,
73+
Transmission* transmission,
74+
const ActuatorDataType& actuator_data,
75+
const JointData& joint_data)
7676
: name_(name),
7777
transmission_(transmission),
7878
actuator_data_(actuator_data),
@@ -85,24 +85,16 @@ class TransmissionHandle
8585
}
8686

8787
// Catch trivial error: All data vectors are empty (handle can't do anything without data)
88-
if (actuator_data.position.empty() && actuator_data.velocity.empty() && actuator_data.effort.empty() &&
88+
if (actuator_data.empty() &&
8989
joint_data.position.empty() && joint_data.velocity.empty() && joint_data.effort.empty())
9090
{
9191
throw TransmissionInterfaceException("All data vectors are empty. Transmission instance can't do anything!.");
9292
}
9393

9494
// Precondition: All non-empty data vectors must have sizes consistent with the transmission
95-
if (!actuator_data.position.empty() && actuator_data.position.size() != transmission_->numActuators())
95+
if (!actuator_data.hasSize(transmission_->numActuators()))
9696
{
97-
throw TransmissionInterfaceException("Actuator position data size does not match transmission.");
98-
}
99-
if (!actuator_data.velocity.empty() && actuator_data.velocity.size() != transmission_->numActuators())
100-
{
101-
throw TransmissionInterfaceException("Actuator velocity data size does not match transmission.");
102-
}
103-
if (!actuator_data.effort.empty() && actuator_data.effort.size() != transmission_->numActuators())
104-
{
105-
throw TransmissionInterfaceException("Actuator effort data size does not match transmission.");
97+
throw TransmissionInterfaceException("Actuator data size does not match transmission.");
10698
}
10799

108100
if (!joint_data.position.empty() && joint_data.position.size() != transmission_->numJoints())
@@ -119,17 +111,9 @@ class TransmissionHandle
119111
}
120112

121113
// Precondition: Valid pointers to raw data
122-
if (!hasValidPointers(actuator_data.position))
123-
{
124-
throw TransmissionInterfaceException("Actuator position data contains null pointers.");
125-
}
126-
if (!hasValidPointers(actuator_data.velocity))
127-
{
128-
throw TransmissionInterfaceException("Actuator velocity data contains null pointers.");
129-
}
130-
if (!hasValidPointers(actuator_data.effort))
114+
if (!actuator_data.valid())
131115
{
132-
throw TransmissionInterfaceException("Actuator effort data contains null pointers.");
116+
throw TransmissionInterfaceException("Actuator data contains null pointers.");
133117
}
134118

135119
if (!hasValidPointers(joint_data.position))

0 commit comments

Comments
 (0)