Brak możliwości zdefiniowania callback'ów

krycha88
Posty: 5197
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

Przesiadam się powoli na nową bibliotekę SuplaDevice ale jak to zawsze są małe problemy. Bardzo prosto definiuje się nowe DSy DHT itd ale te czujniki to nie wszystko co może zaoferować nam alii :D

W starej bibliotece dodając obsługę nowego czujnik wystarczyło dodać callback odpowiednich funkcji i robić co się chce:

Kod: Zaznacz cały

SuplaDevice.setTemperatureCallback(&get_temperature);
SuplaDevice.setPressureCallback(&get_pressure);
SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
Jest też bardzo dużo przypadków, że za pomocą nich przekazuje się wiele innych wartości nie związanych z czujnikami :) Mogę dopisać obsługę nowego czujnika i go wrzucić do SuplaDevice tylko wtedy zawsze trzeba udostępniać swoją bibliotekę do projektu a chyba nie o to chodzi.

Jak to ugryźć na nowej bibliotece?
https://gui-generic-builder.supla.io/
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

Mam nadzieję, że sprawa dotyczy tej biblioteki https://github.com/SUPLA/arduino/tree/develop. Chyba tak...To chciałem się przypomnieć też w sprawie obsługi przycisków mono i bi w nowej bibliotece. @klew odpisał, że "Obsługę przycisków będę dopiero dodawał do oficjalnej biblioteki". Czekam niecierpliwie bo "przydałyby się na już"
krycha88
Posty: 5197
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

Obecnie zmiany są na develop ale docelowo zmiany trafia do brancha master przecież nikt nie będzie wspierać dwóch wersji bibliotek.
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8275
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: wt lut 04, 2020 7:05 am Przesiadam się powoli na nową bibliotekę SuplaDevice ale jak to zawsze są małe problemy. Bardzo prosto definiuje się nowe DSy DHT itd ale te czujniki to nie wszystko co może zaoferować nam alii :D

W starej bibliotece dodając obsługę nowego czujnik wystarczyło dodać callback odpowiednich funkcji i robić co się chce:

Kod: Zaznacz cały

SuplaDevice.setTemperatureCallback(&get_temperature);
SuplaDevice.setPressureCallback(&get_pressure);
SuplaDevice.setTemperatureHumidityCallback(&get_temperature_and_humidity);
Jest też bardzo dużo przypadków, że za pomocą nich przekazuje się wiele innych wartości nie związanych z czujnikami :) Mogę dopisać obsługę nowego czujnika i go wrzucić do SuplaDevice tylko wtedy zawsze trzeba udostępniać swoją bibliotekę do projektu a chyba nie o to chodzi.

Jak to ugryźć na nowej bibliotece?
Muszę to do readme dopisać ;)

Wczoraj już komuś na priv pisałem jak sobie z tym poradzić.
To co trzeba zrobić, to dodać include do typu sensora, który nas interesuje (np. temperatura), potem stworzyć swoją klasę termometru, która dziedziczy po bazowej od termometru, a następnie napisać 2-3 metody. Poniżej przykład - zakładamy, że masz zmienną globalną (a fuj ;) ) double temperatury[4] w której są trzymane 4 wartości temperatur (lub czegokolwiek innego). Na górze programu ino dodajemy:

Kod: Zaznacz cały

#include <supla/sensor/thermometer.h>

class MojMagicznyTermometr : public Supla::Sensor::Thermometer {
  public:
  MojMagicznyTermometr(int index) {
     myIndex = index;
  }

  void onInit() {
          channel.setNewValue(getValue());
  }

  double getValue() {
           return temperatury[myIndex];
  }
  
  int myIndex;
}
I w setup tworzymy sobie tyle instancji ile chcemy:

Kod: Zaznacz cały

new MojMagicznyTermometr(0);
new MojMagicznyTermometr(1);
new MojMagicznyTermometr(2);
new MojMagicznyTermometr(3);
Sensory MojMagicznyTermoemtr zajmą kolejne numery kanałów (podobnie jak to było po staremu przy metodach SuplaDevice.add... )
Aktualna wersja biblioteki z metodami "po nowemu" i "po staremu" ma ograniczenie, że najpierw trzeba zdefiniować wszystkie kanały "po staremu", a potem dopiero "po nowemu". Jak coś zamieszasz, to może się crasheować i inne cuda mogą się dziać.

Jeszcze krótkie wyjaśnienie kodu:
W konstruktorze z reguły przypisujemy tylko wartośc do zmiennych, aby sensor wiedział jak został skonfigurowany (np. zapisujemy numery pinów, informację czy ma być internal pullup itd.)
Metoda onInit() jest wywoływana w SuplaDevice.setup() i tam powinno się znaleźć wszystko co konfiguruje pin, hw, a na koniec powinno wywołać "channel.setNewValue(getValue())" aby urządzenie przy rejestracji wysłało już pierwszy poprawny odczyt.
Metoda getValue() powinna zwrócić odczyt z naszego sensora - ten kod będzie wykonywany co 10 s (w przypadku termometru) - można ten interwał zmienić.

