Как разделить скетч на части?
- Войдите на сайт для отправки комментариев
Вс, 07/11/2021 - 14:15
Не могу разделить скетч на модули.
Помогите разобраться почему не работает. Хочу разделить скетч на части, чтобы функции 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";
}
А почему второй строки из первого кода нет во втором коде? Должна быть! Но при этом, сам файл http.h должен быть написан грамотно, а у Вас он секретный, так что ХЗ. Если хотите нормального разговора - файлы публикуйте полностью и сообщение об ошибке полностью.
Та файлы не секретные. Выкладываю 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_ */ -------------------------------------------------------------------- #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"; } --------------------------------------------------------------------Вы думаете, что вот это я просто так написал? Делать этого не нужно?
А почему второй строки из первого кода нет во втором коде? Должна быть!
И где сообщение об ошибке? Про него я тоже зря пальцы об клавиши бил?
И да, для чего Вы соединяете по два файла? Чтобы создать неудобство тому, кто желает Вам помочь и для этого захочет попробовать компилировать у себя?
Файлы выкладывайте всегда полностью, каждый сам по себе и, если они больше строк 10-15, сворачивайте из под спойлер.
Благодарен Вам, что пытаетесь мне помочь, и прошу прощения, что я так туплю. Просто я впервые на таком форуме пишу сообщения. Обычно мне хватало просто читать.
Выкладываю все файлы по отдельности, и сообщения об ошибках, которые выдает Planformio.
HTTP.h добавил в FFS.cpp, но ничего не меняется. Выдает ошибку в терминал:
'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 не работает. Работает только если все писать в один файл. Но тогда файл у меня получиться очень огромный. Хотелось бы сделать модульно. Ниже все файлы отдельно.
#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(); }#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"; }Выкладываю все файлы по отдельности, и сообщения об ошибках, которые выдает Planformio.
Подписывайте где какой - трудно же угадывать!
И про сворачивание по спойлер я Вам зря писал?
Делайте это ф одном сообщении. Название файла, под ним содержимое под спойлером.
HTTP.h добавил в FFS.cpp, но ничего не меняется. Выдает ошибку в терминал:
Добавьте тужа же (ниже include)
Огромное спасибо. Все заработало!!!