C ++ / Arduino中的第一个项目来自JavaScript背景。我在使用这段代码时遇到了一些问题!我收到了这个错误:
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上共享(静态)。
答案 0 :(得分:0)
解决方案是将您的Pad :: change_callback转换为静态的。但是如果你这样做,你必须将fade_val的范围也改为静态,不管怎么说它对你来说都是有问题的。另一个解决方案是在std::mem_fun object中包含Pad :: change_callback,但是您需要再次将此对象的范围定义为static。
我的感觉是你有静态的单一资源,比如连接到电路板的传感器,需要在产生这种冲突静态/实例的不同实例对象之间共享它。如果是,则解决方案是静态跟踪,这是当时分配给传感器的当前实例。最简单的方法是将分配的实例放在静态变量中,以便在静态函数调用中找到。
当然,如果您在整个程序中只有一个Pad实例,请将Pad设为singleton或编写一个单一的轮询以便轻松处理该单个实例。
答案 1 :(得分:0)
Lambda函数是这里的方法。不幸的是,自动机API不允许使用lambdas捕获[this]。
有一个功能请求,https://github.com/tinkerspy/Automaton/issues/17,也许我找到一些时间来实现它。