• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь [C++] Перенос attachInterrupt в тело класса.

Pavlo

New member
Вопрос наверное больше по С++...

Есть такой простой код для обработки нажатия кнопки.

Код:
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressedCallback, CHANGE);
}

void buttonPressedCallback() {
  ... обработка нажатия кнопки
}
Я хотел все перенести в отдельный класс.
Скажем MyButton.cpp
Тут attachInterrupt перенес в MyButton::init() - метод.
Выглядит все вот так:

Код:
void MyButton::init() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressedCallback, CHANGE);
}

void MyButton::buttonPressedCallback() {
  ... обработка нажатия кнопки
}
При компиляции выдается такое сообщение об ощибке:

exit status 1
cannot convert 'MyButton::buttonPressedCallback' from type 'void (MyButton::)()' to type 'void (*)()'
 

nikolz

Well-known member
Вопрос наверное больше по С++...

Есть такой простой код для обработки нажатия кнопки.

Код:
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressedCallback, CHANGE);
}

void buttonPressedCallback() {
  ... обработка нажатия кнопки
}
Я хотел все перенести в отдельный класс.
Скажем MyButton.cpp
Тут attachInterrupt перенес в MyButton::init() - метод.
Выглядит все вот так:

Код:
void MyButton::init() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressedCallback, CHANGE);
}

void MyButton::buttonPressedCallback() {
  ... обработка нажатия кнопки
}
При компиляции выдается такое сообщение об ощибке:

exit status 1
cannot convert 'MyButton::buttonPressedCallback' from type 'void (MyButton::)()' to type 'void (*)()'
укажите явно тип
 

Юрий Ботов

Moderator
Команда форума
И, если уж речь о с++ может не городить "init" а использовать конструктор? С nikolz - полностью согласен, с++ это не с - тут другие соглашения об умолчаниях.
 

Pavlo

New member
И, если уж речь о с++ может не городить "init" а использовать конструктор? С nikolz - полностью согласен, с++ это не с - тут другие соглашения об умолчаниях.
Ок, перенес в конструктор.

Код:
class MyButton{
  public:
    MyButton() {
        pinMode(BUTTON_PIN, INPUT_PULLUP);
        attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressedCallback, CHANGE);
    }
Проблему это конечно не решило, но на один метод и один обязательный внешний вызов меньше
 

Юрий Ботов

Moderator
Команда форума
по умолчанию в C xxx() == int xxx(void)
по умолчанию в С++ xxx() == ошибка, надо четко указать void xxx(void) или что то еще
 
Последнее редактирование:

Pavlo

New member
по умолчанию в C xxx() == int xxx(void)
по умолчанию в С++ xxx() == ошибка, надо четко указать void xxx(void) или что то еще
Ммм... Не понятно, в каком месте нужно тип указать?
Метод buttonPressedCallback объявлен как

void buttonPressedCallback();

И реализация выглядит так:
Код:
void MyButton::buttonPressedCallback() {
  ... обработка нажатия кнопки
}
Как нужно переписать?
 

nikolz

Well-known member
Ммм... Не понятно, в каком месте нужно тип указать?
Метод buttonPressedCallback объявлен как

void buttonPressedCallback();

И реализация выглядит так:
Код:
void MyButton::buttonPressedCallback() {
  ... обработка нажатия кнопки
}
Как нужно переписать?
Я правильно Вас понял - вы код дурины пытаетесь засунуть в C++?
 

Pavlo

New member
полагаю что так нельзя делать.
Дурина это не С++ а типа С++.
Поэтому пишите не дурине, либо переписывайте ее функции в C++ либо делайте им обертки.
Я пытаюсь вынести функционал для кнопки в отдельный класс.
Просто потому, что кнопок у меня несколько, выполнять они должны (почти) одно и тоже.
Единственно, что их отличает - они сидят на разных пинах.

Столкнулся с проблемой передачи callBack-функции при инициализации attachInterrupt, внутри самого класса.

Почему это плохо?
 

nikolz

Well-known member
Я пытаюсь вынести функционал для кнопки в отдельный класс.
Просто потому, что кнопок у меня несколько, выполнять они должны (почти) одно и тоже.
Единственно, что их отличает - они сидят на разных пинах.

Столкнулся с проблемой передачи callBack-функции при инициализации attachInterrupt, внутри самого класса.

Почему это плохо?
причем здесь C++?
Пишите в дурине, там тоже аля классы.
А вообще-то просто вынесите в функцию и не мудрите с классами если опыта мало.
 

Pavlo

New member
Pavlo,
причем здесь C++?
Пишите в дурине, там тоже аля классы.
А вообще-то просто вынесите в функцию и не мудрите с классами если опыта мало.
Дак рабочая версия так и написана - куча функций. (И в таком виде работает уже месяцев 7...)
Я ее переписываю, разбрасывая все по отдельным классам и конфигурационным файлам.
Опыта мало - это правда. Но, учиться никогда не поздно ;)

"Дурина" - это ругательное слово или официальное название для чего то? А то я не могу нигде найти такого...
 

nikolz

Well-known member
Pavlo,


Дак рабочая версия так и написана - куча функций. (И в таком виде работает уже месяцев 7...)
Я ее переписываю, разбрасывая все по отдельным классам и конфигурационным файлам.
Опыта мало - это правда. Но, учиться никогда не поздно ;)

"Дурина" - это ругательное слово или официальное название для чего то? А то я не могу нигде найти такого...
это сленг - Arduino - duino - дурино -дурина
 
Сверху Снизу