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

krycha88
Posts: 5232
Joined: Fri Nov 16, 2018 7:25 am

Post

A jakie są plusy tego klopa czego nie ma normalny kanał impulsów? bo może dodać taki kanał do GG?
https://gui-generic-builder.supla.io/
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Apr 24, 2024 9:34 am A jakie są plusy tego klopa czego nie ma normalny kanał impulsów? bo może dodać taki kanał do GG?
Są plusy dodanie i plusy ujemne ;)

+ jest większa swoboda konfiguracji (prefix, suffix, ilość miejsc po przecinku)
+ można wysyłać z urządzenia wartości double, a nie int64 (np. czytając po wmbusmeters licznik wody, nie trzeba przeliczać "23.872" na 23872, tylko można od razu double wysyłać
+ można ustawić licznik jako "always increment", "always decrement", lub "increment and decrement" (zwykły IC obecnie jest zawsze traktowany jako "always increment"
- nie ma przeliacznia na złotówki
- obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posts: 5232
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Wed Apr 24, 2024 9:45 am - obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
Może jakiś parametr do tego lub jakaś druga klasa która będzie robić to samo co aktualny licznik impulsów tylko na klopie? dla większości to pewnie jest traktowane jako brak :P

edit:
mogę to zrobić ale w GG, jeżeli będziesz chciał to dodać to po co powielać robotę :)
https://gui-generic-builder.supla.io/
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

krycha88 wrote: Wed Apr 24, 2024 9:34 am A jakie są plusy tego klopa czego nie ma normalny kanał impulsów? bo może dodać taki kanał do GG?
Ale by było fajnie... Zgłaszam się jako pierwszy do testów...
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Apr 24, 2024 9:57 am
klew wrote: Wed Apr 24, 2024 9:45 am - obecna implementacja KLOP nie ma przechowywania stanu (bo nie zawsze jest to potrzebne) i nie ma implementacji np. zliczania impulsów z GPIO.
Może jakiś parametr do tego lub jakaś druga klasa która będzie robić to samo co aktualny licznik impulsów tylko na klopie? dla większości to pewnie jest traktowane jako brak :P

edit:
mogę to zrobić ale w GG, jeżeli będziesz chciał to dodać to po co powielać robotę :)
Możesz dodać do supla-device :). Ja mogę to też zrobić, ale nie wiem kiedy na to czas znajdę.
Widzimy się na Supla Offline Party vol. 2 :!:
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

W oczekiwaniu na lepsze, uczę się dalej:
Na bazie GG.ino dołożyłem obsługę FRAM za pomocą ADAFruit.
Czyli nie kompiluję Licznika Imp. z GG, a wstawiam KLOP oraz dokładam procedury obsługi FRAM z bibliotekami Ady.
Wiem, że to z lekka nieelegancko, ale inaczej nie umiem.
Działa zliczanie imp (KLOP), działa zapisywanie w FRAM i odtwarzanie stanu po ponownym uruchomieniu.
Nie działa reset licznika z poziomu strony i KLOPa - no bo nie ma jak działać w tej "równoległej" konfiguracji.

Chcę jakoś przekazać info o resecie do głównej pętli w GG.ino, np. za pomocą zmiennej ResetIMP

Znalazłem, że reset licznika ze strony powoduje uruchomienie w GeneralPurposeMeter.cpp.
Tam jest w linii 248 info: "CALCFG reset counter received":

Code: Select all

int GeneralPurposeMeter::handleCalcfgFromServer(
    TSD_DeviceCalCfgRequest *request) {
  if (request) {
    if (request->Command == SUPLA_CALCFG_CMD_RESET_COUNTERS) {
      if (!request->SuperUserAuthorized) {
        return SUPLA_CALCFG_RESULT_UNAUTHORIZED;
      }
      SUPLA_LOG_INFO("GPM[%d]: CALCFG 248 reset counter received",
                     getChannelNumber());
      setCounter(resetToValue);
      int ResetIMP = 1;                             \\ moja wstawka
      Serial.printf("ResetIMP: %d\n\n",ResetIMP);   \\ zmienia z 0->1 i wyświetla <1>  na monitorze
      return SUPLA_CALCFG_RESULT_DONE, ResetIMP;    \\ dołożyłem zwrot tej zmiennej
    }
  }
  return SUPLA_CALCFG_RESULT_FALSE;
}
W GG.ino zadeklerowałem:

Code: Select all

