[attachinterrupt] Comment puis appeler une fonction dans une function static

Bonjour,

Je peine avec ce problème.

J’ai une pin 6 ou j’ai attaché un interrupt

attachInterrupt(interrupt, onIncomingCall, FALLING);

Donc quand la pin 6 passe à LOW, la fonction onIncomingCall est appelé

Voici cette fonction dans mon fichier .ccp

void Adafruit_FONA::onIncomingCall() {

  DEBUG_PRINT(F("\n> ")); DEBUG_PRINTLN(F("Incoming call..."));

  Adafruit_FONA::_incomingCall = true;

}

et la voici dans mon fichier .h (elle se trouve sous protected:)

static void onIncomingCall();

Docn c’est bien une fonction static qui ne doit pas avoir de parametre.

Dans la fonction onIoncmingCall, j’aimerais appeler une autre fonction

void Adafruit_FONA::onIncomingCall() {

  DEBUG_PRINT(F("\n> ")); DEBUG_PRINTLN(F("Incoming call..."));

  Adafruit_FONA::_incomingCall = true;

char phone[32];
incomingCallNumber(phone);

}

boolean Adafruit_FONA::incomingCallNumber(char* phonenum) {
  //+CLIP: "<incoming phone number>",145,"",0,"",0
  if(!Adafruit_FONA::_incomingCall)
    return false;

  readline();
  while(!prog_char_strcmp(replybuffer, (prog_char*)F("RING")) == 0) {
    flushInput();
    readline();
  }

  readline(); //reads incoming phone number line

  parseReply(F("+CLIP: \""), phonenum, '"');


  DEBUG_PRINT(F("\t<--- "));
  DEBUG_PRINTLN(replybuffer);


  Adafruit_FONA::_incomingCall = false;
  return true;
}

Le problème qui se pose, c’est que quelque soit la fonction que j’appelle depuis onIncomingCall(), j’ai un message d’erreur

error: cannot call member function 'boolean Adafruit_FONA::incomingCallNumber(char*)' without object
   incomingCallNumber(phones);

Je comprends pas le without object

Es-ce que ma fonction est static ou protégée?

Merci pour vos lumires

Bonjour,

Cela n'as peut-être rien à voir:
Dans "Adafruit_FONA::onIncomingCall()" tu écrit "incomingCallNumber(phone);" et le message d'erreur est pour "incomingCallNumber(phones);", phone(s) avec un 's'.

Comment et où est déclarée: void incomingCallNumber(char *);

Pour rappel, une fonction membre statique se différencie des fonctions membres usuelles par le fait qu'il est possible de les appeler sans faire référence à une instance.

Bonjour,

Je ne vois pas comment l’interrupt déclarée par ‘attachInterrupt(interrupt, onIncomingCall, FALLING);’ pourrait appeler la fonction Adafruit_FONA::onIncomingCall();
onInComingCall() (qui peut être aussi notée ::onIncomingCall()) et Adafruit_FONA::onIncomingCall() sont des fonctions qui n’ont rien à voir (même si elles portent le même nom)
Si tu veux appeler la fonction onIncomingCall de la class Adafruit_FONA tu doit le spécifier explicitement

  attachInterrupt(interrupt, Adafruit_FONA::onIncomingCall, FALLING);

De plus la fonction doit être public et non protected puisqu’elle est appelée en dehors de la class.

Ensuite dans une fonction statique on ne peut faire référence qu’à des membres statiques de la class. Si on veut faire référence à un membre qui n’est pas statique il faut préciser l’objet.
Par exemple:

  monFONA._incomingCall = true;

Kamill,

Comme je le rappelais dans mon post précédant, puisque onIncomingCall est statique, on peut l'appeler sans préciser l'objet.

Me trompe-je ?

Bonjour bilbo83,

Non tu ne trompes pas, c'est bien ce qui est fait.
Le problème est que dans cette fonction pierrot10 voudrait accéder à des membres non statiques.

Oui, c'est vrai, je n'avais pas fait attention à ça.

Merci, Kamill.

Il faut faire un "singleton" (cf design patterns), c'est entre autres, le moyen le plus simple d'accéder à une variable membre qui n'est pas statique. Cela suppose cependant qu'il n'y ait qu'une seule instance de cette classe utilisable dans tout le programme...