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

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

Post

Na moim branchu (https://github.com/klew/arduino) wrzuciłem właśnie nową wersję Button z obsługą wieloklików i przytrzymania przycisku. Zapraszam do testowania i komentowania.

Przycisk dodajemy standardowo:

Code: Select all

#include <supla/control/button.h>
...
auto b1 = new Supla::Control::Button(pin, pullup, invertLogic); // gdy dajemy pullup, to invertLogic dajemy na true
Następnie konfigurujemy nowe opcje:

Code: Select all

b1->setHoldTime(2000); // po 2 s od przytrzymania przycisku zostanie wywołane zdarzenie ON_HOLD
b1->setMulticlickTime(400); // program zlicza kliknięcia i po upływie 400 ms od puszczenia przycisku, wywoła odpowiednią akcję ON_CLICK_1 do ON_CLICK_9 
Metod od HOLD można używać razem lub osobno z ON_CLICK, z tym że, ON_HOLD zostanie wysłane tylko przy pierwszym kliknięciu i następująca po nim seria kliknięć nie wywołuje ON_CLICK.
Natomiast jeśli jesteśmy na którymś kolejnym kliknięciu, to ON_HOLD nie działa i możemy trzymać przycisk dowolnie długo.

Akcje dodajemy standardowo:

Code: Select all

b1->addAction(Supla::TURN_ON, relay1, ON_CLICK_1);
b1->addAction(Supla::TURN_ON, relay2, ON_CLICK_2);
b1->addAction(Supla::TURN_ON, relay3, ON_CLICK_3);
b1->addAction(Supla::TURN_ON, relay4, ON_CLICK_4);
b1->addAction(Supla::TURN_OFF, relay1, ON_HOLD);
b1->addAction(Supla::TURN_OFF, relay2, ON_HOLD);
b1->addAction(Supla::TURN_OFF, relay3, ON_HOLD);
b1->addAction(Supla::TURN_OFF, relay4, ON_HOLD);
Proszę tylko pamiętać, że na chwilę obencą można dodać maksymalnie 10 akcji do jednego buttona. Będzie to rozszerzane, ale jak znajdę na to czas. Jeśli ktoś chce więcej, to dawajcie znać.

Dotychczasowe zdarzenia ON_PRESS, ON_RELEASE, ON_CHANGE są wywoływane po staremu niezależnie od tego, czy używamy nowych metod czy nie. Na chwilę obecną wydaje mi się, że powinno się używać albo tych starych zdarzeń bez dodatkowych funkcji, albo tyklo tych nowych.

Mam już kilka pomysłów na to jak to jeszcze bardziej rozbudować o nowe funkcje, ale na razie nie będę ich zdradzał.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posts: 5243
Joined: Fri Nov 16, 2018 7:25 am

Post

Proszę tylko pamiętać, że na chwilę obencą można dodać maksymalnie 10 akcji do jednego buttona. Będzie to rozszerzane, ale jak znajdę na to czas. Jeśli ktoś chce więcej, to dawajcie znać.
Takie ograniczenia to lubię :D
https://gui-generic-builder.supla.io/
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Nov 13, 2020 10:43 am

Code: Select all

b1->setMulticlickTime(400); // program zlicza kliknięcia i po upływie 400 ms od puszczenia przycisku, wywoła odpowiednią akcję ON_CLICK_1 do ON_CLICK_9 
400 ms, to czas w którym mamy się wyrobić z kliknięciami?
klew wrote: Fri Nov 13, 2020 10:43 am Metod od HOLD można używać razem lub osobno z ON_CLICK, z tym że, ON_HOLD zostanie wysłane tylko przy pierwszym kliknięciu i następująca po nim seria kliknięć nie wywołuje ON_CLICK.
?? :)
klew wrote: Fri Nov 13, 2020 10:43 am Dotychczasowe zdarzenia ON_PRESS, ON_RELEASE, ON_CHANGE są wywoływane po staremu niezależnie od tego, czy używamy nowych metod czy nie. Na chwilę obecną wydaje mi się, że powinno się używać albo tych starych zdarzeń bez dodatkowych funkcji, albo tyklo tych nowych.
Jeśli do ON_CHANGE dodam ON_CLICK_7 to w którym momencie wystartuje licznik?
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Fri Nov 13, 2020 6:17 pm
klew wrote: Fri Nov 13, 2020 10:43 am

Code: Select all

b1->setMulticlickTime(400); // program zlicza kliknięcia i po upływie 400 ms od puszczenia przycisku, wywoła odpowiednią akcję ON_CLICK_1 do ON_CLICK_9 
400 ms, to czas w którym mamy się wyrobić z kliknięciami?
klew wrote: Fri Nov 13, 2020 10:43 am Metod od HOLD można używać razem lub osobno z ON_CLICK, z tym że, ON_HOLD zostanie wysłane tylko przy pierwszym kliknięciu i następująca po nim seria kliknięć nie wywołuje ON_CLICK.
?? :)
klew wrote: Fri Nov 13, 2020 10:43 am Dotychczasowe zdarzenia ON_PRESS, ON_RELEASE, ON_CHANGE są wywoływane po staremu niezależnie od tego, czy używamy nowych metod czy nie. Na chwilę obecną wydaje mi się, że powinno się używać albo tych starych zdarzeń bez dodatkowych funkcji, albo tyklo tych nowych.
Jeśli do ON_CHANGE dodam ON_CLICK_7 to w którym momencie wystartuje licznik?
400 ms to maksymalny czas między kolejnymi kliknięciami. Gdy minie 400 ms to jest wysyłane odpowiednie zdarzenie i kończymy liczenie

