20
20
21
21
namespace ServoArray {
22
22
23
- ServoArray::ServoArray (std::shared_ptr<Driver> driver) : driver_(driver) {
23
+ ServoArray::ServoArray (std::shared_ptr<Driver> driver, const std::vector< double >& offsets ) : driver_(driver), offsets_(offsets ) {
24
24
this ->cache_ .resize (this ->size ());
25
+ this ->offsets_ .resize (this ->size ());
25
26
}
26
27
27
28
ServoArray::ServoArray (const std::string& name, const DriverParams& params, DriverManager& manager) : driver_(manager.load(name, params)) {
28
29
this ->cache_ .resize (this ->size ());
30
+ this ->offsets_ .resize (this ->size ());
31
+
32
+ for (const auto & p : manager.config ().offset ().offsets ()) {
33
+ if (p.first >= this ->size ()) {
34
+ // TODO: ignore this with warning
35
+ throw std::runtime_error (" Offset index out of range" );
36
+ }
37
+
38
+ this ->offsets_ [p.first ] = p.second ;
39
+ }
29
40
}
30
41
31
42
void ServoArray::write (std::size_t index, double rad) {
32
- this ->driver_ ->write (index, rad);
33
- this ->cache_ [index] = rad;
43
+ auto const value = this ->offsets_ [index] + rad;
44
+ this ->driver_ ->write (index, value);
45
+ this ->cache_ [index] = value;
34
46
}
35
47
36
48
double ServoArray::read (std::size_t index) {
37
49
switch (this ->read_mode_ ) {
38
50
case ReadMode::Cached:
39
- return this ->cache_ [index];
51
+ return this ->cache_ [index] - this -> offsets_ [index] ;
40
52
case ReadMode::Direct:
41
- return this ->driver_ ->read (index);
53
+ return this ->driver_ ->read (index) - this -> offsets_ [index] ;
42
54
default :
43
55
assert (false ); // unreachable
44
56
}
@@ -57,6 +69,14 @@ ReadMode ServoArray::read_mode() const {
57
69
return this ->read_mode_ ;
58
70
}
59
71
72
+ double ServoArray::offset (std::size_t idx) const {
73
+ return this ->offsets_ [idx];
74
+ }
75
+
76
+ void ServoArray::set_offset (std::size_t idx, double value) {
77
+ this ->offsets_ [idx] = value;
78
+ }
79
+
60
80
std::size_t ServoArray::size () const {
61
81
return this ->driver_ ->size ();
62
82
}
0 commit comments