• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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 - дурино -дурина
 
Сверху Снизу