Przycisk/Button z dodatkowymi zdarzeniami (wielokliki, przytrzymanie i inne)

User avatar
klew
Posts: 10203
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Thu Nov 02, 2023 10:15 am Potrzebuję użyć dla jednego przycisku ON_HOLD aby zareagował na przytrzymanie 2s oraz 5s i wykonał inną akcje. Chyba nie ma takiej możliwości czy mógłbym się spodziewać takiej możliwości? :)
A co konkretnie chcesz zrobić?

Ja bym takie coś zaimplementował w ten sposób, że mam klasę przyjmującą "on hold" i "on release".
Na przycisku ustawiam on_hold na 1s oraz repeat on hold every 1s.
W klasie bym zliczał otrzymane "on holdy" i przy drugim, odpalałbym jakąś akcję, a przy piątym odpalałbym inną akcję.
"on release" by resetowało licznik.
krycha88
Posts: 5420
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Thu Nov 02, 2023 10:51 am A co konkretnie chcesz zrobić?

Ja bym takie coś zaimplementował w ten sposób, że mam klasę przyjmującą "on hold" i "on release".
Na przycisku ustawiam on_hold na 1s oraz repeat on hold every 1s.
W klasie bym zliczał otrzymane "on holdy" i przy drugim, odpalałbym jakąś akcję, a przy piątym odpalałbym inną akcję.
"on release" by resetowało licznik.
Chciałbym zrealizować scenariusz przytrzymanie 2s przełącza ekran oleda, przytrzymanie 5s wyłącza termostat. Spróbuje to zrobić tak jak zasugerowałeś :)
https://gui-generic-builder.supla.io/
krycha88
Posts: 5420
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Thu Nov 02, 2023 10:51 am Ja bym takie coś zaimplementował w ten sposób, że mam klasę przyjmującą "on hold" i "on release".
Na przycisku ustawiam on_hold na 1s oraz repeat on hold every 1s.
W klasie bym zliczał otrzymane "on holdy" i przy drugim, odpalałbym jakąś akcję, a przy piątym odpalałbym inną akcję.
"on release" by resetowało licznik.
Chciałem to zrobić za pomocą:

Code: Select all

            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_CLICK_1);
            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_HOLD);
            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_RELEASE);
   	    button->repeatOnHoldEvery(250);
Ale jeżeli dodaję w takiej konfiguracji ON_RELEASE to nie wykonuje mi się już ON_CLICK_1. Mógłbym tutaj napisać swoje ON_RELEASE ale czy to na pewno tak ma działać?
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 10203
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Nov 08, 2023 11:21 am
klew wrote: Thu Nov 02, 2023 10:51 am Ja bym takie coś zaimplementował w ten sposób, że mam klasę przyjmującą "on hold" i "on release".
Na przycisku ustawiam on_hold na 1s oraz repeat on hold every 1s.
W klasie bym zliczał otrzymane "on holdy" i przy drugim, odpalałbym jakąś akcję, a przy piątym odpalałbym inną akcję.
"on release" by resetowało licznik.
Chciałem to zrobić za pomocą:

Code: Select all

            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_CLICK_1);
            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_HOLD);
            button->addAction(Supla::Action::TOGGLE_MANUAL_WEEKLY_SCHEDULE_MODES, client, Supla::Event::ON_RELEASE);
   	    button->repeatOnHoldEvery(250);
Ale jeżeli dodaję w takiej konfiguracji ON_RELEASE to nie wykonuje mi się już ON_CLICK_1. Mógłbym tutaj napisać swoje ON_RELEASE ale czy to na pewno tak ma działać?
Możliwe, że coś tam się gryzie z podłączonym wyzwalaczem akcji.

Czym jest klasa "client"? Bo to co pisałem wcześniej wymaga dodania nowej klasy, która będzie łapać akcje odpalane przez przycisk i na podstawie tej swojej wewnętrznej logiki, będzie odapalać inne akcje na odpowiednich klasach (ekran, hvac, etc)
krycha88
Posts: 5420
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Wed Nov 08, 2023 11:25 am Możliwe, że coś tam się gryzie z podłączonym wyzwalaczem akcji.

