Arduino (ESP8266): Funktionspointer für Klassendefinition

OP #5705305
Lesenswert?
• ▲
▼
Hallo zusammen,
ich würde mir mit folgendem C-Code gerne einen Timer basteln:

1
class Timer {
2
  unsigned long interval;
3
  unsigned long previousMillis;
4

5
  public:
6
  Timer(unsigned long inter, void cb()) {
7
    previousMillis = 0;
8
    interval = inter;
9
    
10
  }
11
  void Check() {
12
    unsigned long currentMillis = millis();
13

14
    if(currentMillis - previousMillis > interval) {
15
      previousMillis = currentMillis;   
16
      Callback();
17
    }
18
  }
19
};
20

21
void testCB() {
22
  Serial.println("Trigger");
23
}
24

25
Timer timer1(1000, testCB);
26

27
void setup() {
28
  Serial.begin(115200);
29
}
30

31
void loop() {
32
  timer1.Check();
33
}

Bei der Initialisierung des Timers soll die Dauer in Millisekunden und 
die auszuführende Callbackfunktion übergeben werden...

Und genau hier habe ich mein Problem.

Wie übergebe ich die Funktion (Name bzw. Zeiger der Callback) an die 
Klasse bzw. die Member-Funktion Check(), so daß diese dann entsprechend 
ausgeführt wird??

Zur Verdeutlichung:
void testCB() ist die auszuführende Callback-Funktion wenn der Timer 
auslöst


Danke schon mal für eure Antworten und entschuldigt meine Unwissenheit 
:-)
Gruß Andreas
OP #5705427
Lesenswert?
• ▲
▼
Tja, so ist das...
...da sucht man den ganzen Vormittag nach einer Lösung und kaum hat man 
im Forum gefragt, findet man die Lösung selbst...

So funktionierts:
1
class Timer {
2
  unsigned long interval;
3
  unsigned long previousMillis;
4
  void(*callback)();
5

6
  public:
7
  Timer(unsigned long inter, void cb()) {
8
    previousMillis = 0;
9
    interval = inter;
10
    callback = cb;
11
    
12
  }
13
  void Check() {
14
    unsigned long currentMillis = millis();
15

16
    if(currentMillis - previousMillis > interval) {
17
      previousMillis = currentMillis;   
18
      (*callback)();
19
    }
20
  }
21
};
22

23
void testCB() {
24
  Serial.println("Trigger");
25
}
26

27
Timer timer1(1000, testCB);
28

29
void setup() {
30
  Serial.begin(115200);
31
}
32

33
void loop() {
34
  timer1.Check();
35
}

Gruß Andreas

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.