Brak możliwości zdefiniowania callback'ów

Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: wt lut 04, 2020 12:17 pm
klew pisze: wt lut 04, 2020 11:50 am
krycha88 pisze: wt lut 04, 2020 11:11 am
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.
Ok, to może zmienię w bibliotekach nazwy metod "getValue" na "readValueFromDevice" i dodam "getLastReadValue" jako metodę do czytania ostatniego odczytu.
Teoretycznie getValue też można użyć w większości przypadków, ale przy DS-ach może to powodować problemy.
Trzeba by też poprawić troche "publiczność" i "prywatność" metod, aby tego typu kombinacje były bezpieczne.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

zawsze operowałem na ostatniej wartości i to się sprawdzało. Twoja propozycja rozwiązałaby moje problemy :) jeszcze raz dzieki!
https://gui-generic-builder.supla.io/
krycha88
Posty: 5187
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ć.
Taki sposób definiowana jest bardzo problematyczny. Potrzebuję stworzyć dynamiczną tablicę obiektów i na niej operować coś w stylu:

Kod: Zaznacz cały

  Supla::Sensor::DS18B20 *sensor = new Supla::Sensor::DS18B20[MAX_DS18B20];

  for (int i = 0; i < MAX_DS18B20; ++i)
  {
    sensor[i] = Supla::Sensor::DS18B20(pin ds1addr[i]);
  }
Niestety ale program się ciągle wywala Soft WDT reset ...

Kod: Zaznacz cały


Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x4020c7e7: DallasTemperature::getAddress(unsigned char*, unsigned char) at C:\Users\kryst\Documents\Arduino\libraries\DallasTemperature\DallasTemperature.cpp line 130
EXCVADDR: 0x00000014

Decoding stack results
0x4020aa65: supla_log(int, char const*, ...) at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\supla-common/log.cpp line 254
0x40100a88: malloc(size_t) at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\umm_malloc\umm_malloc.cpp line 511
0x40201494: Supla::Sensor::DS18B20::getValue() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice/supla/sensor/DS18B20.h line 157
0x402017b1: Supla::Sensor::DS18B20::onInit() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice/supla/sensor/DS18B20.h line 183
0x40208e65: SuplaDeviceClass::begin(char*, char const*, char const*, char*, unsigned char) at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\SuplaDevice.cpp line 310
0x4020a7bc: Supla::data_read(void*, int, void*) at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\network.cpp line 28
0x4020a85c: Supla::data_write(void*, int, void*) at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\network.cpp line 32
0x4020a8b8: Supla::message_received(void*, unsigned int, unsigned int, void*, unsigned char) at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice\network.cpp line 44
0x40201b38: setup() at C:\Users\kryst\Documents\Arduino\libraries\SuplaDevice/supla/network/esp_wifi.h line 37
0x40201b81: setup() at C:\Users\kryst\Documents\Arduino\Primary_GUI_nexo/Primary_GUI_nexo.ino line 94
0x4020fdd8: loop_wrapper() at C:\Users\kryst\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.6.3\cores\esp8266\core_esp8266_main.cpp line 177

https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

Spróbuj zrobić tablicę wskaźników:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 * dsSensors[MAX_DS_COUNT];

for (int i = 0; i < MAX_DS_COUNT; i++) {
  dsSensors[i] = new Supla::Sensor::DS18B20(pin1, ds1Addr[i]);
}
Albo użyj kontenerów z biblioteki standardowej (np. std::vector). Z tego co kojarzę, to kompilator na ESP w Arduino ma implementację tych kontenerów. Tylko na płytki Arduino nie ma tych kontenerów. Sprawdź też czy program zbytnio nie rośnie.
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: pn lut 10, 2020 7:14 pm Spróbuj zrobić tablicę wskaźników:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 * dsSensors[MAX_DS_COUNT];

for (int i = 0; i < MAX_DS_COUNT; i++) {
  dsSensors[i] = new Supla::Sensor::DS18B20(pin1, ds1Addr[i]);
}
Albo użyj kontenerów z biblioteki standardowej (np. std::vector). Z tego co kojarzę, to kompilator na ESP w Arduino ma implementację tych kontenerów. Tylko na płytki Arduino nie ma tych kontenerów. Sprawdź też czy program zbytnio nie rośnie.
Dzięki wielkie teraz działa! Znowu mi pomogłeś :)
https://gui-generic-builder.supla.io/
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

krycha88 pisze: pn lut 10, 2020 7:21 pm
klew pisze: pn lut 10, 2020 7:14 pm Spróbuj zrobić tablicę wskaźników:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 * dsSensors[MAX_DS_COUNT];

for (int i = 0; i < MAX_DS_COUNT; i++) {
  dsSensors[i] = new Supla::Sensor::DS18B20(pin1, ds1Addr[i]);
}
Albo użyj kontenerów z biblioteki standardowej (np. std::vector). Z tego co kojarzę, to kompilator na ESP w Arduino ma implementację tych kontenerów. Tylko na płytki Arduino nie ma tych kontenerów. Sprawdź też czy program zbytnio nie rośnie.
Dzięki wielkie teraz działa! Znowu mi pomogłeś :)
Wyszło na to, że nie znam rozmiaru tablicy przy starcie programu więc zrobiłem to w następujący sposób:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 * dsSensors;

