Перейти к содержанию
    

ошибка при компиляции С++

Уже не первая тема от меня с текущим проектом, но надо продолжать.

Модуль ESP32, надо сделать обработку эвентов при коннектах и подключениях.

Вот что дает в качестве примера производитель нам.

/*
 *  This sketch shows the WiFi event usage
 *
*/

/* 
* WiFi Events

SYSTEM_EVENT_WIFI_READY               < ESP32 WiFi ready
SYSTEM_EVENT_SCAN_DONE                < ESP32 finish scanning AP
SYSTEM_EVENT_STA_START                < ESP32 station start
SYSTEM_EVENT_STA_STOP                 < ESP32 station stop
SYSTEM_EVENT_STA_CONNECTED            < ESP32 station connected to AP
SYSTEM_EVENT_STA_DISCONNECTED         < ESP32 station disconnected from AP
SYSTEM_EVENT_STA_AUTHMODE_CHANGE      < the auth mode of AP connected by ESP32 station changed
SYSTEM_EVENT_STA_GOT_IP               < ESP32 station got IP from connected AP
SYSTEM_EVENT_STA_LOST_IP              < ESP32 station lost IP and the IP is reset to 0
SYSTEM_EVENT_STA_WPS_ER_SUCCESS       < ESP32 station wps succeeds in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_FAILED        < ESP32 station wps fails in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_TIMEOUT       < ESP32 station wps timeout in enrollee mode
SYSTEM_EVENT_STA_WPS_ER_PIN           < ESP32 station wps pin code in enrollee mode
SYSTEM_EVENT_AP_START                 < ESP32 soft-AP start
SYSTEM_EVENT_AP_STOP                  < ESP32 soft-AP stop
SYSTEM_EVENT_AP_STACONNECTED          < a station connected to ESP32 soft-AP
SYSTEM_EVENT_AP_STADISCONNECTED       < a station disconnected from ESP32 soft-AP
SYSTEM_EVENT_AP_PROBEREQRECVED        < Receive probe request packet in soft-AP interface
SYSTEM_EVENT_GOT_IP6                  < ESP32 station or ap or ethernet interface v6IP addr is preferred
SYSTEM_EVENT_ETH_START                < ESP32 ethernet start
SYSTEM_EVENT_ETH_STOP                 < ESP32 ethernet stop
SYSTEM_EVENT_ETH_CONNECTED            < ESP32 ethernet phy link up
SYSTEM_EVENT_ETH_DISCONNECTED         < ESP32 ethernet phy link down
SYSTEM_EVENT_ETH_GOT_IP               < ESP32 ethernet got IP from connected AP
SYSTEM_EVENT_MAX
*/

#include <WiFi.h>

const char* ssid     = "your-ssid";
const char* password = "your-password";


void WiFiEvent(WiFiEvent_t event)
{
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch (event)
    {
    case SYSTEM_EVENT_STA_GOT_IP:
        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());
        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
        Serial.println("WiFi lost connection");
        break;
    }
}

void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info)
{
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));
}

void setup()
{
    Serial.begin(115200);

    // delete old config
    WiFi.disconnect(true);

    delay(1000);

    // Examples of diffrent ways to register wifi events
    WiFi.onEvent(WiFiEvent);
    WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
    WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){
        Serial.print("WiFi lost connection. Reason: ");
        Serial.println(info.disconnected.reason);
    }, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);

    // Remove WiFi event
    Serial.print("WiFi Event ID: ");
    Serial.println(eventID);
    // WiFi.removeEvent(eventID);

    WiFi.begin(ssid, password);

    Serial.println();
    Serial.println();
    Serial.println("Wait for WiFi... ");
}

void loop()
{
    delay(1000);
}

 

Есть ф-я 

void WiFiEvent(WiFiEvent_t event)

и передаем ее при инициализации:

WiFi.onEvent(WiFiEvent);

WiFi- это класс, что в хидере.

 

Я в своем проекте делаю почти тоже самое, только класс wifi- отнаследован от WiFi.

wifi.onEvent(WiFiEvent);

и компилятор выдает ошибку:

...t.cpp:48:27: error: invalid use of non-static member function
     wifi.onEvent(WiFiEvent);
  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Метценгерштейн сказал:

WiFi.onEvent(WiFiEvent);

WiFi- это класс, что в хидере.

 

Если WiFi - класс, то к нему нельзя использовать оператор '.'

