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.
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). –