Как разделить скетч на части?

CeMeH
Offline
Зарегистрирован: 06.10.2016

Не могу разделить скетч на модули.

Помогите разобраться почему не работает. Хочу разделить скетч на части, чтобы функции HTTP и FTP были в отдельных файлах.

Когда все в одном файле работает, но только разношу по разным, выдает ошибку, и не могу понять как ее исправить.

Есть файлы HTTP.h, HTTP.cpp, FFS.h, FFS.cpp.

ESP8266WebServer HTTP(80) определен в файле HTTP.cpp, но также используется и в FFS.cpp.

Подскажите как сделать, чтобы он был виден в FFS.cpp, а то пишет

'HTTP' was not declared in this scope идентификатор "HTTP" не определен. Буду очень благодарен, если кто тыкнет, что я неправильно делаю.

Часть кода файла HTTP.cpp
​#include "HTTP.h"
// Объект веб-сервера. Будет прослушивать порт 80 (по умолчанию для HTTP)
ESP8266WebServer HTTP(80);
void HTTP_init(void)
{
    HTTP.on("/restart", handle_Restart); // Перезагрузка модуля по запросу вида .../restart?device=ok
    // Запускаем HTTP сервер
    HTTP.begin();
}
void handle_Restart()
{
    String restart = HTTP.arg("device");
    if (restart == "ok")
        ESP.restart();
    HTTP.send(200, "text/plain", "OK");
}
---------------------------------------------------------------------------------------------------------
Часть кода файла FFS.cpp
#include "FFS.h"
FtpServer ftpSrv; // Определяем объект для работы с модулем по FTP (для отладки HTML)
void FTP_init(String _FTP_Name, String _FTP_password)
{
    SPIFFS.begin();                         // Инициализируем работу с файловой системой
    ftpSrv.begin(_FTP_Name, _FTP_password); // Поднимаем FTP-сервер (логин: FTP_Name, пароль: FTP_password)
}
// Здесь функции для работы с файловой системой
String getContentType(String filename)
{
    if (HTTP.hasArg("download"))    //здесь выдает ошибку
        return "application/octet-stream";
    else if (filename.endsWith(".htm"))
        return "text/html";
    else if (filename.endsWith(".html"))
        return "text/html";
}


 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А почему второй строки из первого кода нет во втором коде? Должна быть! Но при этом, сам файл http.h должен быть написан грамотно, а у Вас он секретный, так что ХЗ. Если хотите нормального разговора - файлы публикуйте полностью и сообщение об ошибке полностью.

CeMeH
Offline
Зарегистрирован: 06.10.2016

Та файлы не секретные. Выкладываю h-файлы. Я думаю, что нужно как то подключить один файл к другому, но у меня ничего не получается.


#ifndef _HTTP_H_
#define _HTTP_H_

#include <ESP8266WebServer.h> // Подключаем библиотеку для управления устройством по HTTP.

#include <ESP8266SSDP.h> // Подключаем библиотеку SSDP.

void HTTP_init(void);              // +++++++++
void handle_Restart(void);         // ++++++++
void SSDP_init(String _SSDP_Name); // +++++++

#endif /* _HTTP_H_ */
---------------------------------------------------------------
#ifndef _FFS_H_
#define _FFS_H_

#include <FS.h>               // Библиотека для работы с файловой системой
#include <ESP8266FtpServer.h> // Библиотека для работы с SPIFFS по FTP
#include "HTTP.h"


void FTP_init(String _FTP_Name, String _FTP_password);

String getContentType(String filename);

#endif /* _FFS_H_ */

 

CeMeH
Offline
Зарегистрирован: 06.10.2016

Вот полные версии файлов.

#ifndef _HTTP_H_
#define _HTTP_H_

#include <ESP8266WebServer.h> // Подключаем библиотеку для управления устройством по HTTP.

#include <ESP8266SSDP.h> // Подключаем библиотеку SSDP.


void HTTP_init(void);              // +++++++++
void handle_Restart(void);         // ++++++++
void SSDP_init(String _SSDP_Name); // +++++++

#endif /* _HTTP_H_ */
--------------------------------------------------------------------

#include "HTTP.h"


// Объект веб-сервера. Будет прослушивать порт 80 (по умолчанию для HTTP)
ESP8266WebServer HTTP(80);


void HTTP_init(void)
{
    HTTP.on("/restart", handle_Restart); // Перезагрузка модуля по запросу вида http://192.168.0.190/restart?device=ok
    // Запускаем HTTP сервер
    HTTP.begin();
}

void handle_Restart()
{
    String restart = HTTP.arg("device");
    if (restart == "ok")
        ESP.restart();
    HTTP.send(200, "text/plain", "OK");
}