Czym jest klasa "client"? Bo to co pisałem wcześniej wymaga dodania nowej klasy, która będzie łapać akcje odpalane przez przycisk i na podstawie tej swojej wewnętrznej logiki, będzie odapalać inne akcje na odpowiednich klasach (ekran, hvac, etc)
Jest to HvacBase ale faktycznie mam dodane AT ale nie konfigurowałem ich po stronie clouda.
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 10203
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Nov 08, 2023 11:30 am
klew wrote: Wed Nov 08, 2023 11:25 am Możliwe, że coś tam się gryzie z podłączonym wyzwalaczem akcji.

Czym jest klasa "client"? Bo to co pisałem wcześniej wymaga dodania nowej klasy, która będzie łapać akcje odpalane przez przycisk i na podstawie tej swojej wewnętrznej logiki, będzie odapalać inne akcje na odpowiednich klasach (ekran, hvac, etc)
Jest to HvacBase ale faktycznie mam dodane AT ale nie konfigurowałem ich po stronie clouda.
Jeśli "client" to hvac base, to to nie będzie dobrze działało.

AT robi rekonfigurację przycisków "on_press/release" i "on_click_1", zależnie od ustawień. Nie powinno to tutaj nic namieszać, ale pewności nie mam - trzeba by to dokładniej sprawdzić.
Natomiast to i tak nie jest dobrze zrobione, więc na razie się w te pozostałe detale nie zagłębiam ;P
krycha88
Posts: 5420
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Wed Nov 08, 2023 12:20 pm AT robi rekonfigurację przycisków "on_press/release" i "on_click_1", zależnie od ustawień. Nie powinno to tutaj nic namieszać, ale pewności nie mam - trzeba by to dokładniej sprawdzić.
Natomiast to i tak nie jest dobrze zrobione, więc na razie się w te pozostałe detale nie zagłębiam ;P
Przerobiłem to na OledButtonController który przejmuje obsługę przycisków wyświetlacza i termostatu i teraz to działa :)
https://gui-generic-builder.supla.io/
zzrr
Posts: 537
Joined: Wed Oct 26, 2022 7:35 pm

Post

Niech ktoś pomoże... Nie miałem tego problemu przy ESP8266 a na ESP32 już niestety tak.
Dodaję przycisk na jakimś tam GPIO

Wystarczy że wpiszę tą linię poniżej i nie ważne czy dodam jakąś akcję ON_PRESS, ON_CLICK_1 czy jakąkolwiek inną.
Po 10 krotnym szybkim naciśnięciu włącznika rozłącza wifi a program przechodzi w tryb konfiguracji.
Czy ktoś się spotkał z takim problemem na ESP32?
Włącznik podłączony prawidłowo. Próbowałem dawać dodatkowo pullup w setup ale to niczego nie zmieniało.

auto button_2 = new Supla::Control::Button(button2_pin, true, true);
User avatar
klew
Posts: 10203
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

zzrr wrote: Fri Dec 15, 2023 11:10 pm Niech ktoś pomoże... Nie miałem tego problemu przy ESP8266 a na ESP32 już niestety tak.
Dodaję przycisk na jakimś tam GPIO

Wystarczy że wpiszę tą linię poniżej i nie ważne czy dodam jakąś akcję ON_PRESS, ON_CLICK_1 czy jakąkolwiek inną.
Po 10 krotnym szybkim naciśnięciu włącznika rozłącza wifi a program przechodzi w tryb konfiguracji.
Czy ktoś się spotkał z takim problemem na ESP32?
Włącznik podłączony prawidłowo. Próbowałem dawać dodatkowo pullup w setup ale to niczego nie zmieniało.

auto button_2 = new Supla::Control::Button(button2_pin, true, true);
Jeśli robisz to na bazie przykładów WebInterface, to tam jest użyta klasa typu Config. Wtedy przyciski ładują konfigurację z tego Configa i domyślnie jest ustawiane przełączanie w tryb cfg na 10x klik.
Ustaw na przyciskach: b1->dontUseOnLoadConfig(); to przestaną to robić
zzrr
Posts: 537
Joined: Wed Oct 26, 2022 7:35 pm

Post

klew wrote: Sat Dec 16, 2023 7:16 am Ustaw na przyciskach: b1->dontUseOnLoadConfig(); to przestaną to robić
Klew dzięki. Faktycznie to załatwiło sprawę. Ale dlaczego ten sam kod na esp8266 nie powodował czegoś takiego?

Return to “Arduino IDE”