extern int ResetIMP;    // zmienna/flaga resetu licznika, ma być globalna i zwracana do GG.ino
int ResetIMP = 0;      // normalnie 0
Monitoruję tę zmienną i ma wartość 0 podczas działania programu.
Po wywołaniu resetu licznika, jej wartość w GeneralPurposeMeter zmienia się na 1, ale nie wraca do pętli w GG.ino
Tam jest ciągle 0.
Jak mam przekazać do pętli GG zmienioną wartość ResetIMP z GeneralPurposeMeter?
vajera
Posts: 440
Joined: Wed Oct 31, 2018 7:58 am

Post

iM@rek wrote: Thu Apr 25, 2024 9:15 am

Code: Select all

i      setCounter(resetToValue);
      int ResetIMP = 1;                             \\ moja wstawka
      Serial.printf("ResetIMP: %d\n\n",ResetIMP);   \\ zmienia z 0->1 i wyświetla <1>  na monitorze
      return SUPLA_CALCFG_RESULT_DONE, ResetIMP;    \\ dołożyłem zwrot tej zmiennej
    }
  }
  return SUPLA_CALCFG_RESULT_FALSE;
}
Tak na szybko - w tej funkcji deklarujesz LOKALNĄ zmienną ResetIMP (używając tego int - to jest deklaracja zmiennej).
Poza tym ta funkcja zwraca jedną wartość typu int a Ty próbujesz zwrócić 2, co może prowadzić do nieokreślonych konsekwencji łącznie z crashem stosu.

Zmienna ResetIMP musi być zadeklarowana poza funkcją - wtedy będzie globalna, a w GG.ino zostaw tylko linijkę z extern bo w kolejną deklarujesz ją ponownie.

Czyli, np.

Code: Select all

int ResetIMP = 0;

int GeneralPurposeMeter::handleCalcfgFromServer(
    TSD_DeviceCalCfgRequest *request) {
  if (request) {
    if (request->Command == SUPLA_CALCFG_CMD_RESET_COUNTERS) {
      if (!request->SuperUserAuthorized) {
        return SUPLA_CALCFG_RESULT_UNAUTHORIZED;
      }
      SUPLA_LOG_INFO("GPM[%d]: CALCFG 248 reset counter received",
                     getChannelNumber());
      setCounter(resetToValue);
      ResetIMP = 1; 
      
Last edited by vajera on Thu Apr 25, 2024 9:35 am, edited 2 times in total.
User avatar
klew
Posts: 8647
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

iM@rek wrote: Thu Apr 25, 2024 9:15 am
A czemu nie zrobisz po prostu:

Code: Select all

klop->setCounter(0);
?
Widzimy się na Supla Offline Party vol. 2 :!:
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

klew wrote: Thu Apr 25, 2024 9:33 am
iM@rek wrote: Thu Apr 25, 2024 9:15 am
A czemu nie zrobisz po prostu:

Code: Select all

klop->setCounter(0);
?
To chyba spowoduje zerowanie klop z poziomu GG, ale ja nie chcę go zerować z poziomu GG.ino, a ze strony, czyli info ze strony o resecie ma trafić do głównej pętli GG.ino.
Chyba, że to źle rozumiem?
iM@rek
Posts: 247
Joined: Thu Feb 09, 2023 1:25 pm

Post

vajera wrote: Thu Apr 25, 2024 9:32 am Tak na szybko - w tej funkcji deklarujesz LOKALNĄ zmienną ResetIMP (używając tego int - to jest deklaracja zmiennej).
Poza tym ta funkcja zwraca jedną wartość typu int a Ty próbujesz zwrócić 2, co może prowadzić do nieokreślonych konsekwencji łącznie z crashem stosu.
Zmienna ResetIMP musi być zadeklarowana poza funkcją - wtedy będzie globalna, a w GG.ino zostaw tylko linijkę z extern bo w kolejną deklarujesz ją ponownie.
ok, zrozumiałem obie uwagi.
Usunąłem deklarację zmiennej z funkcji, zostało: ResetIMP = 1;
przesunąłem deklarację int ResetIMP = 0; na górę general_purpose_meter.cpp, po deklaracjach "#include..."
oraz usunąłem zwrot drugiej zmiennej z Return

EDIT:
Poczytałem, zrozumiałem (mam nadzieję), wprowadziłem poprawki i działa.
Deklaracja została w GG.ino, definicja trafiła do "general_purpose_meter.cpp".
Klikam "Resetuj licznik" na stronie Supli i zerują się:
1. licznik KLOP i
2. moja zmienna jego wartości,
3. następuje zapis wartości do FRAM i
4. licznik startuje od zera.
Dziękuję za pomoc.

Return to “Ogólna dyskusja”