24#ifndef TAPROOT_MULTI_ENCODER_HPP_
25#define TAPROOT_MULTI_ENCODER_HPP_
31#include "modm/architecture/interface/assert.hpp"
47template <u
int32_t COUNT>
55 modm_assert(this->encoders[0] !=
nullptr,
"MultiEncoder",
"nullptr first encoder");
62 if (encoder !=
nullptr)
64 encoder->initialize();
73 for (uint32_t
i = 0;
i < COUNT;
i++)
75 if (this->validEncoder(
i))
87 int onlineEncoders = 0;
90 for (uint32_t
i = 0;
i < COUNT;
i++)
92 if (this->validEncoder(
i))
94 position += this->encoders[
i]->getPosition().getUnwrappedValue();
100 onlineEncoders == 0 ? 0 : position / onlineEncoders,
102 static_cast<float>(M_TWOPI));
108 int onlineEncoders = 0;
111 for (uint32_t
i = 0;
i < COUNT;
i++)
113 if (this->validEncoder(
i))
115 velocity += this->encoders[
i]->getVelocity();
120 return onlineEncoders == 0 ? 0 : velocity / onlineEncoders;
125 this->syncEncoders();
129 if (encoder !=
nullptr)
131 encoder->resetEncoderValue();
138 this->syncEncoders();
142 if (encoder !=
nullptr)
144 encoder->alignWith(other);
152 std::array<EncoderInterface*, COUNT> encoders;
153 uint32_t seenEncoders;
160 for (uint32_t
i = 1;
i < COUNT;
i++)
162 bool online = this->encoders[
i] !=
nullptr && this->encoders[
i]->isOnline();
163 if (online && !this->seenEncoder(
i))
166 this->seenEncoders |= 1 <<
i;
167 encoders[
i]->alignWith(encoders[0]);
169 else if (validEncoder(
i) && !seenEncoder(0))
172 this->seenEncoders |= 1;
173 encoders[0]->alignWith(encoders[
i]);
178 this->seenEncoders &= ~(1 <<
i);
181 this->seenEncoders |= 1;
185 this->seenEncoders &= ~(1);
189 inline bool validEncoder(uint32_t index)
const
191 return this->seenEncoder(index) && this->encoders[index] !=
nullptr &&
192 this->encoders[index]->isOnline();
195 inline bool seenEncoder(uint32_t index)
const
197 return ((this->seenEncoders) & (1 << index)) != 0;
Definition wrapped_float.hpp:51
Definition encoder_interface.hpp:32
Definition multi_encoder.hpp:49
void resetEncoderValue() override
Definition multi_encoder.hpp:123
MultiEncoder(std::array< EncoderInterface *, COUNT > encoders)
Definition multi_encoder.hpp:51
tap::algorithms::WrappedFloat getPosition() const override
Definition multi_encoder.hpp:84
float getVelocity() const override
Definition multi_encoder.hpp:105
void initialize() override
Definition multi_encoder.hpp:58
bool isOnline() const override
Definition multi_encoder.hpp:69
void alignWith(EncoderInterface *other) override
Definition multi_encoder.hpp:136
IUnit i
Definition dimensional_smooth_pid.hpp:2
Definition encoder_interface.hpp:30
#define DISALLOW_COPY_AND_ASSIGN(Typename)
Definition util_macros.hpp:27