setup() {
dsSensors = (Supla::Sensor::DS18B20*)malloc( sizeof( Supla::Sensor::DS18B20 ) *  MAX_DS_COUNT);

	for (int i = 0; i < MAX_DS_COUNT; i++) {
  	dsSensors = new Supla::Sensor::DS18B20(pin1, ds1Addr[i]);
	}
}
Może się komuś przyda:)
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: śr lut 26, 2020 8:21 pm
Wyszło na to, że nie znam rozmiaru tablicy przy starcie programu więc zrobiłem to w następujący sposób:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 * dsSensors;

// CENZURA
Może się komuś przyda:)
;)

Nie rób tak... Szczerze powiem, że jeśli masz tam więcej niż jeden ds to nie mam pojęcia czemu to może działać.
Napiszę niedługo przykład jak to zrobić
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: śr lut 26, 2020 9:35 pm Nie rób tak... Szczerze powiem, że jeśli masz tam więcej niż jeden ds to nie mam pojęcia czemu to może działać.
Napiszę niedługo przykład jak to zrobić
Działa jako tako :D :D nie kombinuje już poczekam cierpliwie :)
https://gui-generic-builder.supla.io/
Awatar użytkownika
klew
Posty: 8184
Rejestracja: czw cze 27, 2019 12:16 pm
Lokalizacja: Wrocław

krycha88 pisze: śr lut 26, 2020 9:52 pm
Działa jako tako :D :D nie kombinuje już poczekam cierpliwie :)
W Twoim kodzie obiekty DS'ów są tworzone i one będą działać, natomiast wskaźnik dsSensors będzie wskazywał na tylko jeden obiekt - ostatnio stworzony DS.

Piszesz, że nie znasz wielkości tablicy, a tworzysz MAX_DS_COUNT obiektów, więc jest to trochę niespójne.

Jeśli nie potrzebujesz w kodzie odwoływać się do DS'ów, to wystarczy w pętli stworzyć odpowiednią ilość DSów:

Kod: Zaznacz cały

for (int i = 0; i < dsCount; i++) {
  new Supla::Sensor::DS18B20(dsPin[i], dsAddr[i]);
}
Przy czym zakładam, że wcześniej zainicjalizowałeś tablicę dsPin oraz dsAddr.

Jeśli natomiast chcesz się odwoływać do tych obiektów (np. czytać wartość i ją pokazać w web interface, albo na oled), to trzeba wskaźniki do tych obietków zapisać. Jeśli mamy ograniczenie do MAX_DS_COUNT, to:

Kod: Zaznacz cały

Supla::Sensor::DS18B20 *dsSensors[MAX_DS_COUNT];

void setup() {
  ....
  if (dsCount <= MAX_DS_COUNT) {
    for (int i = 0; i < dsCount; i++) {
      dsSensors[i] = new Supla::Sensor::DS18B20(dsPin[i], dsAddr[i]);
    }
  }
  ...
}
Jeśli nie chcesz się ograniczać do MAX_DS_COUNT, to w kompilatorze C++ na Arudino na ESP działają standardowe kontenery. Można więc użyć vector:

Kod: Zaznacz cały

std::vector<Supla::Sensor::DS18B20 *> dsSensors;

void setup() {
  ....
  for (int i = 0; i < dsCount; i++) {
    dsSensors.push_back(new Supla::Sensor::DS18B20(dsPin[i], dsAddr[i]));
  }
  ...
}

// aby dostać się do DSa, wystarczy:
dsSensors[4]->metodaOdpalanaNaDS18B20();
Kodu nie kompilowałem, także mogą tam być błędy
Widzimy się na Supla Offline Party vol. 2 :!:
krycha88
Posty: 5187
Rejestracja: pt lis 16, 2018 7:25 am
Kontakt:

klew pisze: śr lut 26, 2020 11:02 pm Jeśli nie chcesz się ograniczać do MAX_DS_COUNT, to w kompilatorze C++ na Arudino na ESP działają standardowe kontenery. Można więc użyć vector:

Kod: Zaznacz cały

std::vector<Supla::Sensor::DS18B20 *> dsSensors;

void setup() {
  ....
  for (int i = 0; i < dsCount; i++) {
    dsSensors.push_back(new Supla::Sensor::DS18B20(dsPin[i], dsAddr[i]));
  }
  ...
}

// aby dostać się do DSa, wystarczy:
dsSensors[4]->metodaOdpalanaNaDS18B20();
Oczywiście to rozwiązanie działa bardzo dobrze. Dzięki jeszcze raz :)
https://gui-generic-builder.supla.io/
ODPOWIEDZ

Wróć do „Arduino IDE”