GyverLibs/EncButton

Передать аргументы в событие.

jackfrombb opened this issue · 9 comments

Здравствуйте.
Во первых, спасибо за работу)

Теперь к делу. При реализации энкодера в классе, приходится делать метод события статическим, что лишает достпа к локальным переменным класса. Если будет такая возможность, то добавьте передачу аргументов в событие.

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

Привет, каких аргументов? Не очень понятна ситуация, нужно подробности

Привет, каких аргументов? Не очень понятна ситуация, нужно подробности

Вот пример.
Только сразу договоримся, что "метод" = "функция" и наоборот, точно не знаю как в плюсах принято)
Предположим, надо определить реализацию контроля от виртуального класса.
Присоеденить не статический метод класса мы не сможем, из за несовпадения типов.
photo_2024-01-10_14-37-27

Но, если мы сделаем метод статическим, то поля класса становятся недоступны, что логично
photo_2024-01-10_14-29-40

Я вижу такое, возможное, решение:

Делаем событие с аргументами, например, в стиле WindowsForms)
photo_1

Чуть изменяем привязку события
photo_2

И вызов
photo_3

Тогда в классе можно сделать так:
photo_4

а зачем вообще использовать 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;
}

👍