GyverPortal

4LDIY

✩✩✩✩✩✩✩
17 Июн 2022
11
2
@Олег Поляков, Ладно, спасибо за помощь, я понял что нифига не понял. Буду ждать обновление gyverportal, может что для меня нужное появится.
 

aidar_i

✩✩✩✩✩✩✩
1 Май 2021
64
8
@Олег Поляков, Ладно, спасибо за помощь, я понял что нифига не понял. Буду ждать обновление gyverportal, может что для меня нужное появится.
Вставьте в GiverPortal.h
C++:
  void UPDATE(const char* value) {
        *_gp_sptr += F("<meta http-equiv=\"Refresh" );
        *_gp_sptr += "\" content=\"";
        *_gp_sptr += value;
        *_gp_sptr += F("\">\n");
    }
В скетче в buld()
if(en_upd) add.Update(Период в секундах);
Портал запускайте не в сетап, а в лооп так:
bool fl_b= 1; в декларе
в лооп
C++:
  if (en_start) {
    if (fl_b) {
      fl_b = 0;
      portal.attachBuild(build);
      portal.start();
    }
  }
  else fl_b = 1;
  portal.tick();
в момент включения en_upd подайте отрицательный импульс на en_start длительностью 1 цикл , чтобы портал перезагрузился, чтобы перестроить страницу.
Используя конструкцию в лооп я даже на ходу меняю Тему черную на светлую и обратно через кнопку субмит.
в буилд() добавил:
C++:
   if(theme_dark) add.THEME(GP_DARK);
    else add.THEME(GP_LIGHT);
Сюда theme_dark подаю 1 или 0, с кнопки субмит.
C++:
  if (portal.form())
    {
            if (portal.form("/update"))
        {
            if (theme_dark == LOW) theme_dark = HIGH;
            else theme_dark = LOW;
        }
    }
Вот так можно ещё сделать портал
Снимок_2022_06_23_21_23_54_590.png
 
Изменено:

4LDIY

✩✩✩✩✩✩✩
17 Июн 2022
11
2
@aidar_i, спасибо

А на есп32 пробовал кто AJAX значения менять на странице? У меня страница не может получить значение net::ERR_EMPTY_RESPONSE, хотя на 8266 работало. (я в курсе что Гувер на гитхабе написал о есп32)

Сам отвечу. На есп32 не возвращает значение server.argName(0) в portal.h.
C++:
    // вернёт true, если был клик по указанному элементу (кнопка, чекбокс, свитч, слайдер, селектор)
    bool click(const char* name) {
        return _clickF ? server.argName(0).equals(name) : 0;
    }
Библу переделал под себя, у меня теперь работает.
Насчет перезагрузки страницы с сервера
C++:
void AJAX_UPDATE(const char* list, int prd = 1000) { // Код страницы,  отправка запросов
        *_gp_sptr += F("<script>setInterval(function(){\n");
        *_gp_sptr += "var elms=[";
        char buf[strlen(list) + 1];
        strcpy(buf, list);
        char* str = buf;
        splitList(NULL);
        while ((str = splitList(buf)) != NULL) {
            *_gp_sptr += "'";
            if (str[0] == ' ') *_gp_sptr += (str + 1);
            else *_gp_sptr += str;
            *_gp_sptr += "',";
        }
        *_gp_sptr += F("];\n"
        "elms.forEach(function(elm){\n"
        "var xhttp=new XMLHttpRequest();\n"
        "xhttp.onreadystatechange=function(){\n"
        "if(this.readyState==4&&this.status==200){\n"
        "var resp=this.responseText;\n"
        "var item=document.getElementById(elm);\n"
        "if(elm == \"ResetWeb\" && resp == 1){location.reload();}\n"
        "else{"
        "if (elm == \"ResetWeb\" && resp == 0){}else{"
        "if(item.type==\"checkbox\"||item.type==\"radio\")item.checked=Number(resp);\n"
        "else if(item.type==undefined)item.innerHTML=resp;\n"
        "else item.value=resp;}\n"
        "}}};xhttp.open(\"GET\",\"GP_update\"+elm,true);xhttp.send();});},");
        *_gp_sptr += prd;
        *_gp_sptr += F(");</script>\n");
    }
было добавлено значение ResetWeb и , для себя, убрал вопросик после GP_update.
Теперь в конструкторе это выглядит так
C++:
add.AJAX_UPDATE(PSTR("var1, var2, var3, var4, var5, var6, ResetWeb"),1000);
На запрос обновиться компоненту ResetWeb отвечаем либо 0 либо 1, 0 - ни чего не делаем, 1 перезагрузить страницу. Выставляем флаг, о том что там нужно перезагрузиться, и ждем запроса от страницы
C++:
if (portal.update()){
    if (portal.update("ResetWeb")){
        if(flag==true){                     
          portal.answer(String(1)); // перезагрузит страницу
          flag = false;             // сброс флага
         } else{
          portal.answer(String(0)); //не перезагружать страницу
        }
    }
    if (portal.update("var1")){}
}
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
C++:
    void BLOCK_BEGIN(const char* name="") {
        *_gp_sptr += F("<div class=\"block\" id=\"blockBack\">\n");
        if (name != "") {
            *_gp_sptr += F("<div class=\"blockHeader\">");
            *_gp_sptr += name;
            *_gp_sptr += F("</div>\n");
        }
    }