Różne typy sensorów mogą mieć różne metody do pobierania danych. Np. ThermHygroMeter używany przez klasę DHT ma dwie metody getTemp i getHumi - wystarczy zerknąć w pliki .h konkretnego sensora. Ale ogólnie dla wszystkich sensorów zwracających jedną wartość używałem getValue.

Kodu dla MojMagicznyTermometr nie kompilowałem, więc może się nie kompilować ;). Jeśli komuś nie będzie to działało, to wieczorem poprawię.

Takie klasy z własnymi sensorami można trzymać w pliku ino, albo dorzucić własne pliki .h w swoim projekcie. Odradzam wrzucanie własnych plików do lokalnej kopii biblioteki, bo przy aktualizacji może się to rozjechać (np. skasujemy sobie pliki).
Jeśli ktoś pisze obsługę sensora do jakiegoś konkretnego urządzenia, to może to wrzucić do pliku .h i dodać do biblioteki, a następnie zrobić pull request do https://github.com/SUPLA/arduino/tree/develop
Jeśli ktoś chce dodać obsługe jakiegoś sensora, to niech tylko dokładnie w komentarzach w pliku .h dopisze jaki HW jest tutaj obsługiwany i na jakim board to używał/testował. Proszę też dodawać informację jakie dodatkowe biblioteki są używane oraz skąd je pobrać.
Projekt używa też formatowania zdefiniowanego w clang-format (plik konfiguracyjny jest w repo) - także najlepiej przed stworzeniem pull request jest odpalić formatowanie na swoim kodzie.
Widzimy się na Supla Offline Party vol. 2 :!:
Awatar użytkownika
klew
Posty: 8275
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

piomar2 pisze: wt lut 04, 2020 8:36 am Mam nadzieję, że sprawa dotyczy tej biblioteki https://github.com/SUPLA/arduino/tree/develop. Chyba tak...To chciałem się przypomnieć też w sprawie obsługi przycisków mono i bi w nowej bibliotece. @klew odpisał, że "Obsługę przycisków będę dopiero dodawał do oficjalnej biblioteki". Czekam niecierpliwie bo "przydałyby się na już"
To jest temat którym teraz się zajmę, więc niedługo będzie :).
Widzimy się na Supla Offline Party vol. 2 :!:
piomar2
Posty: 369
Rejestracja: pt kwie 26, 2019 5:32 pm
Lokalizacja: Bukowice

No to SUPER :P
krycha88
Posty: 5197
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

@klew bardzo Ci dziękuję za dotychczasową pomoc ;)
https://gui-generic-builder.supla.io/
krycha88
Posty: 5197
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: wt lut 04, 2020 9:36 am

Kod: Zaznacz cały

new MojMagicznyTermometr(0);
new MojMagicznyTermometr(1);
new MojMagicznyTermometr(2);
new MojMagicznyTermometr(3);
A jak odwołać się to metod w MojMagicznyTermometr w loopie?
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8275
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: wt lut 04, 2020 11:11 am
klew pisze: wt lut 04, 2020 9:36 am

Kod: Zaznacz cały

new MojMagicznyTermometr(0);
new MojMagicznyTermometr(1);
new MojMagicznyTermometr(2);
new MojMagicznyTermometr(3);
A jak odwołać się to metod w MojMagicznyTermometr w loopie?
A w jakim celu to potrzebujesz?

W ogólności możesz to zrobić tak, że definiujesz sobie wskaźniki do tych obiektów i w setup robisz:

Kod: Zaznacz cały

sensor1 = new MojMagicznyTermometr(0);
I potem możesz wołać publiczne metody na sensor1. Jeśli potrzebujesz możesz sobie też zdefiniować dodatkowe publiczne metody w MojMagicznyTermometr i ich używać.

Tylko wróciłbym najpierw do pytania: po co?
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5197
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: wt lut 04, 2020 11:50 am
krycha88 pisze: wt lut 04, 2020 11:11 am
klew pisze: wt lut 04, 2020 9:36 am

Kod: Zaznacz cały

new MojMagicznyTermometr(0);
new MojMagicznyTermometr(1);
new MojMagicznyTermometr(2);
new MojMagicznyTermometr(3);
A jak odwołać się to metod w MojMagicznyTermometr w loopie?
A w jakim celu to potrzebujesz?

W ogólności możesz to zrobić tak, że definiujesz sobie wskaźniki do tych obiektów i w setup robisz:

Kod: Zaznacz cały

sensor1 = new MojMagicznyTermometr(0);
I potem możesz wołać publiczne metody na sensor1. Jeśli potrzebujesz możesz sobie też zdefiniować dodatkowe publiczne metody w MojMagicznyTermometr i ich używać.

Tylko wróciłbym najpierw do pytania: po co?
Potrzebuje wyświetlać wartość w GUI oraz na OLE'dzie lub na podstawie temperatury sterować przekaźnikiem.
https://gui-generic-builder.supla.io/
ODPOWIEDZ

Wróć do „Arduino IDE”