GyverPortal

Старик Похабыч

★★★★★★★
14 Авг 2019
4,241
1,297
Москва
Можно сделать структуру с нужной "разбитовкой" и длиной 2 байта. Будет пол R 5 бит, G 6 бит и B 5 бит. ну или как там. А далее преобразование типов или union
 

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
@Старик Похабыч, как всё сложно)
Есть идея, как сделать проще)
C++:
uint16_t clock_col  = display->color565(color);
C++:
color  = (0, 255, 255);
Какой тип будет у color?)
Пользователь сам впишет в текстовое поле код цвета через запятую, скопировав с виджета.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@ASM, о какой либе идёт речь? Брось либо файл, либо ссылку. Или ты Взялся делать проект по управлению панелью светодиодов?
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@juri4,чтобы создать страницу, не обязательно на неё делать ссылку.
C++:
....
if (portal.uri()=="/secret") {
    GP.LABEL("Cтраница");
}
...
если в адресной строке ввести http://ip/secret, у Вас будет просто надпись - страница.... а как между страницами ходить, это уже совсем другая история

@juri4,Посмотри примеры, например https://github.com/GyverLibs/GyverP...s/demos/multiPageButtons/multiPageButtons.ino
 
  • Лойс +1
Реакции: juri4

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
@DAK,
Увидел - Спасибо.

Еще вопросик - как выровнять

C++:
        GP_MAKE_BLOCK_TAB(
            "Первый",
            GP_MAKE_BOX(GP.LABEL("Темп-ра начала    "); GP.NUMBER_F("RSartT", "number", StartTemp););
            GP_MAKE_BOX(GP.LABEL("Темп-ра завершения"); GP.NUMBER_F("RStopT", "number", StopTemp);););
 

Вложения

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
@aidar_i, Пробелами не получается

C++:
inline void Builder::NUMBER_F(const <error-type> &name, const <error-type> &place, float value = <error>, <error-type> dec = <error>, const <error-type> &width = <error>, bool dis = false)
В описании есть что-то про ширину , а как пользоваться не пойму.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
если не можешь понять, открывай builder.h и смотри:
C++:
if (width.length()) {
            *_gp_page += F("' style='width:");
            *_gp_page += width;
        }
Значит, что если строка будет содержать значение (допустим "50%"), то это кнопка будет 50 процентов ширины, наверное так же и в пикселях можно (" 50 px"), точно не гарантирую, тут лучше погуглить css width
 
  • Лойс +1
Реакции: juri4

ASM

★★★★★✩✩
26 Окт 2018
1,558
303
Еще вопросик - как выровнять
можно задать ширину поля ввода.
C++:
GP.NUMBER_F(имя, подсказка, число, знаков, ширина);         // + ширина строкой "100px", "25%" и так далее (умолч 90%)
можно использовать макросы.
C++:
    GP_MAKE_BLOCK_THIN_TAB(
      "Подстройка",
      GP_MAKE_BOX(GP.LABEL("Усиление");
                  GP_MAKE_BOX(GP_RIGHT, "200px",
                              GP.SLIDER("bright_constant", bright_constant, 0, 1000, 100);
                             );
                 );
      GP_MAKE_BOX(GP.LABEL("Фильтр");
                 GP_MAKE_BOX(GP_RIGHT, "200px",
                             GP.SLIDER("coef", coef, 0, 1, 0.1);
                             );
                 );
    );
подс.JPG
 
Изменено:
  • Лойс +1
