From b21ca53dfc5921f1df1d658a1f93bce67ff6a191 Mon Sep 17 00:00:00 2001 From: Kajetan Rzepecki Date: Thu, 4 Apr 2019 03:28:26 +0200 Subject: [PATCH] SPIFFS-backed PersistentStore for ESP32 (#13566) --- Marlin/src/HAL/HAL_ESP32/HAL.cpp | 6 ++ .../HAL/HAL_ESP32/persistent_store_spiffs.cpp | 93 +++++++++++++++++++ Marlin/src/HAL/HAL_ESP32/spiffs.cpp | 44 +++++++++ Marlin/src/HAL/HAL_ESP32/spiffs.h | 26 ++++++ Marlin/src/HAL/HAL_ESP32/web.cpp | 11 +-- 5 files changed, 171 insertions(+), 9 deletions(-) create mode 100644 Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp create mode 100644 Marlin/src/HAL/HAL_ESP32/spiffs.cpp create mode 100644 Marlin/src/HAL/HAL_ESP32/spiffs.h diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.cpp b/Marlin/src/HAL/HAL_ESP32/HAL.cpp index 76b961b7b..5e281f2ef 100644 --- a/Marlin/src/HAL/HAL_ESP32/HAL.cpp +++ b/Marlin/src/HAL/HAL_ESP32/HAL.cpp @@ -41,7 +41,10 @@ #endif #if ENABLED(WEBSUPPORT) #include "web.h" + #include "spiffs.h" #endif +#elif ENABLED(EEPROM_SETTINGS) + #include "spiffs.h" #endif // -------------------------------------------------------------------------- @@ -95,9 +98,12 @@ void HAL_init(void) { OTA_init(); #endif #if ENABLED(WEBSUPPORT) + spiffs_init(); web_init(); #endif server.begin(); + #elif ENABLED(EEPROM_SETTINGS) + spiffs_init(); #endif i2s_init(); diff --git a/Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp b/Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp new file mode 100644 index 000000000..795edf678 --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/persistent_store_spiffs.cpp @@ -0,0 +1,93 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(EEPROM_SETTINGS) && DISABLED(FLASH_EEPROM_EMULATION) + +#include "../shared/persistent_store_api.h" + +#include "SPIFFS.h" +#include "FS.h" +#include "spiffs.h" + +#define HAL_ESP32_EEPROM_SIZE 4096 + +File eeprom_file; + +bool PersistentStore::access_start() { + if (spiffs_initialized) { + eeprom_file = SPIFFS.open("/eeprom.dat", "r+"); + + size_t file_size = eeprom_file.size(); + if (file_size < HAL_ESP32_EEPROM_SIZE) { + bool write_ok = eeprom_file.seek(file_size); + + while (write_ok && file_size < HAL_ESP32_EEPROM_SIZE) { + write_ok = eeprom_file.write(0xFF) == 1; + file_size++; + } + } + return true; + } + return false; +} + +bool PersistentStore::access_finish() { + eeprom_file.close(); + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + if (!eeprom_file.seek(pos)) return true; // return true for any error + if (eeprom_file.write(value, size) != size) return true; + + crc16(crc, value, size); + pos += size; + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + if (!eeprom_file.seek(pos)) return true; // return true for any error + + if (writing) { + if (eeprom_file.read(value, size) != size) return true; + crc16(crc, value, size); + } + else { + uint8_t tmp[size]; + if (eeprom_file.read(tmp, size) != size) return true; + crc16(crc, tmp, size); + } + + pos += size; + + return false; +} + +size_t PersistentStore::capacity() { return HAL_ESP32_EEPROM_SIZE; } + +#endif // EEPROM_SETTINGS +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/spiffs.cpp b/Marlin/src/HAL/HAL_ESP32/spiffs.cpp new file mode 100644 index 000000000..c960f386d --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/spiffs.cpp @@ -0,0 +1,44 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#ifdef ARDUINO_ARCH_ESP32 + +#include "../../inc/MarlinConfigPre.h" + +#if EITHER(WEBSUPPORT, EEPROM_SETTINGS) + +#include "../../core/serial.h" + +#include "FS.h" +#include "SPIFFS.h" + +bool spiffs_initialized; + +void spiffs_init() { + if (SPIFFS.begin()) + spiffs_initialized = true; + else + SERIAL_ECHO_MSG("SPIFFS mount failed"); +} + +#endif // WEBSUPPORT +#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/HAL/HAL_ESP32/spiffs.h b/Marlin/src/HAL/HAL_ESP32/spiffs.h new file mode 100644 index 000000000..e1573340c --- /dev/null +++ b/Marlin/src/HAL/HAL_ESP32/spiffs.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (C) 2019 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +extern bool spiffs_initialized; + +void spiffs_init(); diff --git a/Marlin/src/HAL/HAL_ESP32/web.cpp b/Marlin/src/HAL/HAL_ESP32/web.cpp index a3a6cce72..6bbc0d13a 100644 --- a/Marlin/src/HAL/HAL_ESP32/web.cpp +++ b/Marlin/src/HAL/HAL_ESP32/web.cpp @@ -23,9 +23,6 @@ #if ENABLED(WEBSUPPORT) -#include "../../core/serial.h" - -#include "FS.h" #include "SPIFFS.h" #include "wifi.h" @@ -37,12 +34,8 @@ void onNotFound(AsyncWebServerRequest *request){ void web_init() { server.addHandler(&events); // attach AsyncEventSource - if (SPIFFS.begin()) { - server.serveStatic("/", SPIFFS, "/www").setDefaultFile("index.html"); - server.onNotFound(onNotFound); - } - else - SERIAL_ECHO_MSG("SPIFFS Mount Failed"); + server.serveStatic("/", SPIFFS, "/www").setDefaultFile("index.html"); + server.onNotFound(onNotFound); } #endif // WEBSUPPORT