123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /*
- EEPROM.ino, Example for the AutoConnect library.
- Copyright (c) 2020, Hieromon Ikasamo
- https://github.com/Hieromon/AutoConnect
- This software is released under the MIT License.
- https://opensource.org/licenses/MIT
- The AutoConnectConfig::boundaryOffset setting allows AutoConnect to
- write its data to EEPROM while preserving custom configuration data.
- Similarly, when a Sketch writes its own data to EEPROM, it must
- preserve the data written by AutoConnect.
- This example demonstrates how to use the getEEPROMUsedSize() method to
- store custom configuration settings in EEPROM without conflicting with
- AutoConnect's use of that storage. (Note: this applies to the ESP8266
- only, not the ESP32.)
- */
- #ifndef ARDUINO_ARCH_ESP8266
- #error "EEPROM.ino sketch is available for ESP8266 only."
- #endif
- #include <ESP8266WiFi.h>
- #include <ESP8266WebServer.h>
- #include <EEPROM.h>
- #include <AutoConnect.h>
- ESP8266WebServer server;
- AutoConnect portal(server);
- AutoConnectConfig config;
- const char AUX_EEPROM_IO[] PROGMEM = R"(
- [
- {
- "title": "EEPROM",
- "uri": "/",
- "menu": true,
- "element": [
- {
- "name": "data1",
- "type": "ACInput",
- "label": "DATA1",
- "global": true
- },
- {
- "name": "data2",
- "type": "ACInput",
- "label": "DATA2",
- "global": true
- },
- {
- "name": "data3",
- "type": "ACInput",
- "label": "DATA3",
- "global": true
- },
- {
- "name": "write",
- "type": "ACSubmit",
- "value": "WRITE",
- "uri": "/eeprom"
- }
- ]
- },
- {
- "title": "EEPROM",
- "uri": "/eeprom",
- "menu": false,
- "element": [
- {
- "name": "data1",
- "type": "ACText",
- "format": "DATA1: %s",
- "posterior": "br",
- "global": true
- },
- {
- "name": "data2",
- "type": "ACText",
- "format": "DATA2: %s",
- "posterior": "br",
- "global": true
- },
- {
- "name": "data3",
- "type": "ACText",
- "format": "DATA3: %s",
- "posterior": "br",
- "global": true
- }
- ]
- }
- ]
- )";
- // Defines the custom data should be stored in EEPROM.
- typedef struct {
- char data1[8];
- char data2[8];
- char data3[8];
- } EEPROM_CONFIG_t;
- String toString(char* c, uint8_t length) {
- String r;
- while (length-- && *c) {
- r += (isAlphaNumeric(*c) ? String(*c) : String(*c, HEX));
- c++;
- }
- return r;
- }
- // Read from EEPROM
- String onEEPROM(AutoConnectAux& page, PageArgument& args) {
- EEPROM_CONFIG_t eepromConfig;
- EEPROM.begin(sizeof(eepromConfig));
- EEPROM.get<EEPROM_CONFIG_t>(0, eepromConfig);
- EEPROM.end();
- page["data1"].value = toString(eepromConfig.data1, sizeof(EEPROM_CONFIG_t::data1));
- page["data2"].value = toString(eepromConfig.data2, sizeof(EEPROM_CONFIG_t::data2));
- page["data3"].value = toString(eepromConfig.data3, sizeof(EEPROM_CONFIG_t::data3));
- return String();
- }
- // Write to EEPROM
- String onEEPROMWrite(AutoConnectAux& page, PageArgument& args) {
- EEPROM_CONFIG_t eepromConfig;
- strncpy(eepromConfig.data1, page["data1"].value.c_str(), sizeof(EEPROM_CONFIG_t::data1));
- strncpy(eepromConfig.data2, page["data2"].value.c_str(), sizeof(EEPROM_CONFIG_t::data2));
- strncpy(eepromConfig.data3, page["data3"].value.c_str(), sizeof(EEPROM_CONFIG_t::data3));
- // The actual area size of the EEPROM region to be given to
- // EEPROM.begin is the sum of the size of the own custom data and
- // the size of the currently stored AutoConnect credentials.
- // eg.
- // EEPROM.begin(portal.getEEPROMUsedSize())
- EEPROM.begin(portal.getEEPROMUsedSize());
- EEPROM.put<EEPROM_CONFIG_t>(0, eepromConfig);
- EEPROM.commit();
- EEPROM.end();
- return String();
- }
- void setup() {
- delay(1000);
- Serial.begin(115200);
- Serial.println();
- portal.load(FPSTR(AUX_EEPROM_IO));
- portal.on("/", onEEPROM);
- portal.on("/eeprom", onEEPROMWrite);
- // Specifies to shift the AutoConnect credentials with the custom data region size.
- config.boundaryOffset = sizeof(EEPROM_CONFIG_t);
- portal.config(config);
- portal.begin();
- }
- void loop() {
- portal.handleClient();
- }
|