作为Arduino回调Bluefruit库的功能指针Arduino

问题描述 投票:0回答:1

我一直试图将回调传递给Bluefruit库中的setConnectCallback()函数。当我将函数名称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!
c++ pointers arduino function-pointers member-function-pointers
1个回答
1
投票

setConnectCallback正在寻找静态函数指针。如错误消息所述,您正在向其传递非静态函数指针。

您的回调函数必须是静态函数-自由函数或专门指定为“静态”的类函数,因此无法访问类变量。

这是一个棘手的API,因为它看起来也像函数参数列表是(void),这意味着您没有办法传入索引或指针来将其绑定到类实例。您只能获得一个针对静态函数的回调,而代码则取决于该回调可能针对的类实例。

因此,您的connect_callback函数将无法在回调中设置类变量isConnected。您将只能访问全局/静态变量。

我希望begin()和loop()函数调用也是静态的非类函数。似乎您正在尝试将类包装器放到不一定是类的代码周围。

© www.soinside.com 2019 - 2024. All rights reserved.