Closed GyverLibs closed 1 year ago
После обновления с 3.4 на 3.5 появилась проблема в ширине столбцов в таблице. Строим таблицу с указанием размеров ячеек (ширины столбцов), например, четыре столбца "25%,25%,25%,25%". В ячейки помещаем GP.NUMBER(имя, подсказка, число); и в табличке в релизе 3.4 корректно задаётся ширина столбцов, согласно, "25%,25%,25%,25%" В релизе 3.5 столбцы расширились до умолчательной ширины GP.NUMBER и в целом таблица стала ширине всех других таблиц, где нет GP.NUMBER. Для решения проблемы у GP.NUMBER теперь явно указываю ширину текста (80%) GP.NUMBER(имя, подсказка, число, ширина).
Проблема наблюдается и у GP.NUMBER_F
А проблему с перезагрузкой по alert не удалось устранить?
проблема в ширине столбцов в таблице
Принял, верну ширину обратно
проблему с перезагрузкой по alert
Я в тот же вечер сделал, вроде работает отлично. Имя алерта добавляется в релоад список, после вывода алерта и нажатия на ОК страница перезагружается
Я в тот же вечер сделал, вроде работает отлично. Имя алерта добавляется в релоад список, после вывода алерта и нажатия на ОК страница перезагружается
Смешной вопрос, а alert и jquery совместимы на одной странице? У меня есть блок с jquery обновлением и alert, но что-то alert не появляется
И продублирую с форума:
Обнаружил, что локально можно грузить скрипты графиков только для AJAX и PLOT_STOCK у PLOT намеренно нет такой возможности?
void PLOT(const String& id, const char** labels, int16_t vals[ax][am], int dec = 0, int height = 400)
Есть фиксовый массив, который хотелось бы показать на графике, ESP в режиме роутера, доступа к интернету нет
alert и jquery совместимы на одной странице?
Ни малейшего понятия) но все компоненты, которые вызываются через обновление, должны вызываться именно через update. Jquery обновляет только значения
у PLOT намеренно нет такой возможности?
Намеренно, тк там десяток файлов скриптов и стилей нужно для работы. В будущем все три графика скорее всего будут заменены одним лёгким и универсальным
Ни малейшего понятия) но все компоненты, которые вызываются через обновление, должны вызываться именно через update. Jquery обновляет только значения
Собственно не получается. Имею страницу На ней часть заключена в GP.JQ_UPDATE Заключена, чтобы иметь возможность без перезагрузки страницы обновлять доступность SWITCH калибровки (чтобы следующий становился доступным, после включения предыдущего) Доступность слайдеров работает корректно. Но вот alert не появляется после нажатия кнопки "Сохранить данные калибровки" и страница не перезагружается. При этом со страницы пропадает блок, который заключен в GP.JQ_UPDATE Код и скрины ниже
void build() {
GP.BUILD_BEGIN_FILE(600);
GP.THEME_FILE("GP_DARK");
GP.ALERT("alt2");
GP.RELOAD_CLICK("alt2");
GP.UPDATE("current_adc36,alt2", 250);
GP.BLOCK_BEGIN(GP_TAB, "100%", "Калибровка датчика уровня");
GP.JQ_SUPPORT_FILE();
GP.BLOCK_BEGIN(GP_TAB, "100%", "Ввод данных калибровки");
if (cal_start == true) {
GP.BOX_BEGIN(GP_CENTER);
GP.BOLD("Текущее значение конвертера");
GP.LABEL_BLOCK("", "current_adc36");
GP.BOX_END();
GP.BREAK();
//начало блока JQUERY
GP.JQ_UPDATE_BEGIN(500);
GP.TABLE_BORDER(1);
GP.TABLE_BEGIN("40%,30%,30%", GP_ALS(GP_CENTER, GP_CENTER, GP_CENTER), "100%");
GP.TR(); GP.TD(); GP.SPAN("Литров"); GP.TD(); GP.SPAN("Процентов"); GP.TD(); GP.SPAN("Задать");
GP.TR(); GP.TD(); GP.SPAN("0"); GP.TD(); GP.SPAN("0%"); GP.TD(); GP.SWITCH("cal_0", f0, PSTR("#6ecced"));
GP.TR(); GP.TD(); GP.SPAN(String(volume*0.5)); GP.TD(); GP.SPAN("50%"); GP.TD(); GP.SWITCH("cal_500", f500, PSTR("#6ecced"), !f0);
GP.TR(); GP.TD(); GP.SPAN(String(volume)); GP.TD(); GP.SPAN("100%"); GP.TD(); GP.SWITCH("cal_1000", f1000, PSTR("#6ecced"), !f500);
GP.TABLE_END();
GP.JQ_UPDATE_END();
// конец блока
GP.BUTTON_MINI("cal_stop", "Сохранить данные калибровки","","","",0,0);
} else {
GP.BUTTON_MINI("cal_start", "Начать калибровку","","","",0,1);
}
}
void action()
if (portal.update()) {
if (portal.update("current_adc36")) {
portal.answer(analogRead(Pin_36));
}
if (alertCal && portal.update("alt2")) {
alertCal = 0;
portal.answer(String("Значения калибровки сохранены!"));
}
if (portal.click()) {
if (portal.click("cal_stop")) { //остановка калибровки
save_calibrate();
alertCal = 1;
}
if (portal.click("cal_0")) { //кнопка калибровки 0%
cal_0 = analogRead(Pin_36);
f0 = 1;
}
if (portal.click("cal_500")) { //кнопка калибровки 50%
cal_500 = analogRead(Pin_36);
f500 = 1;
}
if (portal.click("cal_1000")) { //кнопка калибровки 100%
cal_1000 = analogRead(Pin_36);
f1000 = 1;
}
}
Перед началом калибровки В процессе калибровки По нажатию кнопки "Сохранить данные калибровки"
Еще сегодня обратил внимание на баг. ONLINE_CHECK не использую при этом на странице внизу надпись "Device offline" хотя ESP на связи и отвечает
Возможно jquery не очень совместим с костылями в коде.
внизу надпись "Device offline"
Если надпись там постоянно - Ctrl+F5. Если иногда появляется - в текущей версии браузер проверяет, долетают ли до есп апдейты. Если за секунду апдейт не доходит - всплывает баннер оффлайн
Надпись постоянно и Ctrl+F5 не помогает
А какой браузер? Потому что этот баннер должен быть справа, и текст ориентирован вертикально :)
Opera
хз, поставил оперу - всё ок
А тема с LittleFS берется?
Нет, со скетча. Файл обновлялся после перехода на 3.6?
Да, обновлял, но сейчас еще раз проверю
@GyverLibs есть предложение добавить возможность вносить свой код в раздел head веб-страницы. например, чтобы избавиться от увеличения на Андроиде, добавлял такие строки в builder.h:
"<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'>\n"
"<meta http-equiv='ScreenOrientation' content='autoRotate:disabled'>\n"
ух, неудобно будет) я внёс user-scalable=0
в хэд
@GyverLibs есть предложение добавить возможность вносить свой код в раздел head веб-страницы. например, чтобы избавиться от увеличения на Андроиде, добавлял такие строки в builder.h:
"<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0'>\n" "<meta http-equiv='ScreenOrientation' content='autoRotate:disabled'>\n"
Сделай свой копмонент и все
Сделай свой копмонент и все
ну это не очень круто, потому что мета находятся в BUILD BEGIN
#define GP_VERSION "3.6-b12.01"
Алекс, предложение по отслеживанию изменений.
Указывать в номере версии дату внесения изменений) если несколько получится, можно добавить _2
Пробую пример использования "блоков" для оформления - blocks2 Меняю тему на GP_LIGHT - изменений в оформлении не наблюдаю (возможно так и должно быть).
Пробую менять цвет ФОНА под заголовком в блоке. Фон меняется. GP.BLOCK_BEGIN(GP_TAB, "", "My tab txt red ", PSTR("#99cdff")); GP.LABEL("Block tab text red"); GP.BLOCK_END();
Вопрос - как поменять цвет текста в заголовке?
Никак, у стандартных компонентов настраивается только то что настраивается, если нужен глубокий кастом - можно сделать свои блоки на основе стандартных
Здравствуйте, хотелось-бы дефайновую настройку для отключения функционала ONLINE_CHECK(), т.к. периодически вылазит когда не ждешь и мешает (хотя не особо сильно)...
для отключения функционала ONLINE_CHECK()
можно установить таймаут секунды на две-три GP.setTimeout(3000)
Что-то перестал работать кастомный OTA
void customBuild(bool UpdateEnd, const String& UpdateError) {
GP.BUILD_BEGIN_FILE(600);
GP.THEME_FILE(F("GP_DARK"));
GP.NAV_TABS_LINKS("/,/ota_update", "Настройки,Обновление");
GP.BLOCK_BEGIN(GP_TAB, "100%", F("Обновление программного обеспечения"));
if (!UpdateEnd) {
GP.OTA_FIRMWARE("Обновить прошивку", PSTR("#6ecced"));
GP.OTA_FILESYSTEM("Обновить файлы", PSTR("#6ecced"));
} else if (UpdateError.length()) {
GP.LABEL(String(F("<b>Ошибка обновления:</b><br>")));
GP.BOLD(UpdateError);
GP.BUTTON_MINI_LINK(F("/update"), F("Вернуться"));
} else {
GP.LABEL(F("<b>Обновление выполнено!<br>Перезагрузка...</b>"));
GP.BUTTON_MINI_LINK(F("/"), F("К настройкам..."));
}
GP.BLOCK_END();
GP.BUILD_END();
}
В setup прописываю
portal.attachBuild(build);
portal.attach(action);
portal.uploadAuto(true); //автоматическая загрузка
portal.downloadAuto(true);
portal.enableOTA();
portal.OTA.attachUpdateBuild(customBuild);
portal.start();
обновление проходит, но страницы с сообщением о успехе нет
Есть предложение: Реализовать плашки как вот в этой библиотеке https://github.com/ayushsharma82/ESP-DASH
Т.е. некие элементы, например GP.TEMP С параметрами "id", "текст", "цвет" Который при добавлении на страницу даст готовый блок с отображением параметров и картинкой
Еще есть предложение добавить проверку имени файла бинарника файловой системы по аналогии с бинарником скетча
Также сейчас описание ошибки выводится на английском, возможно стоит дать возможность кастомизировать текст ошибок через define?
плашки как вот в этой библиотеке
Есть подобное в планах, но более гибкое
по кастомной странице ОТА не посмотрел?
Также сейчас описание ошибки выводится на английском, возможно стоит дать возможность кастомизировать текст ошибок через define?
Могу добавить и выслать файл CustomOTA.h
Оставим это Денису)
Так ничего сложного. В этом файле добавлена возможность указания : Имя бинарника файловой системы - #define GP_OTA_FS_NAME Кастомный текст ошибки имени бинарника скетча - #define GP_ERROR_OTA_FS_NAME Кастомный текст ошибки имени бинарника файловой системы - #define GP_ERROR_OTA_NAME Кастомный текст ошибки при отмене загрузки - #define GP_ERROR_OTA_ABORTED Кастомный текст ошибки типа выбранного файла - #define GP_ERROR_OTA_TYPE
У меня есть лутше идея по тексту, ща сделаю и отправлю
Изминения в CustomOTA.h
buildBlock(portal.OTA.updateEnd(), portal.OTA.error())
пастроет в build()
блок с кнопками, такой же как и на странице /ota_update
updateEnd()
закончено ли обновление (bool)
clearError()
очищает ошибки
hasError()
есть ли ошибка (bool)
getError()
возвращает код ошибки(все коды ошибок в CustomOTA.h)
getErrorString()
возвращает тест ошибки на английском
error()
возвращает тест ошибки как и getErrorString()
, но если подключить функцию в attachErrorCode(имя_функции)
то будет использовать повсюду новый текст, даже на странице /ota_update
,
например:
String getErr(uint8_t code) {
String out;
switch(code) {
case UPDATE_ERROR_OK:
out = F("Нету ошибки");
break;
default:
out = portal.OTA.getErrorString();//будет подставлять текст для других ошибок
break;
}
return out;
}
// setup portal.OTA.attachErrorCode(getErr);
[CustomOTA.zip](https://github.com/GyverLibs/GyverPortal/files/10457082/CustomOTA.zip)
вопрос, переходящий в пожелание) в примере actionForm.ino происходит запись в EEPROM. Но на каком именно этапе, и как использовать записанное не могу понять. В примере выглядит просто как использование 1 переменной, которая при перезагрузке не обнуляется. Пожелание - подробнее описать взаимодействие с EEPROM.
в примере actionForm.ino происходит запись в EEPROM
Такого примера нет в библиотеке
подробнее описать взаимодействие с EEPROM
Библиотека веб-интерфейса - не место для базовых ардуино-уроков :) см. https://alexgyver.ru/lessons/eeprom/ А также документацию к GyverPortal
Изменения в CustomOTA.h
Денис спасибо, огонь.
Делаю в build так
GP.BLOCK_BEGIN(GP_TAB, "100%", F("Обновление программного обеспечения"));
if (!portal.OTA.updateEnd()) {
GP.OTA_FIRMWARE("Обновить прошивку", PSTR("#6ecced"));
GP.OTA_FILESYSTEM("Обновить файлы", PSTR("#6ecced"));
} else if (portal.OTA.hasError()) {
GP.BOLD("Ошибка обновления:");
GP.BREAK();
GP.BOLD(portal.OTA.error());
portal.OTA.clearError();
GP.BREAK();
GP.BUTTON_MINI_LINK(F("/update"), F("Назад"));
} else {
GP.LABEL("Обновление успешно завершено!!!<br>Перезагрузка");
GP.BREAK();
GP.BUTTON_MINI_LINK(F("/update"), F("Назад"));
}
В setup
portal.attachBuild(build);
portal.attach(action);
portal.uploadAuto(true); //автоматическая загрузка
portal.downloadAuto(true);
portal.enableOTA();
portal.OTA.attachErrorCode(getErrorDescription);
portal.start();
Сэмулировал ошибку Сообщение об ошибке не появляется, т.е. hasError() не отрабатывает При корректно обновлении Во время обновления идет переадресация на страницу /GP_OTA_update По окончании обновления опять переходит на мою страницу, но сообщение об успешности также не появляется.\Всегда отображается блок по условию if (!portal.OTA.updateEnd())
Изминения в CustomOTA.h
buildBlock(portal.OTA.updateEnd(), portal.OTA.error())
пастроет вbuild()
блок с кнопками, такой же как и на странице/ota_update
updateEnd()
закончено ли обновление (bool)clearError()
очищает ошибкиhasError()
есть ли ошибка (bool)getError()
возвращает код ошибки(все коды ошибок в CustomOTA.h)getErrorString()
возвращает тест ошибки на английскомerror()
возвращает тест ошибки как иgetErrorString()
, но если подключить функцию вattachErrorCode(имя_функции)
то будет использовать повсюду новый текст, даже на странице/ota_update
, например:String getErr(uint8_t code) { String out; switch(code) { case UPDATE_ERROR_OK: out = F("Нету ошибки"); break; default: out = portal.OTA.getErrorString();//будет подставлять текст для других ошибок break; } return out; } // setup portal.OTA.attachErrorCode(getErr);
updateEnd()
убранbuildBlock()
(параметры больше не нужны) пастроет в build()
блок с кнопками, такой же как и на странице /ota_update
но после обновления он не будет показывать об успешном обновлении и перезагрузки
Потому что после обновления на /ota_update плата посылает страницу с результатом и сразу же перезапускается, а страница в build() не соберется
Денис, а можно пример итоговый? Кастомная страница обновления (чтобы можно было вывести ошибки и успех)
@GyverLibs Нужно такое?)
@DenysChuhlib, собственно перепробовал возможные варианты: Везде использую свой текст ошибок
Использование штатной страницы /ota_update
Использование кастомного build страницы обновления по адресу /ota_update Строю страницу абсолютно идентично штатной странице обновления
void customBuild(bool UpdateEnd, const String& UpdateError) {
GP.BUILD_BEGIN_FILE(600);
GP.THEME_FILE(F("GP_DARK"));
GP.BLOCK_BEGIN(GP_TAB, "100%", F("Обновление программного обеспечения"));
if (!UpdateEnd) {
GP.OTA_FIRMWARE("Обновить прошивку", PSTR("#6ecced"));
GP.OTA_FILESYSTEM("Обновить файлы", PSTR("#6ecced"));
} else if (UpdateError.length()) {
GP.LABEL(String(F("<b>Ошибка обновления:</b><br>")));
GP.BOLD(UpdateError);
GP.BUTTON_MINI_LINK(F("/ota_update"), F("Назад"));
} else {
GP.LABEL(F("<b>Обновление выполнено!<br>Перезагрузка...</b>"));
GP.BUTTON_MINI_LINK(F("/"), F("К настройкам..."));
}
GP.BLOCK_END();
GP.BUILD_END();
}
Подключаю в setup()
portal.OTA.attachUpdateBuild(customBuild);
В результате:
void build() {
int i;
GP.BUILD_BEGIN_FILE(600);
GP.THEME_FILE("GP_DARK");
if (portal.uri("/update")) {
GP.BLOCK_BEGIN(GP_TAB, "100%", F("Обновление программного обеспечения"));
if (portal.OTA.getError() == 0) {
GP.OTA_FIRMWARE("Обновить прошивку", PSTR("#6ecced"), 1);
GP.OTA_FILESYSTEM("Обновить файлы", PSTR("#6ecced"), 1);
} else if (!portal.OTA.hasError()) {
GP.LABEL("Обновление успешно завершено!!!<br>Перезагрузка");
GP.BREAK();
GP.BUTTON_MINI_LINK(F("/update"), F("Назад"));
} else {
GP.BOLD("Ошибка обновления:");
GP.BREAK();
GP.BOLD(portal.OTA.error());
portal.OTA.clearError();
GP.BREAK();
GP.BUTTON_MINI_LINK(F("/update"), F("Назад"));
}
GP.BLOCK_END();
}
GP.BUILD_END();
}
В результате:
@GyverLibs Алекс есть предложение относительно alert и promt На большом экране вывод небольшого белого окна уведомления не всегда сразу бросается в глаза. Возможно имеет смысл попробовать сделать вплывающим блоком div с позицией absolute по центру окна? и с кнопками в стиле темы
Проверка связи с ESP В библиотеке в scripts.h оставлена функция вывод всплывающего окна средствами браузера. Получается дублирование И alert требующий подтверждения, и плашка в правой части экрана
И в scripts.js (при хранении в spiffs) тоже оставлено
alert и promt
Это стандартные компоненты html, я их переделывать не буду
Получается дублирование И alert требующий подтверждения, и плашка
Нет, не получается. Там условие !upd
. Алерт появляется при ошибке отправки клика, чтобы юзер сразу понял что его клик не дошёл. А плашка всплывает при ошибках апдейта, апдейт у нас процесс цикличный и это его статус
Это стандартные компоненты html, я их переделывать не буду Я говорил о добавлении новых возможностей уведомления, стандартные не обязательно трогать
Нет, не получается. Там условие
!upd
. Алерт появляется при ошибке отправке клика, чтобы юзер сразу понял что его клик не дошёл. А плашка всплывает при ошибках апдейта, апдейт у нас процесс цикличный и это его статус А интервал проверки напомни, где выставляется для каждой из проверок
На большом экране вывод небольшого белого окна уведомления не всегда сразу бросается в глаза.
Покажи свой portal, чтобы в масштабе окна браузера было видно. Там наверное панель управления Боингом целая?)
интервал проверки
GP.setTimeout(ms), умолч 1500
Покажи свой portal, чтобы в масштабе окна браузера было видно. Там наверное панель управления Боингом целая?)
Да нет))) Просто если бы это было не белое окно (особенно на темной теме) это бы смотрелось намного органичнее
GP.setTimeout(ms), умолч 1500
А на стандартной странице ota_update он же не сработает?
это бы смотрелось намного органичнее
У алерта как раз функция быть заметным)
на стандартной странице ota_update он же не сработает?
На стандартной странице ота нет ни кликов, ни апдейтов. Возможно я добавлю принудительный скрипт проверки связи если на странице нет апдейтов, пока не знаю. Пока все только жалуются что вылезает уведомление и приходится поднимать тайм-аут
v3.6
ROADMAP
curl -vF firmware=@firmware.bin http://x.x.x.х/GP_OTAupload