KLOP - Ogólny kanał licznikowy - Działający przykład

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

Post

Przejrzyj sobie ImpulseCounter - to bardzo krótka klasa. Metody onSaveState/onLoadState są w zasadzie 1-linijkowe.
Natomiast warto rozumieć co tam się dzieje. Tutaj jest wątek na ten temat: viewtopic.php?t=7162
Co prawda temat jest stary, ale tam nie było zbyt wiele zdań i większość powinna być aktualna
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posts: 5232
Joined: Fri Nov 16, 2018 7:25 am

Post

iM@rek wrote: Thu Apr 18, 2024 8:06 pm
krycha88 wrote: Thu Apr 18, 2024 7:27 pm A gdzie przewracasz stan IC0Value przy starcie urządzenia? Bo jeżeli tego nie robisz to zwróć uwagę, że nadpisujesz zawsze zapisany stan przy starcie urządzenia.
Nie przywracam stanu.
Nie wiem, skąd miałbym przywracać tę wartość, nie wiem, gdzie i jak jest zapisywana.
W monitorze tego nie widzę.
Przy IC są xWrote i pewnie przy restarcie są odczyty.
Przy KLOP tego nie widzę.
Właśnie w tym problem ;) zobacz sobie jak to jest zrobione w klasie ImpulseCounter i zrób podobnie.
https://gui-generic-builder.supla.io/
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

krycha88 wrote: Fri Apr 19, 2024 3:51 am Właśnie w tym problem ;) zobacz sobie jak to jest zrobione w klasie ImpulseCounter i zrób podobnie.
Poczytałem o klasach, wskaźnikach, obiektach itp. żeby w ogóle rozumieć składnię poleceń, na które patrzę.
Przeglądnąłem GuiGeneric.ino i tam w sekcji ImpulseCounter znalazłem i chyba zrozumiałem dodawanie liczników.
Przestudiowałem: Supla::GUI::addImpulseCounter(nr);

Ale nie wiem, jak wygląda/ gdzie mam znaleźć procedury związane z obsługą licznika już po dodaniu.
Nie umiem znaleźć powiązania/ przejścia pomiędzy GG.ino i kodem, który jest wykonywany w krokach:
SuplaDevice.begin();
SuplaDevice.iterate();
Czytałem o tym, jak działa Supladevice na GH w sekcji "How does it work?" i rozumiem ideę, ale nie umiem znaleźć odpowiednich procedur w GG.ino.
Gdzie mam tego szukać? Proszę o pomoc.
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

A czego konkretnie szukasz?
Widzimy się na Supla Offline Party vol. 2 :!:
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

Używam GG Krychy.
Zaznaczam kilka potrzebnych czujników, np. DS.
Resztę dopisuję w sekcjach setup i iterate.
Ta reszta to np. kilka instancji KPOP.
W taki sam sposób dopisałem KLOP.
Mam podłączoną pamięć FRAM, która działa przy użyciu
klasy z frami2c.h, która działa w oparciu o AdaFruit-fram-i2c
i Adafruit-eeprom-i2c.
I FRAMdziała, kiedy w GG uruchomię flagę Impuls Counter - widzę to w logach.
To samo chcę zrobić dla KLOP:
Potrzebuję dorobić zapis i odczyt wartości liczników do fram.
Potrafię komunikować się z fram korzystając z przykładów
z Adafruit. Uruchomiłem wszystkie przykłady.
Ale nie potrafię dołożyć skutecznie żadnego przykładu do GG - konflikt klas, zmiennych itp.
Jak pisałem, analizowałem kod GG, ale nie wiem jak zrobić zapis czy odczyt do fram z poziomu GG. Nie umiem tego znaleźć.
Analizuję klasę Impuls Counter, ale nie widzę wywołań funkcji modyfikujących wartości liczników i zapisujących to do pamięci.
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

Jeszcze konkretniej:
W pliku fram_i2c.h jest klasa FramI2c
W tej klasie są metody np:

