@@ -24,14 +24,23 @@ class EncoderSensor {
2424 // across time. The SAMPLES computation rounds it down to make it even
2525 RingBuffer<uint32_t , (SAMPLES / 2 ) * 2 > past_delta_counters{};
2626
27- double position{0.0 };
28- double speed{0.0 };
29- double acceleration{0.0 };
27+ enum Direction : uint8_t { FORWARD = 0 , BACKWARDS = 1 };
28+
29+ Direction *direction;
30+ double *position;
31+ double *speed;
32+ double *acceleration;
3033
3134 public:
32- EncoderSensor (Pin &pin1, Pin &pin2, const double counter_distance_m)
35+ EncoderSensor (Pin &pin1, Pin &pin2, const double counter_distance_m,
36+ Direction *direction, double *position, double *speed,
37+ double *acceleration)
3338 : counter_distance_m(counter_distance_m),
34- encoder_id (Encoder::inscribe(pin1, pin2)) {
39+ encoder_id (Encoder::inscribe(pin1, pin2)),
40+ direction(direction),
41+ position(position),
42+ speed(speed),
43+ acceleration(acceleration) {
3544 for (size_t i{0 }; i < SAMPLES; ++i) past_delta_counters.push (0 );
3645 }
3746
@@ -53,21 +62,19 @@ class EncoderSensor {
5362 const uint32_t &previous_previous_delta_counter{
5463 past_delta_counters[past_delta_counters.size () - 1 ]};
5564
56- position = delta_counter * counter_distance_m;
65+ * position = delta_counter * counter_distance_m;
5766
5867 // https://en.wikipedia.org/wiki/Finite_difference_coefficient#Backward_finite_difference
59- speed = ((3.0 * delta_counter / 2.0 ) - (2.0 * previous_delta_counter) +
60- (previous_previous_delta_counter / 2.0 )) *
61- counter_distance_m;
68+ *speed = ((3.0 * delta_counter / 2.0 ) - (2.0 * previous_delta_counter) +
69+ (previous_previous_delta_counter / 2.0 )) *
70+ counter_distance_m;
71+
72+ *acceleration = (delta_counter - (2.0 * previous_delta_counter) +
73+ previous_previous_delta_counter) *
74+ counter_distance_m;
6275
63- acceleration = (delta_counter - (2.0 * previous_delta_counter) +
64- previous_previous_delta_counter) *
65- counter_distance_m;
76+ *direction = Encoder::get_direction (encoder_id) ? FORWARD : BACKWARDS;
6677
6778 past_delta_counters.push_pop (delta_counter);
6879 }
69-
70- double *get_position () { return &position; }
71- double *get_speed () { return &speed; }
72- double *get_acceleration () { return &acceleration; }
7380};
0 commit comments