void SSDP_init(String _SSDP_Name)
{
    // SSDP дескриптор
    HTTP.on("/description.xml", HTTP_GET, []()
            { SSDP.schema(HTTP.client()); });

    SSDP.setDeviceType("upnp:rootdevice");
    SSDP.setSchemaURL("description.xml");
    SSDP.setHTTPPort(80);
    SSDP.setName(_SSDP_Name);
    SSDP.setSerialNumber("001788102201");
    SSDP.setURL("index.html");
    SSDP.setModelName(_SSDP_Name);
    SSDP.setModelNumber("000000000001");
    SSDP.setModelURL("http://esp8266-arduinoide.ru/wifimanager/");
    SSDP.setManufacturer("Tretyakov Sergey");
    SSDP.setManufacturerURL("http://www.esp8266-arduinoide.ru");
    SSDP.begin();
}
----------------------------------------------------------------------------
#ifndef _FFS_H_
#define _FFS_H_

#include <FS.h>               // Библиотека для работы с файловой системой
#include <ESP8266FtpServer.h> // Библиотека для работы с SPIFFS по FTP


void FTP_init(String _FTP_Name, String _FTP_password);

String getContentType(String filename);

#endif /* _FFS_H_ */
-------------------------------------------------------------------------
#include "FFS.h"

FtpServer ftpSrv; // Определяем объект для работы с модулем по FTP (для отладки HTML)

void FTP_init(String _FTP_Name, String _FTP_password)
{
    SPIFFS.begin();                         // Инициализируем работу с файловой системой
    ftpSrv.begin(_FTP_Name, _FTP_password); // Поднимаем FTP-сервер (логин: FTP_Name, пароль: FTP_password)
}

// Здесь функции для работы с файловой системой
String getContentType(String filename)
{
    if (HTTP.hasArg("download"))
        return "application/octet-stream";
    else if (filename.endsWith(".htm"))
        return "text/html";
    else if (filename.endsWith(".html"))
        return "text/html";
    else if (filename.endsWith(".json"))
        return "application/json";
    else if (filename.endsWith(".css"))
        return "text/css";
    else if (filename.endsWith(".js"))
        return "application/javascript";
    else if (filename.endsWith(".png"))
        return "image/png";
    else if (filename.endsWith(".gif"))
        return "image/gif";
    else if (filename.endsWith(".jpg"))
        return "image/jpeg";
    else if (filename.endsWith(".ico"))
        return "image/x-icon";
    else if (filename.endsWith(".xml"))
        return "text/xml";
    else if (filename.endsWith(".pdf"))
        return "application/x-pdf";
    else if (filename.endsWith(".zip"))
        return "application/x-zip";
    else if (filename.endsWith(".gz"))
        return "application/x-gzip";
    return "text/plain";
}
--------------------------------------------------------------------


 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы думаете, что вот это я просто так написал? Делать этого не нужно?

ЕвгенийП пишет:

А почему второй строки из первого кода нет во втором коде? Должна быть!

И где сообщение об ошибке? Про него я тоже зря пальцы об клавиши бил?

И да, для чего Вы соединяете по два файла? Чтобы создать неудобство тому, кто желает Вам помочь и для этого захочет попробовать компилировать у себя?

Файлы выкладывайте всегда полностью, каждый сам по себе и, если они больше строк 10-15, сворачивайте из под спойлер.

CeMeH
Offline
Зарегистрирован: 06.10.2016

Благодарен Вам, что пытаетесь мне помочь, и прошу прощения, что я так туплю. Просто я впервые на таком форуме пишу сообщения. Обычно мне хватало просто читать.

Выкладываю все файлы по отдельности, и сообщения об ошибках, которые выдает Planformio.

HTTP.h добавил в FFS.cpp, но ничего не меняется. Выдает ошибку в терминал:

src\FFS.cpp: In function 'void FTP_init(String, String)':
src\FFS.cpp:8:5: warning: 'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]
    8 |     SPIFFS.begin();                         // Инициализируем работу с файловой системой
      |     ^~~~~~
In file included from include/FFS.h:4,
                 from src\FFS.cpp:1:
C:\Users\Helios\.platformio\packages\framework-arduinoespressif8266\cores\esp8266/FS.h:275:15: note: declared here
  275 | extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
      |               ^~~~~~
src\FFS.cpp: In function 'String getContentType(String)':
src\FFS.cpp:15:9: error: 'HTTP' was not declared in this scope
   15 |     if (HTTP.hasArg("download"))
      |         ^~~~
*** [.pio\build\nodemcuv2\src\FFS.cpp.o] Error 1
 
И во вкладке проблемы есть три проблемы:

'HTTP' was not declared in this scope

идентификатор "HTTP" не определен

'SPIFFS' is deprecated: SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems. [-Wdeprecated-declarations]

Ну с LittleFS понятно, это не критично. А вот с остальными никак не могу разобраться. Я только учусь на старость лет, но раньше таких проблем никогда не было. Не первый раз программирую отдельными файлами. Если писать код в Ардуино иде одним файлом, или даже делить на куски, то все работает. Создаю файлы HTTP.ino FFS.ino и т.д. все работает. А вот в Planformio при создании cpp и h не работает. Работает только если все писать в один файл. Но тогда файл у меня получиться очень огромный. Хотелось бы сделать модульно. Ниже все файлы отдельно.

 

 

