2017-10-18 17 views
1

Premier projet en C++/Arduino provenant d'un arrière-plan JavaScript. J'ai quelques problèmes avec ce code! Je reçois cette erreur:Utilisation incorrecte de la fonction membre non statique - 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); 

Voici le 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++; 
    } 
} 

J'ai essayé de faire change_callback une fonction statique mais qui provoque des erreurs avec fade_val, qui est membre de la classe publique. J'ai l'impression que cela a à voir avec des pointeurs, dont je suis toujours en train de faire le tour. Il est important que chaque instance de Pad possède son propre capteur et son propre fade_val - ils ne peuvent pas être partagés (statiques) sur chaque Pad.

+0

vous avez besoin d'une référence à votre objet Pad. Vous devriez probablement utiliser une fonction statique et utiliser le Pad * comme paramètre utilisateur. –

+0

Hey Garr, pouvez-vous élaborer sur le Pad * en tant que paramètre utilisateur? –

Répondre

0

La solution est de convertir votre Pad :: change_callback en statique. Mais si vous le faites, vous devez changer la portée de fade_val aussi bien que statique et de toute façon c'est problématique pour vous. Une autre solution consiste à placer Pad :: change_callback dans un std::mem_fun object, mais encore une fois, vous devez définir la portée de cet objet comme statique.

Mes sentiments sont que vous avez un seul-statique des ressources, comme un capteur fixé à la carte, et la nécessité de le partager entre les différents objets d'instance générant ce type de conflit statique/instance. Si oui, la solution est une piste statique qui est l'instance actuelle affectée au capteur à ce moment-là. La façon la plus simple de le faire est de placer l'instance assignée dans une variable statique afin de la trouver dans un appel de fonction statique. Et, bien sûr, si vous n'avez qu'une seule instance de Pad dans le programme entier, faites de Pad un singleton ou codez un sondage de taille unique pour faciliter la gestion de cette seule instance.

0

fonctions Lambda sont la voie à suivre ici. Malheureusement, l'API automate ne permet pas d'utiliser lambdas avec capturé [this] pour le moment.

Il y avait une demande de fonctionnalité pour cela, https://github.com/tinkerspy/Automaton/issues/17, peut-être que je trouve un certain temps pour mettre en œuvre.