Code: Select all

 void xWrite(uint16_t addr, uint8_t value) {
    fram.write(addr, value);
	if (_logs) {
	  SUPLA_LOG_DEBUG("+++  xWrote %d at address 0x%d", value, addr);
    }
  }
W terminalu widzę zapisy zaczynające się od "xWrite", wysyłane przez DEBUG, ale nie potrafię znaleźć miejsca, z którego te metody są wywoływane, ani nie potrafię ich wywołać z GG.
Podobnie z "xRead".
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

Zapis i odczyt jest w impulse counter w metodach onLoadState i onSaveState.
Tyle wystarczy :) reszta to magia :p
Widzimy się na Supla Offline Party vol. 2 :!:
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

klew wrote: Tue Apr 23, 2024 3:43 pm Zapis i odczyt jest w impulse counter w metodach onLoadState i onSaveState.
Tyle wystarczy :) reszta to magia :p
Ok, mam w impulse_counter.cpp dwie definicje metod:

Code: Select all

void ImpulseCounter::onSaveState() {
  Supla::Storage::WriteState((unsigned char *)&counter, sizeof(counter));
}

void ImpulseCounter::onLoadState() {
  uint64_t data;
  if (Supla::Storage::ReadState((unsigned char *)&data, sizeof(data))) {
    setCounter(data);
  }
onSaveState chce zmiennej 'counter' - liczby impulsów wg VSC.
Z kolei on LoadState używa zmiennej 'data'
Jak mogę te metody wywołać najpierw w setup() w GG? A potem z sekcji loop()?
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

onLoadState jest automatycznie uruchamiany w trakcie SuplaDevice.begin.
onSaveState wykonuje się automatycznie co ustalony czas w SuplaDevice.iterate.

Wcześniej dawałem link do wątku o zapisywaniu stanu. Tam wszystko powinno być opisane.

Zmienna counter to zmienna trzymająca stan licznika w klasie IC. W KLOP ten stan jest w innej zmiennej, typu double. Powinien też być getter, ale nazwy nie pamiętam.
data to zmienna lokalna do której jest realizowana próba odczytu stanu licznika i jeśli odczyt się udał to metodą setCounter jest ona ustawiana jako stan licznika
Widzimy się na Supla Offline Party vol. 2 :!:
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

Poczytałem.
Widzę, że kiedy skompiluję GG z Licznikiem, działają te metody automatyczne: onLoadState i onSaveState.
Kiedy skompiluję GG bez licznika - nie działają, no jasne, bo niby czemu.

I tu wracam do pytania:
=====
Co należy wpisać do setup() i loop() w GG, żeby te metody aktywować?
=====
A żeby nie było, że tylko pytam, a nic nie czytam i nie sprawdzam: ;-)

W GG sekcji setup() jest tworzony IC:

Code: Select all

#ifdef SUPLA_IMPULSE_COUNTER
(...)
   SUPLA_LOG_DEBUG("--- GG.ino: Supla Impulse Counter: Adding Counter"); 
   Supla::GUI::addImpulseCounter(nr);    // ta metoda jest w SDGUI.cpp
   
Patrzyłem do SDGUI.cpp do sekcji Impulse Counter i tam:

Code: Select all

#ifdef SUPLA_IMPULSE_COUNTER
std::vector<Supla::Sensor::ImpulseCounter *> impulseCounter;
a potem piny, zbcza, opóźnienia itp.

A w sekcji IC w SDGUI.h jest:

Code: Select all

#ifdef SUPLA_IMPULSE_COUNTER
extern std::vector<Supla::Sensor::ImpulseCounter *> impulseCounter;
void addImpulseCounter(uint8_t nr);
#endif
Czy to extern std::vector... uaktywnia te automaty?

Innymi słowy:
jak aktywować te automatyczne odczyty/ zapisy bez dodawania kanału licznika impulsów?
lub
jak wykorzystać te automaty po dodaniu licznika impulsów dla potrzeb KLOPa/ KLOPów?

Return to “Ogólna dyskusja”