2017-10-18 2 views
1

Erstes Projekt in C++/Arduino mit JavaScript-Hintergrund. Ich habe einige Probleme mit diesem Code! Ich bin diesen Fehler:Ungültige Verwendung der nicht statischen Elementfunktion - Arduino - Automaton

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); 

Hier ist der cav:

#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++; 
    } 
} 

Ich habe versucht, change_callback eine statische Funktion zu machen, aber dann die Fehler mit fade_val verursacht, die eine öffentliche Klasse Mitglied ist. Ich habe das Gefühl, dass das mit den Zeigern zu tun hat, um die ich mich immer noch kümmere. Es ist wichtig, dass jede Instanz von Pad über einen eigenen Sensor verfügt und über fade_val verfügt - sie können nicht über jedes Pad gemeinsam genutzt werden (statisch).

+0

Sie benötigen einen Verweis auf Ihr Pad-Objekt. Sie sollten wahrscheinlich eine statische Funktion verwenden und das Pad * als Benutzerparameter verwenden. –

+0

Hey Garr, kannst du das Pad * als Benutzerparameter näher erläutern? –

Antwort

0

Die Lösung besteht darin, Pad :: change_callback in eine statische umzuwandeln. Aber wenn Sie es tun, müssen Sie den Bereich von fade_val auch auf statisch ändern und irgendwie ist es für Sie problematisch. Eine andere Lösung ist, Pad :: change_callback in eine std::mem_fun object einzufügen, aber wiederum müssen Sie den Gültigkeitsbereich dieses Objekts als statisch definieren.

Meine Gefühle sind, dass Sie statische Single-One-Ressourcen haben, wie ein Sensor an der Platine, und müssen es unter verschiedenen Instanzobjekte teilen, die diese Art von Konflikt statisch/Instanz erzeugen. Wenn ja, wird die Lösung statisch nachverfolgt, was die aktuelle Instanz ist, die dem Sensor in dieser Zeit zugewiesen wurde. Am einfachsten ist es, die zugewiesene Instanz in eine statische Variable zu setzen, um sie in einem statischen Funktionsaufruf zu finden.

Und natürlich, wenn Sie nur eine einzige Instanz von Pad im gesamten Programm haben, machen Sie Pad a singleton oder kodieren Sie eine Abfrage in einer Größe, um die Handhabung dieser einzelnen Instanz zu erleichtern.

0

Lambda-Funktionen sind der Weg dorthin. Leider erlaubt die Automaten-API noch nicht, Lambdas mit erfaßten [this] zu verwenden.

Es gab eine Feature-Anfrage für diese, https://github.com/tinkerspy/Automaton/issues/17, vielleicht finde ich etwas Zeit, um dies zu implementieren.

Verwandte Themen