mikrocontroller.net

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


Autor: Andreas K. (necromancer1982)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich würde mir mit folgendem C-Code gerne einen Timer basteln:

class Timer {
  unsigned long interval;
  unsigned long previousMillis;

  public:
  Timer(unsigned long inter, void cb()) {
    previousMillis = 0;
    interval = inter;
    
  }
  void Check() {
    unsigned long currentMillis = millis();

    if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;   
      Callback();
    }
  }
};

void testCB() {
  Serial.println("Trigger");
}

Timer timer1(1000, testCB);

void setup() {
  Serial.begin(115200);
}

void loop() {
  timer1.Check();
}


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 Moderator
Autor: Andreas K. (necromancer1982)
Datum:

Bewertung
0 lesenswert
nicht 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:
class Timer {
  unsigned long interval;
  unsigned long previousMillis;
  void(*callback)();

  public:
  Timer(unsigned long inter, void cb()) {
    previousMillis = 0;
    interval = inter;
    callback = cb;
    
  }
  void Check() {
    unsigned long currentMillis = millis();

    if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;   
      (*callback)();
    }
  }
};

void testCB() {
  Serial.println("Trigger");
}

Timer timer1(1000, testCB);

void setup() {
  Serial.begin(115200);
}

void loop() {
  timer1.Check();
}

Gruß Andreas

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.