Hello,
Pour résoudre un souci de callback Arduino, et plus précisément pour
pouvoir utiliser une méthode d'objet comme routine d'interruption, Edgar
m'avait proposé la solution suivante :
class Encoder
{
public:
Encoder(uint8_t pin): m_pin(pin) {}
template <Encoder& instance> static void begin() {
auto isr = []() { instance.encoderISR(); };
attachInterrupt(digitalPinToInterrupt(instance.m_pin), isr, CHANGE);
}
private:
uint8_t m_pin;
};
Ça marche très bien si on appelle la méthode statique Encoder::begin() avec
une référence sur un objet Encoder, mais comment faire pour l'appeler si
on ne dispose que d'un pointeur sur un objet Encoder ?
Encoder::begin<*m_encoder>();
sort l'erreur :
-----------------
closedLoopMotor.cpp: error: use of 'this' in a constant expression
Encoder::begin<*m_encoder>();
^~~~~~~~~
error: no matching function for call to 'Encoder::begin<(*((ClosedLoopMotor*)this)->ClosedLoopMotor::m_encoder)>()'
Encoder::begin<*m_encoder>();
^
encoder.h:8:46: note: candidate: template<Encoder& instance> static void Encoder::begin()
template <Encoder& instance> static void begin()
^~~~~
encoder.h:8:46: note: template argument deduction/substitution failed:
closedLoopMotor.cpp: error: '*((ClosedLoopMotor*)this)->ClosedLoopMotor::m_encoder' is not a valid template argument for type 'Encoder&' because it is not an object with linkage
Encoder::begin<*m_encoder>();
^
exit status 1
use of 'this' in a constant expression
-----------------
Une idée de ce qui coince ?
Merci d'avance.
--
Frédéric