Forum: Mikrocontroller und Digitale Elektronik Arduino (ESP8266): Funktionspointer für Klassendefinition


von Andreas K. (necromancer1982)


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

: Verschoben durch User
von Andreas K. (necromancer1982)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.