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

Awatar użytkownika
klew
Posty: 1511
Rejestracja: czw cze 27, 2019 12:16 pm

pt lis 13, 2020 10:43 am

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:

Kod: Zaznacz cały

#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:

Kod: Zaznacz cały

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:

Kod: Zaznacz cały

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ł.
krycha88
Posty: 896
Rejestracja: pt lis 16, 2018 7:25 am

pt lis 13, 2020 10:52 am

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
lukfud
Posty: 647
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

pt lis 13, 2020 6:17 pm

klew pisze:
pt lis 13, 2020 10:43 am

Kod: Zaznacz cały

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 pisze:
pt lis 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 pisze:
pt lis 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?
Awatar użytkownika
klew
Posty: 1511
Rejestracja: czw cze 27, 2019 12:16 pm

pt lis 13, 2020 7:16 pm

lukfud pisze:
pt lis 13, 2020 6:17 pm
klew pisze:
pt lis 13, 2020 10:43 am

Kod: Zaznacz cały

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 pisze:
pt lis 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 pisze:
pt lis 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 ;)
lukfud
Posty: 647
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

pt lis 13, 2020 7:50 pm

klew pisze:
pt lis 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ę? :)
Awatar użytkownika
klew
Posty: 1511
Rejestracja: czw cze 27, 2019 12:16 pm

pt lis 13, 2020 8:09 pm

lukfud pisze:
pt lis 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ć
lukfud
Posty: 647
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

pt lis 13, 2020 9:03 pm

klew pisze:
pt lis 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 pisze:
pt lis 13, 2020 8:09 pm
Tylko wtedy przytrzymanie by nie mogło działać.
To jest oczywiste ;)
Awatar użytkownika
klew
Posty: 1511
Rejestracja: czw cze 27, 2019 12:16 pm

pt lis 13, 2020 9:59 pm

lukfud pisze:
pt lis 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:

Kod: Zaznacz cały

 b1->setMulticlickTime(400, true);
lukfud
Posty: 647
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

pt lis 13, 2020 10:17 pm

klew pisze:
pt lis 13, 2020 9:59 pm
Dorzucone. Przy setMulticlickTime wystarczy dodać "true" jako dodatkowy parametr:

Kod: Zaznacz cały

 b1->setMulticlickTime(400, true);
Dzięki :)
lukfud
Posty: 647
Rejestracja: czw lis 23, 2017 11:33 pm
Lokalizacja: Warszawa

sob lis 14, 2020 7:46 pm

klew pisze:
pt lis 13, 2020 9:59 pm
Dorzucone. Przy setMulticlickTime wystarczy dodać "true" jako dodatkowy parametr:

Kod: Zaznacz cały

 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:

Kod: Zaznacz cały

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?
ODPOWIEDZ

Wróć do „Arduino IDE”