Obsługa przycisków w SuplaDevice

Awatar użytkownika
shimano73
Posty: 1088
Rejestracja: ndz lut 28, 2016 12:27 pm
Lokalizacja: Orzesze

czw mar 05, 2020 12:52 pm

klew pisze:
czw mar 05, 2020 10:39 am
krycha88 pisze:
czw mar 05, 2020 10:22 am
Czy planujesz dodać opcję przywracania stanu przekaźnika po restarcie ESP?
Ogólnie tak. Zostało mi jeszcze parę rzeczy do przepisania "po nowemu" i wtedy między innymi zajmę się też zapisywaniem konfiguracji i stanów.
Dla niektórych kanałów jest to konieczne (np. rolety, liczniki impulsów). Zapamiętanie stanu przekaźnika będzie opcjonalne.
a rozważysz zapis z wyborem do flash'a i Fram'u ?
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
Jak się dziś oddycha https://schimano73.aqi.eco/
https://github.com/shimano73
Awatar użytkownika
pzygmunt
Posty: 8400
Rejestracja: wt sty 19, 2016 9:26 am
Lokalizacja: Paczków
Kontaktowanie:

czw mar 05, 2020 1:31 pm

Sugeruję abstrakcyjną klasę "Storage" na bazie której zostaną utworzone np. klasy StorageEEPROM i StorageFRAM. Wtedy w zależności co użyjesz to tam się zapisze.
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

czw mar 05, 2020 1:42 pm

Tak, planowałem opcję EEPROM i FRAM. Dodatkowo z dwoma wariantami zapisu danych: często i rzadko - ze względu na specyfikę tych dwóch rodzajów pamięci.
Przykładowo stan rolet może być zapisany 1-2 min po ostatnich operacjach zmieniających ich pozycję, tak aby po ewentualnej awarii zasilania mieć informację o pozycji rolet i jednocześnie nie pisać za często do pamięci. Z drugiej strony przy FRAM można pisać aktualny stan na bieżąco.
Podobnie liczniki impulsów - EEPROM trzeba oszczędzać, a FRAM-u nie.
krycha88
Posty: 703
Rejestracja: pt lis 16, 2018 7:25 am

pt maja 22, 2020 10:17 am

klew pisze:
sob lut 15, 2020 9:03 am
Wczoraj dodałem pierwszy zarys obsługi przycisków. Kod na razie jest na moim githubie: https://github.com/klew/arduino

Na chwilę obecną pojawiła się tam klasa Supla::Control::Button z obsługą dwóch zdarzeń "ON_PRESS" i "ON_RELEASE".
Przycisk może na razie pracować z klasą Supla::Control::Relay i wywoływać akcje TURN_ON, TURN_OFF i TOGGLE.

Kod: Zaznacz cały

#include <SuplaDevice.h>
#include <supla/control/relay.h>
#include <supla/network/esp_wifi.h>
#include <supla/control/button.h>

Supla::ESPWifi wifi("ssid", "password");

const char* srv_addr        = "svr1.supla.org";
const char* srv_email       = "email@email.com";

Supla::Control::Relay relay(D9);
Supla::Control::Button button(D13, true);

void setup() {
  Serial.begin(115200);
  uint8_t mac[6];
  WiFi.macAddress(mac);
  char GUID[SUPLA_GUID_SIZE] = { ... };
  char AUTHKEY[SUPLA_AUTHKEY_SIZE] = {...};

  button.willTrigger(relay, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE);
//  button.willTrigger(relay, Supla::Control::Button::ON_RELEASE, Supla::Control::Relay::TURN_OFF);

  SuplaDevice.begin(GUID,srv_addr,srv_email,AUTHKEY);
}
void loop() {
  SuplaDevice.iterate();
}
To tylko zarys wsparcia przycisków i będzie to jeszcze rozbudowane.
Logika przycisku też działa na odwrót na chwilę obecną ;)