CeMeH
Offline
Зарегистрирован: 06.10.2016
#ifndef _HTTP_H_
#define _HTTP_H_

#include <ESP8266WebServer.h> // Подключаем библиотеку для управления устройством по HTTP.

#include <ESP8266SSDP.h> // Подключаем библиотеку SSDP.


void HTTP_init(void);              // +++++++++
void handle_Restart(void);         // ++++++++
void SSDP_init(String _SSDP_Name); // +++++++

#endif /* _HTTP_H_ */

 

CeMeH
Offline
Зарегистрирован: 06.10.2016
#include "HTTP.h"

// Объект веб-сервера. Будет прослушивать порт 80 (по умолчанию для HTTP)
ESP8266WebServer HTTP(80);

void HTTP_init(void)
{
    HTTP.on("/restart", handle_Restart); // Перезагрузка модуля по запросу вида http://192.168.0.190/restart?device=ok
    // Запускаем HTTP сервер
    HTTP.begin();
}

void handle_Restart()
{
    String restart = HTTP.arg("device");
    if (restart == "ok")
        ESP.restart();
    HTTP.send(200, "text/plain", "OK");
}

void SSDP_init(String _SSDP_Name)
{
    // SSDP дескриптор
    HTTP.on("/description.xml", HTTP_GET, []()
            { SSDP.schema(HTTP.client()); });

    SSDP.setDeviceType("upnp:rootdevice");
    SSDP.setSchemaURL("description.xml");
    SSDP.setHTTPPort(80);
    SSDP.setName(_SSDP_Name);
    SSDP.setSerialNumber("001788102201");
    SSDP.setURL("index.html");
    SSDP.setModelName(_SSDP_Name);
    SSDP.setModelNumber("000000000001");
    SSDP.setModelURL("http://esp8266-arduinoide.ru/wifimanager/");
    SSDP.setManufacturer("Tretyakov Sergey");
    SSDP.setManufacturerURL("http://www.esp8266-arduinoide.ru");
    SSDP.begin();
}

 

CeMeH
Offline
Зарегистрирован: 06.10.2016
#ifndef _FFS_H_
#define _FFS_H_

#include <FS.h>               // Библиотека для работы с файловой системой
#include <ESP8266FtpServer.h> // Библиотека для работы с SPIFFS по FTP


void FTP_init(String _FTP_Name, String _FTP_password);

String getContentType(String filename);

#endif /* _FFS_H_ */

 

CeMeH
Offline
Зарегистрирован: 06.10.2016
#include "FFS.h"
#include "HTTP.h"

FtpServer ftpSrv; // Определяем объект для работы с модулем по FTP (для отладки HTML)

void FTP_init(String _FTP_Name, String _FTP_password)
{
    SPIFFS.begin();                         // Инициализируем работу с файловой системой
    ftpSrv.begin(_FTP_Name, _FTP_password); // Поднимаем FTP-сервер (логин: FTP_Name, пароль: FTP_password)
}

// Здесь функции для работы с файловой системой
String getContentType(String filename)
{
    if (HTTP.hasArg("download"))
        return "application/octet-stream";
    else if (filename.endsWith(".htm"))
        return "text/html";
    else if (filename.endsWith(".html"))
        return "text/html";
    else if (filename.endsWith(".json"))
        return "application/json";
    else if (filename.endsWith(".css"))
        return "text/css";
    else if (filename.endsWith(".js"))
        return "application/javascript";
    else if (filename.endsWith(".png"))
        return "image/png";
    else if (filename.endsWith(".gif"))
        return "image/gif";
    else if (filename.endsWith(".jpg"))
        return "image/jpeg";
    else if (filename.endsWith(".ico"))
        return "image/x-icon";
    else if (filename.endsWith(".xml"))
        return "text/xml";
    else if (filename.endsWith(".pdf"))
        return "application/x-pdf";
    else if (filename.endsWith(".zip"))
        return "application/x-zip";
    else if (filename.endsWith(".gz"))
        return "application/x-gzip";
    return "text/plain";
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

CeMeH пишет:

Выкладываю все файлы по отдельности, и сообщения об ошибках, которые выдает Planformio.

Подписывайте где какой - трудно же угадывать!

И про сворачивание по спойлер я Вам зря писал?

Делайте это ф одном сообщении. Название файла, под ним содержимое под спойлером.

CeMeH пишет:

HTTP.h добавил в FFS.cpp, но ничего не меняется. Выдает ошибку в терминал:

Добавьте тужа же (ниже include) 

extern ESP8266WebServer HTTP;
CeMeH
Offline
Зарегистрирован: 06.10.2016

Огромное спасибо. Все заработало!!!