Obsługa setTimerFuncImpl w nowej bibliotece

krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

Jak w nowej bibliotece dodać obsługę iteracji? loopa chcę ograniczyć jedynie do SuplaDevice.iterate() :)
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

A co chcesz tam zrobić? W tytule pytasz o timer, a w treści o iteracje :)

Najprościej stworzyć sobie klasę dziedziczącą po Supla::Element. Taka klasa ma metody onInit, iterateAlways, iterateConnected, onTimer, onFastTimer.
Swoją implementację możesz wstawić w którąś z tych metod (w zależności od potrzeby).
Klasa dziedzicząca po Element sama jest zarejestruje w SuplaDevice i będzie automatycznie uruchamiana.
Najlepsze suple dla Twojego domu :mrgreen:
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Tue Jun 02, 2020 11:01 am A co chcesz tam zrobić? W tytule pytasz o timer, a w treści o iteracje :)

Najprościej stworzyć sobie klasę dziedziczącą po Supla::Element. Taka klasa ma metody onInit, iterateAlways, iterateConnected, onTimer, onFastTimer.
Swoją implementację możesz wstawić w którąś z tych metod (w zależności od potrzeby).
Klasa dziedzicząca po Element sama jest zarejestruje w SuplaDevice i będzie automatycznie uruchamiana.
heh bo zawsze timera traktowałem tak samo jak iterację :D

chciałem wyrzucić z loopa handleClient więc zapewne murzę wykorzystać iterateAlways :)
https://github.com/esp8266/Arduino/tree ... t-requests
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

krycha88 wrote: Tue Jun 02, 2020 11:24 am heh bo zawsze timera traktowałem tak samo jak iterację :D

chciałem wyrzucić z loopa handleClient więc zapewne murzę wykorzystać iterateAlways :)
https://github.com/esp8266/Arduino/tree ... t-requests
Możesz całą obsługę sobie zapakować w taką klasę dziedziczącą po Element.
iterateAlways będzie odpowiednim miejscem.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Goral64
Posts: 3258
Joined: Fri Dec 27, 2019 6:22 pm
Location: Żerniki Wrocławskie
Has thanked: 2 times
Been thanked: 1 time

Post

Umieszczanie obsługi webowego GUI w SuplaDevice.iterate() wydaje się być mało elastyczne. No chyba, że webGUI będzie klasą dziedziczącą po Element i będzie deklarowana jako ostatnia albo pierwsza. Tak sobie na sucho kombinuję ;)
Widzimy się na Supla Offline Party Season 2026 :D

Image
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Tue Jun 02, 2020 11:51 am Możesz całą obsługę sobie zapakować w taką klasę dziedziczącą po Element.
iterateAlways będzie odpowiednim miejscem.
Tak właśnie zrobiłem i działa bardzo fajnie - dzięki za bardzo elastyczną bibliotekę :)

Tak się zastanawiam czy dałoby się wykorzystać onTimer do obsługi LED w łatwiejszy sposób. Zawsze robiłem to mniej więcej w taki sposób.

Code: Select all

ETSTimer led_timer;

void ledBlinking(int time) {
  os_timer_disarm(&led_timer);
  os_timer_setfn(&led_timer, ledBlinking_func, NULL);
  os_timer_arm (&led_timer, time, true);
}

void ledBlinking_func(void *timer_arg) {
  int val = digitalRead(getPinLedConfig());
  digitalWrite(getPinLedConfig(), val == HIGH ? 0 : 1);
}
https://gui-generic-builder.supla.io/
User avatar
Goral64
Posts: 3258
Joined: Fri Dec 27, 2019 6:22 pm
Location: Żerniki Wrocławskie
Has thanked: 2 times
Been thanked: 1 time

Post

Wygląda na to, że jeśli zrobisz klasę potomną dla Element dla diody, którą będziesz chciał pomrugać to możesz wykorzystać onTimer(). Tylko będziesz musiał sobie jakiś dzielnik ustawić, bo onTimer wywoływany jest co 10 jednostek czasu. Tylko pewnie trzeba by było jeszcze oprogramować tryb mrugania, włączanie i wyłączanie mrugania. Więc wygląda, że da się to zrobić, ale czy łatwiej?
Widzimy się na Supla Offline Party Season 2026 :D

Image
User avatar
klew
Posts: 13908
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 134 times
Been thanked: 137 times

Post

Jest jeszcz "onFastTimer", tylko nie pamiętam czestotliwości.

Obsługę diody będę robił w bibliotece.
Najlepsze suple dla Twojego domu :mrgreen:
User avatar
Goral64
Posts: 3258
Joined: Fri Dec 27, 2019 6:22 pm
Location: Żerniki Wrocławskie
Has thanked: 2 times
Been thanked: 1 time

Post

klew wrote: Tue Jun 02, 2020 1:33 pm Jest jeszcz "onFastTimer", tylko nie pamiętam czestotliwości.
Co 1 jednostkę czasu.
klew wrote: Tue Jun 02, 2020 1:33 pm Obsługę diody będę robił w bibliotece.
No w sumie już obsługujesz diodę na potrzeby biblioteki, więc tylko udostępnij interfejs na zewnątrz :)
Widzimy się na Supla Offline Party Season 2026 :D

Image
krycha88
Posts: 5575
Joined: Fri Nov 16, 2018 7:25 am
Been thanked: 5 times

Post

klew wrote: Tue Jun 02, 2020 11:01 am A co chcesz tam zrobić? W tytule pytasz o timer, a w treści o iteracje :)

Najprościej stworzyć sobie klasę dziedziczącą po Supla::Element. Taka klasa ma metody onInit, iterateAlways, iterateConnected, onTimer, onFastTimer.
Swoją implementację możesz wstawić w którąś z tych metod (w zależności od potrzeby).
Klasa dziedzicząca po Element sama jest zarejestruje w SuplaDevice i będzie automatycznie uruchamiana.
napotkałem mały problem metody iterateAlways, iterateConnected, onTimer, onFastTimer nie wykonują się w momencie podania niepoprawnych parametrów dla SuplaDevice.begin - w moim przypadku NULLem jest mail oraz serwer.

o ile GUID oraz AUTHKEY powinien być wymagany to wg mnie mail lub serwer już nie - w najgorszym wypadku nie nastąpi połączenie ze SUPLĄ. Jeżeli możesz @klew usunąć return w tych miejscach :)

Code: Select all

  if (Supla::Channel::reg_dev.ServerName[0] == NULL) {
    status(STATUS_UNKNOWN_SERVER_ADDRESS, "Unknown server address");
   // return false;
  }

  if (Supla::Channel::reg_dev.Email[0] == NULL) {
    status(STATUS_MISSING_CREDENTIALS, "Unknown email address");
   // return false;
  }
https://gui-generic-builder.supla.io/

Return to “Arduino IDE”