diff --git a/.gitignore b/.gitignore index f52970ba..9bc9f818 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ .gcc-flags.json *Thumbs.db /data/www -/lib/framework/WWWData.h +src/WWWData.h /interface/build /interface/node_modules /interface/.eslintcache diff --git a/examples/LightState/.gitignore b/examples/LightState/.gitignore new file mode 100644 index 00000000..89cc49cb --- /dev/null +++ b/examples/LightState/.gitignore @@ -0,0 +1,5 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/examples/LightState/factory_settings.ini b/examples/LightState/factory_settings.ini new file mode 100644 index 00000000..b9fbd60a --- /dev/null +++ b/examples/LightState/factory_settings.ini @@ -0,0 +1,54 @@ +; The indicated settings support placeholder substitution as follows: +; +; #{platform} - The microcontroller platform, e.g. "esp32" or "esp8266" +; #{unique_id} - A unique identifier derived from the MAC address, e.g. "0b0a859d6816" +; #{random} - A random number encoded as a hex string, e.g. "55722f94" + +[factory_settings] +build_flags = + ; WiFi settings + -D FACTORY_WIFI_SSID=\"\" + -D FACTORY_WIFI_PASSWORD=\"\" + -D FACTORY_WIFI_HOSTNAME=\"#{platform}-#{unique_id}\" ; supports placeholders + + ; Access point settings + -D FACTORY_AP_PROVISION_MODE=AP_MODE_DISCONNECTED + -D FACTORY_AP_SSID=\"ESP8266-React-#{unique_id}\" ; 1-64 characters, supports placeholders + -D FACTORY_AP_PASSWORD=\"esp-react\" ; 8-64 characters + -D FACTORY_AP_CHANNEL=1 + -D FACTORY_AP_SSID_HIDDEN=false + -D FACTORY_AP_MAX_CLIENTS=4 + -D FACTORY_AP_LOCAL_IP=\"192.168.4.1\" + -D FACTORY_AP_GATEWAY_IP=\"192.168.4.1\" + -D FACTORY_AP_SUBNET_MASK=\"255.255.255.0\" + + ; User credentials for admin and guest user + -D FACTORY_ADMIN_USERNAME=\"admin\" + -D FACTORY_ADMIN_PASSWORD=\"admin\" + -D FACTORY_GUEST_USERNAME=\"guest\" + -D FACTORY_GUEST_PASSWORD=\"guest\" + + ; NTP settings + -D FACTORY_NTP_ENABLED=true + -D FACTORY_NTP_TIME_ZONE_LABEL=\"Europe/London\" + -D FACTORY_NTP_TIME_ZONE_FORMAT=\"GMT0BST,M3.5.0/1,M10.5.0\" + -D FACTORY_NTP_SERVER=\"time.google.com\" + + ; OTA settings + -D FACTORY_OTA_PORT=8266 + -D FACTORY_OTA_PASSWORD=\"esp-react\" + -D FACTORY_OTA_ENABLED=true + + ; MQTT settings + -D FACTORY_MQTT_ENABLED=false + -D FACTORY_MQTT_HOST=\"test.mosquitto.org\" + -D FACTORY_MQTT_PORT=1883 + -D FACTORY_MQTT_USERNAME=\"\" ; supports placeholders + -D FACTORY_MQTT_PASSWORD=\"\" + -D FACTORY_MQTT_CLIENT_ID=\"#{platform}-#{unique_id}\" ; supports placeholders + -D FACTORY_MQTT_KEEP_ALIVE=60 + -D FACTORY_MQTT_CLEAN_SESSION=true + -D FACTORY_MQTT_MAX_TOPIC_LENGTH=128 + + ; JWT Secret + -D FACTORY_JWT_SECRET=\"#{random}-#{random}\" ; supports placeholders diff --git a/examples/LightState/features.ini b/examples/LightState/features.ini new file mode 100644 index 00000000..ffb890d9 --- /dev/null +++ b/examples/LightState/features.ini @@ -0,0 +1,8 @@ +[features] +build_flags = + -D FT_PROJECT=1 + -D FT_SECURITY=1 + -D FT_MQTT=1 + -D FT_NTP=1 + -D FT_OTA=1 + -D FT_UPLOAD_FIRMWARE=1 diff --git a/examples/LightState/platformio.ini b/examples/LightState/platformio.ini new file mode 100644 index 00000000..4c509ecb --- /dev/null +++ b/examples/LightState/platformio.ini @@ -0,0 +1,64 @@ +[platformio] +extra_configs = + factory_settings.ini + features.ini +default_envs = esp12e +;default_envs = node32s +;default_envs = esp32dev + +[env] +build_flags= + ${factory_settings.build_flags} + ${features.build_flags} + -D NO_GLOBAL_ARDUINOOTA + ; Uncomment PROGMEM_WWW to enable the storage of the WWW data in PROGMEM + -D PROGMEM_WWW + ; Uncomment to configure Cross-Origin Resource Sharing + ;-D ENABLE_CORS + ;-D CORS_ORIGIN=\"*\" + +; ensure transitive dependencies are included for correct platforms only +lib_compat_mode = strict + +; Uncomment & modify the lines below in order to configure OTA updates +;upload_flags = +; --port=8266 +; --auth=esp-react +;upload_port = 192.168.0.11 +;upload_protocol = espota + +framework = arduino +monitor_speed = 115200 + +extra_scripts = + pre:$PROJECT_LIBDEPS_DIR/$PIOENV/esp8266-react/scripts/build_interface.py + +lib_deps = + ArduinoJson@>=6.0.0,<7.0.0 + ; The following allows the use of the latest code for ESPAsyncWebServer - there hasn't been a release in a while + ; Work around for https://github.com/me-no-dev/ESPAsyncWebServer/issues/1151 + https://github.com/me-no-dev/ESPAsyncWebServer + ;ESP Async WebServer@>=1.2.0,<2.0.0 + AsyncMqttClient@>=0.9.0,<1.0.0 + https://github.com/FernandoGarcia/esp8266-react.git + +[env:esp12e] +platform = espressif8266 +board = esp12e +board_build.f_cpu = 160000000L +board_build.filesystem = littlefs + +; Comment out min_spiffs.csv setting if disabling PROGMEM_WWW with ESP32 + +[env:node32s] +board_build.partitions = min_spiffs.csv +platform = espressif32 +board = node32s +board_build.filesystem = littlefs + +[env:esp32dev] +; Comment out min_spiffs.csv setting if disabling PROGMEM_WWW with ESP32 +board_build.partitions = min_spiffs.csv +platform = espressif32 +board = esp32dev +board_build.filesystem = littlefs \ No newline at end of file diff --git a/src/LightMqttSettingsService.cpp b/examples/LightState/src/LightMqttSettingsService.cpp similarity index 100% rename from src/LightMqttSettingsService.cpp rename to examples/LightState/src/LightMqttSettingsService.cpp diff --git a/src/LightMqttSettingsService.h b/examples/LightState/src/LightMqttSettingsService.h similarity index 100% rename from src/LightMqttSettingsService.h rename to examples/LightState/src/LightMqttSettingsService.h diff --git a/src/LightStateService.cpp b/examples/LightState/src/LightStateService.cpp similarity index 100% rename from src/LightStateService.cpp rename to examples/LightState/src/LightStateService.cpp diff --git a/src/LightStateService.h b/examples/LightState/src/LightStateService.h similarity index 100% rename from src/LightStateService.h rename to examples/LightState/src/LightStateService.h diff --git a/src/main.cpp b/examples/LightState/src/main.cpp similarity index 100% rename from src/main.cpp rename to examples/LightState/src/main.cpp diff --git a/interface/config-overrides.js b/interface/config-overrides.js index 8f3f7f3c..500b465e 100644 --- a/interface/config-overrides.js +++ b/interface/config-overrides.js @@ -22,7 +22,7 @@ module.exports = function override(config, env) { terserPlugin.options.extractComments = false; // build progmem data files - config.plugins.push(new ProgmemGenerator({ outputPath: "../lib/framework/WWWData.h", bytesPerLine: 20 })); + config.plugins.push(new ProgmemGenerator({ outputPath: "../src/WWWData.h", bytesPerLine: 20 })); } return config; }; diff --git a/lib/readme.txt b/lib/readme.txt deleted file mode 100644 index dbadc3d6..00000000 --- a/lib/readme.txt +++ /dev/null @@ -1,36 +0,0 @@ - -This directory is intended for the project specific (private) libraries. -PlatformIO will compile them to static libraries and link to executable file. - -The source code of each library should be placed in separate directory, like -"lib/private_lib/[here are source files]". - -For example, see how can be organized `Foo` and `Bar` libraries: - -|--lib -| |--Bar -| | |--docs -| | |--examples -| | |--src -| | |- Bar.c -| | |- Bar.h -| |--Foo -| | |- Foo.c -| | |- Foo.h -| |- readme.txt --> THIS FILE -|- platformio.ini -|--src - |- main.c - -Then in `src/main.c` you should use: - -#include -#include - -// rest H/C/CPP code - -PlatformIO will find your libraries automatically, configure preprocessor's -include paths and build them. - -More information about PlatformIO Library Dependency Finder -- http://docs.platformio.org/page/librarymanager/ldf.html diff --git a/library.json b/library.json new file mode 100644 index 00000000..2ab69bde --- /dev/null +++ b/library.json @@ -0,0 +1,24 @@ +{ + "name": "esp8266-react", + "description": "A framework for ESP8266 & ESP32 microcontrollers with a React UI ", + "keywords": "react,framework,wifimanager,http,async,websocket,webserver", + "authors": { + "name": "rjwats", + "maintainer": true + }, + "repository": { + "type": "git", + "url": "https://github.com/rjwats/esp8266-react.git" + }, + "build": { + + }, + "version": "1.0.0", + "license": "LGPL-3.0", + "frameworks": "arduino", + "platforms": [ + "espressif8266", + "espressif32" + ], + "dependencies": [] +} diff --git a/platformio.ini b/platformio.ini index f83cf677..039d53a0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -4,6 +4,7 @@ extra_configs = features.ini default_envs = esp12e ;default_envs = node32s +;default_envs = esp32dev [env] build_flags= @@ -30,7 +31,7 @@ framework = arduino monitor_speed = 115200 extra_scripts = - pre:scripts/build_interface.py + pre:lib/esp8266-react/scripts/build_interface.py lib_deps = ArduinoJson@>=6.0.0,<7.0.0 @@ -46,9 +47,16 @@ board = esp12e board_build.f_cpu = 160000000L board_build.filesystem = littlefs -[env:node32s] ; Comment out min_spiffs.csv setting if disabling PROGMEM_WWW with ESP32 + +[env:node32s] board_build.partitions = min_spiffs.csv platform = espressif32 board = node32s board_build.filesystem = littlefs + +[env:esp32dev] +board_build.partitions = min_spiffs.csv +platform = espressif32 +board = esp32dev +board_build.filesystem = littlefs diff --git a/scripts/build_interface.py b/scripts/build_interface.py index aea3a18d..cf5bb947 100644 --- a/scripts/build_interface.py +++ b/scripts/build_interface.py @@ -3,9 +3,13 @@ from subprocess import check_output, Popen, PIPE, STDOUT, CalledProcessError import os import gzip +import inspect Import("env") +filename = inspect.getframeinfo(inspect.currentframe()).filename +dir_path = os.path.dirname(os.path.abspath(filename)) + def gzipFile(file): with open(file, 'rb') as f_in: with gzip.open(file + '.gz', 'wb') as f_out: @@ -19,7 +23,7 @@ def flagExists(flag): return True def buildWeb(): - os.chdir("interface") + os.chdir(dir_path + '/../interface') print("Building interface with npm") try: env.Execute("npm install") diff --git a/lib/framework/APSettingsService.cpp b/src/APSettingsService.cpp similarity index 100% rename from lib/framework/APSettingsService.cpp rename to src/APSettingsService.cpp diff --git a/lib/framework/APSettingsService.h b/src/APSettingsService.h similarity index 100% rename from lib/framework/APSettingsService.h rename to src/APSettingsService.h diff --git a/lib/framework/APStatus.cpp b/src/APStatus.cpp similarity index 100% rename from lib/framework/APStatus.cpp rename to src/APStatus.cpp diff --git a/lib/framework/APStatus.h b/src/APStatus.h similarity index 100% rename from lib/framework/APStatus.h rename to src/APStatus.h diff --git a/lib/framework/ArduinoJsonJWT.cpp b/src/ArduinoJsonJWT.cpp similarity index 100% rename from lib/framework/ArduinoJsonJWT.cpp rename to src/ArduinoJsonJWT.cpp diff --git a/lib/framework/ArduinoJsonJWT.h b/src/ArduinoJsonJWT.h similarity index 100% rename from lib/framework/ArduinoJsonJWT.h rename to src/ArduinoJsonJWT.h diff --git a/lib/framework/AuthenticationService.cpp b/src/AuthenticationService.cpp similarity index 100% rename from lib/framework/AuthenticationService.cpp rename to src/AuthenticationService.cpp diff --git a/lib/framework/AuthenticationService.h b/src/AuthenticationService.h similarity index 100% rename from lib/framework/AuthenticationService.h rename to src/AuthenticationService.h diff --git a/lib/framework/ESP8266React.cpp b/src/ESP8266React.cpp similarity index 100% rename from lib/framework/ESP8266React.cpp rename to src/ESP8266React.cpp diff --git a/lib/framework/ESP8266React.h b/src/ESP8266React.h similarity index 100% rename from lib/framework/ESP8266React.h rename to src/ESP8266React.h diff --git a/lib/framework/ESPFS.h b/src/ESPFS.h similarity index 100% rename from lib/framework/ESPFS.h rename to src/ESPFS.h diff --git a/lib/framework/FSPersistence.h b/src/FSPersistence.h similarity index 85% rename from lib/framework/FSPersistence.h rename to src/FSPersistence.h index f3d9573c..427a6176 100644 --- a/lib/framework/FSPersistence.h +++ b/src/FSPersistence.h @@ -3,6 +3,7 @@ #include #include +#include template class FSPersistence { @@ -51,13 +52,33 @@ class FSPersistence { JsonObject jsonObject = jsonDocument.to(); _statefulService->read(jsonObject, _stateReader); + if(!_fs->exists(FS_CONFIG_DIRECTORY)){ + Serial.println(F("Directory doesn't exists.")); + + if(_fs->mkdir(FS_CONFIG_DIRECTORY)){ + Serial.println(F("Directory created.")); + } + else{ + Serial.println(F("Can't create the directory.")); + } + } + else{ + Serial.println(F("Directory exists.")); + } + // serialize it to filesystem File settingsFile = _fs->open(_filePath, "w"); // failed to open file, return false if (!settingsFile) { + Serial.print(F("Can't open the file: ")); + Serial.println(_filePath); return false; } + else{ + Serial.print(_filePath); + Serial.println(F(" was opened.")); + } // serialize the data to the file serializeJson(jsonDocument, settingsFile); diff --git a/lib/framework/FactoryResetService.cpp b/src/FactoryResetService.cpp similarity index 89% rename from lib/framework/FactoryResetService.cpp rename to src/FactoryResetService.cpp index 97422070..cef36ba4 100644 --- a/lib/framework/FactoryResetService.cpp +++ b/src/FactoryResetService.cpp @@ -19,11 +19,7 @@ void FactoryResetService::handleRequest(AsyncWebServerRequest* request) { */ void FactoryResetService::factoryReset() { #ifdef ESP32 - File root = fs->open(FS_CONFIG_DIRECTORY); - File file; - while (file = root.openNextFile()) { - fs->remove(file.name()); - } + fs->rmdir(FS_CONFIG_DIRECTORY); #elif defined(ESP8266) Dir configDirectory = fs->openDir(FS_CONFIG_DIRECTORY); while (configDirectory.next()) { diff --git a/lib/framework/FactoryResetService.h b/src/FactoryResetService.h similarity index 100% rename from lib/framework/FactoryResetService.h rename to src/FactoryResetService.h diff --git a/lib/framework/Features.h b/src/Features.h similarity index 100% rename from lib/framework/Features.h rename to src/Features.h diff --git a/lib/framework/FeaturesService.cpp b/src/FeaturesService.cpp similarity index 100% rename from lib/framework/FeaturesService.cpp rename to src/FeaturesService.cpp diff --git a/lib/framework/FeaturesService.h b/src/FeaturesService.h similarity index 100% rename from lib/framework/FeaturesService.h rename to src/FeaturesService.h diff --git a/lib/framework/HttpEndpoint.h b/src/HttpEndpoint.h similarity index 100% rename from lib/framework/HttpEndpoint.h rename to src/HttpEndpoint.h diff --git a/lib/framework/IPUtils.h b/src/IPUtils.h similarity index 100% rename from lib/framework/IPUtils.h rename to src/IPUtils.h diff --git a/lib/framework/JsonUtils.h b/src/JsonUtils.h similarity index 100% rename from lib/framework/JsonUtils.h rename to src/JsonUtils.h diff --git a/lib/framework/MqttPubSub.h b/src/MqttPubSub.h similarity index 100% rename from lib/framework/MqttPubSub.h rename to src/MqttPubSub.h diff --git a/lib/framework/MqttSettingsService.cpp b/src/MqttSettingsService.cpp similarity index 100% rename from lib/framework/MqttSettingsService.cpp rename to src/MqttSettingsService.cpp diff --git a/lib/framework/MqttSettingsService.h b/src/MqttSettingsService.h similarity index 100% rename from lib/framework/MqttSettingsService.h rename to src/MqttSettingsService.h diff --git a/lib/framework/MqttStatus.cpp b/src/MqttStatus.cpp similarity index 100% rename from lib/framework/MqttStatus.cpp rename to src/MqttStatus.cpp diff --git a/lib/framework/MqttStatus.h b/src/MqttStatus.h similarity index 100% rename from lib/framework/MqttStatus.h rename to src/MqttStatus.h diff --git a/lib/framework/NTPSettingsService.cpp b/src/NTPSettingsService.cpp similarity index 100% rename from lib/framework/NTPSettingsService.cpp rename to src/NTPSettingsService.cpp diff --git a/lib/framework/NTPSettingsService.h b/src/NTPSettingsService.h similarity index 100% rename from lib/framework/NTPSettingsService.h rename to src/NTPSettingsService.h diff --git a/lib/framework/NTPStatus.cpp b/src/NTPStatus.cpp similarity index 100% rename from lib/framework/NTPStatus.cpp rename to src/NTPStatus.cpp diff --git a/lib/framework/NTPStatus.h b/src/NTPStatus.h similarity index 100% rename from lib/framework/NTPStatus.h rename to src/NTPStatus.h diff --git a/lib/framework/OTASettingsService.cpp b/src/OTASettingsService.cpp similarity index 100% rename from lib/framework/OTASettingsService.cpp rename to src/OTASettingsService.cpp diff --git a/lib/framework/OTASettingsService.h b/src/OTASettingsService.h similarity index 100% rename from lib/framework/OTASettingsService.h rename to src/OTASettingsService.h diff --git a/lib/framework/RestartService.cpp b/src/RestartService.cpp similarity index 100% rename from lib/framework/RestartService.cpp rename to src/RestartService.cpp diff --git a/lib/framework/RestartService.h b/src/RestartService.h similarity index 100% rename from lib/framework/RestartService.h rename to src/RestartService.h diff --git a/lib/framework/SecurityManager.h b/src/SecurityManager.h similarity index 100% rename from lib/framework/SecurityManager.h rename to src/SecurityManager.h diff --git a/lib/framework/SecuritySettingsService.cpp b/src/SecuritySettingsService.cpp similarity index 100% rename from lib/framework/SecuritySettingsService.cpp rename to src/SecuritySettingsService.cpp diff --git a/lib/framework/SecuritySettingsService.h b/src/SecuritySettingsService.h similarity index 100% rename from lib/framework/SecuritySettingsService.h rename to src/SecuritySettingsService.h diff --git a/lib/framework/SettingValue.cpp b/src/SettingValue.cpp similarity index 100% rename from lib/framework/SettingValue.cpp rename to src/SettingValue.cpp diff --git a/lib/framework/SettingValue.h b/src/SettingValue.h similarity index 100% rename from lib/framework/SettingValue.h rename to src/SettingValue.h diff --git a/lib/framework/StatefulService.cpp b/src/StatefulService.cpp similarity index 100% rename from lib/framework/StatefulService.cpp rename to src/StatefulService.cpp diff --git a/lib/framework/StatefulService.h b/src/StatefulService.h similarity index 100% rename from lib/framework/StatefulService.h rename to src/StatefulService.h diff --git a/lib/framework/SystemStatus.cpp b/src/SystemStatus.cpp similarity index 100% rename from lib/framework/SystemStatus.cpp rename to src/SystemStatus.cpp diff --git a/lib/framework/SystemStatus.h b/src/SystemStatus.h similarity index 100% rename from lib/framework/SystemStatus.h rename to src/SystemStatus.h diff --git a/lib/framework/UploadFirmwareService.cpp b/src/UploadFirmwareService.cpp similarity index 100% rename from lib/framework/UploadFirmwareService.cpp rename to src/UploadFirmwareService.cpp diff --git a/lib/framework/UploadFirmwareService.h b/src/UploadFirmwareService.h similarity index 100% rename from lib/framework/UploadFirmwareService.h rename to src/UploadFirmwareService.h diff --git a/lib/framework/WebSocketTxRx.h b/src/WebSocketTxRx.h similarity index 100% rename from lib/framework/WebSocketTxRx.h rename to src/WebSocketTxRx.h diff --git a/lib/framework/WiFiScanner.cpp b/src/WiFiScanner.cpp similarity index 100% rename from lib/framework/WiFiScanner.cpp rename to src/WiFiScanner.cpp diff --git a/lib/framework/WiFiScanner.h b/src/WiFiScanner.h similarity index 100% rename from lib/framework/WiFiScanner.h rename to src/WiFiScanner.h diff --git a/lib/framework/WiFiSettingsService.cpp b/src/WiFiSettingsService.cpp similarity index 96% rename from lib/framework/WiFiSettingsService.cpp rename to src/WiFiSettingsService.cpp index 1a6b7ad4..c5771077 100644 --- a/lib/framework/WiFiSettingsService.cpp +++ b/src/WiFiSettingsService.cpp @@ -71,10 +71,10 @@ void WiFiSettingsService::manageSTA() { } else { // configure for DHCP #ifdef ESP32 - WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); + //WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname(_state.hostname.c_str()); #elif defined(ESP8266) - WiFi.config(INADDR_ANY, INADDR_ANY, INADDR_ANY); + //WiFi.config(INADDR_ANY, INADDR_ANY, INADDR_ANY); WiFi.hostname(_state.hostname); #endif } diff --git a/lib/framework/WiFiSettingsService.h b/src/WiFiSettingsService.h similarity index 100% rename from lib/framework/WiFiSettingsService.h rename to src/WiFiSettingsService.h diff --git a/lib/framework/WiFiStatus.cpp b/src/WiFiStatus.cpp similarity index 100% rename from lib/framework/WiFiStatus.cpp rename to src/WiFiStatus.cpp diff --git a/lib/framework/WiFiStatus.h b/src/WiFiStatus.h similarity index 100% rename from lib/framework/WiFiStatus.h rename to src/WiFiStatus.h