GyverPortal

Sergo_ST

★★★★★★✩
15 Мар 2020
1,041
866
@SoftFelix, Я уже точно не помню, проблема со стилями для "input radio"(чем и является на самом деле индикатор).
Без внесения изменений в библиотеку это никак не исправить.
Поэтому или использовать то что я выше выкладывал, или, написать свой кастомный лед.
 
  • Лойс +1
Реакции: SoftFelix

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
Приветствую, подскажите , а то слега запутался
Есть вот такой блок настроек
1742448631267.png
для сохранения изменений использую функцию clik:
C++:
if (portal.click()){
      if (portal.clickInt("dhcp", dhcp_on)) {
    EEPROM.put(1,dhcp_on);  n2=n2+1;   }
  if (portal.clickInt("ap",ap_on))  {
    EEPROM.put(2,ap_on);  n2=n2+1;  }
      if (portal.clickString("hostname2",hostname2))  {
    hostname2.toCharArray(hostname1, 16); EEPROM.put(90,hostname1);  n2=n2+1;  }
  if (portal.clickString("ssid2",ssid2))  {
    ssid2.toCharArray(ssid1, 16); EEPROM.put(150,ssid1); n2=n2+1;  }
  if (portal.clickString("pass2",pass2))  {
    pass2.toCharArray(pass1, 16); EEPROM.put(210,pass1); n2=n2+1;  }
  if (portal.clickString("ip2",ip2))  {
    ip2 = portal.getString("ip2");  IPAddress ip;  ip.fromString(ip2);  for (int i = 0; i < 4; ++i) { EEPROM.put(10+i,ip[i]); }  n2=n2+1;  }
  if (portal.clickString("mask2",mask2))  {
    IPAddress mask; mask.fromString(mask2); for (int i = 0; i < 4; ++i) { EEPROM.put(15+i,mask[i]); } n2=n2+1;  }
  if (portal.clickString("gw2",gw2))  {
    IPAddress gw; gw.fromString(gw2); for (int i = 0; i < 4; ++i) { EEPROM.put(20+i,gw[i]); }  n2=n2+1;    }
  if (portal.clickString("dns2",gw2))  {
    IPAddress dns; dns.fromString(dns2); for (int i = 0; i < 4; ++i) { EEPROM.put(25+i,dns[i]); } n2=n2+1;   }
}
Однако , как оказалось при изменении данных в полях или лоложения переключателей они применяются сразу , а не по нажатию кнопки "save" , как это поправить?
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39

@Doctor Death,
Однако...
Что вы попросили, то и происходит. После каждого ввода вы пишите в епром.
Создайте или структуру, или проще кучу временных переменных типа temp_dhcp_on, temp_ap_on,.... А потом по нажатию кнопки сохраняйте их все в епром
.onclick
{EEPROM.put(1,dhcp_on);
EEPROM.put(2,ap_on);
....}
 

Sergo_ST

★★★★★★✩
15 Мар 2020
1,041
866
@Doctor Death, В примерах к библиотеке есть пример работы с формой, GyverPortal - > demos -> actionForm.
После нажатия на кнопку submit будет вызван action form, в нём копируете все данные из полей к себе в переменные и сохраняете в память.
 
  • Лойс +1
