Passage des define du fichier .ino aux .h

Bonjour,

J'ai plusieurs projets qui utilisent les mêmes sources et je voudrais définir des defines dans les .ino pour activer le code qui leurs correspondent dans les .h. Malheureusement quand je définie le define dans le .ino il n'est pas reconnu dans le .h. Je définie bien le define avant d'appeler le header. Avez vous une solution ? Merci Adrien

Il faudrait un exemple.

Et l'arborescence des répertoires dans lesquels se trouvent le ino et les h

Voici un exemple

fichier .ino

#define PROGRAMME_1

#include "config.h"

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

config.h

#ifndef CONFIG_H
#define CONFIG_H

#if defined(PROGRAM_1)
 // Prog 1
#elif defined (PROGRAM_2)
 // Prog 1
#else
 #error "no program defined"
#endif 

#endif // CONFIG_H

Voici l’erreur du compilateur:
config.h:9:3: error: #error “no program defined”

#error “no program defined”

L’arborescence est la suivante:
Dossier\projet\test.ino
Dossier\libraries\config.h

Le compilateur trouve bien le fichier je l’utilise dans le .ino.

Je pense qu'il faudrait Dossier\libraries\config\config.h

Nop ça ne change rien :/

Ok je vois le problème : PROGRAMME_1 dans le ino et PROGRAM_1 dans le h.

Tu avoueras que sans exemple il était difficile de répondre à la question ;D

Effectivement c'est le problème dans l'exemple mais ça ne fonctionne toujours pas dans mon programme. C'est déjà pas mal je vois que ça peut fonctionner ! merci les gars

Si c'est fait comme dans l'exemple il n'y a pas de raison pour que cela ne marche pas.

tu mets tes #define dans un fichier defines.h (et rien que ça) Ensuite tu inclues ce defines.h : - dans ton .ino - dans tes .h qui en ont besoin.

Ca ne fonctionnera pas ! J'ai plusieurs ino qui utilise les mêmes .h et la config se fait avec les define dans les .h

un define est local à un fichier. il est traité très en amont par le pré-processeur qui remplace littéralement (comme si vous aviez fait un recherche et remplace) les mots dans le fichier en cours.

Il faut donc que le define soit visible AVANT l'étape de pre-processing. ça veut dire effectivement qu'il faut importer ce fichiers defines.h dont parle @biggil partout où vous en aurez besoin et ça ne peut pas marcher avec des bibliothèques ou alors il faut que ce fichier fasse partie de la bibliothèque et que vous le mettiez à jour pour chaque projet

Je crois comprendre ce que tu est en train d'essayer de faire.

Tu penses qu'en définissant PROGRAM_1 dans ton skecth tu vas pouvoir changer le comportement du .cpp de la librairie qui inclut option.h.

NON car les .cpp de la librairie sont compilés, avec le .h, sans tenir compte des #define du sketch. Le sketch est compilé ensuite.

Ceci peut être une possibilité :

// sketch
#define OPTION_2
#include "config.h"

void setup() {
  Serial.begin(115200);
  example();
}

void loop() {
}

// config.h
#if defined OPTION_1
void example(void)
{
    Serial.println("OPTION 1");
}
#elif defined OPTION_2
void example(void)
{
    Serial.println("OPTION 2");
}
#else
#error "NO OPTION"
#endif

Je vais te donner un exemple concret :

MySensors.h

Ligne 254 : si MY_GATEWAY_SERIAL est défini dans le sketch, core/MyGatewayTransportSerial.cpp est inclus.

Dans ce fichier une fonction gatewayTransportInit() est déclarée.

Ligne 245 : si MY_GATEWAY_W5100 est défini dans le sketch, core/MyGatewayTransportEthernet.cpp est inclus.

Dans cet autre fichier une fonction gatewayTransportInit() est déclarée aussi.

Donc en fonction de ce que qui est choisi dans le sketch, MY_GATEWAY_SERIAL ou MY_GATEWAY_W5100, le sketch aura un comportement différent.

Autre solution :

// sketch
#define OPTION_2
#include "config.h"

void setup() {
  Serial.begin(115200);
  example();
}

void loop() {
}

// config.h
#if defined OPTION_1
int option = 1;
#elif defined OPTION_2
int option = 2;
#else
#error "NO OPTION"
#endif

extern int option;

void example(void)
{
    Serial.print("OPTION "); Serial.println(option);
}

La solution passe forcément soit par des variables, soit par des fonctions incluses (ou carrément des .cpp) en fonction des directives.

La solution des variables peut convenir si les différences de comportement sont faibles.

La solution des fonctions convient mieux si les comportement sont très différents, car seulement les fonctions choisies seront compilées.

c'est exactement ça mais la définition ne peut pas être dans le sketch parce que le code est utilisé par plusieurs sketch.

Je crois que j'ai un début de piste. En fait dans les autres IDE ce define est définie dans les options de compilation et il est donc définie dans tous les fichiers. Avec arduino il faut créer un fihcier config.h par sketch dans le dossier contenant le sketch et modifier le fichier C:\Program Files (x86)\Arduino\hardware\arduino\avr\plateform.txt.

Voici le lien que j'ai trouvé : https://github.com/arduino/arduino-builder/issues/15

J'ai plusieurs projets qui utilisent les mêmes sources et je voudrais définir des defines dans les .ino pour activer le code qui leurs correspondent dans les .h.

c'est exactement ça mais la définition ne peut pas être dans le sketch parce que le code est utilisé par plusieurs sketch.

Ce que tu dis est contradictoire. Il faut savoir que si tu définis une directive dans un fichier .h inclus dans le sketch, c'est comme si tu la définissais dans le sketch lui-même.

Je pense que tu as plutôt un problème pour expliquer ce que tu veux faire exactement.

ça marche \o/

En fait il faut modifier le fichier : C:\Users[user]\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\plateform.txt

Modifier ces deux lignes compiler.c.extra_flags=-include {build.source.path}/config.h compiler.cpp.extra_flags={compiler.c.extra_flags}

Et dans chaque projet ajouter un fichier config.h avec les configs propres au sketch.