Неправильное использование нестатической функции-члена — Arduino — Automaton

Первый проект на 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.

1

Решение

Решением является преобразование вашего Pad :: change_callback в статический. Но если вы сделаете это, вы должны также изменить область действия fade_val на статическую, и это как-то проблематично для вас. Другое решение — заключить Pad :: change_callback в объект std :: mem_fun, но опять же вам нужно определить область действия этого объекта как статическую.

Я чувствую, что у вас есть статические ресурсы типа «один-один», например датчик, подключенный к плате, и вам нужно делить его между различными объектами экземпляров, генерирующими этот тип конфликта static / instance. Если да, решение статически отслеживает, который является текущим экземпляром, назначенным датчику в это время. Самый простой способ сделать это — поместить назначенный экземпляр в статическую переменную, чтобы найти его внутри вызова статической функции.

И, конечно, если у вас есть только один экземпляр Pad во всей программе, сделайте Pad a одиночка или закодируйте опрос одного размера, чтобы упростить обработку этого единственного экземпляра.

0

Другие решения

Лямбда-функции — путь сюда. К сожалению, API-интерфейс автомата пока не позволяет использовать лямбды с захваченным [этим].

Был запрос функции для этого, https://github.com/tinkerspy/Automaton/issues/17, может быть, я найду время для этого.

0