Reszty pytań nie rozumiem ;)
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Nov 13, 2020 7:16 pm 400 ms to maksymalny czas między kolejnymi kliknięciami. Gdy minie 400 ms to jest wysyłane odpowiednie zdarzenie i kończymy liczenie
Reszty pytań nie rozumiem ;)
Pomijając to czego ja nie zrozumiałem (wyjdzie w testach) to zastanawiam się jak mogę dodać zdarzenie wielokliku / wieloprzełączenia na przełączniku bistabilnym. Póki co chyba nie mogę? :)
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Fri Nov 13, 2020 7:50 pm
Pomijając to czego ja nie zrozumiałem (wyjdzie w testach) to zastanawiam się jak mogę dodać zdarzenie wielokliku / wieloprzełączenia na przełączniku bistabilnym. Póki co chyba nie mogę? :)
Jakby to miało działać? Każde przełączenie góra lub dół, to jeden "klik"? Tylko wtedy przytrzymanie by nie mogło działać. Chyba że masz na to jakiś inny pomysł. Mogę takie coś dodać
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Nov 13, 2020 8:09 pm Jakby to miało działać? Każde przełączenie góra lub dół, to jeden "klik"?
Dokładnie tak, każde przełączenie to klik. Mam na myśli przeklikanie przejścia do konfiguracji (np.)
Na tą chwilę wszystkie nowe metody dedykowane są dla przycisków dzwonkowych, przydałyby się też dla zwykłych przełączników.
klew wrote: Fri Nov 13, 2020 8:09 pm Tylko wtedy przytrzymanie by nie mogło działać.
To jest oczywiste ;)
https://www.facebook.com/groups/supladiy/
User avatar
klew
Posts: 8763
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

lukfud wrote: Fri Nov 13, 2020 9:03 pm Dokładnie tak, każde przełączenie to klik. Mam na myśli przeklikanie przejścia do konfiguracji (np.)
Na tą chwilę wszystkie nowe metody dedykowane są dla przycisków dzwonkowych, przydałyby się też dla zwykłych przełączników.
Dorzucone. Przy setMulticlickTime wystarczy dodać "true" jako dodatkowy parametr:

Code: Select all

 b1->setMulticlickTime(400, true);
Widzimy się na Supla Offline Party vol. 2 :!:
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Nov 13, 2020 9:59 pm Dorzucone. Przy setMulticlickTime wystarczy dodać "true" jako dodatkowy parametr:

Code: Select all

 b1->setMulticlickTime(400, true);
Dzięki :)
https://www.facebook.com/groups/supladiy/
User avatar
lukfud
Posts: 2117
Joined: Thu Nov 23, 2017 11:33 pm
Location: Warszawa

Post

klew wrote: Fri Nov 13, 2020 9:59 pm Dorzucone. Przy setMulticlickTime wystarczy dodać "true" jako dodatkowy parametr:

Code: Select all

 b1->setMulticlickTime(400, true);
Czy dużym problemem było by dorzucenie akcji na puszczenie przycisku po wykonaniu ON_HOLD ?
Przenoszę przejście do konfiguracji z loop() na nowe metody i w tej chwili mam działające:

Code: Select all

button_[btn_relay_number]->setMulticlickTime(400);
button_[btn_relay_number]->addAction(Supla::TOGGLE, *relay_[btn_relay_number], Supla::ON_CLICK_1);
...
button_[btn_relay_number]->setHoldTime(5000);
myCfgActionsClass *cfgBtn = new myCfgActionsClass;
button_[btn_relay_number]->addAction(BTN_ACTION_ON_HOLD, *cfgBtn, Supla::ON_HOLD);
button_[btn_relay_number]->addAction(BTN_ACTION_ON_RELEASE, *cfgBtn, Supla::ON_RELEASE);
Nie jest to doskonałe połączenie, poza tym przy starcie programu wykonuje się akcja na ON_RELEASE.

Zauważyłem, że bez ustawienia "setMulticlickTime" metoda ON_HOLD nie działa za każdym razem, w sumie działa tylko raz po uruchomieniu programu.

Kolejna rzecz:
Trzymając przycisk za krótko, czekając na akcję ON_HOLD nie powinna już wykonywać się akcja ON_CLICK_1
W sumie mógłbyś dorzucić ON_CLICK_OR_HOLD - byłoby idealnie.
Co sądzisz?
https://www.facebook.com/groups/supladiy/

Return to “Arduino IDE”