Мои навыки C / C ++ немного устарели, и я в основном работаю на Java последние несколько лет. Теперь я только начал играть с Arduino и сделал простой урок на кнопках. Я хочу добавить прослушиватель событий, поэтому я сделал что-то вроде этого:
class MyButton{
public:
MyButton(byte pin);
bool isPressed();
bool wasToggled();
bool wasPressed();
void eventLoop();
inline void setListener(MyButtonListener* listener) { _listener = listener; }
private:
byte _pin;
boolean _lastToggledState = false;
MyButtonListener* _listener;
};
class MyButtonListener{
public:
virtual void onPressed() = 0;
private:
};
Метод eventLoop()
(предназначенный для вызова из функции Arduino loop()
) вызывает метод onPressed()
в классе слушателя:
void MyButton::eventLoop(){
if( wasPressed() && _listener ){
_listener->onPressed();
}
}
Пока все в порядке. Но я не могу понять, как на самом деле назначить и использовать слушателя в основном файле Arduino. Исходя из Java, я привык просто делать что-то вроде
myBtn.setListener( new MyButtonListener(){
void onPressed(){
Serial.println("Pressed");
toggleLed(); // toggleLed() is a method in the main Arduino file
}
});
Я заставил его работать очень замысловато, объявив новый класс, который принимает в качестве аргумента метод toggleLed()
(иначе он не может быть доступен из нового класса):
class BtnListener : public MyButtonListener{
public:
BtnListener(void* toggleFunction) : _toggleFunction(toggleFunction){ };
private:
void (*_toggleFunction)();
void onPressed(){
Serial.println("Pressed");
_toggleFunction();
};
};
myBtn.setListener( new BtnListener(toggleLed) );
Наверняка должен быть более удобный способ сделать что-то подобное в C ++? Это выполнимо (но некрасиво) с одним слушателем - я даже не представляю, как ужасно иметь 10 кнопок, которые все требуют разных реализаций слушателя ...