Arduino (ESP8266): Funktionspointer für Klassendefinition

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren