Paramètres pour fonction avec msTimer2

Salut,
Arduino Mega2560
J'ai un petit souci avec MsTimer2... En fait j'ai deux bouton qui font chacun des opérations et 2 led bicolores qui clignottent pour chacune des opérations...
Comme j'ai déporté ma fonction dans un fichier et que je n'aime pas trop les globales, j'ai mis des paramètres, seulement comment on fait pour lui passer ces paramètres??

Voilà, je le paramètre comme ceci:

void setup() {
  // Du code
  MsTimer2::set(250, clignoEnCours); // 250ms period
}// fin de Setup

Ensuite dans mon code, je l'appelle comme cela:

void loop() {
  
  // Du code
  
  if(recordRunning){

    
    // Affichage de l'opération en cours
    MsTimer2::start();

    // Suite du code

  }

   if(resetRunning){

    
    // Affichage de l'opération en cours
    MsTimer2::start();

    // Suite du code

   }
} // Fin de loop

et ma fonction

/*
 * Clignotement LED en Orange
 */
void clignoEnCours(const bool pRecordRunning, const bool pResetRunning){
  static bool outputEnCours = false;

  if(pRecordRunning){
    digitalWrite(recordStatusKo, outputEnCours);
    digitalWrite(recordStatusOk, outputEnCours);

  }else if(pResetRunning){
    digitalWrite(resetStatusKo, outputEnCours);
    digitalWrite(resetStatusOk, outputEnCours);
  }

  outputEnCours = !outputEnCours;
}

Merci pour votre aide

pilou007:
Comme j’ai déporté ma fonction dans un fichier et que je n’aime pas trop les globales, j’ai mis des paramètres, seulement comment on fait pour lui passer ces paramètres??

Bonjour,

Ben, c’est simple: on ne passe pas de paramètres.
Il suffit de regarder la déclaration de set dans MsTimer2.h pour voir que le fonction appelée n’a pas de paramètres.

La fonction est appelée par une routine d’interruption et on ne passe pas de paramètre à une routine d’interruption.

Le seul moyen de communiquer avec cette fonction ce sont les variables globales

OK, merci pour ta réponse....
Bon je vais faire une classe....
Bye

Bonjour

Je vais te faire gagner du temps : passer par une classe ne résoudra rien.

Dans une classe, une fonction peut ressembler à "void mafonction();" mais pour autant on ne peut pas l'associer à une routine d'interruption car en réalité elle prend un paramètre d'appel masqué : le pointeur this

Sauf bien sur s'il s'agit d'une fonction statique, mais alors tu retomberas sur le même problème de variable globale.

Je crois que ton problème est davantage une mauvaise appréhension du bon usage des variables globales.
Celles-ci ne sont pas toutes à proscrire.

Toutes celles qui permettent de qualifier l'état du système à un instant t sont parfaitement légitimes.
Après, tu peux éventuellement réduire leur portée, par exemple en les encapsulant dans une bibliothèque ou une classe statique, ou même en les déclarant en static à l'intérieur de la seule fonction qui les manipule.

Hmmmmm, je n'avais pas vu ça comme ça....
Merci pour ton aide.

Par contre, j'ai un souci plus général, peut-être une compréhension du c....
Ma fonction est dans un fichier .c avec son entête dans un fichier.h
Dans le prog princ, je fais bien mon #include "deMonFichier.h", ma fonction est donc devenue:

/*
 * Clignotement LED en Orange
 */
void clignoEnCours(){
  static bool outputEnCours = false;

  if(recordRunning){
    digitalWrite(recordStatusKo, outputEnCours);
    digitalWrite(recordStatusOk, outputEnCours);

  }else if(resetRunning){
    digitalWrite(resetStatusKo, outputEnCours);
    digitalWrite(resetStatusOk, outputEnCours);
  }

  outputEnCours = !outputEnCours;
}

avec l'entête qui va bien
mais lors de la compilation il me met une erreur comme quoi il ne connait pas mes variables "recordRunning" et "resetRunning"

exit status 1
'recordRunning' undeclared (first use in this function)

et dans mon prog princ:

#include "Device.h"
// Autre include et déclarations

// Variables globales
volatile bool recordRunning = false;
volatile bool resetRunning = false;
volatile bool supportPres = false;

// et ensuite l'utilisation comme montré dans mon premier post

Qu'est-ce que j'ai pas compris....??

Si n'ai rien compris qui est déclaré dans quoi et qui est inclus dans quoi.
Si tu mettais tes fichiers complets, on pourrait peut être d'aider.

Bon alors si je ne suis pas clair, je recommence…

Mon progPrinc.ino

#include <SPI.h>
#include <SD.h>
#include <MsTimer2.h>
#include <RTClib.h>
#include <Wire.h>
#include "Device.h"
#include "LecturePldUfd.h"
#include "LectureDm.h"


