• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Как указать колбеки подключения/отключения к WiFi в классах?

arrowcircle

New member
Добрый день.
Пытаюсь упаковать основной код программы в класс. Все получается хорошо, кроме коллбеков на подключение/отключение WiFi.

program.h
Код:
class Program {
public:
  Ticker wifiReconnectTimer;
  WiFiEventHandler wifiConnectHandler;
  void onWifiConnect(const WiFiEventStationModeGotIP& event);
};
program.cpp
Код:
void Program::setup() {
  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
}
void Program::onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi.");
}
Ошибка:

Код:
error: no matching function for call to 'ESP8266WiFiClass::onStationModeGotIP(void (Program::*)(const WiFiEventStationModeGotIP&))'
Пробовал передавать Program::eek:nWifiConnect, this.onWifiConnect и this->onWifiConnect, но все равно вылезают ошибки. Понял, что тут вопрос понимания и перебором делать бесполезно.

Как правильно передать метод объекта класс как колбек для WiFi?
 

arrowcircle

New member
Читайте документацию по используемому языку.
так как способ зависит от языка.
А вы какой используете?
В доках есть возможность в классах колбеки определять?
А разве не видно какой я использую?
Естественно можно использовать коллбеки, это стандартная функция, которая во всех примерах.
Вопрос в том, как прокидывать в качестве колбека инстанс метод, а не глобально определенную функцию.
 

Алексей.

Active member
Код:
#include <ESP8266WiFi.h>

class MyClass {
public:
  void intialize() {
    this->onGotIP = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& evt){
      Serial.println("onStationModeGotIP");
    });
  }
  WiFiEventHandler onGotIP;
};

MyClass my_class;

void setup() {
  Serial.begin(115200);
  Serial.println();
  my_class.intialize();
}

void loop() {
}
 

arrowcircle

New member
Код:
#include <ESP8266WiFi.h>

class MyClass {
public:
  void intialize() {
    this->onGotIP = WiFi.onStationModeGotIP([this](const WiFiEventStationModeGotIP& evt){
      Serial.println("onStationModeGotIP");
    });
  }
  WiFiEventHandler onGotIP;
};

MyClass my_class;

void setup() {
  Serial.begin(115200);
  Serial.println();
  my_class.intialize();
}

void loop() {
}
Спасибо, а можно такой же трюк провернуть с Ticker?
 

Алексей.

Active member
Код:
#include <Ticker.h>

class MyClass {
public:
  void intialize() {
    this->t.attach_ms(5000, std::bind(&MyClass::on_ticker, this));
  }
  Ticker t;
  void on_ticker() {
    Serial.println("on_ticker");
  }
};

MyClass my_class;

void setup() {
  Serial.begin(115200);
  Serial.println();
  my_class.intialize();
}

void loop() {
}
А что вас останавливает? К примерам уже нет доверия?
 

arrowcircle

New member
Код:
#include <Ticker.h>

class MyClass {
public:
  void intialize() {
    this->t.attach_ms(5000, std::bind(&MyClass::on_ticker, this));
  }
  Ticker t;
  void on_ticker() {
    Serial.println("on_ticker");
  }
};

MyClass my_class;

void setup() {
  Serial.begin(115200);
  Serial.println();
  my_class.intialize();
}

void loop() {
}
А что вас останавливает? К примерам уже нет доверия?
Останавливает непонимание того, как это делается :)
 
Сверху Снизу