Передать аргументы в событие.
jackfrombb opened this issue · 9 comments
Здравствуйте.
Во первых, спасибо за работу)
Теперь к делу. При реализации энкодера в классе, приходится делать метод события статическим, что лишает достпа к локальным переменным класса. Если будет такая возможность, то добавьте передачу аргументов в событие.
Сам я не хотел бы пул реквестить в библиотеку, без нормального понимания внутренней структуры и достаточной компетенции в плюсах.
Привет, каких аргументов? Не очень понятна ситуация, нужно подробности
Привет, каких аргументов? Не очень понятна ситуация, нужно подробности
Вот пример.
Только сразу договоримся, что "метод" = "функция" и наоборот, точно не знаю как в плюсах принято)
Предположим, надо определить реализацию контроля от виртуального класса.
Присоеденить не статический метод класса мы не сможем, из за несовпадения типов.
Но, если мы сделаем метод статическим, то поля класса становятся недоступны, что логично
Я вижу такое, возможное, решение:
Делаем событие с аргументами, например, в стиле WindowsForms)
а зачем вообще использовать attach в классе, если всё равно вызывается тикер и action можно опросить там же?.. По сути даже так например:
class....
void foo() {
if (enc->tick()) handler();
}
void handler() {
enc->action().....
}
также можно использовать лямбда-функцию. Но это опять же не имеет смысла, потому что библиотека не event-зависимая и всё равно есть тикер, который вызывается явно
class....
void foo() {
enc->attach([this]() {
// ...
});
}
а зачем вообще использовать attach в классе, если всё равно вызывается тикер и action можно опросить там же?..
В этом случае, при некоторых обстоятельствах, очень глючит. В частности, когда прерывания забирают много веремени у loop.
также можно использовать лямбда-функцию. Но это опять же не имеет смысла, потому что библиотека не event-зависимая и всё равно есть тикер, который вызывается явно
class.... void foo() { enc->attach([this]() { // ... }); }
А с таким решением я не знаком. Извини, если отнял время. Плюсы совсем недавно изучать начал
И спасибо за помощь)
очень глючит
не может такого быть)) Приаттаченный хэндлер вызывается из тикера
bool tick(bool s) {
clear();
s = pollBtn(s);
#ifndef EB_NO_CALLBACK
if (cb && s) cb();
#endif
return s;
}
то есть if (enc->tick()) myHandler();
это абсолютно тот же самый код получится
очень глючит
не может такого быть)) Приаттаченный хэндлер вызывается из тикера
bool tick(bool s) { clear(); s = pollBtn(s); #ifndef EB_NO_CALLBACK if (cb && s) cb(); #endif return s; }то есть
if (enc->tick()) myHandler();
это абсолютно тот же самый код получится
Ок. Значит тогда глючило из за того что не вызывал тик в прерывании) Значит, вполне годное решение, спасибо ещё раз)
/// @brief Прерывание для обработки пропущенных считываний энкодера
/// @param args = NULL
/// @return nothing
bool IRAM_ATTR encTick(void *args)
{
enc.tickISR();
return false;
}
👍