// Variables globales
bool recordRunning = false;
bool resetRunning = false;
bool supportPres = false;

LectureDm *lireDm;
Reset *resetBat;
LecturePldUfd *lirePldUfd;

void setup() {

// Du code pas important pour ce problème

}

void loop() {
 
  if(recordRunning){
    
     lireDm = new LectureDm(dirName);

     if(!(recordRunning =lireDm->getBatFault1(BAT_FLT_1)))// Mise en route avec BAT_FAULT_1          
      ihmState(LED_ON, LED_OFF, LED_OFF, LED_OFF);
    else if(!(recordRunning = lireDm->switchOffBatFault1(BAT_FLT_1))) // extinction BAT_FAULT_1         
      ihmState(LED_ON, LED_OFF, LED_OFF, LED_OFF); 
    else{
        
      // Prêt à lire la DM
      lireDm->rdyToReadDm();
  
      // Voir Req-SLD-0120??
      
      // lecture données DM
      if(!lireDm->lectureDmData ()){
          
        ihmState(LED_ON, LED_OFF, LED_OFF, LED_OFF);

        recordRunning = false;
      }       
    } 

    delete(lireDm);
    
    recordRunning = false;     
  }

  if(resetRunning){

    resetBat = new Reset();
    
    if(!(resetRunning = resetBat->miseEnRoute(BAT_FLT_1)))      
      ihmState(LED_OFF, LED_OFF, LED_ON, LED_OFF);
    else if(!(resetRunning = resetBat->resetBat(PUT_RDY, SOC_RDY)))        
        ihmState(LED_OFF, LED_OFF, LED_ON, LED_OFF);
    
    // On stoppe l'affichage de l'opération en cours
    MsTimer2::stop();
 
    // Mise à jour IHM
    if(resetRunning)
      ihmState(LED_OFF, LED_OFF, LED_OFF, LED_ON);
    
    switchOffBat();
    
    delete(resetBat);

    resetRunning = false;

  }

} // fin de loop

Ensuite mon fichier de gestion de l’IHM
Device.h

#ifndef DEVICE_H
#define DEVICE_H


#ifdef __cplusplus
    extern "C" {
#endif

//==============================================================================
// Include files
#include <Arduino.h>

//==============================================================================
// Constants
// IHM Led
const unsigned int recordStatusOk = 6;
const unsigned int recordStatusKo = 7;
const unsigned int resetStatusOk = 8;
const unsigned int resetStatusKo = 9;

// Constantes LED
const unsigned int LED_ON = 0;
const unsigned int LED_OFF = 1;

// Constantes relais
const unsigned int RELAY_ON = 0;
const unsigned int RELAY_OFF = 1;



//==============================================================================
// Global functions
//extern void clignoEnCours(const bool pRecordRunning, const bool pResetRunning);
extern void clignoEnCours();


#ifdef __cplusplus
    }
#endif

#endif // DEVICE_H

et mon Device.c

//==============================================================================
//
// Title:    Device.c
// Purpose:   Fonction de gestion IHM et des Relais.
//
// Created on:  27/06/2017 at 09:51:50 by Pascal.
// Copyright: SAFT. All Rights Reserved.
//
//==============================================================================

//==============================================================================
// Include files
#include "Device.h"

//==============================================================================
// Fonctions IHM 
//==============================================================================
/*
 * Clignotement LED en Orange
 */
//void clignoEnCours(const bool pRecordRunning, const bool pResetRunning){
void clignoEnCours(){
  static bool outputEnCours = false;

  if(recordRunning){
    digitalWrite(recordStatusKo, outputEnCours);
    digitalWrite(recordStatusOk, outputEnCours);

  }else if(resetRunning){
    digitalWrite(resetStatusKo, outputEnCours);
    digitalWrite(resetStatusOk, outputEnCours);
  }

  outputEnCours = !outputEnCours;
}

et l’erreur qui va avec…

sketch\Device.c: In function 'clignoEnCours':