Реакции: juri4 и DAK

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@juri4, @juri4,
я делаю так:
C++:
GP_MAKE_BLOCK_TAB(getNameRoom,
    GP_MAKE_BOX(GP_EDGES,
                GP.LABEL(CoreGR.getNameRelay(h)
    );
    GP_MAKE_BOX(GP_RIGHT,
                GP.LED_RED("LedRedRelay@"+String(h),!CoreGR.getStateRelay(h)
    );
);
UPD:
Вот так лучше попробуй, первый код немного не так делал, здесь должно расстягиваться как тебе надо
 
Изменено:
  • Лойс +1
Реакции: juri4

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
на телефонах.
Mi браузер - погано выглядит
Yandex вроде норм.
В гугле также как и в yandex

но всех их обьединяют жуткие тормоза, когда подключается браузер с компьютера.
на компьютере все норм.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Какие ещё тормоза? Какой МК? Как запускаете? Что в цикле луп? Почему надо гадать всё время, киньте код лупа
 

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
@DAK,
C++:
void loop()
{
    portal.tick();
    Serial.println(temptest);
}
можно сказать пуст
проц esp32
грешу, что не правильно обновление сделал.

C++:
    GP.JQ_SUPPORT();
    GP.JQ_UPDATE_BEGIN(1000);
        rand1 = random(0, 100);
    rand2 = random(0, 100);
temptest = rand1 + rand2 / 100
    GP_MAKE_BLOCK_TAB(
        "Температура",               
        GP_MAKE_BOX(GP.LABEL("верх"); GP.LABEL_BLOCK(temptest + (String(" °C")), "lbb"););
        GP_MAKE_BOX(GP.LABEL("низ"); GP.LABEL_BLOCK(temptest + (String(" °C")), "lbb");););
    GP.BUILD_END();

    GP.JQ_UPDATE_END();
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
C++:
GP.JQ_SUPPORT();
GP.JQ_UPDATE_BEGIN(1000);
  rand1 = random(0, 100);
  rand2 = random(0, 100);
  temptest = rand1 + rand2 / 100
  Serial.println(temptest);
  GP_MAKE_BLOCK_TAB("Температура",               
        GP_MAKE_BOX(GP.LABEL("верх"); GP.LABEL_BLOCK(temptest + (String(" °C")), "lbb"););
        GP_MAKE_BOX(GP.LABEL("низ"); GP.LABEL_BLOCK(temptest + (String(" °C")), "lbb"););
  );
GP.JQ_UPDATE_END();   
GP.BUILD_END();
И сели ты думаешь что Serial.println в loop не тормозит, то извини. Выкини его из лупа и больше никогда так не делай, только если через миллис вызывать его раз в секунду
 
  • Лойс +1
Реакции: juri4

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
-убрал, эффект может и есть, но на общем фоне его не видно.
но все равно прму к сведению.
Скорее всего какая-то не совместимость с телефонами.

Собрал по квартире 4 разных телефона
все тупят +- одинаково
На компьютере все работает - нормально.
на всякий случай рандом вынес в отдельную функцию с опросом каждую секунду - не помогло
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Раз в секунду прогружается весь конструктор.... смотри на консруктор, может там ещё что нить тормозит, ты же не весь код конструктора отдал. Вынеси скрипты и css в файлы, они закешется 1 раз и не будут каждый раз грузится, страница станет гораздо быстрее работать. Мне надо видеть весь код конструктора, чтобы понять как и что у тебя тормозит.... Если у тебя три четыре телефона 4 раза дёргают портал, то это доп нагрузка на контроллер. Если ещё не перешёл на файла, то очень рекомендую.
 
  • Лойс +1
Реакции: juri4

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
@DAK, Не подскажите где про это можно почитать.
Ни разу не делал, даже не представляю с чего начать.

Продолжил эксперименты с браузерами на телефонах.
Лучше всего работает на FF , а на Opera вообше не обновляется - обновляет только при обновлении страницы.
В настройках браузеров не лазил .

И так по пути - совсем не критично, но увидел.
GP.NUMBER_F
Во всех браузерах кроме FF ставит запятую.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
C++:
#define AP_SSID ""
#define AP_PASS ""

#include <LittleFS.h>

#include <GyverPortal.h>
GyverPortal portal(&LittleFS);

// конструктор страницы
void build() {
//для подключения скриптов из файла /gp_data/scripts.js
  GP.BUILD_BEGIN_FILE();
//для подключения файла css и js в папке с проектом надо создать папку data, в ней надо создать gp_data и туда положить файл GP_DARK.css
// с помощью инструментов залить файлы на ESP32
  GP.THEME_FILE("GP_DARK")
  GP.JQ_SUPPORT_FILE(); // Загрузка jquery /gp_data/jquery.js (он по факту 1 раз грузанёт и закешет, но его тоже надо положить в папку)
//тут Ваш код конструктора

  GP.BUILD_END();
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(AP_SSID, AP_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(WiFi.localIP());

  if (!LittleFS.begin()) Serial.println("FS Error");

  portal.attachBuild(build);
  portal.attach(action);
  portal.start();
  portal.uploadAuto(true); //включите автодовнлоад
}

void action() {
    // код обработчика
}

void loop() {
  portal.tick();
}
Нужные файла вы найдёте в папке в библиотеки (GyverPortal-main\data\gp_data)
Очень много примеров в библиотеки, так же есть страница https://github.com/GyverLibs/GyverPortal/wiki
Но я точно не могу ничего гарантировать, так как не вижу всего кода, возможно собака зарыта в другом месте. У меня не лёгкий проект и тоже есть jquery обновление, работает на ура, даже не подлагивает, что с телефона, что с компа
 
Изменено:

juri4

✩✩✩✩✩✩✩
11 Сен 2022
15
0
@DAK,
Огромное спасибо! буду делать.

И еще маленький вопрос как отключить вывод в сериал от парсинга идет сплошным потоком
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@juri4, не понял, давайте так, кусок кода и где он находится... гадо сразу по делу, гадать сложно
 

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
Подскажите как обновить страницу.
В build есть надобность выводить определенный кусок кода
SWITCH(a){case 0:....} , я программно меняю а, и соответственно моя страница должна включать один из блоков. Как сделать автоматическое обновление при смене переменной? Обновляется только в ручную.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@RomaT, Думаю я понял о чём вы
GP.RELOAD(имя); // скрытый блок перезагрузки страницы. Добавь его имя в UPDATE и ответь 1 на update, чтобы обновить страницу
то есть вам надо сделать где то вначале (после begin и theme) добавьте 2 строчки

C++:
GP.UPDATE("reboot",3000); // так раз в 3 секунды броузер будет спрашивать у МК не надо ли перезагрузить страницу
GP.RELOAD("reboot");

//в action надо ловить в виде

if (portal.update()){
     if (portal.update("reboot")){
         portal.answer(1); //flag_reboot вам надо делать программно, когда требуется обновление
         flag_reboot=false; //сбрасываем флаг после того, как сообщим браузеру о необходимости обновить страницу
     }
}
 
Изменено:

RomaT

★✩✩✩✩✩✩
5 Ноя 2019
104
38
@DAK, не помогает, видимо build один раз инициализирует страницу по тем данным которые есть на тот момент
хотя если руками обновить, то build перестраивается...
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Я лично использовал данный компонент, всё там работает. Код в студию.
C++:
//В глабальных переменных
bool flag_reboot=false;

//В конструкторе, в начале
GP.BUILD_BEGIN();
GP.THEME(GP_DARK);
GP.UPDATE("reboot",3000); // так раз в 3 секунды броузер будет спрашивать у МК не надо ли перезагрузить страницу
GP.RELOAD("reboot");


//в action надо ловить в виде

if (portal.update()){
     if (portal.update("reboot")){
         Serial.println(flag_reboot); //Чисто для отладки, если всё правильно, то раз в 3 секунды в сериал будет сыпаться либо 0, либо 1
         portal.answer(flag_reboot); //flag_reboot вам надо делать программно, когда требуется обновление
         flag_reboot=false; //сбрасываем флаг после того, как сообщим браузеру о необходимости обновить страницу
     }
}
 
Изменено:
  • Лойс +1
Реакции: RomaT