18-03-2022, 12:31
Dzień dobry. W oparciu o materiały ze strony embeddeddev.pl zrobiłem menu sterowane przyciskami, oparte o listę dwukierunkową. Mam strukturę elementu listy, listę elementów, funkcje sterujące i jest ok.
W ramach nauki chciałem to wszystko wrzucić do klasy. Stworzyłem więc klasę i mam kłopot. Nawigacja po menu w oparciu o klasę działa ale nie potrafię ogarnąć wywołania funkcji zwrotnych przypisanych do konkretnych elementów menu.
Wykładam się na próbie wywołania metody obsługi elementu z metody wykorzystywanej do nawigacji.
W metodzie 'enter' próbuję wywołać metodę 'clockCallback' przypisaną do elementu na poziomie jego definicji przy pomocy wskaźnika. Gdy próbuję wywołać metodę 'standardowo' to kompilator wyrzuca błąd 1, gdy wywołuję ją zgodnie z sugestią kompilatora dostaję błąd 2.
Proszę o sugestię czy w ogóle da się to w ten sposób zrobić? Programowaniem arduino zajmuję się od niedawna i nie potrafię ocenić czy problem leży tylko w odpowiednim wywołaniu metody czy ogólnie sposób w jaki próbuję to zrobić jest zły?
Gdy w strukturze elementu zamiast wskaźnika do metody wstawię wskaźnik do funkcji zewnętrznej to bez problemu metoda 'enter' wywołuje tę funkcję i wszystko działa.
W ramach nauki chciałem to wszystko wrzucić do klasy. Stworzyłem więc klasę i mam kłopot. Nawigacja po menu w oparciu o klasę działa ale nie potrafię ogarnąć wywołania funkcji zwrotnych przypisanych do konkretnych elementów menu.
Wykładam się na próbie wywołania metody obsługi elementu z metody wykorzystywanej do nawigacji.
W metodzie 'enter' próbuję wywołać metodę 'clockCallback' przypisaną do elementu na poziomie jego definicji przy pomocy wskaźnika. Gdy próbuję wywołać metodę 'standardowo' to kompilator wyrzuca błąd 1, gdy wywołuję ją zgodnie z sugestią kompilatora dostaję błąd 2.
Proszę o sugestię czy w ogóle da się to w ten sposób zrobić? Programowaniem arduino zajmuję się od niedawna i nie potrafię ocenić czy problem leży tylko w odpowiednim wywołaniu metody czy ogólnie sposób w jaki próbuję to zrobić jest zły?
Gdy w strukturze elementu zamiast wskaźnika do metody wstawię wskaźnik do funkcji zewnętrznej to bez problemu metoda 'enter' wywołuje tę funkcję i wszystko działa.
Kod:
typedef struct menuElement {
const char *name;
menuElement *prev;
menuElement *next;
menuElement *parent;
menuElement *child;
void (Menu::*callbackFn)();
} menuE;
class Menu {
private:
menuE menu1 = {"CLOCK", &menu2, &menu2, NULL, NULL, &Menu::clockCallback};
menuE menu2 = {"TERMOMETER", &menu1, NULL, NULL, NULL, NULL};
menuE *cPointer = &menu1;
public:
Menu() {}
void clockCallback(){
Serial.println("clockCallback");
}
void enter(){
// 1 - error: must use '.*' or '->*' to call pointer-to-member function
cPointer->callbackFn();
// 2 - error: 'callbackFn' was not declared in this scope
cPointer->*callbackFn();
}
};