этот код приводит к крашу ESP32.
если убрать
//if (name != "") {
//}
то все запускается)
 

sermanger

✩✩✩✩✩✩✩
31 Июл 2022
3
0
Подскажите, в чём проблема? Делал всё по инструкциям, но выдаётся ошибка:
'struct GPtime' has no member named 'encode'

C++:
#include <GyverPortal.h>

GyverPortal portal;

// объявил переменную
GPtime valTime = {
        (uint16_t)21, (uint8_t)28,(uint8_t)0
      };



void action() {
  // одна из форм была submit
  if (portal.form()) {
    // проверяем, была ли это форма "/save"
    if (portal.form("/save")) {
      // забираем значения и обновляем переменные
      brDisp = portal.getInt("br");
      valTime = portal.getTime("time");

      // выводим для отладки
      Serial.print(brDisp);
      Serial.print(',');
      Serial.print(valTime.encode());   // - тут выдаёт ошибку
    }
  }
}
 

Adresat

✩✩✩✩✩✩✩
15 Июн 2022
2
0
А есть возможность сделать фавикон (иконка на закладку)

2022-07-31_181921.png
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Adresat, почему бы и нет) картинку можно закодировать, пример я указывал) останется только вставить в нужном месте код)
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@Adresat, в html делается так
HTML:
<head>
 <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
</head>
пример картинки у меня тут) https://community.alexgyver.ru/threads/gyverportal.6632/page-2#post-123022
вместо PAGE_BEGIN()
запиши
C++:
 *_GP += F("<!DOCTYPE HTML><html><head>\n"
        "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n"
        "<meta charset=\"utf-8\"></head><body>\n");
останется только ссылку между тегами head
 
  • Лойс +1
Реакции: Adresat

4LDIY

✩✩✩✩✩✩✩
17 Июн 2022
11
2
Комунити, а если это прочитает Гувер, то вообще отлично, HTML запросы сильно нагружают МК, если МК используется просто для того чтобы посмотреть температуру, помигать гирляндой и т.п. не завязанные на приближении к жесткому таймингу, то это норм. Если использовать 2 оси шаговика с точным позиционированием по таймингу и синхронности, будут проявляться лаги заметные глазу. В последнее время мне пришлось очень серьезно подойти к веб управлению, без Веб Сокета тут ни куда.
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Недавно приобрёл пару ESP32, сейчас планирую заняться прошивкой сего девайса. Начал изучать материал и наткнулся на одну статью, в которой описано как можно на разных ядрах запускать разные задачи. То есть можно сделать как бы 2 независимых loop(). Планирую попробовать, одно ядро кинуть на обработку http (вернее хочу попробовать https), второе на работу с железками, обмен данными между 2мя процессами хочу организовать через глобальные переменные. Даже не знаю реально это или нет, но попробовать очень хочется, жду не дождусь отпуска. Может есть у кого опыт в этом деле? Может зря я хочу пойти по этому пути?
 

ALEX8989YT

✩✩✩✩✩✩✩
4 Авг 2022
6
0
Люди, как обновлять страницу при нажатии на кнопку?
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@ALEX8989YT, поймать нажатие кнопки и выполнить код, по обновлению страницы. Код загугли, обновление страницы по нажатию кнопки в html.
 

ALEX8989YT

✩✩✩✩✩✩✩
4 Авг 2022
6
0
@ASM, сколько кодов пробовал - не работает, поэтому обратился сюда.
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@ALEX8989YT, эта тема "мертвая", движок больше не поддерживается. Только кто-то сообщения подтирает, вместо помощи) Попробуй без движка сначала отладить, на простой странице. Если заработает, пытаться внедрять в проект)
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Я правильно понимаю что речь идёт про реальную кнопку, а на кнопку в web интерфейсе?
 

ALEX8989YT

✩✩✩✩✩✩✩
4 Авг 2022
6
0
@DAK, наоборот, по кнопке в web интерфейсе

@ASM, я понимаю, что тему мёртвая, но можете мне помочь? Я обратился сюда т.к не могу найти информацию в интернете.
 

ALEX8989YT

✩✩✩✩✩✩✩
4 Авг 2022
6
0
@ASM, вы не поняли, у меня уже есть кнопка button_mini и мне к ней нужно прикрутить обновление
C++:
if ( portal.click("nextpage") ) {
  portal.attachBuild(build_i);
  //сдесь обновление страницы
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@ALEX8989YT,
Так прочитай описание конструктора, надо сделать опрос нажатия кнопки)
if (portal.form("/update"))
@ALEX8989YT, формы лучше работают)
 

ALEX8989YT

✩✩✩✩✩✩✩
4 Авг 2022
6
0
@ASM, добавить form и сделать примерно это?
C++:
if (portal.form("/update")) {
  GP.PAGE_BEGIN();
  GP.PAGE_BLOCK_BEGIN();
  *_GP += F("<input type='button' onclick='window.location.reload()'  value ='обновить' />");
  GP.PAGE_BLOCK_END();
  GP.PAGE_END();
  //примерно так?
}
 

ASM

★★★★★✩✩
26 Окт 2018
1,599
311
@ALEX8989YT, как-то всё странно смотрится, типа того, экспериментируй) я сам так делаю, но дал бы главный совет) завязывай с движком, если что-то делаешь своё) сам планирую избавляться от него, когда отлажу работу кода, проблем много с ним) пиши страницы сам, потом дизайн сделаешь)