Можно ли использовать библиотеку TimedAction для вызова функций объекта?

arduino-uno object-oriented

В настоящее время программа, использующая TimedAction для функции, будет выглядеть так:

#include <TimedAction.h>
void functionX();
TimedAction funtionTimed = TimedAction(1000, functionX);

void setup()
{

}


void loop()
{
functionTimed.check();
}


void functionX()
{
 //run function
}

Мой вопрос: допустим, у меня есть класс объектов с некоторыми функциями, которые я хотел бы использовать с этой библиотекой TimedAction. Как это будет написано?

, 👍2


1 ответ


1

Вы не можете. Класс TimedAction не поддерживает прототип функции, необходимый для вашего неопределенного класса (он должен соответствовать вашему классу, поэтому не может быть написан).

Вам необходимо вызвать обычную функцию, которая затем вызовет функцию класса, или вам необходимо сделать функцию класса статической, чтобы она не включала класс в прототип функции.

class foo {
    public:
        static void runMe() { 
            // бла-бла
        }
};

TimedAction funtionTimed = TimedAction(1000, foo::runMe);

Однако TimedAction довольно прост и вам он не нужен. Вы можете просто написать функцию, которая будет запускаться только время от времени:

class foo {
    private:
        uint32_t _runMeTimestamp;
    public:
        void runMe() {
            if (millis() - _runMeTimestamp < 1000) return;
            _runMeTimestamp = millis();
            // бла-бла
        }
};

foo myFoo;

void loop() {
    myFoo.runMe();
}

Эти две строки кода, а также переменная для хранения временной метки — все, что вам нужно, чтобы функция запускалась через определенные промежутки времени.

,

Спасибо, да, я использовал его для вызова обычной функции, которая затем вызывает функцию класса, просто было интересно, смогу ли я уменьшить избыточность., @walkman118

Protip: Вы можете переписать библиотеку, чтобы использовать std::function вместо простых указателей на функции. Затем вы можете использовать лямбда-выражения или std::bind для вызова функции-члена определенного объекта. Это будет способом C++ сделать это., @Maximilian Gerhardt