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 zmian i większość powinna być aktualna
KLOP - Ogólny kanał licznikowy - Działający przykład
-
- Posts: 9712
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 5417
- Joined: Fri Nov 16, 2018 7:25 am
Właśnie w tym problem zobacz sobie jak to jest zrobione w klasie ImpulseCounter i zrób podobnie.iM@rek wrote: Thu Apr 18, 2024 8:06 pmNie przywracam stanu.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 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ę.
https://gui-generic-builder.supla.io/
-
- Posts: 349
- Joined: Thu Feb 09, 2023 1:25 pm
Poczytałem o klasach, wskaźnikach, obiektach itp. żeby w ogóle rozumieć składnię poleceń, na które patrzę.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.
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.
-
- Posts: 9712
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
A czego konkretnie szukasz?
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 349
- Joined: Thu Feb 09, 2023 1:25 pm
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.
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.
-
- Posts: 349
- Joined: Thu Feb 09, 2023 1:25 pm
Jeszcze konkretniej:
W pliku fram_i2c.h jest klasa FramI2c
W tej klasie są metody np:
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".
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);
}
}
Podobnie z "xRead".
-
- Posts: 9712
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
Zapis i odczyt jest w impulse counter w metodach onLoadState i onSaveState.
Tyle wystarczy reszta to magia :p
Tyle wystarczy reszta to magia :p
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 349
- Joined: Thu Feb 09, 2023 1:25 pm
Ok, mam w impulse_counter.cpp dwie definicje metod: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
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);
}
Z kolei on LoadState używa zmiennej 'data'
Jak mogę te metody wywołać najpierw w setup() w GG? A potem z sekcji loop()?
-
- Posts: 9712
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
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
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
Kiedy będzie Supla Offline Party / SOP#2025 ?
-
- Posts: 349
- Joined: Thu Feb 09, 2023 1:25 pm
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:
Patrzyłem do SDGUI.cpp do sekcji Impulse Counter i tam:
a potem piny, zbcza, opóźnienia itp.
A w sekcji IC w SDGUI.h jest:
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?
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
Code: Select all
#ifdef SUPLA_IMPULSE_COUNTER
std::vector<Supla::Sensor::ImpulseCounter *> impulseCounter;
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
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?