• Система автоматизации с открытым исходным кодом на базе 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() {
}
А что вас останавливает? К примерам уже нет доверия?
Останавливает непонимание того, как это делается :)
 
Сверху Снизу