Do przycisku będzie można przypisać dodolne akcje i dowolną ilość triggerowanych obiektów.
Nawet termostat da się na tym zrobić ;P - ale o tym później.
Czy coś się zmieniło? bo nie chce mi się ten przykład skompilować :(

Kod: Zaznacz cały

Primary_GUI_nexo:40:63: error: 'TOGGLE' is not a member of 'Supla::Control::Relay'

   button.willTrigger(relay, Supla::Control::Button::ON_PRESS, Supla::Control::Relay::TOGGLE);

                                                               ^

exit status 1
'ON_PRESS' is not a member of 'Supla::Control::Button'
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

pt maja 22, 2020 10:21 am

krycha88 pisze:
pt maja 22, 2020 10:17 am
Czy coś się zmieniło? bo nie chce mi się ten przykład skompilować :(
Tak, zmieniło się ;). Przeniosłem enumy od zdarzeń i akcji do osobnego pliku, aby ich nie definiować w przycisku, prezkaźniku itd.
Wyrzuć namespace'y i zostaw tylko "Supla::ON_PRESS", itd. Wyedytowałem też przykład z pierwszego posta.
krycha88
Posty: 703
Rejestracja: pt lis 16, 2018 7:25 am

pt maja 22, 2020 1:23 pm

klew pisze:
pt maja 22, 2020 10:21 am
krycha88 pisze:
pt maja 22, 2020 10:17 am
Czy coś się zmieniło? bo nie chce mi się ten przykład skompilować :(
Tak, zmieniło się ;). Przeniosłem enumy od zdarzeń i akcji do osobnego pliku, aby ich nie definiować w przycisku, prezkaźniku itd.
Wyrzuć namespace'y i zostaw tylko "Supla::ON_PRESS", itd. Wyedytowałem też przykład z pierwszego posta.
Działa :)

Chciałbym obsługę przycisku zrobić wywołując jedną metodę coś w stylu addRelayButton(RELAY_PIN, BUTTON_PIN, TYPE_BTN_MONOSTABLE) aby docelowo napisać do tego obsługę GUI.

Przekształciłem kod tak aby wykorzystać vectory

Kod: Zaznacz cały

  std::vector <Supla::Control::Relay> relay;
  std::vector <Supla::Control::Button> button;
  
  relay.push_back(Supla::Control::Relay(5));
  button.push_back(Supla::Control::Button(0, true));
  button[0].willTrigger(relay[0], Supla::ON_PRESS, Supla::TOGGLE);
  
ale niestety wywala się program "Soft WDT reset"

Kod: Zaznacz cały

Decoding stack results
0x40100275: millis() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_wiring.cpp line 185
0x40100290: millis() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_wiring.cpp line 188
0x40201598: Supla::Control::Button::iterateAlways() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\src/supla/control/button.h line 45
0x40208a7b: SuplaDeviceClass::iterate() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\src\SuplaDevice.cpp line 890
0x40201644: loop() at C:\Users\kryst\Documents\Arduino\Primary_GUI_nexo/Primary_GUI_nexo.ino line 55
0x40211048: loop_wrapper() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 180
@klew podpowiesz kolejny raz jak to ogarnąć? :)
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

pt maja 22, 2020 2:05 pm

krycha88 pisze:
pt maja 22, 2020 1:23 pm

@klew podpowiesz kolejny raz jak to ogarnąć? :)
Wywołanie konstruktora nie alokuje pamięci na obiekt. Daj tam jakieś "new" ;)
krycha88
Posty: 703
Rejestracja: pt lis 16, 2018 7:25 am

pt maja 22, 2020 6:58 pm

klew pisze:
pt maja 22, 2020 2:05 pm
Wywołanie konstruktora nie alokuje pamięci na obiekt. Daj tam jakieś "new" ;)
A zabrakło :) poniższy kod się kompiluje i nie wywala:

Kod: Zaznacz cały

  std::vector <Supla::Control::Relay *> relay;
  std::vector <Supla::Control::Button *> button;

  relay.push_back(new Supla::Control::Relay(5));
  button.push_back(new Supla::Control::Button(0, true));
Niestety ale pojawił się kolejny problem z przekazaniem vektora relay do willTrigger :(

Kod: Zaznacz cały

  button[0]->willTrigger(relay[0], Supla::ON_PRESS, Supla::TOGGLE);
Awatar użytkownika
klew
Posty: 829
Rejestracja: czw cze 27, 2019 12:16 pm

pt maja 22, 2020 9:11 pm

krycha88 pisze:
pt maja 22, 2020 6:58 pm
Metoda przyjmuje referencję na obiekt, więc trzeba wskaźnik potraktować gwiazdką *
krycha88
Posty: 703
Rejestracja: pt lis 16, 2018 7:25 am

sob maja 23, 2020 9:05 am

klew pisze:
pt maja 22, 2020 9:11 pm
Metoda przyjmuje referencję na obiekt, więc trzeba wskaźnik potraktować gwiazdką *

Kod: Zaznacz cały

  std::vector <Supla::Control::Relay *> relay;
  std::vector <Supla::Control::Button *> button;

  void setup() {
    relay.push_back(new Supla::Control::Relay(5));
    button.push_back(new Supla::Control::Button(0, true));

    button[0]->willTrigger(*relay[0], Supla::ON_PRESS, Supla::TOGGLE);
  }
Udało się, kod się kompiluje i nie wywala po wgraniu ale niestety nie wywołuje się trigger.
ODPOWIEDZ