Указатель на функцию Arduino в качестве библиотеки обратного вызова Bluefruit - PullRequest
0 голосов
/ 14 апреля 2020

Я пытался передать обратный вызов функции setConnectCallback() в библиотеке Bluefruit. Когда я передаю имена функций connect_callback в setConnectCallback(), я получаю сообщение об ошибке invalid use of non-static member function of type 'void (AumeBluetooth::)()'

Функция setConnectCallback() выглядит так, как будто она запрашивает указатель функции:

извлечение из Библиотека Adafruit_BLE Arduino:

/******************************************************************************/
/*!
    @brief  Set handle for connect callback
    @param[in] fp function pointer, NULL will discard callback
*/
/******************************************************************************/
void Adafruit_BLE::setConnectCallback( void (*fp) (void) )
{
  this->_connect_callback = fp;
  install_callback(fp != NULL, EVENT_SYSTEM_CONNECT, -1);
}

У меня определен класс "AumeBluetooth", который я попытался реализовать указателем на функцию для вызова connect_callback:

.h

class AumeBluetooth {


  public:

    bool isConnected = false;
    Adafruit_BluefruitLE_SPI *_ble;
    void error(const __FlashStringHelper*err);
    void begin();
    AumeBluetooth();
    void loop();
    void connect_callback(void);

};

. cpp

#include "AumeBluetooth.h"
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"


AumeBluetooth::AumeBluetooth() {

}


void AumeBluetooth::begin() {

  isConnected = false;

  Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
  _ble = &ble;

   if ( !_ble->begin() )
  {
    error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
  }

  _ble->echo(false);

  _ble->info();
  _ble->setMode(BLUEFRUIT_MODE_DATA);

  void (AumeBluetooth::*cc)(void) = &AumeBluetooth::connect_callback;
  ble.setConnectCallback(this->*cc);


}

void AumeBluetooth::connect_callback(void) {

       Serial.print("BLUETOOTH IS CONNECTED"); 
       isConnected = true;
}

}

Not sure what to do try next. Thanks!

1 Ответ

1 голос
/ 14 апреля 2020

setConnectCallback ищет указатель на функцию c. Как говорится в сообщении об ошибке, вы передаете ему указатель функции не-stati c.

Ваша функция обратного вызова должна быть функцией stati c - либо свободной функцией, либо функцией класса, которая Обозначается 'stati c' и, следовательно, не имеет доступа к переменным класса.

Это сложный API, потому что он также выглядит как список параметров функции (void), что означает, что у вас нет способ передать в индекс или указатель на t ie это экземпляр класса. Вы получаете только один обратный вызов функции stati c, и ваш код должен знать, для какого экземпляра класса может использоваться обратный вызов.

Итак, ваша функция connect_callback не сможет установить переменную класса isConnected внутри обратного вызова. Вы сможете получить доступ только к глобальным / stati c переменным.

Я ожидаю, что вызовы функций begin () и l oop () также будут stati c, не относящимися к классу. Похоже, что вы пытаетесь поместить оболочку класса вокруг кода, который не должен быть классом.

...