Brak możliwości zdefiniowania callback'ów

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

Post

krycha88 wrote: Tue Feb 04, 2020 12:17 pm
klew wrote: Tue Feb 04, 2020 11:50 am
krycha88 wrote: Tue Feb 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:

Code: Select all

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.
krycha88
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

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
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Tue Feb 04, 2020 11:50 am
krycha88 wrote: Tue Feb 04, 2020 11:11 am
klew wrote: Tue Feb 04, 2020 9:36 am

Code: Select all

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:

Code: Select all

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:

Code: Select all

  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 ...

Code: Select all


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/
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

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

Code: Select all

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.
krycha88
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Mon Feb 10, 2020 7:14 pm Spróbuj zrobić tablicę wskaźników:

Code: Select all

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
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

krycha88 wrote: Mon Feb 10, 2020 7:21 pm
klew wrote: Mon Feb 10, 2020 7:14 pm Spróbuj zrobić tablicę wskaźników:

Code: Select all

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:

Code: Select all

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/
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Feb 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:

Code: Select all

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ć
krycha88
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Wed Feb 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/
User avatar
klew
Posts: 10022
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław

Post

krycha88 wrote: Wed Feb 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:

Code: Select all

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:

Code: Select all

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:

Code: Select all

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
krycha88
Posts: 5417
Joined: Fri Nov 16, 2018 7:25 am

Post

klew wrote: Wed Feb 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:

Code: Select all

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/

Return to “Arduino IDE”