2017-06-04 4 views
0

J'utilise l'IDE Arduino et la bibliothèque réseau arduino pour créer un mot LoRa.Fonction de rappel C++ vers la classe

J'ai créé une classe qui devrait gérer toutes les fonctions liées à LoRa. Dans cette classe, je dois gérer un rappel si je reçois un message de liaison descendante. La bibliothèque ttn possède la fonction onMessage que je veux configurer dans ma fonction init et analyser une autre fonction, qui est un membre de la classe, appelée message. Je reçois l'erreur "utilisation invalide de la fonction membre non statique".

// 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 
} 

et le fichier d'en-tête

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

J'ai essayé:

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

Cependant, aucun d'entre eux travaillaient comme je l'avais prévu.

+3

Une fonction membre non statique nécessite un * objet * à appeler. Si vous n'avez pas d'objet, vous ne pouvez pas utiliser de fonctions membres non statiques. Une fois que vous avez un objet, je vous suggère de regarder dans ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) et [' std :: bind'] (http://en.cppreference.com/w/cpp/utility/functional/bind). –

Répondre

0

I Résolution du problème en faisant du message une fonction normale en dehors de la classe. Je ne sais pas si c'est une bonne pratique - mais cela fonctionne.

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

Vous devriez passer des arguments au massage comme indiqué par prototype:

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

Depuis les retours de massage vide, devrait probabaly pas être utilisé comme argument pour une autre fonction.

2

Vous essayez d'appeler une fonction membre (c'est-à-dire une fonction appartenant à un membre d'un type de classe) sans utiliser de membre de classe. Cela signifie, ce que vous faites habituellement est instancier un membre de votre classe LoRa d'abord, puis l'appeler comme:

LoRa loraMember;  
loraMember.message(); 

Depuis que vous essayez d'appeler cette fonction à l'intérieur de la classe elle-même, sans membre la classe appelant le init(), vous devez faire la statique fonction comme:

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

Ensuite, vous pouvez utiliser LoRa :: message() où que vous soyez aussi longtemps qu'il est public, mais l'appeler comme ça donnera vous une autre erreur de compilation, puisque l'interface du message demande "const uint8_t * payload, size_t size, port port_t". Donc ce que vous avez à faire est un message d'appel comme:

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

Lorsque vous appelez ttn.onMessage (FunctionCall) ce qui se passe est que l'appel de fonction s'évalué, alors ce qui est retourné par cette fonction se mettre dans les parenthèses et ttn.onMessage est appelé avec cela. Puisque votre fonction LoRa :: message ne renvoie rien (void), vous obtiendrez une autre erreur ici.

Je propose un bon livre sur les bases C++ de vous aider à démarrer - book list

Bonne chance!