1

第一个来自 JavaScript 背景的 C++/Arduino 项目。我对这段代码有一些问题!我收到此错误:

C:\Users\Owner\Documents\Arduino\libraries\Pad\Pad.cpp:48:55: error: invalid use of non-static member function

sensor.begin( 15, 5 ).onChange( change_callback, 3 );

这是cpp:

#include "Pad.h"
#include "Arduino.h"
#include "FastLED.h"
#include "Automaton.h"

extern CRGB leds[64];

Pad::Pad(int val) {
   _val = val;
   _default = CHSV(random(255), 255, 255);
   _cnt = 0;
   fade = false;
  fade_val = 0;
}

void Pad::change_callback( int idx, int v, int up ) {
    Serial.println(v);
    fade_val = v;
}

void Pad::color() {
  my_leds[0] = CHSV(random(255),255,255);
  fade = true;
}

void Pad::init() {
    for(int a = 0 ; a < 8 ; a++) {
      my_leds[a] = _default;
    }
  sensor.begin( 15, 5 ).onChange( change_callback, 3 );
}

void Pad::render() {
    if(fade) {
        int v = map(fade_val, 0, 1023, 0, 255);
        my_leds[0] = CHSV(127,255, v);
        _cnt++;
    }
}

我曾尝试制作change_callback一个静态函数,但随后会导致错误fade_val,这是一个公共类成员。我有一种感觉,这与指针有关,我仍在纠结。重要的是每个 Pad 实例都有自己的传感器和自己的 fade_val - 它们不能在每个 Pad 之间共享(静态)。

4

2 回答 2

0

Lambda 函数是这里的必经之路。不幸的是,自动机 API 还不允许将 lambdas 与捕获的 [this] 一起使用。

对此有一个功能请求,https://github.com/tinkerspy/Automaton/issues/17,也许我会找到一些时间来实现它。

于 2017-12-09T21:12:35.920 回答
0

解决方案是将您的 Pad::change_callback 转换为静态的。但是如果你这样做,你必须将fade_val的范围也更改为静态,这对你来说是有问题的。另一种解决方案是将 Pad::change_callback 包含在std::mem_fun object中,但您需要再次将此对象的范围定义为静态。

我的感觉是你有静态的单一资源,比如连接到板上的传感器,需要在不同的实例对象之间共享它,从而产生这种冲突的静态/实例。如果是,则解决方案是静态跟踪在该时间分配给传感器的当前实例。最简单的方法是将分配的实例放在静态变量中,以便在静态函数调用中找到。

当然,如果您在整个程序中只有一个 Pad 实例,请将 Pad 设置为单例或编写一个单一大小的轮询,以便轻松处理该单个实例。

于 2017-10-19T06:07:47.143 回答