Оператор '.' используется для экземпляров класса.

RTFM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, это уже не первая ваша тема, и во всех темах вы приводите кучу мусора, не относящегося к делу, и не приводите ничего, что бы к делу относилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Метценгерштейн said:

класс wifi - отнаследован от WiFi.

wifi.onEvent(WiFiEvent);

Так все же что такое у вас wifi :

- имя класса

- имя объекта некоторого (какого-то вашего самописного, унаследованного от WiFi) класса ?

Если имя класса - то такой синтаксис неправильный, и на него, скорее всего, ругается компилятор.

Метод класса должен вызываться от имени объекта, а не от имени класса.

То же самое и с WiFi - определитесь окончательно, класс это или объект класса. А то всех запутали. То у вас WiFi - это класс, то объект.

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

Изменено пользователем Darth Vader

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 minutes ago, Darth Vader said:

Метод класса должен вызываться от имени объекта, а не от имени класса.

Статический метод может так вызываться.

имя_класса.статический_метод(...)

Книги - великая вешь, если умеешь читать (это для ТС)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, x893 said:

имя_класса.статический_метод(...)

Подскажите пожалуйста, в какой книжке это описано?

https://godbolt.org/z/PyKfGc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, x893 said:

Статический метод может так вызываться.

имя_класса.статический_метод(...)

Книги книгами, а ссылку на Language Reference Manual можете дать?

Вроде как для вызова статических методов нужен scope resolution operator, т.е.:
 

ClassName::static_method()

А вашу книгу, похоже, нужно выбросить.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ошибся, конечно имя_клсса::стат_метод()

Через . в C#

Книжки рано выбрасывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 minutes ago, Darth Vader said:

определитесь окончательно

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

Код из первого сообщения похож на официальный пример: https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiClientEvents/WiFiClientEvents.ino
Можно предположить, что он работает.

Какой магией при подключении wifi.h подтягивается соотв. кусок BSP - я не знаю. Изучение ESP в планах есть, но всё никак руки не дойдут...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день. Вопрос немного не в тему, но везде в описаниях написано, что ESP32 содержит на борту CAN. Но не в одном мануале я не обнаружил даже следов. Что это, массовый русскоязычный копи-паст? Или я не внимательно смотрю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вроде бы есть у неё CAN, впрочем я не проверял.

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/can.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, x893 said:

Пора пересилить себя и прочитать

Пожалуйста, из этой книги, приведите мне абзац, где есть ответ на мой вопрос- почему ошибка. Иначе- это просто с понтом дела пост был. Что по факту и есть.

5 hours ago, one_eight_seven said:

Да, это уже не первая ваша тема, и во всех темах вы приводите кучу мусора, не относящегося к делу, и не приводите ничего, что бы к делу относилось.

Проект сложный. Сложный не в коде, а в подходе к написанию. Линукс, отладки нет никакой, еще и с компиляцией проблемы. Потому и вопросы такие. И во всех своих темах я даю много информации по мере поступления вопросов. Всё сразу сказать невозможно.

 

5 hours ago, Darth Vader said:

То же самое и с WiFi - определитесь окончательно, класс это или объект класса. А то всех запутали. То у вас WiFi - это класс, то объект.

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

Согласен. Путаницу внес.

Имеем вот что- пример от производителя:

WiFi.onEvent(WiFiEvent);

WiFi.begin(ssid, password);

где WiFi - это ....

в файле WiFi.h

описан класс WiFiClass

и в .cpp сразу сделан его объект

WiFiClass WiFi;

в файле WiFi.h 

extern WiFiClass WiFi;

поэтому в примере данном, обращение WiFi.onEvent(WiFiEvent); к объекту класса вполне валидное.

Но так у меня тоже не работает. Если я делаю такое же обращение - передаю адрес ф-ии как параметр.

У меня же определен свой объект этого класса.

WiFiClass wifi;

(всё маленькими wifi)

И работает wifi и подключение и прочее. Вызываются методы класса

Например, wifi.begin(i_ssid, i_password);

Всё компилится, все работает. С объектом класса нет проблем.

Начал развивать проект, и не могу передать wifi.onEvent(WiFiEvent);

ошибка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

41 минуту назад, SSerge сказал:

Да вроде бы есть у неё CAN, впрочем я не проверял.

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/can.html

Да, это уже тоже нашел.... Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...