Реакции: Doctor Death

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
Подскажите, никак не пойму в чем проблема с функцией log.
в примере возврат данных в функцию ui.log.println(random(100)); выполняется в loop, мне надо выполнять возврат по клику в action , но возврата не происходит.
C++:
GP.NAV_BLOCK_BEGIN();
GP_MAKE_BLOCK_TAB("Ping", GP.LABEL("");
GP_MAKE_BOX( GP.TEXT("ping", "Destination IP", lpip););
GP.AREA_LOG(7);     );
GP.NAV_BLOCK_END();
void action() {
if (portal.click()){
if (portal.click("ping"))  {
    HL(portal.getString("ping"));
    portal.log.print("Ping: "); portal.log.println(portal.getString("ping"));
    portal.log.println(portal.getString("ping_ret")); 
    Serial.print("Ping: ");  Serial.println(portal.getString("ping"));    Serial.println(ping_ret);
}
 
Изменено:

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0

@Doctor Death,
По всей видимости имелось ввиду .getString(ping)?
нет ,в функции HL(portal.getString("ping")); все в норме, после нее возвращается ping_ret и в Serial.print все выводиться как надо
тут даже не печатает банальное portal.log.print("Ping: ");
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39
А что за функция такая HL?
А вы страницу обновляете после записи в log?
 
Изменено:

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
C++:
String HL(String lpip) {
ping_ret = "";
IPAddress ping_ip;
ping_ip.fromString(lpip);
bool ret = Ping.ping(ping_ip);
for (int i = 0; i < 3; ++i) {
if(ret == 1){
     float avg_time_ms = Ping.averageTime();
     ping_ret  = ping_ret + lpip + " " + avg_time_ms + " mS";
     } else {
     ping_ret = ping_ret + "Request timed out.";
}
ping_ret = ping_ret + " /n";
}
return ping_ret;                   
    }
нет не обновляю, но эт ои ненужно, насколько я понимаю , именно этим лог и отличается
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39
именно этим лог и отличается
вообще не факт
подключитесь буком к плате, откройте хром со страницей и F12, на вкладке Network посмотрите идут ли запросы от бука к плате типа
/GP_update?GP_log, на что плата должна отвечать 1.
Если нет, то попробуйте вставить
C++:
      if (portal.update("GP_log")) {
        portal.answer(1);
      }
тут не понятно
C++:
HL(portal.getString("ping"));
C++:
String HL(String lpip) {
return ping_ret;                  
    }
ping_ret кто получает?
 
Изменено:

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
log.print его получает , и setial да , в serial все отдается нормально, в log.print нет
сейчас на это даже обращать внимание не стоит, так как не печатается даже portal.log.print("Ping: "); простейшей
1742725963519.png
1742726006575.png
а вот если portal.log.print("Ping: "); вставить в блок loop()
то он начинает печатать , в бесконечном цикле конечно , но в такомраскладе печатает, а из action() нет

1742726180899.png
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39
Почему на последнем скрине только Ping: ? Одна строчка была только в loop?
C++:
portal.log.println(portal.getString("ping_ret"));
мне так кажется, что должно быть всё таки
C++:
portal.log.println(ping_ret);
и очень для меня странный кодинг вызова String с возвратом в глобальную переменную. Тут или вы гуру со своими тараканами, или идёте не потому пути.
 

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
почему на последнем скрине только Ping: ? Одна строчка была только в loop?
[да именно так я добавил для теста только вывод непосредственно текста
C++:
void loop(){
    snmp.loop();
    portal.tick();
    portal.log.print("Ping: ");
  }
и очень для меня странный кодинг вызова String с возвратом в глобальную переменную. Тут или вы гуру со своими тараканами, или идёте не потому пути.
вовсе не гуру

Давайте сейчас остановимся ! Вы привязались к вызову функции HL и ее выводе. Давайте ребутнемся :) чтобы не путаться - нет этой функции и нет переменной , проблема более глобальная !
Вот это, тупо не работает:

C++:
GP.NAV_BLOCK_BEGIN();
GP_MAKE_BLOCK_TAB("Ping", GP.LABEL("");
GP_MAKE_BOX( GP.TEXT("ping", "Destination IP", lpip););
GP.AREA_LOG(7);     );
GP.NAV_BLOCK_END();

void action() {
  if (portal.update()) {
if (portal.click("ping"))  {
       portal.log.print("Ping: "); portal.log.println(portal.getString("ping"));
    Serial.print("Ping: ");  Serial.println(portal.getString("ping")); 
  }
  }}
не выводи абсолютно ничего в log ,при вводе в форму, при этом в serial все выводится
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39
@Doctor Death,
А если вывести?

C++:
void loop(){

    snmp.loop();

    portal.tick();

    HL(portal.getString("ping"));

    portal.log.print("Ping: "); portal.log.println(portal.getString("ping"));

    portal.log.println(portal.getString("ping_ret"));

}
и еще интересно
Serial.println(portal.log.length());

ЗЫ
И кстати, обратите внимание на ваш лог в консоли
_handleRequest(): request handler not found
что говорит о том, что вы не обрабатываете запрос к серверу
 
Изменено:

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
Serial.println(portal.log.length());
10
20
30
30
30
30
30
вот что возвращает , откуда это лезит непонятно
А если вывести?
так не получится , так как вызов функции просто не даст нормально обращаться к web ping даже с параметрами делает сильную задержку , а без параметров еще больше, а в цикле вообще вешает
 

Doctor Death

✩✩✩✩✩✩✩
16 Мар 2025
16
0
я локализовал проблему, но пока не могу понять как это обойти
Делов том, что в ядре модуля GyverPortal что-то изменилось с v3.4 , а эту функцию я разрабатывал еще при ней. У меня был написан проект еще в 2022г и в нем все работало. И сейчас если залить скомпилированный бинарник , этот проект работает.
Источник проблемы в следующем , библиотека ping вносит большую задержку в работу , и в этот момент что-то останавливается в библиотеке GyverPortal на новых версиях , по этому возврат в блок log не приходит. Такого в v3.4 не происходило. Так что это не связанно с функцией ataction - в ней все по-прежнему работает и лог возвращается, если отключить обращение к функции ping.
Возможно это связанно с тем что в GyverPortal встроили мониторинг, так как когда вызывается функция ping , вылезает алеркт "esp offline"
 
Изменено:

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39
@Doctor Death,
Ну тогда всё проще... esp offline вылазит когда сервер не ответил в течении 2 секунд. Не выполняйте тяжёлый код в Action(). Action это по сути блок ответов сервера клиенту, он должен крутиться постоянно без сильных задержек. HL() выполняется долго, и тут боюсь без многозадачности вам не обойтись. А поскольку её в ардуино нет), то как алекс писал попробуйте простj yield(). Я не когда не пользовался, поскольку когда потребовалась нужда в многозадачности я уже под freertos перелез, что и всем советую. По идее должно получится что-то типа
C++:
bool give_me_ip = false;
String ping_ret = "";

void action() {
    if (portal.click()){
        if (portal.click("ping") && !give_me_ip)  {
            if(ping_ret != ""){
                portal.log.print("Ping: "); portal.log.println(portal.getString("ping"));
                portal.log.println(portal.getString("ping_ret"));
                Serial.print("Ping: ");  Serial.println(portal.getString("ping"));    Serial.println(ping_ret);
                ping_ret = "";
            } else {
                give_me_ip = true;
            }
        }
    }
}



void yield() {
    if(give_me_ip){
        ping_ret = "";
        IPAddress ping_ip;
        ping_ip.fromString(lpip);
        bool ret = Ping.ping(ping_ip);
        for (int i = 0; i < 3; ++i) {
            if(ret == 1){
                 float avg_time_ms = Ping.averageTime();
                 ping_ret  = ping_ret + lpip + " " + avg_time_ms + " mS";
            } else {
                 ping_ret = ping_ret + "Request timed out.";
            }
            ping_ret = ping_ret + " /n";
        }
        give_me_ip = false;                   
    }
}
если по коду у вас нет delay(), в теле loop() обязательно вставьте delay(xxx), во время остановки будет выполняться yield()

можно по другому сделать, что бы не вылазило, но не айс) в файле scripts.js первая строчка var _tout = 2000; это период опроса в 2000мс, замерьте сколько выполняется ping и и пропишите чуть больше


насчет _handleRequest(): request handler not found , я совсем забыл, если только это запросы которые нужны, то там куча говна летит от всяких программ, посмотреть

C++:
String old_uri="";
loop(){
String new_uri=portal.uri();
    if(new_uri != old_uri){ // конструкция что бы не спамило консоль
      Serial.print("Uri=");
      Serial.print(portal.uri());
      old_uri = new_uri ;
    }
}
а там смотрите что не обрабатываете, а что обрабатываете
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
117
39

@Doctor Death,
Или скрипты не подгружаются вообще, или они закешировались, на телефоне хз как, на компе ctrl+F5 в браузере
Или не тот скрипт, мб в папке data, если фс используете

вспомнил что была такая проблема, парила сильно, в предыдущих ревизиях в скрипте было
if (!this.status && !upd) alert('Offline!');
в последней
if (!this.status) alert('Offline!');
у меня первый вариант
 
Изменено: