Хранение значений - GyverLibs/GyverPortal GitHub Wiki

Основное применение веб интерфейса - настройка устройства. То есть нужно отобразить текущие значения из программы, иметь возможность их поменять и показать актуальные при следующей загрузке страницы. Таким образом значения компонентов из конструктора нужно брать из переменных, а при изменении записывать их в эти же переменные. Простой пример со слайдером, в котором значение хранится в глобальной переменной sld, передаётся в конструктор, а также принимает новое значение по клику:

int sld;

void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.SLIDER("sld", sld);
  GP.BUILD_END();
}

void action() {
  portal.clickInt("sld", sld);
}

Упаковка в структуру

При использовании нескольких компонентов бывает удобно объединить переменные в структуру:

struct Data {
  int sld;
  bool sw;
};

Data data;

void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.SWITCH("sw", data.sw);
  GP.BREAK();
  GP.SLIDER("sld", data.sld);
  GP.BUILD_END();
}

void action() {
  portal.clickInt("sld", data.sld);
  portal.clickBool("sw", data.sw);
}

Хранение в EEPROM

Также это позволит удобно хранить все настройки в EEPROM, например с библиотекой EEManager:

struct Data {
  int sld;
  bool sw;
};
Data data;

#include <EEManager.h>
EEManager memory(data);

void setup() {
  // ....
  EEPROM.begin(100);
  memory.begin(0, 0);
}

void build() {
  GP.BUILD_BEGIN();
  GP.THEME(GP_DARK);
  GP.SWITCH("sw", data.sw);
  GP.BREAK();
  GP.SLIDER("sld", data.sld);
  GP.BUILD_END();
}

void action() {
  if (portal.click()) {
    portal.clickInt("sld", data.sld);
    portal.clickBool("sw", data.sw);
    memory.update();
  }
}

void loop() {
  memory.tick();
}

Теперь позиция слайдера и состояния чекбокса будут сохраняться при перезагрузке esp.