Device.c:25: error: 'recordRunning' undeclared (first use in this function)

   if(recordRunning){

      ^

sketch\Device.c:25:6: note: each undeclared identifier is reported only once for each function it appears in

Device.c:29: error: 'resetRunning' undeclared (first use in this function)

   }else if(resetRunning){

            ^

exit status 1
'recordRunning' undeclared (first use in this function)

Voila j’espère que c’est plus clair…

Bonjour,

recordRunning n’est pas déclaré. Ni dans device.h, ni dans device.c

Autre point: sauf si tu sais vraiment ce que tu fais, je te déconseille de mélanger du C avec du C++

salut,
recordRunning est une global déclarée dans le .ino.....
C'est là toute ma question, si tu regardes l'historique de mon post, Bricoleau me conseille de garder ces variable en globales puisqu'elle sont utilisée dans le .ino et dans Device.c...
Et c'est là que ça bloque et que je demande un coup de main.

Ensuite quant au mélange du C et du C++, sachant que arduino, c'est du C++, il peut tout a fait prendre des fonction C sans problème...

Merci

pilou007:
recordRunning est une global déclarée dans le .ino.....
C'est là toute ma question, si tu regardes l'historique de mon post, Bricoleau me conseille de garder ces variable en globales puisqu'elle sont utilisée dans le .ino et dans Device.c...
Et c'est là que ça bloque et que je demande un coup de main.

Il faut que tu crées un fichier .h par exemple global.h ou tu déclares test variables globales extern.
Tu inclues ce fichier dans ton .ino et dans ton .cpp qui utilise ces variables globales
Personnellement, je les aurais plutôt mises dans un module global.cpp

pilou007:
Ensuite quant au mélange du C et du C++, sachant que arduino, c'est du C++, il peut tout a fait prendre des fonction C sans problème...

Si tu es sur de ce que tu fais tu peux le faire, mais j'ai du mal à voir l'intérêt.

Hmmmmmm, j’avais essayé ça aussi… mais pô cool…
Je crée un “Globales.h”

#ifndef GLOBALES_H
#define GLOBALES_H


//==============================================================================
// Include files

//==============================================================================
// Variables globales
extern bool recordRunning = false;
extern bool resetRunning = false;

#endif // GLOBALES_H

Ou comme ça:

#ifndef GLOBALES_H
#define GLOBALES_H

#ifdef __cplusplus
    extern "C" {
#endif

//==============================================================================
// Include files

//==============================================================================
// Variables globales
extern bool recordRunning = false;
extern bool resetRunning = false;

#ifdef __cplusplus
    }
#endif

#endif // GLOBALES_H

Et j’obtiens des erreurs parlant de multiple definition… Même dans des fichiers ou je n’appelle pas “Globales.h”…

sketch\LectureDm.cpp.o (symbol from plugin): In function `LectureDm::~LectureDm()':

(.text+0x0): multiple definition of `resetRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

c:/users/burelp/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

sketch\LectureDm.cpp.o (symbol from plugin): In function `LectureDm::~LectureDm()':

(.text+0x0): multiple definition of `recordRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\LecturePldUfd.cpp.o (symbol from plugin): In function `LecturePldUfd::~LecturePldUfd()':

(.text+0x0): multiple definition of `resetRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\LecturePldUfd.cpp.o (symbol from plugin): In function `LecturePldUfd::~LecturePldUfd()':

(.text+0x0): multiple definition of `recordRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\Reset.cpp.o (symbol from plugin): In function `Reset::~Reset()':

(.text+0x0): multiple definition of `resetRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\Reset.cpp.o (symbol from plugin): In function `Reset::~Reset()':

(.text+0x0): multiple definition of `recordRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\progPrinc.ino.cpp.o (symbol from plugin): In function `intSupportLost()':

(.text+0x0): multiple definition of `recordRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

sketch\progPrinc.ino.cpp.o (symbol from plugin): In function `intSupportLost()':

(.text+0x0): multiple definition of `resetRunning'

sketch\Device.c.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Erreur de compilation pour la carte Arduino/Genuino Mega or Mega 2560

Il n'y a pas d'affectation dans les déclarations.

extern bool recordRunning;
extern bool resetRunning;

Extrait du fil de discussion :http://forum.arduino.cc/index.php?topic=487805.msg3328719#msg3328719

kamill:
Bonjour,

Je constate que de plus en plus, y compris dans les tutos et cours sur internet on emploie déclaration pour définition

De ce que j'ai retenu de mon apprentissage du C qui commence à remonter à pas mal d'années c'est que:
int machin ; // c'est une définition (qui vaut aussi déclaration)
extern int machin ; // c'est une déclaration

@Kamill : je retiens la leçon :grin:

Ok, j'ai enlever l'affectation, je l'ai mise dans le setup...
==> Pareil....

On laisse tomber, je vais faire autrement, c'est pas comme je veux mais tant pis...
Merci pour tout
Bye
Pascal

@Kamill, le mélange C++ et C, effectivement c'est pas top dans Arduino....
j'ai des gros souci, du genre lorsque je fais un Delet(monObj), il me modifie une variable nullement utilisée dans cette classe de false à true et j'ai donc du code qui s'exécute... la grosse daube.....

Donc j'ai supprimé tous mes fichiers et j'ai mis tout mon code dans ProgPrinc.ino, ça fait 1685 lignes de code, c'est pas joli, mais au moins ça fonctionne parfaitement comme ça.

J'ouvre un autre post pour ce problème... Merci

au lieu de créer des fichier.c tu crées des .cpp et ça doit résoudre la majorité de tes problèmes.

C'est ce que j'ai fait, mais ça ne change rien.....