2017-06-04 8 views
0

Ich benutze die Arduino IDE und die Dinge Netzwerk Arduino-Bibliothek, um ein LoRa-Mote zu erstellen.C++ - Callback zu Klassenfunktion

Ich habe eine Klasse erstellt, die alle LoRa-Funktionen behandeln sollte. In dieser Klasse muss ich einen Rückruf behandeln, wenn ich eine Downlink-Nachricht erhalte. Die ttn-Bibliothek hat die onMessage-Funktion, die ich in meiner init-Funktion einrichten und eine andere Funktion analysieren möchte, die ein Klassenmember namens Nachricht ist. Ich erhalte den Fehler "ungültige Verwendung der nicht statischen Mitgliedsfunktion".

// File: LoRa.cpp 
#include "Arduino.h" 
#include "LoRa.h" 
#include <TheThingsNetwork.h> 

TheThingsNetwork ttn(loraSerial,debugSerial,freqPlan); 

LoRa::LoRa(){ 
} 

void LoRa::init(){ 
    // Set the callback 
    ttn.onMessage(this->message); 
} 

// Other functions 

void LoRa::message(const uint8_t *payload, size_t size, port_t port) 
{ 
    // Stuff to do when reciving a downlink 
} 

und die Header-Datei

// File: LoRa.h 
#ifndef LoRa_h 
#define LoRa_h 

#include "Arduino.h" 
#include <TheThingsNetwork.h> 

// Define serial interface for communication with LoRa module 
#define loraSerial Serial1 
#define debugSerial Serial 


// define the frequency plan - EU or US. (TTN_FP_EU868 or TTN_FP_US915) 
#define freqPlan TTN_FP_EU868 



class LoRa{ 
    // const vars 



    public: 
    LoRa(); 

    void init(); 

    // other functions 

    void message(const uint8_t *payload, size_t size, port_t port); 

    private: 
    // Private functions 
}; 


#endif 

ich versucht habe:

ttn.onMessage(this->message); 
ttn.onMessage(LoRa::message); 
ttn.onMessage(message); 

jedoch keiner von ihnen, wie ich erwartet hatte, gearbeitet.

+3

Für eine nicht statische Elementfunktion muss ein * Objekt * aufgerufen werden. Wenn Sie kein Objekt haben, können Sie nicht-statische Elementfunktionen nicht verwenden. Sobald Sie ein Objekt haben, schlage ich vor, dass Sie in ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) und [' std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind). –

Antwort

0

I Das Problem wurde gelöst, indem die Nachrichtenfunktion zu einer normalen Funktion außerhalb der Klasse gemacht wurde. Nicht sicher, ob es eine gute Übung ist - aber es funktioniert.

// File: LoRa.cpp 
#include "Arduino.h" 
#include "LoRa.h" 
#include <TheThingsNetwork.h> 

TheThingsNetwork ttn(loraSerial,debugSerial,freqPlan); 

void message(const uint8_t *payload, size_t size, port_t port) 
{ 
    // Stuff to do when reciving a downlink 
} 

LoRa::LoRa(){ 
} 

void LoRa::init(){ 
    // Set the callback 
    ttn.onMessage(message); 
} 
0

sollten Sie Argumente übergeben zu massieren, wie durch Prototyp angegeben:

void message(const uint8_t *payload, size_t size, port_t port);

Massage kehrt Leere Da sollte nicht probabaly auf andere Funktion Verwendung als Argument sein.

2

Sie versuchen, eine Memberfunktion (dh eine Funktion eines Members eines Klassentyps) aufzurufen, ohne ein Klassenmitglied zu verwenden. Das heißt, was man in der Regel tun, ist ein Mitglied der Klasse instanziiert LoRa zuerst, dann rufen Sie es mögen:

LoRa loraMember;  
loraMember.message(); 

Da Sie versuchen, diese Funktion zu rufen aus dem Inneren der Klasse selbst, ohne ein Mitglied die Klasse Aufruf der init(), müssen Sie die Funktion statisch machen wie:

static void message(const uint8_t *payload, size_t size, port_t port); 

Dann können Sie LoRa :: Nachricht() von überall, solange es ist öffentlich nutzen, sondern fordern, wie es nur das gibt Sie einen anderen Compilerfehler, da die Schnittstelle der Nachricht nach "const uint8_t * payload, size_t size, port_t port" fragt. Also, was Sie tun müssen, würde, ist Rufnachricht wie:

LoRa::message(payloadPointer, sizeVar, portVar);` 

Wenn Sie ttn.onMessage (Function) nennen, was passiert ist, dass der Aufruf der Funktion ausgewertet wird, was dann von dieser Funktion zurückgegeben wird wird gesetzt in die Klammern und ttn.onMessage wird damit aufgerufen. Da Ihre LoRa :: -Nachrichtfunktion nichts (void) zurückgibt, erhalten Sie hier einen weiteren Fehler.

Ich schlage vor, ein gutes Buch über C++ Grundlagen für den Einstieg - book list

Viel Glück!

Verwandte Themen